make maintainer-clean removes these, and we want a clean orig.tar.gz
[debian/gnuradio] / gr-noaa / lib / noaa_hrpt_deframer.cc
index 91c94d2a6425540b3df2446f7eace9c4f73fc0b7..1a2af6c37922c3b52c6510530d68d6e474ccec69 100644 (file)
 
 #include <noaa_hrpt_deframer.h>
 #include <gr_io_signature.h>
+#include <noaa_hrpt.h>
 #include <cstring>
 #include <cstdio>
 
 #define ST_IDLE   0
 #define ST_SYNCED 1
 
-#define SYNC1 0x0284
-#define SYNC2 0x016F
-#define SYNC3 0x035C
-#define SYNC4 0x019D
-#define SYNC5 0x020F
-#define SYNC6 0x0095
-
-#define HRPT_MINOR_FRAME_SYNC  0x0A116FD719D83C95LL
-
-static int frames_seen = 0;
-
 noaa_hrpt_deframer_sptr
 noaa_make_hrpt_deframer()
 {
@@ -55,6 +45,8 @@ noaa_hrpt_deframer::noaa_hrpt_deframer()
             gr_make_io_signature(1, 1, sizeof(short)))
 {
   set_output_multiple(6); // room for writing full sync when received
+  d_mid_bit = true;
+  d_last_bit = 0;
   enter_idle();
 }
 
@@ -86,38 +78,46 @@ noaa_hrpt_deframer::general_work(int noutput_items,
   int i = 0, j = 0;
   while (i < ninputs && j < noutput_items) {
     char bit = in[i++];
-
-    switch (d_state) {
-    case ST_IDLE:
-      d_shifter = (d_shifter << 1) | bit; // MSB transmitted first
-      
-      if ((d_shifter & 0x0FFFFFFFFFFFFFFFLL) == HRPT_MINOR_FRAME_SYNC) {
-       fprintf(stderr, "SYNC #%i", frames_seen++);
-       out[j++] = SYNC1;
-       out[j++] = SYNC2;
-       out[j++] = SYNC3;
-       out[j++] = SYNC4;
-       out[j++] = SYNC5;
-       out[j++] = SYNC6;
-       enter_synced();
-      }
-      break;
-
-    case ST_SYNCED:
-      d_word = (d_word << 1) | bit; // MSB transmitted first
-      if (--d_bit_count == 0) {
-       out[j++] = d_word;
-       d_word = 0;
-       d_bit_count = HRPT_BITS_PER_WORD;
-       if (--d_word_count == 0) {
-         fprintf(stderr, "...done\n");
-         enter_idle();
+    char diff = bit^d_last_bit;
+    d_last_bit = bit;
+
+    // Wait for transition if not synced, otherwise, alternate bits
+    if (d_mid_bit && (diff | (d_state == ST_SYNCED))) {
+      switch (d_state) {
+      case ST_IDLE:
+       d_shifter = (d_shifter << 1) | bit; // MSB transmitted first
+       
+       if ((d_shifter & 0x0FFFFFFFFFFFFFFFLL) == HRPT_MINOR_FRAME_SYNC) {
+         out[j++] = HRPT_SYNC1;
+         out[j++] = HRPT_SYNC2;
+         out[j++] = HRPT_SYNC3;
+         out[j++] = HRPT_SYNC4;
+         out[j++] = HRPT_SYNC5;
+         out[j++] = HRPT_SYNC6;
+         enter_synced();
        }
+       break;
+       
+      case ST_SYNCED:
+       d_word = (d_word << 1) | bit; // MSB transmitted first
+       if (--d_bit_count == 0) {
+         out[j++] = d_word;
+         d_word = 0;
+         d_bit_count = HRPT_BITS_PER_WORD;
+         if (--d_word_count == 0) {
+           enter_idle();
+         }
+       }
+       break;
+       
+      default:
+       throw std::runtime_error("noaa_hrpt_deframer: bad state\n");
       }
-      break;
 
-    default:
-      throw std::runtime_error("noaa_hrpt_deframer: bad state\n");
+      d_mid_bit = false;
+    }
+    else {
+      d_mid_bit = true;
     }
   }