LMiC LoRa Semtech + Nucleo version sending every 10secs
Dependents: LoRaWAN-test-10secs
Fork of LMiC by
oslmic.cpp@9:c5820ce68bd6, 2016-02-23 (annotated)
- Committer:
- pnysten
- Date:
- Tue Feb 23 08:41:36 2016 +0000
- Revision:
- 9:c5820ce68bd6
- Parent:
- 7:758e1719910c
LR-test3 version sending uplinks every 10 secs
Who changed what in which revision?
User | Revision | Line number | New 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 | } |