2025-08-08 20:01:31 +10:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <Arduino.h>
|
|
|
|
|
|
|
|
|
|
#define BUTTON_EVENT_NONE 0
|
|
|
|
|
#define BUTTON_EVENT_CLICK 1
|
|
|
|
|
#define BUTTON_EVENT_LONG_PRESS 2
|
2025-09-03 08:25:59 +10:00
|
|
|
#define BUTTON_EVENT_DOUBLE_CLICK 3
|
|
|
|
|
#define BUTTON_EVENT_TRIPLE_CLICK 4
|
2025-08-08 20:01:31 +10:00
|
|
|
|
|
|
|
|
class MomentaryButton {
|
|
|
|
|
int8_t _pin;
|
|
|
|
|
int8_t prev, cancel;
|
2025-08-12 10:01:35 +10:00
|
|
|
bool _reverse, _pull;
|
2025-08-08 20:01:31 +10:00
|
|
|
int _long_millis;
|
2025-09-01 17:11:55 +10:00
|
|
|
int _threshold; // analog mode
|
2025-08-08 20:01:31 +10:00
|
|
|
unsigned long down_at;
|
2025-09-03 08:25:59 +10:00
|
|
|
uint8_t _click_count;
|
|
|
|
|
unsigned long _last_click_time;
|
|
|
|
|
int _multi_click_window;
|
|
|
|
|
bool _pending_click;
|
2025-08-08 20:01:31 +10:00
|
|
|
|
|
|
|
|
bool isPressed(int level) const;
|
|
|
|
|
|
|
|
|
|
public:
|
2025-10-16 17:33:22 +11:00
|
|
|
MomentaryButton(int8_t pin, int long_press_mills=0, bool reverse=false, bool pulldownup=false, bool multiclick=true);
|
2025-09-01 17:11:55 +10:00
|
|
|
MomentaryButton(int8_t pin, int long_press_mills, int analog_threshold);
|
2025-08-12 10:01:35 +10:00
|
|
|
void begin();
|
2025-08-08 20:01:31 +10:00
|
|
|
int check(bool repeat_click=false); // returns one of BUTTON_EVENT_*
|
|
|
|
|
void cancelClick(); // suppress next BUTTON_EVENT_CLICK (if already in DOWN state)
|
|
|
|
|
uint8_t getPin() { return _pin; }
|
|
|
|
|
bool isPressed() const;
|
|
|
|
|
};
|