// schedule immediately runnable job void os_setCallback (osjob_t* job, osjobcb_t cb) { osjob_t** pnext; hal_disableIRQs(); // remove if job was already queued os_clearCallback(job); // fill-in job job->func = cb; job->next = NULL; // add to end of run queue for(pnext=&OS.runnablejobs; *pnext; pnext=&((*pnext)->next)); *pnext = job; hal_enableIRQs(); }
// schedule timed job void os_setTimedCallback (osjob_t* job, ostime_t time, osjobcb_t cb) { osjob_t** pnext; hal_disableIRQs(); // remove if job was already queued os_clearCallback(job); // fill-in job job->deadline = time; job->func = cb; job->next = NULL; // insert into schedule for(pnext=&OS.scheduledjobs; *pnext; pnext=&((*pnext)->next)) { if((*pnext)->deadline - time > 0) { // (cmp diff, not abs!) // enqueue before next element and stop job->next = *pnext; break; } } *pnext = job; hal_enableIRQs(); }
void onEvent (ev_t ev) { debug_event(ev); switch(ev) { // starting to join network case EV_JOINING: // start blinking blinkfunc(&blinkjob); break; // network joined, session established case EV_JOINED: // cancel blink job os_clearCallback(&blinkjob); // switch on LED debug_led(1); // (don't schedule any new actions) break; } }