State machine

Dependencies:   mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter

Committer:
brass_phoenix
Date:
Tue Oct 30 11:21:09 2018 +0000
Revision:
2:141cfcafe72b
Parent:
1:cfa5abca6d43
Child:
3:4b19b6cf6cc7
+ Functions for every state.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
brass_phoenix 1:cfa5abca6d43 1 #pragma once
brass_phoenix 1:cfa5abca6d43 2
brass_phoenix 1:cfa5abca6d43 3 #include "mbed.h"
brass_phoenix 1:cfa5abca6d43 4
brass_phoenix 1:cfa5abca6d43 5 // seconds that a button should be stable to be considered "pressed".
brass_phoenix 1:cfa5abca6d43 6 // 50 ms.
brass_phoenix 1:cfa5abca6d43 7 const float debounce_time = 0.05;
brass_phoenix 1:cfa5abca6d43 8
brass_phoenix 1:cfa5abca6d43 9 class Button {
brass_phoenix 1:cfa5abca6d43 10 private:
brass_phoenix 1:cfa5abca6d43 11 InterruptIn pin;
brass_phoenix 1:cfa5abca6d43 12
brass_phoenix 1:cfa5abca6d43 13 Timeout debounce_timeout;
brass_phoenix 1:cfa5abca6d43 14
brass_phoenix 1:cfa5abca6d43 15 volatile bool pressed;
brass_phoenix 1:cfa5abca6d43 16
brass_phoenix 1:cfa5abca6d43 17 volatile bool just_switched_to_pressed;
brass_phoenix 1:cfa5abca6d43 18 volatile bool just_got_pressed;
brass_phoenix 1:cfa5abca6d43 19
brass_phoenix 1:cfa5abca6d43 20 public:
brass_phoenix 1:cfa5abca6d43 21 Button(PinName pin_name):
brass_phoenix 1:cfa5abca6d43 22 pin(pin_name)
brass_phoenix 1:cfa5abca6d43 23 {
brass_phoenix 1:cfa5abca6d43 24 pin.rise(this, &Button::rise);
brass_phoenix 1:cfa5abca6d43 25 pin.fall(this, &Button::fall);
brass_phoenix 1:cfa5abca6d43 26
brass_phoenix 1:cfa5abca6d43 27 pressed = false;
brass_phoenix 1:cfa5abca6d43 28 }
brass_phoenix 1:cfa5abca6d43 29
brass_phoenix 1:cfa5abca6d43 30 void update() {
brass_phoenix 1:cfa5abca6d43 31 if (just_got_pressed) {
brass_phoenix 1:cfa5abca6d43 32 just_got_pressed = false;
brass_phoenix 1:cfa5abca6d43 33 }
brass_phoenix 1:cfa5abca6d43 34 if (just_switched_to_pressed) {
brass_phoenix 1:cfa5abca6d43 35 just_got_pressed = true;
brass_phoenix 1:cfa5abca6d43 36 just_switched_to_pressed = false;
brass_phoenix 1:cfa5abca6d43 37 }
brass_phoenix 1:cfa5abca6d43 38 }
brass_phoenix 1:cfa5abca6d43 39
brass_phoenix 1:cfa5abca6d43 40 bool is_pressed() { return pressed; };
brass_phoenix 1:cfa5abca6d43 41 // Only active just after a state change from not pressed to pressed.
brass_phoenix 1:cfa5abca6d43 42 // Get's reset after `update()` is called.
brass_phoenix 1:cfa5abca6d43 43 bool has_just_been_pressed() { return just_got_pressed; };
brass_phoenix 1:cfa5abca6d43 44 private:
brass_phoenix 1:cfa5abca6d43 45 void rise() {
brass_phoenix 2:141cfcafe72b 46 // Button is now potentially pressed, or is simply bouncing.
brass_phoenix 2:141cfcafe72b 47 debounce_timeout.detach();
brass_phoenix 2:141cfcafe72b 48 pressed = false;
brass_phoenix 1:cfa5abca6d43 49 }
brass_phoenix 1:cfa5abca6d43 50
brass_phoenix 1:cfa5abca6d43 51 void fall() {
brass_phoenix 2:141cfcafe72b 52 // Button just got released, or bounced up again.
brass_phoenix 2:141cfcafe72b 53 debounce_timeout.attach(this, &Button::debounce_callback, debounce_time);
brass_phoenix 1:cfa5abca6d43 54 }
brass_phoenix 1:cfa5abca6d43 55
brass_phoenix 1:cfa5abca6d43 56 void debounce_callback() {
brass_phoenix 1:cfa5abca6d43 57 pressed = true;
brass_phoenix 1:cfa5abca6d43 58 just_switched_to_pressed = true;
brass_phoenix 1:cfa5abca6d43 59 }
brass_phoenix 1:cfa5abca6d43 60 };