Simple Task Scheduler. For the moment only implements continuous running tasks and periodic tasks.
Example
two blinking leds
#include "mbed.h" #include "task_scheduler.h" Serial pc(USBTX, USBRX); // tx, r class Foo { DigitalOut myled1; int counter; public: Foo(void) :myled1(LED1) { counter = 0; } void alive_task(void) { if (counter++ % 30000 == 0) { myled1 = !myled1; } } }; class Bar { DigitalOut myled2; public: Bar(void) :myled2(LED2) {} void control_task(void) { myled2 = !myled2; } }; int main() { Foo foo; Bar bar; SimpleTaskScheduler::TaskScheduler scheduler; scheduler.create_continuous_task(&foo, &Foo::alive_task); scheduler.create_periodic_task(&bar, &Bar::control_task, 1); while(1) { scheduler.update(); } }
task_scheduler.h@3:bd96023168df, 2016-12-13 (annotated)
- Committer:
- dwini
- Date:
- Tue Dec 13 14:48:48 2016 +0100
- Revision:
- 3:bd96023168df
- Parent:
- 2:1d20f2b3c788
Refactor and allow starting and stopping of tasks.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dwini | 0:ba0870ec8714 | 1 | #pragma once |
dwini | 0:ba0870ec8714 | 2 | |
dwini | 0:ba0870ec8714 | 3 | #include <vector> |
dwini |
3:bd96023168df | 4 | #include "continuous_task.h" |
dwini | 0:ba0870ec8714 | 5 | #include "periodic_task.h" |
dwini | 0:ba0870ec8714 | 6 | |
dwini | 0:ba0870ec8714 | 7 | // Definition of template methods need to be inside header file. |
dwini | 0:ba0870ec8714 | 8 | // http://stackoverflow.com/questions/8752837/undefined-reference-to-template-class-constructor |
dwini | 0:ba0870ec8714 | 9 | |
dwini | 0:ba0870ec8714 | 10 | namespace SimpleTaskScheduler { |
dwini | 0:ba0870ec8714 | 11 | |
dwini | 0:ba0870ec8714 | 12 | class TaskScheduler { |
dwini | 0:ba0870ec8714 | 13 | |
dwini | 0:ba0870ec8714 | 14 | private: |
dwini | 0:ba0870ec8714 | 15 | std::vector<Task *> tasks; |
dwini | 0:ba0870ec8714 | 16 | |
dwini | 0:ba0870ec8714 | 17 | public: |
dwini | 0:ba0870ec8714 | 18 | TaskScheduler(void); |
dwini | 0:ba0870ec8714 | 19 | ~TaskScheduler(void); |
dwini | 0:ba0870ec8714 | 20 | |
dwini | 0:ba0870ec8714 | 21 | public: |
dwini | 0:ba0870ec8714 | 22 | void update(void); |
dwini |
3:bd96023168df | 23 | void stop_task(unsigned int id); |
dwini |
3:bd96023168df | 24 | void start_task(unsigned int id); |
dwini | 0:ba0870ec8714 | 25 | |
dwini | 0:ba0870ec8714 | 26 | public: |
dwini |
3:bd96023168df | 27 | template<typename T> unsigned int create_continuous_task(T* object, void (T::*method)(void)) { |
dwini |
3:bd96023168df | 28 | Task * task = new ContinuousTask(object, method); |
dwini | 0:ba0870ec8714 | 29 | return add_task(task); |
dwini | 0:ba0870ec8714 | 30 | } |
dwini | 0:ba0870ec8714 | 31 | |
dwini |
3:bd96023168df | 32 | template<typename T> unsigned int create_periodic_task(T* object, void (T::*method)(void), float period_seconds) { |
dwini | 0:ba0870ec8714 | 33 | Task * task = new PeriodicTask(object, method, period_seconds); |
dwini | 0:ba0870ec8714 | 34 | return add_task(task); |
dwini | 0:ba0870ec8714 | 35 | } |
dwini | 0:ba0870ec8714 | 36 | |
dwini | 0:ba0870ec8714 | 37 | private: |
dwini |
3:bd96023168df | 38 | unsigned int add_task(Task * task); |
dwini | 0:ba0870ec8714 | 39 | }; |
dwini | 0:ba0870ec8714 | 40 | |
dwini | 0:ba0870ec8714 | 41 | }; |