/* menus.c Defines the default menus the server provides. Also includes the plug-in functions attached to menu items... So far, all menus are static, and not dynamically generated. I'll have to find a way to fix this, since many menu items will be dynamic. (clients connected, screens available, etc...) */ #include #include #include #include "shared/debug.h" #include "drivers/lcd.h" #include "main.h" #include "menus.h" #include "render.h" #include "serverscreens.h" int Shutdown_func (); int System_halt_func (); int Reboot_func (); int Close_func (); int OK_func (); int Time24_func (int input); int Heartbeat_func (int input); int Backlight_func (int input); int Server_screen_func (int input); int Contrast_func (int input); int Backlight_Brightness_func (int input); int Backlight_Off_Brightness_func (int input); int Backlight_Off_func (); int Backlight_On_func (); int Backlight_Open_func (); menu_item main_menu[] = { {"LCDproc", 0, 0}, // Title {"Options", TYPE_MENU, (void *) options_menu}, {"Screens", TYPE_MENU, (void *) screens_menu}, {"Shutdown", TYPE_MENU, (void *) shutdown_menu}, {0, 0, 0}, }; menu_item options_menu[] = { {"OPTIONS", TYPE_TITL, 0}, // Title // "24-hour Time", TYPE_CHEK, (void *)Time24_func, {"Contrast...", TYPE_SLID, (void *) Contrast_func}, {"Backlight", TYPE_MENU, (void *) Backlight_menu}, {"Heartbeat", TYPE_CHEK, (void *) Heartbeat_func}, // { "Backlight...", TYPE_SLID, (void *)Backlight_func}, // "OK", TYPE_FUNC, (void *)OK_func, // "Close Menu", TYPE_FUNC, (void *)Close_func, // "Exit Program", TYPE_FUNC, (void *)Shutdown_func, // "Another Title",TYPE_TITL, 0, // "Main menu?", TYPE_MENU, (void *)main_menu, // "Nothing!", TYPE_FUNC, 0, {0, 0, 0}, }; menu_item screens_menu[] = { {"SCREENS", TYPE_TITL, 0}, // Title {"Server Scr", TYPE_CHEK, (void *) Server_screen_func}, {0, 0, 0}, }; menu_item shutdown_menu[] = { {"Shut Down...", TYPE_TITL, 0}, // Title {"Kill LCDproc", TYPE_FUNC, (void *) Shutdown_func}, {"System halt", TYPE_FUNC, (void *) System_halt_func}, {"Reboot", TYPE_FUNC, (void *) Reboot_func}, {0, 0, 0}, }; menu_item Backlight_menu[] = { {"BACKLIGHT MENU", TYPE_TITL, 0}, // Title {"Brightness...", TYPE_SLID, (void *) Backlight_Brightness_func}, {"\"Off\" Brightness", TYPE_SLID, (void *) Backlight_Off_Brightness_func}, {"Backlight Mode:", TYPE_FUNC, 0}, // Label {" - Off", TYPE_FUNC, Backlight_Off_func}, {" - On", TYPE_FUNC, Backlight_On_func}, {" - Open", TYPE_FUNC, Backlight_Open_func}, {0, 0, 0}, }; /////////////////////////////////////////////////////////////////////// // Plug-in functions for menu items // // Exits the program. int Shutdown_func () { exit_program (0); return MENU_KILL; } // Shuts down the system, if possible int System_halt_func () { int err; uid_t id; id = geteuid (); err = system ("init 0"); if (err < 0) return MENU_KILL; if (err == 127) return MENU_KILL; // If we're root, exit if (id == 0) exit_program (0); // Otherwise, assume shutdown will fail; and show more stats. return MENU_KILL; } // Shuts down the system and restarts it int Reboot_func () { int err; uid_t id; id = geteuid (); err = system ("init 6"); if (err < 0) return MENU_KILL; if (err == 127) return MENU_KILL; // If we're root, exit if (id == 0) exit_program (0); // Otherwise, assume shutdown will fail; and show more stats. return MENU_KILL; } int Close_func () { return MENU_CLOSE; } int OK_func () { return MENU_OK; } int Time24_func (int input) { static int status = 0; if (input == MENU_READ) return status; if (input == MENU_CHECK) status ^= 1; // does something. return (status | MENU_OK); // The status is "or"-ed with the MENU value to let do_menu() // know what to do after selecting the item. (two return // values in one. :) // Also, "MENU_OK" happens to be zero, so it does not matter // unless you want something else (like MENU_CLOSE) } int Heartbeat_func (int input) { if (input == MENU_READ) return (heartbeat != HEART_OFF); if (input == MENU_CHECK) { if (heartbeat) heartbeat = HEART_OFF; else heartbeat = HEART_OPEN; } return ((heartbeat != HEART_OFF) | MENU_OK); } int Backlight_func (int input) { int status = 128; switch (backlight) { case BACKLIGHT_OFF: if (input == MENU_READ) status = 0; if (input == MENU_PLUS) { backlight = BACKLIGHT_OPEN; status = 128; } if (input == MENU_MINUS) { status = 0; } break; case BACKLIGHT_ON: if (input == MENU_READ) status = 255; if (input == MENU_PLUS) { status = 255; } if (input == MENU_MINUS) { backlight = BACKLIGHT_OPEN; status = 128; } break; case BACKLIGHT_OPEN: if (input == MENU_READ) status = 128; if (input == MENU_PLUS) { backlight = BACKLIGHT_ON; backlight_state = BACKLIGHT_ON; status = 255; } if (input == MENU_MINUS) { backlight = BACKLIGHT_OFF; backlight_state = BACKLIGHT_OFF; status = 0; } break; } /* if(input == MENU_READ) return (backlight != BACKLIGHT_OFF); if(input == MENU_CHECK) { if(backlight) backlight = BACKLIGHT_OFF; else backlight = BACKLIGHT_OPEN; } */ lcd.backlight (backlight_state & BACKLIGHT_ON); return (status | MENU_OK); } int Server_screen_func (int input) { if (input == MENU_READ) return (server_screen->priority < 256); if (input == MENU_CHECK) { if (server_screen->priority < 256) server_screen->priority = 256; else server_screen->priority = DEFAULT_SCREEN_PRIORITY; } return (MENU_OK | (server_screen->priority < 256)); } int Contrast_func (int input) { int status; status = lcd.contrast (-1); if (input == MENU_READ) return status; if (input == MENU_PLUS) status += 5; // does something. if (input == MENU_MINUS) status -= 5; // does something. if (status < 0) status = 0; if (status > 255) status = 255; lcd.contrast (status); return (status | MENU_OK); } void server_menu () { debug ("server_menu()\n"); do_menu (main_menu); } int Backlight_Brightness_func (int input) { int status = backlight_brightness; if (input == MENU_READ) return status; if (input == MENU_PLUS) status += 5; // does something. if (input == MENU_MINUS) status -= 5; // does something. if (status < 0) status = 0; if (status > 255) status = 255; lcd.backlight (status); backlight_brightness = status; return (status | MENU_OK); } int Backlight_Off_Brightness_func (int input) { int status = backlight_off_brightness; if (input == MENU_READ) return status; if (input == MENU_PLUS) status += 5; // does something. if (input == MENU_MINUS) status -= 5; // does something. if (status < 0) status = 0; if (status > 255) status = 255; lcd.backlight (status); backlight_off_brightness = status; return (status | MENU_OK); } int Backlight_Off_func () { backlight_state = BACKLIGHT_OFF; backlight = BACKLIGHT_OFF; lcd.backlight (backlight_off_brightness); return MENU_OK; } int Backlight_On_func () { backlight_state = BACKLIGHT_ON; backlight = BACKLIGHT_ON; lcd.backlight (backlight_brightness * (backlight_state & BACKLIGHT_ON)); return MENU_OK; } int Backlight_Open_func () { backlight = BACKLIGHT_OPEN; return MENU_OK; }