Files
firmware/src/PeriodicTask.h

40 lines
959 B
C
Raw Normal View History

2020-02-06 07:39:21 -08:00
#pragma once
2020-03-15 19:27:42 -07:00
#include <cstdint>
#include "lock.h"
2020-02-06 07:39:21 -08:00
2020-02-21 08:41:36 -08:00
/**
* A base class for tasks that want their doTask() method invoked periodically
2020-03-15 19:27:42 -07:00
*
2020-02-21 08:41:36 -08:00
* FIXME: currently just syntatic sugar for polling in loop (you must call .loop), but eventually
* generalize with the freertos scheduler so we can save lots of power by having everything either in
* something like this or triggered off of an irq.
*/
2020-02-06 07:39:21 -08:00
class PeriodicTask
{
2020-02-21 08:41:36 -08:00
uint32_t lastMsec = 0;
uint32_t period = 1; // call soon after creation
2020-02-06 07:39:21 -08:00
2020-03-15 19:27:42 -07:00
// Protects the above variables.
meshtastic::Lock lock;
2020-02-06 07:39:21 -08:00
2020-03-15 19:27:42 -07:00
public:
2020-02-06 07:39:21 -08:00
virtual ~PeriodicTask() {}
2020-02-21 08:41:36 -08:00
PeriodicTask(uint32_t initialPeriod = 1);
2020-02-06 07:39:21 -08:00
/// call this from loop
2020-02-21 08:41:36 -08:00
virtual void loop();
2020-02-06 07:39:21 -08:00
2020-02-21 10:20:47 -08:00
/// Set a new period in msecs (can be called from doTask or elsewhere and the scheduler will cope)
2020-03-15 19:27:42 -07:00
void setPeriod(uint32_t p)
{
meshtastic::LockGuard lg(&lock);
period = p;
}
2020-02-21 10:20:47 -08:00
2020-03-15 19:27:42 -07:00
protected:
2020-02-21 10:20:47 -08:00
virtual void doTask() = 0;
2020-02-06 07:39:21 -08:00
};