mirror of
https://github.com/vicliu624/trail-mate.git
synced 2026-08-14 06:39:45 +00:00
5.0 KiB
5.0 KiB
UI Shared / IDF 迁移计划
这份文档用于说明:如何把 UI 逻辑从各个 apps/* 中抽离出来,沉淀到可复用的 shared 层,并同时兼容 PlatformIO 与 ESP-IDF 两套入口。
1. 目标
1.1 总目标
- 把通用 UI 页面、shell、controller、runtime 接口集中到
modules/ui_shared - 让
apps/esp_pio与apps/esp_idf只保留各自平台入口、启动流程和适配器 - 避免 shared UI 直接依赖 Arduino 或 ESP-IDF 具体实现细节
1.2 迁移原则
- 页面结构、交互和状态逻辑优先沉淀到 shared 层
- 平台差异收敛到
platform/*和 app runtime adapter - 同一个页面不要在 PIO / IDF 各维护一份实现
- 对暂时无法共享的能力,用 capability-gated fallback 占位
2. 分层边界
2.1 modules/ui_shared
承载:
- page shell
- 页面组件
- controller / presenter
- runtime 抽象接口
- 通用 fallback 页面
不应直接依赖:
<Arduino.h><Preferences.h>nvs.h- 具体板级 API
2.2 apps/esp_pio / apps/esp_idf
承载:
- startup / boot
- menu / app catalog 入口
- loop 驱动
- 生命周期管理
- facade / runtime adapter 装配
2.3 platform/*
承载:
- 设备能力实现
- 屏幕 / 睡眠 / 音频 / GPS / 存储等平台 API
- Arduino 与 IDF 各自的 contract 实现
3. 当前状态(截至 2026-03-11)
3.1 已经共享的页面骨架
已经迁到 shared shell + runtime/components/controller 的页面:
SettingsChatGPS / MapGNSS Sky PlotContactsTeamTrackerPC LinkUSBSSTVProtocol Probe(internal route:energy_sweep)Walkie Talkie
3.2 apps 侧现状
apps/esp_pio/src 和 apps/esp_idf/src 已经逐步收敛到以下职责:
startup_runtime.cpploop_runtime.cppapp_runtime_access.cppapp_registry.cpp
其中 esp_idf 还包含:
runtime_config.cppapp_facade_runtime.cppidf_entry.cppidf_component_anchor.cpp
3.3 已完成的清理
- 一批旧的 IDF retired stub 已移除
modules/ui_shared里的ui_common_stub.cpp/ui_status_stub.cpp已显著收缩apps/esp_pio/src下保留的ui_*.cpp多数只剩 wrapper 职责
4. 分阶段计划
阶段 0:盘点与止血
目标
- 先明确哪些页面已经 shared,哪些还残留 app 私有实现
- 停止新增重复页面实现
交付
- 页面归属清单
- app 私有 wrapper 清单
- shared shell 缺口清单
阶段 1:apps 入口收敛
目标
把 apps/esp_pio 和 apps/esp_idf 收敛成“启动 + loop + runtime 接线”。
任务
- 把
app_catalog/menu/startup/loop对齐到 shared 模式 - 清理
apps/esp_pio中历史页面 wrapper / registry 特例 - 收敛
app_runtime_access的生命周期与运行时访问 - 统一
esp_pio/esp_idf的 startup / loop / event 驱动模式
完成标准
- 两端 app 目录不再承载具体 UI 逻辑
- app 入口能稳定驱动 shared app catalog / shared shell
阶段 2:页面共享完成
目标
把页面层真正统一到 shared:
- shell
- host
- fallback
- components / controller / runtime
任务
- 补齐 shared
shell + components/runtime - 移除 app 侧残留页面逻辑
- 统一 app catalog 与 shared page shell 的接线
- 对缺失能力使用 capability-gated fallback
完成标准
- 页面结构只在
modules/ui_shared维护 - fallback 行为一致
- app 侧不再复制页面实现
阶段 3:平台能力抽象完成
目标
把 shared UI 依赖的设备能力全部收敛到 adapter contract。
需要抽象的能力
- restart
- kv / config persistence
- screen sleep
- tone / audio preview
- GPS runtime control
- tracker recording hook
- hostlink / USB capability hook
- walkie / sstv / lora support
落点
- Arduino 实现在
platform/esp/arduino_common - IDF 实现在
platform/esp/idf_common与apps/esp_idf/*runtime
完成标准
modules/ui_shared不再直接包含 ESP 专有头文件- shared 只依赖平台 contract
阶段 4:配置与 profile 收敛
目标
把设备 profile、视觉尺寸、能力差异统一到 runtime config / page profile。
重点
tab5tdeckpager
要求
- topbar、高度、间距、图标卡片等由 shared profile 驱动
- 板级差异不散落在页面代码里
5. 风险点
- shared 页面已经完成结构迁移,但 runtime hook 仍可能带有平台耦合
- PIO / IDF 两套入口的生命周期节奏不完全一致,容易出现事件顺序差异
- fallback 如果设计过弱,短期内会掩盖真实缺口
- profile 还未彻底统一前,不同设备上可能继续出现布局分叉
6. 验收标准
modules/ui_shared成为页面 UI 的唯一事实源apps/esp_pio与apps/esp_idf主要负责启动和装配- 平台差异只出现在
platform/*与 runtime adapter - 新页面默认先落到 shared,而不是 app 私有目录