状态机可以有效去耦合,只谈GUI的时序也完全无障碍。
状态图:
设计初衷为单状态,因而没有多状态迁移。
事件源有3个:数据更新/超时(时基)/设置包,至于触摸或键盘的输入,我把它作为内部事务,由GUI内部处理。
它响应图中3个事件,进而更新显示界面。
实现说明(细节没有列出):
[mw_shl_code=c,true]static QState GUI_Display_GUI(GUI_Display * const me, QEvt const * const e) {
switch (e->sig) {
case Q_ENTRY_SIG: {
/* emWin初始化 */
break;
}
case DATA_UPDATE_SIG: {
/* 更新数据,界面更新驱动 */[/mw_shl_code]
[mw_shl_code=c,true] }
case TIMEOUT_SIG:{
/* 调用GUI运行API */
break;
}
case SETTING_RCV_SIG: {
/* 收到设置包,提取并保存 */
break;
}
default: {
break;
}
}
return status_;
}[/mw_shl_code]
1.入口事件触发初始化;
2.超时事件,最频繁,调用GUI_Exec()/GUI_Scan_Keyboard()等代码作为时基驱动GUI工作,通常为50Hz;
3.数据更新事件,数据由GUI保存,必要时可通过它触发实时界面刷新;
4.设置变更事件,触发非界面产生的配置变更,比如通信接口发来的命令。
总的来说,GUI外部事务非常清楚,可以集中精力于内部代码设计。
|