一种灵活的嵌入式软件架构(四)

2014-11-24 03:26:55 · 作者: · 浏览: 1
lect + 1; } /************************************************************************* * 函数原型: * 功能描述: * 入口参数: * 出口参数: * 返 回 值: *************************************************************************/ void WndDrawMenu(void) { int i; char buf[17]; const char *pmn = pMenuStr + menuTop * 16; DispClr(); for (i=0; i<4; i++) { if (menuTop + i == menuLine) break; memcpy(buf, pmn, 16); buf[16] = '\0'; if (menuSelect == menuTop + i) DispSetStyle(DISP_POSITION | DISP_REVERSE | DISP_7x9); else DispSetStyle(DISP_POSITION | DISP_NORMAL | DISP_7x9); DispString(0, i * 2, buf); pmn += 16; } } /************************************************************************* * 函数原型: * 功能描述: * 入口参数: * 出口参数: * 返 回 值: *************************************************************************/ long WndGetPaseword(int x, int y, char *psw, int len, long qevent) { int pin = 0; long keyevt; char key; char buf[20]; memset(buf, '_', len); buf[len] = '\0'; PSW_INPUT_LOOP: DispString(x, y, buf); keyevt = delay_and_wait_key(0, EXIT_KEY_ALL, 0); if (keyevt == qevent) { psw[0] = '\0'; return keyevt; } switch (keyevt) { case EXIT_KEY_0: key = '0'; break; case EXIT_KEY_1: key = '1'; break; case EXIT_KEY_2: key = '2'; break; case EXIT_KEY_3: key = '3'; break; case EXIT_KEY_4: key = '4'; break; case EXIT_KEY_5: key = '5'; break; case EXIT_KEY_6: key = '6'; break; case EXIT_KEY_7: key = '7'; break; case EXIT_KEY_8: key = '8'; break; case EXIT_KEY_9: key = '9'; break; case EXIT_KEY_COMM: if (pin != 0) { buf[--pin] = '_'; } goto PSW_INPUT_LOOP; break; case EXIT_KEY_ENTER: psw[pin] = 0; return 0; default: goto PSW_INPUT_LOOP; } if (pin != len) { psw[pin] = key; buf[pin] = '*'; pin++; } goto PSW_INPUT_LOOP; }

在软件设计时,如果添加界面和对应的按键处理,很灵活,只需要新添加一个文件就可以了,文件的内容,只需要实现OnPain和对应的OnKey

#include "PageMenu.h"


/*=====================================================
=	
=====================================================*/
const char mainMenuTab[] = /*
1234567890123456*/"\
1. 现场采集     \
2. 数据上传     \
3. 存储状态查询 \
4. 时间设置     \
5. 对比度设置   \
6. 恢复出厂设置 \
7. 关于         ";

/*=====================================================
=	
=====================================================*/
void PageMenuOnPain(void);
void WndMenuOnKey(short key);

const TypePage pageMenu = {PageMenuOnPain, WndMenuOnKey};

/*************************************************************************
* 函数原型:
* 功能描述:
* 入口参数:
* 出口参数:
* 返 回 值:
*************************************************************************/
void PageMenuOnPain(void)
{
	WndMenuInit(mainMenuTab, 7);
}

/*************************************************************************
* 函数原型:
* 功能描述:
* 入口参数:
* 出口参数:
* 返 回 值:
*************************************************************************/
void WndMenuOnKey(short key)
{
	int res;
	
	switch (key)
	{
		case KEY_F1:
		case KEY_ENTER:
			res = WndMenuGetSelet();
			switch (res)
			{
				case 1:
					WndPageSet(&pageSimp);
					break;
				case 2:
					WndPageSet(&pagePclink);
					break;
				case 3:
					WndPageSet(&pageInquire);
					break;
				case 4:
					WndPageSet(&pageRtc);
					break;
				case 5:
					WndPageSet(&pageGray);
					break;
				case 6:
					SPageInit();
					WndPageSet(&pageMenu, 1);
					break;
				case 7:
					WndPageSet(&pageAbout);
					break;
			}
			break;
		case KEY_F2:
		case KEY_F3:
			WndPageSet(&pageMain);
			break;
		case KEY_1:
			WndPageSet(&pageSimp);
			break;
		case KEY_2:
			WndPageSet(&pagePclink);
			break;
		case KEY_3:
			WndPageSet(&pageInquire);
			break;
		case KEY_4:
			WndPageSet(&pageRtc);
			break;
		case KEY_5:
			WndPageSet(&pageGray);
			break;
		case KEY_6:
			SPageInit();
			WndPageSet(&pageMenu, 1);
			break;
		case KEY_7:
			WndPageSet(&pageAbout);
			break;
		case KEY_UP:
			WndMenuSelet(-1);
			break;
		case KEY_DOWN:
			WndMenuSelet(1);
			break;
		case KEY_POWER:
			WndPageSet(&pagePower);
			break;
	}
}

pageMain,pageAbout,pageRtc,pagePclink等文件,他们的结构很类似。都是实现了OnPaint和OnKey函数。
如:pagePclink.c文件内容:
实现了PagePclinkOnPaint和PagePclinOnKey函数.

CommPclink函数是自己想要实现的功能,可以自己定义。

#include "pagePclink.h"

/*=====================================================
=	
=====================================================*/
void PagePclinkOnPaint(void);
void PagePclinOnKey(short key);

const TypePage pagePclink = {PagePclinkOnPaint, PagePclinOnKey};

/*************************************************************************
* 函数原型:
* 功能描述:
* 入口参数:
* 出口参数:
* 返 回 值:
*************************************************************************/
void PagePclink