Lora OTA device for Everynet

Dependencies:   LMiCLibOTADeviceEverynet SX1276Lib X_NUCLEO_IKS01A1 cantcoap lwip mbed-rtos mbed

Fork of LoRaWAN-test-10secs by Alcatel-Lucent IoT Development

Committer:
pnysten
Date:
Mon Feb 08 10:39:15 2016 +0000
Revision:
12:f28b629d8a6e
Parent:
11:59c160a8926d
Child:
13:9de42df1d3d8
New version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 3:ce28e3313a88 1 /*
mluis 0:a2929fa6e4f0 2 / _____) _ | |
mluis 0:a2929fa6e4f0 3 ( (____ _____ ____ _| |_ _____ ____| |__
mluis 0:a2929fa6e4f0 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
mluis 0:a2929fa6e4f0 5 _____) ) ____| | | || |_| ____( (___| | | |
mluis 0:a2929fa6e4f0 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 1:60184eda0066 7 (C)2015 Semtech
mluis 0:a2929fa6e4f0 8
mluis 1:60184eda0066 9 Description: MBED LoRaWAN example application
mluis 0:a2929fa6e4f0 10
mluis 0:a2929fa6e4f0 11 License: Revised BSD License, see LICENSE.TXT file include in the project
mluis 0:a2929fa6e4f0 12
mluis 0:a2929fa6e4f0 13 Maintainer: Miguel Luis and Gregory Cristian
mluis 0:a2929fa6e4f0 14 */
pnysten 6:540c5d907c90 15
pnysten 4:5e274bf85bf0 16 #include <cstdio>
pnysten 4:5e274bf85bf0 17 #include <string>
pnysten 4:5e274bf85bf0 18 #include <cassert>
pnysten 4:5e274bf85bf0 19
mluis 1:60184eda0066 20 #include "mbed.h"
pnysten 6:540c5d907c90 21 //#include "Node.h"
pnysten 4:5e274bf85bf0 22 #include "cantcoap.h"
pnysten 10:155dc60fce79 23 #include "x_nucleo_iks01a1.h"
pnysten 10:155dc60fce79 24 #include "rtos.h"
mluis 1:60184eda0066 25
mluis 0:a2929fa6e4f0 26 #include "lmic.h"
mluis 1:60184eda0066 27 #include "debug.h"
mluis 0:a2929fa6e4f0 28
pnysten 10:155dc60fce79 29 /* Instantiate the expansion board */
pnysten 10:155dc60fce79 30 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(D14, D15);
pnysten 10:155dc60fce79 31
pnysten 10:155dc60fce79 32 /* Retrieve the composing elements of the expansion board */
pnysten 10:155dc60fce79 33 static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
pnysten 10:155dc60fce79 34 static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
pnysten 10:155dc60fce79 35 static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
pnysten 10:155dc60fce79 36 static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;
pnysten 10:155dc60fce79 37 static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor;
pnysten 10:155dc60fce79 38 static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor;
pnysten 10:155dc60fce79 39 static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor;
pnysten 10:155dc60fce79 40
pnysten 10:155dc60fce79 41 uint8_t id;
pnysten 10:155dc60fce79 42 float value1, value2;
pnysten 10:155dc60fce79 43 char buffer1[32], buffer2[32], buffer3[32];
pnysten 10:155dc60fce79 44 int32_t axes[3];
pnysten 10:155dc60fce79 45
pnysten 10:155dc60fce79 46 static bool temp_sent = false;
pnysten 10:155dc60fce79 47 static bool hum_sent = false;
pnysten 10:155dc60fce79 48 static bool press_sent = false;
pnysten 10:155dc60fce79 49 static bool gyro_sent = false;
pnysten 10:155dc60fce79 50 static bool motion_sent = false;
pnysten 10:155dc60fce79 51 static bool magn_sent = false;
pnysten 10:155dc60fce79 52
pnysten 4:5e274bf85bf0 53 const std::string REGISTRATION_SEGMENT ="/rd";
pnysten 4:5e274bf85bf0 54 const std::string ENDPOINT_SEGMENT = "?ep=";
pnysten 4:5e274bf85bf0 55 const std::string LIFETIME ="&lt=";
pnysten 4:5e274bf85bf0 56 const std::string BINDING ="&b=";
pnysten 6:540c5d907c90 57
pnysten 4:5e274bf85bf0 58 const std::string REGISTRATION_OPEN = "<";
pnysten 4:5e274bf85bf0 59 const std::string REGISTRATION_CLOSE = ">";
pnysten 4:5e274bf85bf0 60 const std::string REGISTRATION_SEPARATOR ="/";
pnysten 6:540c5d907c90 61
pnysten 4:5e274bf85bf0 62 int _node_Id=0;
pnysten 6:540c5d907c90 63
pnysten 4:5e274bf85bf0 64 const std::string endPoint_Name = "loraDevice";
pnysten 4:5e274bf85bf0 65 const int lifeTime = 300;
pnysten 4:5e274bf85bf0 66 const std::string binding = "U";
pnysten 6:540c5d907c90 67
pnysten 4:5e274bf85bf0 68 unsigned char * _payload;
pnysten 4:5e274bf85bf0 69 long _payload_size;
pnysten 6:540c5d907c90 70
mluis 0:a2929fa6e4f0 71 /*!
mluis 0:a2929fa6e4f0 72 * When set to 1 the application uses the Over-the-Air activation procedure
mluis 0:a2929fa6e4f0 73 * When set to 0 the application uses the Personalization activation procedure
mluis 0:a2929fa6e4f0 74 */
mluis 0:a2929fa6e4f0 75 #define OVER_THE_AIR_ACTIVATION 0
mluis 0:a2929fa6e4f0 76
mluis 1:60184eda0066 77 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 1:60184eda0066 78
mluis 1:60184eda0066 79 /*!
mluis 1:60184eda0066 80 * Defines the network ID when using personalization activation procedure
mluis 1:60184eda0066 81 */
mluis 1:60184eda0066 82 #define LORAWAN_NET_ID ( uint32_t )0x00000000
mluis 1:60184eda0066 83
mluis 1:60184eda0066 84 /*!
mluis 1:60184eda0066 85 * Defines the device address when using personalization activation procedure
mluis 1:60184eda0066 86 */
pnysten 9:84a69ca4d35a 87 //To be changed when switching from one to another
pnysten 7:f1521b0ecf08 88 #define LORAWAN_DEV_ADDR ( uint32_t )0x12345678
pnysten 6:540c5d907c90 89 //#define LORAWAN_DEV_ADDR ( uint32_t )0x12341111
mluis 1:60184eda0066 90
mluis 1:60184eda0066 91 #endif
mluis 1:60184eda0066 92
mluis 1:60184eda0066 93 /*!
mluis 1:60184eda0066 94 * Defines the application data transmission duty cycle
mluis 1:60184eda0066 95 */
pnysten 12:f28b629d8a6e 96 //#define APP_TX_DUTYCYCLE 5000 // 5 [s] value in ms
pnysten 12:f28b629d8a6e 97 //PANY
pnysten 12:f28b629d8a6e 98 #define APP_TX_DUTYCYCLE 1000 // 1 [s] value in ms
pnysten 12:f28b629d8a6e 99 //PANY
mluis 1:60184eda0066 100 #define APP_TX_DUTYCYCLE_RND 1000 // 1 [s] value in ms
mluis 1:60184eda0066 101
mluis 1:60184eda0066 102 /*!
mluis 1:60184eda0066 103 * LoRaWAN Adaptative Data Rate
mluis 1:60184eda0066 104 */
mluis 1:60184eda0066 105 #define LORAWAN_ADR_ON 1
mluis 1:60184eda0066 106
mluis 1:60184eda0066 107 /*!
mluis 1:60184eda0066 108 * LoRaWAN confirmed messages
mluis 1:60184eda0066 109 */
pnysten 9:84a69ca4d35a 110 #define LORAWAN_CONFIRMED_MSG_ON 0
mluis 1:60184eda0066 111
mluis 1:60184eda0066 112 /*!
mluis 1:60184eda0066 113 * LoRaWAN application port
mluis 1:60184eda0066 114 */
mluis 1:60184eda0066 115 #define LORAWAN_APP_PORT 15
mluis 1:60184eda0066 116
mluis 1:60184eda0066 117 /*!
mluis 1:60184eda0066 118 * User application data buffer size
mluis 1:60184eda0066 119 */
mluis 1:60184eda0066 120 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
mluis 1:60184eda0066 121 #define LORAWAN_APP_DATA_SIZE 6
mluis 1:60184eda0066 122
mluis 1:60184eda0066 123 #else
mluis 1:60184eda0066 124 #define LORAWAN_APP_DATA_SIZE 1
mluis 1:60184eda0066 125
mluis 1:60184eda0066 126 #endif
mluis 0:a2929fa6e4f0 127
pnysten 4:5e274bf85bf0 128 #define UINT16_MAX (65535U)
pnysten 4:5e274bf85bf0 129 #define UINT64_MAX (18446744073709551615ULL)
pnysten 6:540c5d907c90 130
pnysten 6:540c5d907c90 131 //Node lwm2mNode("LR-test0");;
pnysten 6:540c5d907c90 132 unsigned int LoRaWAN_data_size = 0;
pnysten 4:5e274bf85bf0 133
pnysten 10:155dc60fce79 134 /* Helper function for printing floats & doubles */
pnysten 10:155dc60fce79 135 static char *printDouble(char* str, double v, int decimalDigits=2)
pnysten 10:155dc60fce79 136 {
pnysten 10:155dc60fce79 137 int i = 1;
pnysten 10:155dc60fce79 138 int intPart, fractPart;
pnysten 10:155dc60fce79 139 int len;
pnysten 10:155dc60fce79 140 char *ptr;
pnysten 10:155dc60fce79 141
pnysten 10:155dc60fce79 142 /* prepare decimal digits multiplicator */
pnysten 10:155dc60fce79 143 for (;decimalDigits!=0; i*=10, decimalDigits--);
pnysten 10:155dc60fce79 144
pnysten 10:155dc60fce79 145 /* calculate integer & fractinal parts */
pnysten 10:155dc60fce79 146 intPart = (int)v;
pnysten 10:155dc60fce79 147 fractPart = (int)((v-(double)(int)v)*i);
pnysten 10:155dc60fce79 148
pnysten 10:155dc60fce79 149 /* fill in integer part */
pnysten 10:155dc60fce79 150 sprintf(str, "%i.", intPart);
pnysten 10:155dc60fce79 151
pnysten 10:155dc60fce79 152 /* prepare fill in of fractional part */
pnysten 10:155dc60fce79 153 len = strlen(str);
pnysten 10:155dc60fce79 154 ptr = &str[len];
pnysten 10:155dc60fce79 155
pnysten 10:155dc60fce79 156 /* fill in leading fractional zeros */
pnysten 10:155dc60fce79 157 for (i/=10;i>1; i/=10, ptr++) {
pnysten 10:155dc60fce79 158 if(fractPart >= i) break;
pnysten 10:155dc60fce79 159 *ptr = '0';
pnysten 10:155dc60fce79 160 }
pnysten 10:155dc60fce79 161
pnysten 10:155dc60fce79 162 /* fill in (rest of) fractional part */
pnysten 10:155dc60fce79 163 sprintf(ptr, "%i", fractPart);
pnysten 10:155dc60fce79 164
pnysten 10:155dc60fce79 165 return str;
pnysten 10:155dc60fce79 166 }
pnysten 10:155dc60fce79 167
pnysten 10:155dc60fce79 168 /* Helper function for printing integers */
pnysten 10:155dc60fce79 169 static char *printInt(char* str, int v)
pnysten 10:155dc60fce79 170 {
pnysten 10:155dc60fce79 171 /* fill in integer part */
pnysten 10:155dc60fce79 172 sprintf(str, "%i", v);
pnysten 10:155dc60fce79 173
pnysten 10:155dc60fce79 174 return str;
pnysten 10:155dc60fce79 175 }
pnysten 10:155dc60fce79 176
pnysten 10:155dc60fce79 177 /* Thread for calling libNsdl exec function (cleanup, resendings etc..) */
pnysten 10:155dc60fce79 178 /* Node updates accelerometer every 60 seconds. Notification sending is done here. */
pnysten 10:155dc60fce79 179 static void exec_call_thread(void const *args)
pnysten 10:155dc60fce79 180 {
pnysten 10:155dc60fce79 181 uint8_t id;
pnysten 10:155dc60fce79 182 float value1, value2;
pnysten 10:155dc60fce79 183 char buffer1[32], buffer2[32];
pnysten 10:155dc60fce79 184 int32_t axes[3];
pnysten 10:155dc60fce79 185
pnysten 10:155dc60fce79 186 debug_str("--- Starting new run ---\r\n");
pnysten 10:155dc60fce79 187
pnysten 10:155dc60fce79 188 humidity_sensor->ReadID(&id);
pnysten 10:155dc60fce79 189 debug_str("HTS221 humidity & temperature = ");
pnysten 10:155dc60fce79 190 debug_uint(id);
pnysten 10:155dc60fce79 191 debug_str("\r\n");
pnysten 10:155dc60fce79 192 pressure_sensor->ReadID(&id);
pnysten 10:155dc60fce79 193 debug_str("LPS25H pressure & temperature = ");
pnysten 10:155dc60fce79 194 debug_uint(id);
pnysten 10:155dc60fce79 195 debug_str("\r\n");
pnysten 10:155dc60fce79 196 magnetometer->ReadID(&id);
pnysten 10:155dc60fce79 197 debug_str("LIS3MDL magnetometer = ");
pnysten 10:155dc60fce79 198 debug_uint(id);
pnysten 10:155dc60fce79 199 debug_str("\r\n");
pnysten 10:155dc60fce79 200 gyroscope->ReadID(&id);
pnysten 10:155dc60fce79 201 debug_str("LSM6DS0 accelerometer & gyroscope = ");
pnysten 10:155dc60fce79 202 debug_uint(id);
pnysten 10:155dc60fce79 203 debug_str("\r\n");
pnysten 10:155dc60fce79 204
pnysten 10:155dc60fce79 205 wait(3);
pnysten 10:155dc60fce79 206
pnysten 10:155dc60fce79 207 while(1) {
pnysten 10:155dc60fce79 208 debug_str("\r\n");
pnysten 10:155dc60fce79 209
pnysten 10:155dc60fce79 210 temp_sensor1->GetTemperature(&value1);
pnysten 10:155dc60fce79 211 humidity_sensor->GetHumidity(&value2);
pnysten 10:155dc60fce79 212 debug_str("HTS221: [temp] ");
pnysten 10:155dc60fce79 213 debug_str(printDouble(buffer1, value1));
pnysten 10:155dc60fce79 214 debug_str("°C, [hum] ");
pnysten 10:155dc60fce79 215 debug_str(printDouble(buffer2, value2));
pnysten 10:155dc60fce79 216 debug_str("%\r\n");
pnysten 10:155dc60fce79 217 //pc.printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 10:155dc60fce79 218
pnysten 10:155dc60fce79 219 temp_sensor2->GetFahrenheit(&value1);
pnysten 10:155dc60fce79 220 pressure_sensor->GetPressure(&value2);
pnysten 10:155dc60fce79 221 debug_str("LPS25H: [temp] ");
pnysten 10:155dc60fce79 222 debug_str(printDouble(buffer1, value1));
pnysten 10:155dc60fce79 223 debug_str("°F, [press] ");
pnysten 10:155dc60fce79 224 debug_str(printDouble(buffer2, value2));
pnysten 10:155dc60fce79 225 debug_str("mbar\r\n");
pnysten 10:155dc60fce79 226 //pc.printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 10:155dc60fce79 227
pnysten 10:155dc60fce79 228 debug_str("---\r\n");
pnysten 10:155dc60fce79 229
pnysten 10:155dc60fce79 230 magnetometer->Get_M_Axes(axes);
pnysten 10:155dc60fce79 231 debug_str("LIS3MDL [mag/mgauss]: ");
pnysten 10:155dc60fce79 232 debug_uint(axes[0]);
pnysten 10:155dc60fce79 233 debug_str(", ");
pnysten 10:155dc60fce79 234 debug_uint(axes[1]);
pnysten 10:155dc60fce79 235 debug_str(", ");
pnysten 10:155dc60fce79 236 debug_uint(axes[2]);
pnysten 10:155dc60fce79 237 debug_str("\r\n");
pnysten 10:155dc60fce79 238 //pc.printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 10:155dc60fce79 239
pnysten 10:155dc60fce79 240 accelerometer->Get_X_Axes(axes);
pnysten 10:155dc60fce79 241 debug_str("LSM6DS0 [acc/mg]: ");
pnysten 10:155dc60fce79 242 debug_uint(axes[0]);
pnysten 10:155dc60fce79 243 debug_str(", ");
pnysten 10:155dc60fce79 244 debug_uint(axes[1]);
pnysten 10:155dc60fce79 245 debug_str(", ");
pnysten 10:155dc60fce79 246 debug_uint(axes[2]);
pnysten 10:155dc60fce79 247 debug_str("\r\n");
pnysten 10:155dc60fce79 248 //pc.printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 10:155dc60fce79 249
pnysten 10:155dc60fce79 250 gyroscope->Get_G_Axes(axes);
pnysten 10:155dc60fce79 251 debug_str("LSM6DS0 [gyro/mdps]: ");
pnysten 10:155dc60fce79 252 debug_uint(axes[0]);
pnysten 10:155dc60fce79 253 debug_str(", ");
pnysten 10:155dc60fce79 254 debug_uint(axes[1]);
pnysten 10:155dc60fce79 255 debug_str(", ");
pnysten 10:155dc60fce79 256 debug_uint(axes[2]);
pnysten 10:155dc60fce79 257 debug_str("\r\n");
pnysten 10:155dc60fce79 258 //pc.printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 10:155dc60fce79 259
pnysten 10:155dc60fce79 260 wait(1.5);
pnysten 10:155dc60fce79 261 }
pnysten 10:155dc60fce79 262 }
pnysten 10:155dc60fce79 263
pnysten 4:5e274bf85bf0 264 std::string to_string( int x ) {
pnysten 4:5e274bf85bf0 265 int length = snprintf( NULL, 0, "%d", x );
pnysten 4:5e274bf85bf0 266 assert( length >= 0 );
pnysten 4:5e274bf85bf0 267 char* buf = new char[length + 1];
pnysten 4:5e274bf85bf0 268 snprintf( buf, length + 1, "%d", x );
pnysten 4:5e274bf85bf0 269 std::string str( buf );
pnysten 4:5e274bf85bf0 270 delete[] buf;
pnysten 4:5e274bf85bf0 271 return str;
pnysten 4:5e274bf85bf0 272 }
pnysten 10:155dc60fce79 273
pnysten 4:5e274bf85bf0 274 unsigned char * get_Registration_Payload(long *payload_size){
pnysten 6:540c5d907c90 275
pnysten 4:5e274bf85bf0 276 string registration_Payload ="";
pnysten 6:540c5d907c90 277
pnysten 4:5e274bf85bf0 278 string s="";
pnysten 6:540c5d907c90 279
pnysten 4:5e274bf85bf0 280 s.append(REGISTRATION_OPEN);
pnysten 4:5e274bf85bf0 281 s.append(REGISTRATION_SEPARATOR);
pnysten 4:5e274bf85bf0 282 s.append("3/0/0");
pnysten 4:5e274bf85bf0 283 s.append(REGISTRATION_CLOSE);
pnysten 4:5e274bf85bf0 284 s.append(",");
pnysten 4:5e274bf85bf0 285 s.append(REGISTRATION_OPEN);
pnysten 4:5e274bf85bf0 286 s.append(REGISTRATION_SEPARATOR);
pnysten 4:5e274bf85bf0 287 s.append("3/0/1");
pnysten 4:5e274bf85bf0 288 s.append(REGISTRATION_CLOSE);
pnysten 4:5e274bf85bf0 289 s.append(",");
pnysten 4:5e274bf85bf0 290 s.append(REGISTRATION_OPEN);
pnysten 4:5e274bf85bf0 291 s.append(REGISTRATION_SEPARATOR);
pnysten 4:5e274bf85bf0 292 s.append("3/0/2");
pnysten 4:5e274bf85bf0 293 s.append(REGISTRATION_CLOSE);
pnysten 6:540c5d907c90 294
pnysten 4:5e274bf85bf0 295 registration_Payload.append(s);
pnysten 4:5e274bf85bf0 296
pnysten 4:5e274bf85bf0 297 unsigned char *c = new unsigned char[registration_Payload.size()+1];
pnysten 4:5e274bf85bf0 298 copy(registration_Payload.begin(),registration_Payload.end(),c);
pnysten 4:5e274bf85bf0 299 c[registration_Payload.size()]='\0';
pnysten 4:5e274bf85bf0 300 *payload_size=registration_Payload.size();
pnysten 4:5e274bf85bf0 301
pnysten 4:5e274bf85bf0 302 return c;
pnysten 6:540c5d907c90 303
pnysten 4:5e274bf85bf0 304 }
pnysten 4:5e274bf85bf0 305 uint8_t * get_Token(int * size){
pnysten 4:5e274bf85bf0 306 srand(time(0)+_node_Id);
pnysten 4:5e274bf85bf0 307 long test=0;
pnysten 4:5e274bf85bf0 308 bool exist=false;
pnysten 4:5e274bf85bf0 309
pnysten 4:5e274bf85bf0 310 do{
pnysten 4:5e274bf85bf0 311 test=(rand() % UINT64_MAX);
pnysten 4:5e274bf85bf0 312
pnysten 4:5e274bf85bf0 313 }while (exist==true);
pnysten 4:5e274bf85bf0 314 uint8_t ones = 0xFF;
pnysten 4:5e274bf85bf0 315 *size=1;
pnysten 4:5e274bf85bf0 316 for (int i=0; i<8; ++i) {
pnysten 4:5e274bf85bf0 317 if ( (test>>8*i & ones) =='\0' || i==8) {
pnysten 4:5e274bf85bf0 318 *size=i;
pnysten 4:5e274bf85bf0 319 break;
pnysten 4:5e274bf85bf0 320 }
pnysten 4:5e274bf85bf0 321 }
pnysten 4:5e274bf85bf0 322 uint8_t * token =new uint8_t[*size];
pnysten 4:5e274bf85bf0 323 for (int i=0; i<*size; ++i){
pnysten 4:5e274bf85bf0 324 token[*size-1-i]=test>>8*i & ones;
pnysten 4:5e274bf85bf0 325 }
pnysten 4:5e274bf85bf0 326 return token;
pnysten 4:5e274bf85bf0 327 }
pnysten 6:540c5d907c90 328
pnysten 4:5e274bf85bf0 329 uint16_t get_Message_ID(){
pnysten 4:5e274bf85bf0 330 srand(time(0)+_node_Id);
pnysten 4:5e274bf85bf0 331 int test=0;
pnysten 4:5e274bf85bf0 332 bool exist=false;
pnysten 4:5e274bf85bf0 333 do{
pnysten 4:5e274bf85bf0 334
pnysten 4:5e274bf85bf0 335 exist=false;
pnysten 4:5e274bf85bf0 336 test=(rand() % UINT16_MAX);
pnysten 4:5e274bf85bf0 337
pnysten 4:5e274bf85bf0 338 }while (exist==true);
pnysten 4:5e274bf85bf0 339
pnysten 4:5e274bf85bf0 340
pnysten 4:5e274bf85bf0 341 return (uint16_t) test;
pnysten 4:5e274bf85bf0 342
pnysten 4:5e274bf85bf0 343 }
pnysten 6:540c5d907c90 344
pnysten 4:5e274bf85bf0 345 char * get_Registration_Query(){
pnysten 4:5e274bf85bf0 346
pnysten 4:5e274bf85bf0 347 string buffer;
pnysten 4:5e274bf85bf0 348 buffer.append(REGISTRATION_SEGMENT);
pnysten 4:5e274bf85bf0 349 buffer.append(ENDPOINT_SEGMENT);
pnysten 4:5e274bf85bf0 350 buffer.append(endPoint_Name);
pnysten 4:5e274bf85bf0 351 buffer.append(LIFETIME);
pnysten 4:5e274bf85bf0 352 buffer.append(to_string(lifeTime));
pnysten 4:5e274bf85bf0 353 buffer.append(BINDING);
pnysten 4:5e274bf85bf0 354 buffer.append(binding);
pnysten 4:5e274bf85bf0 355
pnysten 4:5e274bf85bf0 356 char *c = new char[buffer.size()+1];
pnysten 4:5e274bf85bf0 357 copy(buffer.begin(),buffer.end(),c);
pnysten 4:5e274bf85bf0 358 c[buffer.size()]='\0';
pnysten 4:5e274bf85bf0 359 return c;
pnysten 4:5e274bf85bf0 360
pnysten 6:540c5d907c90 361
pnysten 4:5e274bf85bf0 362 }
pnysten 6:540c5d907c90 363
mluis 0:a2929fa6e4f0 364 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 365 // CONFIGURATION (FOR APPLICATION CALLBACKS BELOW)
mluis 0:a2929fa6e4f0 366 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 367
mluis 0:a2929fa6e4f0 368 // application router ID (LSBF)
pnysten 9:84a69ca4d35a 369 //To be changed when switching from one to another
mluis 1:60184eda0066 370 static const uint8_t AppEui[8] =
mluis 0:a2929fa6e4f0 371 {
mluis 1:60184eda0066 372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
pnysten 6:540c5d907c90 373 // 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00
mluis 0:a2929fa6e4f0 374 };
mluis 0:a2929fa6e4f0 375
mluis 0:a2929fa6e4f0 376 // unique device ID (LSBF)
pnysten 9:84a69ca4d35a 377 //To be changed when switching from one to another
mluis 0:a2929fa6e4f0 378 static const u1_t DevEui[8] =
mluis 0:a2929fa6e4f0 379 {
pnysten 6:540c5d907c90 380 // 0x00, 0x00, 0x00, 0x00, 0x08, 0x06, 0x02, 0x48
pnysten 6:540c5d907c90 381
pnysten 9:84a69ca4d35a 382 0x30, 0x74, 0x73, 0x65, 0x74, 0x2D, 0x52, 0x4C // 4c522d7465737430 = "LR-test0"
pnysten 6:540c5d907c90 383 // 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x99, 0xF7
pnysten 9:84a69ca4d35a 384 // 0x32, 0x74, 0x73, 0x65, 0x74, 0x2D, 0x52, 0x4C // 4c522d7465737430 = "LR-test2"
pnysten 6:540c5d907c90 385
pnysten 6:540c5d907c90 386
pnysten 4:5e274bf85bf0 387 // 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
pnysten 4:5e274bf85bf0 388 // 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x099, 0xF7
mluis 0:a2929fa6e4f0 389 };
mluis 0:a2929fa6e4f0 390
mluis 0:a2929fa6e4f0 391 // device-specific AES key (derived from device EUI)
mluis 1:60184eda0066 392 static const uint8_t DevKey[16] =
mluis 0:a2929fa6e4f0 393 {
pnysten 6:540c5d907c90 394 // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
pnysten 6:540c5d907c90 395 // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
mluis 1:60184eda0066 396 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
mluis 1:60184eda0066 397 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
mluis 0:a2929fa6e4f0 398 };
mluis 0:a2929fa6e4f0 399
mluis 1:60184eda0066 400 #if( OVER_THE_AIR_ACTIVATION == 0 )
mluis 1:60184eda0066 401 // network session key
pnysten 9:84a69ca4d35a 402 //To be changed when switching from one to another
mluis 0:a2929fa6e4f0 403 static uint8_t NwkSKey[] =
mluis 0:a2929fa6e4f0 404 {
mluis 0:a2929fa6e4f0 405 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
mluis 0:a2929fa6e4f0 406 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
pnysten 6:540c5d907c90 407 // 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3D
mluis 0:a2929fa6e4f0 408 };
mluis 0:a2929fa6e4f0 409
mluis 1:60184eda0066 410 // application session key
pnysten 9:84a69ca4d35a 411 //To be changed when switching from one to another
mluis 0:a2929fa6e4f0 412 static uint8_t ArtSKey[] =
mluis 0:a2929fa6e4f0 413 {
mluis 0:a2929fa6e4f0 414 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
mluis 0:a2929fa6e4f0 415 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
pnysten 6:540c5d907c90 416 // 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3D
mluis 0:a2929fa6e4f0 417 };
mluis 0:a2929fa6e4f0 418
mluis 1:60184eda0066 419 #endif
mluis 1:60184eda0066 420
mluis 0:a2929fa6e4f0 421 // LEDs and Frame jobs
mluis 0:a2929fa6e4f0 422 osjob_t rxLedJob;
mluis 0:a2929fa6e4f0 423 osjob_t txLedJob;
mluis 0:a2929fa6e4f0 424 osjob_t sendFrameJob;
mluis 0:a2929fa6e4f0 425
mluis 1:60184eda0066 426 // LED state
mluis 0:a2929fa6e4f0 427 static bool AppLedStateOn = false;
mluis 0:a2929fa6e4f0 428
mluis 0:a2929fa6e4f0 429 //////////////////////////////////////////////////
mluis 1:60184eda0066 430 // Utility functions
mluis 1:60184eda0066 431 //////////////////////////////////////////////////
mluis 1:60184eda0066 432 /*!
mluis 1:60184eda0066 433 * \brief Computes a random number between min and max
mluis 1:60184eda0066 434 *
mluis 1:60184eda0066 435 * \param [IN] min range minimum value
mluis 1:60184eda0066 436 * \param [IN] max range maximum value
mluis 1:60184eda0066 437 * \retval random random value in range min..max
mluis 1:60184eda0066 438 */
mluis 1:60184eda0066 439 int32_t randr( int32_t min, int32_t max )
mluis 1:60184eda0066 440 {
mluis 1:60184eda0066 441 return ( int32_t )rand( ) % ( max - min + 1 ) + min;
mluis 1:60184eda0066 442 }
mluis 1:60184eda0066 443
mluis 1:60184eda0066 444 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 445 // APPLICATION CALLBACKS
mluis 0:a2929fa6e4f0 446 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 447
mluis 0:a2929fa6e4f0 448 // provide application router ID (8 bytes, LSBF)
mluis 1:60184eda0066 449 void os_getArtEui( uint8_t *buf )
mluis 0:a2929fa6e4f0 450 {
mluis 0:a2929fa6e4f0 451 memcpy( buf, AppEui, 8 );
mluis 0:a2929fa6e4f0 452 }
mluis 0:a2929fa6e4f0 453
mluis 0:a2929fa6e4f0 454 // provide device ID (8 bytes, LSBF)
mluis 1:60184eda0066 455 void os_getDevEui( uint8_t *buf )
mluis 0:a2929fa6e4f0 456 {
mluis 0:a2929fa6e4f0 457 memcpy( buf, DevEui, 8 );
mluis 0:a2929fa6e4f0 458 }
mluis 0:a2929fa6e4f0 459
mluis 0:a2929fa6e4f0 460 // provide device key (16 bytes)
mluis 1:60184eda0066 461 void os_getDevKey( uint8_t *buf )
mluis 0:a2929fa6e4f0 462 {
mluis 0:a2929fa6e4f0 463 memcpy( buf, DevKey, 16 );
mluis 0:a2929fa6e4f0 464 }
mluis 0:a2929fa6e4f0 465
mluis 0:a2929fa6e4f0 466 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 467 // MAIN - INITIALIZATION AND STARTUP
mluis 0:a2929fa6e4f0 468 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 469
mluis 0:a2929fa6e4f0 470 static void onRxLed( osjob_t* j )
mluis 0:a2929fa6e4f0 471 {
pnysten 12:f28b629d8a6e 472 // debug_val("LED2 = ", 0 );
mluis 0:a2929fa6e4f0 473 }
mluis 0:a2929fa6e4f0 474
mluis 0:a2929fa6e4f0 475 static void onTxLed( osjob_t* j )
mluis 0:a2929fa6e4f0 476 {
pnysten 12:f28b629d8a6e 477 // debug_val("LED1 = ", 0 );
mluis 0:a2929fa6e4f0 478 }
mluis 0:a2929fa6e4f0 479
pnysten 6:540c5d907c90 480 static void prepareTxCoapFrame( void )
pnysten 6:540c5d907c90 481 {
pnysten 6:540c5d907c90 482 // Create Registration PDU :
pnysten 6:540c5d907c90 483
pnysten 6:540c5d907c90 484 CoapPDU *pdu = new CoapPDU();
pnysten 6:540c5d907c90 485
pnysten 6:540c5d907c90 486 pdu->setCode(CoapPDU::COAP_POST);
pnysten 6:540c5d907c90 487 pdu->setType(CoapPDU::COAP_CONFIRMABLE);
pnysten 6:540c5d907c90 488 int size;
pnysten 6:540c5d907c90 489 uint8_t * token = get_Token(&size);
pnysten 6:540c5d907c90 490 pdu->setToken(token,size);
pnysten 6:540c5d907c90 491 pdu->setMessageID(get_Message_ID());
pnysten 6:540c5d907c90 492 pdu->setURI(get_Registration_Query());
pnysten 6:540c5d907c90 493
pnysten 6:540c5d907c90 494 _payload=get_Registration_Payload(&_payload_size);
pnysten 6:540c5d907c90 495 pdu->setPayload(_payload, (int) _payload_size);
pnysten 6:540c5d907c90 496 int PDUlength = pdu->getPDULength();
pnysten 6:540c5d907c90 497
pnysten 6:540c5d907c90 498 // strncpy((char*) LMIC.frame, (const char*)pdu->getPDUPointer(), PDUlength);
pnysten 6:540c5d907c90 499 memcpy(LMIC.frame, pdu->getPDUPointer(), PDUlength * sizeof(uint8_t));
pnysten 6:540c5d907c90 500
pnysten 6:540c5d907c90 501 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
pnysten 6:540c5d907c90 502 LMIC.frame[PDUlength] = LMIC.seqnoDn >> 8;
pnysten 6:540c5d907c90 503 LMIC.frame[PDUlength+1] = LMIC.seqnoDn;
pnysten 6:540c5d907c90 504 LMIC.frame[PDUlength+2] = LMIC.rssi >> 8;
pnysten 6:540c5d907c90 505 LMIC.frame[PDUlength+3] = LMIC.rssi;
pnysten 6:540c5d907c90 506 LMIC.frame[PDUlength+4] = LMIC.snr;
pnysten 6:540c5d907c90 507 #endif
pnysten 6:540c5d907c90 508 debug_str("Frame to be sent: ");
pnysten 6:540c5d907c90 509 debug_buf(LMIC.frame, PDUlength + 5);
pnysten 6:540c5d907c90 510
pnysten 6:540c5d907c90 511 LoRaWAN_data_size = PDUlength + 5;
pnysten 6:540c5d907c90 512 }
pnysten 6:540c5d907c90 513
pnysten 8:8d9a49aaa323 514 static void prepareTxLoraFrame( void )
pnysten 8:8d9a49aaa323 515 {
pnysten 8:8d9a49aaa323 516 const char *frame = "LoRa";
pnysten 9:84a69ca4d35a 517 // const char *frame = "Test";
pnysten 8:8d9a49aaa323 518
pnysten 8:8d9a49aaa323 519 strncpy((char*) LMIC.frame, frame, strlen(frame));
pnysten 8:8d9a49aaa323 520
pnysten 8:8d9a49aaa323 521 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
pnysten 8:8d9a49aaa323 522 LMIC.frame[strlen(frame)] = LMIC.seqnoDn >> 8;
pnysten 8:8d9a49aaa323 523 LMIC.frame[strlen(frame)+1] = LMIC.seqnoDn;
pnysten 8:8d9a49aaa323 524 LMIC.frame[strlen(frame)+2] = LMIC.rssi >> 8;
pnysten 8:8d9a49aaa323 525 LMIC.frame[strlen(frame)+3] = LMIC.rssi;
pnysten 8:8d9a49aaa323 526 LMIC.frame[strlen(frame)+4] = LMIC.snr;
pnysten 8:8d9a49aaa323 527 #endif
pnysten 8:8d9a49aaa323 528 debug_str("Frame to be sent: ");
pnysten 9:84a69ca4d35a 529 // debug_buf(LMIC.frame, strlen(frame) + 5);
pnysten 9:84a69ca4d35a 530 debug_buf(LMIC.frame, strlen(frame));
pnysten 8:8d9a49aaa323 531
pnysten 9:84a69ca4d35a 532 // LoRaWAN_data_size = strlen(frame) + 5;
pnysten 9:84a69ca4d35a 533 LoRaWAN_data_size = strlen(frame);
pnysten 8:8d9a49aaa323 534 }
pnysten 8:8d9a49aaa323 535
pnysten 10:155dc60fce79 536 static void prepareTxSensorsFrame( void )
pnysten 10:155dc60fce79 537 {
pnysten 10:155dc60fce79 538 std::string frame = "";
pnysten 10:155dc60fce79 539 std::string tmp;
pnysten 10:155dc60fce79 540 debug_str("\r\n");
pnysten 10:155dc60fce79 541
pnysten 10:155dc60fce79 542 temp_sensor1->GetTemperature(&value1);
pnysten 10:155dc60fce79 543 humidity_sensor->GetHumidity(&value2);
pnysten 10:155dc60fce79 544 debug_str("HTS221: [temp] ");
pnysten 10:155dc60fce79 545 debug_str(printDouble(buffer1, value1));
pnysten 10:155dc60fce79 546 tmp = "0,";
pnysten 10:155dc60fce79 547 tmp += buffer1;
pnysten 10:155dc60fce79 548 tmp += ",";
pnysten 10:155dc60fce79 549
pnysten 10:155dc60fce79 550 if ((!temp_sent) && (frame.length() + tmp.length() < 50))
pnysten 10:155dc60fce79 551 {
pnysten 10:155dc60fce79 552 temp_sent = true;
pnysten 10:155dc60fce79 553 frame += tmp;
pnysten 10:155dc60fce79 554 }
pnysten 10:155dc60fce79 555
pnysten 10:155dc60fce79 556 debug_str("Celsius, [hum] ");
pnysten 10:155dc60fce79 557 debug_str(printDouble(buffer2, value2));
pnysten 10:155dc60fce79 558 tmp = "1,";
pnysten 10:155dc60fce79 559 tmp += buffer2;
pnysten 10:155dc60fce79 560 tmp += ",";
pnysten 10:155dc60fce79 561
pnysten 10:155dc60fce79 562 if ((!hum_sent) && (frame.length() + tmp.length() < 50))
pnysten 10:155dc60fce79 563 {
pnysten 10:155dc60fce79 564 hum_sent = true;
pnysten 10:155dc60fce79 565 frame += tmp;
pnysten 10:155dc60fce79 566 }
pnysten 10:155dc60fce79 567
pnysten 10:155dc60fce79 568 debug_str("%\r\n");
pnysten 10:155dc60fce79 569 //pc.printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 10:155dc60fce79 570
pnysten 10:155dc60fce79 571 temp_sensor2->GetFahrenheit(&value1);
pnysten 10:155dc60fce79 572 pressure_sensor->GetPressure(&value2);
pnysten 10:155dc60fce79 573 debug_str("LPS25H: [temp] ");
pnysten 10:155dc60fce79 574 debug_str(printDouble(buffer1, value1));
pnysten 10:155dc60fce79 575 debug_str("Farenheit, [press] ");
pnysten 10:155dc60fce79 576 debug_str(printDouble(buffer2, value2));
pnysten 10:155dc60fce79 577 tmp = "2,";
pnysten 10:155dc60fce79 578 tmp += buffer2;
pnysten 10:155dc60fce79 579 tmp += ",";
pnysten 10:155dc60fce79 580
pnysten 10:155dc60fce79 581 if ((!press_sent) && (frame.length() + tmp.length() < 50))
pnysten 10:155dc60fce79 582 {
pnysten 10:155dc60fce79 583 press_sent = true;
pnysten 10:155dc60fce79 584 frame += tmp;
pnysten 10:155dc60fce79 585 }
pnysten 10:155dc60fce79 586
pnysten 10:155dc60fce79 587 debug_str("mbar\r\n");
pnysten 10:155dc60fce79 588 //pc.printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2));
pnysten 10:155dc60fce79 589
pnysten 10:155dc60fce79 590 debug_str("---\r\n");
pnysten 10:155dc60fce79 591
pnysten 10:155dc60fce79 592 magnetometer->Get_M_Axes(axes);
pnysten 10:155dc60fce79 593 debug_str("LIS3MDL [mag/mgauss]: ");
pnysten 10:155dc60fce79 594 debug_str(printInt(buffer1, axes[0]));
pnysten 10:155dc60fce79 595 debug_str(", ");
pnysten 10:155dc60fce79 596 debug_str(printInt(buffer2, axes[1]));
pnysten 10:155dc60fce79 597 debug_str(", ");
pnysten 10:155dc60fce79 598 debug_str(printInt(buffer3, axes[2]));
pnysten 10:155dc60fce79 599 debug_str("\r\n");
pnysten 10:155dc60fce79 600 tmp = "3,";
pnysten 10:155dc60fce79 601 tmp += buffer1;
pnysten 10:155dc60fce79 602 tmp += ";";
pnysten 10:155dc60fce79 603 tmp += buffer2;
pnysten 10:155dc60fce79 604 tmp += ";";
pnysten 10:155dc60fce79 605 tmp += buffer3;
pnysten 10:155dc60fce79 606 tmp += ",";
pnysten 10:155dc60fce79 607
pnysten 10:155dc60fce79 608 if ((!magn_sent) && (frame.length() + tmp.length() < 50))
pnysten 10:155dc60fce79 609 {
pnysten 10:155dc60fce79 610 magn_sent = true;
pnysten 10:155dc60fce79 611 frame += tmp;
pnysten 10:155dc60fce79 612 }
pnysten 10:155dc60fce79 613
pnysten 10:155dc60fce79 614 //pc.printf("LIS3MDL [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 10:155dc60fce79 615
pnysten 10:155dc60fce79 616 accelerometer->Get_X_Axes(axes);
pnysten 10:155dc60fce79 617 debug_str("LSM6DS0 [acc/mg]: ");
pnysten 10:155dc60fce79 618 debug_str(printInt(buffer1, axes[0]));
pnysten 10:155dc60fce79 619 debug_str(", ");
pnysten 10:155dc60fce79 620 debug_str(printInt(buffer2, axes[1]));
pnysten 10:155dc60fce79 621 debug_str(", ");
pnysten 10:155dc60fce79 622 debug_str(printInt(buffer3, axes[2]));
pnysten 10:155dc60fce79 623 tmp = "4,";
pnysten 10:155dc60fce79 624 tmp += buffer1;
pnysten 10:155dc60fce79 625 tmp += ";";
pnysten 10:155dc60fce79 626 tmp += buffer2;
pnysten 10:155dc60fce79 627 tmp += ";";
pnysten 10:155dc60fce79 628 tmp += buffer3;
pnysten 10:155dc60fce79 629 tmp += ",";
pnysten 10:155dc60fce79 630
pnysten 10:155dc60fce79 631 if ((!motion_sent) && (frame.length() + tmp.length() < 50))
pnysten 10:155dc60fce79 632 {
pnysten 10:155dc60fce79 633 motion_sent = true;
pnysten 10:155dc60fce79 634 frame += tmp;
pnysten 10:155dc60fce79 635 }
pnysten 10:155dc60fce79 636
pnysten 10:155dc60fce79 637 debug_str("\r\n");
pnysten 10:155dc60fce79 638 //pc.printf("LSM6DS0 [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 10:155dc60fce79 639
pnysten 10:155dc60fce79 640 gyroscope->Get_G_Axes(axes);
pnysten 10:155dc60fce79 641 debug_str("LSM6DS0 [gyro/mdps]: ");
pnysten 10:155dc60fce79 642 debug_str(printInt(buffer1, axes[0]));
pnysten 10:155dc60fce79 643 debug_str(", ");
pnysten 10:155dc60fce79 644 debug_str(printInt(buffer2, axes[1]));
pnysten 10:155dc60fce79 645 debug_str(", ");
pnysten 10:155dc60fce79 646 debug_str(printInt(buffer3, axes[2]));
pnysten 10:155dc60fce79 647 tmp = "5,";
pnysten 10:155dc60fce79 648 tmp += buffer1;
pnysten 10:155dc60fce79 649 tmp += ";";
pnysten 10:155dc60fce79 650 tmp += buffer2;
pnysten 10:155dc60fce79 651 tmp += ";";
pnysten 10:155dc60fce79 652 tmp += buffer3;
pnysten 10:155dc60fce79 653
pnysten 10:155dc60fce79 654 if ((!gyro_sent) && (frame.length() + tmp.length() < 50))
pnysten 10:155dc60fce79 655 {
pnysten 10:155dc60fce79 656 gyro_sent = false;
pnysten 10:155dc60fce79 657 temp_sent = false;
pnysten 10:155dc60fce79 658 press_sent = false;
pnysten 10:155dc60fce79 659 motion_sent = false;
pnysten 10:155dc60fce79 660 magn_sent = false;
pnysten 11:59c160a8926d 661 hum_sent = false;
pnysten 10:155dc60fce79 662
pnysten 10:155dc60fce79 663 frame += tmp;
pnysten 10:155dc60fce79 664 }
pnysten 10:155dc60fce79 665
pnysten 10:155dc60fce79 666 debug_str("\r\n Frame: ");
pnysten 10:155dc60fce79 667 debug_str(frame.c_str());
pnysten 10:155dc60fce79 668 debug_str("\r\n");
pnysten 10:155dc60fce79 669 //pc.printf("LSM6DS0 [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
pnysten 10:155dc60fce79 670
pnysten 10:155dc60fce79 671 strncpy((char*) LMIC.frame, frame.c_str(), strlen(frame.c_str()));
pnysten 10:155dc60fce79 672
pnysten 10:155dc60fce79 673 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
pnysten 10:155dc60fce79 674 LMIC.frame[strlen(frame.c_str())] = LMIC.seqnoDn >> 8;
pnysten 10:155dc60fce79 675 LMIC.frame[strlen(frame.c_str())+1] = LMIC.seqnoDn;
pnysten 10:155dc60fce79 676 LMIC.frame[strlen(frame.c_str())+2] = LMIC.rssi >> 8;
pnysten 10:155dc60fce79 677 LMIC.frame[strlen(frame.c_str())+3] = LMIC.rssi;
pnysten 10:155dc60fce79 678 LMIC.frame[strlen(frame.c_str())+4] = LMIC.snr;
pnysten 10:155dc60fce79 679 #endif
pnysten 10:155dc60fce79 680 debug_str("Frame to be sent: ");
pnysten 10:155dc60fce79 681 // debug_buf(LMIC.frame, strlen(frame) + 5);
pnysten 10:155dc60fce79 682 debug_buf(LMIC.frame, strlen(frame.c_str()));
pnysten 10:155dc60fce79 683
pnysten 10:155dc60fce79 684 // LoRaWAN_data_size = strlen(frame) + 5;
pnysten 10:155dc60fce79 685 LoRaWAN_data_size = strlen(frame.c_str());
pnysten 10:155dc60fce79 686 }
pnysten 10:155dc60fce79 687
mluis 0:a2929fa6e4f0 688 static void prepareTxFrame( void )
mluis 0:a2929fa6e4f0 689 {
mluis 0:a2929fa6e4f0 690 LMIC.frame[0] = AppLedStateOn;
mluis 1:60184eda0066 691 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
mluis 1:60184eda0066 692 LMIC.frame[1] = LMIC.seqnoDn >> 8;
mluis 1:60184eda0066 693 LMIC.frame[2] = LMIC.seqnoDn;
mluis 1:60184eda0066 694 LMIC.frame[3] = LMIC.rssi >> 8;
mluis 1:60184eda0066 695 LMIC.frame[4] = LMIC.rssi;
mluis 1:60184eda0066 696 LMIC.frame[5] = LMIC.snr;
mluis 1:60184eda0066 697 #endif
pnysten 6:540c5d907c90 698 debug_str("Frame to be sent: ");
pnysten 6:540c5d907c90 699 debug_buf(LMIC.frame, LORAWAN_APP_DATA_SIZE);
pnysten 6:540c5d907c90 700
pnysten 6:540c5d907c90 701 LoRaWAN_data_size = LORAWAN_APP_DATA_SIZE;
mluis 0:a2929fa6e4f0 702 }
mluis 0:a2929fa6e4f0 703
mluis 0:a2929fa6e4f0 704 void processRxFrame( void )
mluis 0:a2929fa6e4f0 705 {
pnysten 8:8d9a49aaa323 706
pnysten 8:8d9a49aaa323 707 char* frameToDisplay = (char*) (LMIC.frame + LMIC.dataBeg);
pnysten 8:8d9a49aaa323 708 frameToDisplay[LMIC.dataLen] = '\0';
pnysten 4:5e274bf85bf0 709
mluis 0:a2929fa6e4f0 710 switch( LMIC.frame[LMIC.dataBeg - 1] ) // Check Rx port number
mluis 0:a2929fa6e4f0 711 {
pnysten 4:5e274bf85bf0 712 case 0:
pnysten 4:5e274bf85bf0 713 // debug_str("Port 0!!!\r\n");
pnysten 4:5e274bf85bf0 714 // debug_val("Data Len: ", LMIC.dataLen);
pnysten 4:5e274bf85bf0 715
mluis 0:a2929fa6e4f0 716 case 1: // The application LED can be controlled on port 1 or 2
pnysten 8:8d9a49aaa323 717 debug_str("Data received on port 1: ");
pnysten 8:8d9a49aaa323 718 debug_str("Data in hexa: ");
pnysten 8:8d9a49aaa323 719 debug_buf( LMIC.frame + LMIC.dataBeg, LMIC.dataLen );
pnysten 8:8d9a49aaa323 720 debug_str("Data in string: ");
pnysten 8:8d9a49aaa323 721
pnysten 8:8d9a49aaa323 722 debug_str( frameToDisplay );
pnysten 8:8d9a49aaa323 723 debug_str("\r\n");
pnysten 8:8d9a49aaa323 724
pnysten 8:8d9a49aaa323 725 break;
mluis 0:a2929fa6e4f0 726 case 2:
pnysten 8:8d9a49aaa323 727 debug_str("Data received on port 2: ");
pnysten 8:8d9a49aaa323 728 debug_str("Data in hexa: ");
pnysten 8:8d9a49aaa323 729 debug_buf( LMIC.frame + LMIC.dataBeg, LMIC.dataLen );
pnysten 8:8d9a49aaa323 730 debug_str("Data in string: ");
pnysten 8:8d9a49aaa323 731
pnysten 8:8d9a49aaa323 732 debug_str( frameToDisplay );
pnysten 8:8d9a49aaa323 733 debug_str("\r\n");
pnysten 8:8d9a49aaa323 734
mluis 0:a2929fa6e4f0 735 if( LMIC.dataLen == 1 )
mluis 0:a2929fa6e4f0 736 {
pnysten 4:5e274bf85bf0 737 debug_str("Data received on port 2: ");
pnysten 4:5e274bf85bf0 738 debug_hex(LMIC.frame[LMIC.dataBeg]);
pnysten 4:5e274bf85bf0 739 debug_str("\r\n");
mluis 0:a2929fa6e4f0 740 AppLedStateOn = LMIC.frame[LMIC.dataBeg] & 0x01;
pnysten 12:f28b629d8a6e 741 //debug_val( "LED3 = ", AppLedStateOn );
mluis 0:a2929fa6e4f0 742 }
mluis 0:a2929fa6e4f0 743 break;
mluis 0:a2929fa6e4f0 744 default:
mluis 0:a2929fa6e4f0 745 break;
mluis 0:a2929fa6e4f0 746 }
mluis 0:a2929fa6e4f0 747 }
mluis 0:a2929fa6e4f0 748
mluis 0:a2929fa6e4f0 749 static void onSendFrame( osjob_t* j )
mluis 0:a2929fa6e4f0 750 {
pnysten 6:540c5d907c90 751 //prepareTxFrame( );
pnysten 8:8d9a49aaa323 752 //prepareTxCoapFrame();
pnysten 10:155dc60fce79 753 prepareTxSensorsFrame();
pnysten 10:155dc60fce79 754 //prepareTxLoraFrame();
pnysten 4:5e274bf85bf0 755
pnysten 6:540c5d907c90 756 LMIC_setTxData2( LORAWAN_APP_PORT, LMIC.frame, LoRaWAN_data_size, LORAWAN_CONFIRMED_MSG_ON );
mluis 1:60184eda0066 757
mluis 1:60184eda0066 758 // Blink Tx LED
pnysten 12:f28b629d8a6e 759 //debug_val( "LED1 = ", 1 );
mluis 1:60184eda0066 760 os_setTimedCallback( &txLedJob, os_getTime( ) + ms2osticks( 25 ), onTxLed );
pnysten 12:f28b629d8a6e 761 /* os_setTimedCallback( &sendFrameJob,
pnysten 12:f28b629d8a6e 762 os_getTime( ) + ms2osticks( APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND ) ),
pnysten 12:f28b629d8a6e 763 onSendFrame );*/
mluis 0:a2929fa6e4f0 764 }
mluis 0:a2929fa6e4f0 765
mluis 1:60184eda0066 766 // Initialization job
mluis 1:60184eda0066 767 static void onInit( osjob_t* j )
mluis 1:60184eda0066 768 {
pnysten 10:155dc60fce79 769 debug_str("--- Starting new run ---\r\n");
pnysten 10:155dc60fce79 770
pnysten 10:155dc60fce79 771 humidity_sensor->ReadID(&id);
pnysten 10:155dc60fce79 772 debug_str("HTS221 humidity & temperature = ");
pnysten 10:155dc60fce79 773 debug_uint(id);
pnysten 10:155dc60fce79 774 debug_str("\r\n");
pnysten 10:155dc60fce79 775 pressure_sensor->ReadID(&id);
pnysten 10:155dc60fce79 776 debug_str("LPS25H pressure & temperature = ");
pnysten 10:155dc60fce79 777 debug_uint(id);
pnysten 10:155dc60fce79 778 debug_str("\r\n");
pnysten 10:155dc60fce79 779 magnetometer->ReadID(&id);
pnysten 10:155dc60fce79 780 debug_str("LIS3MDL magnetometer = ");
pnysten 10:155dc60fce79 781 debug_uint(id);
pnysten 10:155dc60fce79 782 debug_str("\r\n");
pnysten 10:155dc60fce79 783 gyroscope->ReadID(&id);
pnysten 10:155dc60fce79 784 debug_str("LSM6DS0 accelerometer & gyroscope = ");
pnysten 10:155dc60fce79 785 debug_uint(id);
pnysten 10:155dc60fce79 786 debug_str("\r\n");
pnysten 10:155dc60fce79 787
mluis 1:60184eda0066 788 // reset MAC state
mluis 1:60184eda0066 789 LMIC_reset( );
mluis 1:60184eda0066 790 LMIC_setAdrMode( LORAWAN_ADR_ON );
mluis 1:60184eda0066 791 LMIC_setDrTxpow( DR_SF12, 14 );
mluis 1:60184eda0066 792
mluis 1:60184eda0066 793 // start joining
mluis 1:60184eda0066 794 #if( OVER_THE_AIR_ACTIVATION != 0 )
mluis 1:60184eda0066 795 LMIC_startJoining( );
mluis 1:60184eda0066 796 #else
mluis 1:60184eda0066 797 LMIC_setSession( LORAWAN_NET_ID, LORAWAN_DEV_ADDR, NwkSKey, ArtSKey );
mluis 1:60184eda0066 798 onSendFrame( NULL );
mluis 1:60184eda0066 799 #endif
mluis 1:60184eda0066 800 // init done - onEvent( ) callback will be invoked...
mluis 1:60184eda0066 801 }
mluis 1:60184eda0066 802
mluis 1:60184eda0066 803 int main( void )
mluis 0:a2929fa6e4f0 804 {
pnysten 4:5e274bf85bf0 805 debug_init();
mluis 0:a2929fa6e4f0 806 osjob_t initjob;
pnysten 6:540c5d907c90 807
mluis 0:a2929fa6e4f0 808 // initialize runtime env
mluis 0:a2929fa6e4f0 809 os_init( );
mluis 0:a2929fa6e4f0 810 // setup initial job
mluis 0:a2929fa6e4f0 811 os_setCallback( &initjob, onInit );
mluis 0:a2929fa6e4f0 812 // execute scheduled jobs and events
pnysten 10:155dc60fce79 813
pnysten 10:155dc60fce79 814 //static Thread exec_thread(exec_call_thread);
pnysten 10:155dc60fce79 815
mluis 0:a2929fa6e4f0 816 os_runloop( );
mluis 0:a2929fa6e4f0 817 // (not reached)
mluis 0:a2929fa6e4f0 818 }
mluis 0:a2929fa6e4f0 819
mluis 0:a2929fa6e4f0 820 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 821 // LMIC EVENT CALLBACK
mluis 0:a2929fa6e4f0 822 //////////////////////////////////////////////////
mluis 0:a2929fa6e4f0 823 void onEvent( ev_t ev )
mluis 0:a2929fa6e4f0 824 {
mluis 0:a2929fa6e4f0 825 bool txOn = false;
mluis 1:60184eda0066 826 debug_event( ev );
mluis 0:a2929fa6e4f0 827
mluis 0:a2929fa6e4f0 828 switch( ev )
mluis 0:a2929fa6e4f0 829 {
mluis 0:a2929fa6e4f0 830 // network joined, session established
mluis 0:a2929fa6e4f0 831 case EV_JOINED:
mluis 1:60184eda0066 832 debug_val( "Net ID = ", LMIC.netid );
mluis 0:a2929fa6e4f0 833 txOn = true;
mluis 0:a2929fa6e4f0 834 break;
mluis 0:a2929fa6e4f0 835 // scheduled data sent (optionally data received)
mluis 0:a2929fa6e4f0 836 case EV_TXCOMPLETE:
mluis 1:60184eda0066 837 debug_val( "Datarate = ", LMIC.datarate );
mluis 0:a2929fa6e4f0 838 // Check if we have a downlink on either Rx1 or Rx2 windows
mluis 1:60184eda0066 839 if( ( LMIC.txrxFlags & ( TXRX_DNW1 | TXRX_DNW2 ) ) != 0 )
mluis 0:a2929fa6e4f0 840 {
pnysten 12:f28b629d8a6e 841 // debug_val( "LED2 = ", 1 );
mluis 1:60184eda0066 842 os_setTimedCallback( &rxLedJob, os_getTime( ) + ms2osticks( 25 ), onRxLed );
mluis 0:a2929fa6e4f0 843
mluis 1:60184eda0066 844 if( LMIC.dataLen != 0 )
mluis 0:a2929fa6e4f0 845 { // data received in rx slot after tx
pnysten 4:5e274bf85bf0 846 //debug_buf( LMIC.frame + LMIC.dataBeg, LMIC.dataLen );
mluis 0:a2929fa6e4f0 847 processRxFrame( );
mluis 0:a2929fa6e4f0 848 }
mluis 0:a2929fa6e4f0 849 }
mluis 0:a2929fa6e4f0 850 txOn = true;
mluis 0:a2929fa6e4f0 851 break;
mluis 0:a2929fa6e4f0 852 default:
mluis 0:a2929fa6e4f0 853 break;
mluis 0:a2929fa6e4f0 854 }
mluis 0:a2929fa6e4f0 855 if( txOn == true )
mluis 0:a2929fa6e4f0 856 {
mluis 1:60184eda0066 857 //Sends frame every APP_TX_DUTYCYCLE +/- APP_TX_DUTYCYCLE_RND random time (if not duty cycle limited)
mluis 1:60184eda0066 858 os_setTimedCallback( &sendFrameJob,
mluis 1:60184eda0066 859 os_getTime( ) + ms2osticks( APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND ) ),
mluis 1:60184eda0066 860 onSendFrame );
pnysten 12:f28b629d8a6e 861 //os_setCallback( &sendFrameJob, onSendFrame );
mluis 1:60184eda0066 862 ////Sends frame as soon as possible (duty cylce limitations)
mluis 1:60184eda0066 863 //onSendFrame( NULL );
mluis 0:a2929fa6e4f0 864 }
mluis 0:a2929fa6e4f0 865 }
pnysten 10:155dc60fce79 866
pnysten 10:155dc60fce79 867