LoRaWAN_FAE_Training

Dependencies:   X_NUCLEO_IKS01A2

Committer:
SemBen
Date:
Thu Mar 14 09:24:00 2019 +0000
Revision:
51:a6da9392e7c3
Parent:
50:dbfbb8d03a79
Child:
52:d75d967418ed
Comments modified

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