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

48 lines
2.5 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. 对按住不放的行为进行计时累加,判定长按:
* 长按 **确认键 (CONFIRM / ■)** 达 3 秒触发主菜单选择界面或退出当前页面。
* 侧边 **▼ 键** 长按达 2 秒产生长按退出/消除警报事件。
* SOS 按键SOS1 / SOS2长按或短按只要是非报警状态一律触发 `KEY_SOS_ACTIVE` 本地报警呼救事件。
6. 将按键判定结果转换为 `KeyEvent` 并注入按键事件缓冲区 `key_event_buf`
## 2. 数据结构定义
### 按键事件枚举 (KeyEvent)
```c
typedef enum {
KEY_EVENT_NONE,
KEY_UP_SHORT,
KEY_DOWN_SHORT,
KEY_DOWN_LONG, // 长按 ▼ 2 秒解除警报/退出绑定
KEY_CONFIRM_CLICK, // ■ 确认键短按
KEY_CONFIRM_LONG, // ■ 确认键长按3秒进入/退出菜单/退出绑定)
KEY_SOS_ACTIVE // SOS键活动 (短按或长按,跳转至发送 SOS 报警)
} 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_confirm_hold >= 300` 达 3 秒时,注入 `KEY_CONFIRM_LONG` 中断事件。
* 检测到 `key_down_hold >= 200` 达 2 秒时,注入 `KEY_DOWN_LONG` 中断事件。
* 检测到并联 SOS 被按下时,注入 `KEY_SOS_ACTIVE` 事件。
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->