LoRaWAN_FAE_Training

Dependencies:   X_NUCLEO_IKS01A2

Committer:
SemBen
Date:
Wed Mar 13 10:18:20 2019 +0000
Revision:
50:dbfbb8d03a79
Parent:
49:2453a6404fbe
Child:
51:a6da9392e7c3
Adapt the code

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 49:2453a6404fbe 115 // printf("\r\n--- IKS01A2 conf start ---\r\n");
SemBen 49:2453a6404fbe 116 //
SemBen 49:2453a6404fbe 117 // /* Enable all sensors */
SemBen 49:2453a6404fbe 118 // hum_temp->enable();
SemBen 49:2453a6404fbe 119 // press_temp->enable();
SemBen 49:2453a6404fbe 120 // magnetometer->enable();
SemBen 49:2453a6404fbe 121 // accelerometer->enable();
SemBen 49:2453a6404fbe 122 // acc_gyro->enable_x();
SemBen 49:2453a6404fbe 123 // acc_gyro->enable_g();
SemBen 49:2453a6404fbe 124 //
SemBen 49:2453a6404fbe 125 // hum_temp->read_id(&id);
SemBen 49:2453a6404fbe 126 // printf("HTS221 humidity & temperature = 0x%X\r\n", id);
SemBen 49:2453a6404fbe 127 // press_temp->read_id(&id);
SemBen 49:2453a6404fbe 128 // printf("LPS22HB pressure & temperature = 0x%X\r\n", id);
SemBen 49:2453a6404fbe 129 // magnetometer->read_id(&id);
SemBen 49:2453a6404fbe 130 // printf("LSM303AGR magnetometer = 0x%X\r\n", id);
SemBen 49:2453a6404fbe 131 // accelerometer->read_id(&id);
SemBen 49:2453a6404fbe 132 // printf("LSM303AGR accelerometer = 0x%X\r\n", id);
SemBen 49:2453a6404fbe 133 // acc_gyro->read_id(&id);
SemBen 49:2453a6404fbe 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];
SemBen 48:b02d43b5e90c 199
SemBen 49:2453a6404fbe 200 // hum_temp->get_temperature(&value1);
SemBen 49:2453a6404fbe 201 // hum_temp->get_humidity(&value2);
SemBen 49:2453a6404fbe 202 // printf("HTS221: [temp] %2.2f C, [hum] %2.2f \r\n", value1, value2);
SemBen 49:2453a6404fbe 203 // Humidity = value2 * 100;
SemBen 49:2453a6404fbe 204 //
SemBen 49:2453a6404fbe 205 // /*Add Humidity*/
SemBen 49:2453a6404fbe 206 // tx_buffer[0]+=1; // Add 1 Nbelment
SemBen 49:2453a6404fbe 207 // tx_buffer[Index]=0x03; // Humidity
SemBen 49:2453a6404fbe 208 // tx_buffer[Index+1]=0x03; // Len
SemBen 49:2453a6404fbe 209 // tx_buffer[Index+2]=(uint8_t)(Humidity & 0xFF); // Press LSB
SemBen 49:2453a6404fbe 210 // tx_buffer[Index+3]=(uint8_t)((Humidity >> 8) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 211 // tx_buffer[Index+4]=(uint8_t)((Humidity >> 16) & 0xFF); // Press MSB
SemBen 49:2453a6404fbe 212 // Index+=5;
SemBen 49:2453a6404fbe 213 //
SemBen 49:2453a6404fbe 214 // press_temp->get_temperature(&value1);
SemBen 49:2453a6404fbe 215 // press_temp->get_pressure(&value2);
SemBen 49:2453a6404fbe 216 // printf("LPS22HB: [temp] %2.2f C, [press] %4.2f mbar\r\n", value1, value2);
SemBen 49:2453a6404fbe 217 //
SemBen 49:2453a6404fbe 218 //
SemBen 49:2453a6404fbe 219 // Temperature = value1 * 100; // Convert for transmit
SemBen 49:2453a6404fbe 220 // Pressure = value2 * 100; // Convert for transmit
SemBen 49:2453a6404fbe 221 //
SemBen 49:2453a6404fbe 222 // /*Add Tempertaure*/
SemBen 49:2453a6404fbe 223 // tx_buffer[0]+=1; // Add 1 Nbelment
SemBen 49:2453a6404fbe 224 // tx_buffer[Index]=0x01; // Temperature
SemBen 49:2453a6404fbe 225 // tx_buffer[Index+1]=0x02; // Len
SemBen 49:2453a6404fbe 226 // tx_buffer[Index+2]=(uint8_t)(Temperature & 0xFF); // Temp LSB
SemBen 49:2453a6404fbe 227 // tx_buffer[Index+3]=(uint8_t)((Temperature >> 8) & 0xFF); // Temp MSB
SemBen 49:2453a6404fbe 228 // Index+=4; // Update the Index
SemBen 48:b02d43b5e90c 229 //
SemBen 49:2453a6404fbe 230 // /*Add Pressure*/
SemBen 49:2453a6404fbe 231 // tx_buffer[0]+=1;
SemBen 49:2453a6404fbe 232 // tx_buffer[Index]=0x02; // Pressure
SemBen 49:2453a6404fbe 233 // tx_buffer[Index+1]=0x03; // Len
SemBen 49:2453a6404fbe 234 // tx_buffer[Index+2]=(uint8_t)(Pressure & 0xFF); // Press LSB
SemBen 49:2453a6404fbe 235 // tx_buffer[Index+3]=(uint8_t)((Pressure >> 8) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 236 // tx_buffer[Index+4]=(uint8_t)((Pressure >> 16) & 0xFF); // Press MSB
SemBen 49:2453a6404fbe 237 // Index+=5;
SemBen 49:2453a6404fbe 238 //
SemBen 49:2453a6404fbe 239 // printf("---\r\n");
SemBen 49:2453a6404fbe 240 //
SemBen 49:2453a6404fbe 241 //// magnetometer->get_m_axes(axes);
SemBen 49:2453a6404fbe 242 //// printf("LSM303AGR [mag/mgauss]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 49:2453a6404fbe 243 ////
SemBen 49:2453a6404fbe 244 // accelerometer->get_x_axes(axes);
SemBen 49:2453a6404fbe 245 // printf("LSM303AGR [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 49:2453a6404fbe 246 //
SemBen 49:2453a6404fbe 247 // /*Add Accelerometer*/
SemBen 49:2453a6404fbe 248 // tx_buffer[0]+=1;
SemBen 49:2453a6404fbe 249 // tx_buffer[Index]=0x04; // Accelerometer
SemBen 49:2453a6404fbe 250 // tx_buffer[Index+1]=0x03; // Len
SemBen 49:2453a6404fbe 251 // /* x */
SemBen 49:2453a6404fbe 252 // tx_buffer[Index+2]=(uint8_t)(axes[0] & 0xFF); // Press LSB
SemBen 49:2453a6404fbe 253 // tx_buffer[Index+3]=(uint8_t)((axes[0] >> 8) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 254 // tx_buffer[Index+4]=(uint8_t)((axes[0] >> 16) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 255 // tx_buffer[Index+5]=(uint8_t)((axes[0] >> 24) & 0xFF); // Press MSB
SemBen 49:2453a6404fbe 256 //
SemBen 49:2453a6404fbe 257 // /* y */
SemBen 49:2453a6404fbe 258 // tx_buffer[Index+6]=(uint8_t)(axes[1] & 0xFF); // Press LSB
SemBen 49:2453a6404fbe 259 // tx_buffer[Index+7]=(uint8_t)((axes[1] >> 8) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 260 // tx_buffer[Index+8]=(uint8_t)((axes[1] >> 16) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 261 // tx_buffer[Index+9]=(uint8_t)((axes[1] >> 24) & 0xFF); // Press MSB
SemBen 49:2453a6404fbe 262 //
SemBen 49:2453a6404fbe 263 // /* z */
SemBen 49:2453a6404fbe 264 // tx_buffer[Index+10]=(uint8_t)(axes[2] & 0xFF); // Press LSB
SemBen 49:2453a6404fbe 265 // tx_buffer[Index+11]=(uint8_t)((axes[2] >> 8) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 266 // tx_buffer[Index+12]=(uint8_t)((axes[2] >> 16) & 0xFF); // Press MID
SemBen 49:2453a6404fbe 267 // tx_buffer[Index+13]=(uint8_t)((axes[2] >> 24) & 0xFF); // Press MSB
SemBen 49:2453a6404fbe 268 // Index+=14;
SemBen 48:b02d43b5e90c 269 //
SemBen 48:b02d43b5e90c 270 // acc_gyro->get_x_axes(axes);
SemBen 48:b02d43b5e90c 271 // printf("LSM6DSL [acc/mg]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 48:b02d43b5e90c 272 //
SemBen 48:b02d43b5e90c 273 // acc_gyro->get_g_axes(axes);
SemBen 48:b02d43b5e90c 274 // printf("LSM6DSL [gyro/mdps]: %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
SemBen 48:b02d43b5e90c 275
SemBen 50:dbfbb8d03a79 276 // packet_len = Index + 1; // Compute the final payload size
mbed_official 0:7037ed05f54f 277
mbed_official 2:dc95ac6d6d4e 278 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len,
SemBen 45:96fe99f19cd0 279 MSG_UNCONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 280
mbed_official 0:7037ed05f54f 281 if (retcode < 0) {
mbed_official 0:7037ed05f54f 282 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n")
mbed_official 0:7037ed05f54f 283 : printf("\r\n send() - Error code %d \r\n", retcode);
mbed_official 26:f07f5febf97f 284
mbed_official 26:f07f5febf97f 285 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
mbed_official 26:f07f5febf97f 286 //retry in 3 seconds
mbed_official 26:f07f5febf97f 287 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 288 ev_queue.call_in(3000, send_message);
mbed_official 26:f07f5febf97f 289 }
mbed_official 26:f07f5febf97f 290 }
mbed_official 0:7037ed05f54f 291 return;
mbed_official 0:7037ed05f54f 292 }
mbed_official 0:7037ed05f54f 293
mbed_official 0:7037ed05f54f 294 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
mbed_official 12:5015dfead3f2 295 memset(tx_buffer, 0, sizeof(tx_buffer));
mbed_official 0:7037ed05f54f 296 }
mbed_official 0:7037ed05f54f 297
mbed_official 0:7037ed05f54f 298 /**
mbed_official 0:7037ed05f54f 299 * Receive a message from the Network Server
mbed_official 0:7037ed05f54f 300 */
mbed_official 0:7037ed05f54f 301 static void receive_message()
mbed_official 0:7037ed05f54f 302 {
mbed_official 0:7037ed05f54f 303 int16_t retcode;
mbed_official 2:dc95ac6d6d4e 304 retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer,
mbed_official 12:5015dfead3f2 305 sizeof(rx_buffer),
mbed_official 0:7037ed05f54f 306 MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 307
mbed_official 0:7037ed05f54f 308 if (retcode < 0) {
mbed_official 0:7037ed05f54f 309 printf("\r\n receive() - Error code %d \r\n", retcode);
mbed_official 0:7037ed05f54f 310 return;
mbed_official 0:7037ed05f54f 311 }
mbed_official 0:7037ed05f54f 312
mbed_official 0:7037ed05f54f 313 printf(" Data:");
mbed_official 0:7037ed05f54f 314
mbed_official 0:7037ed05f54f 315 for (uint8_t i = 0; i < retcode; i++) {
mbed_official 0:7037ed05f54f 316 printf("%x", rx_buffer[i]);
mbed_official 0:7037ed05f54f 317 }
mbed_official 0:7037ed05f54f 318
mbed_official 0:7037ed05f54f 319 printf("\r\n Data Length: %d\r\n", retcode);
SemBen 48:b02d43b5e90c 320
SemBen 48:b02d43b5e90c 321 if(rx_buffer[0] & 0x01 == 1)
SemBen 48:b02d43b5e90c 322 {
SemBen 48:b02d43b5e90c 323 printf("\r\n Board is in Wrong side !!!!! \r\n\r\n");
SemBen 48:b02d43b5e90c 324 }
SemBen 48:b02d43b5e90c 325 if(((rx_buffer[0] & 0x02) >> 1) == 1)
SemBen 48:b02d43b5e90c 326 {
SemBen 48:b02d43b5e90c 327 printf("\r\n It's hot here !!!!! \r\n\r\n");
SemBen 48:b02d43b5e90c 328 }
SemBen 48:b02d43b5e90c 329 if(((rx_buffer[0] & 0x04) >> 2) == 1)
SemBen 48:b02d43b5e90c 330 {
SemBen 48:b02d43b5e90c 331 printf("\r\n It's humid here !!!!! \r\n\r\n");
SemBen 48:b02d43b5e90c 332 }
mbed_official 0:7037ed05f54f 333
mbed_official 12:5015dfead3f2 334 memset(rx_buffer, 0, sizeof(rx_buffer));
mbed_official 0:7037ed05f54f 335 }
mbed_official 0:7037ed05f54f 336
mbed_official 0:7037ed05f54f 337 /**
mbed_official 0:7037ed05f54f 338 * Event handler
mbed_official 0:7037ed05f54f 339 */
mbed_official 0:7037ed05f54f 340 static void lora_event_handler(lorawan_event_t event)
mbed_official 0:7037ed05f54f 341 {
mbed_official 0:7037ed05f54f 342 switch (event) {
mbed_official 0:7037ed05f54f 343 case CONNECTED:
mbed_official 0:7037ed05f54f 344 printf("\r\n Connection - Successful \r\n");
mbed_official 0:7037ed05f54f 345 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 346 send_message();
mbed_official 0:7037ed05f54f 347 } else {
mbed_official 0:7037ed05f54f 348 ev_queue.call_every(TX_TIMER, send_message);
mbed_official 0:7037ed05f54f 349 }
mbed_official 0:7037ed05f54f 350
mbed_official 0:7037ed05f54f 351 break;
mbed_official 0:7037ed05f54f 352 case DISCONNECTED:
mbed_official 0:7037ed05f54f 353 ev_queue.break_dispatch();
mbed_official 0:7037ed05f54f 354 printf("\r\n Disconnected Successfully \r\n");
mbed_official 0:7037ed05f54f 355 break;
mbed_official 0:7037ed05f54f 356 case TX_DONE:
mbed_official 0:7037ed05f54f 357 printf("\r\n Message Sent to Network Server \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 }
mbed_official 0:7037ed05f54f 361 break;
mbed_official 0:7037ed05f54f 362 case TX_TIMEOUT:
mbed_official 0:7037ed05f54f 363 case TX_ERROR:
mbed_official 0:7037ed05f54f 364 case TX_CRYPTO_ERROR:
mbed_official 0:7037ed05f54f 365 case TX_SCHEDULING_ERROR:
mbed_official 0:7037ed05f54f 366 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
mbed_official 0:7037ed05f54f 367 // try again
mbed_official 0:7037ed05f54f 368 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 369 send_message();
mbed_official 0:7037ed05f54f 370 }
mbed_official 0:7037ed05f54f 371 break;
mbed_official 0:7037ed05f54f 372 case RX_DONE:
mbed_official 0:7037ed05f54f 373 printf("\r\n Received message from Network Server \r\n");
mbed_official 0:7037ed05f54f 374 receive_message();
mbed_official 0:7037ed05f54f 375 break;
mbed_official 0:7037ed05f54f 376 case RX_TIMEOUT:
mbed_official 0:7037ed05f54f 377 case RX_ERROR:
mbed_official 0:7037ed05f54f 378 printf("\r\n Error in reception - Code = %d \r\n", event);
mbed_official 0:7037ed05f54f 379 break;
mbed_official 0:7037ed05f54f 380 case JOIN_FAILURE:
mbed_official 0:7037ed05f54f 381 printf("\r\n OTAA Failed - Check Keys \r\n");
mbed_official 0:7037ed05f54f 382 break;
mbed_official 26:f07f5febf97f 383 case UPLINK_REQUIRED:
mbed_official 26:f07f5febf97f 384 printf("\r\n Uplink required by NS \r\n");
mbed_official 26:f07f5febf97f 385 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 386 send_message();
mbed_official 26:f07f5febf97f 387 }
mbed_official 26:f07f5febf97f 388 break;
mbed_official 0:7037ed05f54f 389 default:
mbed_official 0:7037ed05f54f 390 MBED_ASSERT("Unknown Event");
mbed_official 0:7037ed05f54f 391 }
mbed_official 0:7037ed05f54f 392 }
mbed_official 0:7037ed05f54f 393
mbed_official 0:7037ed05f54f 394 // EOF