/* * Copyright (c) 2016 Zibin Zheng * All rights reserved */ #ifndef _MULTI_BUTTON_H_ #define _MULTI_BUTTON_H_ //#include "stdint.h" #include "TypeDef.h" #include "string.h" //According to your need to modify the constants. #define TICKS_INTERVAL 6 //ms #define DEBOUNCE_TICKS 3 //MAX 8 #define SHORT_TICKS (120 /TICKS_INTERVAL) #define LONG_TICKS (2000 /TICKS_INTERVAL) #define LONG_TICKS_TRIG (120 /TICKS_INTERVAL) //长按,周期性调用 typedef void ( *BtnCallback ) ( void* ); typedef enum { PRESS_DOWN = 0, PRESS_UP, PRESS_REPEAT, SINGLE_CLICK, DOUBLE_CLICK, LONG_RRESS_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 ); BtnCallback cb[number_of_event]; struct Button* next; } Button; #ifdef __cplusplus extern "C" { #endif void button_init_Head ( void ); 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