From fb5f2e48a565bc8f51c41d98c6127f90fe8e4402 Mon Sep 17 00:00:00 2001 From: Manuel <71137295+mverch67@users.noreply.github.com> Date: Sun, 13 Aug 2023 02:44:05 +0200 Subject: [PATCH] fix T-Deck trackball crashes (#2714) * try-fix: nodenum crash during boot * Revert "try-fix: nodenum crash during boot" This reverts commit 632012e197632aafdbd5ef09872622274e00bcc0. * fix/workaround: trackball interrupt crashes * trunk fmt * add OSThread to trackballInterrupt --- src/PowerFSM.cpp | 2 +- src/graphics/Screen.cpp | 2 +- src/input/TrackballInterruptBase.cpp | 65 ++++++++++++++++++---------- src/input/TrackballInterruptBase.h | 16 ++++++- src/modules/CannedMessageModule.cpp | 8 ++-- 5 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index a873e93c7..827720d1f 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -177,7 +177,7 @@ static void serialExit() static void powerEnter() { - LOG_DEBUG("Enter state: POWER\n"); + // LOG_DEBUG("Enter state: POWER\n"); if (!isPowered()) { // If we got here, we are in the wrong state - we should be in powered, let that state ahndle things LOG_INFO("Loss of power in Powered\n"); diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 53e2ea95f..d4ed6fdb6 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -1901,7 +1901,7 @@ int Screen::handleUIFrameEvent(const UIFrameEvent *event) int Screen::handleInputEvent(const InputEvent *event) { if (showingNormalScreen && moduleFrames.size() == 0) { - LOG_DEBUG("Screen::handleInputEvent from %s\n", event->source); + // LOG_DEBUG("Screen::handleInputEvent from %s\n", event->source); if (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_LEFT)) { showPrevFrame(); } else if (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT)) { diff --git a/src/input/TrackballInterruptBase.cpp b/src/input/TrackballInterruptBase.cpp index 649e4b362..71cd130cc 100644 --- a/src/input/TrackballInterruptBase.cpp +++ b/src/input/TrackballInterruptBase.cpp @@ -1,10 +1,7 @@ #include "TrackballInterruptBase.h" #include "configuration.h" -TrackballInterruptBase::TrackballInterruptBase(const char *name) -{ - this->_originName = name; -} +TrackballInterruptBase::TrackballInterruptBase(const char *name) : concurrency::OSThread(name), _originName(name) {} void TrackballInterruptBase::init(uint8_t pinDown, uint8_t pinUp, uint8_t pinLeft, uint8_t pinRight, uint8_t pinPress, char eventDown, char eventUp, char eventLeft, char eventRight, char eventPressed, @@ -35,44 +32,64 @@ void TrackballInterruptBase::init(uint8_t pinDown, uint8_t pinUp, uint8_t pinLef LOG_DEBUG("Trackball GPIO initialized (%d, %d, %d, %d, %d)\n", this->_pinUp, this->_pinDown, this->_pinLeft, this->_pinRight, pinPress); + + this->setInterval(100); +} + +int32_t TrackballInterruptBase::runOnce() +{ + InputEvent e; + e.inputEvent = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE; + + if (this->action == TB_ACTION_PRESSED) { + // LOG_DEBUG("Trackball event Press\n"); + e.inputEvent = this->_eventPressed; + } else if (this->action == TB_ACTION_UP) { + // LOG_DEBUG("Trackball event UP\n"); + e.inputEvent = this->_eventUp; + } else if (this->action == TB_ACTION_DOWN) { + // LOG_DEBUG("Trackball event DOWN\n"); + e.inputEvent = this->_eventDown; + } else if (this->action == TB_ACTION_LEFT) { + // LOG_DEBUG("Trackball event LEFT\n"); + e.inputEvent = this->_eventLeft; + } else if (this->action == TB_ACTION_RIGHT) { + // LOG_DEBUG("Trackball event RIGHT\n"); + e.inputEvent = this->_eventRight; + } + + if (e.inputEvent != meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE) { + e.source = this->_originName; + e.kbchar = 0x00; + this->notifyObservers(&e); + } + + this->action = TB_ACTION_NONE; + + return 100; } void TrackballInterruptBase::intPressHandler() { - InputEvent e; - e.source = this->_originName; - e.inputEvent = this->_eventPressed; - this->notifyObservers(&e); + this->action = TB_ACTION_PRESSED; } void TrackballInterruptBase::intDownHandler() { - InputEvent e; - e.source = this->_originName; - e.inputEvent = this->_eventDown; - this->notifyObservers(&e); + this->action = TB_ACTION_DOWN; } void TrackballInterruptBase::intUpHandler() { - InputEvent e; - e.source = this->_originName; - e.inputEvent = this->_eventUp; - this->notifyObservers(&e); + this->action = TB_ACTION_UP; } void TrackballInterruptBase::intLeftHandler() { - InputEvent e; - e.source = this->_originName; - e.inputEvent = this->_eventLeft; - this->notifyObservers(&e); + this->action = TB_ACTION_LEFT; } void TrackballInterruptBase::intRightHandler() { - InputEvent e; - e.source = this->_originName; - e.inputEvent = this->_eventRight; - this->notifyObservers(&e); + this->action = TB_ACTION_RIGHT; } diff --git a/src/input/TrackballInterruptBase.h b/src/input/TrackballInterruptBase.h index a82a20cb0..e7fc99f54 100644 --- a/src/input/TrackballInterruptBase.h +++ b/src/input/TrackballInterruptBase.h @@ -3,7 +3,7 @@ #include "InputBroker.h" #include "mesh/NodeDB.h" -class TrackballInterruptBase : public Observable +class TrackballInterruptBase : public Observable, public concurrency::OSThread { public: explicit TrackballInterruptBase(const char *name); @@ -16,6 +16,20 @@ class TrackballInterruptBase : public Observable void intLeftHandler(); void intRightHandler(); + virtual int32_t runOnce() override; + + protected: + enum TrackballInterruptBaseActionType { + TB_ACTION_NONE, + TB_ACTION_PRESSED, + TB_ACTION_UP, + TB_ACTION_DOWN, + TB_ACTION_LEFT, + TB_ACTION_RIGHT + }; + + volatile TrackballInterruptBaseActionType action = TB_ACTION_NONE; + private: uint8_t _pinDown = 0; uint8_t _pinUp = 0; diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 71a9d746c..e1267ba2a 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -141,12 +141,12 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event) bool validEvent = false; if (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_UP)) { - LOG_DEBUG("Canned message event UP\n"); + // LOG_DEBUG("Canned message event UP\n"); this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_UP; validEvent = true; } if (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_DOWN)) { - LOG_DEBUG("Canned message event DOWN\n"); + // LOG_DEBUG("Canned message event DOWN\n"); this->runState = CANNED_MESSAGE_RUN_STATE_ACTION_DOWN; validEvent = true; } @@ -170,8 +170,8 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event) if ((event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_BACK)) || (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_LEFT)) || (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_RIGHT))) { - LOG_DEBUG("Canned message event (%x)\n", event->kbchar); - // tweak for left/right events generated via trackball/touch with empty kbchar + // LOG_DEBUG("Canned message event (%x)\n", event->kbchar); + // tweak for left/right events generated via trackball/touch with empty kbchar if (!event->kbchar) { if (event->inputEvent == static_cast(meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_LEFT)) { this->payload = 0xb4;