添加按键功能

This commit is contained in:
OPTOC
2025-08-28 16:03:47 +08:00
parent 3f4d2d02f2
commit 2ab5a97ac3
5 changed files with 338 additions and 0 deletions

48
app/drivers/sertrf/key.h Normal file
View File

@@ -0,0 +1,48 @@
#pragma once
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <unistd.h> // 如果在裸机下,用平台自带的延时函数替代
#include "../pin_io/pin_io.h"
#include "../../config/board_config.h"
#include "../../config/app_config.h"
#include "sys_log.h"
#include "os/os.h"
#include "device.h"
// 按键事件类型
typedef enum {
EVT_NONE = 0, // 无事件
EVT_PRESS_DOWN, // 按下
EVT_PRESS_UP, // 松开
EVT_SINGLE_CLICK, // 单击
EVT_DOUBLE_CLICK, // 双击
EVT_LONG_PRESS, // 长按释放
EVT_SINGLE_LONG_PRESS // 单击后长按
} button_event_t;
// 回调函数原型
typedef void (*button_cb_t)(button_event_t evt);
// 配置参数
#define DEBOUNCE_TICKS 3 // 连续3次读到新值才确认变化
#define LONG_PRESS_TICKS 100 // 100*SCAN_INTERVAL_US >=1s 触发长按阈值
#define DOUBLE_CLICK_WINDOW 30 // 30*SCAN_INTERVAL_US <=300ms 双击间隔窗口
#define SCAN_INTERVAL_US 10000 // 10ms 扫描一次
// 按键处理结构体
typedef struct {
bool (*read_pin)(void); // 读取 GPIO按下返回 true
button_cb_t callback; // 事件回调
uint8_t stable_state; // 去抖后稳定状态
uint8_t debounce_cnt; // 去抖计数
uint16_t tick_cnt; // 持续按下或间隔计数
uint8_t state; // 状态机状态
uint8_t click_count; // 短按计数
} button_t;
extern bool key_single_click,key_press_down,key_press_up;
void _work_button(void *arg);
void button_work_init();