first test

Dependents:   LoRaWAN-lmic-app_tjm

Fork of LMiC by Semtech

Committer:
tmulrooney
Date:
Tue Feb 23 15:34:27 2016 +0000
Revision:
5:464c1f2d6cbb
Parent:
1:d3b7bde3995c
first attempt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mluis 0:62d1edcc13d1 1 /*******************************************************************************
mluis 1:d3b7bde3995c 2 * Copyright (c) 2014-2015 IBM Corporation.
mluis 0:62d1edcc13d1 3 * All rights reserved. This program and the accompanying materials
mluis 0:62d1edcc13d1 4 * are made available under the terms of the Eclipse Public License v1.0
mluis 0:62d1edcc13d1 5 * which accompanies this distribution, and is available at
mluis 0:62d1edcc13d1 6 * http://www.eclipse.org/legal/epl-v10.html
mluis 0:62d1edcc13d1 7 *
mluis 0:62d1edcc13d1 8 * Contributors:
mluis 0:62d1edcc13d1 9 * IBM Zurich Research Lab - initial API, implementation and documentation
mluis 0:62d1edcc13d1 10 *******************************************************************************/
mluis 0:62d1edcc13d1 11
mluis 0:62d1edcc13d1 12 #include "lmic.h"
tmulrooney 5:464c1f2d6cbb 13 #include "debug.h"
mluis 0:62d1edcc13d1 14
mluis 0:62d1edcc13d1 15 // RUNTIME STATE
tmulrooney 5:464c1f2d6cbb 16 static struct
tmulrooney 5:464c1f2d6cbb 17 {
mluis 0:62d1edcc13d1 18 osjob_t* scheduledjobs;
mluis 0:62d1edcc13d1 19 osjob_t* runnablejobs;
mluis 0:62d1edcc13d1 20 } OS;
mluis 0:62d1edcc13d1 21
tmulrooney 5:464c1f2d6cbb 22 void os_init ()
tmulrooney 5:464c1f2d6cbb 23 {
tmulrooney 5:464c1f2d6cbb 24 debug("os_init enter\r\n");
mluis 0:62d1edcc13d1 25 memset(&OS, 0x00, sizeof(OS));
mluis 0:62d1edcc13d1 26 hal_init();
mluis 0:62d1edcc13d1 27 radio_init();
mluis 0:62d1edcc13d1 28 LMIC_init();
tmulrooney 5:464c1f2d6cbb 29 debug("os_init exit\r\n");
mluis 0:62d1edcc13d1 30 }
mluis 0:62d1edcc13d1 31
tmulrooney 5:464c1f2d6cbb 32 ostime_t os_getTime ()
tmulrooney 5:464c1f2d6cbb 33 {
tmulrooney 5:464c1f2d6cbb 34 debug("os_getTime enter %d\r\n",hal_ticks());
mluis 0:62d1edcc13d1 35 return hal_ticks();
mluis 0:62d1edcc13d1 36 }
mluis 0:62d1edcc13d1 37
tmulrooney 5:464c1f2d6cbb 38 static u1_t unlinkjob (osjob_t** pnext, osjob_t* job)
tmulrooney 5:464c1f2d6cbb 39 {
tmulrooney 5:464c1f2d6cbb 40 debug("unlinkjob enter\r\n");
mluis 0:62d1edcc13d1 41 for( ; *pnext; pnext = &((*pnext)->next)) {
mluis 0:62d1edcc13d1 42 if(*pnext == job) { // unlink
mluis 0:62d1edcc13d1 43 *pnext = job->next;
mluis 0:62d1edcc13d1 44 return 1;
mluis 0:62d1edcc13d1 45 }
mluis 0:62d1edcc13d1 46 }
mluis 0:62d1edcc13d1 47 return 0;
mluis 0:62d1edcc13d1 48 }
mluis 0:62d1edcc13d1 49
mluis 0:62d1edcc13d1 50 // clear scheduled job
tmulrooney 5:464c1f2d6cbb 51 void os_clearCallback (osjob_t* job)
tmulrooney 5:464c1f2d6cbb 52 {
tmulrooney 5:464c1f2d6cbb 53 debug("os_clearCallback enter\r\n");
mluis 0:62d1edcc13d1 54 hal_disableIRQs();
mluis 0:62d1edcc13d1 55 unlinkjob(&OS.scheduledjobs, job) || unlinkjob(&OS.runnablejobs, job);
mluis 0:62d1edcc13d1 56 hal_enableIRQs();
mluis 0:62d1edcc13d1 57 }
mluis 0:62d1edcc13d1 58
mluis 0:62d1edcc13d1 59 // schedule immediately runnable job
tmulrooney 5:464c1f2d6cbb 60 void os_setCallback (osjob_t* job, osjobcb_t cb)
tmulrooney 5:464c1f2d6cbb 61 {
tmulrooney 5:464c1f2d6cbb 62 debug("os_setCallback enter\r\n");
mluis 0:62d1edcc13d1 63 osjob_t** pnext;
mluis 0:62d1edcc13d1 64 hal_disableIRQs();
mluis 0:62d1edcc13d1 65 // remove if job was already queued
mluis 0:62d1edcc13d1 66 os_clearCallback(job);
mluis 0:62d1edcc13d1 67 // fill-in job
mluis 0:62d1edcc13d1 68 job->func = cb;
mluis 0:62d1edcc13d1 69 job->next = NULL;
mluis 0:62d1edcc13d1 70 // add to end of run queue
mluis 0:62d1edcc13d1 71 for(pnext=&OS.runnablejobs; *pnext; pnext=&((*pnext)->next));
mluis 0:62d1edcc13d1 72 *pnext = job;
mluis 0:62d1edcc13d1 73 hal_enableIRQs();
mluis 0:62d1edcc13d1 74 }
mluis 0:62d1edcc13d1 75
mluis 0:62d1edcc13d1 76 // schedule timed job
tmulrooney 5:464c1f2d6cbb 77 void os_setTimedCallback (osjob_t* job, ostime_t time, osjobcb_t cb)
tmulrooney 5:464c1f2d6cbb 78 {
tmulrooney 5:464c1f2d6cbb 79 debug("os_setTimedCallback enter %d\r\n",time);
mluis 0:62d1edcc13d1 80 osjob_t** pnext;
mluis 0:62d1edcc13d1 81 hal_disableIRQs();
mluis 0:62d1edcc13d1 82 // remove if job was already queued
mluis 0:62d1edcc13d1 83 os_clearCallback(job);
mluis 0:62d1edcc13d1 84 // fill-in job
mluis 0:62d1edcc13d1 85 job->deadline = time;
mluis 0:62d1edcc13d1 86 job->func = cb;
mluis 0:62d1edcc13d1 87 job->next = NULL;
mluis 0:62d1edcc13d1 88 // insert into schedule
mluis 0:62d1edcc13d1 89 for(pnext=&OS.scheduledjobs; *pnext; pnext=&((*pnext)->next)) {
mluis 1:d3b7bde3995c 90 if((*pnext)->deadline - time > 0) { // (cmp diff, not abs!)
mluis 0:62d1edcc13d1 91 // enqueue before next element and stop
mluis 0:62d1edcc13d1 92 job->next = *pnext;
mluis 0:62d1edcc13d1 93 break;
mluis 0:62d1edcc13d1 94 }
mluis 0:62d1edcc13d1 95 }
mluis 0:62d1edcc13d1 96 *pnext = job;
mluis 0:62d1edcc13d1 97 hal_enableIRQs();
mluis 0:62d1edcc13d1 98 }
mluis 0:62d1edcc13d1 99
mluis 0:62d1edcc13d1 100 // execute jobs from timer and from run queue
tmulrooney 5:464c1f2d6cbb 101 void os_runloop ()
tmulrooney 5:464c1f2d6cbb 102 {
tmulrooney 5:464c1f2d6cbb 103 debug("os_runloop enter\r\n");
mluis 0:62d1edcc13d1 104 while(1) {
mluis 0:62d1edcc13d1 105 osjob_t* j = NULL;
mluis 0:62d1edcc13d1 106 hal_disableIRQs();
mluis 1:d3b7bde3995c 107 // check for runnable jobs
mluis 1:d3b7bde3995c 108 if(OS.runnablejobs) {
mluis 0:62d1edcc13d1 109 j = OS.runnablejobs;
mluis 0:62d1edcc13d1 110 OS.runnablejobs = j->next;
mluis 1:d3b7bde3995c 111 } else if(OS.scheduledjobs && hal_checkTimer(OS.scheduledjobs->deadline)) { // check for expired timed jobs
mluis 0:62d1edcc13d1 112 j = OS.scheduledjobs;
mluis 0:62d1edcc13d1 113 OS.scheduledjobs = j->next;
mluis 0:62d1edcc13d1 114 } else { // nothing pending
mluis 0:62d1edcc13d1 115 hal_sleep(); // wake by irq (timer already restarted)
mluis 0:62d1edcc13d1 116 }
mluis 0:62d1edcc13d1 117 hal_enableIRQs();
mluis 0:62d1edcc13d1 118 if(j) { // run job callback
mluis 1:d3b7bde3995c 119 j->func(j);
mluis 0:62d1edcc13d1 120 }
mluis 0:62d1edcc13d1 121 }
mluis 0:62d1edcc13d1 122 }