State machine
Dependencies: mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter
Button.h
- Committer:
- brass_phoenix
- Date:
- 2018-10-30
- Revision:
- 3:4b19b6cf6cc7
- Parent:
- 2:141cfcafe72b
- Child:
- 7:e7f808875bc4
File content as of revision 3:4b19b6cf6cc7:
#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() { // Button is now potentially pressed, or is simply bouncing. debounce_timeout.detach(); pressed = false; } void fall() { // Button just got released, or bounced up again. debounce_timeout.attach(this, &Button::debounce_callback, debounce_time); } void debounce_callback() { pressed = true; just_switched_to_pressed = true; } };