mirror of
https://github.com/meshcore-dev/MeshCore.git
synced 2026-04-20 22:13:47 +00:00
75 lines
No EOL
1.9 KiB
C++
75 lines
No EOL
1.9 KiB
C++
#include "MomentaryButton.h"
|
|
|
|
MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse, bool pulldownup) {
|
|
_pin = pin;
|
|
_reverse = reverse;
|
|
_pull = pulldownup;
|
|
down_at = 0;
|
|
prev = _reverse ? HIGH : LOW;
|
|
cancel = 0;
|
|
_long_millis = long_press_millis;
|
|
}
|
|
|
|
void MomentaryButton::begin() {
|
|
if (_pin >= 0) {
|
|
pinMode(_pin, _pull ? (_reverse ? INPUT_PULLUP : INPUT_PULLDOWN) : INPUT);
|
|
}
|
|
}
|
|
|
|
bool MomentaryButton::isPressed() const {
|
|
return isPressed(digitalRead(_pin));
|
|
}
|
|
|
|
void MomentaryButton::cancelClick() {
|
|
cancel = 1;
|
|
}
|
|
|
|
bool MomentaryButton::isPressed(int level) const {
|
|
if (_reverse) {
|
|
return level == LOW;
|
|
} else {
|
|
return level != LOW;
|
|
}
|
|
}
|
|
|
|
int MomentaryButton::check(bool repeat_click) {
|
|
if (_pin < 0) return BUTTON_EVENT_NONE;
|
|
|
|
int event = BUTTON_EVENT_NONE;
|
|
int btn = digitalRead(_pin);
|
|
if (btn != prev) {
|
|
if (isPressed(btn)) {
|
|
down_at = millis();
|
|
} else {
|
|
// button UP
|
|
if (_long_millis > 0) {
|
|
if (down_at > 0 && (unsigned long)(millis() - down_at) < _long_millis) { // only a CLICK if still within the long_press millis
|
|
event = BUTTON_EVENT_CLICK;
|
|
}
|
|
} else {
|
|
event = BUTTON_EVENT_CLICK; // any UP results in CLICK event when NOT using long_press feature
|
|
}
|
|
if (event == BUTTON_EVENT_CLICK && cancel) {
|
|
event = BUTTON_EVENT_NONE;
|
|
}
|
|
down_at = 0;
|
|
}
|
|
prev = btn;
|
|
}
|
|
if (!isPressed(btn) && cancel) { // always clear the pending 'cancel' once button is back in UP state
|
|
cancel = 0;
|
|
}
|
|
|
|
if (_long_millis > 0 && down_at > 0 && (unsigned long)(millis() - down_at) >= _long_millis) {
|
|
event = BUTTON_EVENT_LONG_PRESS;
|
|
down_at = 0;
|
|
}
|
|
if (down_at > 0 && repeat_click) {
|
|
unsigned long diff = (unsigned long)(millis() - down_at);
|
|
if (diff >= 700) {
|
|
event = BUTTON_EVENT_CLICK; // wait 700 millis before repeating the click events
|
|
}
|
|
}
|
|
|
|
return event;
|
|
} |