#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