commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r3495 - gnuradio/branches/developers/jcorgan/pager/gr-


From: jcorgan
Subject: [Commit-gnuradio] r3495 - gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib
Date: Thu, 7 Sep 2006 00:59:48 -0600 (MDT)

Author: jcorgan
Date: 2006-09-07 00:59:47 -0600 (Thu, 07 Sep 2006)
New Revision: 3495

Modified:
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h
Log:
WIP on FLEX sync block.  Synchronization is essentially completed but
now it needs to correctly deframe code words at the right bps and
FSK level encoding based on the detected frame type.


Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc    
    2006-09-07 03:48:57 UTC (rev 3494)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc    
    2006-09-07 06:59:47 UTC (rev 3495)
@@ -25,7 +25,20 @@
 
 #include <pgr_flex_sync.h>
 #include <gr_io_signature.h>
+#include <gr_count_bits.h>
 
+#define FLEX_SYNC_MARKER 0xA6C6AAAA
+
+gr_int32 flex_codes[] = 
+{
+    0x870C78F3,     // 1600 bps, 2 level FSK
+    0xB0684F97,     // 1600 bps, 4 level FSK
+    0xDEA0215F,     // 3200 bps, 4 level FSK
+    0x4C7CB383      // 3200 bps, 4 level FSK REFLEX
+};
+
+#define MAX_FLEX_MODE 3
+
 pgr_flex_sync_sptr pgr_make_flex_sync(int rate)
 {
     return pgr_flex_sync_sptr(new pgr_flex_sync(rate));
@@ -48,6 +61,7 @@
     d_levels = 2;
     d_spb = rate/d_baudrate;
     d_state = ST_IDLE;
+    d_mode = -1;
 }
 
 pgr_flex_sync::~pgr_flex_sync()
@@ -64,15 +78,41 @@
 
 bool pgr_flex_sync::test_sync()
 {
-    // Perform sync mode matching here with hamming distance from each
-    // possible sync code
+    // 64-bit FLEX sync code:
+    // AAAA:BBBBBBBB:CCCC
+    //
+    // Where BBBBBBBB is always 0xA6C6AAAA
+    // and AAAA^CCCC is 0xFFFF
+    // 
+    // Specific values of AAAA determine what bps and encoding the
+    // packet is beyond the frame information word
+    //
+    // First we match on the marker field with a hamming distance < 4
+    // Then we match on the outer code with a hamming distance < 4
 
-    // Temporarily, just check if the value matches what all the sync codes
-    // have in common (center 32 bits are constant)
-    gr_int64 val = d_shifters[d_index] & 0x0000FFFFFFFF0000ULL;
-    if (val == 0x0000A6C6AAAA0000ULL)
-        return true;
+    gr_int64 val = d_shifters[d_index];
+    gr_int32 marker = ((val & 0x0000FFFFFFFF0000ULL)) >> 16;
 
+    if (gr_count_bits32(marker^FLEX_SYNC_MARKER) < 4) {
+        gr_int32 code = ((val & 0xFFFF000000000000ULL) >> 32) |
+                         (val & 0x000000000000FFFFULL);
+
+        for (int i = 0; i < MAX_FLEX_MODE; i++) {
+            if (gr_count_bits32(code^flex_codes[i]) < 4) {
+                d_mode = i;
+                return true;
+            }
+        }
+
+        // Marker received but doesn't match known codes
+        // All codes have high word inverted to low word
+        unsigned short high = (code & 0xFFFF0000) >> 16;
+        unsigned short low = code & 0x0000FFFF;
+        unsigned short syn = high^low;
+        if (syn == 0xFFFF)
+            printf("Unknown sync code detected: %08X\n", code);
+    }
+
     return false;
 }
 
@@ -112,7 +152,7 @@
                     d_end = d_index;
                     d_center = cog(d_start, d_end, d_spb);
                     d_state = ST_SYNCED;
-                    printf("SOG=%2i EOG=%2i COG=%2i\n", d_start, d_end, 
d_center);
+                    printf("CODE=%08X SOG=%2i EOG=%2i COG=%2i\n", 
flex_codes[d_mode], d_start, d_end, d_center);
                 }
                 break;
 
@@ -120,13 +160,20 @@
                 if (d_index == d_center) {
                     // Accumulate bits here
                     // d_shifters[d_center] has good stuff in it
+                    // 'break' if not done collecting bits yet
                 }
 
-                d_state = ST_IDLE; // TEMPORARY
+                // Fall through to here when done
+                d_state = ST_IDLE;
+
+                // TODO: make into a function call
+                d_mode = -1;
+                d_baudrate = 1600;
+                d_spb = d_rate/d_baudrate;
                 break;
 
             default:
-                assert(0);
+                assert(0); // memory corruption of d_state if ever gets here
                 break;
         }
 

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h
===================================================================
--- gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h 
2006-09-07 03:48:57 UTC (rev 3494)
+++ gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h 
2006-09-07 06:59:47 UTC (rev 3495)
@@ -52,6 +52,7 @@
     int d_start;    // Start of good sync 
     int d_end;      // End of good sync
     int d_center;   // Center of bit
+    int d_mode;     // Current packet mode
     state_t d_state;     
     gr_int64_vector d_shifters;
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]