⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.c

📁 MSP acquires data and sends through USB to PC. Check the link for PC capture software and project d
💻 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 + -