126 lines
2.3 KiB
C++
126 lines
2.3 KiB
C++
#ifndef EYE_TRAINER_SIMPLEBUTTON
|
|
#define EYE_TRAINER_SIMPLEBUTTON 0
|
|
|
|
class SimpleButton
|
|
{
|
|
public:
|
|
|
|
SimpleButton(int _ButtonPin, unsigned long _LongClickTime)
|
|
{
|
|
m_LongClickTime = _LongClickTime;
|
|
m_ButtonPin = _ButtonPin;
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
pinMode(m_ButtonPin, INPUT);
|
|
}
|
|
|
|
int update(unsigned long _Time)
|
|
{
|
|
clearClicks();
|
|
|
|
int prevState = m_State;
|
|
|
|
unsigned long deltaTime = _Time - m_PrevTimeMS;
|
|
m_PrevTimeMS = _Time;
|
|
bool pinState = digitalRead(m_ButtonPin);
|
|
|
|
if(m_State == PRESSED && pinState)
|
|
{
|
|
m_PressedTime += deltaTime;
|
|
if(m_PressedTime >= m_LongClickTime)
|
|
{
|
|
m_IsNowHolded = true;
|
|
}
|
|
}
|
|
else if(m_State == PRESSED && !pinState)
|
|
{
|
|
m_State = RELEASED;
|
|
m_IsNowClicked = true;
|
|
|
|
if(m_PressedTime >= m_LongClickTime)
|
|
{
|
|
m_IsNowLongClicked = true;
|
|
m_PressedTime = 0;
|
|
}
|
|
else
|
|
{
|
|
m_IsNowShortClicked = true;
|
|
}
|
|
}
|
|
else if(m_State == RELEASED && pinState)
|
|
{
|
|
m_State = PRESSED;
|
|
m_IsNowPressed = true;
|
|
}
|
|
|
|
return m_IsNowHolded | (prevState != m_State);
|
|
}
|
|
|
|
bool isNowClicked()
|
|
{
|
|
return m_IsNowClicked;
|
|
}
|
|
|
|
bool isNowPressed()
|
|
{
|
|
return m_IsNowPressed;
|
|
}
|
|
|
|
bool isNowReleased()
|
|
{
|
|
return m_IsNowReleased;
|
|
}
|
|
|
|
bool isHolded()
|
|
{
|
|
return m_IsNowHolded;
|
|
}
|
|
|
|
bool isNowLongClicked()
|
|
{
|
|
return m_IsNowLongClicked;
|
|
}
|
|
|
|
bool isNowShortClicked()
|
|
{
|
|
return m_IsNowShortClicked;
|
|
}
|
|
|
|
unsigned long getPressedTime()
|
|
{
|
|
return m_PressedTime;
|
|
}
|
|
|
|
private:
|
|
static const int CLICK_DELAY = 20;
|
|
static const int PRESSED = 1;
|
|
static const int RELEASED = 0;
|
|
int m_ButtonPin;
|
|
int m_State = RELEASED;
|
|
unsigned long m_PrevTimeMS = 0;
|
|
unsigned long m_PressedTime = 0;
|
|
unsigned long m_LongClickTime = 250;
|
|
unsigned long m_PressDelayTime = 0;
|
|
unsigned long m_ReleaseDelayTime = 0;
|
|
bool m_IsNowClicked = false;
|
|
bool m_IsNowPressed = false;
|
|
bool m_IsNowReleased = false;
|
|
bool m_IsNowHolded = false;
|
|
bool m_IsNowShortClicked = false;
|
|
bool m_IsNowLongClicked = false;
|
|
|
|
void clearClicks()
|
|
{
|
|
m_IsNowClicked = false;
|
|
m_IsNowPressed = false;
|
|
m_IsNowReleased = false;
|
|
m_IsNowReleased = false;
|
|
m_IsNowHolded = false;
|
|
m_IsNowShortClicked = false;
|
|
m_IsNowLongClicked = false;
|
|
}
|
|
};
|
|
|
|
#endif |