Files
C-RK/week 3/menu.c
T
2016-03-30 22:54:22 +02:00

2523 lines
35 KiB
C

#include <stdio.h>
#include "keyboard.h"
#include "display.h"
#include "settings.h"
#include <string.h>
#include <sys/timer.h>
#include <sys/thread.h>
#include <dev/nicrtl.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <net/route.h>
#include <pro/dhcp.h>
#include <pro/sntp.h>
#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<volume; i++)
{
strcat(str, "-");
NutSleep(2);
}
LcdLine(1, str);
}
void VolumeUp(void)
{
SetVolume(GetVolume() + 16);
VolumeDisplay();
}
void VolumeDown(void)
{
SetVolume(GetVolume() - 16);
VolumeDisplay();
}
void TrebleDisplay(void){
sprintf(buf, "Treble: %d", GetTreble());
LcdLine(0, buf);
strcpy(str, "");
int i;
for(i = 0; i<GetTreble(); i++)
{
strcat(str, "-");
NutSleep(2);
}
LcdLine(1, str);
}
void TrebleUp(void){
SetTreble(GetTreble()+1);
TrebleDisplay();
}
void TrebleDown(void){
SetTreble(GetTreble()-1);
TrebleDisplay();
}
void BassDisplay(void){
sprintf(buf, "Bass: %d", GetBass());
LcdLine(0, buf);
strcpy(str, "");
int i;
for(i = 0; i<GetBass(); i++)
{
strcat(str, "-");
NutSleep(2);
}
LcdLine(1, str);
}
void BassUp(void){
SetBass(GetBass()+1);
BassDisplay();
}
void BassDown(void){
SetBass(GetBass()-1);
BassDisplay();
}
/*
DEVICE
*/
void DisplayDeviceID(void)
{
char str[6];
GetDeviceID(str);
sprintf(buf, "ID: %s", str);
LcdLine(1, buf);
}
/*
STREAMS
*/
void DisplayStream(void)
{
if(GetNumStreams() == 0) //No streams in memory
{
LcdLine(1, "No streams");
return;
}
GetStreamName(CurrentStream, str); //Display the selected stream
sprintf(buf, "~1~6 %s", str);
LcdLine(1, buf);
}
void StreamUp(void)
{
CurrentStream--;
if(CurrentStream < 0)
CurrentStream = GetNumStreams() - 1;
DisplayStream();
}
void StreamDown(void)
{
CurrentStream++;
if(CurrentStream > 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);
}
}