From 0b5030b436c01b8520ad6f3c25239017a0a38952 Mon Sep 17 00:00:00 2001 From: m1nl Date: Thu, 24 Apr 2025 00:33:48 +0200 Subject: [PATCH] ensure acquired SPI lock prevents light-sleep --- src/SPILock.cpp | 47 +++++++++++++++++++++++++++++++++++++++++- src/concurrency/Lock.h | 4 ++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/SPILock.cpp b/src/SPILock.cpp index 13fa556fc..9bb027ae8 100644 --- a/src/SPILock.cpp +++ b/src/SPILock.cpp @@ -1,12 +1,57 @@ #include "SPILock.h" +#include "PowerFSM.h" #include "configuration.h" +#include "sleep.h" #include #include concurrency::Lock *spiLock; +class SPILock : public concurrency::Lock +{ + public: + SPILock(); + ~SPILock(); + + void lock() override; + void unlock() override; + + private: + bool locked; + + int preflightSleepCb(void *unused = NULL) { return locked ? 1 : 0; } + + CallbackObserver preflightSleepObserver = + CallbackObserver(this, &SPILock::preflightSleepCb); +}; + +SPILock::SPILock() : Lock() +{ + locked = false; + preflightSleepObserver.observe(&preflightSleep); +} + +SPILock::~SPILock() +{ + preflightSleepObserver.unobserve(&preflightSleep); +} + +void SPILock::lock() +{ + powerFSM.trigger(EVENT_WAKE_TIMER); + + Lock::lock(); + locked = true; +} + +void SPILock::unlock() +{ + locked = false; + Lock::unlock(); +} + void initSPI() { assert(!spiLock); - spiLock = new concurrency::Lock(); + spiLock = new SPILock(); } \ No newline at end of file diff --git a/src/concurrency/Lock.h b/src/concurrency/Lock.h index 1b9ea20d5..a0ef84873 100644 --- a/src/concurrency/Lock.h +++ b/src/concurrency/Lock.h @@ -19,12 +19,12 @@ class Lock /// Locks the lock. // // Must not be called from an ISR. - void lock(); + virtual void lock(); // Unlocks the lock. // // Must not be called from an ISR. - void unlock(); + virtual void unlock(); private: #ifdef HAS_FREE_RTOS