⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ia443x_demo.c

📁 silicon wireless开发套件F920+Si4432原理图,源码
💻 C
📖 第 1 页 / 共 3 页
字号:
			//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 + -