📄 mcugui.c
字号:
/*
* Filename : mcugui.c
* Author : Li Dawen
* Copyright (c): Coslight Group .co
* Create Date : 2002.04.27
* Version : 0.1.0
*/
#define MCUGUI_MODULE
#include "config.h"
//#include "includes.h"
//#include "mcugui.h"
//#include "module.h"
//#include "save.h"
//#include "lcd.h"
//#include "resource.h"
//#include "dialog.h"
//#ifdef OS_CMX
// #include "cxfuncs.h"
// #include "hard.h"
// #include "eeprom.h"
//#endif
//#ifdef OS_PMX
// #include "pxfuncs.h"
// #include "pxconfig.h"
//#endif
#define IDLE_CYC 800/(TICK_SIZE*2)
GUIMSGQ MsgQ;
uint timeoutflag;
int Lcd_LampDelay = 0;
uchar MsgQueueBuf[GUIMSGBUF_SIZE];
int KeyMsgCount = 0;
int TimerCount[10];
int TimerFull[10];
/*****************************************************************************/
/* init and quit function */
void InitGUI(void)
{
uchar i;
LcdInit();
TimerInit();
for (i = 0; i < 10; i++)
{
TimerCount[i] = -TimerFull[i];
}
MsgQ.msgbuf = MsgQueueBuf;
MsgQ.head = 0;
MsgQ.tail = 0;
MsgQ.count = 0;
Gui.active_win = 0;
Gui.win_status = 0;
Gui.active_ctrl = 0;
Gui.page_topy = 0;
Gui.ctrl_top = 0;
Gui.ctrl_bottom = 4;
Gui.ctrl_last = 4;
Gui.quit = 0;
TimeTick();
// LoadWin(10); //first win
LoadWin(42); //port frame menu
}
void QuitGUI(void)
{
LcdClose();
}
/*****************************************************************************/
/* GUI window manage function */
uchar GetMsg(GUIMSG* msg)
{
/* get key status*/
uchar keycode;
OSTimeDlyHMSM(0,0,0,5);//cxtwAtm(TICK_SIZE);//delay 改为系统延时
if (kbhit())
{
//on lamp
LcdOnLamp();
// PostMsg(MSG_TSTART, 1);
TimerAct(1, MSG_TSTART);
Lcd_LampDelay = 0;
BeepSet(4);
keycode = (uchar)getch();
if (keycode == KEY_F4)
{
Gui.quit = 1;
}
else
{
PostMsg(MSG_KEY, keycode);
}
}
/* get msg from msg Queue*/
if (MsgQ.count)
{
msg->type = MsgQ.msgbuf[MsgQ.head++];
msg->data = MsgQ.msgbuf[MsgQ.head++];
MsgQ.count--;
if (MsgQ.head >= GUIMSGBUF_SIZE)
{
MsgQ.head = 0;
}
return TRUE;
}
else
{
msg->type = MSG_IDLE;
msg->data = 0;
return FALSE;
}
}
void PostMsg(uchar type, uchar data)
{
if (MsgQ.count < GUIMSG_COUNT)
{
// avoid in a row MSG
if ((MsgQ.last_type == type) && (MsgQ.last_data == data))
{
return;
}
MsgQ.msgbuf[MsgQ.tail++] = type;
MsgQ.msgbuf[MsgQ.tail++] = data;
MsgQ.last_type = type;
MsgQ.last_data = data;
if (MsgQ.tail >= GUIMSGBUF_SIZE)
{
MsgQ.tail = 0;
}
MsgQ.count++;
}
else
{
Gui.err = ERR_MSGBUFOVER;
}
}
void SendMsg(uchar type, uchar data)
{
Win[Gui.active_win].proc(type, data);
}
int GuiPop(void)
{
if (Gui.stack_top > 0)
{
return Gui.stack_buf[Gui.stack_top--];
}
else
{
Gui.err = 1;
return 0;
}
}
void GuiPush(int value)
{
if (Gui.stack_top < 9*8)
{
Gui.stack_buf[++Gui.stack_top] = value;
}
else
{
Gui.stack_top = 9;
}
}
int GuiStack(void)
{
return Gui.stack_top;
}
void LoadWin(int index)
{
int i;
if (Gui.active_win == index)
{
LcdCls();
PostMsg(MSG_PAINT, 0xFF);
return;
}
GuiPush(Gui.active_win);
GuiPush(Gui.win_status);
GuiPush(Gui.active_ctrl);
GuiPush(Gui.page_topy);
GuiPush(Gui.ctrl_top);
GuiPush(Gui.ctrl_bottom);
GuiPush(Gui.ctrl_last);
GuiPush(Gui.page);
GuiPush(Gui.max_page);
Gui.active_win = index;
Gui.win_status = Win[index].style;
Gui.active_ctrl= 0;
Gui.page_topy = 0;
Gui.ctrl_top = 0;
i = 0;
while (1)
{
if (Win[index].controls[i].y < 8)
{
Gui.ctrl_bottom = i;
}
if (Win[index].controls[i].type & CTRL_END)
{
Gui.ctrl_last = i;
break;
}
i++;
}
Gui.page = 0;
if (Win[Gui.active_win].style & WS_PAGESCROLL)
{
Gui.max_page = Win[index].controls[Gui.ctrl_last].y/8;
}
else
{
Gui.max_page = Win[index].controls[Gui.ctrl_last].y/2;
}
LcdWinStyle(Win[Gui.active_win].style);
PostMsg(MSG_INIT, 0);
MoveFocus(FOCUS_HOME);
LcdCls();
PostMsg(MSG_PAINT, 0xFF);
if (Win[Gui.active_win].style & BS_NOFOCUS)
{
Gui.win_status = 0;
LcdCursorSize(0);
}
else
{
if (Gui.win_status&WS_EDITON)
{
LcdCursorSize(8);
}
else
{
LcdCursorSize(0);
}
}
}
void CloseWin(void)
{
Gui.page = 0;
Gui.max_page = 0;
if (GuiStack() > 9)
{
Gui.max_page = GuiPop();
Gui.page = GuiPop();
Gui.ctrl_last = GuiPop();
Gui.ctrl_bottom = GuiPop();
Gui.ctrl_top = GuiPop();
Gui.page_topy = GuiPop();
Gui.active_ctrl = GuiPop();
Gui.win_status = GuiPop();
Gui.active_win = GuiPop();
LcdWinStyle(Win[Gui.active_win].style);
}
LcdCls();
if (Gui.win_status&WS_EDITON)
{
LcdCursorSize(8);
}
else
{
LcdCursorSize(0);
}
PostMsg(MSG_PAINT, 0xFF);
}
/*****************************************************************************/
void MainGUIProc()
{
GUIMSG msg;
InitGUI();
LcdCls();
do {
if (GetMsg(&msg))
Win[Gui.active_win].proc(msg.type, msg.data);
// else
// PostMsg(MSG_PAINT, 0xFF);
if (Gui.quit)
break;
}while(TRUE);
}
/**/
void DefaultWinProc(uchar msg_type, uchar msg_data)
{
// int i;
const CONTROL *ctrl;
ctrl = &Win[Gui.active_win].controls[Gui.active_ctrl];
switch (msg_type)
{
case MSG_KEY:
if (Gui.win_status&WS_EDITON)
{
switch (ctrl->type&MASK_CTRLTYPE)
{
case CTRL_EDIT: EditCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
case CTRL_LIST: ListCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
default: break;
}
}
else
{
switch (msg_data)
{
case KEY_HELP:
if (Win[Gui.active_win].tag[0])
{
HelpBox("", Win[Gui.active_win].tag, 0);
}
else if (Win[Gui.active_win].style & BS_NOFOCUS)
{
HelpBox("", HelpText[2], 0);
}
else
{
// HelpBox("", HelpText[11], 0);
switch (ctrl->type&MASK_CTRLTYPE)
{
case CTRL_EDIT: EditCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
case CTRL_LIST: ListCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
case CTRL_BUTTON: ButtonCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
default: break;
}
}
break;
case KEY_OK:
switch (ctrl->type&MASK_CTRLTYPE)
{
case CTRL_EDIT: EditCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
case CTRL_LIST: ListCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
case CTRL_BUTTON: ButtonCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
default: break;
}
break;
case KEY_ESC: PostMsg(MSG_CLOSE, 0); break;
case KEY_UP:
//PostMsg(MSG_FOCUSMOVE, FOCUS_PREV);
MoveFocus(FOCUS_PREV);
break;
case KEY_DOWN:
//PostMsg(MSG_FOCUSMOVE, FOCUS_NEXT);
MoveFocus(FOCUS_NEXT);
break;
case KEY_LEFT:
//PostMsg(MSG_FOCUSMOVE, FOCUS_HOME);
MoveFocus(FOCUS_HOME);
break;
case KEY_RIGHT:
//PostMsg(MSG_FOCUSMOVE, FOCUS_END);
MoveFocus(FOCUS_END);
break;
case KEY_DATA: PostMsg(MSG_LOAD, 62); break;
default: break;
}
PostMsg(MSG_PAINT, 0xFF);
}
break;
case MSG_LOAD: LoadWin(msg_data); break;
case MSG_CLOSE: CloseWin(); break;
case MSG_CLS: LcdCls(); break;
case MSG_INIT: break;
case MSG_COMMAND: CommandProc(msg_data); break;
case MSG_SCROLLUP: SrcollUp(); break;
case MSG_SCROLLDOWN: SrcollDown(); break;
case MSG_FOCUSMOVE:
MoveFocus(msg_data);
PostMsg(MSG_PAINT, 0xFF);
break;
case MSG_UPDATA:
if (msg_data == 0xFF)
{
LcdUpdate();
}
break;
case MSG_PAINT:
WinPaint(msg_type, msg_data);
break;
case MSG_SAVE:
break;
case MSG_TIMER:
if (msg_data == TIME_CHANGE_SEC)
{
PostMsg(MSG_PAINT, 0xFF);
}
TimerProc(msg_data);
break;
case MSG_TPLAY:
case MSG_TSTART:
case MSG_TSTOP:
case MSG_TOUT:
case MSG_TRELOAD:
TimerAct( msg_data, msg_type);
break;
case MSG_IDLE:
GuiIdle();
break;
case MSG_NULL:
break;
default:
break;
}
}
/*****************************************************************************/
void WinPaint(uchar msg_type, uchar msg_data)
{
int i;
const CONTROL *ctrl;
ctrl = &Win[Gui.active_win].controls[Gui.active_ctrl];
if (msg_data == 0xFF)
{
if ( (Win[Gui.active_win].style & ES_NOCAPTION) == 0 && (Gui.page_topy == 0))
{
TextOut(0, 0, Win[Gui.active_win].caption, FONT_DEFAULT);
}
for (i = Gui.ctrl_top; i <= Gui.ctrl_bottom; i++)
{
switch (Win[Gui.active_win].controls[i].type&MASK_CTRLTYPE)
{
case CTRL_EDIT: EditCtrlProc(i, MSG_PAINT, 0); break;
case CTRL_BUTTON: ButtonCtrlProc(i, MSG_PAINT, 0); break;
case CTRL_LIST: ListCtrlProc(i, MSG_PAINT, 0); break;
case CTRL_GRID: GridCtrlProc(i, MSG_PAINT, 0); break;
case CTRL_CLOCK: ClockCtrlProc(i, MSG_PAINT, 0); break;
case CTRL_BMP: BmpCtrlProc(i, MSG_PAINT, 0); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -