/***************************************************************************
Declaration : char get_sync(void)

Description : The Slave synchronizes to the Master frame by resetting the 
			  frame timer when a valid packet is received. 
***************************************************************************/
char get_sync(void)
{
char status;
char sync_counter = 0;
int i;

	// Receive until valid packet or timeout
	while(1)
	{
		for(i=0; i<N_FREQ_CONNECTED; i++)
		{
			set_rf_rx(freq[i]);
			clear_rf_interrupt();
			RF_ENABLE;
			status = wait_rf_irq(TIMEOUT_SYNC,DIV64);
			RF_DISABLE;
			if(status == STATUS_TIMEOUT)
			{
				// Increment sync attempt counter
				sync_counter += 1;
				if(sync_counter >= N_SYNC_ATTEMPTS)
					return(call_status & ~MASTER_SYNC);
			}
			else
			{
				SET_TIMER1((master_sync_times[i]+SYNC_DELAY));
				return(call_status | MASTER_SYNC);
			}
		}
	}
}
Exemple #2
0
void CCP1_ISR(void){
    if (echo == 1){
        SETUP_CCP1(CCP_CAPTURE_FE);
        SET_TIMER1(0);
        echo = 0;
    }
    else{
        SETUP_CCP1(CCP_CAPTURE_RE);
        value = CCP_1;
        echo = 1;
    }
}
/***************************************************************************
Declaration : void audio_transfer(void)

Description : Writes an audio payload to the radio and exchanges audio
			  payloads at the given frequencies. Reads the audio payload
			  from the radio if any is received.
***************************************************************************/
void audio_transfer(void)
{
char status[2];
int i;

	#ifdef DONGLE
	
	// Exchange Audio Packets at each frequency
	event_time = &event_times[0];
	for(i=0; i<N_FREQ_CONNECTED; i++)
	{
		// Send TX packet synchronized to frame
		set_rf_tx(freq[i]);
		clear_rf_interrupt();
		#ifdef USB
			SET_TIMER2_EVENT((char)*event_time++);
			while(!TIMER2_EVENT)
				;
		#else
			SET_TIMER1_EVENT(*event_time++);
			while(!TIMER1_EVENT)
				;
		#endif
		rf_enable_pulse();
		wait_rf_irq(TIMEOUT_AUDIO_PACKET,DIV8);
		
		// Receive Audio RX packet
		set_rf_rx(freq[i]);
		clear_rf_interrupt();
		RF_ENABLE;
		#ifdef USB
			SET_TIMER2_EVENT((char)*event_time++);
			while(!TIMER2_EVENT)
				;
		#else
			SET_TIMER1_EVENT(*event_time++);
			while(!TIMER1_EVENT)
				;
		#endif
		if(!nRF_IRQ)
			status[i] = STATUS_RX_OK;
		else
			status[i] = STATUS_RX_FAILED;

		RF_DISABLE;
	}
	
	#ifdef USB
		STOP_TIMER2;
	#endif
	
	// Read RX Audio Packet if any, else stuff a packet
	if((status[0] == STATUS_RX_OK) || (status[1] == STATUS_RX_OK))
	{
		get_audio_packet();
		frame_loss = 0;
	}
	else
	{
		// Set Signal
		stuff_packet();
		frame_loss += 1;
	}
	
	// Flush RX FIFO	
	flush_rf_rx();
	
	
	// Update Packet Loss counters
	if((signal_in[0] & SIGNAL_PACKET0_OK) && (status[0] == STATUS_RX_OK))
	{
		packet_loss[0] -= PACKET_LOSS_DECREMENT;
		if(packet_loss[0] < 0)
			packet_loss[0] = 0;
	}
	else
		packet_loss[0] += PACKET_LOSS_INCREMENT;
	
	if((signal_in[0] & SIGNAL_PACKET1_OK) && (status[1] == STATUS_RX_OK))
	{
		packet_loss[1] -= PACKET_LOSS_DECREMENT;
		if(packet_loss[1] < 0)
			packet_loss[1] = 0;
	}
	else
		packet_loss[1] += PACKET_LOSS_INCREMENT;
		
	// Change Frequency based on Packet Loss Statistics
	if(packet_loss[0] >= PACKET_LOSS_THRESHOLD)
	{
		freq[0] += FREQ_STEP;
		if(freq[0] > FREQ0_MAX)
			freq[0] -= (FREQ0_MAX - FREQ0_MIN);
		packet_loss[0] = 0;
		packet_loss[1] = 0;
	}
	if(packet_loss[1] >= PACKET_LOSS_THRESHOLD)
	{
		freq[1] += FREQ_STEP;
		if(freq[1] > FREQ1_MAX)
			freq[1] -= (FREQ1_MAX - FREQ1_MIN);
		packet_loss[0] = 0;
		packet_loss[1] = 0;
	}
	
	signal_out[1] = freq[1] - freq[0];

	//Write TX Audio Packet and enable payload re-use
	put_audio_packet();
	reuse_rf_payload();
	
	#endif
	
	#ifdef HEADSET
	
	// Exchange Audio Packets at each frequency
	event_time = &event_times[0];
	SET_TIMER1_EVENT(*event_time++);
	for(i=0; i<N_FREQ_CONNECTED; i++)
	{
		// Receive Audio RX packet
		set_rf_rx(freq[i]);
		clear_rf_interrupt();
		while(!TIMER1_EVENT)
			;
		RF_ENABLE;
		SET_TIMER1_EVENT(*event_time++);
		while(!TIMER1_EVENT && nRF_IRQ)
		//while(!TIMER1_EVENT)
			;
		// If RF Interrupt request, RX OK
		if(!nRF_IRQ)
		{
			status[i] = STATUS_RX_OK;
			SET_TIMER1(master_sync_times[i]);
		}
		else
			status[i] = STATUS_RX_FAILED;

		RF_DISABLE;
		
		// Send Audio TX packet
		set_rf_tx(freq[i]);
		clear_rf_interrupt();
		SET_TIMER1_EVENT(*event_time++);
		while(!TIMER1_EVENT)
			;
		rf_enable_pulse();
		SET_TIMER1_EVENT(*event_time++);
		wait_rf_irq(TIMEOUT_AUDIO_PACKET,DIV8);
	}

	// Read RX Audio Packet if any, else stuff a packet
	if((status[0] == STATUS_RX_OK) || (status[1] == STATUS_RX_OK))
	{
		get_audio_packet();
		frame_loss = 0;
	}
	else
	{
		stuff_packet();
		signal_in[0] &= ~SIGNAL_CALL_CLEAR;
		frame_loss += 1;
	}

	// Flush RX FIFO	
	flush_rf_rx();
	
	// Set Receive Status bits and update Frequency
	if(status[0] == STATUS_RX_OK)
	{
		signal_out[0] |= SIGNAL_PACKET0_OK;
		if(status[1] == STATUS_RX_OK)
			signal_out[0] |= SIGNAL_PACKET1_OK;
		else
		{
			signal_out[0] &= ~SIGNAL_PACKET1_OK;
			freq[1] = freq[0] + signal_in[1];
		}
	}
	else
	{
		signal_out[0] &= ~SIGNAL_PACKET0_OK;
		if(status[1] == STATUS_RX_OK)
		{
			signal_out[0] |= SIGNAL_PACKET1_OK;
			freq[0] = freq[1] - signal_in[1];
		}
		else
			signal_out[0] &= ~SIGNAL_PACKET1_OK;
	}
	
	// Write TX Audio Packet and enable payload re-use
	put_audio_packet();
	reuse_rf_payload();
	
	#endif
}