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

📄 menu.c

📁 通过车载终端采集GPS数据
💻 C
字号:
#include "typedef.h"
#include "global.h"
#include "menu.h"
#include "menuinterface.h"
#include "playsound.h"

/************************MenuProcess()函数的说明*****************************/
/*****MenuProcess()为菜单处理程序,main()函数中每隔一段时间对它进行调用,
由每个菜单的处理程序pMenu->function获取按键值,处理程序的返回值为
CHANGE_MENU, NEXT_MENU, PREVIEW_MENU, LEFT_MENU,RIGHT_MENU,
MenuProcess()根据这些返回值来管理菜单,作出相应的操作*****************/

/*******************************************
  pMenu->function返回值为CHANGE_MENU时,结构指针仍然指向自己,MenuProcess不操作
  pMenu->function返回值为NEXT_MENU时,NowMenuPtr指向son,处理下级菜单
  pMenu->function返回值为PREVIEW_MENU时,NowMenuPtr指向father,处理上级菜单
  pMenu->function返回值为RIGHT_MENU时,NowMenuPtr--,处理同级右菜单
  pMenu->function返回值为LEFT_MENU时,NowMenuPtr++,处理同级左菜单
**********************************************/

static MENU *pMenu;     /*当前菜单指针*/
MENU_INFO menuInfo;

void meunInit(MENU *pInitMenu, int holdTime, void *funcScroll, void *funcBackLight)
{

    menuInfo.floorCnt = 0;
    pMenu = pInitMenu;
    menuInfo.Father[0] = pInitMenu;

    menuInfo.holdTime = holdTime;
    menuInfo.returnTimer = 0;

    menuInfo.ptrScroll = funcScroll;
    menuInfo.ptrBackLight = funcBackLight;

    (pMenu->function)(1);

    menuInfo.rebrushLcd = FLASH_SCREEN;
    menuInfo.MenuPopReturnFlag = 1;
}

MENU *menu_select(MENU *menuPtr, unsigned char index)
{
    MENU *pTmp;
    unsigned char i;

    if( menuPtr == NULL )
        return menuPtr;

    pTmp = menuPtr;
    menuInfo.rebrushLcd = FLASH_SCREEN;
    while(pTmp->function != NULL)
    {
        pTmp --;
    }

    for(i=0; i<index; i++)
    {
        pTmp ++;
        if( pTmp->function == NULL )
            break;
    }

    if( pTmp->function == NULL )
        return menuPtr;
    else
        return pTmp;
}

/*主程序调用的菜单处理指针*/
void MenuProcess(void)
{
    char status;
    MENU *pTmp;

    /*指针出错时,显示错误信息*/
    if( pMenu->function == NULL )
    {
        return;     /*xhb pMenu = menu_null;*/
    }

    /*显示滚动条*/
    if( (menuInfo.rebrushLcd == FLASH_SCREEN) && (menuInfo.ptrScroll != NULL) )
    {
        pTmp = pMenu - 1;
        if( (pTmp->function==NULL) || (pMenu->son==NULL) )
            menuInfo.ptrScroll(0);
        else
            menuInfo.ptrScroll(1);      /*向上标记*/

        pTmp = pMenu + 1;
        if( (pTmp->function==NULL) || (pMenu->son==NULL) )
            menuInfo.ptrScroll(0);
        else
            menuInfo.ptrScroll(2);      /*向下标记*/
    }

    /*按键菜单显示函数*/
    status = (pMenu->function)(menuInfo.rebrushLcd); /*执行菜单,返回按键值*/

    /*菜单层之间切换*/
    switch(status)
    {
        case NOKEY_MENU:             
        default:
            menuInfo.rebrushLcd = KEEP_SCREEN;

            menuInfo.returnTimer ++;
            //背光处理
            if (menuInfo.returnTimer >= 200)
                menuInfo.ptrBackLight(0);
            if( menuInfo.returnTimer >= menuInfo.holdTime )
            {
                menuInfo.returnTimer = 0;
 //               menuInfo.ptrBackLight(0);

                if (0 == menuInfo.floorCnt)
//                pMenu = menuInfo.Father[0];
                    menuInfo.rebrushLcd = FLASH_SCREEN;
            }
            break;

        case NOCHANGE_MENU:/*无操作*/
/*            if( menuInfo.floorCnt == 0 )
            {
                menuInfo.returnTimer ++;
                if( menuInfo.returnTimer >= menuInfo.holdTime )
                {
                    menuInfo.returnTimer = 0;
                    menuInfo.ptrBackLight(0);
                }
            }
            else
                menuInfo.returnTimer = 0;*/
            menuInfo.ptrBackLight(1);
            menuInfo.returnTimer = 0;

            menuInfo.rebrushLcd = KEEP_SCREEN;
           // tts("msga", 4);//原有的按键音
            play_littlespeaker(LITTLESPEAKER_KEY);
            break;
            
        case NEXT_MENU:/*enter*/
        case NEXT_MENU1:/*enter*/
        case NEXT_MENU2:/*enter*/
        case NEXT_MENU3:/*enter*/
        case NEXT_MENU4:/*enter*/
            menuInfo.returnTimer = 0;

            /*背光控制程序*/
            if( menuInfo.ptrBackLight != NULL )
            {
                menuInfo.ptrBackLight(1);
            }
            

            if(pMenu->son != NULL)
            {
                menuInfo.Father[menuInfo.floorCnt] = pMenu;
                menuInfo.floorCnt ++;

                if( status == NEXT_MENU2 )
                    pMenu = menu_select(pMenu->son, 2);
                else if( status == NEXT_MENU3 )
                    pMenu = menu_select(pMenu->son, 3);
                else if( status == NEXT_MENU4 )
                    pMenu = menu_select(pMenu->son, 4);
                else
                    pMenu = menu_select(pMenu->son, 1);

                menuInfo.rebrushLcd = FLASH_SCREEN;
            }
    //        tts("msga", 4);//原有的按键音
            play_littlespeaker(LITTLESPEAKER_KEY);
            break;

    
        case PREVIEW_MENU:/*esc*/
            menuInfo.returnTimer = 0;

            /*背光控制程序*/
            if( menuInfo.ptrBackLight != NULL )
            {
                menuInfo.ptrBackLight(1);
            }

            if( menuInfo.floorCnt > 0 )
            {   
                menuInfo.floorCnt --;
                pMenu = menuInfo.Father[menuInfo.floorCnt];
                menuInfo.MenuPopReturnFlag = 1;
                menuInfo.rebrushLcd = FLASH_SCREEN;
            }
       //     tts("msga", 4);//原有的按键音
            play_littlespeaker(LITTLESPEAKER_KEY);
            break;
    
        case LEFT_MENU:/*left/up*/
            menuInfo.returnTimer = 0;

            /*背光控制程序*/
            if( menuInfo.ptrBackLight != NULL )
            {
                menuInfo.ptrBackLight(1);
            }

            pTmp = pMenu - 1;
            if(pTmp->function != NULL)
            {
                pMenu = pTmp;
                menuInfo.rebrushLcd = FLASH_SCREEN;
            }
          //  tts("msga", 4);//原有的按键音
            play_littlespeaker(LITTLESPEAKER_KEY);
            break;
    
        case RIGHT_MENU:/*right/down*/
            menuInfo.returnTimer = 0;

            /*背光控制程序*/
            if( menuInfo.ptrBackLight != NULL )
            {
                menuInfo.ptrBackLight(1);
            }

            pTmp = pMenu + 1;
            if(pTmp->function != NULL)
            {
                pMenu = pTmp;
                menuInfo.rebrushLcd = FLASH_SCREEN;
            }
        //    tts("msga", 4);//原有的按键音
            play_littlespeaker(LITTLESPEAKER_KEY);
            break;
    }
}

/*弹出菜单程序处理*/
void menuPopUp(MENU *pMenuPop)
{
    if( menuInfo.MenuPopReturnFlag == 1 )
    {
        openLight();
        menuInfo.Father[menuInfo.floorCnt] = pMenu;
        menuInfo.floorCnt++;

        pMenu = pMenuPop;
        menuInfo.MenuPopReturnFlag = 0;

        (pMenu->function)(1);
    }
}


/********************************************
*背光打开函数,在收到自动报站的时候被调用
*********************************************/
void openLight()
{
    menuInfo.returnTimer = 0;

    /*背光控制程序*/
    if( menuInfo.ptrBackLight != NULL )
    {
        menuInfo.ptrBackLight(1);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -