mirror of
https://github.com/meshtastic/firmware.git
synced 2026-10-11 17:21:32 -04:00
adds VARIANT_TOUCHSCREEN and ENABLE_TOUCH_INT (#10815)
* addsVARIANT_TOUCHSCREEN and ENABLE_TOUCH_INT * Remove a duplicated _getTouch function pointer
This commit is contained in:
1 parent
21dbe21745
commit
87bb149afb
6 files changed
+87
-1
No files matched your search
@@ -2,7 +2,9 @@
|
||||
#include "InputBroker.h"
|
||||
#include "PowerFSM.h"
|
||||
#include "configuration.h"
|
||||
#include "main.h"
|
||||
#include "modules/ExternalNotificationModule.h"
|
||||
#include "sleep.h"
|
||||
#include <cstring>
|
||||
|
||||
#ifdef MESHTASTIC_INCLUDE_NICHE_GRAPHICS
|
||||
@@ -16,6 +18,28 @@
|
||||
|
||||
TouchScreenImpl1 *touchScreenImpl1;
|
||||
|
||||
// Hardware-interrupt wake on the touch IRQ line. Some touch boards
|
||||
// either drive this pin differently (RAK14014 already owns this interrupt in TFTDisplay) or
|
||||
// route it through an IO expander, which can't be used with attachInterrupt().
|
||||
|
||||
// use ENABLE_TOUCH_INT to indicate that we should enable the interrupt here.
|
||||
#if defined(SCREEN_TOUCH_INT) && defined(ENABLE_TOUCH_INT)
|
||||
|
||||
// The touch controller pulls SCREEN_TOUCH_INT low when a new touch begins. Wake the polling
|
||||
// thread immediately so the touch is handled without waiting for the next idle poll. The
|
||||
// periodic poll in TouchScreenBase::runOnce() remains as a fallback. Mirrors the button
|
||||
// interrupt handling in ButtonThread/InputBroker.
|
||||
static void touchScreenInterruptHandler()
|
||||
{
|
||||
if (touchScreenImpl1) {
|
||||
touchScreenImpl1->setIntervalFromNow(0);
|
||||
runASAP = true;
|
||||
BaseType_t higherWake = 0;
|
||||
concurrency::mainDelay.interruptFromISR(&higherWake);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
TouchScreenImpl1::TouchScreenImpl1(uint16_t width, uint16_t height, bool (*getTouch)(int16_t *, int16_t *))
|
||||
: TouchScreenBase("touchscreen1", width, height), _getTouch(getTouch)
|
||||
{
|
||||
@@ -27,6 +51,7 @@ void TouchScreenImpl1::init()
|
||||
if (portduino_config.touchscreenModule) {
|
||||
TouchScreenBase::init(true);
|
||||
inputBroker->registerSource(this);
|
||||
attachTouchInterrupt();
|
||||
} else {
|
||||
TouchScreenBase::init(false);
|
||||
}
|
||||
@@ -37,9 +62,46 @@ void TouchScreenImpl1::init()
|
||||
TouchScreenBase::init(true);
|
||||
if (inputBroker)
|
||||
inputBroker->registerSource(this);
|
||||
attachTouchInterrupt();
|
||||
#endif
|
||||
|
||||
#if defined(ENABLE_TOUCH_INT) && defined(ARCH_ESP32)
|
||||
// Detach/reattach our interrupt around light sleep, so sleep.cpp can configure the touch
|
||||
// pin as a wake source without our handler interfering.
|
||||
lsObserver.observe(¬ifyLightSleep);
|
||||
lsEndObserver.observe(¬ifyLightSleepEnd);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Attach the touch-controller IRQ so a new touch wakes the polling thread immediately.
|
||||
// No-op on boards without a usable touch interrupt line.
|
||||
void TouchScreenImpl1::attachTouchInterrupt()
|
||||
{
|
||||
#ifdef ENABLE_TOUCH_INT
|
||||
pinMode(SCREEN_TOUCH_INT, INPUT_PULLUP);
|
||||
attachInterrupt(SCREEN_TOUCH_INT, touchScreenInterruptHandler, FALLING);
|
||||
LOG_INFO("TouchScreen interrupt attached on pin %d", SCREEN_TOUCH_INT);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef ARCH_ESP32
|
||||
// Detach our interrupt before light sleep; sleep.cpp configures its own wake-on-touch.
|
||||
int TouchScreenImpl1::beforeLightSleep(void *unused)
|
||||
{
|
||||
#ifdef ENABLE_TOUCH_INT
|
||||
detachInterrupt(SCREEN_TOUCH_INT);
|
||||
#endif
|
||||
return 0; // Indicates success
|
||||
}
|
||||
|
||||
// Reattach our interrupt after waking from light sleep.
|
||||
int TouchScreenImpl1::afterLightSleep(esp_sleep_wakeup_cause_t cause)
|
||||
{
|
||||
attachTouchInterrupt();
|
||||
return 0; // Indicates success
|
||||
}
|
||||
#endif
|
||||
|
||||
bool TouchScreenImpl1::getTouch(int16_t &x, int16_t &y)
|
||||
{
|
||||
return _getTouch(&x, &y);
|
||||
|
||||
Reference in new issue
Block a user