TaskManagerIO
Loading...
Searching...
No Matches
TaskTypes.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 https://www.thecoderscorner.com (Dave Cherry)..
3 * This product is licensed under an Apache license, see the LICENSE file in the top-level directory.
4 */
5
6#ifndef TASKMANAGER_IO_TASKTYPES_H
7#define TASKMANAGER_IO_TASKTYPES_H
8
13
14#include "TaskPlatformDeps.h"
15
16#define TASKMGR_INVALIDID 0xffffU
17
22typedef unsigned int taskid_t;
23
29public:
33 virtual void exec() = 0;
34
38 virtual ~Executable() = default;
39};
40
41// forward references to TaskManager to avoid circular include.
42class TaskManager;
44extern TaskManager taskManager;
45
57class BaseEvent : public Executable {
58private:
59 TaskManager *taskMgrAssociation;
60 volatile bool triggered;
61 volatile bool finished;
62public:
63 explicit BaseEvent(TaskManager *taskMgrToUse = &taskManager) :
64 taskMgrAssociation(taskMgrToUse), triggered(false), finished(false) {}
65
73 virtual uint32_t timeOfNextCheck() = 0;
74
79 void setTriggered(bool t) {
80 triggered = t;
81 }
82
86 bool isTriggered() const {
87 return triggered;
88 }
89
93 bool isComplete() const {
94 return finished;
95 }
96
102 void setCompleted(bool complete) {
103 finished = complete;
104 }
105
113};
114
118#ifdef TM_ALLOW_CAPTURED_LAMBDA
119#include <functional>
120typedef std::function<void()> TimerFn;
121#else
122typedef void (*TimerFn)();
123#endif
124
128enum TimerUnit : uint8_t {
135
136 TM_TIME_REPEATING = 0x10,
137 TM_TIME_RUNNING = 0x20,
138};
139
145enum ExecutionType : uint8_t {
146 EXECTYPE_FUNCTION = 0,
147 EXECTYPE_EXECUTABLE = 1,
148 EXECTYPE_EVENT = 2,
149
150 EXECTYPE_MASK = 0x03,
151 EXECTYPE_DELETE_ON_DONE = 0x08,
152
153 EXECTYPE_DEL_EXECUTABLE = EXECTYPE_EXECUTABLE | EXECTYPE_DELETE_ON_DONE,
154 EXECTYPE_DEL_EVENT = EXECTYPE_EVENT | EXECTYPE_DELETE_ON_DONE
155};
156
163class TimerTask {
164private:
165#ifdef TM_ALLOW_CAPTURED_LAMBDA
167 volatile union {
168 Executable *taskRef;
169 BaseEvent *eventRef;
170 };
171 TimerFn callback;
172#else
174 volatile union {
175 TimerFn callback;
176 Executable *taskRef;
177 BaseEvent *eventRef;
178 };
179#endif
180
182 tm_internal::TimerTaskAtomicPtr next;
183
185 volatile uint32_t scheduledAt;
187 volatile sched_t myTimingSchedule;
188
189 // 8 bit values start here.
190
192 volatile TimerUnit timingInformation;
194 tm_internal::TmAtomicBool taskInUse;
196 volatile ExecutionType executeMode;
198 tm_internal::TmAtomicBool taskEnabled;
199public:
200 TimerTask();
201
205 unsigned long microsFromNow();
206
213 void initialise(sched_t when, TimerUnit unit, TimerFn execCallback, bool repeating);
214
222 void initialise(sched_t when, TimerUnit unit, Executable *executable, bool deleteWhenDone, bool repeating);
223
229 void initialiseEvent(BaseEvent *event, bool deleteWhenDone);
230
236 void handleScheduling(sched_t when, TimerUnit unit, bool repeating);
237
242 bool isInUse() { return tm_internal::atomicReadBool(&taskInUse); }
243
248 bool isRepeating() const;
249
253 void clear();
254
260 return tm_internal::atomicSwapBool(&taskInUse, false, true);
261 }
262
266 void markRunning() { timingInformation = TimerUnit(timingInformation | TM_TIME_RUNNING); }
267
271 void clearRunning() { timingInformation = TimerUnit(timingInformation & ~TM_TIME_RUNNING); }
272
276 bool isRunning() const { return (timingInformation & TM_TIME_RUNNING) != 0; }
277
281 bool isEvent() {
282 auto execType = ExecutionType(executeMode & EXECTYPE_MASK);
283 return (isInUse() && execType == EXECTYPE_EVENT);
284 }
285
290 TimerTask *getNext() { return tm_internal::atomicReadPtr(&next); }
291
296 void setNext(TimerTask *nextTask) { tm_internal::atomicWritePtr(&this->next, nextTask); }
297
301 void execute();
302
310 void processEvent();
311
315 bool isMicrosSchedule() { return (timingInformation & 0x0fU)==TIME_MICROS; }
319 bool isMillisSchedule() { return (timingInformation & 0x0fU)==TIME_MILLIS; }
320
324 bool isEnabled() { return tm_internal::atomicReadBool(&taskEnabled); }
325
330 void setEnabled(bool ena) { tm_internal::atomicWriteBool(&taskEnabled, ena); }
331};
332
333#endif //TASKMANAGER_IO_TASKTYPES_H
provides the platform specific configuration for task manager
TimerTask * atomicReadPtr(TimerTaskAtomicPtr *pPtr)
Definition TaskPlatformDeps.h:106
void atomicWritePtr(TimerTaskAtomicPtr *pPtr, TimerTask *volatile newValue)
Definition TaskPlatformDeps.h:116
void atomicWriteBool(TmAtomicBool *pPtr, bool newVal)
Definition TaskPlatformDeps.h:95
bool atomicSwapBool(volatile bool *ptr, bool expected, bool newValue)
Definition TaskPlatformDeps.h:84
bool atomicReadBool(TmAtomicBool *pPtr)
Definition TaskPlatformDeps.h:91
std::function< void()> TimerFn
Definition TaskTypes.h:120
TimerUnit
Definition TaskTypes.h:128
@ TIME_SECONDS
Definition TaskTypes.h:132
@ TIME_MILLIS
Definition TaskTypes.h:134
@ TIME_MICROS
Definition TaskTypes.h:130
ExecutionType
Definition TaskTypes.h:145
TaskManager taskManager
Definition TaskManagerIO.cpp:39
unsigned int taskid_t
Definition TaskTypes.h:22
Definition TaskTypes.h:57
virtual uint32_t timeOfNextCheck()=0
bool isComplete() const
Definition TaskTypes.h:93
void setTriggered(bool t)
Definition TaskTypes.h:79
bool isTriggered() const
Definition TaskTypes.h:86
void setCompleted(bool complete)
Definition TaskTypes.h:102
void markTriggeredAndNotify()
Definition TaskTypes.cpp:151
Definition TaskTypes.h:28
virtual void exec()=0
virtual ~Executable()=default
Definition TaskManagerIO.h:158
void execute()
Definition TaskTypes.cpp:86
void setEnabled(bool ena)
Definition TaskTypes.h:330
bool isInUse()
Definition TaskTypes.h:242
bool isRunning() const
Definition TaskTypes.h:276
void markRunning()
Definition TaskTypes.h:266
void processEvent()
Definition TaskTypes.cpp:129
void initialise(sched_t when, TimerUnit unit, TimerFn execCallback, bool repeating)
Definition TaskTypes.cpp:40
void clear()
Definition TaskTypes.cpp:110
void setNext(TimerTask *nextTask)
Definition TaskTypes.h:296
TimerTask * getNext()
Definition TaskTypes.h:290
bool allocateIfPossible()
Definition TaskTypes.h:259
void clearRunning()
Definition TaskTypes.h:271
unsigned long microsFromNow()
Definition TaskTypes.cpp:71
bool isRepeating() const
Definition TaskTypes.cpp:140
bool isMicrosSchedule()
Definition TaskTypes.h:315
bool isEvent()
Definition TaskTypes.h:281
void initialiseEvent(BaseEvent *event, bool deleteWhenDone)
Definition TaskTypes.cpp:65
bool isEnabled()
Definition TaskTypes.h:324
bool isMillisSchedule()
Definition TaskTypes.h:319
void handleScheduling(sched_t when, TimerUnit unit, bool repeating)
Definition TaskTypes.cpp:46
void initialise(sched_t when, TimerUnit unit, Executable *executable, bool deleteWhenDone, bool repeating)