LMiC LoRa Semtech + Nucleo version sending every 10secs

Dependents:   LoRaWAN-test-10secs

Fork of LMiC by Alcatel-Lucent IoT Development

Committer:
pnysten
Date:
Wed Jan 13 14:23:31 2016 +0000
Revision:
7:758e1719910c
Parent:
1:d3b7bde3995c
Child:
9:c5820ce68bd6
Adding sensors values

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)) {
mluis 1:d3b7bde3995c 89 if((*pnext)->deadline - time > 0) { // (cmp diff, not abs!)
mluis 0:62d1edcc13d1 90 // enqueue before next element and stop
mluis 0:62d1edcc13d1 91 job->next = *pnext;
mluis 0:62d1edcc13d1 92 break;
mluis 0:62d1edcc13d1 93 }
mluis 0:62d1edcc13d1 94 }
mluis 0:62d1edcc13d1 95 *pnext = job;
mluis 0:62d1edcc13d1 96 hal_enableIRQs();
mluis 0:62d1edcc13d1 97 }
mluis 0:62d1edcc13d1 98
pnysten 7:758e1719910c 99 /* Helper function for printing floats & doubles */
pnysten 7:758e1719910c 100 static char *printDouble(char* str, double v, int decimalDigits=2)
pnysten 7:758e1719910c 101 {
pnysten 7:758e1719910c 102 int i = 1;
pnysten 7:758e1719910c 103 int intPart, fractPart;
pnysten 7:758e1719910c 104 int len;
pnysten 7:758e1719910c 105 char *ptr;
pnysten 7:758e1719910c 106
pnysten 7:758e1719910c 107 /* prepare decimal digits multiplicator */
pnysten 7:758e1719910c 108 for (;decimalDigits!=0; i*=10, decimalDigits--);
pnysten 7:758e1719910c 109
pnysten 7:758e1719910c 110 /* calculate integer & fractinal parts */
pnysten 7:758e1719910c 111 intPart = (int)v;
pnysten 7:758e1719910c 112 fractPart = (int)((v-(double)(int)v)*i);
pnysten 7:758e1719910c 113
pnysten 7:758e1719910c 114 /* fill in integer part */
pnysten 7:758e1719910c 115 sprintf(str, "%i.", intPart);
pnysten 7:758e1719910c 116
pnysten 7:758e1719910c 117 /* prepare fill in of fractional part */
pnysten 7:758e1719910c 118 len = strlen(str);
pnysten 7:758e1719910c 119 ptr = &str[len];
pnysten 7:758e1719910c 120
pnysten 7:758e1719910c 121 /* fill in leading fractional zeros */
pnysten 7:758e1719910c 122 for (i/=10;i>1; i/=10, ptr++) {
pnysten 7:758e1719910c 123 if(fractPart >= i) break;
pnysten 7:758e1719910c 124 *ptr = '0';
pnysten 7:758e1719910c 125 }
pnysten 7:758e1719910c 126
pnysten 7:758e1719910c 127 /* fill in (rest of) fractional part */
pnysten 7:758e1719910c 128 sprintf(ptr, "%i", fractPart);
pnysten 7:758e1719910c 129
pnysten 7:758e1719910c 130 return str;
pnysten 7:758e1719910c 131 }
pnysten 7:758e1719910c 132
mluis 0:62d1edcc13d1 133 // execute jobs from timer and from run queue
mluis 1:d3b7bde3995c 134 void os_runloop () {
pnysten 7:758e1719910c 135 /* uint8_t id;
pnysten 7:758e1719910c 136 float value1, value2;
pnysten 7:758e1719910c 137 char buffer1[32], buffer2[32];
pnysten 7:758e1719910c 138 int32_t axes[3];
pnysten 7:758e1719910c 139
pnysten 7:758e1719910c 140 debug_str("--- Starting new run ---\r\n");
pnysten 7:758e1719910c 141
pnysten 7:758e1719910c 142 humidity_sensor->ReadID(&id);
pnysten 7:758e1719910c 143 debug_str("HTS221 humidity & temperature = ");
pnysten 7:758e1719910c 144 debug_uint(id);
pnysten 7:758e1719910c 145 debug_str("\r\n");
pnysten 7:758e1719910c 146 pressure_sensor->ReadID(&id);
pnysten 7:758e1719910c 147 debug_str("LPS25H pressure & temperature = ");
pnysten 7:758e1719910c 148 debug_uint(id);
pnysten 7:758e1719910c 149 debug_str("\r\n");
pnysten 7:758e1719910c 150 magnetometer->ReadID(&id);
pnysten 7:758e1719910c 151 debug_str("LIS3MDL magnetometer = ");
pnysten 7:758e1719910c 152 debug_uint(id);
pnysten 7:758e1719910c 153 debug_str("\r\n");
pnysten 7:758e1719910c 154 gyroscope->ReadID(&id);
pnysten 7:758e1719910c 155 debug_str("LSM6DS0 accelerometer & gyroscope = ");
pnysten 7:758e1719910c 156 debug_uint(id);
pnysten 7:758e1719910c 157 debug_str("\r\n");*/
pnysten 7:758e1719910c 158
pnysten 7:758e1719910c 159 // wait(3);
pnysten 7:758e1719910c 160
pnysten 7:758e1719910c 161 while(1) {
pnysten 7:758e1719910c 162 /* debug_str("\r\n");
pnysten 7:758e1719910c 163
pnysten 7:758e1719910c 164 temp_sensor1->GetTemperature(&value1);
pnysten 7:758e1719910c 165 humidity_sensor->GetHumidity(&value2);
pnysten 7:758e1719910c 166 debug_str("HTS221: [temp] ");
pnysten 7:758e1719910c 167 debug_str(printDouble(buffer1, value1));
pnysten 7:758e1719910c 168 debug_str("°C, [hum] ");
pnysten 7:758e1719910c 169 debug_str(printDouble(buffer2, value2));
pnysten 7:758e1719910c 170 debug_str("%\r\n");
pnysten 7:758e1719910c 171 //pc.printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 7:758e1719910c 172
pnysten 7:758e1719910c 173 temp_sensor2->GetFahrenheit(&value1);
pnysten 7:758e1719910c 174 pressure_sensor->GetPressure(&value2);
pnysten 7:758e1719910c 175 debug_str("LPS25H: [temp] ");
pnysten 7:758e1719910c 176 debug_str(printDouble(buffer1, value1));
pnysten 7:758e1719910c 177 debug_str("°F, [press] ");
pnysten 7:758e1719910c 178 debug_str(printDouble(buffer2, value2));
pnysten 7:758e1719910c 179 debug_str("mbar\r\n");
pnysten 7:758e1719910c 180 //pc.printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 7:758e1719910c 181
pnysten 7:758e1719910c 182 debug_str("---\r\n");
pnysten 7:758e1719910c 183
pnysten 7:758e1719910c 184 magnetometer->Get_M_Axes(axes);
pnysten 7:758e1719910c 185 debug_str("LIS3MDL [mag/mgauss]: ");
pnysten 7:758e1719910c 186 debug_uint(axes[0]);
pnysten 7:758e1719910c 187 debug_str(", ");
pnysten 7:758e1719910c 188 debug_uint(axes[1]);
pnysten 7:758e1719910c 189 debug_str(", ");
pnysten 7:758e1719910c 190 debug_uint(axes[2]);
pnysten 7:758e1719910c 191 debug_str("\r\n");
pnysten 7:758e1719910c 192 //pc.printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 7:758e1719910c 193
pnysten 7:758e1719910c 194 accelerometer->Get_X_Axes(axes);
pnysten 7:758e1719910c 195 debug_str("LSM6DS0 [acc/mg]: ");
pnysten 7:758e1719910c 196 debug_uint(axes[0]);
pnysten 7:758e1719910c 197 debug_str(", ");
pnysten 7:758e1719910c 198 debug_uint(axes[1]);
pnysten 7:758e1719910c 199 debug_str(", ");
pnysten 7:758e1719910c 200 debug_uint(axes[2]);
pnysten 7:758e1719910c 201 debug_str("\r\n");
pnysten 7:758e1719910c 202 //pc.printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 7:758e1719910c 203
pnysten 7:758e1719910c 204 gyroscope->Get_G_Axes(axes);
pnysten 7:758e1719910c 205 debug_str("LSM6DS0 [gyro/mdps]: ");
pnysten 7:758e1719910c 206 debug_uint(axes[0]);
pnysten 7:758e1719910c 207 debug_str(", ");
pnysten 7:758e1719910c 208 debug_uint(axes[1]);
pnysten 7:758e1719910c 209 debug_str(", ");
pnysten 7:758e1719910c 210 debug_uint(axes[2]);
pnysten 7:758e1719910c 211 debug_str("\r\n");
pnysten 7:758e1719910c 212 //pc.printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);*/
pnysten 7:758e1719910c 213
pnysten 7:758e1719910c 214 osjob_t* j = NULL;
pnysten 7:758e1719910c 215 hal_disableIRQs();
pnysten 7:758e1719910c 216 // check for runnable jobs
pnysten 7:758e1719910c 217 if(OS.runnablejobs) {
pnysten 7:758e1719910c 218 j = OS.runnablejobs;
pnysten 7:758e1719910c 219 OS.runnablejobs = j->next;
pnysten 7:758e1719910c 220 } else if(OS.scheduledjobs && hal_checkTimer(OS.scheduledjobs->deadline)) { // check for expired timed jobs
pnysten 7:758e1719910c 221 j = OS.scheduledjobs;
pnysten 7:758e1719910c 222 OS.scheduledjobs = j->next;
pnysten 7:758e1719910c 223 } else { // nothing pending
pnysten 7:758e1719910c 224 hal_sleep(); // wake by irq (timer already restarted)
pnysten 7:758e1719910c 225 }
pnysten 7:758e1719910c 226 hal_enableIRQs();
pnysten 7:758e1719910c 227 if(j) { // run job callback
pnysten 7:758e1719910c 228 j->func(j);
pnysten 7:758e1719910c 229 }
pnysten 7:758e1719910c 230 }
mluis 0:62d1edcc13d1 231 }