📄 menu.c
字号:
/*
** ============================================================================
**
** FILE
** menu.c
**
** DESCRIPTION
** Realize the menu operation
**
** CREATED
** Silicon Laboratories Hungary Ltd
**
** COPYRIGHT
** Copyright 2008 Silicon Laboratories, Inc.
** http://www.silabs.com
**
** ============================================================================
*/
/*------------------------------------------------------------------------*/
/* INCLUDE */
/*------------------------------------------------------------------------*/
#include "global_definitions.h"
#include "menu.h"
#include "IA443x_demo.h"
#include "dog_glcd.h"
#include "timers.h"
#include "IAI_EBID.h"
/*------------------------------------------------------------------------*/
/* GLOBAL variables, constants */
/*------------------------------------------------------------------------*/
uint8 CursorPosition;
//menu item declarations
xdata MENU_ITEM_VALUE MenuItems;
code uint8 t_system_function[2][5] = {"DEMO", "LAB "};
code uint8 t_lab_mode[4][4] = {"CW ", "PN9", "BER", "PER"};
code uint8 t_demo_mode[3][4] = {"TRx", "Tx ", "Rx "};
code uint8 t_data_rate[NMBR_OF_GFSK_SAMPLE_SETTING][4] = {"2.4","4.8","9.6"," 10"," 20"," 40", " 50", "100", "128"};
code uint8 t_arib_data_rate[NMBR_OF_ARIB_SAMPLE_SETTING][5] = {"2.4","4.8"};
code uint8 t_ook_data_rate[NMBR_OF_OOK_SAMPLE_SETTING][4] = {"2.4","4.8","9.6"};
code uint8 t_modulation_mode[3][5] = {"GFSK","FSK ","OOK "};
code uint8 t_antenna_mode[3][4] = {"1&2","1 ","2 "};
code uint8 t_yes_no[2][4] = {"NO ","YES"};
code uint8 t_on_off[2][4] = {"OFF","ON "};
code uint16 v_max_packets[7] = {1, 10, 100, 500, 1000, 5000, 9999};
code uint8 t_output_power_4432[4][4] = {"+11", "+14", "+17", "+20"};
code uint8 t_output_power_4431[8][8] = {"-8", "-5", "-2", "+1", "+4", "+7", "+10", "+13"};
code uint8 t_packet_length[13] = {5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 64};
code uint8 t_gpio0_selection[9][11] = {" OFF", " TuningVol"," RxData"," RxBitClk","PreambleVa"," SyncWoDet"," PGA-I-Out"," PGA-Q-Out","StartTXDat"};
code uint8 t_rssi_format[3][8] = {"BarGraph"," dBm"," Number"};
code uint8 t_sma_connection_type[6][8] = {"SepTxRx", " AntDiv", " TxRxSW", " DTile"};
code uint8 t_chip_type[2][6] = {"SI4432","SI4431"};
code uint8 t_chip_revision[1][2] = { "V2" };
//extern variables, constans
//global_constans.c
extern code uint8 FirmwareVersion[5];
extern code DEMO_FREQ demo_freqs[MAX_FREQ_SETTING];
extern code DEMO_FREQ arib_freqs[MAX_ARIB_FREQ_SETTING];
//pictures.c
extern const code no_packet11x8[];
extern const code rssi12x8[];
extern const code rssi24x8[];
extern const code rssi36x8[];
extern const code rssi48x8[];
extern const code rssi510x8[];
extern const code rssi612x8[];
extern const code rssi714x8[];
extern const code ant9x8[];
extern const code ant1_inverted15x8[];
extern const code ant2_inverted15x8[];
extern const code ok_inverted16x8[];
extern const code rx_inverted16x8[];
extern const code start_inverted29x8[];
extern const code stop_inverted24x8[];
extern const code tx_inverted16x8[];
extern const code txon_inverted29x8[];
extern const code silabs87x40[];
extern const code txoff_inverted32x8[];
extern const code clear_inverted29x8[];
extern const code setting_inverted48x8[];
extern const code minus_inverted16x8[];
extern const code plus_inverted16x8[];
extern const code up_down_inverted16x8[];
extern const code go_inverted16x8[];
//IAI_EBID.
extern xdata EBID_DATA TestcardData;
//dog_glcd.c
extern idata uint8 lcd_data[22];
//IAI_demo.c
extern xdata ANTENNA_TYPE SelectedAntennaType;
/*------------------------------------------------------------------------*/
/* LOCAL function prototypes */
/*------------------------------------------------------------------------*/
void PrintRssiToLcd(void);
void DecFreqCounter(void);
void IncFreqCounter(void);
uint8 CheckFreqBand(void);
void PrintFreqDr(void);
void PrintRssi(uint8 row, uint8 column, uint8 rssi);
void DrawEmptySettingPage(void);
BUTTON_STATES CheckPushButtons(void);
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ FUNCTION NAME: MENU_RETURN PerformMenu(MENU_ITEM menu_item)
+
+ DESCRIPTION: menu handling
+
+ INPUT: next menu page
+
+ RETURN:
+
+ NOTES:
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
MENU_RETURN PerformMenu(MENU_ITEM menu_item)
{
switch( menu_item )
{
case sMenuStartScreen:
//clear LCD
LcdClearDisplay();
//draw startup screen
LcdSetPictureCursor(LCD_LINE_1,20);
LcdDrawPicture(silabs87x40);
memcpy(lcd_data,"EZRadioPRO Evaluation",21);
LcdWriteLine(LCD_LINE_7,lcd_data);
sprintf(lcd_data," (Firmware: %s) ",FirmwareVersion);
LcdWriteLine(LCD_LINE_8,lcd_data);
//print on the USB
printf("\r\n\r\nSILICON Labs., Si443x Packet Error Rate Demonstration\r\n");
printf("Firmware: %s\r\n",FirmwareVersion);
break;
case sMenuXTALError:
LcdClearDisplay();
printf("\r\nERROR: XTAL startup error!");
printf("\r\nTry a different Testcard!\r\n");
memcpy(lcd_data,"ERROR: XTAL startup! ",21);
LcdWriteLine(LCD_LINE_2,lcd_data);
memcpy(lcd_data," Try a different ",21);
LcdWriteLine(LCD_LINE_5,lcd_data);
memcpy(lcd_data," Testcard! ",21);
LcdWriteLine(LCD_LINE_6,lcd_data);
sprintf(lcd_data," (Firmware: %s) ",FirmwareVersion);
LcdWriteLine(LCD_LINE_8,lcd_data);
while(1);
break;
case sMenuPORTimeout:
//clear LCD
LcdClearDisplay();
printf("\r\nERROR: POR timeout! Insert a Testcard or try a different one!\r\n");
memcpy(lcd_data,"ERROR: POR timeout! ",21);
LcdWriteLine(LCD_LINE_2,lcd_data);
memcpy(lcd_data,"Insert a Testcard or ",21);
LcdWriteLine(LCD_LINE_5,lcd_data);
memcpy(lcd_data,"try a different one! ",21);
LcdWriteLine(LCD_LINE_6,lcd_data);
sprintf(lcd_data," (Firmware: %s) ",FirmwareVersion);
LcdWriteLine(LCD_LINE_8,lcd_data);
break;
case sMenuTestcardOrEEPROMError:
//clear LCD
LcdClearDisplay();
//EEPROM is empty
printf("\r\nERROR: no Testcard inserted, or the board identification");
printf("\r\nEEPROM is missing or empty!");
printf("\r\nTry a different Testcard!\r\n");
memcpy(lcd_data,"ERROR: no Testcard or",21);
LcdWriteLine(LCD_LINE_1,lcd_data);
memcpy(lcd_data," the board ident. ",21);
LcdWriteLine(LCD_LINE_2,lcd_data);
memcpy(lcd_data,"EEPROM missing/empty!",21);
LcdWriteLine(LCD_LINE_3,lcd_data);
memcpy(lcd_data," Try a different ",21);
LcdWriteLine(LCD_LINE_5,lcd_data);
memcpy(lcd_data," Testcard! ",21);
LcdWriteLine(LCD_LINE_6,lcd_data);
sprintf(lcd_data," (Firmware: %s) ",FirmwareVersion);
LcdWriteLine(LCD_LINE_8,lcd_data);
break;
case sMenuNotSupportedChip:
//clear LCD
LcdClearDisplay();
//EEPROM is empty
printf("\r\nERROR: the chip is not supported");
printf("\r\nby the current firmware!");
printf("\r\nTry a different Testcard!\r\n");
memcpy(lcd_data,"ERROR: the chip isn't",21);
LcdWriteLine(LCD_LINE_2,lcd_data);
memcpy(lcd_data,"supported by the FW! ",21);
LcdWriteLine(LCD_LINE_3,lcd_data);
memcpy(lcd_data," Try a different ",21);
LcdWriteLine(LCD_LINE_5,lcd_data);
memcpy(lcd_data," Testcard! ",21);
LcdWriteLine(LCD_LINE_6,lcd_data);
break;
/*Board Status Screen - Modified testcard*/
case sMenuBoardStatusModified:
//clear LCD
LcdClearDisplay();
//EEPROM is empty
printf("\r\nWARNING: MODIFIED TEST CARD DETECTED!");
memcpy(lcd_data," WARNING! ",21);
LcdWriteLine(LCD_LINE_2,lcd_data);
memcpy(lcd_data," MODIFIED ",21);
LcdWriteLine(LCD_LINE_4,lcd_data);
memcpy(lcd_data," test card detected! ",21);
LcdWriteLine(LCD_LINE_6,lcd_data);
break;
/*Board Status Screen - Modified testcard*/
case sMenuBoardStatusEngineering:
//clear LCD
LcdClearDisplay();
//EEPROM is empty
printf("\r\nWARNING: ENGINEERING TEST CARD DETECTED!");
memcpy(lcd_data," WARNING! ",21);
LcdWriteLine(LCD_LINE_2,lcd_data);
memcpy(lcd_data," ENGINEERING ",21);
LcdWriteLine(LCD_LINE_4,lcd_data);
memcpy(lcd_data," test card detected! ",21);
LcdWriteLine(LCD_LINE_6,lcd_data);
break;
/*CHIP SELECTION MENU (only in eeprom off mode)*/
case sMenuDrawChipSelection:
DrawEmptySettingPage();
memcpy(lcd_data,"EEPROM SELECTION ",21);
LcdWriteLine(LCD_LINE_1,lcd_data);
sprintf(lcd_data," Chip type: %s",&t_chip_type[MenuItems.name.chip_type][0]);
LcdWriteLine(LCD_LINE_3,lcd_data);
sprintf(lcd_data," Chip revision: %s",&t_chip_revision[MenuItems.name.chip_revision][0]);
LcdWriteLine(LCD_LINE_4,lcd_data);
sprintf(lcd_data," SMA conntype:%s",&t_sma_connection_type[MenuItems.name.sma_connection_type][0]);
LcdWriteLine(LCD_LINE_5,lcd_data);
//draw cursor
LcdSetCharCursor((CursorPosition+3),1);
LcdPutCh(CURSOR);
break;
case sMenuChangeChipSelection:
switch( CheckPushButtons() )
{
case Button1Pressed:
if(CursorPosition < 2) CursorPosition++; else CursorPosition = 0;
return UPDATE_PAGE;
break;
case Button2Pressed:
//increase actual variable
switch( CursorPosition )
{
case 0: if( MenuItems.name.chip_type < MAX_CHIP_TYPE ) MenuItems.name.chip_type++; else MenuItems.name.chip_type = 0; break;
case 1: if( MenuItems.name.chip_revision < MAX_CHIP_REVISION ) MenuItems.name.chip_revision++; else MenuItems.name.chip_revision = 0; break;
case 2: if( MenuItems.name.sma_connection_type < MAX_SMA_CONNECTIONTYPE ) MenuItems.name.sma_connection_type++; else MenuItems.name.sma_connection_type = 0; break;
default: break;
}
return UPDATE_PAGE;
break;
case Button3Pressed:
switch( CursorPosition )
{
case 0: if( MenuItems.name.chip_type == 0 ) MenuItems.name.chip_type = MAX_CHIP_TYPE; else MenuItems.name.chip_type--; break;
case 1: if( MenuItems.name.chip_revision == 0 ) MenuItems.name.chip_revision = MAX_CHIP_REVISION; else MenuItems.name.chip_revision--; break;
case 2: if( MenuItems.name.sma_connection_type == 0 ) MenuItems.name.sma_connection_type = MAX_SMA_CONNECTIONTYPE; else MenuItems.name.sma_connection_type--; break;
default: break;
}
return UPDATE_PAGE;
break;
case Button4Pressed:
return NEXT_PAGE;
break;
default:
return NONE;
break;
}
break;
/*SYSTEM FUNCTION MENU*/
case sMenuDrawSystemFunctionScreen:
DrawEmptySettingPage();
memcpy(lcd_data,"SYSTEM FUNCTION 1/4 ",21);
LcdWriteLine(LCD_LINE_1,lcd_data);
sprintf(lcd_data," Function: %s ",&t_system_function[MenuItems.name.system_function][0]);
LcdWriteLine(LCD_LINE_3,lcd_data);
if( MenuItems.name.system_function == LAB_MODE )
{
sprintf(lcd_data," =>Lab Mode: %s ",&t_lab_mode[MenuItems.name.lab_mode][0]);
}
else
{
sprintf(lcd_data," =>Demo Mode: %s ",&t_demo_mode[MenuItems.name.demo_mode][0]);
}
LcdWriteLine(LCD_LINE_4,lcd_data);
//draw cursor
LcdSetCharCursor((CursorPosition+3),1);
LcdPutCh(CURSOR);
break;
case sMenuChangeSystemFunction:
//check the state of the push buttons
switch( CheckPushButtons() )
{
case Button1Pressed:
if(CursorPosition < 1) CursorPosition++; else CursorPosition = 0;
return UPDATE_PAGE;
break;
case Button2Pressed:
//increase actual variable
switch( CursorPosition )
{
case 0:
if( MenuItems.name.system_function < MAX_SF_VALUE ) MenuItems.name.system_function++; else MenuItems.name.system_function = 0;
break;
case 1:
if( MenuItems.name.system_function == LAB_MODE )
{
switch( TestcardData.chip_type )
{
case SI4030: case SI4031: case SI4032:
if( MenuItems.name.lab_mode < 1 ) MenuItems.name.lab_mode++; else MenuItems.name.lab_mode = 0;
break;
case SI4330:
if( MenuItems.name.lab_mode < MAX_LM_VALUE ) MenuItems.name.lab_mode++; else MenuItems.name.lab_mode = 2;
break;
case SI4430: case SI4431: case SI4432:
if( MenuItems.name.lab_mode < MAX_LM_VALUE ) MenuItems.name.lab_mode++; else MenuItems.name.lab_mode = 0;
break;
}
}
else
{
switch( TestcardData.chip_type )
{
case SI4030: case SI4031: case SI4032: //TRANSMIT ONLY DEMO
MenuItems.name.demo_mode = 1;
break;
case SI4330: //RECEIVE ONLY DEMO
MenuItems.name.demo_mode = 2;
break;
case SI4430: case SI4431: case SI4432: //ONE WAY OR BIDIRECTIONAL LINK DEMO
if( MenuItems.name.demo_mode < MAX_DM_VALUE ) MenuItems.name.demo_mode++; else MenuItems.name.demo_mode = 0;
break;
}
}
break;
default: break;
}
return UPDATE_PAGE;
break;
case Button3Pressed:
switch( CursorPosition )
{
case 0:
if( MenuItems.name.system_function == 0 ) MenuItems.name.system_function = MAX_SF_VALUE; else MenuItems.name.system_function--;
break;
case 1:
if( MenuItems.name.system_function == LAB_MODE )
{
switch( TestcardData.chip_type )
{
case SI4030: case SI4031: case SI4032:
if( MenuItems.name.lab_mode == 0 || MenuItems.name.lab_mode > 1 ) MenuItems.name.lab_mode = 1; else MenuItems.name.lab_mode--;
break;
case SI4330:
if( MenuItems.name.lab_mode < 2 ) MenuItems.name.lab_mode = MAX_LM_VALUE; else MenuItems.name.lab_mode--;
break;
case SI4430: case SI4431: case SI4432:
if( MenuItems.name.lab_mode == 0 ) MenuItems.name.lab_mode = MAX_LM_VALUE; else MenuItems.name.lab_mode--;
break;
}
}
else
{
switch( TestcardData.chip_type )
{
case SI4030: case SI4031: case SI4032: //TRANSMIT ONLY DEMO
MenuItems.name.demo_mode = 1;
break;
case SI4330: //RECEIVE ONLY DEMO
MenuItems.name.demo_mode = 2;
break;
case SI4430: case SI4431: case SI4432: //ONE WAY OR BIDIRECTIONAL LINK DEMO
if( MenuItems.name.demo_mode == 0 ) MenuItems.name.demo_mode = MAX_DM_VALUE; else MenuItems.name.demo_mode--;
break;
}
}
break;
default: break;
}
return UPDATE_PAGE;
break;
case Button4Pressed:
return NEXT_PAGE;
break;
default:
return NONE;
break;
}
break;
/*RF PARAMETERS MENU1*/
case sMenuDrawRfParametersScreen1:
DrawEmptySettingPage();
memcpy(lcd_data,"RF PARAMETERS 2/4 ",21);
LcdWriteLine(LCD_LINE_1,lcd_data);
if( MenuItems.name.arib_mode == FALSE )
sprintf(lcd_data," Data Rate: %skbps",&t_data_rate[MenuItems.name.data_rate][0]);
else
sprintf(lcd_data," Data Rate: %skbps",&t_arib_data_rate[MenuItems.name.data_rate][0]);
LcdWriteLine(LCD_LINE_3,lcd_data);
sprintf(lcd_data," Modulation: %s ",&t_modulation_mode[MenuItems.name.modulation_mode][0]);
LcdWriteLine(LCD_LINE_4,lcd_data);
if( MenuItems.name.arib_mode == FALSE )
sprintf(lcd_data," Frequency: %sMHz",demo_freqs[MenuItems.name.frequency].freq_text);
else
sprintf(lcd_data," Frequency: %sMHz",arib_freqs[MenuItems.name.frequency].freq_text);
LcdWriteLine(LCD_LINE_5,lcd_data);
//draw cursor
LcdSetCharCursor((CursorPosition+3),1);
LcdPutCh(CURSOR);
break;
case sMenuChangeRfParameters1:
//check the state of the push buttons
switch( CheckPushButtons() )
{
case Button1Pressed:
if(CursorPosition < 2) CursorPosition++; else CursorPosition = 0;
return UPDATE_PAGE;
break;
case Button2Pressed:
//increase actual variable
switch( CursorPosition )
{
case 0: //DATA RATE
if( MenuItems.name.arib_mode == FALSE )
{
switch(MenuItems.name.modulation_mode)
{
case 0: //GFSK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -