job scheduler works with run once and run periodic schedules. Stop logic is not fully thought through.
Dependents: JobSchedulerDemo Borsch
scheduler.h@1:ec6a1d054065, 2017-07-11 (annotated)
- Committer:
- sgnezdov
- Date:
- Tue Jul 11 18:07:11 2017 +0000
- Revision:
- 1:ec6a1d054065
- Parent:
- 0:806403f3d0d1
- Child:
- 2:9bf5366ad5a2
improved data types
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sgnezdov | 0:806403f3d0d1 | 1 | #pragma once |
sgnezdov | 0:806403f3d0d1 | 2 | |
sgnezdov | 0:806403f3d0d1 | 3 | #include "mbed.h" |
sgnezdov | 0:806403f3d0d1 | 4 | #include "LinkedList.h" |
sgnezdov | 0:806403f3d0d1 | 5 | #include "jobService.h" |
sgnezdov | 0:806403f3d0d1 | 6 | |
sgnezdov | 0:806403f3d0d1 | 7 | namespace JobScheduler { |
sgnezdov | 0:806403f3d0d1 | 8 | |
sgnezdov | 0:806403f3d0d1 | 9 | typedef int JobID; |
sgnezdov | 1:ec6a1d054065 | 10 | typedef int JobTypeID; |
sgnezdov | 0:806403f3d0d1 | 11 | typedef int ActionType; |
sgnezdov | 0:806403f3d0d1 | 12 | |
sgnezdov | 1:ec6a1d054065 | 13 | const ActionType JobAddAT(1); |
sgnezdov | 0:806403f3d0d1 | 14 | |
sgnezdov | 0:806403f3d0d1 | 15 | /** |
sgnezdov | 0:806403f3d0d1 | 16 | Declares concept of the schedule. |
sgnezdov | 0:806403f3d0d1 | 17 | For example, run once, run periodically, run at the top of the hour, |
sgnezdov | 0:806403f3d0d1 | 18 | never run, run weekly, monthly, etc. |
sgnezdov | 0:806403f3d0d1 | 19 | */ |
sgnezdov | 0:806403f3d0d1 | 20 | class ISchedule { |
sgnezdov | 0:806403f3d0d1 | 21 | public: |
sgnezdov | 0:806403f3d0d1 | 22 | virtual ~ISchedule() = 0; |
sgnezdov | 0:806403f3d0d1 | 23 | }; |
sgnezdov | 0:806403f3d0d1 | 24 | |
sgnezdov | 1:ec6a1d054065 | 25 | /** |
sgnezdov | 1:ec6a1d054065 | 26 | ResBase provide common properties for Scheduler response queue. |
sgnezdov | 1:ec6a1d054065 | 27 | */ |
sgnezdov | 1:ec6a1d054065 | 28 | struct ResBase { |
sgnezdov | 0:806403f3d0d1 | 29 | Error error; |
sgnezdov | 1:ec6a1d054065 | 30 | ResBase(Error err) : error(err) {} |
sgnezdov | 0:806403f3d0d1 | 31 | }; |
sgnezdov | 0:806403f3d0d1 | 32 | |
sgnezdov | 1:ec6a1d054065 | 33 | template<typename T> |
sgnezdov | 1:ec6a1d054065 | 34 | struct Response : ResBase { |
sgnezdov | 1:ec6a1d054065 | 35 | T Data; |
sgnezdov | 1:ec6a1d054065 | 36 | Response(Error err, T data) : ResBase(err), Data(data) {} |
sgnezdov | 1:ec6a1d054065 | 37 | }; |
sgnezdov | 1:ec6a1d054065 | 38 | |
sgnezdov | 0:806403f3d0d1 | 39 | struct Action { |
sgnezdov | 0:806403f3d0d1 | 40 | ActionType type; |
sgnezdov | 1:ec6a1d054065 | 41 | Queue<ResBase, 1> resQueue; |
sgnezdov | 1:ec6a1d054065 | 42 | Action(ActionType t): type(t) {} |
sgnezdov | 0:806403f3d0d1 | 43 | }; |
sgnezdov | 0:806403f3d0d1 | 44 | |
sgnezdov | 0:806403f3d0d1 | 45 | /** |
sgnezdov | 0:806403f3d0d1 | 46 | Job describes the job and its parameters, but not the job's schedule. |
sgnezdov | 0:806403f3d0d1 | 47 | */ |
sgnezdov | 0:806403f3d0d1 | 48 | class Job { |
sgnezdov | 0:806403f3d0d1 | 49 | public: |
sgnezdov | 0:806403f3d0d1 | 50 | |
sgnezdov | 1:ec6a1d054065 | 51 | Job(JobID id, JobTypeID typeID): _id(id), _typeID(typeID) {}; |
sgnezdov | 0:806403f3d0d1 | 52 | |
sgnezdov | 0:806403f3d0d1 | 53 | JobID GetID() const { |
sgnezdov | 0:806403f3d0d1 | 54 | return _id; |
sgnezdov | 0:806403f3d0d1 | 55 | }; |
sgnezdov | 0:806403f3d0d1 | 56 | |
sgnezdov | 1:ec6a1d054065 | 57 | JobTypeID GetTypeID() const { |
sgnezdov | 0:806403f3d0d1 | 58 | return _typeID; |
sgnezdov | 0:806403f3d0d1 | 59 | }; |
sgnezdov | 0:806403f3d0d1 | 60 | |
sgnezdov | 0:806403f3d0d1 | 61 | private: |
sgnezdov | 0:806403f3d0d1 | 62 | JobID _id; |
sgnezdov | 1:ec6a1d054065 | 63 | JobTypeID _typeID; |
sgnezdov | 0:806403f3d0d1 | 64 | }; |
sgnezdov | 0:806403f3d0d1 | 65 | |
sgnezdov | 0:806403f3d0d1 | 66 | |
sgnezdov | 0:806403f3d0d1 | 67 | /** |
sgnezdov | 0:806403f3d0d1 | 68 | Scheduler is responsible for maintaining job schedules and running jobs |
sgnezdov | 0:806403f3d0d1 | 69 | in a serial manner. For example, next job appointments can be: |
sgnezdov | 0:806403f3d0d1 | 70 | 14:05, 14:05, 15:00, 16:00 and scheduler will run jobs even one after |
sgnezdov | 0:806403f3d0d1 | 71 | another even if job run times collide. |
sgnezdov | 0:806403f3d0d1 | 72 | |
sgnezdov | 0:806403f3d0d1 | 73 | The scheduler has no means of stopping running job. |
sgnezdov | 0:806403f3d0d1 | 74 | |
sgnezdov | 0:806403f3d0d1 | 75 | The order of execution is preserved if job runs for a long time. |
sgnezdov | 0:806403f3d0d1 | 76 | |
sgnezdov | 0:806403f3d0d1 | 77 | */ |
sgnezdov | 0:806403f3d0d1 | 78 | class Scheduler { |
sgnezdov | 0:806403f3d0d1 | 79 | public: |
sgnezdov | 0:806403f3d0d1 | 80 | Scheduler(JobService *_jobService); |
sgnezdov | 0:806403f3d0d1 | 81 | |
sgnezdov | 0:806403f3d0d1 | 82 | void Start(); |
sgnezdov | 0:806403f3d0d1 | 83 | void Stop(); |
sgnezdov | 0:806403f3d0d1 | 84 | void WaitToStop(); |
sgnezdov | 0:806403f3d0d1 | 85 | |
sgnezdov | 0:806403f3d0d1 | 86 | /** JobAdd adds job of typeID and returns ID of added job. */ |
sgnezdov | 1:ec6a1d054065 | 87 | Response<JobID> JobAdd(int typeID); |
sgnezdov | 0:806403f3d0d1 | 88 | void JobRemove(int jobID); |
sgnezdov | 0:806403f3d0d1 | 89 | private: |
sgnezdov | 0:806403f3d0d1 | 90 | static void updateAdapter(void *target); |
sgnezdov | 0:806403f3d0d1 | 91 | void updateHandler(); |
sgnezdov | 1:ec6a1d054065 | 92 | |
sgnezdov | 0:806403f3d0d1 | 93 | void process(Action *action); |
sgnezdov | 0:806403f3d0d1 | 94 | private: |
sgnezdov | 0:806403f3d0d1 | 95 | Thread _updater; |
sgnezdov | 0:806403f3d0d1 | 96 | bool _quit; |
sgnezdov | 0:806403f3d0d1 | 97 | JobService *_jobService; |
sgnezdov | 0:806403f3d0d1 | 98 | JobID _nextJobID; |
sgnezdov | 0:806403f3d0d1 | 99 | /** _actions contains incoming action queue to handle. */ |
sgnezdov | 0:806403f3d0d1 | 100 | Queue<Action, 5> _actions; |
sgnezdov | 0:806403f3d0d1 | 101 | |
sgnezdov | 0:806403f3d0d1 | 102 | }; |
sgnezdov | 0:806403f3d0d1 | 103 | } |