LR-test3 version sending uplinks every 10 secs

Dependencies:   LMiC-10secs SX1276Lib X_NUCLEO_IKS01A1 cantcoap lwip mbed-rtos mbed

Fork of LoRaWAN-lmic-app by Alcatel-Lucent IoT Development

Committer:
pnysten
Date:
Tue Feb 23 08:43:37 2016 +0000
Revision:
13:9de42df1d3d8
Parent:
12:f28b629d8a6e
LR-test3 version sending uplinks every 10 secs

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