Files
stc32g128k/Docs/50_module-breakdown/mod-key.md

48 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 模块拆分 - 按键扫描与事件判定 (Docs/50_module-breakdown/mod-key.md)
本模块描述按键状态消抖、长按计时判定以及组合按键识别。支持 5 个物理按键到手环事件的映射。
## 1. 模块职责说明
* **职责范围**
1. 在 1ms 定时器中断中建立 10ms 扫描计时周期。
2. 对 5 个物理按键进行引脚电平扫描:
* 侧边:`KEY_UP` SW1 (▲), `KEY_DOWN` SW2 (▼), `KEY_CONFIRM` (■)
* 上部:`KEY_SOS1` (SOS 1), `KEY_SOS2` (SOS 2)
3. 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。
4. 对上部双 SOS 按键进行逻辑并联处理,保证按下任意一个均能触发求救。
5. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。
6. 将按键判定结果转换为 `KeyEvent` 并注入按键事件缓冲区 `key_event_buf`
## 2. 数据结构定义
### 按键事件枚举 (KeyEvent)
```c
typedef enum {
KEY_EVENT_NONE,
KEY_UP_SHORT,
KEY_UP_LONG,
KEY_DOWN_SHORT,
KEY_DOWN_LONG,
KEY_CONFIRM_CLICK, // ■ 确认键短按
KEY_SOS_SHORT, // SOS键短按 (SOS1 或 SOS2)
KEY_SOS_LONG, // SOS键长按5秒 (SOS1 或 SOS2)
KEY_COMB_LONG // ▲ + ▼ 组合长按事件
} KeyEvent;
```
## 3. 接口与函数说明
* `void Key_Scan_Process(void)`
在 Timer 1 ISR 中每 10ms 调度一次。
* 读取 `KEY_UP`, `KEY_DOWN`, `KEY_CONFIRM`, `KEY_SOS1`, `KEY_SOS2` 的 GPIO 逻辑电平。
* 计算并联 SOS 状态:`is_sos_pressed = (KEY_SOS1 == 0) || (KEY_SOS2 == 0)`
* 如果发现按键电平状态改变,进行计数消抖。
* 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_confirm_hold`, `key_sos_hold`)。
* 检测到 `key_up_hold >= 300``key_down_hold >= 300` 达 3 秒时,注入 `KEY_COMB_LONG` 事件。
* 检测到 `key_sos_hold >= 500` 达 5 秒时,注入 `KEY_SOS_LONG` 事件;若释放时未达 5 秒但大于 20ms注入 `KEY_SOS_SHORT`
* 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`
* 事件解析完毕后存入 `key_event_buf`
<!-- Checked and verified with bracelet_factory_id and active SOS changes -->