add locks to PeriodicTask

This commit is contained in:
Girts Folkmanis 2020-03-15 19:27:42 -07:00
parent 0cbcb7a9bd
commit 90ecdf229e
2 changed files with 22 additions and 14 deletions

View File

@ -1,19 +1,21 @@
#include "PeriodicTask.h" #include "PeriodicTask.h"
#include "Periodic.h" #include "Periodic.h"
PeriodicTask::PeriodicTask(uint32_t initialPeriod) : period(initialPeriod) PeriodicTask::PeriodicTask(uint32_t initialPeriod) : period(initialPeriod) {}
{
}
/// call this from loop /// call this from loop
void PeriodicTask::loop() void PeriodicTask::loop()
{ {
uint32_t now = millis();
if (period && (now - lastMsec) >= period)
{ {
lastMsec = now; meshtastic::LockGuard lg(&lock);
doTask(); uint32_t now = millis();
if (!period || (now - lastMsec) < period) {
return;
} }
lastMsec = now;
}
// Release the lock in case the task wants to change the period.
doTask();
} }
void Periodic::doTask() void Periodic::doTask()

View File

@ -1,7 +1,8 @@
#pragma once #pragma once
#include <Arduino.h> #include <cstdint>
#include "configuration.h"
#include "lock.h"
/** /**
* A base class for tasks that want their doTask() method invoked periodically * A base class for tasks that want their doTask() method invoked periodically
@ -15,9 +16,10 @@ class PeriodicTask
uint32_t lastMsec = 0; uint32_t lastMsec = 0;
uint32_t period = 1; // call soon after creation uint32_t period = 1; // call soon after creation
public: // Protects the above variables.
uint32_t periodMsec; meshtastic::Lock lock;
public:
virtual ~PeriodicTask() {} virtual ~PeriodicTask() {}
PeriodicTask(uint32_t initialPeriod = 1); PeriodicTask(uint32_t initialPeriod = 1);
@ -26,8 +28,12 @@ public:
virtual void loop(); virtual void loop();
/// Set a new period in msecs (can be called from doTask or elsewhere and the scheduler will cope) /// Set a new period in msecs (can be called from doTask or elsewhere and the scheduler will cope)
void setPeriod(uint32_t p) { period = p; } void setPeriod(uint32_t p)
{
meshtastic::LockGuard lg(&lock);
period = p;
}
protected: protected:
virtual void doTask() = 0; virtual void doTask() = 0;
}; };