Ejemplo n.º 1
0
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);
	}
}
Ejemplo n.º 2
0
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");
}