Source code for the SX126xDVK1xAS Dev Kit. This example code has only been tested on the Nucleo L476RG
Dependencies: mbed DmTftLibrary SX126xLib
Diff: Display/Menu.cpp
- Revision:
- 0:e5420f1a8a1a
- Child:
- 1:b96176a4ccb8
diff -r 000000000000 -r e5420f1a8a1a Display/Menu.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Display/Menu.cpp Tue Sep 05 08:15:37 2017 +0000 @@ -0,0 +1,2146 @@ +/* + ______ _ + / _____) _ | | +( (____ _____ ____ _| |_ _____ ____| |__ + \____ \| ___ | (_ _) ___ |/ ___) _ \ + _____) ) ____| | | || |_| ____( (___| | | | +(______/|_____)_|_|_| \__)_____)\____)_| |_| + (C)2016 Semtech + +Description: Display demo menus and manage touch sensor. + +Maintainer: Gregory Cristian & Gilbert Menth +*/ + +#include "mbed.h" +#include "Menu.h" +#include "DisplayDriver.h" +#include "Eeprom.h" +#include "DemoApplication.h" + + +/*! + * \brief Maximum character count on the same line with function DrawText + * This include needed space for the outline (at the begin and the end of line). + * MAX_CHAR_PER_BTN is the same, but for a button. +*/ +#define MAX_CHAR_PER_LINE 28 + + +/*! + * \brief Bitmap of Semtech Logo stored here (copied from a C file). +*/ +extern uint8_t SemtechLogo[]; + +/*! + * \brief Bitmap of Semtech Logo stored here (copied from a C file). +*/ +uint8_t DeviceConnected = 0; + +/*! + * \brief This ticker give the rythme to check X and Y coordinates of activated + * touched region (if pressed). CheckScreenFlag keep the status if Touchscreen + * has been checked or not, until checked. +*/ +Ticker CheckScreenTouch; +volatile bool CheckScreenFlag = false; + +/*! + * \brief This ticker give the rythme to avoid quick menu change + */ +Ticker DebouncedScreenTouch; +volatile bool ScreenBeenDebounced = false; + +/*! + * \brief List og graphical object in the application. +*/ +enum MenuObjectsId +{ + PAGE_BORDER = 0, + TITLE_LINE, + TITLE_TEXT, + FIRM_LOGO, + BTN0_BORDER, // to accord with DrawActiveButton( ), each button should + BTN0_MENU_TEXT, // have consecutively MENU_TEXT (full large text), + BTN0_LABEL_TEXT, // LABEL_TEXT (left side of the button) and VALUE_TEXT + BTN0_VALUE_TEXT, // (right side of the button). + BTN1_BORDER, + BTN1_MENU_TEXT, + BTN1_LABEL_TEXT, + BTN1_VALUE_TEXT, + BTN2_BORDER, + BTN2_MENU_TEXT, + BTN2_LABEL_TEXT, + BTN2_VALUE_TEXT, + BTN3_BORDER, + BTN3_MENU_TEXT, + BTN3_LABEL_TEXT, + BTN3_VALUE_TEXT, + BTN4_BORDER, + BTN4_MENU_TEXT, + BTN4_LABEL_TEXT, + BTN4_VALUE_TEXT, + BTN5_BORDER, + BTN5_MENU_TEXT, + BTN5_LABEL_TEXT, + BTN5_VALUE_TEXT, + BTN6_BORDER, + BTN6_MENU_TEXT, + BTN6_LABEL_TEXT, + BTN6_VALUE_TEXT, + BTN7_BORDER, + BTN7_MENU_TEXT, + BTN8_BORDER, + BTN8_MENU_TEXT, + BTN9_BORDER, + BTN9_MENU_TEXT, + BTN9_LABEL_TEXT, + BTN9_VALUE_TEXT, + LINE0_TEXT, + LINE1_TEXT, + LINE2_TEXT, + LINE3_TEXT, + LINE3_COL0_TEXT, + LINE3_COL1_TEXT, + LINE3_COL2_TEXT, + LINE4_TEXT, // to accord with DrawText( ), each text line should + LINE4_COL0_TEXT, // have consecutively TEXT (full large text), + LINE4_COL1_TEXT, // COL0_TEXT (left side of the line), COL1_TEXT (center + LINE4_COL2_TEXT, // region of the line) and COL2_TEXT (right side of the + LINE5_COL0_TEXT, // line). COL0..2 are optionals if doesn't exist. + LINE5_COL1_TEXT, + LINE5_COL2_TEXT, + LINE6_COL0_TEXT, + LINE6_COL1_TEXT, + LINE6_COL2_TEXT, + LINE7_COL0_TEXT, + LINE7_COL1_TEXT, + LINE7_COL2_TEXT, + LINE8_COL0_TEXT, + LINE8_COL1_TEXT, + LINE8_COL2_TEXT, + LINE9_COL0_TEXT, + LINE9_COL1_TEXT, + LINE9_COL2_TEXT, +}; +#define GRAPH_OBJECTS_COUNT 66 +GraphObject_t MenuObjects[GRAPH_OBJECTS_COUNT] = +{ + // { Id, Type, Xpos, Ypos, Height, Width, LineW, BackColor, FrontColor, DoFill, FillCol, Source, TouchActive } + { PAGE_BORDER, GO_RECTANGLE, 0, 0, 320, 240, 1, BACK_COLOR, PAGE_COLOR, false, NULL, NULL, false }, + { TITLE_LINE, GO_LINE, 0, 30, 1, 240, 1, BACK_COLOR, PAGE_COLOR, false, NULL, NULL, false }, + { TITLE_TEXT, GO_TEXT, 15, 9, NULL, 208, 1, BACK_COLOR, WHITE, false, NULL, NULL, false }, + { FIRM_LOGO, GO_IMAGE, 20, 37, 95, 215, 1, BACK_COLOR, WHITE, false, NULL, SemtechLogo, false }, + { BTN0_BORDER, GO_RECTANGLE, 10, 40, 30, 106, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN0_MENU_TEXT, GO_TEXT, 15, 48, NULL, 96, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN0_LABEL_TEXT, GO_TEXT, 15, 48, NULL, 32, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN0_VALUE_TEXT, GO_TEXT, 47, 48, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN1_BORDER, GO_RECTANGLE, 10, 75, 30, 222, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN1_MENU_TEXT, GO_TEXT, 15, 83, NULL, 200, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN1_LABEL_TEXT, GO_TEXT, 15, 83, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN1_VALUE_TEXT, GO_TEXT, 79, 83, NULL, 152, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN2_BORDER, GO_RECTANGLE, 10, 110, 30, 222, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN2_MENU_TEXT, GO_TEXT, 15, 118, NULL, 200, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN2_LABEL_TEXT, GO_TEXT, 15, 118, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN2_VALUE_TEXT, GO_TEXT, 79, 118, NULL, 152, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN3_BORDER, GO_RECTANGLE, 10, 145, 30, 222, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN3_MENU_TEXT, GO_TEXT, 15, 153, NULL, 200, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN3_LABEL_TEXT, GO_TEXT, 15, 153, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN3_VALUE_TEXT, GO_TEXT, 79, 153, NULL, 152, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN4_BORDER, GO_RECTANGLE, 10, 180, 30, 222, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN4_MENU_TEXT, GO_TEXT, 15, 188, NULL, 200, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN4_LABEL_TEXT, GO_TEXT, 15, 188, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN4_VALUE_TEXT, GO_TEXT, 79, 188, NULL, 152, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN5_BORDER, GO_RECTANGLE, 10, 215, 30, 222, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN5_MENU_TEXT, GO_TEXT, 15, 223, NULL, 200, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN5_LABEL_TEXT, GO_TEXT, 15, 223, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN5_VALUE_TEXT, GO_TEXT, 79, 223, NULL, 152, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN6_BORDER, GO_RECTANGLE, 10, 250, 30, 222, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN6_MENU_TEXT, GO_TEXT, 15, 258, NULL, 200, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN6_LABEL_TEXT, GO_TEXT, 15, 258, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN6_VALUE_TEXT, GO_TEXT, 79, 258, NULL, 152, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { BTN7_BORDER, GO_RECTANGLE, 10, 285, 30, 106, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN7_MENU_TEXT, GO_TEXT, 15, 293, NULL, 96, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN8_BORDER, GO_RECTANGLE, 125, 285, 30, 107, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN8_MENU_TEXT, GO_TEXT, 130, 293, NULL, 96, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN9_BORDER, GO_RECTANGLE, 125, 40, 30, 107, 1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL, false }, + { BTN9_MENU_TEXT, GO_TEXT, 130, 48, NULL, 96, 1, BACK_COLOR, MENU_TEXT, false, NULL, NULL, false }, + { BTN9_LABEL_TEXT, GO_TEXT, 130, 48, NULL, 32, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { BTN9_VALUE_TEXT, GO_TEXT, 162, 48, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE0_TEXT, GO_TEXT, 5, 80, NULL, 232, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE1_TEXT, GO_TEXT, 5, 100, NULL, 232, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE2_TEXT, GO_TEXT, 5, 120, NULL, 232, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE3_TEXT, GO_TEXT, 5, 140, NULL, 232, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE3_COL0_TEXT, GO_TEXT, 5, 140, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE3_COL1_TEXT, GO_TEXT, 110, 140, NULL, 56, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE3_COL2_TEXT, GO_TEXT, 170, 140, NULL, 64, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE4_TEXT, GO_TEXT, 5, 160, NULL, 232, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE4_COL0_TEXT, GO_TEXT, 5, 160, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE4_COL1_TEXT, GO_TEXT, 110, 160, NULL, 56, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE4_COL2_TEXT, GO_TEXT, 170, 160, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE5_COL0_TEXT, GO_TEXT, 5, 180, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE5_COL1_TEXT, GO_TEXT, 110, 180, NULL, 56, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE5_COL2_TEXT, GO_TEXT, 170, 180, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE6_COL0_TEXT, GO_TEXT, 5, 200, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE6_COL1_TEXT, GO_TEXT, 110, 200, NULL, 56, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE6_COL2_TEXT, GO_TEXT, 170, 200, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE7_COL0_TEXT, GO_TEXT, 5, 220, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE7_COL1_TEXT, GO_TEXT, 110, 220, NULL, 56, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE7_COL2_TEXT, GO_TEXT, 170, 220, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE8_COL0_TEXT, GO_TEXT, 5, 240, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE8_COL1_TEXT, GO_TEXT, 110, 240, NULL, 56, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE8_COL2_TEXT, GO_TEXT, 170, 240, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE9_COL0_TEXT, GO_TEXT, 5, 260, NULL, 104, 1, BACK_COLOR, TEXT_COLOR, false, NULL, NULL, false }, + { LINE9_COL1_TEXT, GO_TEXT, 110, 260, NULL, 56, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false }, + { LINE9_COL2_TEXT, GO_TEXT, 170, 260, NULL, 64, 1, BACK_COLOR, TEXT_VALUE, false, NULL, NULL, false } +}; + +/*! + * \brief DrawText( ) need char* to display a text. It can display until + * 3 different texts on the same line. To avoid recursive use of the same + * ressource, 3 temporary string are declared. + */ +char StringText[MAX_CHAR_PER_LINE + 1]; // don't forget the /0 (end of string) +char StringText2[MAX_CHAR_PER_LINE + 1]; +char StringText3[MAX_CHAR_PER_LINE + 1]; + +/*! + * \brief CurrentPage store current displayed page (cf.: list of availlable + * pages in Menu.h). PeviousPage is used only when navigate through "Radio + * Config" to be able to restore the page before "Radio Congig", witch can be + * PingPong, PER or START_PAGE. The goal is to speed menu navigation. +*/ +static uint8_t CurrentPage = START_PAGE; +static uint8_t PreviousPage = START_PAGE; + +/*! + * \brief In "Radio Config Freq", we can update the central frequency. To avoid + * keyboard, we use (+) et (-) keys. CurrentFreqBase is the offset to be applied + * when we increase or decrease the frequency. +*/ +static FreqBase CurrentFreqBase = FB100K; + +/*! + * \brief If radio params does't respect bandwidth > fdev + bitrate/2, the radio + * couldn't make a proper modulation. Parameters will be printed in red. +*/ +static bool ErrorParam = false; + + +void CheckScreen( void ); +void DebouncedScreen( void ); +void DrawActiveButton( uint8_t buttonId, uint8_t* text1, uint8_t* text2 ); +void ButtonChangeText( uint8_t buttonId, uint8_t* text1, uint8_t* text2 ); +void DrawText( uint8_t lineId, uint8_t* text0, uint8_t* text1, uint8_t* text2 ); +void RadioSettingsCheckError( void ); +void RadioSettingsClearError( void ); + + +void MenuInit( uint8_t deviceConnected ) +{ + DeviceConnected = deviceConnected; + + DisplayDriverInit( ); + GraphObjectDraw( &( MenuObjects[PAGE_BORDER] ), NULL, false, false); + GraphObjectDraw( &( MenuObjects[TITLE_LINE] ), NULL, false, false); + MenuSetPage( START_PAGE ); + CheckScreenTouch.attach_us( &CheckScreen, 100000 ); // every 100 ms +} + +uint8_t MenuHandler( bool refresh ) +{ + uint8_t graphObjectTouched = 0xFF; + + if( CheckScreenFlag == true ) + { + if( ScreenBeenDebounced == false ) + { + ScreenBeenDebounced = true; + CheckScreenFlag = false; + DebouncedScreenTouch.attach_us( &DebouncedScreen, 150000 ); // every 150 ms + GraphObjectTouched( MenuObjects, GRAPH_OBJECTS_COUNT, &graphObjectTouched ); + } + } + + if( ( refresh == true ) && ( graphObjectTouched == 0xFF ) ) + { + MenuSetPage( CurrentPage ); + } + else if( ( graphObjectTouched != 0xFF ) || ( refresh == true ) ) + { + switch( CurrentPage ) + { + case START_PAGE: + if( graphObjectTouched == BTN2_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType ); + MenuSetPage( PAGE_PING_PONG ); + } + else if( graphObjectTouched == BTN3_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType ); + MenuSetPage( PAGE_PER ); + } + else if( graphObjectTouched == BTN4_BORDER ) + { + EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType ); + MenuSetPage( PAGE_RADIO_TEST ); + } + else if( graphObjectTouched == BTN5_BORDER ) + { + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( graphObjectTouched == BTN6_BORDER ) + { + MenuSetPage( PAGE_UTILITIES ); + } + break; + + case PAGE_PING_PONG: + if( graphObjectTouched == BTN0_BORDER ) + { + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + if( Eeprom.EepromData.DemoSettings.Entity == MASTER ) + { + Eeprom.EepromData.DemoSettings.Entity = SLAVE; + ButtonChangeText( BTN0_BORDER, ( uint8_t* )" SLAVE", NULL ); + DrawText( LINE3_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + DrawText( LINE4_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + DrawText( LINE5_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + DrawText( LINE6_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + DrawText( LINE7_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + DrawText( LINE8_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + DrawText( LINE9_COL0_TEXT, NULL, NULL, ( uint8_t* )" " ); + } + else + { + Eeprom.EepromData.DemoSettings.Entity = MASTER; + ButtonChangeText( BTN0_BORDER, ( uint8_t* )" MASTER", NULL ); + DrawText( LINE3_COL0_TEXT, NULL, NULL, ( uint8_t* )"MASTER" ); + } + Eeprom.EepromData.DemoSettings.HoldDemo = true; + EepromSaveSettings( DEMO_SETTINGS ); + MenuSetPage( PAGE_PING_PONG ); + } + else if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + Eeprom.EepromData.DemoSettings.CntPacketTx = 0; + Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0; + Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0; + Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0; + Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0; + Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0; + StopDemoApplication( ); + RunDemoApplicationPingPong( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + StopDemoApplication( ); + wait_ms( 200 ); // debouncing of the touch screen + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_PING_PONG; + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( refresh == true ) + { + MenuSetPage( PAGE_PING_PONG ); + } + break; + + case PAGE_PER: + if( graphObjectTouched == BTN0_BORDER ) + { + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + if( Eeprom.EepromData.DemoSettings.Entity == MASTER ) + { + Eeprom.EepromData.DemoSettings.Entity = SLAVE; + ButtonChangeText( BTN0_BORDER, ( uint8_t* )" SLAVE", NULL ); + DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", NULL, NULL ); + DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", NULL, NULL ); + DrawText( LINE6_COL0_TEXT, ( uint8_t* )"PER", NULL, NULL ); + DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Freq Err", NULL, NULL ); + DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", NULL, NULL ); + DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", NULL, NULL ); + } + else + { + Eeprom.EepromData.DemoSettings.Entity = MASTER; + ButtonChangeText( BTN0_BORDER, ( uint8_t* )" MASTER", NULL ); + DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Transmitted", ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL ); + DrawText( LINE5_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL ); + DrawText( LINE6_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL ); + DrawText( LINE7_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL ); + DrawText( LINE8_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL ); + DrawText( LINE9_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL ); + } + + Eeprom.EepromData.DemoSettings.HoldDemo = true; + EepromSaveSettings( DEMO_SETTINGS ); + MenuSetPage( PAGE_PER ); + } + else if( graphObjectTouched == BTN7_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.CntPacketTx = 0; + Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0; + Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0; + Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0; + RunDemoApplicationPer( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + StopDemoApplication( ); + wait_ms( 200 ); // debouncing of the touch screen + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_PER; + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( refresh == true ) + { + MenuSetPage( PAGE_PER ); + } + break; + + case PAGE_RADIO_PARAM: + if( graphObjectTouched == BTN0_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_GFSK; + } + else// if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK ) + { + Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA; + } + EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType ); + RadioSettingsCheckError( ); + ButtonChangeText( BTN0_BORDER, NULL, ( uint8_t* )GetMenuRadioFrameType( ) ); + ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters1( ) ); + ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters2( ) ); + ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters3( ) ); + ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters4( ) ); + ButtonChangeText( BTN9_BORDER, NULL, ( uint8_t* )GetRadioPayloadLength( ) ); + RadioSettingsClearError( ); + //MenuSetPage( PAGE_RADIO_PARAM ); // _GMH_ still need ? + } + else if( graphObjectTouched == BTN1_BORDER ) + { + MenuSetPage( PAGE_RADIO_PARAM_FREQ ); + } + else if( graphObjectTouched == BTN2_BORDER ) + { + if( DeviceConnected == SX1261 ) + { + Eeprom.EepromData.DemoSettings.TxPower += 1; + if( Eeprom.EepromData.DemoSettings.TxPower > SX1261_POWER_TX_MAX ) + { + Eeprom.EepromData.DemoSettings.TxPower = SX1261_POWER_TX_MIN; + } + } + else + { + Eeprom.EepromData.DemoSettings.TxPower += 1; + if( Eeprom.EepromData.DemoSettings.TxPower > SX1262_POWER_TX_MAX ) + { + Eeprom.EepromData.DemoSettings.TxPower = SX1262_POWER_TX_MIN; + } + } + ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRadioTxPower( ) ); + } + else if( graphObjectTouched == BTN3_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + if( Eeprom.EepromData.DemoSettings.ModulationParam1 < LORA_SF12 ) + { + Eeprom.EepromData.DemoSettings.ModulationParam1++; + } + else + { + Eeprom.EepromData.DemoSettings.ModulationParam1 = LORA_SF5; + } + } + else // PACKET_TYPE_GFSK + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam1 ) + { + case DEMO_BR_100: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_600; + break; + + case DEMO_BR_600: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_4800; + break; + default: + case DEMO_BR_4800: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_9600; + break; + + case DEMO_BR_9600: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_19200; + break; + + case DEMO_BR_19200: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_57600; + break; + + case DEMO_BR_57600: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_100000; + break; + + case DEMO_BR_100000: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_250000; + break; + + case DEMO_BR_250000: + Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_100; + break; + } + RadioSettingsCheckError( ); + } + ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters1( ) ); + RadioSettingsClearError( ); + } + else if( graphObjectTouched == BTN4_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam2 ) + { + case LORA_BW_007: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_010; + break; + case LORA_BW_010: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_015; + break; + case LORA_BW_015: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_020; + break; + case LORA_BW_020: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_031; + break; + case LORA_BW_031: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_041; + break; + case LORA_BW_041: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_062; + break; + + default: + case LORA_BW_062: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_125; + break; + case LORA_BW_125: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_250; + break; + case LORA_BW_250: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_500; + break; + case LORA_BW_500: + Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_007; + break; + } + } + else //Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam2 ) + { + default: + case DEMO_FDEV_5000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_10000; + break; + + case DEMO_FDEV_10000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_25000; + break; + + case DEMO_FDEV_25000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_50000; + break; + + case DEMO_FDEV_50000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_75000; + break; + + case DEMO_FDEV_75000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_100000; + break; + + case DEMO_FDEV_100000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_150000; + break; + + case DEMO_FDEV_150000: + Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_5000; + break; + } + RadioSettingsCheckError( ); + } + ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters2( ) ); + RadioSettingsClearError( ); + } + else if( graphObjectTouched == BTN5_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + if( Eeprom.EepromData.DemoSettings.ModulationParam3 < LORA_CR_4_8 ) + { + Eeprom.EepromData.DemoSettings.ModulationParam3++; + } + else + { + Eeprom.EepromData.DemoSettings.ModulationParam3 = LORA_CR_4_5; + } + } + else // PACKET_TYPE_GFSK + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam3 ) + { + case MOD_SHAPING_OFF : + Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_03; + break; + case MOD_SHAPING_G_BT_03 : + Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_05; + break; + case MOD_SHAPING_G_BT_05 : + Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_07; + break; + case MOD_SHAPING_G_BT_07 : + Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_1; + break; + case MOD_SHAPING_G_BT_1 : + Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_OFF; + break; + } + } + ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters3( ) ); + } + else if( graphObjectTouched == BTN6_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + if( Eeprom.EepromData.DemoSettings.PacketParam2 == LORA_PACKET_FIXED_LENGTH ) + { + Eeprom.EepromData.DemoSettings.PacketParam2 = LORA_PACKET_VARIABLE_LENGTH; + } + else + { + Eeprom.EepromData.DemoSettings.PacketParam2 = LORA_PACKET_FIXED_LENGTH; + } + } + else // Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam4 ) + { + case RX_BW_4800: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_5800; + break; + + case RX_BW_5800: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_7300; + break; + + case RX_BW_7300: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_9700; + break; + + case RX_BW_9700: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_11700; + break; + + case RX_BW_11700: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_14600; + break; + + case RX_BW_14600: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_19500; + break; + + case RX_BW_19500: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_23400; + break; + + case RX_BW_23400: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_29300; + break; + + case RX_BW_29300: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_39000; + break; + + case RX_BW_39000: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_58600; + break; + + case RX_BW_58600: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_93800; + break; + + case RX_BW_93800: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_117300; + break; + + case RX_BW_117300: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_156200; + break; + + case RX_BW_156200: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_187200; + break; + + case RX_BW_187200: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_234300; + break; + + case RX_BW_234300: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_312000; + break; + + case RX_BW_312000: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_373600; + break; + + case RX_BW_373600: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_467000; + break; + + case RX_BW_467000: + Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_4800; + break; + } + RadioSettingsCheckError( ); + } + ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters4( ) ); + RadioSettingsClearError( ); + } + else if( graphObjectTouched == BTN7_BORDER ) + { + uint8_t modTmp = Eeprom.EepromData.DemoSettings.ModulationType; + + EepromMcuReadBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE ); + EepromLoadGeneralSettings( ); + EepromLoadSettings( ( RadioPacketTypes_t )modTmp ); + MenuSetPage( PreviousPage ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + switch( Eeprom.EepromData.DemoSettings.ModulationType ) + { + case PACKET_TYPE_LORA: + EepromSaveSettings( RADIO_LORA_PARAMS ); + break; + + case PACKET_TYPE_GFSK: + EepromSaveSettings( RADIO_GFSK_PARAMS ); + break; + + default: + + break; + } + EepromSaveSettings( DEMO_SETTINGS ); + MenuSetPage( PreviousPage ); + } + else if( graphObjectTouched == BTN9_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + if( Eeprom.EepromData.DemoSettings.PacketParam3 < 64 ) + { + Eeprom.EepromData.DemoSettings.PacketParam3 += 1; + } + else + { + Eeprom.EepromData.DemoSettings.PacketParam3 = 1; + } + } + else // PACKET_TYPE_GFSK + { + if( Eeprom.EepromData.DemoSettings.PacketParam6 < 64 ) + { + Eeprom.EepromData.DemoSettings.PacketParam6 += 1; + } + else + { + Eeprom.EepromData.DemoSettings.PacketParam6 = 1; + } + } + ButtonChangeText( BTN9_BORDER, NULL, ( uint8_t* )GetRadioPayloadLength( ) ); + } + break; + + case PAGE_RADIO_PARAM_FREQ: + if( graphObjectTouched == BTN0_BORDER ) + { + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( graphObjectTouched == BTN3_BORDER ) + { + Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET1; + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( graphObjectTouched == BTN4_BORDER ) + { + Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET2; + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( graphObjectTouched == BTN5_BORDER ) + { + Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET3; + MenuSetPage( PAGE_RADIO_PARAM ); + } + else if( graphObjectTouched == BTN6_BORDER ) + { + switch( CurrentFreqBase ) + { + case FB1: + CurrentFreqBase = FB10; + break; + case FB10: + CurrentFreqBase = FB100; + break; + case FB100: + CurrentFreqBase = FB1K; + break; + case FB1K: + CurrentFreqBase = FB10K; + break; + case FB10K: + CurrentFreqBase = FB100K; + break; + case FB100K: + CurrentFreqBase = FB1M; + break; + case FB1M: + CurrentFreqBase = FB10M; + break; + case FB10M: + CurrentFreqBase = FB1; + break; + } + ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioFreqBase( ) ); + } + else if( graphObjectTouched == BTN7_BORDER ) + { + Eeprom.EepromData.DemoSettings.Frequency -= CurrentFreqBase; + if( Eeprom.EepromData.DemoSettings.Frequency < DEMO_CENTRAL_FREQ_MIN ) + { + Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_MIN; + } + ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRadioFrequency( ) ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + Eeprom.EepromData.DemoSettings.Frequency += CurrentFreqBase; + if( Eeprom.EepromData.DemoSettings.Frequency > DEMO_CENTRAL_FREQ_MAX ) + { + Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_MAX; + } + ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRadioFrequency( ) ); + } + break; + + case PAGE_UTILITIES: + if( graphObjectTouched == BTN0_BORDER ) + { + EepromSetDefaultSettings( Eeprom.EepromData.DemoSettings.LastDeviceConnected ); + EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType ); + NVIC_SystemReset( ); + } + else if( graphObjectTouched == BTN3_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.BoostedRx == true ) + { + Eeprom.EepromData.DemoSettings.BoostedRx = false; + } + else + { + Eeprom.EepromData.DemoSettings.BoostedRx = true; + } + ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetMenuDemoRadioBoostedRx( ) ); + } + else if( graphObjectTouched == BTN4_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.RadioPowerMode == USE_LDO ) + { + Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_DCDC; + } + else + { + Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_LDO; + } + ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetMenuDemoRadioPowerMode( ) ); + } + else if( graphObjectTouched == BTN5_BORDER ) + { + switch( Eeprom.EepromData.DemoSettings.MaxNumPacket ) + { + case 0: + Eeprom.EepromData.DemoSettings.MaxNumPacket = 100; + break; + case 100: + Eeprom.EepromData.DemoSettings.MaxNumPacket = 200; + break; + case 200: + Eeprom.EepromData.DemoSettings.MaxNumPacket = 500; + break; + case 500: + Eeprom.EepromData.DemoSettings.MaxNumPacket = 1000; + break; + case 1000: + Eeprom.EepromData.DemoSettings.MaxNumPacket = 0; + break; + } + ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetMenuDemoMaxNumPacket( ) ); + } + else if( graphObjectTouched == BTN7_BORDER ) + { + uint8_t modTmp = Eeprom.EepromData.DemoSettings.ModulationType; + + EepromMcuReadBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE ); + EepromLoadGeneralSettings( ); + EepromLoadSettings( ( RadioPacketTypes_t )modTmp ); + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + EepromSaveSettings( DEMO_SETTINGS ); + MenuSetPage( START_PAGE ); + } + else if( refresh == true ) + { + MenuSetPage( PAGE_UTILITIES ); + } + break; + + case PAGE_RADIO_TEST: + if( graphObjectTouched == BTN1_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( PAGE_SLEEP_MODE ); + } + else if( graphObjectTouched == BTN2_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( PAGE_STBY_RC_MODE ); + } + else if( graphObjectTouched == BTN3_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( PAGE_STBY_XOSC_MODE ); + } + else if( graphObjectTouched == BTN4_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( PAGE_TX_CW ); + } + else if( graphObjectTouched == BTN5_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( PAGE_CONT_MODULATION ); + } + else if( graphObjectTouched == BTN6_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( PAGE_CONT_RX ); + } + else if( graphObjectTouched == BTN7_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + MenuSetPage( START_PAGE ); + } + break; + + case PAGE_SLEEP_MODE: + if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + RunDemoSleepMode( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + MenuSetPage( PAGE_SLEEP_MODE ); + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_SLEEP_MODE; + MenuSetPage( PAGE_RADIO_PARAM ); + } + break; + + case PAGE_STBY_RC_MODE: + if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + RunDemoStandbyRcMode( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_STBY_RC_MODE; + MenuSetPage( PAGE_RADIO_PARAM ); + } + break; + + case PAGE_STBY_XOSC_MODE: + if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + RunDemoStandbyXoscMode( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_STBY_XOSC_MODE; + MenuSetPage( PAGE_RADIO_PARAM ); + } + break; + + case PAGE_TX_CW: + if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + RunDemoTxCw( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_TX_CW; + MenuSetPage( PAGE_RADIO_PARAM ); + } + break; + + case PAGE_CONT_MODULATION: + if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + RunDemoTxContinuousModulation( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + wait_ms( 200 ); // debouncing of the touch screen + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_CONT_MODULATION; + MenuSetPage( PAGE_RADIO_PARAM ); + } + break; + case PAGE_CONT_RX: + if( graphObjectTouched == BTN7_BORDER ) + { + StopDemoApplication( ); + Eeprom.EepromData.DemoSettings.HoldDemo = true; + PreviousPage = START_PAGE; // clear Previous page + MenuSetPage( START_PAGE ); + } + else if( graphObjectTouched == BTN8_BORDER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = false; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" STOP", NULL ); + RunDemoRxContinuous( ); + } + else + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + } + else if( graphObjectTouched == BTN9_BORDER ) + { + Eeprom.EepromData.DemoSettings.HoldDemo = true; + StopDemoApplication( ); + // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use + // PreviousPage to set next page. Speed up the navigation. + PreviousPage = PAGE_CONT_RX; + MenuSetPage( PAGE_RADIO_PARAM ); + } + break; + } + } + return CurrentPage; +} + +void MenuSetPage( uint8_t page ) +{ + if( page != CurrentPage ) + { + // remove all button and text (except title, page border and line) + // and disable all button (touchActive = false). + GraphObject_t clearRect = { NULL, GO_RECTANGLE, 3, 35, 282, 230, 1, \ + BACK_COLOR, BACK_COLOR, true, BACK_COLOR, \ + NULL, false }; + + GraphObjectClear( &clearRect, true ); + for( uint8_t i = 0; i < GRAPH_OBJECTS_COUNT; i++ ) + { + MenuObjects[i].TouchActive = false; + } + } + + switch( page ) + { + case START_PAGE: + if( DeviceConnected == SX1261 ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" SX1261 Demo Kit", NULL, NULL ); + } + else + { + DrawText( TITLE_TEXT, ( uint8_t* )" SX1262 Demo Kit", NULL, NULL ); + } + DisplayDriverDrawLogo( SemtechLogo, 20, 37 ); + DrawActiveButton( BTN2_BORDER, ( uint8_t* )"DEMO Ping Pong", NULL ); + DrawActiveButton( BTN3_BORDER, ( uint8_t* )"DEMO PER", NULL ); + DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Radio Test Modes", NULL ); + DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Radio Settings", NULL ); + DrawActiveButton( BTN6_BORDER, ( uint8_t* )"Utilities", NULL ); + CurrentPage = START_PAGE; + break; + + case PAGE_PING_PONG: + if( CurrentPage == PAGE_PING_PONG ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + if( Eeprom.EepromData.DemoSettings.Entity == MASTER ) + { + DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOkSlave( ), ( uint8_t* )GetMenuDemoRxOk( ) ); + DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKoSlave( ), ( uint8_t* )GetMenuDemoRxKo( ) ); + DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave, Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave + Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave ), \ + ( uint8_t* )GetMenuDemoResultPerCent2( Eeprom.EepromData.DemoSettings.CntPacketRxOK, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ) ); + DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave, Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave + Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave ), \ + ( uint8_t* )GetMenuDemoResultPerCent2( Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ) ); + DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )" ", ( uint8_t* )GetMenuDemoRssi( ) ); + DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )" ", ( uint8_t* )GetMenuDemoSnr( ) ); + } + else + { + DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOk( ), NULL ); + DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKo( ), NULL ); + DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxOK, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ), NULL ); + DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ), NULL ); + DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL ); + DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoSnr( ), NULL ); + } + } + else + { + DrawText( TITLE_TEXT, ( uint8_t* )" PING PONG Demo", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_PING_PONG ); + DrawText( LINE3_COL0_TEXT, ( uint8_t* )GetTotalPackets( ), ( uint8_t* )" SLAVE", NULL ); + DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", ( uint8_t* )" 0", NULL ); + DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", ( uint8_t* )" 0", NULL ); + DrawText( LINE6_COL0_TEXT, ( uint8_t* )"Rx PSR", ( uint8_t* )" 0.00", NULL ); + DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Rx PER", ( uint8_t* )" 0.00", NULL ); + + if( Eeprom.EepromData.DemoSettings.Entity == MASTER ) + { + DrawActiveButton( BTN0_BORDER, ( uint8_t* )" MASTER", NULL ); + DrawText( LINE3_COL0_TEXT, NULL, NULL, ( uint8_t* )"MASTER" ); + DrawText( LINE4_COL0_TEXT, NULL, NULL, ( uint8_t* )" 0" ); + DrawText( LINE5_COL0_TEXT, NULL, NULL, ( uint8_t* )" 0" ); + DrawText( LINE6_COL0_TEXT, NULL, NULL, ( uint8_t* )" 0.00" ); + DrawText( LINE7_COL0_TEXT, NULL, NULL, ( uint8_t* )" 0.00" ); + DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )" ", ( uint8_t* )" 0" ); + DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )" ", ( uint8_t* )" 0" ); + } + else + { + DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )" 0", ( uint8_t* )" "); + DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )" 0", ( uint8_t* )" " ); + DrawActiveButton( BTN0_BORDER, ( uint8_t* )" SLAVE", NULL ); + } + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + } + CurrentPage = PAGE_PING_PONG; + break; + case PAGE_PER: + if( CurrentPage == PAGE_PER ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + if( Eeprom.EepromData.DemoSettings.Entity == MASTER ) + { + DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL ); + } + else + { + DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOk( ), NULL ); + DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKo( ), NULL ); + DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ), NULL ); + DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoFreqError( ), NULL ); + DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL ); + DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoSnr( ), NULL ); + } + } + else + { + DrawText( TITLE_TEXT, ( uint8_t* )" PER Demo", NULL, NULL ); + DrawText( LINE3_COL0_TEXT, ( uint8_t* )"Test Total", ( uint8_t* )GetMenuDemoMaxNumPacket( ), NULL ); + DisplayCurrentRadioParams( PAGE_PER ); + + if( Eeprom.EepromData.DemoSettings.Entity == MASTER ) + { + DrawActiveButton( BTN0_BORDER, ( uint8_t* )" MASTER", NULL ); + DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Transmitted", ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL ); + } + else + { + DrawActiveButton( BTN0_BORDER, ( uint8_t* )" SLAVE", NULL ); + DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", ( uint8_t* )" 0", NULL ); + DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", ( uint8_t* )" 0", NULL ); + DrawText( LINE6_COL0_TEXT, ( uint8_t* )"PER", ( uint8_t* )" 0.00", NULL ); + DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Freq Err", ( uint8_t* )" 0", NULL ); + DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )" 0", NULL ); + DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )" 0", NULL ); + } + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + } + CurrentPage = PAGE_PER; + break; + + case PAGE_RADIO_PARAM: + if( ErrorParam == true ) + { + MenuObjects[BTN3_VALUE_TEXT].FrontColor = OBJECT_ERROR; + MenuObjects[BTN4_VALUE_TEXT].FrontColor = OBJECT_ERROR; + MenuObjects[BTN6_VALUE_TEXT].FrontColor = OBJECT_ERROR; + } + if( CurrentPage != PAGE_RADIO_PARAM ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Radio Settings", NULL, NULL ); + DrawActiveButton( BTN0_BORDER, ( uint8_t* )"Mod:", ( uint8_t* )GetMenuRadioFrameType( ) ); + DrawActiveButton( BTN1_BORDER, ( uint8_t* )"Freq:", ( uint8_t* )GetRadioFrequency( ) ); + DrawActiveButton( BTN2_BORDER, ( uint8_t* )"Tx Pow:", ( uint8_t* )GetRadioTxPower( ) ); + DrawActiveButton( BTN3_BORDER, ( uint8_t* )"Param 1:", ( uint8_t* )GetRadioModulationParameters1( ) ); + DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Param 2:", ( uint8_t* )GetRadioModulationParameters2( ) ); + DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Param 3:", ( uint8_t* )GetRadioModulationParameters3( ) ); + DrawActiveButton( BTN6_BORDER, ( uint8_t* )"Param 4:", ( uint8_t* )GetRadioModulationParameters4( ) ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" CANCEL", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" OK & SAVE", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )"PL:", ( uint8_t* )GetRadioPayloadLength( ) ); + } + MenuObjects[BTN3_VALUE_TEXT].FrontColor = TEXT_VALUE; + MenuObjects[BTN4_VALUE_TEXT].FrontColor = TEXT_VALUE; + MenuObjects[BTN6_VALUE_TEXT].FrontColor = TEXT_VALUE; + CurrentPage = PAGE_RADIO_PARAM; + break; + + case PAGE_RADIO_PARAM_FREQ: + if( CurrentPage != PAGE_RADIO_PARAM_FREQ ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Radio Settings : Freq", NULL, NULL ); + DrawActiveButton( BTN0_BORDER, ( uint8_t* )" OK", NULL ); + DrawActiveButton( BTN2_BORDER, ( uint8_t* )"Freq:", ( uint8_t* )GetRadioFrequency( ) ); + DrawActiveButton( BTN3_BORDER, ( uint8_t* )"Preset1:", ( uint8_t* )GetRadioFreqBasePS1( ) ); + DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Preset2:", ( uint8_t* )GetRadioFreqBasePS2( ) ); + DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Preset3:", ( uint8_t* )GetRadioFreqBasePS3( ) ); + DrawActiveButton( BTN6_BORDER, ( uint8_t* )"Step:", ( uint8_t* )GetRadioFreqBase( ) ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" -", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" +", NULL ); + } + CurrentPage = PAGE_RADIO_PARAM_FREQ; + break; + + case PAGE_UTILITIES: + if( CurrentPage != PAGE_UTILITIES ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Utilities", NULL, NULL ); + // FIRMWARE_VERSION is defined in DemoApplication.h + DrawText( LINE0_TEXT, ( uint8_t* )FIRMWARE_VERSION, NULL, NULL ); + + DrawActiveButton( BTN0_BORDER, ( uint8_t* )"Fact. Reset", NULL ); + DrawActiveButton( BTN3_BORDER, ( uint8_t* )"RxBoost:", ( uint8_t* )GetMenuDemoRadioBoostedRx( ) ); + DrawActiveButton( BTN4_BORDER, ( uint8_t* )"DC Reg: ", ( uint8_t* )GetMenuDemoRadioPowerMode( ) ); + DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Packets:", ( uint8_t* )GetMenuDemoMaxNumPacket( ) ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" CANCEL", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" OK & SAVE", NULL ); + } + CurrentPage = PAGE_UTILITIES; + break; + + case PAGE_RADIO_TEST: + DrawText( TITLE_TEXT, ( uint8_t* )" Radio Test Modes", NULL, NULL ); + DrawActiveButton( BTN1_BORDER, ( uint8_t* )" Sleep Mode", NULL ); + DrawActiveButton( BTN2_BORDER, ( uint8_t* )" Standby RC Mode", NULL ); + DrawActiveButton( BTN3_BORDER, ( uint8_t* )" Standby XOSC Mode", NULL ); + DrawActiveButton( BTN4_BORDER, ( uint8_t* )" Set Tx CW", NULL ); + DrawActiveButton( BTN5_BORDER, ( uint8_t* )" Set Cont. Modulation", NULL ); + DrawActiveButton( BTN6_BORDER, ( uint8_t* )" Set Cont. Rx", NULL ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" BACK", NULL ); + CurrentPage = PAGE_RADIO_TEST; + break; + + case PAGE_SLEEP_MODE: + if( CurrentPage != PAGE_UTILITIES ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Sleep Mode", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_SLEEP_MODE ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + CurrentPage = PAGE_SLEEP_MODE; + } + break; + + case PAGE_STBY_RC_MODE: + if( CurrentPage != PAGE_STBY_RC_MODE ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Standby RC Mode", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_STBY_RC_MODE ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + CurrentPage = PAGE_STBY_RC_MODE; + } + break; + + case PAGE_STBY_XOSC_MODE: + if( CurrentPage != PAGE_STBY_XOSC_MODE ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Standby XOSC Mode", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_STBY_XOSC_MODE ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + CurrentPage = PAGE_STBY_XOSC_MODE; + } + break; + + case PAGE_TX_CW: + if( CurrentPage != PAGE_TX_CW ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Set Tx CW", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_TX_CW ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + CurrentPage = PAGE_TX_CW; + } + break; + + case PAGE_CONT_MODULATION: + if( CurrentPage != PAGE_CONT_MODULATION ) + { + DrawText( TITLE_TEXT, ( uint8_t* )" Set Cont. Modulation", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_CONT_MODULATION ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + CurrentPage = PAGE_CONT_MODULATION; + } + break; + + case PAGE_CONT_RX: + if( CurrentPage == PAGE_CONT_RX ) + { + if( Eeprom.EepromData.DemoSettings.HoldDemo == true ) + { + ButtonChangeText( BTN8_BORDER, ( uint8_t* )" START", NULL ); + } + DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOk( ), NULL ); + DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKo( ), NULL ); + DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxKO, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO ), NULL ); + DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoFreqError( ), NULL ); + DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL ); + DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoSnr( ), NULL ); + } + else + { + DrawText( TITLE_TEXT, ( uint8_t* )" Set Cont. Rx ", NULL, NULL ); + DisplayCurrentRadioParams( PAGE_CONT_RX ); + DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", ( uint8_t* )" 0", NULL ); + DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", ( uint8_t* )" 0", NULL ); + DrawText( LINE6_COL0_TEXT, ( uint8_t* )"PER", ( uint8_t* )" 0.00", NULL ); + DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Freq Err", ( uint8_t* )" 0", NULL ); + DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )" 0", NULL ); + DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )" 0", NULL ); + DrawActiveButton( BTN7_BORDER, ( uint8_t* )" EXIT", NULL ); + DrawActiveButton( BTN8_BORDER, ( uint8_t* )" START", NULL ); + DrawActiveButton( BTN9_BORDER, ( uint8_t* )" SETTINGS", NULL ); + } + CurrentPage = PAGE_CONT_RX; + break; + + default: + break; + } +} + +void DisplayCurrentRadioParams( uint8_t page ) +{ + switch( page ) + { + case PAGE_SLEEP_MODE: + case PAGE_STBY_RC_MODE: + case PAGE_STBY_XOSC_MODE: + case PAGE_TX_CW: + // Do display different without packet settings (no modulation here) + // 2 + (9) + 4 + (7) = 22 (=<28 : ok) + sprintf( StringText ,"f:%s, P:%s", GetRadioFrequencyMHz( ), GetRadioTxPower( ) ); // StringText3 + StringText2 + DrawText( LINE0_TEXT, ( uint8_t* )StringText, NULL, NULL); + sprintf( StringText ,"Radio Power Mode: %s", ( uint8_t* )GetMenuDemoRadioPowerMode( ) + 2 ); + DrawText( LINE1_TEXT, ( uint8_t* )StringText, NULL, NULL); + sprintf( StringText ,"Press START to launch test" ); + DrawText( LINE3_TEXT, ( uint8_t* )StringText, NULL, NULL); + break; + + case PAGE_CONT_MODULATION: + // 2 + (9) + 4 + (7) + 2 + (4) = 28 (=<28 : ok) + sprintf( StringText ,"f:%s, P:%s, %s", GetRadioFrequencyMHz( ), GetRadioTxPower( ), \ + ( uint8_t* )GetMenuDemoRadioPowerMode( ) + 2 ); // StringText3 + StringText2 + DrawText( LINE0_TEXT, ( uint8_t* )StringText, NULL, NULL); + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + // (5) + 2 + (4) + 2 + (12) = 25 (=<28 : ok) + sprintf( StringText ,"%s: %s, %s", GetMenuRadioFrameType( ) + 1, \ + GetRadioModulationParameters1( ), + GetRadioModulationParameters4( ) ); // StringText2 + } + else + { + if( ErrorParam == true ) + { + MenuObjects[LINE1_TEXT].FrontColor = OBJECT_ERROR; + MenuObjects[LINE2_TEXT].FrontColor = OBJECT_ERROR; + } + // (4) + 2 + (10) + 1 + (11) = 28 (=<28 : ok) + sprintf( StringText ,"%s: %s/%s", GetMenuRadioFrameType( ) + 1, \ + GetRadioModulationParameters1( ), \ + GetRadioModulationParameters4( ) ); // StringText2 + } + DrawText( LINE1_TEXT, ( uint8_t* )StringText, NULL, NULL); + // (10) + 2 + (10) = 22 (=<28 : ok) + sprintf( StringText ,"%s, %s", GetRadioModulationParameters2( ), \ + GetRadioModulationParameters3( ) ); + DrawText( LINE2_TEXT, ( uint8_t* )StringText, NULL, NULL); + sprintf( StringText ,"Press START to launch test" ); + DrawText( LINE4_TEXT, ( uint8_t* )StringText, NULL, NULL); + MenuObjects[LINE1_TEXT].FrontColor = TEXT_COLOR; + MenuObjects[LINE2_TEXT].FrontColor = TEXT_COLOR; + break; + + case PAGE_CONT_RX: // standart display + case PAGE_PING_PONG: + case PAGE_PER: + // 2 + (9) + 4 + (7) = 22 (=<28 : ok) + sprintf( StringText ,"f:%s, P:%s", GetRadioFrequencyMHz( ), GetRadioTxPower( ) ); // StringText3 + StringText2 + DrawText( LINE0_TEXT, ( uint8_t* )StringText, NULL, NULL); + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + // (5) + 2 + (4) + 2 + (12) = 25 (=<28 : ok) + sprintf( StringText ,"%s: %s, %s", GetMenuRadioFrameType( ) + 1, \ + GetRadioModulationParameters1( ), + GetRadioModulationParameters4( ) ); // StringText2 + } + else + { + if( ErrorParam == true ) + { + MenuObjects[LINE1_TEXT].FrontColor = OBJECT_ERROR; + MenuObjects[LINE2_TEXT].FrontColor = OBJECT_ERROR; + } + // (4) + 2 + (10) + 1 + (11) = 28 (=<28 : ok) + sprintf( StringText ,"%s: %s/%s", GetMenuRadioFrameType( ) + 1, \ + GetRadioModulationParameters1( ), \ + GetRadioModulationParameters4( ) ); // StringText2 + } + DrawText( LINE1_TEXT, ( uint8_t* )StringText, NULL, NULL); + // 3 + (3) + 1 + (10) + 1 + (10) = 28 (=<28 : ok) + sprintf( StringText ,"PL:%s/%s/%s", GetRadioPayloadLength( ), \ + GetRadioModulationParameters2( ), \ + GetRadioModulationParameters3( ) ); // StringText + StringText2 + StringText3 + DrawText( LINE2_TEXT, ( uint8_t* )StringText, NULL, NULL); + MenuObjects[LINE1_TEXT].FrontColor = TEXT_COLOR; + MenuObjects[LINE2_TEXT].FrontColor = TEXT_COLOR; + break; + } +} + +char* GetMenuRadioFrameType( void ) +{ + switch( Eeprom.EepromData.DemoSettings.ModulationType ) + { + case PACKET_TYPE_GFSK: return ( char* )" GFSK"; + case PACKET_TYPE_LORA: + default: return ( char* )" LORA"; + } +} + +char* GetRadioModulationParameters1( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam1 ) + { + case LORA_SF5: return ( char* )"SF5"; + case LORA_SF6: return ( char* )"SF6"; + case LORA_SF7: return ( char* )"SF7"; + case LORA_SF8: return ( char* )"SF8"; + case LORA_SF9: return ( char* )"SF9"; + case LORA_SF10: return ( char* )"SF10"; + case LORA_SF11: return ( char* )"SF11"; + case LORA_SF12: return ( char* )"SF12"; + default: return ( char* )"X"; + } + } + else // PACKET_TYPE_GFSK + { + // quicker than using a float (which is not optimized in MBED) + sprintf( StringText2, "%3d.%1d kbps", \ + Eeprom.EepromData.DemoSettings.ModulationParam1 / 1000, \ + ( Eeprom.EepromData.DemoSettings.ModulationParam1 % 1000) / 100 ); + return StringText2; + } +} + +char* GetRadioModulationParameters2( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam2 ) + { + case LORA_BW_500: return ( char* )"BW 500 kHz"; + case LORA_BW_250: return ( char* )"BW 250 kHz"; + case LORA_BW_125: return ( char* )"BW 125 kHz"; + case LORA_BW_062: return ( char* )"BW 62 kHz"; + case LORA_BW_041: return ( char* )"BW 41 kHz"; + case LORA_BW_031: return ( char* )"BW 31 kHz"; + case LORA_BW_020: return ( char* )"BW 20 kHz"; + case LORA_BW_015: return ( char* )"BW 15 kHz"; + case LORA_BW_010: return ( char* )"BW 10 kHz"; + case LORA_BW_007: return ( char* )"BW 7 kHz"; + default: return ( char* )"X"; + } + } + else // Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK + { + // quicker than using a float (which is not optimized in MBED) + sprintf( StringText3, "Fd %3d kHz", \ + Eeprom.EepromData.DemoSettings.ModulationParam2 / 1000 ); + return StringText3; + } +} + +char* GetRadioModulationParameters3( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam3 ) + { + case LORA_CR_4_5: return ( char* )"CR 4/5"; + case LORA_CR_4_6: return ( char* )"CR 4/6"; + case LORA_CR_4_7: return ( char* )"CR 4/7"; + case LORA_CR_4_8: return ( char* )"CR 4/8"; + default: return ( char* )"X"; + } + } + else // PACKET_TYPE_GFSK + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam3 ) + { + case MOD_SHAPING_OFF: return ( char* )"NONE "; + case MOD_SHAPING_G_BT_03: return ( char* )"G BT .3"; + case MOD_SHAPING_G_BT_05: return ( char* )"G BT .5"; + case MOD_SHAPING_G_BT_07: return ( char* )"G BT .7"; + case MOD_SHAPING_G_BT_1: return ( char* )"G BT 1 "; + default: return ( char* )"X"; + } + } +} + +char* GetRadioModulationParameters4( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + if( Eeprom.EepromData.DemoSettings.PacketParam2 == LORA_PACKET_FIXED_LENGTH ) + { + return ( char* )"Fixed length"; + } + else // RADIO_PACKET_VARIABLE_LENGTH + { + return ( char* )"Variable len"; + } + } + else // Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam4 ) + { + case RX_BW_4800 : return ( char* )"BW 4.8 kHz"; + case RX_BW_5800 : return ( char* )"BW 5.8 kHz"; + case RX_BW_7300 : return ( char* )"BW 7.3 kHz"; + case RX_BW_9700 : return ( char* )"BW 9.7 kHz"; + case RX_BW_11700 : return ( char* )"BW 11.7 kHz"; + case RX_BW_14600 : return ( char* )"BW 14.6 kHz"; + case RX_BW_19500 : return ( char* )"BW 19.5 kHz"; + case RX_BW_23400 : return ( char* )"BW 23.4 kHz"; + case RX_BW_29300 : return ( char* )"BW 29.3 kHz"; + case RX_BW_39000 : return ( char* )"BW 39 kHz"; + case RX_BW_46900 : return ( char* )"BW 46.9 kHz"; + case RX_BW_58600 : return ( char* )"BW 58.6 kHz"; + case RX_BW_78200 : return ( char* )"BW 78.2 kHz"; + case RX_BW_93800 : return ( char* )"BW 93.8 kHz"; + case RX_BW_117300 : return ( char* )"BW 117 kHz"; + case RX_BW_156200 : return ( char* )"BW 156 kHz"; + case RX_BW_187200 : return ( char* )"BW 187 kHz"; + case RX_BW_234300 : return ( char* )"BW 234 kHz"; + case RX_BW_312000 : return ( char* )"BW 312 kHz"; + case RX_BW_373600 : return ( char* )"BW 373 kHz"; + case RX_BW_467000 : return ( char* )"BW 467 kHz"; + default: return ( char* )"X"; + } + } +} + +char* GetRadioFrequency( void ) +{ + sprintf( StringText2, "%lu Hz", \ + ( unsigned long )Eeprom.EepromData.DemoSettings.Frequency ); + return StringText2; +} + +char* GetRadioFrequencyMHz( void ) +{ + // quicker than using a float (which is not optimized in MBED) + sprintf( StringText3, "%3d.%1d MHz", \ + Eeprom.EepromData.DemoSettings.Frequency / 1000000, \ + ( Eeprom.EepromData.DemoSettings.Frequency % 1000000 ) / 100000 ); + return StringText3; +} + +char* GetRadioFreqBase( void ) +{ + switch( CurrentFreqBase ) + { + case FB1: return ( char* )"1 Hz"; + case FB10: return ( char* )"10 Hz"; + case FB100: return ( char* )"100 Hz"; + case FB1K: return ( char* )"1 kHz"; + case FB10K: return ( char* )"10 kHz"; + case FB100K: return ( char* )"100 kHz"; + case FB1M: return ( char* )"1 MHz"; + case FB10M: return ( char* )"10 MHz"; + default: return ( char* )"X"; + } +} + +char* GetRadioFreqBasePS1( void ) +{ + sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET1 ); + return StringText; +} + +char* GetRadioFreqBasePS2( void ) +{ + sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET2 ); + return StringText; +} + +char* GetRadioFreqBasePS3( void ) +{ + sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET3 ); + return StringText; +} + +char* GetRadioTxPower( void ) +{ + sprintf( StringText2, "%d dBm", Eeprom.EepromData.DemoSettings.TxPower ); + return StringText2; +} + +char* GetRadioPayloadLength( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + sprintf( StringText2, "%d", Eeprom.EepromData.DemoSettings.PacketParam3 ); + } + else // PACKET_TYPE_GFSK + { + sprintf( StringText2, "%d", Eeprom.EepromData.DemoSettings.PacketParam6 ); + } + return StringText2; +} + +char* GetMenuDemoMaxNumPacket( void ) +{ + if( Eeprom.EepromData.DemoSettings.MaxNumPacket == 0 ) + { + return ( char* )"Infinite"; + } + else + { + sprintf( StringText, "%6d", \ + Eeprom.EepromData.DemoSettings.MaxNumPacket ); + } + return StringText; +} + +char* GetMenuDemoNumSentPacket( void ) +{ + sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.CntPacketTx ); + return StringText2; +} + +char* GetMenuDemoFreqError( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA ) + { + sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.FreqErrorEst ); + } + else + { + sprintf( StringText2, "N/A" ); + } + return StringText2; +} + +char* GetMenuDemoRxOk( void ) +{ + sprintf( StringText2, "%6lu", \ + ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxOK ) ); + return StringText2; +} + +char* GetMenuDemoRxKo( void ) +{ + sprintf( StringText2, "%6lu", \ + ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \ + Eeprom.EepromData.DemoSettings.RxTimeOutCount ) ); + return StringText2; +} + +char* GetMenuDemoRxOkSlave( void ) +{ + sprintf( StringText3, "%6lu", \ + ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave ) ); + return StringText3; +} + +char* GetMenuDemoResultPerCent1( uint32_t value, uint32_t reference ) +{ + // quicker than using a float (which is not optimized in MBED) + sprintf( StringText2, "%3d.%02d", \ + ( ( value * 10000 ) / reference ) / 100, \ + ( ( value * 10000 ) / reference ) % 100 ); + return StringText2; +} + +char* GetMenuDemoResultPerCent2( uint32_t value, uint32_t reference ) +{ + // quicker than using a float (which is not optimized in MBED) + sprintf( StringText3, "%3d.%02d", \ + ( ( value * 10000 ) / reference ) / 100, \ + ( ( value * 10000 ) / reference ) % 100 ); + return StringText3; +} + +char* GetMenuDemoRxKoSlave( void ) +{ + sprintf( StringText3, "%6lu", \ + ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave ) ); + return StringText3; +} + +char* GetMenuDemoRssi( void ) +{ + sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.RssiValue ); + return StringText2; +} + +char* GetMenuDemoSnr( void ) +{ + if( Eeprom.EepromData.DemoSettings.SnrValue >= 0 ) + { + sprintf( StringText2, " /" ); + } + else + { + sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.SnrValue ); + } + return StringText2; +} + +char* GetTotalPackets( void ) +{ + if( Eeprom.EepromData.DemoSettings.MaxNumPacket == 0 ) + { + return ( char* )"Total: Inf."; + } + else + { + sprintf( StringText, "Total: %5lu", \ + ( unsigned long )( Eeprom.EepromData.DemoSettings.MaxNumPacket ) ); + return StringText; + } +} + +char* GetMenuDemoRadioPowerMode( void ) +{ + if( Eeprom.EepromData.DemoSettings.RadioPowerMode == USE_LDO ) + { + return ( char* )" LDO"; + } + else + { + return ( char* )" DCDC"; + } +} + +char* GetMenuDemoRadioBoostedRx( void ) +{ + if( Eeprom.EepromData.DemoSettings.BoostedRx == 0x01 ) + { + return ( char* )" True"; + } + else + { + return ( char* )" False"; + } +} + + +void CheckScreen( void ) +{ + CheckScreenFlag = true; +} + +void DebouncedScreen (void ) +{ + ScreenBeenDebounced = false; + DebouncedScreenTouch.detach( ); +} + +void RadioSettingsCheckError( void ) +{ + if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK ) + { + switch( Eeprom.EepromData.DemoSettings.ModulationParam4 ) + { + case RX_BW_4800: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 4800; + break; + + case RX_BW_5800: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 5800; + break; + + case RX_BW_7300: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 7300; + break; + + case RX_BW_9700: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 9700; + break; + + case RX_BW_11700: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 11700; + break; + + case RX_BW_14600: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 14600; + break; + + case RX_BW_19500: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 19500; + break; + + case RX_BW_23400: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 23400; + break; + + case RX_BW_29300: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 29300; + break; + + case RX_BW_39000: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 39000; + break; + + case RX_BW_46900: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 46900; + break; + + case RX_BW_58600: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 58600; + break; + + case RX_BW_78200: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 78200; + break; + + case RX_BW_93800: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 93800; + break; + + case RX_BW_117300: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 117300; + break; + + case RX_BW_156200: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 156200; + break; + + case RX_BW_187200: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 187200; + break; + + case RX_BW_234300: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 234300; + break; + + case RX_BW_312000: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 312000; + break; + + case RX_BW_373600: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 373600; + break; + + case RX_BW_467000: + ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1 ) >= 467000; + break; + + default: + ErrorParam = true; + break; + } + if( ErrorParam == true ) + { + MenuObjects[BTN3_VALUE_TEXT].FrontColor = OBJECT_ERROR; + MenuObjects[BTN4_VALUE_TEXT].FrontColor = OBJECT_ERROR; + MenuObjects[BTN6_VALUE_TEXT].FrontColor = OBJECT_ERROR; + } + else + { + RadioSettingsClearError( ); + } + ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters1( ) ); + ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters2( ) ); + ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters4( ) ); + } +} + +void RadioSettingsClearError( void ) +{ + MenuObjects[BTN3_VALUE_TEXT].FrontColor = TEXT_VALUE; + MenuObjects[BTN4_VALUE_TEXT].FrontColor = TEXT_VALUE; + MenuObjects[BTN6_VALUE_TEXT].FrontColor = TEXT_VALUE; +} + +/*! + * \brief Draw button + * + * \param [in] buttonId Id of the button to draw + * \param [in] *text1 Text to draw as label + * \param [in] *text2 Text to draw as value + */ +void DrawActiveButton( uint8_t buttonId, uint8_t* text1, uint8_t* text2 ) +{ + GraphObjectDraw( &( MenuObjects[buttonId] ), NULL, NULL, true ); + if( text2 == NULL ) + { + if( text1 != NULL ) + { + GraphObjectDraw( &( MenuObjects[buttonId + 1] ), text1, NULL, false ); + } + } + else + { + if( text1 != NULL ) + { + GraphObjectDraw( &( MenuObjects[buttonId + 2] ), text1, NULL, false ); + } + GraphObjectDraw( &( MenuObjects[buttonId + 3] ), text2, NULL, false ); + } +} + +void ButtonChangeText( uint8_t buttonId, uint8_t* text1, uint8_t* text2 ) +{ + if( text2 == NULL ) + { + if( text1 != NULL ) + { + GraphObjectDraw( &( MenuObjects[buttonId + 1] ), text1, NULL, false ); + } + } + else + { + if( text1 != NULL ) + { + GraphObjectDraw( &( MenuObjects[buttonId + 2] ), text1, NULL, false ); + } + GraphObjectDraw( &( MenuObjects[buttonId + 3] ), text2, NULL, false ); + } +} + +void DrawText( uint8_t lineId, uint8_t* text0, uint8_t* text1, uint8_t* text2 ) +{ + if( text0 != NULL ) + { + GraphObjectDraw( &( MenuObjects[lineId] ), text0, NULL, false ); + } + if( text1 != NULL ) + { + GraphObjectDraw( &( MenuObjects[lineId + 1] ), text1, NULL, false ); + } + if( text2 != NULL ) + { + GraphObjectDraw( &( MenuObjects[lineId + 2] ), text2, NULL, false ); + } +} +