State machine

Dependencies:   mbed Adafruit_GFX BioroboticsMotorControl MODSERIAL BioroboticsEMGFilter

Committer:
brass_phoenix
Date:
Tue Oct 30 11:40:00 2018 +0000
Revision:
3:4b19b6cf6cc7
Parent:
2:141cfcafe72b
Child:
7:e7f808875bc4
+ Added screen basics.

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 3:4b19b6cf6cc7 9 class Button
brass_phoenix 3:4b19b6cf6cc7 10 {
brass_phoenix 1:cfa5abca6d43 11 private:
brass_phoenix 1:cfa5abca6d43 12 InterruptIn pin;
brass_phoenix 3:4b19b6cf6cc7 13
brass_phoenix 1:cfa5abca6d43 14 Timeout debounce_timeout;
brass_phoenix 3:4b19b6cf6cc7 15
brass_phoenix 1:cfa5abca6d43 16 volatile bool pressed;
brass_phoenix 3:4b19b6cf6cc7 17
brass_phoenix 1:cfa5abca6d43 18 volatile bool just_switched_to_pressed;
brass_phoenix 1:cfa5abca6d43 19 volatile bool just_got_pressed;
brass_phoenix 3:4b19b6cf6cc7 20
brass_phoenix 1:cfa5abca6d43 21 public:
brass_phoenix 1:cfa5abca6d43 22 Button(PinName pin_name):
brass_phoenix 3:4b19b6cf6cc7 23 pin(pin_name) {
brass_phoenix 1:cfa5abca6d43 24 pin.rise(this, &Button::rise);
brass_phoenix 1:cfa5abca6d43 25 pin.fall(this, &Button::fall);
brass_phoenix 3:4b19b6cf6cc7 26
brass_phoenix 1:cfa5abca6d43 27 pressed = false;
brass_phoenix 1:cfa5abca6d43 28 }
brass_phoenix 3:4b19b6cf6cc7 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 3:4b19b6cf6cc7 39
brass_phoenix 3:4b19b6cf6cc7 40 bool is_pressed() {
brass_phoenix 3:4b19b6cf6cc7 41 return pressed;
brass_phoenix 3:4b19b6cf6cc7 42 };
brass_phoenix 1:cfa5abca6d43 43 // Only active just after a state change from not pressed to pressed.
brass_phoenix 1:cfa5abca6d43 44 // Get's reset after `update()` is called.
brass_phoenix 3:4b19b6cf6cc7 45 bool has_just_been_pressed() {
brass_phoenix 3:4b19b6cf6cc7 46 return just_got_pressed;
brass_phoenix 3:4b19b6cf6cc7 47 };
brass_phoenix 1:cfa5abca6d43 48 private:
brass_phoenix 1:cfa5abca6d43 49 void rise() {
brass_phoenix 2:141cfcafe72b 50 // Button is now potentially pressed, or is simply bouncing.
brass_phoenix 2:141cfcafe72b 51 debounce_timeout.detach();
brass_phoenix 2:141cfcafe72b 52 pressed = false;
brass_phoenix 1:cfa5abca6d43 53 }
brass_phoenix 3:4b19b6cf6cc7 54
brass_phoenix 1:cfa5abca6d43 55 void fall() {
brass_phoenix 2:141cfcafe72b 56 // Button just got released, or bounced up again.
brass_phoenix 2:141cfcafe72b 57 debounce_timeout.attach(this, &Button::debounce_callback, debounce_time);
brass_phoenix 1:cfa5abca6d43 58 }
brass_phoenix 3:4b19b6cf6cc7 59
brass_phoenix 1:cfa5abca6d43 60 void debounce_callback() {
brass_phoenix 1:cfa5abca6d43 61 pressed = true;
brass_phoenix 1:cfa5abca6d43 62 just_switched_to_pressed = true;
brass_phoenix 1:cfa5abca6d43 63 }
brass_phoenix 1:cfa5abca6d43 64 };