State machine
Dependencies: mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter
Diff: Button.h
- Revision:
- 1:cfa5abca6d43
- Child:
- 2:141cfcafe72b
diff -r 7d25c2ade6c5 -r cfa5abca6d43 Button.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Button.h Tue Oct 30 11:01:00 2018 +0000 @@ -0,0 +1,58 @@ +#pragma once + +#include "mbed.h" + +// seconds that a button should be stable to be considered "pressed". +// 50 ms. +const float debounce_time = 0.05; + +class Button { +private: + InterruptIn pin; + + Timeout debounce_timeout; + + volatile bool pressed; + + volatile bool just_switched_to_pressed; + volatile bool just_got_pressed; + +public: + Button(PinName pin_name): + pin(pin_name) + { + pin.rise(this, &Button::rise); + pin.fall(this, &Button::fall); + + pressed = false; + } + + void update() { + if (just_got_pressed) { + just_got_pressed = false; + } + if (just_switched_to_pressed) { + just_got_pressed = true; + just_switched_to_pressed = false; + } + } + + bool is_pressed() { return pressed; }; + // Only active just after a state change from not pressed to pressed. + // Get's reset after `update()` is called. + bool has_just_been_pressed() { return just_got_pressed; }; +private: + void rise() { + debounce_timeout.attach(this, &Button::debounce_callback, debounce_time); + } + + void fall() { + debounce_timeout.detach(); + pressed = false; + } + + void debounce_callback() { + pressed = true; + just_switched_to_pressed = true; + } +}; \ No newline at end of file