2025-08-28 16:03:47 +08:00
|
|
|
|
#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"
|
2025-09-02 10:33:03 +08:00
|
|
|
|
#include "../led_strip/led_strip.h"
|
2025-10-14 10:17:40 +08:00
|
|
|
|
#include "protocol/stmisp.h"
|
|
|
|
|
|
|
2025-08-28 16:03:47 +08:00
|
|
|
|
// 按键事件类型
|
|
|
|
|
|
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);
|
2025-10-21 16:18:57 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 初始化按键
|
|
|
|
|
|
*/
|
2025-10-14 10:17:40 +08:00
|
|
|
|
void button_work_init();
|
2025-10-21 16:18:57 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置boot按键输出
|
|
|
|
|
|
*/
|
|
|
|
|
|
void boot_set(uint8_t value);
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 设置boot按键为高阻态
|
|
|
|
|
|
*/
|
2025-10-23 18:39:21 +08:00
|
|
|
|
void boot_set_high_z(void);
|
|
|
|
|
|
|
|
|
|
|
|
void key_test(void);
|