LVGL 页面
↓
UI Action / Controller
↓
应用服务
↓
驱动、协议、存储
无消息队列
按钮触发推送事件
static void button_clicked(lv_event_t *event)
{
(void)event;
AppAction_Post(APP_ACTION_START_MOTOR); //开启电机事件
}
事件处理函数
专门负责处理事件,所有的事件都有此进行分发。状态机的状态也在这里进行修改。
void AppAction_Process(const AppAction *action)
{
switch (action->type) {
case APP_ACTION_START_MOTOR: //接收到该事件进行处理
Motor_Start();
break;
}
}
有消息队列结合状态机
一般使用Freertos的queue,不用自己写消息队列。
GUI层
gui/
├─ screens/ 页面
├─ components/ 可复用控件
├─ navigation/ 页面路由
├─ model/ UI 显示状态
├─ actions/ 用户操作
├─ theme/ 样式
├─ assets/ 字体图片
└─ port/ 显示与输入适配
services/
├─ storage/
├─ camera/
├─ measurement/
├─ network/
└─ settings/
-
只有 GUI 任务调用 LVGL;
-
其他任务通过队列发送状态;
-
页面不阻塞等待硬件;
-
页面不保存硬件状态;
-
动态页面按需创建和销毁;
-
图片、字体和缓存统一管理。