📄 ia443x_demo.c
字号:
/*
** ============================================================================
**
** FILE
** IA443x_demo.c
**
** DESCRIPTION
** Contains the RF dependent functions
**
** CREATED
** Silicon Laboratories Hungary Ltd
**
** COPYRIGHT
** Copyright 2008 Silicon Laboratories, Inc.
** http://www.silabs.com
**
** ============================================================================
*/
/*------------------------------------------------------------------------*/
/* INCLUDE */
/*------------------------------------------------------------------------*/
#include "IA443x_demo.h"
#include "global_definitions.h"
#include "IA443x_rf.h"
#include "IA443x_rf_callback.h"
#include "menu.h"
#include "IAI_EBID.h"
/*------------------------------------------------------------------------*/
/* GLOBAL variables */
/*------------------------------------------------------------------------*/
idata DEMO_STATES DemoStates, NewDemoStates;
bit fChangeDemoStates, AutoTx;
idata UU16 DemoTimer;
idata uint8 LongDelay;
xdata PACKET_TYPE fWaitForPacketOrAck,fPacketSent;
xdata uint8 rf_param[10];
xdata uint16 NmbrOfSentPackets, NmbrOfReceivedPackets,NmbrOfMissedPackets,LastPacketId;
xdata ANTENNA_TYPE SelectedAntennaType;
idata PHY_STATUS RfStatus;
xdata uint8 RxTxBuffer[MAX_LENGTH_OF_PAYLOAD];
xdata HEADER HeaderBuffer;
xdata MESSAGE MessageBuffer;
xdata RECEIVE_COMMAND RxCommand;
xdata RECEIVED_DATA ReceivedData;
//EXTERN variables
//global_constans.c
extern code DEMO_FREQ demo_freqs[MAX_FREQ_SETTING];
extern code DEMO_FREQ arib_freqs[MAX_ARIB_FREQ_SETTING];
//IAI_EBID.c
extern xdata EBID_DATA TestcardData;
//menu.c
extern xdata MENU_ITEM_VALUE MenuItems;
extern code uint16 v_max_packets[8];
extern code uint8 t_packet_length[8];
extern code uint8 t_chip_type[2][6];
extern code uint8 t_chip_revision[1][2];
/*------------------------------------------------------------------------*/
/* LOCAL function prototypes */
/*------------------------------------------------------------------------*/
void DemoAckSent(uint8 success);
void DemoPingReceived(void);
void DemoAckReceived(uint8 success);
/*------------------------------------------------------------------------*/
/* LOCAL definitions */
/*------------------------------------------------------------------------*/
#define PER_RESET_INPUT PB2_PIN
#define SEND_PACKET_INPUT PB1_PIN
#define LED_TX LED1_PIN
#define LED_RX LED2_PIN
#define LED_ANT1 LED3_PIN
#define LED_ANT2 LED4_PIN
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME: void DemoInit(void)
+
+ DESCRIPTION: initializes the demo
+
+ RETURN: None
+
+ NOTES:
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void DemoInit(void)
{
//initialize the demo variables
DemoStates = sDemoInit;
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME: void DemoStateMachine(void)
+
+ DESCRIPTION: state machine of the demo
+
+ RETURN: None
+
+ NOTES:
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void DemoStateMachine(void)
{
uint8 temp8,i,string[6];
uint16 temp16;
float temp_float;
switch( DemoStates )
{
case sDemoInit:
MenuItems.name.eeprom_off = FALSE; //default - EEPROM is enabled
//diable the EEPROM
if( PB4_PIN == 0 )
{
while ( PB4_PIN == 0 );
MenuItems.name.eeprom_off = TRUE;
}
//set default variables
DemoStates = sDemoStartScreen;
//find out what kind of testcard is plugged into the PIC SW Dev board
if ( MenuItems.name.eeprom_off == FALSE ) //if EEPROM is enabled
{
GetEBIDDataFromEEPROM();
if( TestcardData.valid_info == FALSE )
{//there is no Testcard inserted or there is no EEPROM on the testcard
PerformMenu(sMenuTestcardOrEEPROMError);
DemoStates = sDemoDoNothing;
return;
}
//find out whether the chip is supported by the current FW or not
switch( TestcardData.chip_type )
{
case SI4030:
case SI4031:
case SI4032:
temp8 = TRUE;
break;
case SI4330:
temp8 = TRUE;
break;
case SI4430:
case SI4431:
case SI4432:
if( TestcardData.chip_revision[0] == 'V' )
{
temp8 = TRUE;
}
break;
default:
temp8 = FALSE;
break;
}
if( temp8 == TRUE )
{//the chip is supported, check the POR
//initialize the RF chip
temp8 = RfInitHw();
if( temp8 == RF_ERROR_TIMING )
{//POR Timeout error
PerformMenu( sMenuPORTimeout );
DemoStates = sDemoDoNothing;
return;
}
}
else
{//the chip is not supported by the current FW
PerformMenu(sMenuNotSupportedChip);
DemoStates = sDemoDoNothing;
return;
}
//disable hidden menu
MenuItems.name.show_hidden_menu = FALSE;
//set the antenna type
switch( TestcardData.ant_type )
{
case SMA_TRX_SWITCH: SelectedAntennaType = RX_TX_SWITCH; break;
case SEPARATE_SMA: SelectedAntennaType = SEPARATE_RX_TX; break;
case ANT_DIVERSITY: SelectedAntennaType = ANTENNA_DIVERSITY; break;
default: SelectedAntennaType = SEPARATE_RX_TX; break;
}
}
else
{
MenuItems.name.show_hidden_menu = TRUE;
//initialize the RF chip
temp8 = RfInitHw();
if( temp8 == RF_ERROR_TIMING )
{//POR Timeout error
PerformMenu( sMenuPORTimeout );
DemoStates = sDemoDoNothing;
return;
}
}
break;
case sDemoStartScreen:
//draw the startup screen
PerformMenu( sMenuStartScreen );
//start long timeout -> ~3s
LongDelay = START_SCREEN_DELAY_SW_DIV;
DemoTimer.U16 = START_SCREEN_DELAY;
StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
DemoStates = sDemoDelayAfterScreens;
break;
case sDemoDelayAfterScreens:
//check whether the timer expired or not
if( Tmr3Expired() == TRUE )
{//TMR expired
StopTmr3();
if( --LongDelay == 0 )
{
DemoStates = sDemoInitRf;
return;
}
else
{//restart timer
DemoTimer.U16 = START_SCREEN_DELAY;
StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
}
}
//enable the hidden menu if needed
if( (PB1_PIN == 0) && (PB2_PIN == 0) )
{ //wait for releasing the buttons
while( (PB1_PIN == 0) && (PB2_PIN == 0) );
//enable the hidden menu
MenuItems.name.show_hidden_menu = TRUE;
DemoStates = sDemoInitRf;
return;
}
//skip the start screen if any of the PB is pressed
if( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) )
{
while( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) );
DemoStates = sDemoInitRf;
}
break;
case sDemoInitRf:
if ( MenuItems.name.eeprom_off == FALSE )
{
if( SpiReadByteFromTestcardEEPROM( EE_ADDRESS_FIRST_PLUG ) == 0xFF )
{//no data is saved previously into the EEPROM
//reset menu variables
for(i=0;i<NMBR_OF_MENU_ITEM;i++) MenuItems.value[i] = 0;
//set default values for some registers
MenuItems.name.antenna_mode = 1;
MenuItems.name.max_packets = 4;
MenuItems.name.output_power = 3;
//-> set destination ID equal to the source ID
MenuItems.name.dest_id = (uint8)(TestcardData.serial_nmbr & 0x00FF);
MenuItems.name.self_id = (uint8)(TestcardData.serial_nmbr & 0x00FF);
MenuItems.name.antenna_mode = 1;
}
else
{//read menu items from the EEPROM
for(i=0;i<NMBR_OF_MENU_ITEM-1;i++)
{
MenuItems.value[i] = SpiReadByteFromTestcardEEPROM(EE_ADDRESS_FIRST_PLUG + i + 1);
}
MenuItems.name.self_id = (uint8)(TestcardData.serial_nmbr & 0x00FF);
//if the read value is out of the valid range, then set the default
if (MenuItems.name.system_function >= 2) MenuItems.name.system_function = 0;
if (MenuItems.name.lab_mode >= 4) MenuItems.name.lab_mode = 0;
if (MenuItems.name.demo_mode >= 3) MenuItems.name.demo_mode = 0;
if (MenuItems.name.data_rate >= 9) MenuItems.name.data_rate = 0;
if (MenuItems.name.modulation_mode >= 3) MenuItems.name.modulation_mode = 0;
if (MenuItems.name.frequency >= 20) MenuItems.name.frequency = 12;
if (MenuItems.name.gps_enabled >= 2) MenuItems.name.gps_enabled = 0;
if (MenuItems.name.arib_mode >= 2) MenuItems.name.arib_mode = 0;
if (MenuItems.name.full_menu >= 2) MenuItems.name.full_menu = 0;
if (MenuItems.name.output_power >= 4) MenuItems.name.output_power = 3;
if (MenuItems.name.max_packets >= 7) MenuItems.name.max_packets = 4;
if (MenuItems.name.packet_length >= 13) MenuItems.name.packet_length = 0;
}
}
else
{ //EEPROM mode disabled, all variable must be set manually
MenuItems.name.system_function = 0;
MenuItems.name.demo_mode = 0;
MenuItems.name.data_rate = 0;
MenuItems.name.antenna_mode = 1;
MenuItems.name.modulation_mode = 0;
MenuItems.name.frequency = 12;
MenuItems.name.self_id = 0;
MenuItems.name.dest_id = 0;
MenuItems.name.arib_mode = 0;
MenuItems.name.max_packets = 4;
MenuItems.name.gps_enabled = 0;
MenuItems.name.output_power = 3;
MenuItems.name.sma_connection_type = 0;
MenuItems.name.chip_type = 0;
MenuItems.name.chip_revision = 0;
MenuItems.name.packet_length = 0;
MenuItems.name.full_menu = 1;
}
//set parameters what are not saved into the EEPROM
MenuItems.name.gpio0_select = 0;
MenuItems.name.rssi_format = 0;
MenuItems.name.preamble_length = 24;
MenuItems.name.preamble_detection_treshold = 10;
//check whether the settings are correlated to other settings - change if needed
ChangeSettingsIfNotvalid();
temp8 = TestcardData.board_status & 0x03;
switch (temp8)
{
case 1: DemoStates = sDemoBoardStatusModifiedDraw; break;
case 2: DemoStates = sDemoBoardStatusEngineeringDraw; break;
default:
if (MenuItems.name.eeprom_off == FALSE) DemoStates = sDemoSettingScreen;
else DemoStates = sDemoDrawSP0;
break;
}
MenuSetCursorPosition(0);
break;
case sDemoBoardStatusModifiedDraw:
//draw board status modified screen
PerformMenu( sMenuBoardStatusModified );
LongDelay = START_SCREEN_DELAY_SW_DIV;
DemoTimer.U16 = START_SCREEN_DELAY;
StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
DemoStates = sDemoDelay;
break;
case sDemoBoardStatusEngineeringDraw:
//draw board status engineering screen
PerformMenu( sMenuBoardStatusEngineering );
LongDelay = START_SCREEN_DELAY_SW_DIV;
DemoTimer.U16 = START_SCREEN_DELAY;
StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
DemoStates = sDemoDelay;
break;
case sDemoDelay:
if( Tmr3Expired() == TRUE )
{//TMR expired
StopTmr3();
if( --LongDelay == 0 )
{
if (MenuItems.name.eeprom_off == FALSE) DemoStates = sDemoSettingScreen;
else DemoStates = sDemoDrawSP0;
}
else
{//restart timer
DemoTimer.U16 = START_SCREEN_DELAY;
StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
}
}
//skip the start screen if any of the PB is pressed
if( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) )
{
while( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) );
if (MenuItems.name.eeprom_off == FALSE) DemoStates = sDemoSettingScreen;
else DemoStates = sDemoDrawSP0;
}
break;
case sDemoDrawSP0:
//draw first setting page
PerformMenu( sMenuDrawChipSelection );
DemoStates = sDemoChangeSP0;
break;
case sDemoChangeSP0:
switch( PerformMenu(sMenuChangeChipSelection) )
{
case UPDATE_PAGE: DemoStates = sDemoDrawSP0; break;
case NEXT_PAGE:
if ( MenuItems.name.eeprom_off == TRUE )
{
switch (MenuItems.name.chip_type)
{
case 0: TestcardData.chip_type = SI4432; break;
case 1: TestcardData.chip_type = SI4431; break;
default: TestcardData.chip_type = SI4432; break;
}
TestcardData.chip_revision[0] = t_chip_revision[MenuItems.name.chip_revision][0];
switch( MenuItems.name.sma_connection_type )
{
case 0: SelectedAntennaType = SEPARATE_RX_TX; break;
case 1: SelectedAntennaType = ANTENNA_DIVERSITY; break;
case 2: SelectedAntennaType = RX_TX_SWITCH; break;
case 3: SelectedAntennaType = DIRECT_TILE; break;
default: SelectedAntennaType = SEPARATE_RX_TX; break;
}
}
DemoStates = sDemoSettingScreen;
MenuSetCursorPosition(0);
break;
default: break;
}
break;
case sDemoSettingScreen:
//draw first setting page
PerformMenu( sMenuDrawSystemFunctionScreen );
DemoStates = sDemoChangeSP1;
break;
case sDemoChangeSP1:
switch( PerformMenu(sMenuChangeSystemFunction) )
{
case UPDATE_PAGE: DemoStates = sDemoSettingScreen; break;
case NEXT_PAGE:
DemoStates = sDemoDrawSP2;
MenuSetCursorPosition(0);
break;
default: break;
}
break;
case sDemoDrawSP2:
PerformMenu( sMenuDrawRfParametersScreen1 );
DemoStates = sDemoChangeSP2;
break;
case sDemoChangeSP2:
switch( PerformMenu(sMenuChangeRfParameters1) )
{
case UPDATE_PAGE: DemoStates = sDemoDrawSP2; break;
case NEXT_PAGE:
DemoStates = sDemoDrawSP3;
MenuSetCursorPosition(0);
break;
default: break;
}
break;
case sDemoDrawSP3:
PerformMenu( sMenuDrawRfParametersScreen2 );
DemoStates = sDemoChangeSP3;
break;
case sDemoChangeSP3:
switch( PerformMenu(sMenuChangeRfParameters2) )
{
case UPDATE_PAGE: DemoStates = sDemoDrawSP3; break;
case NEXT_PAGE:
DemoStates = sDemoDrawSP4;
if ( MenuItems.name.eeprom_off == FALSE )
{
MenuSetCursorPosition(1);
}
else
{
MenuSetCursorPosition(0);
}
break;
default: break;
}
break;
case sDemoDrawSP4:
PerformMenu( sMenuDrawNodeParametersScreen );
DemoStates = sDemoChangeSP4;
break;
case sDemoChangeSP4:
switch( PerformMenu( sMenuChangeNodeParameters ) )
{
case UPDATE_PAGE: DemoStates = sDemoDrawSP4; break;
case NEXT_PAGE:
if(MenuItems.name.show_hidden_menu == TRUE) DemoStates = sDemoDrawSP5;
else DemoStates = sDemoDefineDemoOrTest;
MenuSetCursorPosition(0);
break;
default: break;
}
break;
case sDemoDrawSP5:
PerformMenu( sMenuDrawHiddenScreen1 );
DemoStates = sDemoChangeSP5;
break;
case sDemoChangeSP5:
switch( PerformMenu( sMenuChangeHiddenScreen1 ) )
{
case UPDATE_PAGE: DemoStates = sDemoDrawSP5; break;
case NEXT_PAGE:
DemoStates = sDemoDrawSP6;
MenuSetCursorPosition(0);
break;
default: break;
}
break;
case sDemoDrawSP6:
PerformMenu( sMenuDrawHiddenScreen2 );
DemoStates = sDemoChangeSP6;
break;
case sDemoChangeSP6:
switch( PerformMenu( sMenuChangeHiddenScreen2 ) )
{
case UPDATE_PAGE: DemoStates = sDemoDrawSP6; break;
case NEXT_PAGE: DemoStates = sDemoDefineDemoOrTest; break;
default: break;
}
break;
case sDemoDefineDemoOrTest:
ChangeSettingsIfNotvalid();
if ( MenuItems.name.eeprom_off == FALSE )
{
//save the settings into the EEPROM
for(i=0;i<NMBR_OF_MENU_ITEM;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -