Files
ESPC3-wireless/app/button/multi_button.h

74 lines
2.4 KiB
C
Raw Normal View History

2025-02-18 17:41:45 +08:00
/*
* Copyright (c) 2016 Zibin Zheng <znbin@qq.com>
* All rights reserved
* https://github.com/0x1abin/MultiButton
*/
#pragma once
#include <stdint.h>
#include <string.h>
// According to your need to modify the constants.
#define TICKS_INTERVAL 5 // ms
#define DEBOUNCE_TICKS 3 // MAX 7 (0 ~ 7)
#define SHORT_TICKS (300 / TICKS_INTERVAL)
#define LONG_TICKS (1000 / TICKS_INTERVAL)
typedef struct Button button_hdl_t;
typedef enum // 触发事件源
{
NONE_PRESS = 0,
PRESS_DOWN, // 按键按下,每次按下都触发
PRESS_UP, // 按键弹起,每次松开都触发
PRESS_REPEAT, // 重复按下触发变量repeat计数连击次数
SINGLE_CLICK, // 单击按键事件
DOUBLE_CLICK, // 双击按键事件
LONG_PRESS_START, // 达到长按时间阈值时触发一次
LONG_PRESS_HOLD, // 长按期间一直触发
} press_event_t;
/* EVENT_MASK */
#define EVENT_PRESS_DOWN (1U << PRESS_DOWN) // 按键按下,每次按下都触发
#define EVENT_PRESS_UP (1U << PRESS_UP) // 按键弹起,每次松开都触发
#define EVENT_PRESS_REPEAT (1U << PRESS_REPEAT) // 重复按下触发变量repeat计数连击次数
#define EVENT_SINGLE_CLICK (1U << SINGLE_CLICK) // 单击按键事件
#define EVENT_DOUBLE_CLICK (1U << DOUBLE_CLICK) // 双击按键事件
#define EVENT_LONG_PRESS_START (1U << LONG_PRESS_START) // 达到长按时间阈值时触发一次
#define EVENT_LONG_PRESS_HOLD (1U << LONG_PRESS_HOLD) // 长按期间一直触发
typedef void (*button_callback_fn)(button_hdl_t *handle, press_event_t event);
struct Button
{
struct Button *next;
uint16_t ticks;
uint8_t repeat : 4;
uint8_t event : 4;
uint8_t state : 3;
uint8_t debounce_cnt : 3;
uint8_t active_level : 1;
uint8_t button_level : 1;
uint8_t button_id;
uint8_t event_cb;
uint8_t (*hal_button_Level)(uint8_t button_id);
button_callback_fn cb;
};
#ifdef __cplusplus
extern "C"
{
#endif
void button_init(button_hdl_t *handle, uint8_t (*pin_level)(uint8_t button_id), uint8_t active_level, uint8_t button_id);
void button_attach(button_hdl_t *handle, uint8_t event_mask, button_callback_fn cb);
press_event_t get_button_event(button_hdl_t *handle);
int button_start(button_hdl_t *handle);
void button_stop(button_hdl_t *handle);
void button_ticks(void);
#ifdef __cplusplus
}
#endif