This commit is contained in:
2026-03-29 18:41:09 +08:00
parent 614c0f77e8
commit 60caa476c0
3 changed files with 5154 additions and 4707 deletions
+55
View File
@@ -81,3 +81,58 @@
- TCA9535ButtonThread.cpp 的 runOnce() 每 2 秒轮询 P1.1,更新全局 `tca9535IsCharging` - TCA9535ButtonThread.cpp 的 runOnce() 每 2 秒轮询 P1.1,更新全局 `tca9535IsCharging`
- Power.cpp 的 `AnalogBatteryLevel::isCharging()` 读取 `tca9535IsCharging``#ifdef TCA9535_CHARGE_DET_PIN` - Power.cpp 的 `AnalogBatteryLevel::isCharging()` 读取 `tca9535IsCharging``#ifdef TCA9535_CHARGE_DET_PIN`
- Power.cpp include 条件从 `TCA9535_LORA_RST_VIRTUAL_PIN` 改为 `HAS_TCA9535_BUTTON` - Power.cpp include 条件从 `TCA9535_LORA_RST_VIRTUAL_PIN` 改为 `HAS_TCA9535_BUTTON`
## 快捷回复 ↔ 九宫格输入导航
- INACTIVEUP/DOWN 进入快捷回复列表
- ACTIVE(列表):LEFT/RIGHT 进入九宫格 FREETEXT
- FREETEXTLEFT/RIGHT 回列表,保留输入文字
- `*` = 退格,`#` = 切换输入模式
- `isUpEvent()`/`isDownEvent()` 移除 ACTIVE 状态对 LEFT/RIGHT 的映射
## T9 Multi-tap 输入法实现
- 三种模式:abc(小写) / ABC(大写) / 123(数字),按 `#` 循环切换
- 数字键 2-9 multi-tap 选字母,800ms 超时自动确认
- 数字键 0 = 空格,数字键 1 = 标点循环(`. , ! ?`
- 屏幕左下角显示当前输入模式标签
- 光标位置实时预览 multi-tap 字符
## ⚠️ T9 commitMultiTap 递归崩溃修复
- 崩溃:`commitMultiTap()` 内调用 `runOnce()``runOnce()` 检测超时又调用 `commitMultiTap()` → 无限递归 → 栈溢出 → Store access fault
- 反汇编确认 MEPC=0x40383d3esystimer 中间件),S11=0x42066020 → `CannedMessageModule::runOnce()`
- 修复:添加 `committingMultiTap` 重入保护标志,`runOnce()` 中检查 `!committingMultiTap` 再调用 `commitMultiTap()`
## ⚠️ T9 payload 残留 + 显示修复
- 连续按两次同一按键回到主页面:疑似 payload 未清零导致 runOnce 非预期行为 + showMultiTapPreview 无用 String 分配导致堆碎片
- 修复:
1. 所有 `runOnce()` 调用后立即 `payload = 0``*` 退格、可打印字符、INPUT_BROKER_BACK 退格、commitMultiTap
2. `runOnce()` FREETEXT 分支末尾加 `payload = 0` 作为最后防线
3. 移除 `showMultiTapPreview()` 中无用 `previewText` String 分配(预览字符由 drawFrame 渲染)
- 输入法模式标签(abc/ABC/123)从左上角移到屏幕右下角(TEXT_ALIGN_RIGHT
## ⚠️ 任意按两个按键回到主页面 — REGENERATE_FRAMESET 重复触发 focus 丢失
- **根因**`commitMultiTap()``runOnce()``notifyObservers(REGENERATE_FRAMESET)``Screen::setFrames(FOCUS_MODULE)` 消费了 `requestFocus()``_requestingFocus=false`
然后同一调用链中后续的 `notifyObservers(REGENERATE_FRAMESET)``setFrames(FOCUS_MODULE)``focusedModule=255`(默认值)→ `ui->switchToFrame(255)` → 跳到主页面
- **关键机制**`MeshModule::isRequestingFocus()` 是一次性的——调用一次就清零 `_requestingFocus``setFrames(FOCUS_MODULE)``focusedModule` 默认 255,没有 focus request 就跳第一帧
- 修复(4处):
1. `commitMultiTap()` 末尾移除多余的 `notifyObservers(REGENERATE_FRAMESET)` + `forceDisplay()``runOnce()` 已触发)
2. `showMultiTapPreview()` 改用 `REDRAW_ONLY` 代替 `REGENERATE_FRAMESET`
3. `#` 键(切换输入模式)`commitMultiTap()` 后改用 `REDRAW_ONLY`
4. `runOnce()` 中 multi-tap 超时自动 `commitMultiTap()` 后直接 return,跳过后续 `notifyObservers`
5. LEFT/RIGHT 返回 ACTIVE 列表时补加 `requestFocus()`(因为 `commitMultiTap` 已消费前一个 focus
- `commitMultiTap()` 改为返回 `bool` 表示是否实际提交了字符
- 编译验证通过(SUCCESS 33s
## ⚠️ T9 输入法逻辑修正 — 光标+大小写+数字模式
- **问题1:光标不跳转**`drawFrame` 中 preview 字符插入到 `displayText``displayCursor` 没有 +1,导致光标 `_` 画在 preview 字符之前而不是之后。修复:有 preview 时 `displayCursor = cursor + 1`
- **问题2:大小写模式下出现数字**:旧 `t9Map` 每个 key 的 index 0 是数字本身,在 UPPER/LOWER 模式下 multiTapIndex=0 时显示的是数字
- **问题3:0=空格、1=标点、数字只在数字模式输入**:用户要求的行为
- **修复**
1. `t9Map` 重命名为 `t9LetterMap`,去掉 index 0 的数字,每个 key 只包含字母模式下的字符
- 0: `{" ", nullptr}`(空格)
- 1: `{".", ",", "!", "?", nullptr}`(标点)
- 2-9: 纯字母
2. DIGIT 模式下数字键直接输出数字,不走 multi-tap 循环(`payload = '0' + key; runOnce()`
3. UPPER/LOWER 模式下使用 `t9LetterMap` + multi-tap 循环,应用大小写转换
4. `commitMultiTap()` 简化:不再有 index 0 是数字的特殊情况
5. `drawFrame` preview 逻辑同步简化 + 光标 +1
- 编译验证通过(SUCCESS 36s
+5099 -4707
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.