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