#include #include "keyboard.h" #include "display.h" #include "settings.h" #include #include #include #include #include #include #include #include #include #include #include "web.h" #include "vs10xx.h" #include "rtc.h" #include "menu.h" #include "player.h" #include "streamer.h" #include "alarm.h" #include "network.h" #include "scheduler.h" #define HOME 8 #define MENU 10 #define STREAMING 10 #define SCHEDULER 11 #define ALARMS 12 #define SETTINGS 13 #define DEVICE 14 int CurrentTimeZone = 11; int CurrentStream = 0; int CurrentAlarm = 0; int CurrentSchedule = 0; int CurrentScrollPos = 0; int CurrentAlarmDisplay = 0; char buf[24] = {0}; char str[30] = {0}; char icon[8] = {0}; /* First Time Setup */ void SyncTimeEntry(void) { if(SyncTime()) //If sync succeeded navigateToMenu(4); else //if sync failed navigateToMenu(5); } void CheckFirstTimeSetup(void) { //Check if FTS is set in eeprom, skip FTS if(GetFirstTimeSetup()) { navigateToMenu(HOME); return; } } //Mark FTS as done in eeprom void FirstTimeSetupComplete(void) { SetFirstTimeSetup(1); } /* TIMEZONES */ void DisplayTimeZone(void) { GetTimeZoneName(CurrentTimeZone, str); sprintf(buf, "~1 %s", str); LcdLine(1, buf); } //Automatically find the timezone using the curent IP address void FindTimeZone(void) { getTimezoneOffset(&CurrentTimeZone); DisplayTimeZone(); } void ChooseTimeZoneUp(void) { CurrentTimeZone--; if(CurrentTimeZone < 0) CurrentTimeZone = 24; DisplayTimeZone(); } void ChooseTimeZoneDown(void) { CurrentTimeZone++; if(CurrentTimeZone > 24) CurrentTimeZone = 0; DisplayTimeZone(); } //Sync using the selected timezone void ChooseTimeZone(void) { SetTimeZone(GetTimeZoneValue(CurrentTimeZone)); } //Display the time and date in the RTC chip void DisplayDateTime(void) { GetDateTimeString(str); LcdLine(0, str); } /* MAIN DISPLAYS */ //Create the icons at the top void CreateIconsString(char* str, int * len) { int length = 0; strcpy(str, ""); length++; if(GetVolume() == 0) //Volume on or muted { strcat(str, "~4"); //muted } else { strcat(str, "~3"); //on } if(GetSync() > 0) //Display checkmark if sync with server is on { strcat(str, "~0"); length++; } if(GetTimeSynced()) //Display checkmark if time is in sync with server { strcat(str, "~7"); length++; } if(AlarmsOn() || SchedulesOn()) //Display alarm icon if a schedule or alarm is going off { strcat(str, "~2"); length++; } *len = length; } //Show current stream MetaData and scroll void DisplayMetaData(void) { if(isStreaming()) { CurrentScrollPos++; if(CurrentScrollPos > strlen(GetMetaData()) - 16) CurrentScrollPos = 0; LcdScrollLine(1, CurrentScrollPos, GetMetaData()); } else { LcdLine(1, " "); CurrentScrollPos = 0; } } //Display the current timestamp followed by the icons void UpdateTimeDisplay( void ) { GetTimeString(str); int l; CreateIconsString(icon, &l); int i; for(i=0; i<8-l; i++) strcat(str, " "); strcat(str, icon); LcdLine(0, str); DisplayMetaData(); } //Display the current date followed by the icons void UpdateDateDisplay( void ) { GetDateString(str); int l; CreateIconsString(icon, &l); int i; for(i=0; i<6-l; i++) strcat(str, " "); strcat(str, icon); LcdLine(0, str); DisplayMetaData(); } /* RESET */ void FactoryResetOk(void) { stop(); //Stop any audio resetServer(); //Remove any data on the server NutSleep(10); FactoryReset(); //Reset the eeprom memory NutSleep(20); Reboot(); //Automatically reboot the device } /* VOLUME/BASS/TREBLE SETTINGS */ void VolumeDisplay(void) { int volume = GetVolume() / 16; sprintf(buf, "Volume: %d", volume); LcdLine(0, buf); strcpy(str, ""); int i; for(i = 0; i GetNumStreams() - 1) CurrentStream = 0; DisplayStream(); } void SelectStream(void) { PlayStream(CurrentStream); } void StopStream(void) { stop(); //Stop any stream } //Shortcuts to streams in memory void PlayStream1(void) { PlayStream(0); } void PlayStream2(void) { PlayStream(1); } void PlayStream3(void) { PlayStream(2); } void PlayStream4(void) { PlayStream(3); } void PlayStream5(void) { PlayStream(4); } /* SCHEDULER */ void DisplaySchedule(void) { if(GetNumSchedules() == 0) { LcdLine(1, "No schedules"); return; } GetScheduleName(CurrentSchedule, str); sprintf(buf, "~1 %s", str); LcdLine(1, buf); } void ScheduleUp(void) { CurrentSchedule--; if(CurrentSchedule < 0) CurrentSchedule = GetNumSchedules() - 1; DisplaySchedule(); } void ScheduleDown(void) { CurrentSchedule++; if(CurrentSchedule > GetNumSchedules() - 1) CurrentSchedule = 0; DisplaySchedule(); } void DisplaySelectedSchedule(void) { GetScheduleName(CurrentSchedule, str); LcdLine(0, str); GetScheduleTime(CurrentSchedule, str); LcdLine(1, str); GetScheduleTime(CurrentSchedule, buf); sprintf(str, "%s%s", buf, (GetScheduleOn(CurrentSchedule) == 1 ? " ON" : " OFF") ); LcdLine(1, str); } void ToggleSelectedSchedule(void) { ToggleScheduleOn(CurrentSchedule); DisplaySelectedSchedule(); } /* ALARMS */ void DisplayAlarm(void) { if(GetNumAlarms() == 0) { LcdLine(1, "No alarms"); return; } GetAlarmName(CurrentAlarm, str); sprintf(buf, "~1 %s", str); LcdLine(1, buf); } void AlarmUp(void) { CurrentAlarm--; if(CurrentAlarm < 0) CurrentAlarm = GetNumAlarms() - 1; DisplayAlarm(); } void AlarmDown(void) { CurrentAlarm++; if(CurrentAlarm > GetNumAlarms() - 1) CurrentAlarm = 0; DisplayAlarm(); } void DisplaySelectedAlarm(void) { GetAlarmName(CurrentAlarm, str); LcdLine(0, str); GetAlarmTime(CurrentAlarm, buf); sprintf(str, "%s%s", buf, (GetAlarmOn(CurrentAlarm) == 1 ? " ON" : " OFF") ); LcdLine(1, str); } void ToggleSelectedAlarm(void) { ToggleAlarmOn(CurrentAlarm); DisplaySelectedAlarm(); } //Keep backlight on or off void DisplayLightOFF(void) { SetBacklight(0); } void DisplayLightON(void) { SetBacklight(1); } //Save all the settings to eeprom when exiting the settings menu void ExitSettings(void) { SaveSettings(); } /* Alarm Management */ void AlarmStartedRinging(void) { navigateToMenu(100); //Navigate to the alarm menu when an alarm started ringing } void AlarmStoppedRinging(void) { navigateToMenu(HOME); //Navigate back home when an alarm times out } void UpdateCurrentAlarm(void) { if(CurrentAlarmDisplay < 3) strcpy(str, "[OK] to snooze"); else strcpy(str, "[ESC] to stop"); LcdLine(1, str); CurrentAlarmDisplay++; if(CurrentAlarmDisplay > 5) CurrentAlarmDisplay = 0; } void DisplayCurrentAlarm(void) { GetCurrentAlarmName(buf); sprintf(str, "~2%s", buf); LcdLine(0, str); UpdateCurrentAlarm(); } /* Snooze settings */ void DisplaySnooze(void) { sprintf(buf, "~1 %d Min", GetSnooze()); LcdLine(1, buf); } void SnoozeUp(void) { int i = GetSnooze(); i++; if(i >= 30) i = 30; SetSnooze(i); DisplaySnooze(); } void SnoozeDown(void) { int i = GetSnooze(); i--; if(i <= 1) i = 1; SetSnooze(i); DisplaySnooze(); } /* Sync settings */ void DisplaySync(void) { if(GetSync() == 0) sprintf(buf, "~1 Off"); else sprintf(buf, "~1 %d Min", GetSync()); LcdLine(1, buf); } void SyncUp(void) { int i = GetSync(); i++; if(i >= 60) i = 60; SetSync(i); DisplaySync(); } void SyncDown(void) { int i = GetSync(); i--; if(i <= 0) i = 0; SetSync(i); DisplaySync(); } const MENU_ITEM_STRUCT menu[] = { /* * FIRST TIME SETUP * ITEMS: 1-7 */ // Start setup { 1, //ID &CheckFirstTimeSetup, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 0, //ESC 0, //UP 0, //DOWN 2 //OK }, //Text op het schermpje { "Start Setup", "Press OK" } }, // Set Timezone { 2, //ID &FindTimeZone, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &ChooseTimeZoneUp, //UP &ChooseTimeZoneDown, //DOWN 0L, //LEFT 0L, //RIGHT &ChooseTimeZone, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 0, //ESC 0, //UP 0, //DOWN 3 //OK }, //Text op het schermpje { "Timezone", "Loading...." } }, // Synchronizing { 3, //ID &SyncTimeEntry, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 0, //ESC 0, //UP 0, //DOWN 0 //OK }, //Text op het schermpje { "Synchronizing", " " } }, // Sync Succesfull { 4, //ID &DisplayDateTime, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 0, //ESC 0, //UP 0, //DOWN 7 //OK }, //Text op het schermpje { "HH:MM DD/MM/YYYY", "Sync succesfull" } }, // Sync Failed { 5, //ID &DisplayDateTime, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 0, //ESC 0, //UP 0, //DOWN 7 //OK }, //Text op het schermpje { "HH:MM DD/MM/YYYY", "Sync Failed" } }, // Setup Complete { 7, //ID 0L, //onEntry Pointer 0L, //onActive &FirstTimeSetupComplete, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 0, //ESC 0, //UP 0, //DOWN HOME //OK }, //Text op het schermpje { "Setup Complete", "Press OK" } }, /* * MAIN SCREEN * ITEMS: 8-9 */ // Main Screen (time) { HOME, //ID 0L, //onEntry Pointer &UpdateTimeDisplay, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN &VolumeDown, //LEFT &VolumeUp, //RIGHT 0L, //OK &PlayStream1, //ONE &PlayStream2, //TWO &PlayStream3, //THREE &PlayStream4, //FOUR &PlayStream5, //FIVE &StopStream, //ALT //Navigating, ID's of menu on button press { 0, //ESC 9, //UP 9, //DOWN 10 //OK }, //Text op het schermpje { "HH:MM:SS", "" } }, // Main Screen (date) { 9, //ID 0L, //onEntry Pointer &UpdateDateDisplay, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN &VolumeDown, //LEFT &VolumeUp, //RIGHT 0L, //OK &PlayStream1, //ONE &PlayStream2, //TWO &PlayStream3, //THREE &PlayStream4, //FOUR &PlayStream5, //FIVE &StopStream, //ALT //Navigating, ID's of menu on button press { 0, //ESC 8, //UP 8, //DOWN 10 //OK }, //Text op het schermpje { "DD/MM/YYYY", "" } }, /* * MAIN MENU * ITEMS: 10-14 */ // Main Menu (Music) { STREAMING, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { HOME, //ESC DEVICE, //UP SCHEDULER, //DOWN 15 //OK }, //Text op het schermpje { "Menu", "~1 1.Streaming" } }, // Main Menu (Scheduler) { SCHEDULER, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { HOME, //ESC STREAMING, //UP ALARMS, //DOWN 20 //OK }, //Text op het schermpje { "Menu", "~1 2.Scheduler" } }, // Main Menu (Alarm) { ALARMS, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { HOME, //ESC SCHEDULER, //UP SETTINGS, //DOWN 25 //OK }, //Text op het schermpje { "Menu", "~1 3.Alarms" } }, // Main Menu (Settings) { SETTINGS, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { HOME, //ESC ALARMS, //UP DEVICE, //DOWN 50 //OK }, //Text op het schermpje { "Menu", "~1 4.Settings" } }, // Main Menu (Device) { DEVICE, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { HOME, //ESC SETTINGS, //UP STREAMING, //DOWN 80 //OK }, //Text op het schermpje { "Menu", "~1 5.Device" } }, /* * MUSIC SOURCE * 15-24 */ { 15, //ID &DisplayStream, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &StreamUp, //UP &StreamDown, //DOWN 0L, //LEFT 0L, //RIGHT &SelectStream, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { STREAMING, //ESC 0, //UP 0, //DOWN HOME //OK }, //Text op het schermpje { "Menu/Streaming", "~1 Loading" } }, { 20, //ID &DisplaySchedule, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &ScheduleUp, //UP &ScheduleDown, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SCHEDULER, //ESC 0, //UP 0, //DOWN 21 //OK }, //Text op het schermpje { "Menu/Scheduler", "~1 Loading" } }, { 21, //ID &DisplaySelectedSchedule, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &ToggleSelectedSchedule, //UP &ToggleSelectedSchedule, //DOWN &ToggleSelectedSchedule, //LEFT &ToggleSelectedSchedule, //RIGHT &ToggleSelectedSchedule, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 20, //ESC 0, //UP 0, //DOWN 0 //OK }, //Text op het schermpje { "Loading", "" } }, { 25, //ID &DisplayAlarm, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &AlarmUp, //UP &AlarmDown, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { ALARMS, //ESC 0, //UP 0, //DOWN 26 //OK }, //Text op het schermpje { "Menu/Alarms", "~1 Loading" } }, { 26, //ID &DisplaySelectedAlarm, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &ToggleSelectedAlarm, //UP &ToggleSelectedAlarm, //DOWN &ToggleSelectedAlarm, //LEFT &ToggleSelectedAlarm, //RIGHT &ToggleSelectedAlarm, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 25, //ESC 0, //UP 0, //DOWN 0 //OK }, //Text op het schermpje { "Loading", "" } }, /* * SETTINGS * 50-74 */ { 50, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 90, //UP 51, //DOWN 55 //OK }, //Text op het schermpje { "Menu/Settings", "~1 1.Sound" } }, { 51, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 50, //UP 52, //DOWN 61 //OK }, //Text op het schermpje { "Menu/Settings", "~1 2.Display" } }, { 52, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 51, //UP 53, //DOWN 65 //OK }, //Text op het schermpje { "Menu/Settings", "~1 3.Time/Date" } }, { 53, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 52, //UP 54, //DOWN 70 //OK }, //Text op het schermpje { "Menu/Settings", "~1 4.Snooze" } }, { 54, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 53, //UP 84, //DOWN 75 //OK }, //Text op het schermpje { "Menu/Settings", "~1 5.Reset Device" } }, /* * SETTINGS / SOUND */ { 55, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 50, //ESC 57, //UP 56, //DOWN 58 //OK }, //Text op het schermpje { "Settings/Sound", "~1 1.Volume" } }, { 56, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 50, //ESC 55, //UP 57, //DOWN 59 //OK }, //Text op het schermpje { "Settings/Sound", "~1 2.Bass" } }, { 57, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 50, //ESC 56, //UP 55, //DOWN 60 //OK }, //Text op het schermpje { "Settings/Sound", "~1 3.Treble" } }, { 58, //ID &VolumeDisplay, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &VolumeUp, //UP &VolumeDown, //DOWN &VolumeDown, //LEFT &VolumeUp, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 55, //ESC 0, //UP 0, //DOWN 55 //OK }, //Text op het schermpje { " Volume: ", "" } }, { 59, //ID &BassDisplay, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &BassUp, //UP &BassDown, //DOWN &BassDown, //LEFT &BassUp, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 56, //ESC 0, //UP 0, //DOWN 56 //OK }, //Text op het schermpje { " Bass: ", "", } }, { 60, //ID &TrebleDisplay, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &TrebleUp, //UP &TrebleDown, //DOWN &TrebleDown, //LEFT &TrebleUp, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 57, //ESC 0, //UP 0, //DOWN 57 //OK }, //Text op het schermpje { " Treble:", "", } }, /* * SETTINGS DISPLAY */ { 61, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 51, //ESC 0, //UP 0, //DOWN 62 //OK }, //Text op het schermpje { "Settings/Display", "~1 1.Backlight" } }, { 62, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT &DisplayLightOFF, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 61, //ESC 63, //UP 63, //DOWN 61 //OK }, //Text op het schermpje { "Light always on", "~1 1.NO" } }, { 63, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT &DisplayLightON, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 61, //ESC 62, //UP 62, //DOWN 61 //OK }, //Text op het schermpje { "Light always on", "~1 2.YES" } }, /* * SNOOZE TIME */ { 65, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 53, //ESC 0, //UP 0, //DOWN 70 //OK }, //Text op het schermpje { "Settings/Snooze", "~1 1.Snooze Time" } }, { 70, //ID &DisplaySnooze, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &SnoozeUp, //UP &SnoozeDown, //DOWN &SnoozeDown, //LEFT &SnoozeUp, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 65, //ESC 0, //UP 0, //DOWN 65 //OK }, //Text op het schermpje { "Snooze/Time", "~1 ? Min" } }, /* * FACTORY RESET */ { 75, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 54, //ESC 76, //UP 76, //DOWN 54 //OK }, //Text op het schermpje { "Reset device", "~1 1.NO" } }, { 76, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 54, //ESC 75, //UP 75, //DOWN 77 //OK }, //Text op het schermpje { "Reset device", "~1 2.YES" } }, { 77, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 54, //ESC 78, //UP 78, //DOWN 54 //OK }, //Text op het schermpje { "Are you sure?", "~1 1.NO" } }, { 78, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT &FactoryResetOk, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 54, //ESC 77, //UP 77, //DOWN 0 //OK }, //Text op het schermpje { "Are you sure?", "~1 2.YES" } }, /* * Device */ { 80, //ID &DisplayDeviceID, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { DEVICE, //ESC 0, //UP 0, //DOWN DEVICE //OK }, //Text op het schermpje { "Menu/Device", "ID: " } }, /* * REBOOT DEVICE */ { 84, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 54, //UP 90, //DOWN 85 //OK }, //Text op het schermpje { "Menu/Settings", "~1 6.Reboot device" } }, { 85, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 84, //ESC 86, //UP 86, //DOWN 84 //OK }, //Text op het schermpje { "Reboot device", "~1 1.NO" } }, { 86, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT &Reboot, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 84, //ESC 85, //UP 85, //DOWN 0 //OK }, //Text op het schermpje { "Reboot device", "~1 2.YES" } }, //SYNC SETTINGS { 90, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit &ExitSettings, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { SETTINGS, //ESC 84, //UP 50, //DOWN 91 //OK }, //Text op het schermpje { "Menu/Settings", "~1 7.Web Sync" } }, { 91, //ID 0L, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 90, //ESC 0, //UP 0, //DOWN 92 //OK }, //Text op het schermpje { "Settings/Sync", "~1 1.Sync time" } }, { 92, //ID &DisplaySync, //onEntry Pointer 0L, //onActive 0L, //onExit 0L, //ESC &SyncUp, //UP &SyncDown, //DOWN &SyncDown, //LEFT &SyncUp, //RIGHT 0L, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { 91, //ESC 0, //UP 0, //DOWN 91 //OK }, //Text op het schermpje { "Sync/Time", "~1 ? Min" } }, { 100, //ID &DisplayCurrentAlarm, //onEntry Pointer &UpdateCurrentAlarm, //onActive 0L, //onExit &StopAlarm, //ESC 0L, //UP 0L, //DOWN 0L, //LEFT 0L, //RIGHT &SnoozeAlarm, //OK 0L, //ONE 0L, //TWO 0L, //THREE 0L, //FOUR 0L, //FIVE 0L, //ALT //Navigating, ID's of menu on button press { HOME, //ESC 0, //UP 0, //DOWN HOME //OK }, //Text op het schermpje { "Alarm Ringing", "" } } }; unsigned int curMenuId; unsigned int keyloop_done; unsigned int activeCount; // Let op: confict met display.h ??? typedef enum { LINE1, LINE2 } LCD_LINE_ENUM; THREAD(MenuThread, arg) { NutThreadSetPriority(64); // high prio handleMenu(); printf("[MENU] End of menu thread\n"); NutThreadExit(); for(;;) { NutThreadYield(); } } void InitMenu() //Start the menu thread { NutThreadCreate("Menu", MenuThread, NULL, 256); //handleMenu(); } //Navigate to a menu item from outsite of the menu void navigateToMenu(unsigned int menuID) { printf("[MENU] Navigating from %d to %d\n", curMenuId, menuID); curMenuId = menuID; NutSleep(10); keyloop_done = 1; NutSleep(10); } //Main menu handler void handleMenu(void) { unsigned int idx = 0; //menu item position in struct array unsigned int menuloop_done = 0; //if menu should end unsigned int powerPressed = 0; //Power button timeout keyloop_done = 0; //if key has been pressed unsigned int bl_delay = 0; //backlight timeout curMenuId = 1; //current menu ID activeCount = 0; //counter to activate the onActive function pointer while( !menuloop_done ) { /* Clear display */ LcdClear(); idx = 0; /* Lookup current menuID in the static array of menu items */ while( menu[idx].menuID != curMenuId ) idx++; /* Write the text to the display */ LcdLine(0, menu[idx].txt[0]); LcdLine(1, menu[idx].txt[1]); /* Call the onEntry function */ if( *menu[idx].fp_onEntry ) (*menu[idx].fp_onEntry)(); /* Loop for key events and act according */ while( keyloop_done == 0 ) { /* Call the onActive function */ if(activeCount > 10) { activeCount = 0; if( *menu[idx].fp_onActive ) (*menu[idx].fp_onActive)(); } activeCount++; u_char key = KbGetKey(); switch( key ) { case KEY_ESC: if( *menu[idx].fp_onKeyESC ) (*menu[idx].fp_onKeyESC)(); if(menu[idx].newMenuIdKey[0]) { keyloop_done = 1; curMenuId = menu[idx].newMenuIdKey[0]; } bl_delay = 0; break; case KEY_UP: if( *menu[idx].fp_onKeyUP ) (*menu[idx].fp_onKeyUP)(); if(menu[idx].newMenuIdKey[1]) { keyloop_done = 1; curMenuId = menu[idx].newMenuIdKey[1]; } bl_delay = 0; break; case KEY_DOWN: if( *menu[idx].fp_onKeyDOWN ) (*menu[idx].fp_onKeyDOWN)(); if(menu[idx].newMenuIdKey[2]) { keyloop_done = 1; curMenuId = menu[idx].newMenuIdKey[2]; } bl_delay = 0; break; case KEY_OK: if( *menu[idx].fp_onKeyOK ) (*menu[idx].fp_onKeyOK)(); if(menu[idx].newMenuIdKey[3]) { keyloop_done = 1; curMenuId = menu[idx].newMenuIdKey[3]; } bl_delay = 0; break; case KEY_LEFT: if( *menu[idx].fp_onKeyLEFT ) (*menu[idx].fp_onKeyLEFT)(); bl_delay = 0; break; case KEY_RIGHT: if( *menu[idx].fp_onKeyRIGHT) (*menu[idx].fp_onKeyRIGHT)(); bl_delay = 0; break; case KEY_ALT: if( *menu[idx].fp_onKeyALT) (*menu[idx].fp_onKeyALT)(); bl_delay = 0; break; case KEY_01: if( *menu[idx].fp_onKeyONE) (*menu[idx].fp_onKeyONE)(); bl_delay = 0; break; case KEY_02: if( *menu[idx].fp_onKeyTWO) (*menu[idx].fp_onKeyTWO)(); bl_delay = 0; break; case KEY_03: if( *menu[idx].fp_onKeyTHREE) (*menu[idx].fp_onKeyTHREE)(); bl_delay = 0; break; case KEY_04: if( *menu[idx].fp_onKeyFOUR) (*menu[idx].fp_onKeyFOUR)(); bl_delay = 0; break; case KEY_05: if( *menu[idx].fp_onKeyFIVE) (*menu[idx].fp_onKeyFIVE)(); bl_delay = 0; break; case KEY_POWER: //Reboot if the power button is pressed powerPressed++; if(powerPressed > 5) //0.5 seconds Reboot(); break; default: //No key pressed break; } /* Idle loop function */ /* Backlight switch off */ if(bl_delay >= BL_SWITCH_OFF_DELAY ) { LcdBackLight(LCD_BACKLIGHT_OFF); } else { LcdBackLight(LCD_BACKLIGHT_ON); bl_delay++; } if(GetBacklight() == 1) bl_delay = 0; /* Loop delay */ NutSleep(100); } powerPressed = 0; activeCount = 10; keyloop_done = 0; /* Keypress is handled, call the menu's exit function. */ if( *menu[idx].fp_onExit ) (*menu[idx].fp_onExit)(); NutSleep(250); } }