firmware/src/concurrency/NotifiedWorkerThread.cpp

85 lines
1.9 KiB
C++
Raw Normal View History

2020-10-10 00:28:00 +00:00
#include "NotifiedWorkerThread.h"
2020-10-10 01:57:57 +00:00
#include "configuration.h"
2020-10-10 00:28:00 +00:00
#include <assert.h>
namespace concurrency
{
2020-10-10 01:57:57 +00:00
static bool debugNotification;
2020-10-10 00:28:00 +00:00
/**
* Notify this thread so it can run
*/
2020-10-10 01:57:57 +00:00
bool NotifiedWorkerThread::notify(uint32_t v, bool overwrite)
{
bool r = notifyCommon(v, overwrite);
if (r)
mainDelay.interrupt();
return r;
}
/**
* Notify this thread so it can run
*/
IRAM_ATTR bool NotifiedWorkerThread::notifyCommon(uint32_t v, bool overwrite)
{
if (overwrite || notification == 0) {
enabled = true;
setInterval(0); // Run ASAP
notification = v;
if (debugNotification)
DEBUG_MSG("setting notification %d\n", v);
return true;
} else {
if (debugNotification)
DEBUG_MSG("dropping notification %d\n", v);
return false;
}
2020-10-10 00:28:00 +00:00
}
/**
* Notify from an ISR
*
* This must be inline or IRAM_ATTR on ESP32
*/
2020-10-10 01:57:57 +00:00
IRAM_ATTR bool NotifiedWorkerThread::notifyFromISR(BaseType_t *highPriWoken, uint32_t v, bool overwrite)
2020-10-10 00:28:00 +00:00
{
2020-10-10 01:57:57 +00:00
bool r = notifyCommon(v, overwrite);
if (r)
mainDelay.interruptFromISR(highPriWoken);
return r;
2020-10-10 00:28:00 +00:00
}
/**
* Schedule a notification to fire in delay msecs
*/
2020-10-10 01:57:57 +00:00
bool NotifiedWorkerThread::notifyLater(uint32_t delay, uint32_t v, bool overwrite)
{
bool didIt = notify(v, overwrite);
if (didIt) { // If we didn't already have something queued, override the delay to be larger
setIntervalFromNow(delay); // a new version of setInterval relative to the current time
if (debugNotification)
DEBUG_MSG("delaying notification %u\n", delay);
}
2020-10-10 00:28:00 +00:00
2020-10-10 01:57:57 +00:00
return didIt;
2020-10-10 00:28:00 +00:00
}
2020-10-10 01:57:57 +00:00
int32_t NotifiedWorkerThread::runOnce()
{
auto n = notification;
enabled = false; // Only run once per notification
notification = 0; // clear notification
if (n) {
onNotify(n);
}
2020-10-10 00:28:00 +00:00
2020-10-10 01:57:57 +00:00
return RUN_SAME;
2020-10-10 00:28:00 +00:00
}
} // namespace concurrency