first cut at iq imbalance compensation
[debian/gnuradio] / gnuradio-core / src / lib / general / gr_framer_sink_1.cc
index 1d939adbddfb4107b186a425467d048b66f3a6c0..9da271bac716e8d89a603d5121b67896aab96ac1 100644 (file)
@@ -6,7 +6,7 @@
  * 
  * GNU Radio is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
+ * the Free Software Foundation; either version 3, or (at your option)
  * any later version.
  * 
  * GNU Radio is distributed in the hope that it will be useful,
@@ -28,6 +28,7 @@
 #include <gr_io_signature.h>
 #include <cstdio>
 #include <stdexcept>
+#include <string.h>
 
 #define VERBOSE 0
 
@@ -127,13 +128,25 @@ gr_framer_sink_1::work (int noutput_items,
          // we have a full header, check to see if it has been received properly
          if (header_ok()){
            int payload_len;
-           int payload_offset;
-           header_payload(&payload_len, &payload_offset);
-           enter_have_header(payload_len, payload_offset);
+           int whitener_offset;
+           header_payload(&payload_len, &whitener_offset);
+           enter_have_header(payload_len, whitener_offset);
+
+           if (d_packetlen == 0){          // check for zero-length payload
+             // build a zero-length message
+             // NOTE: passing header field as arg1 is not scalable
+             gr_message_sptr msg =
+               gr_make_message(0, d_packet_whitener_offset, 0, 0);
+             
+             d_target_queue->insert_tail(msg);         // send it
+             msg.reset();                              // free it up
+
+             enter_search();                           
+           }
          }
          else
-           enter_search();                             // no.
-         break;                        // we're in a new state
+           enter_search();                             // bad header
+         break;                                        // we're in a new state
        }
       }
       break;
@@ -152,7 +165,8 @@ gr_framer_sink_1::work (int noutput_items,
 
            // build a message
            // NOTE: passing header field as arg1 is not scalable
-           gr_message_sptr msg = gr_make_message(0, d_packet_whitener_offset, 0, d_packetlen_cnt);         
+           gr_message_sptr msg =
+             gr_make_message(0, d_packet_whitener_offset, 0, d_packetlen_cnt);
            memcpy(msg->msg(), d_packet, d_packetlen_cnt);
 
            d_target_queue->insert_tail(msg);           // send it