Merge switch-controller: resolve #21 pull request #26 from vas-dav/button-hold

switch-controller: resolve #21
This commit is contained in:
Vasily Davydov 2022-10-17 15:01:48 +03:00 committed by GitHub
commit 39c3fcd202
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 9 deletions

View File

@ -26,8 +26,10 @@ private:
DigitalIoPin *b;
Timer *t;
StateHandler *h;
bool b_state;
bool b_pressed;
int b_mode;
void buttonOnHold ();
void buttonInLoop ();
};
#endif /* SWITCHCONTROLLER_H_ */

View File

@ -13,7 +13,7 @@ SwitchController::SwitchController (DigitalIoPin *button, Timer *timer,
b = button;
t = timer;
h = handler;
b_state = false;
b_pressed = false;
b_mode = button_mode;
}
@ -25,13 +25,51 @@ SwitchController::~SwitchController ()
void
SwitchController::listen ()
{
if (b->read ())
int timer = t->getCounter ();
/** Button is pressed for the first time*/
if (b->read () && !b_pressed)
{
b_state = true;
t->resetCounter ();
b_pressed = true;
}
if (!b->read () && b_state)
/** Button is released before 2 seconds*/
if (!b->read () && b_pressed && timer < 2000)
{
h->HandleState (Event (Event::eKey, b_mode));
b_state = false;
b_pressed = false;
t->resetCounter ();
}
/** Button is pressed after 2 seconds*/
if (b->read () && b_pressed && timer >= 2000)
{
buttonOnHold ();
}
}
void
SwitchController::buttonOnHold ()
{
t->resetCounter ();
while (b->read ())
{
buttonInLoop ();
}
if (b_mode == BUTTON_CONTROL_TOG_MODE)
{
h->HandleState (Event (Event::eKey, b_mode));
}
b_pressed = false;
t->resetCounter ();
}
void
SwitchController::buttonInLoop ()
{
if (t->getCounter () > 50 && b_mode != BUTTON_CONTROL_TOG_MODE)
{
h->HandleState (Event (Event::eKey, b_mode));
h->HandleState (Event (Event::eTick));
t->resetCounter ();
}
t->tickCounter (2);
}

View File

@ -55,11 +55,11 @@ Timer::Sleep (int ms)
int
Timer::getCounter ()
{
return counter;
return counter.load (std::memory_order_relaxed);
}
void
Timer::resetCounter ()
{
counter = 0;
counter.store (0, std::memory_order_relaxed);
}