job scheduler works with run once and run periodic schedules. Stop logic is not fully thought through.

Dependencies:   LinkedList

Dependents:   JobSchedulerDemo Borsch

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?

UserRevisionLine numberNew 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 }