LMIC lib Lora OTA device for Everynet

Fork of LMiC-10secs by Alcatel-Lucent IoT Development

Committer:
pnysten
Date:
Fri Sep 23 09:15:43 2016 +0000
Revision:
10:8f33a411b53f
Parent:
9:c5820ce68bd6
LMIC lib Lora Personalized device for Everynet

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"
pnysten 7:758e1719910c 13 #include "x_nucleo_iks01a1.h"
pnysten 7:758e1719910c 14 #include "debug.h"
pnysten 7:758e1719910c 15
pnysten 7:758e1719910c 16 /* Instantiate the expansion board */
pnysten 7:758e1719910c 17 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
pnysten 7:758e1719910c 18
pnysten 7:758e1719910c 19 /* Retrieve the composing elements of the expansion board */
pnysten 7:758e1719910c 20 static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
pnysten 7:758e1719910c 21 static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
pnysten 7:758e1719910c 22 static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
pnysten 7:758e1719910c 23 static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
pnysten 7:758e1719910c 24 static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
pnysten 7:758e1719910c 25 static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
pnysten 7:758e1719910c 26 static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
mluis 0:62d1edcc13d1 27
mluis 0:62d1edcc13d1 28 // RUNTIME STATE
mluis 0:62d1edcc13d1 29 static struct {
mluis 0:62d1edcc13d1 30 osjob_t* scheduledjobs;
mluis 0:62d1edcc13d1 31 osjob_t* runnablejobs;
mluis 0:62d1edcc13d1 32 } OS;
mluis 0:62d1edcc13d1 33
mluis 1:d3b7bde3995c 34 void os_init () {
mluis 0:62d1edcc13d1 35 memset(&OS, 0x00, sizeof(OS));
mluis 0:62d1edcc13d1 36 hal_init();
mluis 0:62d1edcc13d1 37 radio_init();
mluis 0:62d1edcc13d1 38 LMIC_init();
mluis 0:62d1edcc13d1 39 }
mluis 0:62d1edcc13d1 40
mluis 1:d3b7bde3995c 41 ostime_t os_getTime () {
mluis 0:62d1edcc13d1 42 return hal_ticks();
mluis 0:62d1edcc13d1 43 }
mluis 0:62d1edcc13d1 44
mluis 0:62d1edcc13d1 45 static u1_t unlinkjob (osjob_t** pnext, osjob_t* job) {
mluis 0:62d1edcc13d1 46 for( ; *pnext; pnext = &((*pnext)->next)) {
mluis 0:62d1edcc13d1 47 if(*pnext == job) { // unlink
mluis 0:62d1edcc13d1 48 *pnext = job->next;
mluis 0:62d1edcc13d1 49 return 1;
mluis 0:62d1edcc13d1 50 }
mluis 0:62d1edcc13d1 51 }
mluis 0:62d1edcc13d1 52 return 0;
mluis 0:62d1edcc13d1 53 }
mluis 0:62d1edcc13d1 54
mluis 0:62d1edcc13d1 55 // clear scheduled job
mluis 0:62d1edcc13d1 56 void os_clearCallback (osjob_t* job) {
mluis 0:62d1edcc13d1 57 hal_disableIRQs();
mluis 0:62d1edcc13d1 58 unlinkjob(&OS.scheduledjobs, job) || unlinkjob(&OS.runnablejobs, job);
mluis 0:62d1edcc13d1 59 hal_enableIRQs();
mluis 0:62d1edcc13d1 60 }
mluis 0:62d1edcc13d1 61
mluis 0:62d1edcc13d1 62 // schedule immediately runnable job
mluis 0:62d1edcc13d1 63 void os_setCallback (osjob_t* job, osjobcb_t cb) {
mluis 0:62d1edcc13d1 64 osjob_t** pnext;
mluis 0:62d1edcc13d1 65 hal_disableIRQs();
mluis 0:62d1edcc13d1 66 // remove if job was already queued
mluis 0:62d1edcc13d1 67 os_clearCallback(job);
mluis 0:62d1edcc13d1 68 // fill-in job
mluis 0:62d1edcc13d1 69 job->func = cb;
mluis 0:62d1edcc13d1 70 job->next = NULL;
mluis 0:62d1edcc13d1 71 // add to end of run queue
mluis 0:62d1edcc13d1 72 for(pnext=&OS.runnablejobs; *pnext; pnext=&((*pnext)->next));
mluis 0:62d1edcc13d1 73 *pnext = job;
mluis 0:62d1edcc13d1 74 hal_enableIRQs();
mluis 0:62d1edcc13d1 75 }
mluis 0:62d1edcc13d1 76
mluis 0:62d1edcc13d1 77 // schedule timed job
mluis 0:62d1edcc13d1 78 void os_setTimedCallback (osjob_t* job, ostime_t time, osjobcb_t cb) {
mluis 0:62d1edcc13d1 79 osjob_t** pnext;
mluis 0:62d1edcc13d1 80 hal_disableIRQs();
mluis 0:62d1edcc13d1 81 // remove if job was already queued
mluis 0:62d1edcc13d1 82 os_clearCallback(job);
mluis 0:62d1edcc13d1 83 // fill-in job
mluis 0:62d1edcc13d1 84 job->deadline = time;
mluis 0:62d1edcc13d1 85 job->func = cb;
mluis 0:62d1edcc13d1 86 job->next = NULL;
mluis 0:62d1edcc13d1 87 // insert into schedule
mluis 0:62d1edcc13d1 88 for(pnext=&OS.scheduledjobs; *pnext; pnext=&((*pnext)->next)) {
pnysten 9:c5820ce68bd6 89 //debug_str(".");
mluis 1:d3b7bde3995c 90 if((*pnext)->deadline - time > 0) { // (cmp diff, not abs!)
mluis 0:62d1edcc13d1 91 // enqueue before next element and stop
pnysten 9:c5820ce68bd6 92 //debug_str("Stop To Wait...\r\n");
mluis 0:62d1edcc13d1 93 job->next = *pnext;
mluis 0:62d1edcc13d1 94 break;
mluis 0:62d1edcc13d1 95 }
mluis 0:62d1edcc13d1 96 }
mluis 0:62d1edcc13d1 97 *pnext = job;
mluis 0:62d1edcc13d1 98 hal_enableIRQs();
mluis 0:62d1edcc13d1 99 }
mluis 0:62d1edcc13d1 100
pnysten 7:758e1719910c 101 /* Helper function for printing floats & doubles */
pnysten 7:758e1719910c 102 static char *printDouble(char* str, double v, int decimalDigits=2)
pnysten 7:758e1719910c 103 {
pnysten 7:758e1719910c 104 int i = 1;
pnysten 7:758e1719910c 105 int intPart, fractPart;
pnysten 7:758e1719910c 106 int len;
pnysten 7:758e1719910c 107 char *ptr;
pnysten 7:758e1719910c 108
pnysten 7:758e1719910c 109 /* prepare decimal digits multiplicator */
pnysten 7:758e1719910c 110 for (;decimalDigits!=0; i*=10, decimalDigits--);
pnysten 7:758e1719910c 111
pnysten 7:758e1719910c 112 /* calculate integer & fractinal parts */
pnysten 7:758e1719910c 113 intPart = (int)v;
pnysten 7:758e1719910c 114 fractPart = (int)((v-(double)(int)v)*i);
pnysten 7:758e1719910c 115
pnysten 7:758e1719910c 116 /* fill in integer part */
pnysten 7:758e1719910c 117 sprintf(str, "%i.", intPart);
pnysten 7:758e1719910c 118
pnysten 7:758e1719910c 119 /* prepare fill in of fractional part */
pnysten 7:758e1719910c 120 len = strlen(str);
pnysten 7:758e1719910c 121 ptr = &str[len];
pnysten 7:758e1719910c 122
pnysten 7:758e1719910c 123 /* fill in leading fractional zeros */
pnysten 7:758e1719910c 124 for (i/=10;i>1; i/=10, ptr++) {
pnysten 7:758e1719910c 125 if(fractPart >= i) break;
pnysten 7:758e1719910c 126 *ptr = '0';
pnysten 7:758e1719910c 127 }
pnysten 7:758e1719910c 128
pnysten 7:758e1719910c 129 /* fill in (rest of) fractional part */
pnysten 7:758e1719910c 130 sprintf(ptr, "%i", fractPart);
pnysten 7:758e1719910c 131
pnysten 7:758e1719910c 132 return str;
pnysten 7:758e1719910c 133 }
pnysten 7:758e1719910c 134
mluis 0:62d1edcc13d1 135 // execute jobs from timer and from run queue
mluis 1:d3b7bde3995c 136 void os_runloop () {
pnysten 7:758e1719910c 137 /* uint8_t id;
pnysten 7:758e1719910c 138 float value1, value2;
pnysten 7:758e1719910c 139 char buffer1[32], buffer2[32];
pnysten 7:758e1719910c 140 int32_t axes[3];
pnysten 7:758e1719910c 141
pnysten 7:758e1719910c 142 debug_str("--- Starting new run ---\r\n");
pnysten 7:758e1719910c 143
pnysten 7:758e1719910c 144 humidity_sensor->ReadID(&id);
pnysten 7:758e1719910c 145 debug_str("HTS221 humidity & temperature = ");
pnysten 7:758e1719910c 146 debug_uint(id);
pnysten 7:758e1719910c 147 debug_str("\r\n");
pnysten 7:758e1719910c 148 pressure_sensor->ReadID(&id);
pnysten 7:758e1719910c 149 debug_str("LPS25H pressure & temperature = ");
pnysten 7:758e1719910c 150 debug_uint(id);
pnysten 7:758e1719910c 151 debug_str("\r\n");
pnysten 7:758e1719910c 152 magnetometer->ReadID(&id);
pnysten 7:758e1719910c 153 debug_str("LIS3MDL magnetometer = ");
pnysten 7:758e1719910c 154 debug_uint(id);
pnysten 7:758e1719910c 155 debug_str("\r\n");
pnysten 7:758e1719910c 156 gyroscope->ReadID(&id);
pnysten 7:758e1719910c 157 debug_str("LSM6DS0 accelerometer & gyroscope = ");
pnysten 7:758e1719910c 158 debug_uint(id);
pnysten 7:758e1719910c 159 debug_str("\r\n");*/
pnysten 7:758e1719910c 160
pnysten 7:758e1719910c 161 // wait(3);
pnysten 7:758e1719910c 162
pnysten 7:758e1719910c 163 while(1) {
pnysten 7:758e1719910c 164 /* debug_str("\r\n");
pnysten 7:758e1719910c 165
pnysten 7:758e1719910c 166 temp_sensor1->GetTemperature(&value1);
pnysten 7:758e1719910c 167 humidity_sensor->GetHumidity(&value2);
pnysten 7:758e1719910c 168 debug_str("HTS221: [temp] ");
pnysten 7:758e1719910c 169 debug_str(printDouble(buffer1, value1));
pnysten 7:758e1719910c 170 debug_str("°C, [hum] ");
pnysten 7:758e1719910c 171 debug_str(printDouble(buffer2, value2));
pnysten 7:758e1719910c 172 debug_str("%\r\n");
pnysten 7:758e1719910c 173 //pc.printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 7:758e1719910c 174
pnysten 7:758e1719910c 175 temp_sensor2->GetFahrenheit(&value1);
pnysten 7:758e1719910c 176 pressure_sensor->GetPressure(&value2);
pnysten 7:758e1719910c 177 debug_str("LPS25H: [temp] ");
pnysten 7:758e1719910c 178 debug_str(printDouble(buffer1, value1));
pnysten 7:758e1719910c 179 debug_str("°F, [press] ");
pnysten 7:758e1719910c 180 debug_str(printDouble(buffer2, value2));
pnysten 7:758e1719910c 181 debug_str("mbar\r\n");
pnysten 7:758e1719910c 182 //pc.printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 7:758e1719910c 183
pnysten 7:758e1719910c 184 debug_str("---\r\n");
pnysten 7:758e1719910c 185
pnysten 7:758e1719910c 186 magnetometer->Get_M_Axes(axes);
pnysten 7:758e1719910c 187 debug_str("LIS3MDL [mag/mgauss]: ");
pnysten 7:758e1719910c 188 debug_uint(axes[0]);
pnysten 7:758e1719910c 189 debug_str(", ");
pnysten 7:758e1719910c 190 debug_uint(axes[1]);
pnysten 7:758e1719910c 191 debug_str(", ");
pnysten 7:758e1719910c 192 debug_uint(axes[2]);
pnysten 7:758e1719910c 193 debug_str("\r\n");
pnysten 7:758e1719910c 194 //pc.printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 7:758e1719910c 195
pnysten 7:758e1719910c 196 accelerometer->Get_X_Axes(axes);
pnysten 7:758e1719910c 197 debug_str("LSM6DS0 [acc/mg]: ");
pnysten 7:758e1719910c 198 debug_uint(axes[0]);
pnysten 7:758e1719910c 199 debug_str(", ");
pnysten 7:758e1719910c 200 debug_uint(axes[1]);
pnysten 7:758e1719910c 201 debug_str(", ");
pnysten 7:758e1719910c 202 debug_uint(axes[2]);
pnysten 7:758e1719910c 203 debug_str("\r\n");
pnysten 7:758e1719910c 204 //pc.printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 7:758e1719910c 205
pnysten 7:758e1719910c 206 gyroscope->Get_G_Axes(axes);
pnysten 7:758e1719910c 207 debug_str("LSM6DS0 [gyro/mdps]: ");
pnysten 7:758e1719910c 208 debug_uint(axes[0]);
pnysten 7:758e1719910c 209 debug_str(", ");
pnysten 7:758e1719910c 210 debug_uint(axes[1]);
pnysten 7:758e1719910c 211 debug_str(", ");
pnysten 7:758e1719910c 212 debug_uint(axes[2]);
pnysten 7:758e1719910c 213 debug_str("\r\n");
pnysten 7:758e1719910c 214 //pc.printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);*/
pnysten 7:758e1719910c 215
pnysten 7:758e1719910c 216 osjob_t* j = NULL;
pnysten 7:758e1719910c 217 hal_disableIRQs();
pnysten 7:758e1719910c 218 // check for runnable jobs
pnysten 7:758e1719910c 219 if(OS.runnablejobs) {
pnysten 7:758e1719910c 220 j = OS.runnablejobs;
pnysten 7:758e1719910c 221 OS.runnablejobs = j->next;
pnysten 7:758e1719910c 222 } else if(OS.scheduledjobs && hal_checkTimer(OS.scheduledjobs->deadline)) { // check for expired timed jobs
pnysten 7:758e1719910c 223 j = OS.scheduledjobs;
pnysten 7:758e1719910c 224 OS.scheduledjobs = j->next;
pnysten 7:758e1719910c 225 } else { // nothing pending
pnysten 7:758e1719910c 226 hal_sleep(); // wake by irq (timer already restarted)
pnysten 7:758e1719910c 227 }
pnysten 7:758e1719910c 228 hal_enableIRQs();
pnysten 7:758e1719910c 229 if(j) { // run job callback
pnysten 7:758e1719910c 230 j->func(j);
pnysten 7:758e1719910c 231 }
pnysten 7:758e1719910c 232 }
mluis 0:62d1edcc13d1 233 }