Source code for the SX126xDVK1xAS Dev Kit. This example code has only been tested on the Nucleo L476RG

Dependencies:   mbed DmTftLibrary SX126xLib

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Menu.cpp Source File

Menu.cpp

00001 /*
00002   ______                              _
00003  / _____)             _              | |
00004 ( (____  _____ ____ _| |_ _____  ____| |__
00005  \____ \| ___ |    (_   _) ___ |/ ___)  _ \
00006  _____) ) ____| | | || |_| ____( (___| | | |
00007 (______/|_____)_|_|_| \__)_____)\____)_| |_|
00008     (C)2016 Semtech
00009 
00010 Description: Display demo menus and manage touch sensor.
00011 
00012 Maintainer: Gregory Cristian & Gilbert Menth
00013 */
00014 
00015 #include "mbed.h"
00016 #include "Menu.h"
00017 #include "DisplayDriver.h"
00018 #include "Eeprom.h"
00019 #include "DemoApplication.h"
00020 
00021 
00022 /*!
00023  * \brief Maximum character count on the same line with function DrawText
00024  * This include needed space for the outline (at the begin and the end of line).
00025  * MAX_CHAR_PER_BTN is the same, but for a button.
00026 */
00027 #define MAX_CHAR_PER_LINE       28
00028 
00029 
00030 /*!
00031  * \brief Bitmap of Semtech Logo stored here (copied from a C file).
00032 */
00033 extern uint8_t SemtechLogo[];
00034 
00035 /*!
00036  * \brief Local copy of the Device which is fitted on the HW board
00037 */
00038 uint8_t DeviceConnected = 0;
00039 
00040 /*!
00041  * \brief Local copy of the Matching Frequency fitted on the HW
00042 */
00043 uint8_t MatchingFreq = 0;
00044 
00045 /*!
00046  * \brief This ticker give the rythme to check X and Y coordinates of activated
00047  * touched region (if pressed). CheckScreenFlag keep the status if Touchscreen
00048  * has been checked or not, until checked.
00049 */
00050 Ticker CheckScreenTouch;
00051 volatile bool CheckScreenFlag = false;
00052 
00053 /*!
00054  * \brief This ticker give the rythme to avoid quick menu change
00055  */
00056 Ticker DebouncedScreenTouch;
00057 volatile bool ScreenBeenDebounced = false;
00058 
00059 /*!
00060  * \brief List og graphical object in the application.
00061 */
00062 enum MenuObjectsId
00063 {
00064     PAGE_BORDER     = 0,
00065     TITLE_LINE,
00066     TITLE_TEXT,
00067     FIRM_LOGO,
00068     BTN0_BORDER,       // to accord with DrawActiveButton( ), each button should
00069     BTN0_MENU_TEXT,    // have consecutively MENU_TEXT (full large text),
00070     BTN0_LABEL_TEXT,   // LABEL_TEXT (left side of the button) and VALUE_TEXT
00071     BTN0_VALUE_TEXT,   // (right side of the button).
00072     BTN0b_BORDER,
00073     BTN0b_MENU_TEXT,
00074     BTN0b_LABEL_TEXT,
00075     BTN0b_VALUE_TEXT,
00076     BTN1_BORDER,
00077     BTN1_MENU_TEXT,
00078     BTN1_LABEL_TEXT,
00079     BTN1_VALUE_TEXT,
00080     BTN2_BORDER,
00081     BTN2_MENU_TEXT,
00082     BTN2_LABEL_TEXT,
00083     BTN2_VALUE_TEXT,
00084     BTN3_BORDER,
00085     BTN3_MENU_TEXT,
00086     BTN3_LABEL_TEXT,
00087     BTN3_VALUE_TEXT,
00088     BTN4_BORDER,
00089     BTN4_MENU_TEXT,
00090     BTN4_LABEL_TEXT,
00091     BTN4_VALUE_TEXT,
00092     BTN5_BORDER,
00093     BTN5_MENU_TEXT,
00094     BTN5_LABEL_TEXT,
00095     BTN5_VALUE_TEXT,
00096     BTN6_BORDER,
00097     BTN6_MENU_TEXT,
00098     BTN6_LABEL_TEXT,
00099     BTN6_VALUE_TEXT,
00100     BTN7_BORDER,
00101     BTN7_MENU_TEXT,
00102     BTN8_BORDER,
00103     BTN8_MENU_TEXT,
00104     BTN9_BORDER,
00105     BTN9_MENU_TEXT,
00106     BTN9_LABEL_TEXT,
00107     BTN9_VALUE_TEXT,
00108     LINE0_TEXT,
00109     LINE1_TEXT,
00110     LINE2_TEXT,
00111     LINE3_TEXT,
00112     LINE3_COL0_TEXT,
00113     LINE3_COL1_TEXT,
00114     LINE3_COL2_TEXT,
00115     LINE4_TEXT,         // to accord with DrawText( ), each text line should
00116     LINE4_COL0_TEXT,    // have consecutively TEXT (full large text),
00117     LINE4_COL1_TEXT,    // COL0_TEXT (left side of the line), COL1_TEXT (center
00118     LINE4_COL2_TEXT,    // region of the line) and COL2_TEXT (right side of the
00119     LINE5_COL0_TEXT,    // line). COL0..2 are optionals if doesn't exist.
00120     LINE5_COL1_TEXT,
00121     LINE5_COL2_TEXT,
00122     LINE6_COL0_TEXT,
00123     LINE6_COL1_TEXT,
00124     LINE6_COL2_TEXT,
00125     LINE7_COL0_TEXT,
00126     LINE7_COL1_TEXT,
00127     LINE7_COL2_TEXT,
00128     LINE8_COL0_TEXT,
00129     LINE8_COL1_TEXT,
00130     LINE8_COL2_TEXT,
00131     LINE9_COL0_TEXT,
00132     LINE9_COL1_TEXT,
00133     LINE9_COL2_TEXT,
00134 };
00135 #define GRAPH_OBJECTS_COUNT     70
00136 GraphObject_t MenuObjects[GRAPH_OBJECTS_COUNT] =
00137 {
00138     // { Id,           Type,      Xpos, Ypos, Height, Width, LineW, BackColor, FrontColor, DoFill, FillCol, Source, TouchActive }
00139     { PAGE_BORDER,     GO_RECTANGLE, 0,   0,   320,    240,   1, BACK_COLOR, PAGE_COLOR,    false, NULL, NULL,        false },
00140     { TITLE_LINE,      GO_LINE,      0,   30,  1,      240,   1, BACK_COLOR, PAGE_COLOR,    false, NULL, NULL,        false },
00141     { TITLE_TEXT,      GO_TEXT,      15,  9,   NULL,   208,   1, BACK_COLOR, WHITE,         false, NULL, NULL,        false },
00142     { FIRM_LOGO,       GO_IMAGE,     20,  37,  95,     215,   1, BACK_COLOR, WHITE,         false, NULL, SemtechLogo, false },
00143     { BTN0_BORDER,     GO_RECTANGLE, 10,  40,  30,     106,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00144     { BTN0_MENU_TEXT,  GO_TEXT,      15,  48,  NULL,   96,    1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00145     { BTN0_LABEL_TEXT, GO_TEXT,      15,  48,  NULL,   32,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00146     { BTN0_VALUE_TEXT, GO_TEXT,      47,  48,  NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00147     { BTN0b_BORDER,    GO_RECTANGLE, 10,  40,  30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00148     { BTN0b_MENU_TEXT, GO_TEXT,      15,  48,  NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00149     { BTN0b_LABEL_TEXT,GO_TEXT,      15,  48,  NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00150     { BTN0b_VALUE_TEXT,GO_TEXT,      79,  48,  NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00151     { BTN1_BORDER,     GO_RECTANGLE, 10,  75,  30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00152     { BTN1_MENU_TEXT,  GO_TEXT,      15,  83,  NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00153     { BTN1_LABEL_TEXT, GO_TEXT,      15,  83,  NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00154     { BTN1_VALUE_TEXT, GO_TEXT,      79,  83,  NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00155     { BTN2_BORDER,     GO_RECTANGLE, 10,  110, 30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00156     { BTN2_MENU_TEXT,  GO_TEXT,      15,  118, NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00157     { BTN2_LABEL_TEXT, GO_TEXT,      15,  118, NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00158     { BTN2_VALUE_TEXT, GO_TEXT,      79,  118, NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00159     { BTN3_BORDER,     GO_RECTANGLE, 10,  145, 30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00160     { BTN3_MENU_TEXT,  GO_TEXT,      15,  153, NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00161     { BTN3_LABEL_TEXT, GO_TEXT,      15,  153, NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00162     { BTN3_VALUE_TEXT, GO_TEXT,      79,  153, NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00163     { BTN4_BORDER,     GO_RECTANGLE, 10,  180, 30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00164     { BTN4_MENU_TEXT,  GO_TEXT,      15,  188, NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00165     { BTN4_LABEL_TEXT, GO_TEXT,      15,  188, NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00166     { BTN4_VALUE_TEXT, GO_TEXT,      79,  188, NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00167     { BTN5_BORDER,     GO_RECTANGLE, 10,  215, 30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00168     { BTN5_MENU_TEXT,  GO_TEXT,      15,  223, NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00169     { BTN5_LABEL_TEXT, GO_TEXT,      15,  223, NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00170     { BTN5_VALUE_TEXT, GO_TEXT,      79,  223, NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00171     { BTN6_BORDER,     GO_RECTANGLE, 10,  250, 30,     222,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00172     { BTN6_MENU_TEXT,  GO_TEXT,      15,  258, NULL,   200,   1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00173     { BTN6_LABEL_TEXT, GO_TEXT,      15,  258, NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00174     { BTN6_VALUE_TEXT, GO_TEXT,      79,  258, NULL,   152,   1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00175     { BTN7_BORDER,     GO_RECTANGLE, 10,  285, 30,     106,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00176     { BTN7_MENU_TEXT,  GO_TEXT,      15,  293, NULL,   96,    1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00177     { BTN8_BORDER,     GO_RECTANGLE, 125, 285, 30,     107,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00178     { BTN8_MENU_TEXT,  GO_TEXT,      130, 293, NULL,   96,    1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00179     { BTN9_BORDER,     GO_RECTANGLE, 125, 40,  30,     107,   1, BACK_COLOR, BUTTON_BORDER, false, NULL, NULL,        false },
00180     { BTN9_MENU_TEXT,  GO_TEXT,      130, 48,  NULL,   96,    1, BACK_COLOR, MENU_TEXT,     false, NULL, NULL,        false },
00181     { BTN9_LABEL_TEXT, GO_TEXT,      130, 48,  NULL,   32,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00182     { BTN9_VALUE_TEXT, GO_TEXT,      162, 48,  NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00183     { LINE0_TEXT,      GO_TEXT,      5,   80,  NULL,   232,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00184     { LINE1_TEXT,      GO_TEXT,      5,   100, NULL,   232,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00185     { LINE2_TEXT,      GO_TEXT,      5,   120, NULL,   232,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00186     { LINE3_TEXT,      GO_TEXT,      5,   140, NULL,   232,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00187     { LINE3_COL0_TEXT, GO_TEXT,      5,   140, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00188     { LINE3_COL1_TEXT, GO_TEXT,      110, 140, NULL,   56,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00189     { LINE3_COL2_TEXT, GO_TEXT,      170, 140, NULL,   64,    1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00190     { LINE4_TEXT,      GO_TEXT,      5,   160, NULL,   232,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00191     { LINE4_COL0_TEXT, GO_TEXT,      5,   160, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00192     { LINE4_COL1_TEXT, GO_TEXT,      110, 160, NULL,   56,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00193     { LINE4_COL2_TEXT, GO_TEXT,      170, 160, NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00194     { LINE5_COL0_TEXT, GO_TEXT,      5,   180, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00195     { LINE5_COL1_TEXT, GO_TEXT,      110, 180, NULL,   56,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00196     { LINE5_COL2_TEXT, GO_TEXT,      170, 180, NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00197     { LINE6_COL0_TEXT, GO_TEXT,      5,   200, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00198     { LINE6_COL1_TEXT, GO_TEXT,      110, 200, NULL,   56,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00199     { LINE6_COL2_TEXT, GO_TEXT,      170, 200, NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00200     { LINE7_COL0_TEXT, GO_TEXT,      5,   220, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00201     { LINE7_COL1_TEXT, GO_TEXT,      110, 220, NULL,   56,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00202     { LINE7_COL2_TEXT, GO_TEXT,      170, 220, NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00203     { LINE8_COL0_TEXT, GO_TEXT,      5,   240, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00204     { LINE8_COL1_TEXT, GO_TEXT,      110, 240, NULL,   56,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00205     { LINE8_COL2_TEXT, GO_TEXT,      170, 240, NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00206     { LINE9_COL0_TEXT, GO_TEXT,      5,   260, NULL,   104,   1, BACK_COLOR, TEXT_COLOR,    false, NULL, NULL,        false },
00207     { LINE9_COL1_TEXT, GO_TEXT,      110, 260, NULL,   56,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false },
00208     { LINE9_COL2_TEXT, GO_TEXT,      170, 260, NULL,   64,    1, BACK_COLOR, TEXT_VALUE,    false, NULL, NULL,        false }
00209 };
00210 
00211 /*!
00212  * \brief DrawText( ) need char* to display a text. It can display until
00213  * 3 different texts on the same line. To avoid recursive use of the same
00214  * ressource, 3 temporary string are declared.
00215  */
00216 char StringText[MAX_CHAR_PER_LINE + 1];  // don't forget the /0 (end of string)
00217 char StringText2[MAX_CHAR_PER_LINE + 1];
00218 char StringText3[MAX_CHAR_PER_LINE + 1];
00219 
00220 /*!
00221  * \brief CurrentPage store current displayed page (cf.: list of availlable
00222  * pages in Menu.h). PeviousPage is used only when navigate through "Radio
00223  * Config" to be able to restore the page before "Radio Congig", witch can be
00224  * PingPong, PER or START_PAGE. The goal is to speed menu navigation.
00225 */
00226 static uint8_t CurrentPage  = START_PAGE;
00227 static uint8_t PreviousPage = START_PAGE;
00228 
00229 /*!
00230  * \brief In "Radio Config Freq", we can update the central frequency. To avoid 
00231  * keyboard, we use (+) et (-) keys. CurrentFreqBase is the offset to be applied
00232  * when we increase or decrease the frequency.
00233 */
00234 static FreqBase CurrentFreqBase = FB100K;
00235 
00236 /*!
00237  * \brief If radio params does't respect bandwidth > fdev + bitrate/2, the radio
00238  * couldn't make a proper modulation. Parameters will be printed in red.
00239 */
00240 static bool ErrorParam = false;
00241 
00242 
00243 void CheckScreen( void );
00244 void DebouncedScreen( void );
00245 void DrawActiveButton( uint8_t buttonId, uint8_t* text1, uint8_t* text2 );
00246 void ButtonChangeText( uint8_t buttonId, uint8_t* text1, uint8_t* text2 );
00247 void DrawText( uint8_t lineId, uint8_t* text0, uint8_t* text1, uint8_t* text2 );
00248 void RadioSettingsCheckError( void );
00249 void RadioSettingsClearError( void );
00250 
00251 
00252 void MenuInit( uint8_t deviceConnected, uint8_t matchingFreq )
00253 {
00254     DeviceConnected = deviceConnected;
00255     MatchingFreq = matchingFreq;
00256     DisplayDriverInit( );
00257     GraphObjectDraw( &( MenuObjects[PAGE_BORDER] ), NULL, false, false);
00258     GraphObjectDraw( &( MenuObjects[TITLE_LINE] ), NULL, false, false);
00259     MenuSetPage( START_PAGE );
00260     CheckScreenTouch.attach_us( &CheckScreen, 100000 );     // every 100 ms
00261 }
00262 
00263 uint8_t MenuHandler( bool refresh )
00264 {
00265     uint8_t graphObjectTouched = 0xFF;
00266 
00267     if( CheckScreenFlag == true )
00268     {
00269         if( ScreenBeenDebounced == false )
00270         {
00271             ScreenBeenDebounced = true;
00272             CheckScreenFlag = false;
00273             DebouncedScreenTouch.attach_us( &DebouncedScreen, 150000 ); // every 150 ms
00274             GraphObjectTouched( MenuObjects, GRAPH_OBJECTS_COUNT, &graphObjectTouched );
00275         }
00276     }
00277 
00278     if( ( refresh == true ) && ( graphObjectTouched == 0xFF ) )
00279     {
00280         MenuSetPage( CurrentPage );
00281     }
00282     else if( ( graphObjectTouched != 0xFF ) || ( refresh == true ) )
00283     {
00284         switch( CurrentPage )
00285         {
00286             case START_PAGE:
00287                 if( graphObjectTouched == BTN2_BORDER )
00288                 {
00289                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00290                     EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType );
00291                     MenuSetPage( PAGE_PING_PONG );
00292                 }
00293                 else if( graphObjectTouched == BTN3_BORDER )
00294                 {
00295                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00296                     EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType );
00297                     MenuSetPage( PAGE_PER );
00298                 }
00299                 else if( graphObjectTouched == BTN4_BORDER )
00300                 {
00301                     EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType );
00302                     MenuSetPage( PAGE_RADIO_TEST );
00303                 }    
00304                 else if( graphObjectTouched == BTN5_BORDER )
00305                 {
00306                     MenuSetPage( PAGE_RADIO_PARAM );
00307                 }
00308                 else if( graphObjectTouched == BTN6_BORDER )
00309                 {
00310                     MenuSetPage( PAGE_UTILITIES );
00311                 }
00312                 break;
00313 
00314             case PAGE_PING_PONG:
00315                 if( graphObjectTouched == BTN0_BORDER )
00316                 {
00317                     ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
00318                     if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
00319                     {
00320                         Eeprom.EepromData.DemoSettings.Entity = SLAVE;
00321                         ButtonChangeText( BTN0_BORDER, ( uint8_t* )"   SLAVE", NULL );
00322                         DrawText( LINE3_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00323                         DrawText( LINE4_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00324                         DrawText( LINE5_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00325                         DrawText( LINE6_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00326                         DrawText( LINE7_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00327                         DrawText( LINE8_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00328                         DrawText( LINE9_COL0_TEXT, NULL, NULL, ( uint8_t* )" " );
00329                     }
00330                     else
00331                     {
00332                         Eeprom.EepromData.DemoSettings.Entity = MASTER;
00333                         ButtonChangeText( BTN0_BORDER, ( uint8_t* )"   MASTER", NULL );
00334                         DrawText( LINE3_COL0_TEXT, NULL, NULL, ( uint8_t* )"MASTER" );
00335                     }
00336                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00337                     EepromSaveSettings( DEMO_SETTINGS );
00338                     MenuSetPage( PAGE_PING_PONG );
00339                 }
00340                 else if( graphObjectTouched == BTN7_BORDER )
00341                 {
00342                     StopDemoApplication( );
00343                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00344                     PreviousPage = START_PAGE; // clear Previous page
00345                     MenuSetPage( START_PAGE );
00346                 }
00347                 else if( graphObjectTouched == BTN8_BORDER )
00348                 {
00349                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
00350                     {
00351                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
00352                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
00353                         Eeprom.EepromData.DemoSettings.CntPacketTx          = 0;
00354                         Eeprom.EepromData.DemoSettings.CntPacketRxOK        = 0;
00355                         Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave   = 0;
00356                         Eeprom.EepromData.DemoSettings.CntPacketRxKO        = 0;
00357                         Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave   = 0;
00358                         Eeprom.EepromData.DemoSettings.RxTimeOutCount       = 0;
00359                         StopDemoApplication( );
00360                         RunDemoApplicationPingPong( );
00361                     }
00362                     else
00363                     {
00364                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
00365                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
00366                         StopDemoApplication( );
00367                         wait_ms( 200 ); // debouncing of the touch screen
00368                     }
00369                 }
00370                 else if( graphObjectTouched == BTN9_BORDER )
00371                 {
00372                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00373                     StopDemoApplication( );
00374                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
00375                     // PreviousPage to set next page. Speed up the navigation.
00376                     PreviousPage = PAGE_PING_PONG;
00377                     MenuSetPage( PAGE_RADIO_PARAM );
00378                 }
00379                 else if( refresh == true )
00380                 {
00381                     MenuSetPage( PAGE_PING_PONG );
00382                 }
00383                 break;
00384 
00385             case PAGE_PER:
00386                 if( graphObjectTouched == BTN0_BORDER )
00387                 {
00388                     ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
00389                     if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
00390                     {
00391                         Eeprom.EepromData.DemoSettings.Entity = SLAVE;
00392                         ButtonChangeText( BTN0_BORDER, ( uint8_t* )"   SLAVE", NULL );
00393                         DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", NULL, NULL );
00394                         DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", NULL, NULL );
00395                         DrawText( LINE6_COL0_TEXT, ( uint8_t* )"PER",   NULL, NULL );
00396                         DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Freq Err", NULL, NULL );
00397                         DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", NULL, NULL );
00398                         DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", NULL, NULL );
00399                     }
00400                     else
00401                     {
00402                         Eeprom.EepromData.DemoSettings.Entity = MASTER;
00403                         ButtonChangeText( BTN0_BORDER, ( uint8_t* )"   MASTER", NULL );
00404                         DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Transmitted", ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL );
00405                         DrawText( LINE5_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL );
00406                         DrawText( LINE6_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL );
00407                         DrawText( LINE7_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL );
00408                         DrawText( LINE8_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL );
00409                         DrawText( LINE9_COL0_TEXT, ( uint8_t* )" ", ( uint8_t* )" ", NULL );
00410                     }
00411 
00412                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00413                     EepromSaveSettings( DEMO_SETTINGS );
00414                     MenuSetPage( PAGE_PER );
00415                 }
00416                 else if( graphObjectTouched == BTN7_BORDER )
00417                 {
00418                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00419                     PreviousPage = START_PAGE; // clear Previous page
00420                     MenuSetPage( START_PAGE );
00421                 }
00422                 else if( graphObjectTouched == BTN8_BORDER )
00423                 {
00424                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
00425                     {
00426                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
00427                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
00428                         StopDemoApplication( );
00429                         Eeprom.EepromData.DemoSettings.CntPacketTx          = 0;
00430                         Eeprom.EepromData.DemoSettings.CntPacketRxOK        = 0;
00431                         Eeprom.EepromData.DemoSettings.CntPacketRxKO        = 0;
00432                         Eeprom.EepromData.DemoSettings.RxTimeOutCount       = 0;
00433                         RunDemoApplicationPer( );
00434                     }
00435                     else
00436                     {
00437                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
00438                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
00439                         StopDemoApplication( );
00440                         wait_ms( 200 ); // debouncing of the touch screen
00441                     }
00442                 }
00443                 else if( graphObjectTouched == BTN9_BORDER )
00444                 {
00445                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00446                     StopDemoApplication( );
00447                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
00448                     // PreviousPage to set next page. Speed up the navigation.
00449                     PreviousPage = PAGE_PER;
00450                     MenuSetPage( PAGE_RADIO_PARAM );
00451                 }
00452                 else if( refresh == true )
00453                 {
00454                     MenuSetPage( PAGE_PER );
00455                 }
00456                 break;
00457 
00458             case PAGE_RADIO_PARAM:
00459                 if( graphObjectTouched == BTN0_BORDER )
00460                 {
00461                     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
00462                     {
00463                         Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_GFSK;
00464                     }
00465                     else// if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK )
00466                     {
00467                         Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA;
00468                     }
00469                     EepromLoadSettings( ( RadioPacketTypes_t )Eeprom.EepromData.DemoSettings.ModulationType );
00470                     RadioSettingsCheckError( );
00471                     ButtonChangeText( BTN0_BORDER, NULL, ( uint8_t* )GetMenuRadioFrameType( ) );
00472                     ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters1( ) );
00473                     ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters2( ) );
00474                     ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters3( ) );
00475                     ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters4( ) );
00476                     ButtonChangeText( BTN9_BORDER, NULL, ( uint8_t* )GetRadioPayloadLength( ) );
00477                     RadioSettingsClearError( );
00478                     //MenuSetPage( PAGE_RADIO_PARAM ); // _GMH_ still need ?
00479                 }
00480                 else if( graphObjectTouched == BTN1_BORDER )
00481                 {
00482                     MenuSetPage( PAGE_RADIO_PARAM_FREQ );
00483                 }
00484                 else if( graphObjectTouched == BTN2_BORDER )
00485                 {
00486                     if( DeviceConnected == SX1261 )
00487                     {
00488                         Eeprom.EepromData.DemoSettings.TxPower += 1;
00489                         if( Eeprom.EepromData.DemoSettings.TxPower > SX1261_POWER_TX_MAX )
00490                         {
00491                             Eeprom.EepromData.DemoSettings.TxPower = SX1261_POWER_TX_MIN;
00492                         }
00493                     }
00494                     else
00495                     {
00496                         Eeprom.EepromData.DemoSettings.TxPower += 1;
00497                         if( Eeprom.EepromData.DemoSettings.TxPower > SX1262_POWER_TX_MAX )
00498                         {
00499                             Eeprom.EepromData.DemoSettings.TxPower = SX1262_POWER_TX_MIN;
00500                         }
00501                     }
00502                     ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRadioTxPower( ) );
00503                 }
00504                 else if( graphObjectTouched == BTN3_BORDER )
00505                 {
00506                     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
00507                     {
00508                         if( Eeprom.EepromData.DemoSettings.ModulationParam1 < LORA_SF12 )
00509                         {
00510                             Eeprom.EepromData.DemoSettings.ModulationParam1++;
00511                         }
00512                         else
00513                         {
00514                             Eeprom.EepromData.DemoSettings.ModulationParam1 = LORA_SF5;
00515                         }
00516                     }
00517                     else // PACKET_TYPE_GFSK
00518                     {
00519                         switch( Eeprom.EepromData.DemoSettings.ModulationParam1 )
00520                         {
00521                             case DEMO_BR_100:
00522                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_600;
00523                                 break;
00524 
00525                             case DEMO_BR_600:
00526                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_4800;
00527                                 break;
00528                             default:
00529                             case DEMO_BR_4800:
00530                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_9600;
00531                                 break;
00532 
00533                             case DEMO_BR_9600:
00534                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_19200;
00535                                 break;
00536 
00537                             case DEMO_BR_19200:
00538                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_57600;
00539                                 break;
00540 
00541                             case DEMO_BR_57600:
00542                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_100000;
00543                                 break;
00544 
00545                             case DEMO_BR_100000:
00546                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_250000;
00547                                 break;
00548 
00549                             case DEMO_BR_250000:
00550                                 Eeprom.EepromData.DemoSettings.ModulationParam1 = DEMO_BR_100;
00551                                 break;
00552                         }
00553                         RadioSettingsCheckError( );
00554                     }
00555                     ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters1( ) );
00556                     RadioSettingsClearError( );
00557                 }
00558                 else if( graphObjectTouched == BTN4_BORDER )
00559                 {
00560                     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
00561                     {
00562                         switch( Eeprom.EepromData.DemoSettings.ModulationParam2 )
00563                         {
00564                             case LORA_BW_007:
00565                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_010;
00566                                 break;
00567                             case LORA_BW_010:
00568                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_015;
00569                                 break;
00570                             case LORA_BW_015:
00571                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_020;
00572                                 break;
00573                             case LORA_BW_020:
00574                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_031;
00575                                 break;
00576                             case LORA_BW_031:
00577                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_041;
00578                                 break;
00579                             case LORA_BW_041:
00580                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_062;
00581                                 break;
00582                             
00583                             default:
00584                             case LORA_BW_062:
00585                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_125;
00586                                 break;
00587                             case LORA_BW_125:
00588                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_250;
00589                                 break;
00590                             case LORA_BW_250:
00591                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_500;
00592                                 break;
00593                             case LORA_BW_500:
00594                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = LORA_BW_007;
00595                                 break;
00596                         }
00597                     }
00598                     else //Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK
00599                     {
00600                         switch( Eeprom.EepromData.DemoSettings.ModulationParam2 )
00601                         {
00602                             default:
00603                             case DEMO_FDEV_5000:
00604                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_10000;
00605                                 break;
00606                             
00607                             case DEMO_FDEV_10000:
00608                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_25000;
00609                                 break;
00610 
00611                             case DEMO_FDEV_25000:
00612                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_50000;
00613                                 break;
00614 
00615                             case DEMO_FDEV_50000:
00616                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_75000;
00617                                 break;
00618 
00619                             case DEMO_FDEV_75000:
00620                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_100000;
00621                                 break;
00622 
00623                             case DEMO_FDEV_100000:
00624                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_150000;
00625                                 break;
00626 
00627                             case DEMO_FDEV_150000:
00628                                 Eeprom.EepromData.DemoSettings.ModulationParam2 = DEMO_FDEV_5000;
00629                                 break;
00630                         }
00631                         RadioSettingsCheckError( );
00632                     }
00633                     ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters2( ) );
00634                     RadioSettingsClearError( );
00635                 }    
00636                 else if( graphObjectTouched == BTN5_BORDER )
00637                 {
00638                     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
00639                     {
00640                         if( Eeprom.EepromData.DemoSettings.ModulationParam3 < LORA_CR_4_8 )
00641                         {
00642                             Eeprom.EepromData.DemoSettings.ModulationParam3++;
00643                         }
00644                         else
00645                         {
00646                             Eeprom.EepromData.DemoSettings.ModulationParam3 = LORA_CR_4_5;
00647                         }
00648                     }
00649                     else // PACKET_TYPE_GFSK
00650                     {
00651                         switch( Eeprom.EepromData.DemoSettings.ModulationParam3 )
00652                         {
00653                             case MOD_SHAPING_OFF :
00654                                 Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_03;
00655                                 break;
00656                             case MOD_SHAPING_G_BT_03 :
00657                                 Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_05;
00658                                 break;
00659                             case MOD_SHAPING_G_BT_05 :
00660                                 Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_07;
00661                                 break;
00662                             case MOD_SHAPING_G_BT_07 :
00663                                 Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_G_BT_1;
00664                                 break;
00665                             case MOD_SHAPING_G_BT_1 :
00666                                 Eeprom.EepromData.DemoSettings.ModulationParam3 = MOD_SHAPING_OFF;
00667                                 break;
00668                         }
00669                     }
00670                     ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters3( ) );
00671                 }
00672                 else if( graphObjectTouched == BTN6_BORDER )
00673                 {
00674                     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
00675                     {
00676                         if( Eeprom.EepromData.DemoSettings.PacketParam2 == LORA_PACKET_FIXED_LENGTH )
00677                         {
00678                             Eeprom.EepromData.DemoSettings.PacketParam2 = LORA_PACKET_VARIABLE_LENGTH;
00679                         }
00680                         else
00681                         {
00682                             Eeprom.EepromData.DemoSettings.PacketParam2 = LORA_PACKET_FIXED_LENGTH;
00683                         }
00684                     }
00685                     else // Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK
00686                     {
00687                         switch( Eeprom.EepromData.DemoSettings.ModulationParam4 )
00688                         {
00689                             case RX_BW_4800:
00690                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_5800;
00691                                 break;
00692 
00693                             case RX_BW_5800:
00694                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_7300;
00695                                 break;
00696 
00697                             case RX_BW_7300:
00698                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_9700;
00699                                 break;
00700 
00701                             case RX_BW_9700:
00702                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_11700;
00703                                 break;
00704 
00705                             case RX_BW_11700:
00706                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_14600;
00707                                 break;
00708 
00709                             case RX_BW_14600:
00710                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_19500;
00711                                 break;
00712 
00713                             case RX_BW_19500:
00714                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_23400;
00715                                 break;
00716 
00717                             case RX_BW_23400:
00718                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_29300;
00719                                 break;
00720 
00721                             case RX_BW_29300:
00722                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_39000;
00723                                 break;
00724 
00725                             case RX_BW_39000:
00726                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_58600;
00727                                 break;
00728 
00729                             case RX_BW_58600:
00730                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_93800;
00731                                 break;
00732 
00733                             case RX_BW_93800:
00734                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_117300;
00735                                 break;
00736 
00737                             case RX_BW_117300:
00738                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_156200;
00739                                 break;
00740 
00741                             case RX_BW_156200:
00742                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_187200;
00743                                 break;
00744 
00745                             case RX_BW_187200:
00746                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_234300;
00747                                 break;
00748 
00749                             case RX_BW_234300:
00750                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_312000;
00751                                 break;
00752 
00753                             case RX_BW_312000:
00754                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_373600;
00755                                 break;
00756 
00757                             case RX_BW_373600:
00758                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_467000;
00759                                 break;
00760 
00761                             case RX_BW_467000:
00762                                 Eeprom.EepromData.DemoSettings.ModulationParam4 = RX_BW_4800;
00763                                 break;
00764                         }
00765                         RadioSettingsCheckError( );
00766                     }
00767                     ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters4( ) );
00768                     RadioSettingsClearError( );
00769                 }
00770                 else if( graphObjectTouched == BTN7_BORDER )
00771                 {
00772                     uint8_t modTmp = Eeprom.EepromData.DemoSettings.ModulationType;
00773 
00774                     EepromMcuReadBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE );
00775                     EepromLoadGeneralSettings( );
00776                     EepromLoadSettings( ( RadioPacketTypes_t )modTmp );
00777                     MenuSetPage( PreviousPage );
00778                 }
00779                 else if( graphObjectTouched == BTN8_BORDER )
00780                 {
00781                     switch( Eeprom.EepromData.DemoSettings.ModulationType )
00782                     {
00783                         case PACKET_TYPE_LORA:
00784                             EepromSaveSettings( RADIO_LORA_PARAMS );
00785                             break;
00786 
00787                         case PACKET_TYPE_GFSK:
00788                             EepromSaveSettings( RADIO_GFSK_PARAMS );
00789                             break;
00790 
00791                         default:
00792 
00793                             break;
00794                     }
00795                     EepromSaveSettings( DEMO_SETTINGS );
00796                     MenuSetPage( PreviousPage );
00797                 }
00798                 else if( graphObjectTouched == BTN9_BORDER )
00799                 {
00800                     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
00801                     {
00802                         if( Eeprom.EepromData.DemoSettings.PacketParam3 < 255 )
00803                         {
00804                             Eeprom.EepromData.DemoSettings.PacketParam3 += 1;
00805                         }
00806                         else
00807                         {
00808                             Eeprom.EepromData.DemoSettings.PacketParam3 = 1;
00809                         }
00810                     }
00811                     else // PACKET_TYPE_GFSK
00812                     {
00813                         if( Eeprom.EepromData.DemoSettings.PacketParam6 < 255 )
00814                         {
00815                             Eeprom.EepromData.DemoSettings.PacketParam6 += 1;
00816                         }
00817                         else
00818                         {
00819                             Eeprom.EepromData.DemoSettings.PacketParam6 = 1;
00820                         }
00821                     }
00822                     ButtonChangeText( BTN9_BORDER, NULL, ( uint8_t* )GetRadioPayloadLength( ) );
00823                 }
00824                 break;
00825 
00826             case PAGE_RADIO_PARAM_FREQ:
00827                 if( graphObjectTouched == BTN0_BORDER )
00828                 {
00829                     MenuSetPage( PAGE_RADIO_PARAM );
00830                 }
00831                 else if( graphObjectTouched == BTN3_BORDER )
00832                 {
00833                     if( DeviceConnected == SX1268 )
00834                     {
00835                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET4;
00836                     }
00837                     else
00838                     {
00839                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET6;
00840                     }
00841                     MenuSetPage( PAGE_RADIO_PARAM );
00842                 }
00843                 else if( graphObjectTouched == BTN4_BORDER )
00844                 {
00845                     if( DeviceConnected == SX1268 )
00846                     {
00847                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET3;
00848                     }
00849                     else
00850                     {
00851                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET7;
00852                     }
00853                     MenuSetPage( PAGE_RADIO_PARAM );
00854                 }
00855                 else if( graphObjectTouched == BTN5_BORDER )
00856                 {
00857                     if( DeviceConnected == SX1268 )
00858                     {
00859                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET9;
00860                     }
00861                     else
00862                     {
00863                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_PRESET8;
00864                     }
00865                     MenuSetPage( PAGE_RADIO_PARAM );
00866                 }
00867                 else if( graphObjectTouched == BTN6_BORDER )
00868                 {
00869                     switch( CurrentFreqBase )
00870                     {
00871                         case FB1:
00872                             CurrentFreqBase = FB10;
00873                             break;
00874                         case FB10:
00875                             CurrentFreqBase = FB100;
00876                             break;
00877                         case FB100:
00878                             CurrentFreqBase = FB1K;
00879                             break;
00880                         case FB1K:
00881                             CurrentFreqBase = FB10K;
00882                             break;
00883                         case FB10K:
00884                             CurrentFreqBase = FB100K;
00885                             break;
00886                         case FB100K:
00887                             CurrentFreqBase = FB1M;
00888                             break;
00889                         case FB1M:
00890                             CurrentFreqBase = FB10M;
00891                             break;
00892                         case FB10M:
00893                             CurrentFreqBase = FB1;
00894                             break;
00895                     }
00896                     ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioFreqBase( ) );
00897                 }
00898                 else if( graphObjectTouched == BTN7_BORDER )
00899                 {
00900                     Eeprom.EepromData.DemoSettings.Frequency -= CurrentFreqBase;
00901                     if( Eeprom.EepromData.DemoSettings.Frequency < DEMO_CENTRAL_FREQ_MIN )
00902                     {
00903                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_MIN;
00904                     }
00905                     ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRadioFrequency( ) );
00906                 }
00907                 else if( graphObjectTouched == BTN8_BORDER )
00908                 {
00909                     Eeprom.EepromData.DemoSettings.Frequency += CurrentFreqBase;
00910                     if( Eeprom.EepromData.DemoSettings.Frequency > DEMO_CENTRAL_FREQ_MAX )
00911                     {
00912                         Eeprom.EepromData.DemoSettings.Frequency = DEMO_CENTRAL_FREQ_MAX;
00913                     }
00914                     ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRadioFrequency( ) );
00915                 }
00916                 break;
00917 
00918             case PAGE_UTILITIES:
00919                 if( graphObjectTouched == BTN0_BORDER )
00920                 {
00921                     EepromEraseCheckSum( );
00922                     NVIC_SystemReset( );
00923                 }
00924                 else if( graphObjectTouched == BTN3_BORDER )
00925                 {
00926                     if( Eeprom.EepromData.DemoSettings.BoostedRx == true )
00927                     {
00928                         Eeprom.EepromData.DemoSettings.BoostedRx = false;
00929                     }
00930                     else
00931                     {
00932                         Eeprom.EepromData.DemoSettings.BoostedRx = true;
00933                     }
00934                     ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetMenuDemoRadioBoostedRx( ) );
00935                 }
00936                 else if( graphObjectTouched == BTN4_BORDER )
00937                 {
00938                     if( Eeprom.EepromData.DemoSettings.RadioPowerMode == USE_LDO )
00939                     {
00940                         Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_DCDC;
00941                     }
00942                     else
00943                     {
00944                         Eeprom.EepromData.DemoSettings.RadioPowerMode = USE_LDO;
00945                     }
00946                     ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetMenuDemoRadioPowerMode( ) );
00947                 }
00948                 else if( graphObjectTouched == BTN5_BORDER )
00949                 {
00950                     switch( Eeprom.EepromData.DemoSettings.MaxNumPacket )
00951                     {
00952                         case 0:
00953                             Eeprom.EepromData.DemoSettings.MaxNumPacket = 100;
00954                             break;
00955                         case 100:
00956                             Eeprom.EepromData.DemoSettings.MaxNumPacket = 200;
00957                             break;
00958                         case 200:
00959                             Eeprom.EepromData.DemoSettings.MaxNumPacket = 500;
00960                             break;
00961                         case 500:
00962                             Eeprom.EepromData.DemoSettings.MaxNumPacket = 1000;
00963                             break;
00964                         case 1000:
00965                             Eeprom.EepromData.DemoSettings.MaxNumPacket = 0;
00966                             break;
00967                     }
00968                     ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetMenuDemoMaxNumPacket( ) );
00969                 }
00970                 else if( graphObjectTouched == BTN7_BORDER )
00971                 {
00972                     uint8_t modTmp = Eeprom.EepromData.DemoSettings.ModulationType;
00973                     
00974                     EepromMcuReadBuffer( 0, Eeprom.Buffer, EEPROM_BUFFER_SIZE );
00975                     EepromLoadGeneralSettings( );
00976                     EepromLoadSettings( ( RadioPacketTypes_t )modTmp );
00977                     MenuSetPage( START_PAGE );
00978                 }
00979                 else if( graphObjectTouched == BTN8_BORDER )
00980                 {
00981                     EepromSaveSettings( DEMO_SETTINGS );
00982                     MenuSetPage( START_PAGE );
00983                 }
00984                 else if( refresh == true )
00985                 {
00986                     MenuSetPage( PAGE_UTILITIES );
00987                 }
00988                 break;
00989 
00990             case PAGE_RADIO_TEST:
00991                 if( graphObjectTouched == BTN0b_BORDER )
00992                 {
00993                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00994                     MenuSetPage( PAGE_SLEEP_MODE );
00995                 }
00996                 else if( graphObjectTouched == BTN1_BORDER )
00997                 {
00998                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
00999                     MenuSetPage( PAGE_STBY_RC_MODE );
01000                 }
01001                 else if( graphObjectTouched == BTN2_BORDER )
01002                 {
01003                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01004                     MenuSetPage( PAGE_STBY_XOSC_MODE );
01005                 }
01006                 else if( graphObjectTouched == BTN3_BORDER )
01007                 {
01008                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01009                     MenuSetPage( PAGE_TX_CW );
01010                 }
01011                 else if( graphObjectTouched == BTN4_BORDER )
01012                 {
01013                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01014                     MenuSetPage( PAGE_CONT_MODULATION );
01015                 }
01016                 else if( graphObjectTouched == BTN5_BORDER )
01017                 {
01018                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01019                     MenuSetPage( PAGE_CONT_RX );
01020                 }
01021                 else if( graphObjectTouched == BTN6_BORDER )
01022                 {
01023                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01024                     MenuSetPage( PAGE_RSSI_TEST );
01025                 }
01026                 else if( graphObjectTouched == BTN7_BORDER )
01027                 {
01028                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01029                     MenuSetPage( START_PAGE );
01030                 }
01031                 break;
01032 
01033             case PAGE_RSSI_TEST:
01034                 if( graphObjectTouched == BTN7_BORDER )
01035                 {
01036                     StopDemoApplication( );
01037                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01038                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01039                     MenuSetPage( PAGE_RADIO_TEST );
01040                 }
01041                 else if( graphObjectTouched == BTN8_BORDER )
01042                 {
01043                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01044                     {
01045                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01046                         StopDemoApplication( );
01047                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01048                         RunDemoTestRssi( );
01049                     }
01050                     else
01051                     {
01052                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01053                         StopDemoApplication( );
01054                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01055                     }
01056                 }
01057                 else if( graphObjectTouched == BTN9_BORDER )
01058                 {
01059                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01060                     StopDemoApplication( );
01061                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01062                     // PreviousPage to set next page. Speed up the navigation.
01063                     PreviousPage = PAGE_RSSI_TEST;
01064                     MenuSetPage( PAGE_RADIO_PARAM );
01065                 }
01066                 break;
01067 
01068             case PAGE_SLEEP_MODE:
01069                 if( graphObjectTouched == BTN7_BORDER )
01070                 {
01071                     StopDemoApplication( );
01072                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01073                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01074                     MenuSetPage( PAGE_RADIO_TEST );
01075                 }
01076                 else if( graphObjectTouched == BTN8_BORDER )
01077                 {
01078                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01079                     {
01080                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01081                         StopDemoApplication( );
01082                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01083                         RunDemoSleepMode( );
01084                     }
01085                     else
01086                     {
01087                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01088                         StopDemoApplication( );
01089                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01090                         MenuSetPage( PAGE_SLEEP_MODE );
01091                     }
01092                 }
01093                 else if( graphObjectTouched == BTN9_BORDER )
01094                 {
01095                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01096                     StopDemoApplication( );
01097                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01098                     // PreviousPage to set next page. Speed up the navigation.
01099                     PreviousPage = PAGE_SLEEP_MODE;
01100                     MenuSetPage( PAGE_RADIO_PARAM );
01101                 }
01102                 break;
01103 
01104             case PAGE_STBY_RC_MODE:
01105                 if( graphObjectTouched == BTN7_BORDER )
01106                 {
01107                     StopDemoApplication( );
01108                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01109                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01110                     MenuSetPage( PAGE_RADIO_TEST );
01111                 }
01112                 else if( graphObjectTouched == BTN8_BORDER )
01113                 {
01114                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01115                     {
01116                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01117                         StopDemoApplication( );
01118                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01119                         RunDemoStandbyRcMode( );
01120                     }
01121                     else
01122                     {
01123                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01124                         StopDemoApplication( );
01125                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01126                     }
01127                 }
01128                 else if( graphObjectTouched == BTN9_BORDER )
01129                 {
01130                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01131                     StopDemoApplication( );
01132                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01133                     // PreviousPage to set next page. Speed up the navigation.
01134                     PreviousPage = PAGE_STBY_RC_MODE;
01135                     MenuSetPage( PAGE_RADIO_PARAM );
01136                 }
01137                 break;
01138 
01139             case PAGE_STBY_XOSC_MODE:
01140                 if( graphObjectTouched == BTN7_BORDER )
01141                 {
01142                     StopDemoApplication( );
01143                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01144                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01145                     MenuSetPage( PAGE_RADIO_TEST );
01146                 }
01147                 else if( graphObjectTouched == BTN8_BORDER )
01148                 {
01149                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01150                     {
01151                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01152                         StopDemoApplication( );
01153                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01154                         RunDemoStandbyXoscMode( );
01155                     }
01156                     else
01157                     {
01158                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01159                         StopDemoApplication( );
01160                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01161                     }
01162                 }
01163                 else if( graphObjectTouched == BTN9_BORDER )
01164                 {
01165                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01166                     StopDemoApplication( );
01167                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01168                     // PreviousPage to set next page. Speed up the navigation.
01169                     PreviousPage = PAGE_STBY_XOSC_MODE;
01170                     MenuSetPage( PAGE_RADIO_PARAM );
01171                 }
01172                 break;
01173 
01174             case PAGE_TX_CW:
01175                 if( graphObjectTouched == BTN7_BORDER )
01176                 {
01177                     StopDemoApplication( );
01178                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01179                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01180                     MenuSetPage( PAGE_RADIO_TEST );
01181                 }
01182                 else if( graphObjectTouched == BTN8_BORDER )
01183                 {
01184                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01185                     {
01186                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01187                         StopDemoApplication( );
01188                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01189                         RunDemoTxCw( );
01190                     }
01191                     else
01192                     {
01193                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01194                         StopDemoApplication( );
01195                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01196                     }
01197                 }
01198                 else if( graphObjectTouched == BTN9_BORDER )
01199                 {
01200                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01201                     StopDemoApplication( );
01202                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01203                     // PreviousPage to set next page. Speed up the navigation.
01204                     PreviousPage = PAGE_TX_CW;
01205                     MenuSetPage( PAGE_RADIO_PARAM );
01206                 }
01207                 break;
01208 
01209             case PAGE_CONT_MODULATION:
01210                 if( graphObjectTouched == BTN7_BORDER )
01211                 {
01212                     StopDemoApplication( );
01213                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01214                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01215                     MenuSetPage( PAGE_RADIO_TEST );
01216                 }
01217                 else if( graphObjectTouched == BTN8_BORDER )
01218                 {
01219                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01220                     {
01221                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01222                         StopDemoApplication( );
01223                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01224                         RunDemoTxContinuousModulation( );
01225                     }
01226                     else
01227                     {
01228                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01229                         StopDemoApplication( );
01230                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01231                         wait_ms( 200 ); // debouncing of the touch screen
01232                     }
01233                 }
01234                 else if( graphObjectTouched == BTN9_BORDER )
01235                 {
01236                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01237                     StopDemoApplication( );
01238                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01239                     // PreviousPage to set next page. Speed up the navigation.
01240                     PreviousPage = PAGE_CONT_MODULATION;
01241                     MenuSetPage( PAGE_RADIO_PARAM );
01242                 }
01243                 break;
01244             case PAGE_CONT_RX:
01245                 if( graphObjectTouched == BTN7_BORDER )
01246                 {
01247                     StopDemoApplication( );
01248                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01249                     PreviousPage = PAGE_RADIO_TEST; // clear Previous page
01250                     MenuSetPage( PAGE_RADIO_TEST );
01251                 }
01252                 else if( graphObjectTouched == BTN8_BORDER )
01253                 {
01254                     if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01255                     {
01256                         Eeprom.EepromData.DemoSettings.HoldDemo = false;
01257                         StopDemoApplication( );
01258                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"    STOP", NULL );
01259                         RunDemoRxContinuous( );
01260                     }
01261                     else
01262                     {
01263                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
01264                         StopDemoApplication( );
01265                         ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01266                     }
01267                 }
01268                 else if( graphObjectTouched == BTN9_BORDER )
01269                 {
01270                     Eeprom.EepromData.DemoSettings.HoldDemo = true;
01271                     StopDemoApplication( );
01272                     // "CANCEL" or "OK & SAVE" button of PAGE_RADIO_PARAM use
01273                     // PreviousPage to set next page. Speed up the navigation.
01274                     PreviousPage = PAGE_CONT_RX;
01275                     MenuSetPage( PAGE_RADIO_PARAM );
01276                 }
01277                 break;
01278         }
01279     }
01280     return CurrentPage;
01281 }
01282 
01283 void MenuSetPage( uint8_t page )
01284 {
01285     if( page != CurrentPage )
01286     {
01287         // remove all button and text (except title, page border and line)
01288         // and disable all button (touchActive = false).
01289         GraphObject_t clearRect = { NULL, GO_RECTANGLE, 3, 35, 282, 230, 1, \
01290                                     BACK_COLOR, BACK_COLOR, true, BACK_COLOR, \
01291                                     NULL, false };
01292 
01293         GraphObjectClear( &clearRect, true );
01294         for( uint8_t i = 0; i < GRAPH_OBJECTS_COUNT; i++ )
01295         {
01296             MenuObjects[i].TouchActive = false;
01297         }
01298     }
01299     
01300     switch( page )
01301     {
01302         case START_PAGE:
01303             if( DeviceConnected == SX1261 )
01304             {
01305                 if( MatchingFreq == MATCHING_FREQ_915 )
01306                 {
01307                     DrawText( TITLE_TEXT, ( uint8_t* )"  SX1261 915MHz Demo Kit", NULL, NULL );
01308                 }
01309                 else if( MatchingFreq == MATCHING_FREQ_868 )
01310                 {
01311                     DrawText( TITLE_TEXT, ( uint8_t* )"  SX1261 868MHz Demo Kit", NULL, NULL );
01312                 }
01313             }
01314             else if( DeviceConnected == SX1262 )
01315             {
01316                 if( MatchingFreq == MATCHING_FREQ_915 )
01317                 {
01318                     DrawText( TITLE_TEXT, ( uint8_t* )"  SX1262 915MHz Demo Kit", NULL, NULL );
01319                 }
01320                 else if( MatchingFreq == MATCHING_FREQ_868 )
01321                 {
01322                     DrawText( TITLE_TEXT, ( uint8_t* )"  SX1262 868MHz Demo Kit", NULL, NULL );
01323                 }
01324             }
01325             else if( DeviceConnected == SX1268 )
01326             {
01327                 if( MatchingFreq == MATCHING_FREQ_780 )
01328                 {
01329                     DrawText( TITLE_TEXT, ( uint8_t* )"  SX1268 780MHz Demo Kit", NULL, NULL );
01330                 }
01331                 else if( MatchingFreq == MATCHING_FREQ_490 )
01332                 {
01333                     DrawText( TITLE_TEXT, ( uint8_t* )"  SX1268 490MHz Demo Kit", NULL, NULL );
01334                 }
01335             }
01336 
01337             DisplayDriverDrawLogo( SemtechLogo, 20, 37 );
01338             DrawActiveButton( BTN2_BORDER, ( uint8_t* )"DEMO Ping Pong", NULL );
01339             DrawActiveButton( BTN3_BORDER, ( uint8_t* )"DEMO PER", NULL );
01340             DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Radio Test Modes", NULL );
01341             DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Radio Settings", NULL );
01342             DrawActiveButton( BTN6_BORDER, ( uint8_t* )"Utilities", NULL );
01343             CurrentPage = START_PAGE;
01344             break;
01345 
01346         case PAGE_PING_PONG:
01347             if( CurrentPage == PAGE_PING_PONG )
01348             {
01349                 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01350                 {
01351                     ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01352                 }
01353                 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
01354                 {
01355                     DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOkSlave( ), ( uint8_t* )GetMenuDemoRxOk( ) );
01356                     DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKoSlave( ), ( uint8_t* )GetMenuDemoRxKo( ) );
01357                     DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave, Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave + Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave ), \
01358                               ( uint8_t* )GetMenuDemoResultPerCent2( Eeprom.EepromData.DemoSettings.CntPacketRxOK, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ) );
01359                     DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave, Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave + Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave ), \
01360                               ( uint8_t* )GetMenuDemoResultPerCent2( Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + Eeprom.EepromData.DemoSettings.RxTimeOutCount ) );
01361                     DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )"     ", ( uint8_t* )GetMenuDemoRssi( ) );
01362                     DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )"     ", ( uint8_t* )GetMenuDemoSnr( ) );
01363                 }
01364                 else
01365                 {  
01366                     DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOk( ), NULL );
01367                     DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKo( ), NULL );
01368                     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 );
01369                     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 );
01370                     DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL );
01371                     DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoSnr( ), NULL );
01372                 }
01373             }
01374             else
01375             {
01376                 DrawText( TITLE_TEXT, ( uint8_t* )"      PING PONG Demo", NULL, NULL );
01377                 DisplayCurrentRadioParams( PAGE_PING_PONG );
01378                 DrawText( LINE3_COL0_TEXT, ( uint8_t* )GetTotalPackets( ), ( uint8_t* )" SLAVE", NULL );
01379                 DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", ( uint8_t* )"     0", NULL );
01380                 DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", ( uint8_t* )"     0", NULL );
01381                 DrawText( LINE6_COL0_TEXT, ( uint8_t* )"Rx PSR", ( uint8_t* )"  0.00", NULL );
01382                 DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Rx PER", ( uint8_t* )"  0.00", NULL );
01383 
01384                 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
01385                 { 
01386                     DrawActiveButton( BTN0_BORDER, ( uint8_t* )"   MASTER", NULL );
01387                     DrawText( LINE3_COL0_TEXT, NULL, NULL, ( uint8_t* )"MASTER" );
01388                     DrawText( LINE4_COL0_TEXT, NULL, NULL, ( uint8_t* )"     0" );
01389                     DrawText( LINE5_COL0_TEXT, NULL, NULL, ( uint8_t* )"     0" );
01390                     DrawText( LINE6_COL0_TEXT, NULL, NULL, ( uint8_t* )"  0.00" );
01391                     DrawText( LINE7_COL0_TEXT, NULL, NULL, ( uint8_t* )"  0.00" );
01392                     DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )"    ", ( uint8_t* )"  0" );
01393                     DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )"    ", ( uint8_t* )"  0" );
01394                 }
01395                 else
01396                 {
01397                     DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )"     0", ( uint8_t* )"    ");
01398                     DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )"     0", ( uint8_t* )"    " );
01399                     DrawActiveButton( BTN0_BORDER, ( uint8_t* )"   SLAVE", NULL );
01400                 }
01401                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01402                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01403                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01404             }
01405             CurrentPage = PAGE_PING_PONG;
01406             break;
01407         case PAGE_PER:
01408             if( CurrentPage == PAGE_PER )
01409             {
01410                 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01411                 {
01412                     ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01413                 }
01414                 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
01415                 { 
01416                     DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL );
01417                 }
01418                 else
01419                 {  
01420                     DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOk( ), NULL );
01421                     DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKo( ), NULL );
01422                     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 );
01423                     DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoFreqError( ), NULL );
01424                     DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL );
01425                     DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoSnr( ), NULL );
01426                 }
01427             }
01428             else
01429             {
01430                 DrawText( TITLE_TEXT, ( uint8_t* )"         PER Demo", NULL, NULL );
01431                 DrawText( LINE3_COL0_TEXT, ( uint8_t* )"Test Total", ( uint8_t* )GetMenuDemoMaxNumPacket( ), NULL );
01432                 DisplayCurrentRadioParams( PAGE_PER );
01433 
01434                 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
01435                 { 
01436                     DrawActiveButton( BTN0_BORDER, ( uint8_t* )"   MASTER", NULL );
01437                     DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Transmitted", ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL );
01438                 }
01439                 else
01440                 {
01441                     DrawActiveButton( BTN0_BORDER, ( uint8_t* )"   SLAVE", NULL );
01442                     DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", ( uint8_t* )"     0", NULL );
01443                     DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", ( uint8_t* )"     0", NULL );
01444                     DrawText( LINE6_COL0_TEXT, ( uint8_t* )"PER",   ( uint8_t* )"  0.00", NULL );
01445                     DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Freq Err", ( uint8_t* )"     0", NULL );
01446                     DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )"     0", NULL );
01447                     DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )"     0", NULL );
01448                 }
01449                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01450                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01451                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01452             }
01453             CurrentPage = PAGE_PER;
01454             break;
01455 
01456         case PAGE_RADIO_PARAM:
01457             if( ErrorParam == true )
01458             {
01459                 MenuObjects[BTN3_VALUE_TEXT].FrontColor = OBJECT_ERROR;
01460                 MenuObjects[BTN4_VALUE_TEXT].FrontColor = OBJECT_ERROR;
01461                 MenuObjects[BTN6_VALUE_TEXT].FrontColor = OBJECT_ERROR;
01462             }
01463             if( CurrentPage != PAGE_RADIO_PARAM )
01464             {
01465                 DrawText( TITLE_TEXT, ( uint8_t* )"      Radio Settings", NULL, NULL );
01466                 DrawActiveButton( BTN0_BORDER, ( uint8_t* )"Mod:", ( uint8_t* )GetMenuRadioFrameType( ) );
01467                 DrawActiveButton( BTN1_BORDER, ( uint8_t* )"Freq:", ( uint8_t* )GetRadioFrequency( ) );
01468                 DrawActiveButton( BTN2_BORDER, ( uint8_t* )"Tx Pow:", ( uint8_t* )GetRadioTxPower( ) );
01469                 DrawActiveButton( BTN3_BORDER, ( uint8_t* )"Param 1:", ( uint8_t* )GetRadioModulationParameters1( ) );
01470                 DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Param 2:", ( uint8_t* )GetRadioModulationParameters2( ) );
01471                 DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Param 3:", ( uint8_t* )GetRadioModulationParameters3( ) );
01472                 DrawActiveButton( BTN6_BORDER, ( uint8_t* )"Param 4:", ( uint8_t* )GetRadioModulationParameters4( ) );
01473                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"   CANCEL", NULL );
01474                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )" OK & SAVE", NULL );
01475                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"PL:", ( uint8_t* )GetRadioPayloadLength( ) );
01476             }
01477             MenuObjects[BTN3_VALUE_TEXT].FrontColor = TEXT_VALUE;
01478             MenuObjects[BTN4_VALUE_TEXT].FrontColor = TEXT_VALUE;
01479             MenuObjects[BTN6_VALUE_TEXT].FrontColor = TEXT_VALUE;
01480             CurrentPage = PAGE_RADIO_PARAM;
01481             break;
01482 
01483         case PAGE_RADIO_PARAM_FREQ:
01484             if( CurrentPage != PAGE_RADIO_PARAM_FREQ )
01485             {
01486                 DrawText( TITLE_TEXT, ( uint8_t* )"   Radio Settings : Freq", NULL, NULL );
01487                 DrawActiveButton( BTN0_BORDER, ( uint8_t* )"     OK", NULL );
01488                 DrawActiveButton( BTN2_BORDER, ( uint8_t* )"Freq:", ( uint8_t* )GetRadioFrequency( ) );
01489                 DrawActiveButton( BTN3_BORDER, ( uint8_t* )"Preset1:", ( uint8_t* )GetRadioFreqBasePS1( ) );
01490                 DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Preset2:", ( uint8_t* )GetRadioFreqBasePS2( ) );
01491                 DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Preset3:", ( uint8_t* )GetRadioFreqBasePS3( ) );
01492                 DrawActiveButton( BTN6_BORDER, ( uint8_t* )"Step:", ( uint8_t* )GetRadioFreqBase( ) );
01493                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"     -", NULL );
01494                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"     +", NULL );
01495             }
01496             CurrentPage = PAGE_RADIO_PARAM_FREQ;
01497             break;
01498 
01499         case PAGE_UTILITIES:
01500             if( CurrentPage != PAGE_UTILITIES )
01501             {
01502                 DrawText( TITLE_TEXT, ( uint8_t* )"         Utilities", NULL, NULL );
01503                 // FIRMWARE_VERSION is defined in DemoApplication.h
01504                 DrawText( LINE0_TEXT, ( uint8_t* )FIRMWARE_VERSION, NULL, NULL );
01505 
01506                 DrawActiveButton( BTN0_BORDER, ( uint8_t* )"Fact. Reset", NULL );
01507                 DrawActiveButton( BTN3_BORDER, ( uint8_t* )"RxBoost:", ( uint8_t* )GetMenuDemoRadioBoostedRx( ) );
01508                 DrawActiveButton( BTN4_BORDER, ( uint8_t* )"DC Reg: ", ( uint8_t* )GetMenuDemoRadioPowerMode( ) );
01509                 DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Packets:", ( uint8_t* )GetMenuDemoMaxNumPacket( ) );
01510                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"   CANCEL", NULL );
01511                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )" OK & SAVE", NULL );
01512             }
01513             CurrentPage = PAGE_UTILITIES;
01514             break;
01515 
01516         case PAGE_RADIO_TEST:
01517             DrawText( TITLE_TEXT, ( uint8_t* )"     Radio Test Modes", NULL, NULL );
01518             DrawActiveButton( BTN0b_BORDER, ( uint8_t* )"        Sleep Mode", NULL );
01519             DrawActiveButton( BTN1_BORDER, ( uint8_t* )"      Standby RC Mode", NULL );
01520             DrawActiveButton( BTN2_BORDER, ( uint8_t* )"     Standby XOSC Mode", NULL );
01521             DrawActiveButton( BTN3_BORDER, ( uint8_t* )"        Set Tx CW", NULL );
01522             DrawActiveButton( BTN4_BORDER, ( uint8_t* )"    Set Cont. Modulation", NULL );
01523             DrawActiveButton( BTN5_BORDER, ( uint8_t* )"     Set Cont. Receive", NULL );
01524             DrawActiveButton( BTN6_BORDER, ( uint8_t* )"         Test Rssi ", NULL );
01525             DrawActiveButton( BTN7_BORDER, ( uint8_t* )"   BACK", NULL );
01526             CurrentPage = PAGE_RADIO_TEST;
01527             break;
01528 
01529         case PAGE_RSSI_TEST:
01530             if( CurrentPage == PAGE_RSSI_TEST )
01531             {
01532                 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01533                 {
01534                     ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01535                 }
01536                 DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL );
01537             }
01538             else
01539             {
01540                 DrawText( TITLE_TEXT, ( uint8_t* )"       Test Rssi   ", NULL, NULL );
01541                 DisplayCurrentRadioParams( PAGE_CONT_RX );
01542                 DrawText( LINE6_COL0_TEXT, ( uint8_t* )"Rssi",   ( uint8_t* )"  0.00", NULL );
01543                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01544                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01545                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01546             }
01547             CurrentPage = PAGE_RSSI_TEST;
01548             break;
01549         
01550         case PAGE_SLEEP_MODE:
01551             if( CurrentPage != PAGE_SLEEP_MODE )
01552             {
01553                 DrawText( TITLE_TEXT, ( uint8_t* )"        Sleep Mode", NULL, NULL );
01554                 DisplayCurrentRadioParams( PAGE_SLEEP_MODE );
01555                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01556                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01557                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01558                 CurrentPage = PAGE_SLEEP_MODE;
01559             }
01560             break;
01561 
01562         case PAGE_STBY_RC_MODE:
01563             if( CurrentPage != PAGE_STBY_RC_MODE )
01564             {
01565                 DrawText( TITLE_TEXT, ( uint8_t* )"     Standby RC Mode", NULL, NULL );
01566                 DisplayCurrentRadioParams( PAGE_STBY_RC_MODE );
01567                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01568                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01569                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01570                 CurrentPage = PAGE_STBY_RC_MODE;
01571             }
01572             break;
01573 
01574         case PAGE_STBY_XOSC_MODE:
01575             if( CurrentPage != PAGE_STBY_XOSC_MODE )
01576             {
01577                 DrawText( TITLE_TEXT, ( uint8_t* )"     Standby XOSC Mode", NULL, NULL );
01578                 DisplayCurrentRadioParams( PAGE_STBY_XOSC_MODE );
01579                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01580                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01581                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01582                 CurrentPage = PAGE_STBY_XOSC_MODE;
01583             }
01584             break;
01585 
01586         case PAGE_TX_CW:
01587             if( CurrentPage != PAGE_TX_CW )
01588             {
01589                 DrawText( TITLE_TEXT, ( uint8_t* )"        Set Tx CW", NULL, NULL );
01590                 DisplayCurrentRadioParams( PAGE_TX_CW );
01591                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01592                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01593                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01594                 CurrentPage = PAGE_TX_CW;
01595             }
01596             break;
01597 
01598         case PAGE_CONT_MODULATION:
01599             if( CurrentPage != PAGE_CONT_MODULATION )
01600             {
01601                 DrawText( TITLE_TEXT, ( uint8_t* )"   Set Cont. Modulation", NULL, NULL );
01602                 DisplayCurrentRadioParams( PAGE_CONT_MODULATION );
01603                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01604                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01605                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01606                 CurrentPage = PAGE_CONT_MODULATION;
01607             }
01608             break;
01609 
01610         case PAGE_CONT_RX:
01611             if( CurrentPage == PAGE_CONT_RX )
01612             {
01613                 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
01614                 {
01615                     ButtonChangeText( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01616                 }
01617                 DrawText( LINE4_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxOk( ), NULL );
01618                 DrawText( LINE5_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRxKo( ), NULL );
01619                 DrawText( LINE6_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoResultPerCent1( Eeprom.EepromData.DemoSettings.CntPacketRxKO, Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO ), NULL );
01620                 DrawText( LINE7_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoFreqError( ), NULL );
01621                 DrawText( LINE8_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoRssi( ), NULL );
01622                 DrawText( LINE9_COL0_TEXT, NULL, ( uint8_t* )GetMenuDemoSnr( ), NULL );
01623             }
01624             else
01625             {
01626                 DrawText( TITLE_TEXT, ( uint8_t* )"       Set Cont. Rx   ", NULL, NULL );
01627                 DisplayCurrentRadioParams( PAGE_CONT_RX );
01628                 DrawText( LINE4_COL0_TEXT, ( uint8_t* )"Rx OK", ( uint8_t* )"     0", NULL );
01629                 DrawText( LINE5_COL0_TEXT, ( uint8_t* )"Rx KO", ( uint8_t* )"     0", NULL );
01630                 DrawText( LINE6_COL0_TEXT, ( uint8_t* )"PER",   ( uint8_t* )"  0.00", NULL );
01631                 DrawText( LINE7_COL0_TEXT, ( uint8_t* )"Freq Err", ( uint8_t* )"     0", NULL );
01632                 DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Last Rssi", ( uint8_t* )"     0", NULL );
01633                 DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Last SNR", ( uint8_t* )"     0", NULL );
01634                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    BACK", NULL );
01635                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
01636                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
01637             }
01638             CurrentPage = PAGE_CONT_RX;
01639             break;
01640 
01641         default:
01642             break;
01643     }
01644 }
01645 
01646 void DisplayCurrentRadioParams( uint8_t page )
01647 {
01648     switch( page )
01649     {
01650         case PAGE_SLEEP_MODE:
01651         case PAGE_STBY_RC_MODE:
01652         case PAGE_STBY_XOSC_MODE:
01653         case PAGE_TX_CW:
01654             // Do display different without packet settings (no modulation here)
01655             // 2 + (9) + 4 + (7) = 22 (=<28 : ok)
01656             sprintf( StringText ,"f:%s, P:%s", GetRadioFrequencyMHz( ), GetRadioTxPower( ) );           // StringText3 + StringText2
01657             DrawText( LINE0_TEXT, ( uint8_t* )StringText, NULL, NULL);
01658             sprintf( StringText ,"Radio Power Mode: %s", ( uint8_t* )GetMenuDemoRadioPowerMode( ) + 2 );
01659             DrawText( LINE1_TEXT, ( uint8_t* )StringText, NULL, NULL);
01660             sprintf( StringText ,"Press START to launch test" );
01661             DrawText( LINE3_TEXT, ( uint8_t* )StringText, NULL, NULL);
01662             break;
01663 
01664         case PAGE_CONT_MODULATION:
01665             // 2 + (9) + 4 + (7) + 2 + (4) = 28 (=<28 : ok)
01666             sprintf( StringText ,"f:%s, P:%s, %s", GetRadioFrequencyMHz( ), GetRadioTxPower( ), \
01667                                                    ( uint8_t* )GetMenuDemoRadioPowerMode( ) + 2 );      // StringText3 + StringText2
01668             DrawText( LINE0_TEXT, ( uint8_t* )StringText, NULL, NULL);
01669             if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01670             {
01671                 // (5) + 2 + (4) + 2 + (12) = 25 (=<28 : ok)
01672                 sprintf( StringText ,"%s: %s, %s", GetMenuRadioFrameType( ) + 1, \
01673                                                    GetRadioModulationParameters1( ),
01674                                                    GetRadioModulationParameters4( ) );                  // StringText2
01675             }
01676             else
01677             {
01678                 if( ErrorParam == true )
01679                 {
01680                     MenuObjects[LINE1_TEXT].FrontColor = OBJECT_ERROR;
01681                     MenuObjects[LINE2_TEXT].FrontColor = OBJECT_ERROR;
01682                 }
01683                 // (4) + 2 + (10) + 1 + (11) = 28 (=<28 : ok)
01684                 sprintf( StringText ,"%s: %s/%s", GetMenuRadioFrameType( ) + 1, \
01685                                                   GetRadioModulationParameters1( ), \
01686                                                   GetRadioModulationParameters4( ) );                   // StringText2
01687             }
01688             DrawText( LINE1_TEXT, ( uint8_t* )StringText, NULL, NULL);
01689             // (10) + 2 + (10) = 22 (=<28 : ok)
01690             sprintf( StringText ,"%s, %s", GetRadioModulationParameters2( ), \
01691                                            GetRadioModulationParameters3( ) );
01692             DrawText( LINE2_TEXT, ( uint8_t* )StringText, NULL, NULL);
01693             sprintf( StringText ,"Press START to launch test" );
01694             DrawText( LINE4_TEXT, ( uint8_t* )StringText, NULL, NULL);
01695             MenuObjects[LINE1_TEXT].FrontColor = TEXT_COLOR;
01696             MenuObjects[LINE2_TEXT].FrontColor = TEXT_COLOR;
01697             break;
01698 
01699         case PAGE_CONT_RX:      // standart display
01700         case PAGE_PING_PONG:
01701         case PAGE_PER:
01702             // 2 + (9) + 4 + (7) = 22 (=<28 : ok)
01703             sprintf( StringText ,"f:%s, P:%s", GetRadioFrequencyMHz( ), GetRadioTxPower( ) );           // StringText3 + StringText2
01704             DrawText( LINE0_TEXT, ( uint8_t* )StringText, NULL, NULL);
01705             if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01706             {
01707                 // (5) + 2 + (4) + 2 + (12) = 25 (=<28 : ok)
01708                 sprintf( StringText ,"%s: %s, %s", GetMenuRadioFrameType( ) + 1, \
01709                                                    GetRadioModulationParameters1( ),
01710                                                    GetRadioModulationParameters4( ) );                  // StringText2
01711             }
01712             else
01713             {
01714                 if( ErrorParam == true )
01715                 {
01716                     MenuObjects[LINE1_TEXT].FrontColor = OBJECT_ERROR;
01717                     MenuObjects[LINE2_TEXT].FrontColor = OBJECT_ERROR;
01718                 }
01719                 // (4) + 2 + (10) + 1 + (11) = 28 (=<28 : ok)
01720                 sprintf( StringText ,"%s: %s/%s", GetMenuRadioFrameType( ) + 1, \
01721                                                   GetRadioModulationParameters1( ), \
01722                                                   GetRadioModulationParameters4( ) );                   // StringText2
01723             }
01724             DrawText( LINE1_TEXT, ( uint8_t* )StringText, NULL, NULL);
01725             // 3 + (3) + 1 + (10) + 1 + (10) = 28 (=<28 : ok)
01726             sprintf( StringText ,"PL:%s/%s/%s", GetRadioPayloadLength( ), \
01727                                                   GetRadioModulationParameters2( ), \
01728                                                   GetRadioModulationParameters3( ) );                   // StringText + StringText2 + StringText3
01729             DrawText( LINE2_TEXT, ( uint8_t* )StringText, NULL, NULL);
01730             MenuObjects[LINE1_TEXT].FrontColor = TEXT_COLOR;
01731             MenuObjects[LINE2_TEXT].FrontColor = TEXT_COLOR;
01732             break;
01733     }
01734 }
01735 
01736 char* GetMenuRadioFrameType( void )
01737 {
01738     switch( Eeprom.EepromData.DemoSettings.ModulationType )
01739     {
01740         case PACKET_TYPE_GFSK: return ( char* )" GFSK";
01741         case PACKET_TYPE_LORA:
01742         default:               return ( char* )" LORA";
01743     }
01744 }
01745 
01746 char* GetRadioModulationParameters1( void )
01747 {
01748     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01749     {
01750         switch( Eeprom.EepromData.DemoSettings.ModulationParam1 )
01751         {
01752             case LORA_SF5:  return ( char* )"SF5";
01753             case LORA_SF6:  return ( char* )"SF6";
01754             case LORA_SF7:  return ( char* )"SF7";
01755             case LORA_SF8:  return ( char* )"SF8";
01756             case LORA_SF9:  return ( char* )"SF9";
01757             case LORA_SF10: return ( char* )"SF10";
01758             case LORA_SF11: return ( char* )"SF11";
01759             case LORA_SF12: return ( char* )"SF12";
01760             default:        return ( char* )"X";
01761         }
01762     }
01763     else // PACKET_TYPE_GFSK
01764     {
01765         // quicker than using a float (which is not optimized in MBED)
01766         sprintf( StringText2, "%3d.%1d kbps", \
01767                  Eeprom.EepromData.DemoSettings.ModulationParam1 / 1000, \
01768                  ( Eeprom.EepromData.DemoSettings.ModulationParam1 % 1000) / 100 );
01769         return StringText2;
01770     }
01771 }
01772 
01773 char* GetRadioModulationParameters2( void )
01774 {
01775     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01776     {
01777         switch( Eeprom.EepromData.DemoSettings.ModulationParam2 )
01778         {
01779             case LORA_BW_500: return ( char* )"BW 500 kHz";
01780             case LORA_BW_250: return ( char* )"BW 250 kHz";
01781             case LORA_BW_125: return ( char* )"BW 125 kHz";
01782             case LORA_BW_062: return ( char* )"BW 62 kHz";
01783             case LORA_BW_041: return ( char* )"BW 41 kHz";
01784             case LORA_BW_031: return ( char* )"BW 31 kHz";
01785             case LORA_BW_020: return ( char* )"BW 20 kHz";
01786             case LORA_BW_015: return ( char* )"BW 15 kHz";
01787             case LORA_BW_010: return ( char* )"BW 10 kHz";
01788             case LORA_BW_007: return ( char* )"BW 7 kHz";
01789             default:          return ( char* )"X";
01790         }
01791     }
01792     else // Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK
01793     {
01794         // quicker than using a float (which is not optimized in MBED)
01795         sprintf( StringText3, "Fd %3d kHz", \
01796                  Eeprom.EepromData.DemoSettings.ModulationParam2 / 1000 );
01797         return StringText3;
01798     }
01799 }
01800 
01801 char* GetRadioModulationParameters3( void )
01802 {
01803     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01804     {
01805         switch( Eeprom.EepromData.DemoSettings.ModulationParam3 )
01806         {
01807             case LORA_CR_4_5:       return ( char* )"CR 4/5";
01808             case LORA_CR_4_6:       return ( char* )"CR 4/6";
01809             case LORA_CR_4_7:       return ( char* )"CR 4/7";
01810             case LORA_CR_4_8:       return ( char* )"CR 4/8";
01811             default:                return ( char* )"X";
01812         }
01813     }
01814     else // PACKET_TYPE_GFSK
01815     {
01816         switch( Eeprom.EepromData.DemoSettings.ModulationParam3 )
01817         {
01818             case MOD_SHAPING_OFF:          return ( char* )"NONE   ";
01819             case MOD_SHAPING_G_BT_03:      return ( char* )"G BT .3";
01820             case MOD_SHAPING_G_BT_05:      return ( char* )"G BT .5";
01821             case MOD_SHAPING_G_BT_07:      return ( char* )"G BT .7";
01822             case MOD_SHAPING_G_BT_1:       return ( char* )"G BT 1 ";
01823             default:                       return ( char* )"X";
01824         }
01825     }
01826 }
01827 
01828 char* GetRadioModulationParameters4( void )
01829 {
01830     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01831     {
01832         if( Eeprom.EepromData.DemoSettings.PacketParam2 == LORA_PACKET_FIXED_LENGTH )
01833         {
01834             return ( char* )"Fixed length";
01835         }
01836         else  // RADIO_PACKET_VARIABLE_LENGTH
01837         {
01838             return ( char* )"Variable len";
01839         }
01840     }
01841     else // Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK
01842     {
01843         switch( Eeprom.EepromData.DemoSettings.ModulationParam4 )
01844         {
01845             case RX_BW_4800  :  return ( char* )"BW 4.8 kHz";
01846             case RX_BW_5800  :  return ( char* )"BW 5.8 kHz";
01847             case RX_BW_7300  :  return ( char* )"BW 7.3 kHz";
01848             case RX_BW_9700  :  return ( char* )"BW 9.7 kHz";
01849             case RX_BW_11700 :  return ( char* )"BW 11.7 kHz";
01850             case RX_BW_14600 :  return ( char* )"BW 14.6 kHz";
01851             case RX_BW_19500 :  return ( char* )"BW 19.5 kHz";
01852             case RX_BW_23400 :  return ( char* )"BW 23.4 kHz";
01853             case RX_BW_29300 :  return ( char* )"BW 29.3 kHz";
01854             case RX_BW_39000 :  return ( char* )"BW 39 kHz";
01855             case RX_BW_46900 :  return ( char* )"BW 46.9 kHz";
01856             case RX_BW_58600 :  return ( char* )"BW 58.6 kHz";
01857             case RX_BW_78200 :  return ( char* )"BW 78.2 kHz";
01858             case RX_BW_93800 :  return ( char* )"BW 93.8 kHz";
01859             case RX_BW_117300 : return ( char* )"BW 117 kHz";
01860             case RX_BW_156200 : return ( char* )"BW 156 kHz";
01861             case RX_BW_187200 : return ( char* )"BW 187 kHz";
01862             case RX_BW_234300 : return ( char* )"BW 234 kHz";
01863             case RX_BW_312000 : return ( char* )"BW 312 kHz";
01864             case RX_BW_373600 : return ( char* )"BW 373 kHz";
01865             case RX_BW_467000 : return ( char* )"BW 467 kHz";
01866             default:            return ( char* )"X";
01867         }
01868     }
01869 }
01870 
01871 char* GetRadioFrequency( void )
01872 {
01873     sprintf( StringText2, "%lu Hz", \
01874              ( unsigned long )Eeprom.EepromData.DemoSettings.Frequency );
01875     return StringText2;
01876 }
01877 
01878 char* GetRadioFrequencyMHz( void )
01879 {
01880     // quicker than using a float (which is not optimized in MBED)
01881     sprintf( StringText3, "%3d.%1d MHz", \
01882              Eeprom.EepromData.DemoSettings.Frequency / 1000000, \
01883              ( Eeprom.EepromData.DemoSettings.Frequency % 1000000 ) / 100000 );
01884     return StringText3;
01885 }
01886 
01887 char* GetRadioFreqBase( void )
01888 {
01889     switch( CurrentFreqBase )
01890     {
01891         case FB1:    return ( char* )"1 Hz";
01892         case FB10:   return ( char* )"10 Hz";
01893         case FB100:  return ( char* )"100 Hz";
01894         case FB1K:   return ( char* )"1 kHz";
01895         case FB10K:  return ( char* )"10 kHz";
01896         case FB100K: return ( char* )"100 kHz";
01897         case FB1M:   return ( char* )"1 MHz";
01898         case FB10M:  return ( char* )"10 MHz";
01899         default:     return ( char* )"X";
01900     }
01901 }
01902 
01903 char* GetRadioFreqBasePS1( void )
01904 {
01905     if( DeviceConnected != SX1268 )
01906     {
01907         sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET6 );
01908     }
01909     else
01910     {
01911         sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET4 );
01912     }
01913     return StringText;
01914 }
01915 
01916 char* GetRadioFreqBasePS2( void )
01917 {
01918     if( DeviceConnected != SX1268 )
01919     {
01920         sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET7 );
01921     }
01922     else
01923     {
01924         sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET3 );
01925     }
01926     return StringText;
01927 }
01928 
01929 char* GetRadioFreqBasePS3( void )
01930 {
01931     if( DeviceConnected != SX1268 )
01932     {
01933         sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET8 );
01934     }
01935     else
01936     {
01937         sprintf( StringText, "%lu Hz", DEMO_CENTRAL_FREQ_PRESET9 );
01938     }
01939     return StringText;
01940 }
01941 
01942 char* GetRadioTxPower( void )
01943 {
01944     sprintf( StringText2, "%d dBm", Eeprom.EepromData.DemoSettings.TxPower );
01945     return StringText2;
01946 }
01947 
01948 char* GetRadioPayloadLength( void )
01949 {
01950     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01951     {
01952         sprintf( StringText2, "%d", Eeprom.EepromData.DemoSettings.PacketParam3 );
01953     }
01954     else // PACKET_TYPE_GFSK
01955     {
01956         sprintf( StringText2, "%d", Eeprom.EepromData.DemoSettings.PacketParam6 );
01957     }
01958     return StringText2;
01959 }
01960 
01961 char* GetMenuDemoMaxNumPacket( void )
01962 {
01963     if( Eeprom.EepromData.DemoSettings.MaxNumPacket == 0 )
01964     {
01965         return ( char* )"Infinite";
01966     }
01967     else
01968     {
01969         sprintf( StringText, "%6d", \
01970                  Eeprom.EepromData.DemoSettings.MaxNumPacket );
01971     }
01972     return StringText;
01973 }
01974 
01975 char* GetMenuDemoNumSentPacket( void )
01976 {
01977     sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.CntPacketTx );
01978     return StringText2;
01979 }
01980 
01981 char* GetMenuDemoFreqError( void )
01982 {
01983     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
01984     {
01985         sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.FreqErrorEst );
01986     }
01987     else
01988     {
01989         sprintf( StringText2, "N/A" );
01990     }
01991     return StringText2;
01992 }
01993 
01994 char* GetMenuDemoRxOk( void )
01995 {
01996     sprintf( StringText2, "%6lu", \
01997             ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxOK ) );
01998     return StringText2;
01999 }
02000 
02001 char* GetMenuDemoRxKo( void )
02002 {
02003     sprintf( StringText2, "%6lu", \
02004              ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
02005              Eeprom.EepromData.DemoSettings.RxTimeOutCount ) ); 
02006     return StringText2;
02007 }
02008 
02009 char* GetMenuDemoRxOkSlave( void )
02010 {
02011     sprintf( StringText3, "%6lu", \
02012        ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave ) );
02013     return StringText3;
02014 }
02015 
02016 char* GetMenuDemoResultPerCent1( uint32_t value, uint32_t reference )
02017 {
02018     // quicker than using a float (which is not optimized in MBED)
02019     sprintf( StringText2, "%3d.%02d", \
02020              ( ( value * 10000 ) / reference ) / 100, \
02021              ( ( value * 10000 ) / reference ) % 100 );
02022     return StringText2;
02023 }
02024 
02025 char* GetMenuDemoResultPerCent2( uint32_t value, uint32_t reference )
02026 {
02027     // quicker than using a float (which is not optimized in MBED)
02028     sprintf( StringText3, "%3d.%02d", \
02029              ( ( value * 10000 ) / reference ) / 100, \
02030              ( ( value * 10000 ) / reference ) % 100 );
02031     return StringText3;
02032 }
02033 
02034 char* GetMenuDemoRxKoSlave( void )
02035 {
02036     sprintf( StringText3, "%6lu", \
02037        ( unsigned long )( Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave ) );
02038     return StringText3;
02039 }
02040 
02041 char* GetMenuDemoRssi( void )
02042 {
02043     sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.RssiValue );
02044     return StringText2;
02045 }
02046 
02047 char* GetMenuDemoSnr( void )
02048 {
02049     if( Eeprom.EepromData.DemoSettings.SnrValue >= 0 )
02050     {
02051         sprintf( StringText2, "     /" ); 
02052     }
02053     else
02054     {
02055         sprintf( StringText2, "%6d", Eeprom.EepromData.DemoSettings.SnrValue );
02056     }
02057     return StringText2;
02058 }
02059 
02060 char* GetTotalPackets( void )
02061 {
02062     if( Eeprom.EepromData.DemoSettings.MaxNumPacket == 0 )
02063     {
02064         return ( char* )"Total:  Inf.";
02065     }
02066     else
02067     {
02068         sprintf( StringText, "Total: %5lu", \
02069                  ( unsigned long )( Eeprom.EepromData.DemoSettings.MaxNumPacket ) );
02070         return StringText;
02071     }
02072 }
02073 
02074 char* GetMenuDemoRadioPowerMode( void )
02075 {
02076     if( Eeprom.EepromData.DemoSettings.RadioPowerMode == USE_LDO )
02077     {
02078         return ( char* )"  LDO";
02079     }
02080     else
02081     {
02082         return ( char* )"  DCDC";
02083     }
02084 }
02085 
02086 char* GetMenuDemoRadioBoostedRx( void )
02087 {
02088     if( Eeprom.EepromData.DemoSettings.BoostedRx == 0x01 )
02089     {
02090         return ( char* )"  True";
02091     }
02092     else
02093     {
02094         return ( char* )"  False";
02095     }
02096 }
02097 
02098 
02099 void CheckScreen( void )
02100 {
02101     CheckScreenFlag = true;
02102 }
02103 
02104 void DebouncedScreen (void )
02105 {
02106     ScreenBeenDebounced = false;
02107     DebouncedScreenTouch.detach( );
02108 }
02109 
02110 void RadioSettingsCheckError( void )
02111 {
02112     if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK )
02113     {
02114         switch( Eeprom.EepromData.DemoSettings.ModulationParam4 )
02115         {
02116             case RX_BW_4800:
02117                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 4800;
02118                 break;
02119 
02120             case RX_BW_5800:
02121                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 5800;
02122                 break;
02123 
02124             case RX_BW_7300:
02125                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 7300;
02126                 break;
02127 
02128             case RX_BW_9700:
02129                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 9700;
02130                 break;
02131 
02132             case RX_BW_11700:
02133                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 11700;
02134                 break;
02135 
02136             case RX_BW_14600:
02137                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 14600;
02138                 break;
02139 
02140             case RX_BW_19500:
02141                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 19500;
02142                 break;
02143 
02144             case RX_BW_23400:
02145                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 23400;
02146                 break;
02147 
02148             case RX_BW_29300:
02149                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 29300;
02150                 break;
02151 
02152             case RX_BW_39000:
02153                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 39000;
02154                 break;
02155 
02156             case RX_BW_46900:
02157                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 46900;
02158                 break;
02159 
02160             case RX_BW_58600:
02161                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 58600;
02162                 break;
02163 
02164             case RX_BW_78200:
02165                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 78200;
02166                 break;
02167 
02168             case RX_BW_93800:
02169                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 93800;
02170                 break;
02171 
02172             case RX_BW_117300:
02173                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 117300;
02174                 break;
02175 
02176             case RX_BW_156200:
02177                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 156200;
02178                 break;
02179 
02180             case RX_BW_187200:
02181                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 187200;
02182                 break;
02183 
02184             case RX_BW_234300:
02185                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 234300;
02186                 break;
02187 
02188             case RX_BW_312000:
02189                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 312000;
02190                 break;
02191 
02192             case RX_BW_373600:
02193                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 373600;
02194                 break;
02195 
02196             case RX_BW_467000:
02197                 ErrorParam = ( (Eeprom.EepromData.DemoSettings.ModulationParam2 * 2) + Eeprom.EepromData.DemoSettings.ModulationParam1  ) >= 467000;
02198                 break;
02199 
02200             default:
02201                 ErrorParam = true;
02202                 break;
02203         }
02204         if( ErrorParam == true )
02205         {
02206             MenuObjects[BTN3_VALUE_TEXT].FrontColor = OBJECT_ERROR;
02207             MenuObjects[BTN4_VALUE_TEXT].FrontColor = OBJECT_ERROR;
02208             MenuObjects[BTN6_VALUE_TEXT].FrontColor = OBJECT_ERROR;
02209         }
02210         else
02211         {
02212             RadioSettingsClearError( );
02213         }
02214         ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters1( ) );
02215         ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters2( ) );
02216         ButtonChangeText( BTN6_BORDER, NULL, ( uint8_t* )GetRadioModulationParameters4( ) );
02217     }
02218 }
02219 
02220 void RadioSettingsClearError( void )
02221 {
02222     MenuObjects[BTN3_VALUE_TEXT].FrontColor = TEXT_VALUE;
02223     MenuObjects[BTN4_VALUE_TEXT].FrontColor = TEXT_VALUE;
02224     MenuObjects[BTN6_VALUE_TEXT].FrontColor = TEXT_VALUE;
02225 }
02226 
02227 /*!
02228  * \brief Draw button
02229  *
02230  * \param [in]  buttonId      Id of the button to draw
02231  * \param [in]  *text1        Text to draw as label
02232  * \param [in]  *text2        Text to draw as value
02233  */
02234 void DrawActiveButton( uint8_t buttonId, uint8_t* text1, uint8_t* text2 )
02235 {
02236     GraphObjectDraw( &( MenuObjects[buttonId] ), NULL, NULL, true );
02237     if( text2 == NULL )
02238     {
02239         if( text1 != NULL )
02240         {
02241             GraphObjectDraw( &( MenuObjects[buttonId + 1] ), text1, NULL, false );
02242         }
02243     }
02244     else
02245     {
02246         if( text1 != NULL )
02247         {
02248             GraphObjectDraw( &( MenuObjects[buttonId + 2] ), text1, NULL, false );
02249         }
02250         GraphObjectDraw( &( MenuObjects[buttonId + 3] ), text2, NULL, false );
02251     }
02252 }
02253 
02254 void ButtonChangeText( uint8_t buttonId, uint8_t* text1, uint8_t* text2 )
02255 {
02256     if( text2 == NULL )
02257     {
02258         if( text1 != NULL )
02259         {
02260             GraphObjectDraw( &( MenuObjects[buttonId + 1] ), text1, NULL, false );
02261         }
02262     }
02263     else
02264     {
02265         if( text1 != NULL )
02266         {
02267             GraphObjectDraw( &( MenuObjects[buttonId + 2] ), text1, NULL, false );
02268         }
02269         GraphObjectDraw( &( MenuObjects[buttonId + 3] ), text2, NULL, false );
02270     }
02271 }
02272 
02273 void DrawText( uint8_t lineId, uint8_t* text0, uint8_t* text1, uint8_t* text2 )
02274 {
02275     if( text0 != NULL )
02276     {
02277         GraphObjectDraw( &( MenuObjects[lineId] ), text0, NULL, false );
02278     }
02279     if( text1 != NULL )
02280     {
02281         GraphObjectDraw( &( MenuObjects[lineId + 1] ), text1, NULL, false );
02282     }
02283     if( text2 != NULL )
02284     {
02285         GraphObjectDraw( &( MenuObjects[lineId + 2] ), text2, NULL, false );
02286     }
02287 }
02288