run once and run periodic example work

Dependencies:   JobScheduler

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?

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