2.5 KiB
2.5 KiB
模块拆分 - 按键扫描与事件判定 (Docs/50_module-breakdown/mod-key.md)
本模块描述按键状态消抖、长按和短按计时判定。支持 5 个物理按键到手环事件的映射。
1. 模块职责说明
- 职责范围:
- 在 1ms 定时器中断中建立 10ms 扫描计时周期。
- 对 5 个物理按键进行引脚电平扫描:
- 侧边:
KEY_UPSW1 (▲),KEY_DOWNSW2 (▼),KEY_CONFIRM(■) - 上部:
KEY_SOS1(SOS 1),KEY_SOS2(SOS 2)
- 侧边:
- 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。
- 对上部双 SOS 按键进行逻辑并联处理,保证按下任意一个均能触发求救。
- 对按住不放的行为进行计时累加,判定长按:
- 长按 确认键 (CONFIRM / ■) 达 3 秒触发主菜单选择界面或退出当前页面。
- 侧边 ▼ 键 长按达 2 秒产生长按退出/消除警报事件。
- SOS 按键(SOS1 / SOS2)长按或短按,只要是非报警状态,一律触发
KEY_SOS_ACTIVE本地报警呼救事件。
- 将按键判定结果转换为
KeyEvent并注入按键事件缓冲区key_event_buf。
2. 数据结构定义
按键事件枚举 (KeyEvent)
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事件。
- 读取