LMiC adapted to work with SX1272MB2xAS LoRa shield.

Fork of LMiC by Timothy Mulrooney

Revision:
8:5879e83f632a
Parent:
5:464c1f2d6cbb
--- a/oslmic.cpp	Thu Feb 25 21:28:23 2016 +0000
+++ b/oslmic.cpp	Mon Apr 02 12:04:59 2018 +0000
@@ -7,7 +7,19 @@
  *
  * Contributors:
  *    IBM Zurich Research Lab - initial API, implementation and documentation
- *******************************************************************************/
+ *
+ * /////////////////////////////////////////////////////////////////////////////
+ *
+ * Used by Giorgos Tsapparellas for Internet of Things (IoT) smart monitoring
+ * device for agriculture using LoRaWAN technology.
+ * 
+ * Date of issued copy: 25 January 2018
+ *
+ * Modifications: 
+ * - No external modifications of the existing "AS IT IS" software.
+ * - Comment out debug messages of each function for more clear 
+ *   debugging procedure.
+ ******************************************************************************/
 
 #include "lmic.h"
 #include "debug.h"
@@ -21,23 +33,23 @@
 
 void os_init () 
 {
-    debug("os_init enter\r\n");
+    //debug("os_init enter\r\n");
     memset(&OS, 0x00, sizeof(OS));
     hal_init();
     radio_init();
     LMIC_init();
-   debug("os_init exit\r\n");
+    //debug("os_init exit\r\n");
 }
 
 ostime_t os_getTime () 
 {
-    debug("os_getTime enter %d\r\n",hal_ticks());
+    //debug("os_getTime enter %d\r\n",hal_ticks());
     return hal_ticks();
 }
 
 static u1_t unlinkjob (osjob_t** pnext, osjob_t* job) 
 {
-   debug("unlinkjob enter\r\n");
+    //debug("unlinkjob enter\r\n");
     for( ; *pnext; pnext = &((*pnext)->next)) {
         if(*pnext == job) { // unlink
             *pnext = job->next;
@@ -50,7 +62,7 @@
 // clear scheduled job
 void os_clearCallback (osjob_t* job) 
 {
-   debug("os_clearCallback enter\r\n");
+    //debug("os_clearCallback enter\r\n");
     hal_disableIRQs();
     unlinkjob(&OS.scheduledjobs, job) || unlinkjob(&OS.runnablejobs, job);
     hal_enableIRQs();
@@ -59,7 +71,7 @@
 // schedule immediately runnable job
 void os_setCallback (osjob_t* job, osjobcb_t cb) 
 {
-   debug("os_setCallback enter\r\n");
+    //debug("os_setCallback enter\r\n");
     osjob_t** pnext;
     hal_disableIRQs();
     // remove if job was already queued
@@ -76,7 +88,7 @@
 // schedule timed job
 void os_setTimedCallback (osjob_t* job, ostime_t time, osjobcb_t cb) 
 {
-   debug("os_setTimedCallback enter %d\r\n",time);
+    //debug("os_setTimedCallback enter %d\r\n",time);
     osjob_t** pnext;
     hal_disableIRQs();
     // remove if job was already queued
@@ -100,7 +112,7 @@
 // execute jobs from timer and from run queue
 void os_runloop () 
 {
-   debug("os_runloop enter\r\n");
+   debug_str("os_runloop enter\r\n");
     while(1) {
         osjob_t* j = NULL;
         hal_disableIRQs();
@@ -120,3 +132,27 @@
         }
     }
 }
+
+void os_runloop_once() {
+    
+    bool has_deadline = false;
+    osjob_t* j = NULL;
+    hal_disableIRQs();
+    
+    // check for runnable jobs
+    if(OS.runnablejobs) {
+        j = OS.runnablejobs;
+        OS.runnablejobs = j->next;
+    } else if(OS.scheduledjobs && hal_checkTimer(OS.scheduledjobs->deadline)) { // check for expired timed jobs
+        j = OS.scheduledjobs;
+        OS.scheduledjobs = j->next;
+            has_deadline = true;
+    } else { // nothing pending
+        hal_sleep(); // wake by irq (timer already restarted)
+    }
+    hal_enableIRQs();
+    if(j) { // run job callback
+           // printf("%lu: Running job %p, cb %p, deadline %lu\r\n", os_getTime(), j, j->func, has_deadline ? j->deadline : 0);
+        j->func(j);
+    }
+}