LoRaWAN_FAE_Training

Dependencies:   X_NUCLEO_IKS01A2

Committer:
SemBen
Date:
Tue Mar 12 17:18:08 2019 +0000
Revision:
48:b02d43b5e90c
Parent:
45:96fe99f19cd0
Child:
49:2453a6404fbe
Code fully fonctionnal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:7037ed05f54f 1 /**
mbed_official 0:7037ed05f54f 2 * Copyright (c) 2017, Arm Limited and affiliates.
mbed_official 0:7037ed05f54f 3 * SPDX-License-Identifier: Apache-2.0
mbed_official 0:7037ed05f54f 4 *
mbed_official 0:7037ed05f54f 5 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:7037ed05f54f 6 * you may not use this file except in compliance with the License.
mbed_official 0:7037ed05f54f 7 * You may obtain a copy of the License at
mbed_official 0:7037ed05f54f 8 *
mbed_official 0:7037ed05f54f 9 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:7037ed05f54f 10 *
mbed_official 0:7037ed05f54f 11 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:7037ed05f54f 12 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:7037ed05f54f 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:7037ed05f54f 14 * See the License for the specific language governing permissions and
mbed_official 0:7037ed05f54f 15 * limitations under the License.
mbed_official 0:7037ed05f54f 16 */
mbed_official 0:7037ed05f54f 17 #include <stdio.h>
mbed_official 3:8c7198d1a2a1 18
mbed_official 0:7037ed05f54f 19 #include "lorawan/LoRaWANInterface.h"
mbed_official 0:7037ed05f54f 20 #include "lorawan/system/lorawan_data_structures.h"
mbed_official 0:7037ed05f54f 21 #include "events/EventQueue.h"
mbed_official 0:7037ed05f54f 22
mbed_official 0:7037ed05f54f 23 // Application helpers
mbed_official 0:7037ed05f54f 24 #include "DummySensor.h"
mbed_official 0:7037ed05f54f 25 #include "trace_helper.h"
mbed_official 0:7037ed05f54f 26 #include "lora_radio_helper.h"
mbed_official 0:7037ed05f54f 27
SemBen 48:b02d43b5e90c 28 // sensor boards IKS01A2
SemBen 48:b02d43b5e90c 29 #include "XNucleoIKS01A2.h"
SemBen 48:b02d43b5e90c 30
SemBen 48:b02d43b5e90c 31
SemBen 48:b02d43b5e90c 32 /* Instantiate the expansion board */
SemBen 48:b02d43b5e90c 33 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
SemBen 45:96fe99f19cd0 34
SemBen 48:b02d43b5e90c 35 /* Retrieve the composing elements of the expansion board */
SemBen 48:b02d43b5e90c 36 static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
SemBen 48:b02d43b5e90c 37 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
SemBen 48:b02d43b5e90c 38 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
SemBen 48:b02d43b5e90c 39 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
SemBen 48:b02d43b5e90c 40 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
SemBen 45:96fe99f19cd0 41
mbed_official 0:7037ed05f54f 42 using namespace events;
mbed_official 0:7037ed05f54f 43
mbed_official 12:5015dfead3f2 44 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
mbed_official 12:5015dfead3f2 45 // This example only communicates with much shorter messages (<30 bytes).
mbed_official 12:5015dfead3f2 46 // If longer messages are used, these buffers must be changed accordingly.
mbed_official 12:5015dfead3f2 47 uint8_t tx_buffer[30];
mbed_official 12:5015dfead3f2 48 uint8_t rx_buffer[30];
mbed_official 0:7037ed05f54f 49
mbed_official 0:7037ed05f54f 50 /*
mbed_official 0:7037ed05f54f 51 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
mbed_official 0:7037ed05f54f 52 */
mbed_official 0:7037ed05f54f 53 #define TX_TIMER 10000
mbed_official 0:7037ed05f54f 54
mbed_official 0:7037ed05f54f 55 /**
mbed_official 0:7037ed05f54f 56 * Maximum number of events for the event queue.
mbed_official 12:5015dfead3f2 57 * 10 is the safe number for the stack events, however, if application
mbed_official 0:7037ed05f54f 58 * also uses the queue for whatever purposes, this number should be increased.
mbed_official 0:7037ed05f54f 59 */
mbed_official 12:5015dfead3f2 60 #define MAX_NUMBER_OF_EVENTS 10
mbed_official 0:7037ed05f54f 61
mbed_official 0:7037ed05f54f 62 /**
mbed_official 0:7037ed05f54f 63 * Maximum number of retries for CONFIRMED messages before giving up
mbed_official 0:7037ed05f54f 64 */
mbed_official 0:7037ed05f54f 65 #define CONFIRMED_MSG_RETRY_COUNTER 3
mbed_official 0:7037ed05f54f 66
mbed_official 0:7037ed05f54f 67 /**
mbed_official 0:7037ed05f54f 68 * Dummy pin for dummy sensor
mbed_official 0:7037ed05f54f 69 */
mbed_official 0:7037ed05f54f 70 #define PC_9 0
mbed_official 0:7037ed05f54f 71
mbed_official 0:7037ed05f54f 72 /**
mbed_official 0:7037ed05f54f 73 * Dummy sensor class object
mbed_official 0:7037ed05f54f 74 */
mbed_official 0:7037ed05f54f 75 DS1820 ds1820(PC_9);
mbed_official 0:7037ed05f54f 76
mbed_official 0:7037ed05f54f 77 /**
mbed_official 0:7037ed05f54f 78 * This event queue is the global event queue for both the
mbed_official 0:7037ed05f54f 79 * application and stack. To conserve memory, the stack is designed to run
mbed_official 0:7037ed05f54f 80 * in the same thread as the application and the application is responsible for
mbed_official 0:7037ed05f54f 81 * providing an event queue to the stack that will be used for ISR deferment as
mbed_official 0:7037ed05f54f 82 * well as application information event queuing.
mbed_official 0:7037ed05f54f 83 */
mbed_official 0:7037ed05f54f 84 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS * EVENTS_EVENT_SIZE);
mbed_official 0:7037ed05f54f 85
mbed_official 0:7037ed05f54f 86 /**
mbed_official 0:7037ed05f54f 87 * Event handler.
mbed_official 0:7037ed05f54f 88 *
mbed_official 0:7037ed05f54f 89 * This will be passed to the LoRaWAN stack to queue events for the
mbed_official 0:7037ed05f54f 90 * application which in turn drive the application.
mbed_official 0:7037ed05f54f 91 */
mbed_official 0:7037ed05f54f 92 static void lora_event_handler(lorawan_event_t event);
mbed_official 0:7037ed05f54f 93
mbed_official 0:7037ed05f54f 94 /**
mbed_official 2:dc95ac6d6d4e 95 * Constructing Mbed LoRaWANInterface and passing it down the radio object.
mbed_official 0:7037ed05f54f 96 */
mbed_official 2:dc95ac6d6d4e 97 static LoRaWANInterface lorawan(radio);
mbed_official 0:7037ed05f54f 98
mbed_official 0:7037ed05f54f 99 /**
mbed_official 0:7037ed05f54f 100 * Application specific callbacks
mbed_official 0:7037ed05f54f 101 */
mbed_official 0:7037ed05f54f 102 static lorawan_app_callbacks_t callbacks;
mbed_official 0:7037ed05f54f 103
mbed_official 0:7037ed05f54f 104 /**
mbed_official 0:7037ed05f54f 105 * Entry point for application
mbed_official 0:7037ed05f54f 106 */
mbed_official 0:7037ed05f54f 107 int main (void)
mbed_official 0:7037ed05f54f 108 {
SemBen 48:b02d43b5e90c 109 uint8_t id;
SemBen 48:b02d43b5e90c 110
mbed_official 0:7037ed05f54f 111 // setup tracing
mbed_official 0:7037ed05f54f 112 setup_trace();
SemBen 48:b02d43b5e90c 113
SemBen 48:b02d43b5e90c 114 // Init IKS01A2 Board
SemBen 48:b02d43b5e90c 115 printf("\r\n--- IKS01A2 conf start ---\r\n");
SemBen 48:b02d43b5e90c 116
SemBen 48:b02d43b5e90c 117 /* Enable all sensors */
SemBen 48:b02d43b5e90c 118 hum_temp->enable();
SemBen 48:b02d43b5e90c 119 press_temp->enable();
SemBen 48:b02d43b5e90c 120 magnetometer->enable();
SemBen 48:b02d43b5e90c 121 accelerometer->enable();
SemBen 48:b02d43b5e90c 122 acc_gyro->enable_x();
SemBen 48:b02d43b5e90c 123 acc_gyro->enable_g();
mbed_official 0:7037ed05f54f 124
SemBen 48:b02d43b5e90c 125 hum_temp->read_id(&id);
SemBen 48:b02d43b5e90c 126 printf("HTS221 humidity & temperature = 0x%X\r\n", id);
SemBen 48:b02d43b5e90c 127 press_temp->read_id(&id);
SemBen 48:b02d43b5e90c 128 printf("LPS22HB pressure & temperature = 0x%X\r\n", id);
SemBen 48:b02d43b5e90c 129 magnetometer->read_id(&id);
SemBen 48:b02d43b5e90c 130 printf("LSM303AGR magnetometer = 0x%X\r\n", id);
SemBen 48:b02d43b5e90c 131 accelerometer->read_id(&id);
SemBen 48:b02d43b5e90c 132 printf("LSM303AGR accelerometer = 0x%X\r\n", id);
SemBen 48:b02d43b5e90c 133 acc_gyro->read_id(&id);
SemBen 48:b02d43b5e90c 134 printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
SemBen 48:b02d43b5e90c 135
mbed_official 0:7037ed05f54f 136 // stores the status of a call to LoRaWAN protocol
mbed_official 0:7037ed05f54f 137 lorawan_status_t retcode;
mbed_official 0:7037ed05f54f 138
mbed_official 0:7037ed05f54f 139 // Initialize LoRaWAN stack
mbed_official 2:dc95ac6d6d4e 140 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 141 printf("\r\n LoRa initialization failed! \r\n");
mbed_official 0:7037ed05f54f 142 return -1;
mbed_official 0:7037ed05f54f 143 }
mbed_official 0:7037ed05f54f 144
mbed_official 0:7037ed05f54f 145 printf("\r\n Mbed LoRaWANStack initialized \r\n");
mbed_official 0:7037ed05f54f 146
mbed_official 0:7037ed05f54f 147 // prepare application callbacks
mbed_official 0:7037ed05f54f 148 callbacks.events = mbed::callback(lora_event_handler);
mbed_official 2:dc95ac6d6d4e 149 lorawan.add_app_callbacks(&callbacks);
mbed_official 0:7037ed05f54f 150
mbed_official 0:7037ed05f54f 151 // Set number of retries in case of CONFIRMED messages
mbed_official 2:dc95ac6d6d4e 152 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER)
mbed_official 0:7037ed05f54f 153 != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 154 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
mbed_official 0:7037ed05f54f 155 return -1;
mbed_official 0:7037ed05f54f 156 }
mbed_official 0:7037ed05f54f 157
mbed_official 0:7037ed05f54f 158 printf("\r\n CONFIRMED message retries : %d \r\n",
mbed_official 0:7037ed05f54f 159 CONFIRMED_MSG_RETRY_COUNTER);
mbed_official 0:7037ed05f54f 160
mbed_official 0:7037ed05f54f 161 // Enable adaptive data rate
mbed_official 2:dc95ac6d6d4e 162 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) {
mbed_official 0:7037ed05f54f 163 printf("\r\n enable_adaptive_datarate failed! \r\n");
mbed_official 0:7037ed05f54f 164 return -1;
mbed_official 0:7037ed05f54f 165 }
mbed_official 0:7037ed05f54f 166
mbed_official 0:7037ed05f54f 167 printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
mbed_official 0:7037ed05f54f 168
mbed_official 2:dc95ac6d6d4e 169 retcode = lorawan.connect();
mbed_official 0:7037ed05f54f 170
mbed_official 0:7037ed05f54f 171 if (retcode == LORAWAN_STATUS_OK ||
mbed_official 0:7037ed05f54f 172 retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
mbed_official 0:7037ed05f54f 173 } else {
mbed_official 0:7037ed05f54f 174 printf("\r\n Connection error, code = %d \r\n", retcode);
mbed_official 0:7037ed05f54f 175 return -1;
mbed_official 0:7037ed05f54f 176 }
mbed_official 0:7037ed05f54f 177
mbed_official 0:7037ed05f54f 178 printf("\r\n Connection - In Progress ...\r\n");
mbed_official 0:7037ed05f54f 179
mbed_official 0:7037ed05f54f 180 // make your event queue dispatching events forever
mbed_official 0:7037ed05f54f 181 ev_queue.dispatch_forever();
mbed_official 3:8c7198d1a2a1 182
mbed_official 3:8c7198d1a2a1 183 return 0;
mbed_official 0:7037ed05f54f 184 }
mbed_official 0:7037ed05f54f 185
mbed_official 0:7037ed05f54f 186 /**
mbed_official 0:7037ed05f54f 187 * Sends a message to the Network Server
mbed_official 0:7037ed05f54f 188 */
mbed_official 0:7037ed05f54f 189 static void send_message()
mbed_official 0:7037ed05f54f 190 {
SemBen 48:b02d43b5e90c 191 uint16_t packet_len, Temperature, Index=1;
SemBen 48:b02d43b5e90c 192 uint32_t Pressure, Humidity;
mbed_official 0:7037ed05f54f 193 int16_t retcode;
mbed_official 0:7037ed05f54f 194 float sensor_value;
SemBen 48:b02d43b5e90c 195
SemBen 48:b02d43b5e90c 196 float value1, value2;
SemBen 48:b02d43b5e90c 197 char buffer1[32], buffer2[32];
SemBen 48:b02d43b5e90c 198 int32_t axes[3];
mbed_official 0:7037ed05f54f 199
SemBen 48:b02d43b5e90c 200 // if (ds1820.begin()) {
SemBen 48:b02d43b5e90c 201 // ds1820.startConversion();
SemBen 48:b02d43b5e90c 202 // sensor_value = ds1820.read();
SemBen 48:b02d43b5e90c 203 // printf("\r\n Dummy Sensor Value = %3.1f \r\n", sensor_value);
SemBen 48:b02d43b5e90c 204 // ds1820.startConversion();
SemBen 48:b02d43b5e90c 205 // } else {
SemBen 48:b02d43b5e90c 206 // printf("\r\n No sensor found \r\n");
SemBen 48:b02d43b5e90c 207 // return;
SemBen 48:b02d43b5e90c 208 // }
SemBen 48:b02d43b5e90c 209
SemBen 48:b02d43b5e90c 210 // packet_len = sprintf((char*) tx_buffer, "Dummy Sensor Value is %3.1f",
SemBen 48:b02d43b5e90c 211 // sensor_value);
SemBen 48:b02d43b5e90c 212
SemBen 48:b02d43b5e90c 213 hum_temp->get_temperature(&value1);
SemBen 48:b02d43b5e90c 214 hum_temp->get_humidity(&value2);
SemBen 48:b02d43b5e90c 215 printf("HTS221: [temp] %2.2f C, [hum] %2.2f \r\n", value1, value2);
SemBen 48:b02d43b5e90c 216 Humidity = value2 * 100;
mbed_official 0:7037ed05f54f 217
SemBen 48:b02d43b5e90c 218 /*Add Humidity*/
SemBen 48:b02d43b5e90c 219 tx_buffer[0]+=1; // Add 1 Nbelment
SemBen 48:b02d43b5e90c 220 tx_buffer[Index]=0x03; // Humidity
SemBen 48:b02d43b5e90c 221 tx_buffer[Index+1]=0x03; // Len
SemBen 48:b02d43b5e90c 222 tx_buffer[Index+2]=(uint8_t)(Humidity & 0xFF); // Press LSB
SemBen 48:b02d43b5e90c 223 tx_buffer[Index+3]=(uint8_t)((Humidity >> 8) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 224 tx_buffer[Index+4]=(uint8_t)((Humidity >> 16) & 0xFF); // Press MSB
SemBen 48:b02d43b5e90c 225 Index+=5;
SemBen 48:b02d43b5e90c 226
SemBen 48:b02d43b5e90c 227 press_temp->get_temperature(&value1);
SemBen 48:b02d43b5e90c 228 press_temp->get_pressure(&value2);
SemBen 48:b02d43b5e90c 229 printf("LPS22HB: [temp] %2.2f C, [press] %4.2f mbar\r\n", value1, value2);
SemBen 48:b02d43b5e90c 230
SemBen 48:b02d43b5e90c 231
SemBen 48:b02d43b5e90c 232 Temperature = value1 * 100; // Convert for transmit
SemBen 48:b02d43b5e90c 233 Pressure = value2 * 100; // Convert for transmit
SemBen 48:b02d43b5e90c 234
SemBen 48:b02d43b5e90c 235 /*Add Tempertaure*/
SemBen 48:b02d43b5e90c 236 tx_buffer[0]+=1; // Add 1 Nbelment
SemBen 48:b02d43b5e90c 237 tx_buffer[Index]=0x01; // Temperature
SemBen 48:b02d43b5e90c 238 tx_buffer[Index+1]=0x02; // Len
SemBen 48:b02d43b5e90c 239 tx_buffer[Index+2]=(uint8_t)(Temperature & 0xFF); // Temp LSB
SemBen 48:b02d43b5e90c 240 tx_buffer[Index+3]=(uint8_t)((Temperature >> 8) & 0xFF); // Temp MSB
SemBen 48:b02d43b5e90c 241 Index+=4; // Update the Index
SemBen 45:96fe99f19cd0 242
SemBen 48:b02d43b5e90c 243 /*Add Pressure*/
SemBen 48:b02d43b5e90c 244 tx_buffer[0]+=1;
SemBen 48:b02d43b5e90c 245 tx_buffer[Index]=0x02; // Pressure
SemBen 48:b02d43b5e90c 246 tx_buffer[Index+1]=0x03; // Len
SemBen 48:b02d43b5e90c 247 tx_buffer[Index+2]=(uint8_t)(Pressure & 0xFF); // Press LSB
SemBen 48:b02d43b5e90c 248 tx_buffer[Index+3]=(uint8_t)((Pressure >> 8) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 249 tx_buffer[Index+4]=(uint8_t)((Pressure >> 16) & 0xFF); // Press MSB
SemBen 48:b02d43b5e90c 250 Index+=5;
SemBen 48:b02d43b5e90c 251
SemBen 48:b02d43b5e90c 252 printf("---\r\n");
SemBen 48:b02d43b5e90c 253
SemBen 48:b02d43b5e90c 254 // magnetometer->get_m_axes(axes);
SemBen 48:b02d43b5e90c 255 // printf("LSM303AGR [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 48:b02d43b5e90c 256 //
SemBen 48:b02d43b5e90c 257 accelerometer->get_x_axes(axes);
SemBen 48:b02d43b5e90c 258 printf("LSM303AGR [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 48:b02d43b5e90c 259
SemBen 48:b02d43b5e90c 260 /*Add Accelerometer*/
SemBen 48:b02d43b5e90c 261 tx_buffer[0]+=1;
SemBen 48:b02d43b5e90c 262 tx_buffer[Index]=0x04; // Accelerometer
SemBen 48:b02d43b5e90c 263 tx_buffer[Index+1]=0x03; // Len
SemBen 48:b02d43b5e90c 264 /* x */
SemBen 48:b02d43b5e90c 265 tx_buffer[Index+2]=(uint8_t)(axes[0] & 0xFF); // Press LSB
SemBen 48:b02d43b5e90c 266 tx_buffer[Index+3]=(uint8_t)((axes[0] >> 8) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 267 tx_buffer[Index+4]=(uint8_t)((axes[0] >> 16) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 268 tx_buffer[Index+5]=(uint8_t)((axes[0] >> 24) & 0xFF); // Press MSB
SemBen 48:b02d43b5e90c 269
SemBen 48:b02d43b5e90c 270 /* y */
SemBen 48:b02d43b5e90c 271 tx_buffer[Index+6]=(uint8_t)(axes[1] & 0xFF); // Press LSB
SemBen 48:b02d43b5e90c 272 tx_buffer[Index+7]=(uint8_t)((axes[1] >> 8) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 273 tx_buffer[Index+8]=(uint8_t)((axes[1] >> 16) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 274 tx_buffer[Index+9]=(uint8_t)((axes[1] >> 24) & 0xFF); // Press MSB
SemBen 48:b02d43b5e90c 275
SemBen 48:b02d43b5e90c 276 /* z */
SemBen 48:b02d43b5e90c 277 tx_buffer[Index+10]=(uint8_t)(axes[2] & 0xFF); // Press LSB
SemBen 48:b02d43b5e90c 278 tx_buffer[Index+11]=(uint8_t)((axes[2] >> 8) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 279 tx_buffer[Index+12]=(uint8_t)((axes[2] >> 16) & 0xFF); // Press MID
SemBen 48:b02d43b5e90c 280 tx_buffer[Index+13]=(uint8_t)((axes[2] >> 24) & 0xFF); // Press MSB
SemBen 48:b02d43b5e90c 281 Index+=14;
SemBen 48:b02d43b5e90c 282 //
SemBen 48:b02d43b5e90c 283 // acc_gyro->get_x_axes(axes);
SemBen 48:b02d43b5e90c 284 // printf("LSM6DSL [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 48:b02d43b5e90c 285 //
SemBen 48:b02d43b5e90c 286 // acc_gyro->get_g_axes(axes);
SemBen 48:b02d43b5e90c 287 // printf("LSM6DSL [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 48:b02d43b5e90c 288
SemBen 48:b02d43b5e90c 289 packet_len = Index + 1; // Compute the final payload size
mbed_official 0:7037ed05f54f 290
mbed_official 2:dc95ac6d6d4e 291 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len,
SemBen 45:96fe99f19cd0 292 MSG_UNCONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 293
mbed_official 0:7037ed05f54f 294 if (retcode < 0) {
mbed_official 0:7037ed05f54f 295 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n")
mbed_official 0:7037ed05f54f 296 : printf("\r\n send() - Error code %d \r\n", retcode);
mbed_official 26:f07f5febf97f 297
mbed_official 26:f07f5febf97f 298 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
mbed_official 26:f07f5febf97f 299 //retry in 3 seconds
mbed_official 26:f07f5febf97f 300 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 301 ev_queue.call_in(3000, send_message);
mbed_official 26:f07f5febf97f 302 }
mbed_official 26:f07f5febf97f 303 }
mbed_official 0:7037ed05f54f 304 return;
mbed_official 0:7037ed05f54f 305 }
mbed_official 0:7037ed05f54f 306
mbed_official 0:7037ed05f54f 307 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
mbed_official 12:5015dfead3f2 308 memset(tx_buffer, 0, sizeof(tx_buffer));
mbed_official 0:7037ed05f54f 309 }
mbed_official 0:7037ed05f54f 310
mbed_official 0:7037ed05f54f 311 /**
mbed_official 0:7037ed05f54f 312 * Receive a message from the Network Server
mbed_official 0:7037ed05f54f 313 */
mbed_official 0:7037ed05f54f 314 static void receive_message()
mbed_official 0:7037ed05f54f 315 {
mbed_official 0:7037ed05f54f 316 int16_t retcode;
mbed_official 2:dc95ac6d6d4e 317 retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer,
mbed_official 12:5015dfead3f2 318 sizeof(rx_buffer),
mbed_official 0:7037ed05f54f 319 MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 320
mbed_official 0:7037ed05f54f 321 if (retcode < 0) {
mbed_official 0:7037ed05f54f 322 printf("\r\n receive() - Error code %d \r\n", retcode);
mbed_official 0:7037ed05f54f 323 return;
mbed_official 0:7037ed05f54f 324 }
mbed_official 0:7037ed05f54f 325
mbed_official 0:7037ed05f54f 326 printf(" Data:");
mbed_official 0:7037ed05f54f 327
mbed_official 0:7037ed05f54f 328 for (uint8_t i = 0; i < retcode; i++) {
mbed_official 0:7037ed05f54f 329 printf("%x", rx_buffer[i]);
mbed_official 0:7037ed05f54f 330 }
mbed_official 0:7037ed05f54f 331
mbed_official 0:7037ed05f54f 332 printf("\r\n Data Length: %d\r\n", retcode);
SemBen 48:b02d43b5e90c 333
SemBen 48:b02d43b5e90c 334 if(rx_buffer[0] & 0x01 == 1)
SemBen 48:b02d43b5e90c 335 {
SemBen 48:b02d43b5e90c 336 printf("\r\n Board is in Wrong side !!!!! \r\n\r\n");
SemBen 48:b02d43b5e90c 337 }
SemBen 48:b02d43b5e90c 338 if(((rx_buffer[0] & 0x02) >> 1) == 1)
SemBen 48:b02d43b5e90c 339 {
SemBen 48:b02d43b5e90c 340 printf("\r\n It's hot here !!!!! \r\n\r\n");
SemBen 48:b02d43b5e90c 341 }
SemBen 48:b02d43b5e90c 342 if(((rx_buffer[0] & 0x04) >> 2) == 1)
SemBen 48:b02d43b5e90c 343 {
SemBen 48:b02d43b5e90c 344 printf("\r\n It's humid here !!!!! \r\n\r\n");
SemBen 48:b02d43b5e90c 345 }
mbed_official 0:7037ed05f54f 346
mbed_official 12:5015dfead3f2 347 memset(rx_buffer, 0, sizeof(rx_buffer));
mbed_official 0:7037ed05f54f 348 }
mbed_official 0:7037ed05f54f 349
mbed_official 0:7037ed05f54f 350 /**
mbed_official 0:7037ed05f54f 351 * Event handler
mbed_official 0:7037ed05f54f 352 */
mbed_official 0:7037ed05f54f 353 static void lora_event_handler(lorawan_event_t event)
mbed_official 0:7037ed05f54f 354 {
mbed_official 0:7037ed05f54f 355 switch (event) {
mbed_official 0:7037ed05f54f 356 case CONNECTED:
mbed_official 0:7037ed05f54f 357 printf("\r\n Connection - Successful \r\n");
mbed_official 0:7037ed05f54f 358 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 359 send_message();
mbed_official 0:7037ed05f54f 360 } else {
mbed_official 0:7037ed05f54f 361 ev_queue.call_every(TX_TIMER, send_message);
mbed_official 0:7037ed05f54f 362 }
mbed_official 0:7037ed05f54f 363
mbed_official 0:7037ed05f54f 364 break;
mbed_official 0:7037ed05f54f 365 case DISCONNECTED:
mbed_official 0:7037ed05f54f 366 ev_queue.break_dispatch();
mbed_official 0:7037ed05f54f 367 printf("\r\n Disconnected Successfully \r\n");
mbed_official 0:7037ed05f54f 368 break;
mbed_official 0:7037ed05f54f 369 case TX_DONE:
mbed_official 0:7037ed05f54f 370 printf("\r\n Message Sent to Network Server \r\n");
mbed_official 0:7037ed05f54f 371 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 372 send_message();
mbed_official 0:7037ed05f54f 373 }
mbed_official 0:7037ed05f54f 374 break;
mbed_official 0:7037ed05f54f 375 case TX_TIMEOUT:
mbed_official 0:7037ed05f54f 376 case TX_ERROR:
mbed_official 0:7037ed05f54f 377 case TX_CRYPTO_ERROR:
mbed_official 0:7037ed05f54f 378 case TX_SCHEDULING_ERROR:
mbed_official 0:7037ed05f54f 379 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
mbed_official 0:7037ed05f54f 380 // try again
mbed_official 0:7037ed05f54f 381 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 382 send_message();
mbed_official 0:7037ed05f54f 383 }
mbed_official 0:7037ed05f54f 384 break;
mbed_official 0:7037ed05f54f 385 case RX_DONE:
mbed_official 0:7037ed05f54f 386 printf("\r\n Received message from Network Server \r\n");
mbed_official 0:7037ed05f54f 387 receive_message();
mbed_official 0:7037ed05f54f 388 break;
mbed_official 0:7037ed05f54f 389 case RX_TIMEOUT:
mbed_official 0:7037ed05f54f 390 case RX_ERROR:
mbed_official 0:7037ed05f54f 391 printf("\r\n Error in reception - Code = %d \r\n", event);
mbed_official 0:7037ed05f54f 392 break;
mbed_official 0:7037ed05f54f 393 case JOIN_FAILURE:
mbed_official 0:7037ed05f54f 394 printf("\r\n OTAA Failed - Check Keys \r\n");
mbed_official 0:7037ed05f54f 395 break;
mbed_official 26:f07f5febf97f 396 case UPLINK_REQUIRED:
mbed_official 26:f07f5febf97f 397 printf("\r\n Uplink required by NS \r\n");
mbed_official 26:f07f5febf97f 398 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 399 send_message();
mbed_official 26:f07f5febf97f 400 }
mbed_official 26:f07f5febf97f 401 break;
mbed_official 0:7037ed05f54f 402 default:
mbed_official 0:7037ed05f54f 403 MBED_ASSERT("Unknown Event");
mbed_official 0:7037ed05f54f 404 }
mbed_official 0:7037ed05f54f 405 }
mbed_official 0:7037ed05f54f 406
mbed_official 0:7037ed05f54f 407 // EOF