Sergei G
/
JobSchedulerDemo
run once and run periodic example work
source/main.cpp@9:27e0a0dd98d1, 2017-08-02 (annotated)
- Committer:
- sgnezdov
- Date:
- Wed Aug 02 22:04:02 2017 +0000
- Revision:
- 9:27e0a0dd98d1
- Parent:
- 8:8a65353ec8f3
added JobList testing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sgnezdov | 0:728722f45131 | 1 | #include "mbed.h" |
sgnezdov | 0:728722f45131 | 2 | #include "scheduler.h" |
sgnezdov | 0:728722f45131 | 3 | #include "LinkedList.h" |
sgnezdov | 0:728722f45131 | 4 | #include "jobService.h" |
sgnezdov | 2:4fe42e3bafe4 | 5 | #include "schedules.h" |
sgnezdov | 0:728722f45131 | 6 | |
sgnezdov | 8:8a65353ec8f3 | 7 | #include "mbed-trace/mbed_trace.h" |
sgnezdov | 8:8a65353ec8f3 | 8 | #define TRACE_GROUP "main" |
sgnezdov | 8:8a65353ec8f3 | 9 | |
sgnezdov | 8:8a65353ec8f3 | 10 | // These are necessary only if thread safety is needed |
sgnezdov | 8:8a65353ec8f3 | 11 | static Mutex TracingLock; |
sgnezdov | 8:8a65353ec8f3 | 12 | static void tracingWait() |
sgnezdov | 8:8a65353ec8f3 | 13 | { |
sgnezdov | 8:8a65353ec8f3 | 14 | TracingLock.lock(); |
sgnezdov | 8:8a65353ec8f3 | 15 | } |
sgnezdov | 8:8a65353ec8f3 | 16 | static void tracingRelease() |
sgnezdov | 8:8a65353ec8f3 | 17 | { |
sgnezdov | 8:8a65353ec8f3 | 18 | TracingLock.unlock(); |
sgnezdov | 8:8a65353ec8f3 | 19 | } |
sgnezdov | 8:8a65353ec8f3 | 20 | |
sgnezdov | 8:8a65353ec8f3 | 21 | void jobA(void *context) |
sgnezdov | 0:728722f45131 | 22 | { |
sgnezdov | 6:b0bca03d9f3a | 23 | printf("Job A\n"); |
sgnezdov | 6:b0bca03d9f3a | 24 | } |
sgnezdov | 6:b0bca03d9f3a | 25 | |
sgnezdov | 8:8a65353ec8f3 | 26 | void jobB(void *context) |
sgnezdov | 6:b0bca03d9f3a | 27 | { |
sgnezdov | 6:b0bca03d9f3a | 28 | printf("Job B\n"); |
sgnezdov | 0:728722f45131 | 29 | } |
sgnezdov | 0:728722f45131 | 30 | |
sgnezdov | 9:27e0a0dd98d1 | 31 | void printJobs(JobScheduler::Scheduler& scheduler) |
sgnezdov | 9:27e0a0dd98d1 | 32 | { |
sgnezdov | 9:27e0a0dd98d1 | 33 | LinkedList<JobScheduler::Job> jobs; |
sgnezdov | 9:27e0a0dd98d1 | 34 | scheduler.JobList(jobs); |
sgnezdov | 9:27e0a0dd98d1 | 35 | printf(" Job List:\n"); |
sgnezdov | 9:27e0a0dd98d1 | 36 | node<JobScheduler::Job>* jn = jobs.pop(1); |
sgnezdov | 9:27e0a0dd98d1 | 37 | while (jn != NULL) { |
sgnezdov | 9:27e0a0dd98d1 | 38 | printf("Job ID: %d\n", jn->data->GetID()); |
sgnezdov | 9:27e0a0dd98d1 | 39 | jobs.remove(1); |
sgnezdov | 9:27e0a0dd98d1 | 40 | jn = jobs.pop(1); |
sgnezdov | 9:27e0a0dd98d1 | 41 | } |
sgnezdov | 9:27e0a0dd98d1 | 42 | printf(" Job List Completed\n"); |
sgnezdov | 9:27e0a0dd98d1 | 43 | } |
sgnezdov | 9:27e0a0dd98d1 | 44 | |
sgnezdov | 9:27e0a0dd98d1 | 45 | |
sgnezdov | 0:728722f45131 | 46 | void runScheduler() |
sgnezdov | 0:728722f45131 | 47 | { |
sgnezdov | 8:8a65353ec8f3 | 48 | /* Setup tracing */ |
sgnezdov | 8:8a65353ec8f3 | 49 | mbed_trace_mutex_wait_function_set( tracingWait ); // only if thread safety is needed |
sgnezdov | 8:8a65353ec8f3 | 50 | mbed_trace_mutex_release_function_set( tracingRelease ); // only if thread safety is needed |
sgnezdov | 8:8a65353ec8f3 | 51 | mbed_trace_init(); // initialize the trace library |
sgnezdov | 8:8a65353ec8f3 | 52 | |
sgnezdov | 0:728722f45131 | 53 | JobScheduler::JobService js; |
sgnezdov | 0:728722f45131 | 54 | JobScheduler::Scheduler scheduler(&js); |
sgnezdov | 0:728722f45131 | 55 | |
sgnezdov | 8:8a65353ec8f3 | 56 | JobScheduler::Error err; |
sgnezdov | 8:8a65353ec8f3 | 57 | err = js.Register(3, NULL, NULL); |
sgnezdov | 8:8a65353ec8f3 | 58 | if (err) { |
sgnezdov | 8:8a65353ec8f3 | 59 | printf("Failed to register job type 1.\n"); |
sgnezdov | 8:8a65353ec8f3 | 60 | exit(1); |
sgnezdov | 8:8a65353ec8f3 | 61 | } |
sgnezdov | 8:8a65353ec8f3 | 62 | err = js.Register(1, jobA, NULL); |
sgnezdov | 8:8a65353ec8f3 | 63 | if (err) { |
sgnezdov | 8:8a65353ec8f3 | 64 | printf("Failed to register job type 1.\n"); |
sgnezdov | 8:8a65353ec8f3 | 65 | exit(1); |
sgnezdov | 8:8a65353ec8f3 | 66 | } |
sgnezdov | 8:8a65353ec8f3 | 67 | err = js.Register(2, jobB, NULL); |
sgnezdov | 8:8a65353ec8f3 | 68 | if (err) { |
sgnezdov | 8:8a65353ec8f3 | 69 | printf("Failed to register job type 2.\n"); |
sgnezdov | 8:8a65353ec8f3 | 70 | exit(1); |
sgnezdov | 8:8a65353ec8f3 | 71 | } |
sgnezdov | 8:8a65353ec8f3 | 72 | |
sgnezdov | 8:8a65353ec8f3 | 73 | JobScheduler::JobType *jt; |
sgnezdov | 8:8a65353ec8f3 | 74 | jt = js.GetJob(1); |
sgnezdov | 8:8a65353ec8f3 | 75 | if (jt == NULL) { |
sgnezdov | 8:8a65353ec8f3 | 76 | printf("Failed to find job type 1.\n"); |
sgnezdov | 8:8a65353ec8f3 | 77 | exit(1); |
sgnezdov | 8:8a65353ec8f3 | 78 | } |
sgnezdov | 8:8a65353ec8f3 | 79 | jt = js.GetJob(2); |
sgnezdov | 8:8a65353ec8f3 | 80 | if (jt == NULL) { |
sgnezdov | 8:8a65353ec8f3 | 81 | printf("Failed to find job type 2.\n"); |
sgnezdov | 8:8a65353ec8f3 | 82 | exit(1); |
sgnezdov | 8:8a65353ec8f3 | 83 | } |
sgnezdov | 8:8a65353ec8f3 | 84 | jt = js.GetJob(3); |
sgnezdov | 8:8a65353ec8f3 | 85 | if (jt == NULL) { |
sgnezdov | 8:8a65353ec8f3 | 86 | printf("Failed to find job type 2.\n"); |
sgnezdov | 8:8a65353ec8f3 | 87 | exit(1); |
sgnezdov | 8:8a65353ec8f3 | 88 | } |
sgnezdov | 0:728722f45131 | 89 | |
sgnezdov | 0:728722f45131 | 90 | scheduler.Start(); |
sgnezdov | 2:4fe42e3bafe4 | 91 | |
sgnezdov | 2:4fe42e3bafe4 | 92 | time_t nowSecs = time(NULL); |
sgnezdov | 6:b0bca03d9f3a | 93 | JobScheduler::Response<JobScheduler::JobID> res = scheduler.JobAdd(1, new JobScheduler::RunOnceSchedule(nowSecs + 2), NULL); |
sgnezdov | 6:b0bca03d9f3a | 94 | printf("job A add response error: %d, jobID: %d\n", res.error, res.data); |
sgnezdov | 9:27e0a0dd98d1 | 95 | |
sgnezdov | 9:27e0a0dd98d1 | 96 | printJobs(scheduler); |
sgnezdov | 6:b0bca03d9f3a | 97 | wait(5); |
sgnezdov | 6:b0bca03d9f3a | 98 | |
sgnezdov | 6:b0bca03d9f3a | 99 | printf("periodic with 2 sec period and limit 3\n"); |
sgnezdov | 6:b0bca03d9f3a | 100 | res = scheduler.JobAdd(2, new JobScheduler::RunPeriodicSchedule(2, 3), NULL); |
sgnezdov | 6:b0bca03d9f3a | 101 | printf("job B add response error: %d, jobID: %d\n", res.error, res.data); |
sgnezdov | 9:27e0a0dd98d1 | 102 | printJobs(scheduler); |
sgnezdov | 5:79cbf6d8b5f0 | 103 | wait(10); |
sgnezdov | 9:27e0a0dd98d1 | 104 | printJobs(scheduler); |
sgnezdov | 0:728722f45131 | 105 | scheduler.Stop(); |
sgnezdov | 0:728722f45131 | 106 | scheduler.WaitToStop(); |
sgnezdov | 0:728722f45131 | 107 | } |
sgnezdov | 0:728722f45131 | 108 | |
sgnezdov | 0:728722f45131 | 109 | int main() |
sgnezdov | 0:728722f45131 | 110 | { |
sgnezdov | 9:27e0a0dd98d1 | 111 | Serial pc(USBTX, USBRX); |
sgnezdov | 9:27e0a0dd98d1 | 112 | pc.baud(115200); |
sgnezdov | 9:27e0a0dd98d1 | 113 | |
sgnezdov | 0:728722f45131 | 114 | printf("\nJob Scheduler Demo\n"); |
sgnezdov | 0:728722f45131 | 115 | runScheduler(); |
sgnezdov | 0:728722f45131 | 116 | printf("done\n"); |
sgnezdov | 0:728722f45131 | 117 | |
sgnezdov | 0:728722f45131 | 118 | exit(0); |
sgnezdov | 0:728722f45131 | 119 | } |
sgnezdov | 0:728722f45131 | 120 |