| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- /*************************************************************************
- *
- * Used with ICCARM and AARM.
- *
- * (c) Copyright IAR Systems 2003
- *
- * File name : main.c
- * Description : Define main module
- *
- * History :
- * 1. Data : Feb 10, 2005
- * Author : Stanimir Bonev
- * Description : Create
- *
- * $Revision: 1.1 $
- **************************************************************************/
- //#include "user_func.h"
- #include "includes.h"
- #include "menu_table.c"
- typedef struct
- {
- MENU_EVENT_TYPE_DEF * Push;
- MENU_EVENT_TYPE_DEF * Pop;
- MENU_EVENT_TYPE_DEF EventStackBuffer [MENU_EVENT_STACK_SIZE]; /* Hold enevts */
- } EVENT_STACK_DEF;
- #define MENU_EVET_STACK_EMPTY (LPC_BOOL)0 /* Event stack is empty */
- #define MENU_EVET_STACK_DATA_VALID (LPC_BOOL)1 /* Event stack data valid */
- EVENT_STACK_DEF EventStack;
- const MENU_VISUAL_DEF *const * LanguageBaseAdd;
- MEMU_IND_DEF MenuInd;
- MEMU_TIME_OUT_DEF MenuTO;
- /*************************************************************************
- * Function Name: MenuStackInit
- * Parameters: None
- * Return: none
- * Description: Initialize menu event stack structure
- *
- *************************************************************************/
- void MenuStackInit ()
- {
- EventStack.Push = EventStack.Pop = EventStack.EventStackBuffer;
- }
- /*************************************************************************
- * Function Name: MenuShow
- * Parameters: MEMU_STING_DEF *pVarData
- * Return: MENU_ERROR_CODE_DEF
- * MENU_OK 0: sucess
- * MENU_LANG_ERROR 1: fail not valid language
- * MENU_IND_ERROR 2: fail not valid menu index
- * MENU_SHOW_OUT_OF_VISUAL 4: fail String out of visual space
- * MENU_SHOW_ERROR 5: fail Error into LCD driver module
- * Description: Show current visual chain to LCD
- *
- *************************************************************************/
- MENU_ERROR_CODE_DEF MenuShow (MEMU_STING_DEF *pVarData)
- {
- MENU_VISUAL_DEF * pData = (MENU_VISUAL_DEF *)*(LanguageBaseAdd+MenuInd);
- MEMU_STING_DEF DataStr[MENU_MAX_STR_LENG];
- MEMU_STING_DEF * pDataHold = NULL;
- MEMU_STING_DEF * pDestData;
- const MEMU_STING_DEF * pSourceData;
- LPC_INT8U Result = MENU_OK;
- if (MenuInd > MENU_MAX_INDEX-1)
- {
- return MENU_IND_ERROR;
- }
- else if (pVarData == NULL)
- {
- return (MENU_ERROR_CODE_DEF) Result;
- }
- else
- {
- while (pData->MenuText) {
- pSourceData = pData->MenuText;
- pDestData = DataStr;
- while(*pSourceData || (pDataHold != NULL))
- {
- switch (*pSourceData)
- {
- case END_OF_STR:
- pVarData = (char *)++pSourceData;
- pSourceData = pDataHold;
- pDataHold = NULL;
- break;
- case VARIABLE_DATA:
- if((pVarData != NULL) && (*pVarData))
- {
- pDataHold = (char *)++pSourceData;
- pSourceData = pVarData;
- }
- else
- {
- pVarData = NULL;
- }
- break;
- case END_OF_VAR_DATA:
- if(pDataHold != NULL)
- {
- pVarData = (char *)++pSourceData;
- pSourceData = pDataHold;
- pDataHold = NULL;
- }
- else
- {
- ++pSourceData;
- }
- break;
- default:
- if((pDestData - DataStr) >= MENU_MAX_STR_LENG-1) break;
- *pDestData = *pSourceData;
- ++pDestData;++pSourceData;
- break;
- }
- }
- *pDestData = 0;
- Result = HD44780_StrShow(pData->X,pData->Y,(LPC_INT8S const *)DataStr);
- switch (Result)
- {
- case HD44780_BUSY_TO_ERROR:
- case HD44780_ERROR:
- return MENU_SHOW_ERROR;
- case HD44780_OUT_OF_VISUAL:
- Result = MENU_SHOW_OUT_OF_VISUAL;
- }
- ++pData;
- }
- }
- return (MENU_ERROR_CODE_DEF) Result;
- }
- /*************************************************************************
- * Function Name: MenuInit
- * Parameters: MENU_LANG_TYPE_DEF Language,
- * MEMU_IND_DEF MainMenuInd,
- * MEMU_STING_DEF *pVarData,
- * MEMU_TIME_OUT_DEF MenuTO_Init
- * Return: MENU_ERROR_CODE_DEF
- * MENU_OK 0: sucess
- * MENU_LANG_ERROR 1: fail not valid language
- * MENU_IND_ERROR 2: fail not valid menu index
- * MENU_SHOW_OUT_OF_VISUAL 4: fail String out of visual space
- * MENU_SHOW_ERROR 5: fail Error into LCD driver module
- * MENU_TO_ERROR 6: fail Menu tome out is to long
- * Description: Initialize Menu
- *
- *************************************************************************/
- MENU_ERROR_CODE_DEF MenuInit (MENU_LANG_TYPE_DEF Language,
- MEMU_IND_DEF MainMenuInd, MEMU_STING_DEF *pVarData, MEMU_TIME_OUT_DEF MenuTO_Init)
- {
- /* Init Menu Events stack */
- MenuStackInit();
- if (Language > MENU_LANGUAGE_NUMBER-1)
- {
- return MENU_LANG_ERROR;
- }
- LanguageBaseAdd = MenuLanguageBaseAddTable[Language];
- if (MainMenuInd > MENU_MAX_INDEX-1)
- {
- return MENU_IND_ERROR;
- }
- MenuInd = MainMenuInd;
- if (MenuTO_Init > MEMU_MAX_TIME_OUT)
- {
- return MENU_TO_ERROR;
- }
- MenuTO = MenuTO_Init;
- return MenuShow(pVarData);
- }
- /*************************************************************************
- * Function Name: MenuGetEvent
- * Parameters: MENU_EVENT_TYPE_DEF * MenuEvent
- * Return: LPC_BOOL
- * MENU_EVET_STACK_EMPTY 0: Event stack is empty not valid data
- * MENU_EVET_STACK_DATA_VALID 1: Event stack is not empty valid data
- * Description: Pop menu event from stack
- *
- *************************************************************************/
- LPC_BOOL MenuGetEvent (MENU_EVENT_TYPE_DEF * MenuEvent)
- {
- if (EventStack.Pop == EventStack.Push)
- {
- return MENU_EVET_STACK_EMPTY;
- }
- /* Function MenuSetEvent is reentrant */
- *MenuEvent = *EventStack.Pop;
- __disable_interrupt();
- if (++EventStack.Pop == EventStack.Push)
- {
- MenuStackInit();
- }
- __enable_interrupt();
- return MENU_EVET_STACK_DATA_VALID;
- }
- /*************************************************************************
- * Function Name: MenuSetEvent
- * Parameters: MENU_EVENT_TYPE_DEF MenuEvent
- * Return: MENU_ERROR_CODE_DEF
- * MENU_OK 0: Push Event to stack
- * MENU_EVET_STACK_OVERFLOW 3: Stack overflow
- * Description: Push menu event to stack
- *
- *************************************************************************/
- MENU_ERROR_CODE_DEF MenuSetEvent (MENU_EVENT_TYPE_DEF MenuEvent)
- {
- if (EventStack.Push == &EventStack.EventStackBuffer[MENU_EVENT_STACK_SIZE])
- {
- return MENU_EVET_STACK_OVERFLOW;
- }
- *EventStack.Push = MenuEvent;
- ++EventStack.Push;
- return MENU_OK;
- }
- /*************************************************************************
- * Function Name: Menu
- * Parameters: none
- * Return: MENU_ERROR_CODE_DEF
- * MENU_OK 0: Push Event to stack
- * MENU_EVET_STACK_OVERFLOW 3: Stack overflow
- * Description: Implenet menu function, pop menu event and determinate actions,
- * set new visual chain, call to User function ..
- *
- *************************************************************************/
- MENU_ERROR_CODE_DEF Menu ()
- {
- MENU_EVENT_TYPE_DEF MenuEvent;
- MENU_ACTION_SHAIN_DEF * pMenuActionChain;
- MEMU_STING_DEF DataStr[MENU_MAX_STR_LENG];
- MEMU_STING_DEF * pDestData = DataStr;
- const MEMU_STING_DEF * pSourceData;
- LPC_BOOL ShowUpdate = FALSE;
- MENU_ERROR_CODE_DEF Result = MENU_OK;
- if(MenuGetEvent(&MenuEvent) == MENU_EVET_STACK_DATA_VALID)
- {
- /* Menu time out implement */
- if (MenuEvent == MENU_TICK_EVENT)
- {
- if (MenuTO)
- {
- if(--MenuTO)
- {
- return Result;
- }
- }
- else
- {
- return Result;
- }
- }
- /* Menu action time out implement */
- pMenuActionChain = (MENU_ACTION_SHAIN_DEF *)MenuActionChainAdd[MenuInd];
- while(pMenuActionChain->EventType)
- {
- if(pMenuActionChain->EventType != MenuEvent)
- {
- ++pMenuActionChain;
- }
- else
- {
- break;
- }
- }
- if (pMenuActionChain->MenuIndex)
- {
- if (MenuInd != pMenuActionChain->MenuIndex)
- {
- ShowUpdate = TRUE;
- MenuInd = pMenuActionChain->MenuIndex;
- }
- }
- if(pMenuActionChain->pVarArg != NULL)
- {
- ShowUpdate = TRUE;
- pSourceData = pMenuActionChain->pVarArg;
- while(*pSourceData)
- {
- *pDestData=*pSourceData;
- ++pSourceData;++pDestData;
- }
- }
- if (pMenuActionChain->MenuTO != MENU_TIME_OUT_NOT_UPADATE)
- {
- MenuTO = pMenuActionChain->MenuTO;
- }
- if(pMenuActionChain->UserFunc != NULL)
- {
- ShowUpdate = TRUE;
- pMenuActionChain->UserFunc(DataStr,&MenuInd,&MenuTO);
- }
- if (ShowUpdate)
- {
- Result = MenuShow(DataStr);
- if(pMenuActionChain->UserFunc1 != NULL)
- {
- pMenuActionChain->UserFunc1(DataStr,&MenuInd,&MenuTO);
- }
- }
- }
- return Result;
- }
- /*************************************************************************
- * Function Name: MenuGetInd
- * Parameters: none
- * Return: MENU_EVENT_TYPE_DEF
- *
- * Description: Return current menu index
- *
- *************************************************************************/
- MENU_EVENT_TYPE_DEF MenuGetInd(void)
- {
- return MenuInd;
- }
- /*************************************************************************
- * Function Name: MenuGetActionChain
- * Parameters: MEMU_IND_DEF MenuInd
- * Return: MENU_ACTION_SHAIN_DEF *
- *
- * Description: Return pointer to stucture of action chain
- *
- *************************************************************************/
- MENU_ACTION_SHAIN_DEF * MenuGetActionChain(MEMU_IND_DEF MenuInd)
- {
- if (MenuInd > MENU_MAX_INDEX-1)
- {
- return (void *)0;
- }
- return (MENU_ACTION_SHAIN_DEF *)MenuActionChainAdd[MenuInd];
- }
- /*************************************************************************
- * Function Name: MenuGetVisualChain
- * Parameters: MENU_LANG_TYPE_DEF Language,
- * MEMU_IND_DEF MenuInd
- * Return: MENU_VISUAL_DEF *
- *
- * Description: Return pointer to stucture of visual chain
- *
- *************************************************************************/
- MENU_VISUAL_DEF * MenuGetVisualChain(MENU_LANG_TYPE_DEF Language,MEMU_IND_DEF MenuInd)
- {
- if ((MenuInd < MENU_MAX_INDEX) && (Language < MENU_LANGUAGE_NUMBER))
- {
- return (MENU_VISUAL_DEF *)(*MenuLanguageBaseAddTable[Language]+MenuInd);
- }
- return (MENU_VISUAL_DEF *)0;
- }
|