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;
    }
};