1、按键驱动重构:从GPIO中断改为iot_button组件,支持BOOT/KEY2的单击/双击/长按6种事件; 2、新增按键导航管理器(key_nav):9种上下文状态机,统一分发按键事件到对应界面业务逻辑; 3、BLE模块改造:广播默认关闭由按键触发,新增设备间图片传输(GATT Client),支持扫描配对→MTU协商→分包发送; 4、新增6个UI界面:配对(Peiwang)、更新(Update)、发送等待(ImageShar)、接收等待(ImageReception)、发送中(Sharing)、接收中(Receiving); 5、新增电池指示器组件(battery_ui):支持多界面真实电量显示,3秒渐隐效果; 6、Home界面重构:移除手势事件,改为airhub背景图+电池指示器; 7、Img界面重构:移除触摸事件,新增删除二次确认边框机制; 8、禁用ScreenSet/ScreenChar界面(保留文件),禁用触摸初始化(保留代码可恢复); 9、sleep_mgr简化:移除ScreenSet亮度UI依赖,按键唤醒由key_nav统一处理; 10、新增9张图片资源(airhub背景、配对、传输状态、电池图标等); Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.9 KiB
6.9 KiB
按键版电子吧唧(ESP32-S3)功能变更总结
项目背景
本项目从触摸屏版 Dzbj_ESP32_S3 复制而来,将触摸手势操作全面替换为两键(BOOT + KEY2)按键控制,适配非触摸屏硬件。
一、按键驱动重构
1.1 iot_button 组件集成
- 文件:
main/button/button.c,main/button/include/button.h - 变更: 从原始 GPIO ISR 轮询改为 ESP Component Registry 的
iot_button组件 - 新接口: 6 种事件回调注册(BOOT/KEY2 × 单击/双击/长按)
- 参数优化: 长按阈值 1200ms,双击检测窗口 300ms
1.2 依赖添加
- 文件:
main/idf_component.yml - 新增:
button: ">=3.2.0"依赖
二、按键导航管理器(key_nav)
2.1 新建模块
- 文件:
main/key_nav/key_nav.c,main/key_nav/include/key_nav.h - 功能: 根据当前界面上下文(nav_context_t)分发 BOOT/KEY2 的单击/双击/长按事件
2.2 导航上下文状态机
NAV_CTX_HOME → Home 界面
NAV_CTX_IMG → 图片浏览
NAV_CTX_IMG_DELETE → 删除确认(第一步)
NAV_CTX_IMG_DELETE_CONFIRM→ 删除二次确认(第二步)
NAV_CTX_PEIWANG → APP 蓝牙配对
NAV_CTX_UPDATE → 更新界面
NAV_CTX_IMAGE_SHAR → 发送方等待配对
NAV_CTX_IMAGE_RECEPTION → 接收方等待配对
NAV_CTX_SHARING → 发送方传输中
NAV_CTX_RECEIVING → 接收方接收中
2.3 按键功能映射
| 界面 | BOOT 单击 | BOOT 双击 | BOOT 长按 | KEY2 单击 | KEY2 双击 | KEY2 长按 |
|---|---|---|---|---|---|---|
| Home | → Img | - | - | 开蓝牙→配对 | → 接收等待 | 初始化图片列表→分享等待 |
| Img | 下一张 | 上一张 | 删除确认 | → Home | → 接收等待 | → 分享等待 |
| 删除确认 | 显示白色边框→二次确认 | - | - | 取消 | - | - |
| 二次确认 | 执行删除 | - | - | 取消 | - | - |
| 配对/分享等待/接收等待 | 取消→Home | - | - | 取消→Home | - | - |
| 更新/传输中/接收中 | 不响应 | - | - | 不响应 | - | - |
2.4 关键设计
- 所有 iot_button 回调通过
xTaskCreate派发到独立任务(避免阻塞 esp_timer) - 屏幕关闭状态下任意按键仅唤醒屏幕,不触发业务逻辑
- 切图时自动显示电池指示器
三、BLE 模块改造
3.1 BLE 按需启停
- 文件:
main/ble/ble.c,main/ble/include/ble.h - 新增接口:
ble_start()/ble_stop()/ble_is_active() - 行为: 开机默认不广播,KEY2 单击后才启动;退出配对界面自动关闭
3.2 BLE 设备间图片传输
- 新建文件:
main/ble/ble_transfer.c,main/ble/include/ble_transfer.h - 功能: GATT Client/Server 模式的设备间图片传输
- 流程:
- 发送方: 启动扫描 → 发现接收设备 → 连接 → GATT 写入图片数据
- 接收方: 启动广播 → 等待连接 → 接收图片数据 → 保存到 SPIFFS
3.3 传输后处理
- APP 传图(通过已有 BLE 服务)→ 自动跳转 Update 界面 → 完成后显示 Img
- 设备间传图完成 → 自动跳转 Img 显示传输的图片 + 关闭蓝牙
- 扫描未发现接收设备 → 保持分享界面,等待用户手动退出
- 图片发送失败 → 自动切换回 Img 界面
四、UI 界面变更
4.1 新增 4 个分享/接收界面
| 界面 | 文件 | 用途 | 图片 |
|---|---|---|---|
| ScreenImageShar | ui_ScreenImageShar.c/.h |
发送方等待配对 | image_shar_png (260×300) |
| ScreenImageReception | ui_ScreenImageReception.c/.h |
接收方等待配对 | image_reception_png (260×300) |
| ScreenSharing | ui_ScreenSharing.c/.h |
发送方传输中 | sharing_png (260×310) |
| ScreenReceiving | ui_ScreenReceiving.c/.h |
接收方接收中 | receiving_png (260×310) |
4.2 Img 界面删除确认重设计
- ContainerDle: 220×220 半透明黑色正圆容器,底部对齐 + 向下偏移 120px(露出顶部约 100px)
- 删除图标: S13 图片(48×48)居中于 68×68 正圆容器 (ui_ImageDel)
- 两步确认: 第一次按 BOOT → 显示白色正圆边框;第二次按 BOOT → 执行删除
- 取消: KEY2 单击隐藏容器 + 重置边框
4.3 手势事件移除
- 移除 ScreenHome、ScreenImg、ScreenPeiwang、ScreenUpdate 的手势回调
- ScreenImg 保留
LV_EVENT_SCREEN_LOADED延迟加载逻辑
4.4 ScreenSet 界面禁用
- CMakeLists.txt 注释掉编译
- ui.h / ui.c 注释掉相关 include 和初始化
五、电池指示器重设计
5.1 显示策略
- 文件:
main/ui/battery_ui.c,main/ui/battery_ui.h - 适用界面: 仅 Home 和 Img
- 触发时机: 进入 Home/Img 界面、切换图片时
- 显示时长: 2 秒后自动渐隐(500ms fade-out 动画)
5.2 实现方式
- 药丸形容器(50×20,黑色背景,圆角 10)悬浮于屏幕顶部
- 电池图标使用 LVGL 基元绘制(主体 + 电池帽 + 填充条)
- 初始状态透明(LV_OPA_TRANSP),
show_briefly()时设为不透明 + 启动定时器 lv_anim_t实现 opacity 从 255→0 的渐隐动画battery_ui_update_level()仅缓存电量值,不主动更新 UI
六、sleep_mgr 适配
- 移除 KEY2 唤醒回调注册(由 key_nav 统一处理)
- 保留
sleep_mgr_notify_activity()和sleep_mgr_is_screen_off()接口
七、main.c 更新
- 移除旧
boot_btn_handler和 flashlight 引用 ble_init()保留但不自动广播- 新增
key_nav_init()调用 - 移除
button_on_boot_press()注册
八、按键时序参数
| 参数 | 原值 | 新值 |
|---|---|---|
| 长按阈值 | 2000ms | 1200ms |
| 双击检测窗口 | 180ms | 300ms |
| 电池显示时长 | 3000ms | 2000ms |
| 渐隐动画时长 | - | 500ms |
九、文件变更汇总
| 操作 | 文件 |
|---|---|
| 新建 | main/key_nav/key_nav.c, main/key_nav/include/key_nav.h |
| 新建 | main/ble/ble_transfer.c, main/ble/include/ble_transfer.h |
| 新建 | main/ui/battery_ui.c, main/ui/battery_ui.h |
| 新建 | main/ui/screens/ui_ScreenImageShar.c/.h |
| 新建 | main/ui/screens/ui_ScreenImageReception.c/.h |
| 新建 | main/ui/screens/ui_ScreenSharing.c/.h |
| 新建 | main/ui/screens/ui_ScreenReceiving.c/.h |
| 新建 | main/ui/images/ 下 4 张新图片资源 |
| 重写 | main/button/button.c, main/button/include/button.h |
| 修改 | main/ble/ble.c, main/ble/include/ble.h |
| 修改 | main/main.c |
| 修改 | main/ui/screens/ui_ScreenHome.c, ui_ScreenImg.c/.h |
| 修改 | main/ui/screens/ui_ScreenPeiwang.c, ui_ScreenUpdate.c |
| 修改 | main/battery/battery.c |
| 修改 | main/sleep_mgr/sleep_mgr.c |
| 修改 | main/ui/ui.c, main/ui/ui.h, main/ui/CMakeLists.txt |
| 修改 | main/CMakeLists.txt, main/idf_component.yml |
| 禁用 | main/ui/screens/ui_ScreenSet.c(注释掉编译) |