const char main_menu[NBR_MAIN_MENU_ITEMS][LCD_CHAR_LEN + 10]=
{
"Main Menu",
"Power Management",
"Security System",
"System Status",
"Option 5",
"Option 6",
"Option 7",
"Option 8",
"Option 9",
"Option 10",
};
enum main_menu_options
{
MAIN_MENU=0,
POWER_MANAGEMENT,
SECURITY_SYSTEM,
SYSTEM_STATUS,
OPTION5,
OPTION6,
OPTION7,
OPTION8,
OPTION9,
OPTION10,
NBR_MENU_OPTIONS,
};
Uint8 main_menu_selected_item = POWER_MANAGEMENT;
Uint8 key_status;
Uint8 app_state;
void main( void )
{
Init_Sync_Timer();
while (1)
{
Sync_To_Real_Time();
Service_Application();
Service_Keyboard();
Service_Display();
}
}
void Init_Sync_Timer( void )
{
#define MAIN_LOOP_MS 5
// Init a timer to expire in 5mS intervals
// Do not enable the timer's interrupt
}
void Sync_To_Real_Time( void )
{
while (timer interrupt flag is not set)
; // just wait
clear timer interrupt flag
}
void Service_Keyboard( void )
{
static Uint8 last_key_status;
Uint8 raw_key_status;
raw_key_status = keyboard input;
if (last_key_status != raw_key_status)
{
key_status = raw_key_status;
}
else
{
key_status = NO_BUTTONS_PRESSED;
}
last_key_status = raw_key_status;
}
void Service_Application( void )
{
#define SPLASH_SCREEN_DELAY 3000/MAIN_LOOP_DELAY // 3 seconds
static Uint8 delay_timer = 0;
switch (app_state)
{
case APP_SPLASH_SCREN:
if ((++delay_timer == SPLASH_SCREEN_DELAY) || (key_status == KEY_ENTER))
{
delay_timer = 0;
app_state = APP_MAIN_MENU;
}
break;
case APP_MAIN_MENU:
switch (key_status)
{
case KEY_UP:
main_menu_selected_item--;
if (main_menu_selected_item == 0)
main_menu_selected_item = NBR_MENU_ITEMS - 1;
break;
case KEY_DOWN:
main_menu_selected_item++;
if (main_menu_selected_item == NBR_MENU_ITEMS)
main_menu_selected_item = 1;
break;
case KEY_ENTER:
switch (main_menu_selected_item)
{
case POWER_MANAGEMENT:
app_state = APP_POWER_MANAGEMENT;
break;
case OPTION5:
Some_Function();
break;
}
}
}
void Service_Display( void )
{
switch (app_state)
{
case APP_SPLASH_SCREEN:
Display_Splash_Screen();
break;
case APP_MAIN_MENU:
Display_Main_Menu();
break;
case APP_POWER_MANAGEMENT:
Display_Power_Management_Menu();
break;
}
}
void Display_Splash_Screen( void )
{
printf("Application title\n");
printf("Date of Build\n");
printf("Firmware Version Nbr\n");
printf("Author\n");
}
void Display_Main_Menu( void )
{
printf("%s\n", main_menu[0] );
if (main_menu_selected_item == 1)
{
printf("> %s\n", main_menu[1]);
printf(" %s\n", main_menu[2];
printf(" %s\n", main_menu[3];
}
else if (main_menu_selected_item == NBR_MENU_OPTIONS - 1)
{
printf(" %s\n", main_menu[NBR_MENU_OPTIONS-3]);
printf(" %s\n", main_menu[NBR_MENU_OPTIONS-2];
printf("> %s\n", main_menu[NBR_MENU_OPTIONS-1];
}
else
{
printf(" %s\n", main_menu[main_menu_selected_item-1]);
printf("> %s\n", main_menu[main_menu_selected_item];
printf(" %s\n", main_menu[main_menu_selected_item+1];
}
}