-
Joe Revans authoredJoe Revans authored
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() {