Skip to content
Snippets Groups Projects
Button.h 3.27 KiB
#ifndef BUTTON_h
#define BUTTON_h

class Button {

  private:
    int _pin;
    int _id;

    bool _state;

    volatile bool _inputFlag = false;
    bool _changeFlag = false;

    bool _pressedFlag = false;
    bool _holdFlag = false;

    unsigned long _previousTimer;

    int _clickInterval = 1000;
    int _holdInterval = 1000;
    int _repeatInterval = 1000;

    void (*_cb)(Button*, uint8_t, bool); // Callback function

    bool _read() {
      return digitalRead(_pin);
    }

    void _setClickInterval(int x) {
      _clickInterval = x;
    }

    void _setHoldInterval(int x) {
      _holdInterval = x;
    }

    void _setRepeatInterval(int x) {
      _repeatInterval = x;
    }

  public:

    // Public members:

    static const uint8_t kEventPressed = 0;        // Button was pressed
    static const uint8_t kEventReleased = 1;       // Button was released
    static const uint8_t kEventClicked = 2;        // Button was clicked (pressed and released within _clickInterval)
    static const uint8_t kEventHeld = 3;    // Button was held down for longer than _holdInterval
    static const uint8_t kEventTick = 4;  // Event released every _repeatInterval when button held

    // Public functions:

    Button(int pin, int id = 99) : _pin(pin), _id(id) {
      pinMode(_pin, INPUT_PULLUP);

      _state = _read();

      _previousTimer = millis();
    }

    void initInterrupts(void(*function)()) {
      attachInterrupt(_pin, function, CHANGE);
    }

    void setEventHandler(void(*function)(Button*, uint8_t, bool)) {
      _cb = function;
    }

    bool getState() {