66 lines
1.4 KiB
C
Raw Permalink Normal View History

2025-02-27 17:59:18 +08:00
#ifndef _MULTI_BUTTON_H_
#define _MULTI_BUTTON_H_
#include "stdint.h"
#include "string.h"
//According to your need to modify the constants.
#define TICKS_INTERVAL 5 //ms
#define DEBOUNCE_TICKS 6 //MAX 8
#define SHORT_TICKS (400 /TICKS_INTERVAL)
#define LONG_TICKS (1000 /TICKS_INTERVAL)
typedef void (*btn_callback)(void *);
typedef enum {
PRESS_DOWN = 0,
PRESS_UP,
PRESS_REPEAT,
SINGLE_CLICK,
DOUBLE_CLICK,
LONG_PRESS_START,
LONG_PRESS_HOLD,
number_of_event,
NONE_PRESS
} PRESS_EVT;
typedef enum {
LOW_LEVEL_TRIGGER = 0,
HIGH_LEVEL_TRIGGER,
ACTIVE_LEVEL_INVALID,
} ACTIVE_LEVELS_EVT;
typedef struct _button_ {
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;
void *user_data;
uint8_t (*hal_button_Level)(struct _button_ *);
btn_callback cb[number_of_event];
struct _button_ *next;
} BUTTON_S;
#ifdef __cplusplus
extern "C" {
#endif
void button_init(BUTTON_S *handle, uint8_t(*pin_level)(struct _button_ *), uint8_t active_level, void *user_data);
void button_attach(BUTTON_S *handle, PRESS_EVT event, btn_callback cb);
PRESS_EVT button_get_event(BUTTON_S *handle);
int button_start(BUTTON_S *handle);
void button_stop(BUTTON_S *handle);
void button_ticks(void *param1, void *param2);
BUTTON_S *button_find_with_user_data(void *user_data);
#ifdef __cplusplus
}
#endif
#endif