[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r3515 - gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib,
jcorgan <=