Skip to content
Snippets Groups Projects
Select Git revision
  • b36d3d76de0a2003b1d917cbf90a47eb6b306ebc
  • main default protected
  • fix-buffer
  • feature-individual-lfos
  • feature-individual-volume
  • 1.3.0
  • 1.2.0
  • 1.1.0
  • 1.0.1
  • 1.0.0
10 results

buttons.h

Blame
  • 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();