GeekTrack/2.Firmware/simulator/LVGL.Simulator/Win32HAL/Event/ButtonEvent.cpp

100 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "ButtonEvent.h"
#ifdef _WIN32
#include<time.h>
#define ButtonEvent_Millis clock()
#else
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define ButtonEvent_Millis xTaskGetTickCount()
#endif
/**
* @brief 按键事件构造函数
* @param NoPressState: 按键未按下时的状态
* @param LongPressTimeMs_Set: 按键长按触发超时设置
* @param LongPressTimeRepeatMs_Set: 长按重复触发时间
* @retval 无
*/
ButtonEvent::ButtonEvent(
bool NoPressState,
uint16_t LongPressTimeMs_Set,
uint16_t LongPressTimeRepeatMs_Set
)
{
Button_NoPressState = NoPressState;
LongPressTimeMs = LongPressTimeMs_Set;
LongPressTimeRepeatMs = LongPressTimeRepeatMs_Set;
LastLongPress_TimePoint = LastClick_TimePoint = LastPress_TimePoint = 0;
IS_LongPressed = IS_Pressed = false;
CallbackFunc = 0;
}
/**
* @brief 按键事件绑定
* @param Function: 回调函数指针
* @retval 无
*/
void ButtonEvent::EventAttach(ButtonEvent_FuncCallBack_t function)
{
CallbackFunc = function;
}
/**
* @brief 监控事件建议扫描周期10ms
* @param NowState: 当前按键引脚状态
* @retval 无
*/
void ButtonEvent::EventMonitor(bool NowState)
{
if(!CallbackFunc)
return;
if (!IS_Pressed && (NowState != Button_NoPressState))
{
IsPressed = IS_Pressed = true;
Button_NowState = Press;
LastPress_TimePoint = ButtonEvent_Millis;
CallbackFunc(this, EVENT_ButtonPress);
CallbackFunc(this, EVENT_ButtonChange);
}
else if (IS_Pressed && ButtonEvent_Millis - LastPress_TimePoint >= LongPressTimeMs && (NowState != Button_NoPressState))
{
Button_NowState = LongPress;
if(!IS_LongPressed)
{
CallbackFunc(this, EVENT_ButtonLongPressed);
LastLongPress_TimePoint = ButtonEvent_Millis;
IsLongPressed = IS_LongPressed = true;
}
else if(ButtonEvent_Millis - LastLongPress_TimePoint >= LongPressTimeRepeatMs)
{
LastLongPress_TimePoint = ButtonEvent_Millis;
CallbackFunc(this, EVENT_ButtonLongPressRepeat);
}
}
else if (IS_Pressed && (NowState == Button_NoPressState))
{
IS_LongPressed = IS_Pressed = false;
IsClicked = true;
Button_NowState = NoPress;
LastClick_TimePoint = ButtonEvent_Millis;
if(ButtonEvent_Millis - LastPress_TimePoint < LongPressTimeMs)
{
CallbackFunc(this, EVENT_ButtonClick);
}
CallbackFunc(this, EVENT_ButtonRelease);
CallbackFunc(this, EVENT_ButtonChange);
}
if(IS_Pressed && ButtonEvent_Millis - LastClick_TimePoint < 200)
{
Click_Cnt++;
CallbackFunc(this, EVENT_ButtonDoubleClick);
}
}