Files
eye_trainer/SimpleButton.h
Author glitchrain 0ff9bdd0d2 Stylistic clean ups.
2024-12-15 03:50:11 -08:00

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