Files
OptoTest/OpticalChannelTester/Buttons.cpp
Razvalyaev c952c165f8 Добавлено энергосбережение для увеличения работы от аккума:
- через 60 сек экран выключается и есп уходит в сон
- слейв в ожидании мастера прослушивает не постоянно 20мс/100мс
2026-08-08 10:42:59 +03:00

42 lines
1.3 KiB
C++

#include "Buttons.h"
#include "Config.h"
void Button::begin() {
pinMode(pin_, BUTTON_ACTIVE_LEVEL == LOW ? INPUT_PULLUP : INPUT_PULLDOWN);
raw_ = stable_ = (digitalRead(pin_) == BUTTON_ACTIVE_LEVEL);
changedAt_ = millis();
}
void Button::suppressUntilRelease() {
suppressed_ = true;
raw_ = stable_ = (digitalRead(pin_) == BUTTON_ACTIVE_LEVEL);
changedAt_ = millis();
longSent_ = true;
}
ButtonEvent Button::update(uint32_t now) {
const bool sample = (digitalRead(pin_) == BUTTON_ACTIVE_LEVEL);
if (suppressed_) {
raw_ = stable_ = sample;
changedAt_ = now;
if (!sample) { suppressed_ = false; longSent_ = false; }
return ButtonEvent::NONE;
}
if (sample != raw_) { raw_ = sample; changedAt_ = now; }
if (raw_ != stable_ && now - changedAt_ >= BUTTON_DEBOUNCE_MS) {
stable_ = raw_;
if (stable_) {
pressedAt_ = now; nextRepeat_ = now + BUTTON_LONG_PRESS_MS + BUTTON_REPEAT_DELAY_MS;
longSent_ = false;
} else if (!longSent_) return ButtonEvent::SHORT;
}
if (stable_ && !longSent_ && now - pressedAt_ >= BUTTON_LONG_PRESS_MS) {
longSent_ = true; return ButtonEvent::LONG;
}
if (stable_ && longSent_ && now >= nextRepeat_) {
nextRepeat_ += BUTTON_REPEAT_MS; return ButtonEvent::REPEAT;
}
return ButtonEvent::NONE;
}