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

📄 menu.c

📁 深圳优龙公司LPC2148开发板(与iar公司开发板基本相同)的原理图和配套样例程序
💻 C
字号:
/*************************************************************************
 *
 *    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;
}

⌨️ 快捷键说明

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