/* * Copyright (c) 2016 Zibin Zheng * All rights reserved */ #ifndef _MULTI_BUTTON_H_ #define _MULTI_BUTTON_H_ //#include "stdint.h" #include "string.h" #include "define_all.h" //According to your need to modify the constants. #define TICKS_INTERVAL 20 //ms #define DEBOUNCE_TICKS 3 //MAX 8 #define SHORT_TICKS (300 /TICKS_INTERVAL) #define LONG_TICKS (2000 /TICKS_INTERVAL) typedef void (*BtnCallback)(void*); typedef enum { PRESS_DOWN = 0, //按下触发 PRESS_UP, //松开触发 PRESS_REPEAT, //按下repeat次触发 SINGLE_CLICK, //单击按键 DOUBLE_CLICK, //双击按键 LONG_PRESS_START, //长按到阈值 LONG_PRESS_HOLD, //长按期间一直触发 number_of_event, NONE_PRESS }PressEvent; 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; uint8_t (*hal_button_Level)(void);//GPIO电平读取接口的函数指针 BtnCallback cb[number_of_event];//声明一个BtnCallback函数指针类型的数组 struct Button* next;//代表链表的结构体指针 }Button; #ifdef __cplusplus extern "C" { #endif void button_init(struct Button* handle, uint8_t(*pin_level)(), uint8_t active_level); void button_attach(struct Button* handle, PressEvent event, BtnCallback cb); PressEvent get_button_event(struct Button* handle); int button_start(struct Button* handle); void button_stop(struct Button* handle); void button_ticks(void); #ifdef __cplusplus } #endif #endif