📄 ia443x_demo.c
字号:
//GPIO0 - RX_CLK
SpiRfWriteAddressData((REG_WRITE | GPIO0Configuration), GPIO_RX_DATA );
//next state
DemoStates = sDemoPERWaitForStart;
break;
case sDemoPERWaitForStart:
//check setting button
if( PB3_PIN == 0 || PB4_PIN == 0 )
{
while( PB3_PIN == 0 || PB4_PIN == 0 );
//goto setting page
MenuSetCursorPosition(0);
DemoStates = sDemoSettingScreen;
return;
}
if( PB1_PIN == 0 )
{//start receiving
//wait release the button
while( PB1_PIN == 0 );
//draw STOP icon
PerformMenu( sMenuStopIcon );
//clear variables
NmbrOfSentPackets = 0;
NmbrOfReceivedPackets = 0;
//next state
DemoStates = sDemoPERStartReceive;
}
break;
case sDemoPERStartReceive:
RFIdle();
//set variables
if( (NmbrOfSentPackets == v_max_packets[MenuItems.name.max_packets]) || (PB1_PIN == 0) )
{
//wait for releasing the button
while( PB1_PIN == 0 );
//change to CLEAR icon
PerformMenu( sMenuClearIcon );
//wait for the push button
DemoStates = sDemoWaitForClearScreen;
return;
}
else
{
NmbrOfSentPackets++;
}
//reset variables
if( PB2_PIN == 0 )
{
while( PB2_PIN == 0 );
//reset variables
//clear variables
NmbrOfSentPackets = 0;
NmbrOfReceivedPackets = 0;
//next state
DemoStates = sDemoPERStartReceive;
}
//start receive
RFReceive(&RxCommand);
//some delay (~20ms)
DemoTimer.U16 = 13400;
StartTmr3(TMR3_12, DemoTimer, FALSE);
while(Tmr3Expired() == FALSE);
StopTmr3();
//generate trigger
LED1_PIN = 1;
//start timeout 200ms
DemoTimer.U16 = 44450;
LongDelay = 3;
StartTmr3(TMR3_12, DemoTimer, FALSE);
//release trigger
LED1_PIN = 0;
//next state
DemoStates = sDemoWaitForReceive;
break;
case sDemoPERPrintResult:
//calc PER
temp_float = CalcPer(NmbrOfSentPackets,NmbrOfReceivedPackets);
MenuReportTestPer(NmbrOfSentPackets, NmbrOfReceivedPackets, temp_float);
//next state
DemoStates = sDemoPERStartReceive;
break;
/*Extra functions for TX-PER demo*/
case sDemoRestartTxDemo:
//draw demo start screen
PerformMenu( sMenuRestartDemo );
//next state
DemoStates = sDemoTxStartTransmit;
break;
case sDemoTxStartTransmit:
//if auto tx on -> check PB / send next packet
if( AutoTx == TRUE )
{
//set variables
NmbrOfSentPackets++;
LongDelay = 1;
DemoTimer.U16 = 60000;
StartTmr3(TMR3_12, DemoTimer, FALSE);
DemoStates = sDemoDelayBeforeTx;
return;
}
if( SEND_PACKET_INPUT == 0 )
{
//wait for releasing the push button
while( SEND_PACKET_INPUT == 0 );
//reset the RF stack
RFIdle();
//set variables
NmbrOfSentPackets = 1;
//enable AUTO TX function
AutoTx = TRUE;
//change TXON icon to TXOFF icon
PerformMenu( sMenuStartAutoTx );
//switch off LEDs
LED_TX = 0;
LED_RX = 0;
BLED_PIN = 0;
//send PING packets
LongDelay = 1;
DemoTimer.U16 = 600;
StartTmr3(TMR3_12, DemoTimer, FALSE);
DemoStates = sDemoDelayBeforeTx;
}
if( PB3_PIN == 0 || PB4_PIN == 0 )
{
while( PB3_PIN == 0 || PB4_PIN == 0 );
//goto setting page
MenuSetCursorPosition(0);
DemoStates = sDemoSettingScreen;
return;
}
break;
/*Extra functions for the RX-PER demo*/
case sDemoRestartRxDemo:
//draw demo start screen
PerformMenu( sMenuRestartDemo );
PerformMenu( sMenuClearSettingIcon );
//next state
DemoStates = sDemoRxStartReceive;
break;
case sDemoRxStartReceive:
//reset the RF stack
RFIdle();
//set flags -> wait for PING packet and not for ACK
fWaitForPacketOrAck = PING_PACKET;
//start receive
RFReceive(&RxCommand);
//next state
DemoStates = sDemoRxWaitForReceive;
break;
case sDemoRxWaitForReceive:
//check whether the push button is pressed for sending a PING packet
if( fChangeDemoStates == TRUE )
{
fChangeDemoStates = FALSE;
DemoStates = NewDemoStates;
return;
}
if( PB2_PIN == 0 )
{ /*RESET OPERATION*/
//stop receiving
RFIdle();
//wait for release the push button
while(PB2_PIN == 0);
//clear counters and variables
NmbrOfReceivedPackets = 0;
NmbrOfMissedPackets = 0;
LastPacketId = 0;
//switch off LEDs
LED_TX = 0;
LED_RX = 0;
BLED_PIN = 0;
//next state
DemoStates = sDemoRxStartReceive;
return;
}
if( PB3_PIN == 0 || PB4_PIN == 0 )
{
while( PB3_PIN == 0 || PB4_PIN == 0 );
//goto setting page
MenuSetCursorPosition(0);
DemoStates = sDemoSettingScreen;
return;
}
break;
/*Start the TRX-PER demo*/
case sDemoRestartDemo:
//draw demo start screen
PerformMenu( sMenuRestartDemo );
//next state
DemoStates = sDemoStartReceive;
break;
case sDemoStartReceive:
//reset the RF stack
RFIdle();
StopTmr3();
//set variables
NmbrOfSentPackets++;
//set flags -> wait for PING packet and not for ACK
fWaitForPacketOrAck = PING_PACKET;
//if auto tx on -> check PB / send next packet
if( AutoTx == TRUE )
{
LongDelay = 1;
DemoTimer.U16 = 60000;
StartTmr3(TMR3_12, DemoTimer, FALSE);
DemoStates = sDemoDelayBeforeTx;
return;
}
//start receive
RFReceive(&RxCommand);
//next state
DemoStates = sDemoWaitForReceive;
break;
case sDemoDelayBeforeTx:
//check the push buttons
if( (SEND_PACKET_INPUT == 0) || (NmbrOfSentPackets == v_max_packets[MenuItems.name.max_packets]+1) )
{ /*AUTO TRANSMIT FUNCTION IS STOPPED*/
//wait for release the button
while(SEND_PACKET_INPUT == 0);
AutoTx = FALSE;
//change TXON icon to CLEAR icon
PerformMenu( sMenuClearIcon );
//wait for the push button
DemoStates = sDemoWaitForClearScreen;
return;
}
if( PB3_PIN == 0 || PB4_PIN == 0 )
{ /*SETTING BUTTON IS PRESSED*/
//wait for release the button
while( PB3_PIN == 0 || PB4_PIN == 0 );
//goto setting page
MenuSetCursorPosition(0);
DemoStates = sDemoSettingScreen;
return;
}
if( Tmr3Expired() == TRUE )
{//TMR expired
StopTmr3();
DemoStates = sDemoSendPing;
return;
}
break;
case sDemoWaitForClearScreen:
if( PB2_PIN == 0 )
{//CLEAR the screen -> restart the demo
//wait for release the push button
while( PB2_PIN == 0 );
DemoStates = sDemoDefineDemoOrTest;
}
break;
case sDemoWaitForReceive:
if( fChangeDemoStates == TRUE )
{
fChangeDemoStates = FALSE;
DemoStates = NewDemoStates;
return;
}
if( MenuItems.name.system_function == LAB_MODE )
{
if( Tmr3Expired() == TRUE )
{//packet didn't receive within timeout
if( --LongDelay == 0 )
{
//stop timer & RF Stack
StopTmr3();
RFIdle();
//next state
DemoStates = sDemoPERPrintResult;
}
else
{//restart timer
DemoTimer.U16 = 44450;
StartTmr3(TMR3_12, DemoTimer, FALSE);
}
}
return;
}
//check whether the push button is pressed for sending a PING packet
if( (SEND_PACKET_INPUT == 0) && (fWaitForPacketOrAck == PING_PACKET) && (AutoTx == FALSE) )
{ /*AUTO TX FUNCTION IS ENABLED*/
//stop receiving
RFIdle();
StopTmr3();
//wait for release TX push button
while(SEND_PACKET_INPUT == 0);
//switch on auto tx
AutoTx = TRUE;
//change TXON icon to TXOFF icon
PerformMenu( sMenuStartAutoTx );
//clear counters and variables
NmbrOfSentPackets = 1;
NmbrOfReceivedPackets = 0;
//switch off LEDs
LED_TX = 0;
LED_RX = 0;
BLED_PIN = 0;
//next state
DemoStates = sDemoSendPing;
return;
}
if( PB3_PIN == 0 || PB4_PIN == 0 )
{
while( PB3_PIN == 0 || PB4_PIN == 0 );
//goto setting page
MenuSetCursorPosition(0);
DemoStates = sDemoSettingScreen;
return;
}
break;
case sDemoPacketReceived:
//stop timer
StopTmr3();
//get received packet and put it into the buffer
MessageBuffer.payload = &RxTxBuffer[0];
ReceivedData.message = MessageBuffer;
RFGetBuffer(&ReceivedData);
//stop RF stack
RFIdle();
if( MenuItems.name.system_function == LAB_MODE )
{
NmbrOfReceivedPackets++;
DemoStates = sDemoPERPrintResult;
return;
}
//RX only demo -> show the result
if( MenuItems.name.demo_mode == DEMO_MODE_RX )
{
if( RxTxBuffer[1] == MenuItems.name.self_id )
{
//check how many packet received and missed (calculation is based on the received packet ID
temp16 = ((uint16)(RxTxBuffer[2] << 8) + (uint16)RxTxBuffer[3]);
if( (temp16 == 1) || (NmbrOfReceivedPackets == 0) || (NmbrOfMissedPackets >= NmbrOfReceivedPackets) )
{//First valid packet received or error -> reset variables
NmbrOfReceivedPackets = 1;
NmbrOfMissedPackets = 0;
LastPacketId = temp16;
}
else
{//calculate the missed packets
NmbrOfReceivedPackets++;
NmbrOfMissedPackets += (temp16-1) - LastPacketId;
LastPacketId = temp16;
}
MenuReportPer( (NmbrOfReceivedPackets + NmbrOfMissedPackets), NmbrOfReceivedPackets, CalcPer((NmbrOfReceivedPackets + NmbrOfMissedPackets),NmbrOfReceivedPackets) );
}
else
{
printf("%x\r\n",RxTxBuffer[1]);
}
DemoStates = sDemoRxStartReceive;
return;
}
//check what kind of packet received
if( fWaitForPacketOrAck == PING_PACKET )
{//simple packet received -> send an ACK
if( (RxTxBuffer[1] == MenuItems.name.self_id) && (RxTxBuffer[4] == PING_PACKET) )
{//if the packet is sent to this device, then send ACK
//report the result
DemoPingReceived();
//set ACK packet
memcpy(&string[0],&RxTxBuffer[0],4);
RxTxBuffer[0] = MenuItems.name.self_id;
RxTxBuffer[1] = MenuItems.name.dest_id;
RxTxBuffer[2] = string[2];
RxTxBuffer[3] = string[3];
RxTxBuffer[4] = ACK_PACKET;
MessageBuffer.header = HeaderBuffer;
MessageBuffer.length = 5;
MessageBuffer.payload = &RxTxBuffer[0];
//send the packet
LED_TX = 1;
RFTransmit(&MessageBuffer);
//set flag ->ACK packet has sent
fPacketSent = ACK_PACKET;
//next state
DemoStates = sDemoWaitForSendPacket;
}
else
{//the packet is not PING or sent to another device, so discard it -> goto RX state:
//wait for push button or another PING packet
//goto RX state: wait for push button or another packet
DemoStates = sDemoStartReceive;
}
return;
}
if( fWaitForPacketOrAck == ACK_PACKET )
{//a packet received, check the content of it
if( (RxTxBuffer[1] == MenuItems.name.self_id) && (RxTxBuffer[4] == ACK_PACKET) )
{//ACK packet received -> calculate the PER and print the result
//report the result
DemoAckReceived(TRUE);
}
else
{//no ACK received -> calculate the PER and print the result
//report the result
DemoAckReceived(FALSE);
}
//goto RX state: wait for push button or another PING packet
DemoStates = sDemoStartReceive;
return;
}
break;
case sDemoSendPing:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -