diff --git a/work-order/wo-05 b/work-order/wo-05 index 0eef6f4..0ede523 100644 --- a/work-order/wo-05 +++ b/work-order/wo-05 @@ -9,7 +9,7 @@ 1. 开机启动瞬间背光应保持关闭,等所有初始化都完成、即将进入 `while(1)` 主循环前才点亮,避免开机闪烁。 2. 长按 KEY_CONFIRM 打开主菜单后,10 秒内无任何按键操作,自动关闭菜单返回时钟界面。 -3. 二级子菜单(传感器类型选择,`menu_level=1`)下,长按 KEY_CONFIRM 目前无法关闭菜单,需要补上。 +3. 按 App 重新梳理菜单导航结构:menu_app 只保留 4 个入口(语言开关内置于 menu_app,其余 3 项各自跳转到独立的 App),每个子 App 统一用长按 CONFIRM 退出、回到自己的父 App,而不是像现在这样有的退回上一级、有的直接跳回主菜单/首页,规则不统一。 4. 默认菜单语言改为英文(目前首次开机/Flash 擦除态默认是法语)。 5. 主菜单上下键切换菜单项允许循环切换(到顶/底后可以绕到另一端)。 6. P3.6 进入休眠前改成电平触发方式作为唤醒源,现在经常唤醒不了处理器。 @@ -31,10 +31,35 @@ - `MenuApp_onEvent()` 每收到一次按键事件就刷新这个时间戳。 - 需要一个周期性检查点:目前 AppManager 框架没有 `OnTick`/`OnUpdate` 回调,需要确认要不要新增一个,或者简单地在 `main.c` 的 `while(1)` 里,当前台 App 是 `menu_app` 时调用一个新增的 `MenuApp_CheckIdleTimeout()`。超时后调用 `AppManager_SwitchToForeground(&clock_app)`。 -### 3. 子菜单长按 CONFIRM 关闭菜单 +### 3. 按 App 重新梳理菜单导航结构 -- `App/app_menu.c` 的 `menu_level == 1` 分支(第 156-189 行)目前只处理了 `KEY_EVENT_DOWN_LONG`(退回 `menu_level=0`),没有处理 `KEY_EVENT_CONFIRM_LONG`。 -- 参照同文件 `menu_level == 2` 分支的写法,在 `menu_level == 1` 里加一段 `KEY_EVENT_CONFIRM_LONG` 处理,直接 `AppManager_SwitchToForeground(&clock_app)` 整个退出菜单(而不是只退一级)。 +**现状问题**:`app_menu.c` 用一个 `menu_level`(0/1/2)在单个 App 内部模拟出三层菜单,其中 `menu_level=1` 短按 CONFIRM 会切换到独立的 `pair_app`;`pair_app` 退出时又统一调用 `AppManager_SwitchToForeground(&menu_app)`,而 `MenuApp_OnStart()`/`MenuApp_onClose()` 都会无条件把 `menu_level` 清零——导致不管从哪个子菜单退出,最后都被强制拉回顶层主菜单,退出规则不统一,也不符合"退出到上一级"的预期。时间设置(`Start_Time_Edit()`)则是另一套模式:混在 `clock_app` 内部用 `time_edit_active` 标志位实现,进入时还要先 `AppManager_SwitchToForeground(&clock_app)` 闪一下正常时钟画面再叠加编辑界面,也是一处潜在的画面闪烁点。 + +**改造方向 —— 统一按 App 组织,父子关系一致、退出手势一致**: + +| App | 现状 | 改造后 | +|---|---|---| +| `home_app`(时钟主页) | 即现有 `clock_app`,兼管时间编辑(`time_edit_active`) | 建议更名/定位为 `home_app`;剥离时间编辑逻辑,只保留待机时钟显示与布撤防 | +| `menu_app`(主菜单) | 内部 `menu_level` 0/1/2 三态,语言开关 + 传感器子菜单 + 摄像头绑定全挤在一个 App 里 | 只保留顶层 4 项列表(语言开关内置处理,不跳转);其余 3 项短按 CONFIRM 各自切到独立 App | +| `time_set_app`(时间设置) | 不是独立 App,是 `clock_app` 内的一个模式标志 | 新建独立 App,从 `clock_app` 抽出 `Start_Time_Edit`/`time_edit_*` 相关代码 | +| `pair_app`(传感器配对) | 已经是独立 App,但传感器类型选择这一步(门磁/PIR/烟感/气感/水浸)现在留在 `menu_app` 的 `menu_level=1` 里,选完才切到 `pair_app` 开始搜索 | 把类型选择合并成 `pair_app` 的新初始状态(比如 `PAIR_STATE_SELECT_TYPE`,排在现有 `PAIR_STATE_WAIT` 之前),`menu_app` 上"传感器配对"这一项短按 CONFIRM 直接整体切到 `pair_app`;`pair_app` 不管在哪个状态退出,都统一回到 `menu_app` | +| `ipc_bind_app`(摄像头绑定) | 不是独立 App,是 `menu_app` 内 `menu_level=2` 的一段代码(呼吸灯+定时发射绑定帧) | 新建独立 App,仿照 `pair_app` 的结构抽出来 | + +**统一导航规则**: +- `home_app` 长按 CONFIRM → 进入 `menu_app`。 +- `menu_app` 长按 CONFIRM → 回到 `home_app`(现有行为,不变)。 +- `menu_app` 顶层短按 CONFIRM 选中某一项 → 进入对应子 App(`time_set_app`/`pair_app`/`ipc_bind_app`)。 +- 三个子 App 无论是长按 CONFIRM 主动退出、还是完成/超时自动退出(`pair_app` 的成功/失败/取消),都统一 → 回到 `menu_app`(它们共同的父 App),不再有"直接跳回首页"或"退到某个具体层级"的特殊情况。 + +**需要新增/修改的文件**: +- 新建 `App/app_time_set.c`:把 `app_clock.c` 里的 `time_edit_active`/`time_edit_field`/`time_edit_blink_on`/`Start_Time_Edit()`/相关按键处理整体搬过去,退出(短按 CONFIRM 保存 或 长按退出)统一改为 `AppManager_SwitchToForeground(&menu_app)`。 +- 新建 `App/app_ipc_bind.c`:把 `app_menu.c` 里 `menu_level==2` 的呼吸灯效果、`EV1527_Transmit` 绑定广播、`last_bind_tx_ms` 计时都搬过去,退出统一改为 `AppManager_SwitchToForeground(&menu_app)`。 +- 精简 `App/app_menu.c`:去掉 `menu_level` 状态机(改名为更贴切的命名,比如干脆去掉,只保留 `menu_select` 这一个 0~3 的顶层索引),短按 CONFIRM 按 `menu_select` 分支跳转到三个子 App 或原地切语言。 +- 精简 `App/app_clock.c`:去掉时间编辑相关代码,长按 CONFIRM 改为切到 `menu_app`(不变)。 +- `App/app_manager.h`(或对应头文件):新增 `APP_ID_TIME_SET`/`APP_ID_IPC_BIND` 等新 App 的枚举值与 `extern WristbandApp` 声明。 +- `wristband.uvproj`:新增 `App/app_time_set.c`、`App/app_ipc_bind.c` 两个源文件条目。 + +**待确认的行为变化**:现在"时间设置"短按 CONFIRM 保存后,是直接回到时钟主页;改造后按统一规则会回到 `menu_app`(主菜单)而不是直接回时钟——这是一个和现状不一样的地方,需要确认是否符合预期,还是希望时间设置作为特例、保存后也直接回首页。 ### 4. 默认语言改英文 @@ -44,9 +69,9 @@ ### 5. 菜单上下循环切换 -- `App/app_menu.c` 里两处 UP/DOWN 边界判断都要改: - - `menu_level == 0`(第 106-121 行,4 项,索引 0~3) - - `menu_level == 1`(第 158-172 行,5 项,索引 0~4) +- 涉及两处 UP/DOWN 边界判断(若第 3 条的 App 化重构先落地,第二处会搬到 `pair_app` 里,但改法一样): + - `App/app_menu.c` 顶层菜单(现第 106-121 行,4 项,索引 0~3) + - 传感器类型选择(现在是 `app_menu.c` 的 `menu_level==1`,第 158-172 行;重构后是 `pair_app` 的 `PAIR_STATE_SELECT_TYPE`,5 项,索引 0~4) - 现在是 `if (menu_select > 0) menu_select--;` / `if (menu_select < MAX) menu_select++;`,到边界就不动;改成到边界时绕到另一端,例如 UP 在 `menu_select==0` 时跳到 `MAX`,DOWN 在 `menu_select==MAX` 时跳回 `0`。 ### 6. P3.6 休眠前改电平触发唤醒