Sergei G / Mbed OS JobSchedulerDemo

Dependencies:   JobScheduler

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "scheduler.h"
00003 #include "LinkedList.h"
00004 #include "jobService.h"
00005 #include "schedules.h"
00006 
00007 #include "mbed-trace/mbed_trace.h"
00008 #define TRACE_GROUP  "main"
00009 
00010  // These are necessary only if thread safety is needed
00011 static Mutex TracingLock;
00012 static void tracingWait()
00013 {
00014     TracingLock.lock();
00015 }
00016 static void tracingRelease()
00017 {
00018     TracingLock.unlock();
00019 }
00020 
00021 void jobA(void *context)
00022 {
00023     printf("Job A\n");
00024 }
00025 
00026 void jobB(void *context)
00027 {
00028     printf("Job B\n");
00029 }
00030 
00031 void printJobs(JobScheduler::Scheduler& scheduler)
00032 {
00033     LinkedList<JobScheduler::Job> jobs;
00034     scheduler.JobList(jobs);
00035     printf("  Job List:\n");
00036     node<JobScheduler::Job>* jn = jobs.pop(1);
00037     while (jn != NULL) {
00038         printf("Job ID: %d\n", jn->data->GetID());
00039         jobs.remove(1);
00040         jn = jobs.pop(1);
00041     }
00042     printf("  Job List Completed\n");
00043 }
00044 
00045 
00046 void runScheduler() 
00047 {
00048     /* Setup tracing */
00049     mbed_trace_mutex_wait_function_set( tracingWait ); // only if thread safety is needed
00050     mbed_trace_mutex_release_function_set( tracingRelease ); // only if thread safety is needed
00051     mbed_trace_init();       // initialize the trace library
00052 
00053     JobScheduler::JobService js;
00054     JobScheduler::Scheduler scheduler(&js);
00055     
00056     JobScheduler::Error err;
00057     err = js.Register(3, NULL, NULL);
00058     if (err) {
00059         printf("Failed to register job type 1.\n");
00060         exit(1);
00061     }
00062     err = js.Register(1, jobA, NULL);
00063     if (err) {
00064         printf("Failed to register job type 1.\n");
00065         exit(1);
00066     }
00067     err = js.Register(2, jobB, NULL);
00068     if (err) {
00069         printf("Failed to register job type 2.\n");
00070         exit(1);
00071     }
00072     
00073     JobScheduler::JobType *jt;
00074     jt = js.GetJob(1);
00075     if (jt == NULL) {
00076         printf("Failed to find job type 1.\n");
00077         exit(1);
00078     }
00079     jt = js.GetJob(2);
00080     if (jt == NULL) {
00081         printf("Failed to find job type 2.\n");
00082         exit(1);
00083     }
00084     jt = js.GetJob(3);
00085     if (jt == NULL) {
00086         printf("Failed to find job type 2.\n");
00087         exit(1);
00088     }
00089     
00090     scheduler.Start();
00091 
00092     time_t nowSecs = time(NULL);
00093     JobScheduler::Response<JobScheduler::JobID> res = scheduler.JobAdd(1, new JobScheduler::RunOnceSchedule(nowSecs + 2), NULL);
00094     printf("job A add response error: %d, jobID: %d\n", res.error, res.data);
00095     
00096     printJobs(scheduler);
00097     wait(5);
00098     
00099     printf("periodic with 2 sec period and limit 3\n");
00100     res = scheduler.JobAdd(2, new JobScheduler::RunPeriodicSchedule(2, 3), NULL);
00101     printf("job B add response error: %d, jobID: %d\n", res.error, res.data);
00102     printJobs(scheduler);
00103     wait(10);
00104     printJobs(scheduler);
00105     scheduler.Stop();
00106     scheduler.WaitToStop();
00107 }
00108 
00109 int main()
00110 {
00111     Serial pc(USBTX, USBRX);
00112     pc.baud(115200);
00113 
00114     printf("\nJob Scheduler Demo\n");
00115     runScheduler();
00116     printf("done\n");
00117  
00118     exit(0);
00119 }
00120