commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: jcorgan
Subject: [Commit-gnuradio] r3515 - gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib
Date: Sun, 10 Sep 2006 18:05:17 -0600 (MDT)

Author: jcorgan
Date: 2006-09-10 18:05:16 -0600 (Sun, 10 Sep 2006)
New Revision: 3515

Modified:
   
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.cc
   
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.h
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.cc
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.h
Log:
Work-in-progress on FLEX deframer.  Reorganized processing so block outputs
an entire frame for each phase, in sequence, after sync and information word.
This completely serializes message parsing for follow-on blocks.


Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.cc
    2006-09-10 22:32:02 UTC (rev 3514)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.cc
    2006-09-11 00:05:16 UTC (rev 3515)
@@ -44,8 +44,8 @@
               gr_make_io_signature (1, 1, sizeof(gr_int32))),
     d_sync(rate/1600) // Maximum samples per baud
 {
-    set_output_multiple(32); // Four phases, 8, 32-bit codewords per block
     d_rate = rate;
+    set_output_multiple(1);
     enter_idle();
 }
 
@@ -110,14 +110,19 @@
 void pgr_flex_deframer::enter_idle()
 {
     d_state = ST_IDLE;
+    d_index = 0;
+    d_start = 0;
+    d_center = 0;
+    d_end = 0;
+    d_count = 0;
     d_mode = 0;
     d_baudrate = 1600;
     d_levels = 2;
     d_spb = d_rate/d_baudrate;
-    d_index = 0;
-    d_count = 0;
-    d_center = 0;
+    d_hibit = false;
+    d_cdi = 0;
     d_cdw = 0;
+    d_blk = 0;
 }
 
 void pgr_flex_deframer::enter_syncing()
@@ -128,9 +133,9 @@
 
 void pgr_flex_deframer::enter_sync1()
 {
+    d_state = ST_SYNC1;
     d_end = d_index;
     d_center = index_avg(d_start, d_end);
-    d_state = ST_SYNC1;
     d_count = 0;
     fprintf(stderr, "SYNC1=%08X\n", flex_modes[d_mode].sync);
 }
@@ -139,7 +144,6 @@
 {
     d_state = ST_SYNC2;
     d_count = 0;
-
     d_baudrate = flex_modes[d_mode].baud;
     d_levels = flex_modes[d_mode].levels;
     d_spb = d_rate/d_baudrate;
@@ -149,7 +153,6 @@
         d_center = d_center/2;
         d_index = d_index/2-d_spb/2; // We're here at the center of a 1600 
baud bit
         d_count = -1;                // So this hack gets us in the right 
place for 3200
-        d_hibit = false;
     }
 }
 
@@ -157,11 +160,18 @@
 {
     d_state = ST_DATA;
     d_count = 0;
-    d_cdw = 0;
 }
 
-void pgr_flex_deframer::do_multiphase_shift(unsigned char sym)
+void pgr_flex_deframer::enter_output()
 {
+    d_state = ST_OUTPUT;
+    d_count = flex_modes[d_mode].phases*88; // Now d_count will count 
codewords, not bits
+    d_output_phase = 0;    // Always phase A
+    d_output_index = 0;
+}
+
+void pgr_flex_deframer::accumulate_frames(unsigned char sym)
+{
     // Bits are encoded with 2-bit gray code 
     // 
     // SYM      Bit1 Bit2
@@ -179,41 +189,46 @@
     // ABCDEFGH
     // ...
     // etc., for all 32 bits. So each successive incoming bit is multiplexed
-    // into a different d_phase_x[], indexed by d_cdw
+    // into a different d_frames[][], indexed by d_cdw
 
+    d_cdw = d_blk*8+d_cdi;
+    assert(d_cdw < 88);
+
     if (d_baudrate == 1600) {
-        d_phase_a[d_cdw] <<= 1;
-        d_phase_a[d_cdw]  |= (sym < 2);
+        d_frames[0][d_cdw] <<= 1;
+        d_frames[0][d_cdw]  |= (sym < 2);
 
         if (d_levels == 4) {
-            d_phase_b[d_cdw] <<= 1;
-            d_phase_b[d_cdw]  |= (sym == 0 || sym == 3);
+            d_frames[1][d_cdw] <<= 1;
+            d_frames[1][d_cdw]  |= (sym == 0 || sym == 3);
         }
     }
     else { 
         if (!d_hibit) {
-            d_phase_a[d_cdw] <<= 1;
-            d_phase_a[d_cdw]  |= (sym < 2);
+            d_frames[0][d_cdw] <<= 1;
+            d_frames[0][d_cdw]  |= (sym < 2);
 
             if (d_levels == 4) {
-                d_phase_b[d_cdw] <<= 1;
-                d_phase_b[d_cdw]  |= (sym == 0 || sym == 3);
+                d_frames[1][d_cdw] <<= 1;
+                d_frames[1][d_cdw]  |= (sym == 0 || sym == 3);
             }
             d_hibit = true;
         }
         else {
-            d_phase_c[d_cdw] <<= 1;
-            d_phase_c[d_cdw]  |= (sym < 2);
+            d_frames[2][d_cdw] <<= 1;
+            d_frames[2][d_cdw]  |= (sym < 2);
 
             if (d_levels == 4) {
-                d_phase_d[d_cdw] <<= 1;
-                d_phase_d[d_cdw]  |= (sym == 0 || sym == 3);
+                d_frames[3][d_cdw] <<= 1;
+                d_frames[3][d_cdw]  |= (sym == 0 || sym == 3);
             }
             d_hibit = false;
         }
     }
 
-    d_cdw = ++d_cdw % 8;
+    d_cdi = ++d_cdi % 8;
+    if (++d_count % (d_baudrate*4/25) == 0)
+        d_blk++;    
 }
 
 int pgr_flex_deframer::general_work(int noutput_items,
@@ -227,17 +242,19 @@
     int i = 0, j = 0;
     int ninputs = ninput_items[0];
 
-    while (i++ < ninputs && j < noutput_items) {
-        unsigned char sym = *in++;
-        if (++d_index >= d_spb)
-            d_index = 0;
-
+    while (i < ninputs && j < noutput_items) {
+        unsigned char sym;
+        if (d_state != ST_OUTPUT) {
+            sym = *in++; i++;
+            d_index = ++d_index % d_spb;
+        }
+    
         switch (d_state) {
             case ST_IDLE:
                 if (test_sync(sym))
                     enter_syncing();
                 break;
-
+    
             case ST_SYNCING:
                 if (!test_sync(sym)) {
                     enter_sync1();
@@ -245,7 +262,7 @@
                     *out++ = flex_modes[d_mode].sync; j++;
                 }
                 break;
-
+    
             case ST_SYNC1:
                 if (d_index == d_center) {
                     d_sync[d_index] = (d_sync[d_index] << 1) | (sym < 2);
@@ -256,62 +273,52 @@
                     }
                 }
                 break;
-
+    
             case ST_SYNC2:
                 if (d_index == d_center) {
                     // Skip 25 ms = 40 bits @ 1600 bps, 80 @ 3200 bps
-                    if (++d_count == d_baudrate/40) {
+                    if (++d_count == d_baudrate/40)
                         enter_data();
-                        goto done; // Return to scheduler to garauntee 
'output_multiple' for data delivery
-                    }
                 }
                 break;
-
+    
             case ST_DATA:
                 if (d_index == d_center) {
-                    do_multiphase_shift(sym);
-                    d_count++;
-
-                    // If a block has passed, output its 8 codewords
-                    // Do this for each phase defined by the FLEX mode
-                    if (d_count % (d_baudrate*4/25) == 0) { // 256 or 512 bits 
per block
-                        if (flex_modes[d_mode].phase_a) {
-                            for (int k = 0; k < 8; k++) {
-                                *out++ = d_phase_a[k]; j++;
-                            }
-                        }
-                        if (flex_modes[d_mode].phase_b) {
-                            for (int k = 0; k < 8; k++) {
-                                *out++ = d_phase_b[k]; j++;
-                            }
-                        }
-                        if (flex_modes[d_mode].phase_c) {
-                            for (int k = 0; k < 8; k++) {
-                                *out++ = d_phase_c[k]; j++;
-                            }
-                        }
-                        if (flex_modes[d_mode].phase_d) {
-                            for (int k = 0; k < 8; k++) {
-                                *out++ = d_phase_d[k]; j++;
-                            }
-                        }
-                    }
-
-                    // Data portion of frame is 1.76 sec. at either baud rate
+                    accumulate_frames(sym);
                     if (d_count == d_baudrate*1760/1000)
-                        enter_idle();
+                        enter_output();
                 }
                 break;
 
+            case ST_OUTPUT:
+                output_codeword(out++); j++;
+                if (--d_count == 0)
+                    enter_idle();
+                break;
+
             default:
                 assert(0); // memory corruption of d_state if ever gets here
                 break;
+
         }
-
     }
 
-done:
-    // Inform scheduler what we did;
-    consume_each(i-1);
+    consume_each(i);
     return j;
 }
+
+void pgr_flex_deframer::output_codeword(gr_int32 *out)
+{
+    *out = d_frames[d_output_phase][d_output_index++];
+   
+    if (d_output_index == 88) {
+        d_output_index = 0;
+        d_output_phase++;
+        if (d_output_phase == 1 && !flex_modes[d_mode].phase_b)
+            d_output_phase++;
+        if (d_output_phase == 2 && !flex_modes[d_mode].phase_c)
+            d_output_phase++;
+        if (d_output_phase == 3 && !flex_modes[d_mode].phase_d)
+            d_output_phase++;
+    }
+}

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.h 
    2006-09-10 22:32:02 UTC (rev 3514)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_deframer.h 
    2006-09-11 00:05:16 UTC (rev 3515)
@@ -48,13 +48,15 @@
     void enter_sync1();
     void enter_sync2();
     void enter_data();
+    void enter_output();
 
     int index_avg(int start, int end);
     bool test_sync(unsigned char sym);
-    void do_multiphase_shift(unsigned char sym);
+    void accumulate_frames(unsigned char sym);
+    void output_codeword(gr_int32 *out);
     
     // Simple state machine
-    enum state_t { ST_IDLE, ST_SYNCING, ST_SYNC1, ST_SYNC2, ST_DATA };
+    enum state_t { ST_IDLE, ST_SYNCING, ST_SYNC1, ST_SYNC2, ST_DATA, ST_OUTPUT 
};
     state_t d_state;     
 
     int d_rate;     // Incoming sample rate
@@ -72,12 +74,15 @@
 
     gr_int64_vector d_sync; // Trial synchronizers
 
-    int d_cdw;
-    gr_int32 d_phase_a[8];     // PHASEA block accumulator
-    gr_int32 d_phase_b[8];     // PHASEB block accumulator
-    gr_int32 d_phase_c[8];     // PHASEB block accumulator
-    gr_int32 d_phase_d[8];     // PHASEB block accumulator
+    int d_cdi;      // 0-7 code word index for deinterleave
+    int d_cdw;      // 0-87 code word index for frame
+    int d_blk;      // 0-10 block index
 
+    int d_output_phase; // Indexes d_frames[][] during output
+    int d_output_index; // indexes d_frames[][] during output
+
+    gr_int32 d_frames[4][88]; // Frame accumulators for each phase
+
 public:
     void forecast(int noutput_items, gr_vector_int &inputs_required);
 

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.cc   
    2006-09-10 22:32:02 UTC (rev 3514)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.cc   
    2006-09-11 00:05:16 UTC (rev 3515)
@@ -23,11 +23,11 @@
 
 const flex_mode_t flex_modes[] = 
 {
-    { 0x870C78F3, 1600, 2, true, false, false, false },
-    { 0xB0684F97, 1600, 4, true, true,  false, false },
-//  { 0xUNKNOWN,  3200, 2, true, false, true,  false },
-    { 0xDEA0215F, 3200, 4, true, true,  true,  true },
-    { 0x4C7CB383, 3200, 4, true, true,  true,  true }
+    { 0x870C78F3, 1600, 2, true, false, false, false, 1 },
+    { 0xB0684F97, 1600, 4, true, true,  false, false, 2 },
+//  { 0xUNKNOWN,  3200, 2, true, false, true,  false, 2 },
+    { 0xDEA0215F, 3200, 4, true, true,  true,  true,  4 },
+    { 0x4C7CB383, 3200, 4, true, true,  true,  true,  4 }
 };
 
 const int num_flex_modes = sizeof(flex_modes);

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.h    
    2006-09-10 22:32:02 UTC (rev 3514)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_modes.h    
    2006-09-11 00:05:16 UTC (rev 3515)
@@ -35,6 +35,7 @@
     bool         phase_b;       // PHASEB is transmitted
     bool         phase_c;       // PHASEC is transmitted
     bool         phase_d;       // PHASED is transmitted
+    int          phases;        // number of phases transmitted
 }
 flex_mode_t;
 





reply via email to

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