106 lines
2.8 KiB
C++
106 lines
2.8 KiB
C++
/**
|
||
******************************************************************************
|
||
* @file ButtonEvent.h
|
||
* @author FASTSHIFT
|
||
* @version V1.3.0
|
||
* @date 2018-12-23
|
||
* @brief 非阻塞式按键事件驱动库,支持短摁、长摁、释放、状态改变事件的识别。
|
||
* @Upgrade 2019.6.18 添加按键双击事件、长按单次触发事件。
|
||
* @Upgrade 2019.8.26 添加GetClicked、GetPressed、GetLongPressed非事件模式支持。
|
||
* @Upgrade 2019.12.4 使用了新的事件回调设计,所有事件统一用EventAttach。
|
||
添加Click、LongPressed、LongPressRepeat事件。
|
||
* @Upgrade 2020.6.12 合并ButtonEvent_Type至ButtonEvent类
|
||
******************************************************************************
|
||
* @attention
|
||
* 需要提供一个精确到毫秒级的系统时钟,用户需要在ButtonEvent.cpp里定义ButtonEvent_Millis
|
||
******************************************************************************
|
||
*/
|
||
|
||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||
#ifndef __BUTTONEVENT_H
|
||
#define __BUTTONEVENT_H
|
||
|
||
#include "stdint.h"
|
||
|
||
class ButtonEvent
|
||
{
|
||
typedef void(*ButtonEvent_FuncCallBack_t)(ButtonEvent*, int);
|
||
public:
|
||
ButtonEvent(
|
||
bool NoPressState = 0,
|
||
uint16_t LongPressTimeMs_Set = 500,
|
||
uint16_t LongPressTimeRepeatMs_Set = 200
|
||
);
|
||
|
||
enum Event_Type
|
||
{
|
||
EVENT_ButtonNone,
|
||
EVENT_ButtonPress,
|
||
EVENT_ButtonLongPressed,
|
||
EVENT_ButtonLongPressRepeat,
|
||
EVENT_ButtonRelease,
|
||
EVENT_ButtonChange,
|
||
EVENT_ButtonClick,
|
||
EVENT_ButtonDoubleClick,
|
||
};
|
||
|
||
bool IsPressed;
|
||
bool IsClicked;
|
||
bool IsLongPressed;
|
||
|
||
void EventAttach(ButtonEvent_FuncCallBack_t function);
|
||
void EventMonitor(bool NowState);
|
||
|
||
inline uint8_t GetClickCnt()
|
||
{
|
||
uint8_t cnt = Click_Cnt + 1;
|
||
Click_Cnt = 0;
|
||
return cnt;
|
||
}
|
||
inline bool GetClicked()
|
||
{
|
||
bool n = IsClicked;
|
||
IsClicked = false;
|
||
return n;
|
||
}
|
||
inline bool GetPressed()
|
||
{
|
||
bool n = IsPressed;
|
||
IsPressed = false;
|
||
return n;
|
||
}
|
||
inline bool GetLongPressed()
|
||
{
|
||
bool n = IsLongPressed;
|
||
IsLongPressed = false;
|
||
return n;
|
||
}
|
||
|
||
operator uint8_t()
|
||
{
|
||
return Button_NowState;
|
||
};
|
||
|
||
private:
|
||
enum ButtonState
|
||
{
|
||
NoPress,
|
||
Press,
|
||
LongPress
|
||
};
|
||
bool Button_NoPressState;
|
||
uint8_t Button_NowState;
|
||
uint16_t LongPressTimeMs;
|
||
uint16_t LongPressTimeRepeatMs;
|
||
uint32_t LastLongPress_TimePoint;
|
||
uint32_t LastPress_TimePoint;
|
||
uint32_t LastClick_TimePoint;
|
||
uint8_t Click_Cnt;
|
||
bool IS_Pressed;
|
||
bool IS_LongPressed;
|
||
|
||
ButtonEvent_FuncCallBack_t CallbackFunc;
|
||
};
|
||
|
||
#endif
|