up
This commit is contained in:
@@ -81,3 +81,58 @@
|
||||
- TCA9535ButtonThread.cpp 的 runOnce() 每 2 秒轮询 P1.1,更新全局 `tca9535IsCharging`
|
||||
- Power.cpp 的 `AnalogBatteryLevel::isCharging()` 读取 `tca9535IsCharging`(`#ifdef TCA9535_CHARGE_DET_PIN`)
|
||||
- Power.cpp include 条件从 `TCA9535_LORA_RST_VIRTUAL_PIN` 改为 `HAS_TCA9535_BUTTON`
|
||||
|
||||
## 快捷回复 ↔ 九宫格输入导航
|
||||
- INACTIVE:UP/DOWN 进入快捷回复列表
|
||||
- ACTIVE(列表):LEFT/RIGHT 进入九宫格 FREETEXT
|
||||
- FREETEXT:LEFT/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=0x40383d3e(systimer 中间件),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
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Reference in New Issue
Block a user