mirror of
https://github.com/meshtastic/firmware.git
synced 2025-09-05 19:19:18 +00:00

Some checks are pending
CI / setup (check) (push) Waiting to run
CI / setup (esp32) (push) Waiting to run
CI / setup (esp32c3) (push) Waiting to run
CI / setup (esp32c6) (push) Waiting to run
CI / setup (esp32s3) (push) Waiting to run
CI / setup (nrf52840) (push) Waiting to run
CI / setup (rp2040) (push) Waiting to run
CI / setup (rp2350) (push) Waiting to run
CI / setup (stm32) (push) Waiting to run
CI / version (push) Waiting to run
CI / check (push) Blocked by required conditions
CI / build-esp32 (push) Blocked by required conditions
CI / build-esp32s3 (push) Blocked by required conditions
CI / build-esp32c3 (push) Blocked by required conditions
CI / build-esp32c6 (push) Blocked by required conditions
CI / build-nrf52840 (push) Blocked by required conditions
CI / build-rp2040 (push) Blocked by required conditions
CI / build-rp2350 (push) Blocked by required conditions
CI / build-stm32 (push) Blocked by required conditions
CI / build-debian-src (push) Waiting to run
CI / package-pio-deps-native-tft (push) Waiting to run
CI / test-native (push) Waiting to run
CI / docker-deb-amd64 (push) Waiting to run
CI / docker-deb-amd64-tft (push) Waiting to run
CI / docker-alp-amd64 (push) Waiting to run
CI / docker-alp-amd64-tft (push) Waiting to run
CI / docker-deb-arm64 (push) Waiting to run
CI / docker-deb-armv7 (push) Waiting to run
CI / gather-artifacts (esp32) (push) Blocked by required conditions
CI / gather-artifacts (esp32c3) (push) Blocked by required conditions
CI / gather-artifacts (esp32c6) (push) Blocked by required conditions
CI / gather-artifacts (esp32s3) (push) Blocked by required conditions
CI / gather-artifacts (nrf52840) (push) Blocked by required conditions
CI / gather-artifacts (rp2040) (push) Blocked by required conditions
CI / gather-artifacts (rp2350) (push) Blocked by required conditions
CI / gather-artifacts (stm32) (push) Blocked by required conditions
CI / release-artifacts (push) Blocked by required conditions
CI / release-firmware (esp32) (push) Blocked by required conditions
CI / release-firmware (esp32c3) (push) Blocked by required conditions
CI / release-firmware (esp32c6) (push) Blocked by required conditions
CI / release-firmware (esp32s3) (push) Blocked by required conditions
CI / release-firmware (nrf52840) (push) Blocked by required conditions
CI / release-firmware (rp2040) (push) Blocked by required conditions
CI / release-firmware (rp2350) (push) Blocked by required conditions
CI / release-firmware (stm32) (push) Blocked by required conditions
CI / publish-firmware (push) Blocked by required conditions
* Don't use pin 0 on RAK for input * Use boolean instead of define --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
90 lines
2.6 KiB
C++
90 lines
2.6 KiB
C++
#include "UpDownInterruptBase.h"
|
|
#include "configuration.h"
|
|
|
|
UpDownInterruptBase::UpDownInterruptBase(const char *name) : concurrency::OSThread(name)
|
|
{
|
|
this->_originName = name;
|
|
}
|
|
|
|
void UpDownInterruptBase::init(uint8_t pinDown, uint8_t pinUp, uint8_t pinPress, input_broker_event eventDown,
|
|
input_broker_event eventUp, input_broker_event eventPressed, void (*onIntDown)(),
|
|
void (*onIntUp)(), void (*onIntPress)(), unsigned long updownDebounceMs)
|
|
{
|
|
this->_pinDown = pinDown;
|
|
this->_pinUp = pinUp;
|
|
this->_eventDown = eventDown;
|
|
this->_eventUp = eventUp;
|
|
this->_eventPressed = eventPressed;
|
|
bool isRAK = false;
|
|
#ifdef RAK_4631
|
|
isRAK = true;
|
|
#endif
|
|
|
|
if (!isRAK || pinPress != 0) {
|
|
pinMode(pinPress, INPUT_PULLUP);
|
|
attachInterrupt(pinPress, onIntPress, RISING);
|
|
}
|
|
if (!isRAK || this->_pinDown != 0) {
|
|
pinMode(this->_pinDown, INPUT_PULLUP);
|
|
attachInterrupt(this->_pinDown, onIntDown, RISING);
|
|
}
|
|
if (!isRAK || this->_pinUp != 0) {
|
|
pinMode(this->_pinUp, INPUT_PULLUP);
|
|
attachInterrupt(this->_pinUp, onIntUp, RISING);
|
|
}
|
|
|
|
LOG_DEBUG("Up/down/press GPIO initialized (%d, %d, %d)", this->_pinUp, this->_pinDown, pinPress);
|
|
|
|
this->setInterval(100);
|
|
}
|
|
|
|
int32_t UpDownInterruptBase::runOnce()
|
|
{
|
|
InputEvent e;
|
|
e.inputEvent = INPUT_BROKER_NONE;
|
|
unsigned long now = millis();
|
|
if (this->action == UPDOWN_ACTION_PRESSED) {
|
|
if (now - lastPressKeyTime >= pressDebounceMs) {
|
|
lastPressKeyTime = now;
|
|
LOG_DEBUG("GPIO event Press");
|
|
e.inputEvent = this->_eventPressed;
|
|
}
|
|
} else if (this->action == UPDOWN_ACTION_UP) {
|
|
if (now - lastUpKeyTime >= updownDebounceMs) {
|
|
lastUpKeyTime = now;
|
|
LOG_DEBUG("GPIO event Up");
|
|
e.inputEvent = this->_eventUp;
|
|
}
|
|
} else if (this->action == UPDOWN_ACTION_DOWN) {
|
|
if (now - lastDownKeyTime >= updownDebounceMs) {
|
|
lastDownKeyTime = now;
|
|
LOG_DEBUG("GPIO event Down");
|
|
e.inputEvent = this->_eventDown;
|
|
}
|
|
}
|
|
|
|
if (e.inputEvent != INPUT_BROKER_NONE) {
|
|
e.source = this->_originName;
|
|
e.kbchar = INPUT_BROKER_NONE;
|
|
this->notifyObservers(&e);
|
|
}
|
|
|
|
this->action = UPDOWN_ACTION_NONE;
|
|
return 100;
|
|
}
|
|
|
|
void UpDownInterruptBase::intPressHandler()
|
|
{
|
|
this->action = UPDOWN_ACTION_PRESSED;
|
|
}
|
|
|
|
void UpDownInterruptBase::intDownHandler()
|
|
{
|
|
this->action = UPDOWN_ACTION_DOWN;
|
|
}
|
|
|
|
void UpDownInterruptBase::intUpHandler()
|
|
{
|
|
this->action = UPDOWN_ACTION_UP;
|
|
}
|