📄 menu.c
字号:
/* * File: menu.c * Purpose: Menu functions * Author: Peter Ivanov * Modified by: * Created: 2007-05-19 11:31:29 * Last modify: 2007-10-03 20:19:46 ivanovp {Time-stamp} * Copyright: (C) Peter Ivanov, 2007 * Licence: GPL *//** * \file menu.c * \brief Menu functions * \author Peter Ivanov */#include <string.h>#include "menu.h"#include "lcd.h"#include "font.h"//#define __DEBUG__ 1static menuPoint_t* currentMenu;static uint16_t currentMenuOffset; // displaying of menu items start from 'offset'static uint16_t currentMenuNumber; // number of selected menu itemstatic uint16_t currentMenuSize; // number of menu items in actual menu pointstatic uint8_t currentMenuLevel;static menuPoint_t* parentMenu[MENU_MAX_LEVEL];static uint16_t parentMenuNumber[MENU_MAX_LEVEL];static uint16_t parentMenuOffset[MENU_MAX_LEVEL];static uint16_t normalTextFgColor = MENU_DEFAULT_NORMAL_TEXT_FG_COLOR;static uint16_t normalTextBgColor = MENU_DEFAULT_NORMAL_TEXT_BG_COLOR;static uint16_t folderTextFgColor = MENU_DEFAULT_FOLDER_TEXT_FG_COLOR;static uint16_t folderTextBgColor = MENU_DEFAULT_FOLDER_TEXT_BG_COLOR;static uint16_t highlightedTextFgColor = MENU_DEFAULT_HIGHLIGHTED_TEXT_FG_COLOR;static uint16_t highlightedTextBgColor = MENU_DEFAULT_HIGHLIGHTED_TEXT_BG_COLOR;static uint16_t disabledTextFgColor = MENU_DEFAULT_DISABLED_TEXT_FG_COLOR;static uint16_t disabledTextBgColor = MENU_DEFAULT_DISABLED_TEXT_BG_COLOR;static uint8_t x = MENU_DEFAULT_X;static uint8_t y = MENU_DEFAULT_Y;void MENU_printMenu ();void MENU_printMenuItem (int8_t menuNumber);void MENU_printNormalMenuItem (int8_t menuNumber);void MENU_printHighlightMenuItem (int8_t menuNumber);uint8_t MENU_getMenuSize (menuPoint_t* menu);// maximum number of items to print#define MENU_MAX_MENU_ITEMS_LCD LCD_HEIGHT / FONT_HEIGHTvoid MENU_init (menuPoint_t* rootMenu){ uint16_t i; currentMenu = rootMenu; currentMenuOffset = 0; currentMenuNumber = 0; currentMenuLevel = 0; for (i = 0; i < MENU_MAX_LEVEL; i++) { parentMenu[i] = NULL; parentMenuNumber[i] = 0; parentMenuOffset[i] = 0; } currentMenuSize = MENU_getMenuSize (currentMenu); MENU_printMenu ();}uint16_t MENU_getMenuFgColor (uint16_t menuNumber){ uint16_t fgColor = disabledTextFgColor; if (currentMenu[menuNumber].subMenu) { fgColor = folderTextFgColor; } else if (currentMenu[menuNumber].menuHandlerCallback) { fgColor = normalTextFgColor; } return fgColor;}uint16_t MENU_getMenuBgColor (uint16_t menuNumber){ uint16_t bgColor = disabledTextBgColor; if (currentMenu[menuNumber].subMenu) { bgColor = folderTextBgColor; } else if (currentMenu[menuNumber].menuHandlerCallback) { bgColor = normalTextBgColor; } return bgColor;}void MENU_printMenu (){ uint16_t i; LCD_setXY (x, y); for (i = currentMenuOffset; i < currentMenuSize && i < currentMenuOffset + MENU_MAX_MENU_ITEMS_LCD; i++) { if (i == currentMenuNumber) { LCD_setColor (highlightedTextFgColor, highlightedTextBgColor); } else { LCD_setColor (MENU_getMenuFgColor (i), MENU_getMenuBgColor (i)); } LCD_printf ("%-16s", currentMenu[i].menuTitle); }} void MENU_printMenuItem (int8_t menuNumber){ if (menuNumber - currentMenuOffset < MENU_MAX_MENU_ITEMS_LCD) { LCD_setXY (x, y + (menuNumber - currentMenuOffset) * FONT_HEIGHT); LCD_printf ("%-16s", currentMenu[menuNumber].menuTitle); }}void MENU_printNormalMenuItem (int8_t menuNumber){ LCD_setColor (MENU_getMenuFgColor (menuNumber), MENU_getMenuBgColor (menuNumber)); MENU_printMenuItem (currentMenuNumber);}void MENU_printHighlightMenuItem (int8_t menuNumber){ LCD_setColor (highlightedTextFgColor, highlightedTextBgColor); MENU_printMenuItem (currentMenuNumber);}uint8_t MENU_getMenuSize (menuPoint_t* menu){ uint8_t i; for (i = 0; i < MENU_MAX_MENU_ITEMS && menu[i].menuTitle; i++); return i;}void MENU_handler (KBD_buttonPressed_t buttonPressed){ if (buttonPressed & KBD_UP) { if (currentMenuNumber > 0) { if (currentMenuOffset > 0 && currentMenuNumber - currentMenuOffset == 0) { // TODO: screen scroll currentMenuOffset--; currentMenuNumber--; MENU_printMenu (); } else { MENU_printNormalMenuItem (currentMenuNumber); currentMenuNumber--; MENU_printHighlightMenuItem (currentMenuNumber); } } } if (buttonPressed & KBD_DOWN) { if (currentMenuNumber < currentMenuSize - 1) { if (currentMenuNumber - currentMenuOffset > MENU_MAX_MENU_ITEMS_LCD - 2) { // TODO: screen scroll currentMenuOffset++; currentMenuNumber++; MENU_printMenu (); } else { MENU_printNormalMenuItem (currentMenuNumber); currentMenuNumber++; MENU_printHighlightMenuItem (currentMenuNumber); } } } if (buttonPressed & KBD_QUIT) { if (currentMenuLevel > 0) { // Leave submenu currentMenuLevel--; currentMenu = parentMenu[currentMenuLevel]; currentMenuNumber = parentMenuNumber[currentMenuLevel]; currentMenuOffset = parentMenuOffset[currentMenuLevel]; currentMenuSize = MENU_getMenuSize (currentMenu); LCD_clear (); MENU_printMenu (); } } if (buttonPressed & KBD_OK) { if (currentMenu[currentMenuNumber].subMenu) { // Enter to submenu if (currentMenuLevel < MENU_MAX_LEVEL) { parentMenu[currentMenuLevel] = currentMenu; parentMenuNumber[currentMenuLevel] = currentMenuNumber; parentMenuOffset[currentMenuLevel] = currentMenuOffset; currentMenuLevel += 1; currentMenu = currentMenu[currentMenuNumber].subMenu; currentMenuNumber = 0; currentMenuSize = MENU_getMenuSize (currentMenu); LCD_clear (); MENU_printMenu (); } else { LCD_setColor (highlightedTextFgColor, highlightedTextBgColor); LCD_setXY (0, LCD_HEIGHT - FONT_HEIGHT - 1); LCD_printf ("Too many menu!"); //UART_printf ("%s(): internal error: too many menu levels!\r\n"); } } else if (currentMenu[currentMenuNumber].menuHandlerCallback) { // Call callback function LCD_clear (); (currentMenu[currentMenuNumber].menuHandlerCallback) (); LCD_clear (); MENU_printMenu (); } else { // Nothing to do! //LCD_setColor (highlightedTextFgColor, highlightedTextBgColor); //LCD_setXY (0, LCD_HEIGHT - FONT_HEIGHT - 1); //LCD_printf ("Nothing to do!"); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -