void s4285_rx(void *param) { while (1) { int rx_chan = TaskSleep(0); s4285_t *e = &s4285[rx_chan]; if (e->mode == MODE_TX_LOOPBACK) { while (m_CSt4285[rx_chan].process_rx_block_tx_loopback()) { TaskFastIntr("s4285_rx"); } } else { while (s4285_rx_count) { m_CSt4285[rx_chan].process_rx_block(&s4285_rx_blocks[s4285_rx_ra][0], N_RXBLK, K_AMPMAX); s4285_rx_ra++; if (s4285_rx_ra == N_RXBLKS) s4285_rx_ra = 0; s4285_rx_count--; TaskFastIntr("s4285_rx"); send_status(rx_chan); } } send_status(rx_chan); } }
void CSt4285::demodulate_and_equalize( FComplex *in ) { int i, symbol_offset, data_offset, dt; unsigned char data[DATA_AND_PROBE_SYMBOLS_PER_FRAME*4]; float a,b; rx_scramble_count = 0; symbol_offset = 0; data_offset = 0; soft_index = 0; TaskFastIntr("s4285_de0"); switch(rx_mode&0x00F0) { case RX_75_BPS: case RX_150_BPS: case RX_300_BPS: case RX_600_BPS: for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); TaskFastIntr("s4285_de0_d0"); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); TaskFastIntr("s4285_de0_p0"); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); TaskFastIntr("s4285_de0_d1"); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); TaskFastIntr("s4285_de0_p1"); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); TaskFastIntr("s4285_de0_d2"); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); TaskFastIntr("s4285_de0_p2"); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); TaskFastIntr("s4285_de0_d3"); rx_scramble_count++; symbol_offset +=2; } break; case RX_1200_BPS: for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } break; case RX_2400_BPS: for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { equalize_data( &in[symbol_offset] ); rx_scramble_count++; symbol_offset +=2; } break; case RX_1200U_BPS: for( i = 0; i < DATA_LENGTH ; i++ ) { data[data_offset++] = equalize_data( &in[symbol_offset] ).data; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { data[data_offset++] = equalize_data( &in[symbol_offset] ).data; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { data[data_offset++] = equalize_data( &in[symbol_offset] ).data; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { data[data_offset++] = equalize_data( &in[symbol_offset] ).data; rx_scramble_count++; symbol_offset +=2; } break; case RX_2400U_BPS: for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } break; case RX_3600U_BPS: for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&4?1:0; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&4?1:0; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&4?1:0; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < PROBE_LENGTH ; i++ ) { equalize_train( &in[symbol_offset], scrambler_train_table[rx_scramble_count] ); rx_scramble_count++; symbol_offset +=2; } for( i = 0; i < DATA_LENGTH ; i++ ) { dt = equalize_data( &in[symbol_offset] ).data; data[data_offset++] = dt&4?1:0; data[data_offset++] = dt&2?1:0; data[data_offset++] = dt&1?1:0; rx_scramble_count++; symbol_offset +=2; } break; default: break; } /* De-interleave if required */ TaskFastIntr("s4285_de1"); int do_viterbi = 0; if (do_viterbi) { if( (rx_mode&0x00F0) <= RX_2400_BPS ) { for( i = 0 ; i < soft_index; i++ ) sd[i] = deinterleave( sd[i] ); } /* Error correct and pack for output */ TaskFastIntr("s4285_de2"); switch( rx_mode&0x00F0) { case RX_75_BPS: /* 75 Baud */ for( i = 0; i<DATA_LENGTH/4; i++ ) { a = (sd[i*16]+sd[(i*16)+2]+sd[(i*16)+4]+sd[(i*16)+6]+sd[(i*16)+8]+sd[(i*16)+10]+sd[(i*16)+12]+sd[(i*16)+14])/8; b = (sd[(i*16)+1]+sd[(i*16)+3]+sd[(i*16)+5]+sd[(i*16)+7]+sd[(i*16)+9]+sd[(i*16)+11]+sd[(i*16)+13]+sd[(i*16)+15])/8; data[data_offset++] = viterbi_decode( a, b ); } break; case RX_150_BPS: /* 150 Baud */ for( i = 0; i<DATA_LENGTH/2; i++ ) { a = (sd[i*8]+sd[(i*8)+2]+sd[(i*8)+4]+sd[(i*8)+6])/4; b = (sd[(i*8)+1]+sd[(i*8)+3]+sd[(i*8)+5]+sd[(i*8)+7])/4; data[data_offset++] = viterbi_decode( a, b ); } break; case RX_300_BPS: /* 300 Baud */ for( i = 0; i<DATA_LENGTH; i++ ) { a = (sd[i*4]+sd[(i*4)+2])/2; b = (sd[(i*4)+1]+sd[(i*4)+3])/2; data[data_offset++] = viterbi_decode( a, b ); } break; case RX_600_BPS: /* 600 Baud */ for( i = 0; i<DATA_LENGTH*2; i++ ) { data[data_offset++] = viterbi_decode( sd[i*2],sd[(i*2)+1]); TaskFastIntr("s4285_de2_vd"); } break; case RX_1200_BPS: /* 1200 Baud */ for( i = 0; i<DATA_LENGTH*4; i++ ) { data[data_offset++] = viterbi_decode( sd[i*2],sd[(i*2)+1]); } break; case RX_2400_BPS: /* 2400 */ for( i = 0; i<DATA_LENGTH*8; i++ ) { data[data_offset++] = viterbi_decode( sd[(i*2)],sd[(i*2)+1]); } break; case RX_1200U_BPS: break; case RX_2400U_BPS: break; case RX_3600U_BPS: break; default: break; } } TaskFastIntr("s4285_de3"); // Output data for( i = 0; i < data_offset; i++ ) { output_data[output_offset] = data[i]; output_offset++; if (output_offset == OUTPUT_DATA_LENGTH) { //printf("s4285 WARNING: output_data overflow\n"); output_offset = 0; } } TaskFastIntr("s4285_de4"); }