2020-10-09 01:10:44 +00:00
|
|
|
#include "OSThread.h"
|
2020-10-10 01:57:57 +00:00
|
|
|
#include "configuration.h"
|
2020-10-09 01:10:44 +00:00
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
namespace concurrency
|
|
|
|
{
|
|
|
|
|
2020-10-10 01:57:57 +00:00
|
|
|
/// Show debugging info for disabled threads
|
|
|
|
bool OSThread::showDisabled;
|
|
|
|
|
|
|
|
/// Show debugging info for threads when we run them
|
|
|
|
bool OSThread::showRun = false;
|
|
|
|
|
|
|
|
/// Show debugging info for threads we decide not to run;
|
|
|
|
bool OSThread::showWaiting = false;
|
|
|
|
|
2020-12-25 07:17:56 +00:00
|
|
|
const OSThread *OSThread::currentThread;
|
|
|
|
|
2020-10-10 00:28:00 +00:00
|
|
|
ThreadController mainController, timerController;
|
2020-10-10 01:57:57 +00:00
|
|
|
InterruptableDelay mainDelay;
|
2020-10-10 00:28:00 +00:00
|
|
|
|
|
|
|
void OSThread::setup()
|
|
|
|
{
|
|
|
|
mainController.ThreadName = "mainController";
|
|
|
|
timerController.ThreadName = "timerController";
|
|
|
|
}
|
|
|
|
|
|
|
|
OSThread::OSThread(const char *_name, uint32_t period, ThreadController *_controller)
|
|
|
|
: Thread(NULL, period), controller(_controller)
|
|
|
|
{
|
|
|
|
ThreadName = _name;
|
|
|
|
|
|
|
|
if (controller)
|
|
|
|
controller->add(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
OSThread::~OSThread()
|
|
|
|
{
|
|
|
|
if (controller)
|
|
|
|
controller->remove(this);
|
|
|
|
}
|
|
|
|
|
2020-10-10 01:57:57 +00:00
|
|
|
/**
|
|
|
|
* Wait a specified number msecs starting from the current time (rather than the last time we were run)
|
|
|
|
*/
|
|
|
|
void OSThread::setIntervalFromNow(unsigned long _interval)
|
|
|
|
{
|
|
|
|
// Save interval
|
|
|
|
interval = _interval;
|
|
|
|
|
|
|
|
// Cache the next run based on the last_run
|
|
|
|
_cached_next_run = millis() + interval;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool OSThread::shouldRun(unsigned long time)
|
|
|
|
{
|
|
|
|
bool r = Thread::shouldRun(time);
|
|
|
|
|
|
|
|
if (showRun && r)
|
|
|
|
DEBUG_MSG("Thread %s: run\n", ThreadName.c_str());
|
|
|
|
|
|
|
|
if (showWaiting && enabled && !r)
|
|
|
|
DEBUG_MSG("Thread %s: wait %lu\n", ThreadName.c_str(), interval);
|
|
|
|
|
|
|
|
if (showDisabled && !enabled)
|
|
|
|
DEBUG_MSG("Thread %s: disabled\n", ThreadName.c_str());
|
|
|
|
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
2020-10-10 00:28:00 +00:00
|
|
|
void OSThread::run()
|
|
|
|
{
|
2020-12-25 07:17:56 +00:00
|
|
|
currentThread = this;
|
2020-10-10 00:28:00 +00:00
|
|
|
auto newDelay = runOnce();
|
|
|
|
|
|
|
|
runned();
|
|
|
|
|
2020-10-10 01:57:57 +00:00
|
|
|
if (newDelay >= 0)
|
2020-10-10 00:28:00 +00:00
|
|
|
setInterval(newDelay);
|
2020-12-25 07:17:56 +00:00
|
|
|
|
|
|
|
currentThread = NULL;
|
2020-10-10 00:28:00 +00:00
|
|
|
}
|
|
|
|
|
2020-10-09 01:10:44 +00:00
|
|
|
} // namespace concurrency
|