Select Git revision
buttons.h 4.39 KiB
#include "wiring_constants.h"
#ifndef Buttons_h
#define Buttons_h
#include "Arduino.h"
#include "Adafruit_SH110X.h"
#include "Adafruit_GFX.h"
extern Adafruit_SH1106G display;
#define DURATION_SHORT_PRESS 800
#define DURATION_VERY_LONG_PRESS 2000
class Button {
int pin;
bool has_been_pressed;
unsigned long press_start;
unsigned long release_start;
std::function<void()> onPressFunction;
std::function<void()> onHoldFunction;
std::function<void()> onLongHoldFunction;
std::function<void()> onVeryLongHoldFunction;
std::function<void()> onLongPressFunction;
std::function<void()> onVeryLongPressFunction;
std::function<void()> onReleasedFunction;
public:
Button(int pin);
void init();
void read();
unsigned long pressed_since();
unsigned long released_since();
void onPress(std::function<void()> f);
void onHold(std::function<void()> f);
void onLongHold(std::function<void()> f);
void onVeryLongHold(std::function<void()> f);
void onLongPress(std::function<void()> f);
void onVeryLongPress(std::function<void()> f);
void onReleased(std::function<void()> f);
void reset();
};
Button::Button(int pin) {
this->pin = pin;
}
void Button::init() {
pinMode(this->pin, INPUT_PULLUP);
this->has_been_pressed = false;
this->press_start = 0;
this->release_start = 0;
}
void Button::read() {
int is_pressed = !digitalRead(this->pin);
if (is_pressed && this->press_start == 0) {
this->press_start = millis();
}
if (!is_pressed && this->has_been_pressed && this->release_start == 0) {
this->release_start = millis();
}
unsigned long pressed_since = this->pressed_since();
unsigned long released_since = this->released_since();