yes Spada / Mbed 2 deprecated PS6_uplink

Dependencies:   mbed

Committer:
spadaaa
Date:
Thu Mar 26 11:45:17 2020 +0000
Revision:
3:514c9faeba80
Parent:
2:b51532683489
for mesurement

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jordanemonney 0:e73fe93596e9 1 /**
jordanemonney 0:e73fe93596e9 2 * Copyright (c) 2017, Arm Limited and affiliates.
jordanemonney 0:e73fe93596e9 3 * SPDX-License-Identifier: Apache-2.0
jordanemonney 0:e73fe93596e9 4 *
jordanemonney 0:e73fe93596e9 5 * Licensed under the Apache License, Version 2.0 (the "License");
jordanemonney 0:e73fe93596e9 6 * you may not use this file except in compliance with the License.
jordanemonney 0:e73fe93596e9 7 * You may obtain a copy of the License at
jordanemonney 0:e73fe93596e9 8 *
jordanemonney 0:e73fe93596e9 9 * http://www.apache.org/licenses/LICENSE-2.0
jordanemonney 0:e73fe93596e9 10 *
jordanemonney 0:e73fe93596e9 11 * Unless required by applicable law or agreed to in writing, software
jordanemonney 0:e73fe93596e9 12 * distributed under the License is distributed on an "AS IS" BASIS,
jordanemonney 0:e73fe93596e9 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jordanemonney 0:e73fe93596e9 14 * See the License for the specific language governing permissions and
jordanemonney 0:e73fe93596e9 15 * limitations under the License.
jordanemonney 0:e73fe93596e9 16 */
jordanemonney 0:e73fe93596e9 17 #include "stdio.h"
jordanemonney 0:e73fe93596e9 18 #include "mbed.h"
jordanemonney 0:e73fe93596e9 19 #include "math.h"
jordanemonney 0:e73fe93596e9 20 #include "stm32l0xx_hal_rcc.h"
jordanemonney 0:e73fe93596e9 21 #include "lorawan/LoRaWANInterface.h"
jordanemonney 0:e73fe93596e9 22 #include "lorawan/system/lorawan_data_structures.h"
jordanemonney 0:e73fe93596e9 23 #include "events/EventQueue.h"
jordanemonney 0:e73fe93596e9 24 #include "SX1276_LoRaRadio.h"
jordanemonney 0:e73fe93596e9 25 // Application helpers
jordanemonney 0:e73fe93596e9 26 #include "DummySensor.h"
jordanemonney 0:e73fe93596e9 27 #include "lora_radio_helper.h"
jordanemonney 0:e73fe93596e9 28 #include "trace_helper.h"
jordanemonney 0:e73fe93596e9 29
jordanemonney 0:e73fe93596e9 30 //Init variable
jordanemonney 0:e73fe93596e9 31 int countAck = 1;
jordanemonney 0:e73fe93596e9 32 int countFailAck = 0;
jordanemonney 0:e73fe93596e9 33 double moyESP = 4000.0;
jordanemonney 0:e73fe93596e9 34 double nbrACK = 5.0;
jordanemonney 0:e73fe93596e9 35 double greenLimit = 115.0;
jordanemonney 0:e73fe93596e9 36 double blueLimit = 120.0;
jordanemonney 0:e73fe93596e9 37
jordanemonney 0:e73fe93596e9 38
jordanemonney 0:e73fe93596e9 39 //init LED
jordanemonney 0:e73fe93596e9 40 DigitalOut myled1(LED1);
jordanemonney 0:e73fe93596e9 41 DigitalOut myled2(LED2);
jordanemonney 0:e73fe93596e9 42 DigitalOut myled3(LED3);
jordanemonney 0:e73fe93596e9 43 DigitalOut myled4(LED4);
jordanemonney 0:e73fe93596e9 44
jordanemonney 0:e73fe93596e9 45 bool ledStatus = true; //Statut pour le toggle led
jordanemonney 0:e73fe93596e9 46
jordanemonney 0:e73fe93596e9 47 int id = 0; //Id value to kill action
jordanemonney 0:e73fe93596e9 48
jordanemonney 0:e73fe93596e9 49 //Start/stop led
jordanemonney 0:e73fe93596e9 50 int ledStart = 0;
jordanemonney 0:e73fe93596e9 51 static void StartLed1(){
jordanemonney 0:e73fe93596e9 52 myled1=1;
jordanemonney 0:e73fe93596e9 53 myled3=0;
jordanemonney 0:e73fe93596e9 54 myled4=0;
jordanemonney 0:e73fe93596e9 55 ledStart = 1;
jordanemonney 0:e73fe93596e9 56 }
jordanemonney 0:e73fe93596e9 57 static void StartLed3(){
jordanemonney 0:e73fe93596e9 58 myled1=0;
jordanemonney 0:e73fe93596e9 59 myled3=1;
jordanemonney 0:e73fe93596e9 60 myled4=0;
jordanemonney 0:e73fe93596e9 61 ledStart = 3;
jordanemonney 0:e73fe93596e9 62 }
jordanemonney 0:e73fe93596e9 63 static void StartLed4(){
jordanemonney 0:e73fe93596e9 64 myled1=0;
jordanemonney 0:e73fe93596e9 65 myled3=0;
jordanemonney 0:e73fe93596e9 66 myled4=1;
jordanemonney 0:e73fe93596e9 67 ledStart = 4;
jordanemonney 0:e73fe93596e9 68 }
jordanemonney 0:e73fe93596e9 69
jordanemonney 0:e73fe93596e9 70 static void toggleLed(DigitalOut led) {
jordanemonney 0:e73fe93596e9 71 if(ledStatus){
jordanemonney 0:e73fe93596e9 72 led = 1;
jordanemonney 0:e73fe93596e9 73 ledStatus = false;
jordanemonney 0:e73fe93596e9 74 }
jordanemonney 0:e73fe93596e9 75 else{
jordanemonney 0:e73fe93596e9 76 led = 0;
jordanemonney 0:e73fe93596e9 77 ledStatus = true;
jordanemonney 0:e73fe93596e9 78 }
jordanemonney 0:e73fe93596e9 79 }
jordanemonney 0:e73fe93596e9 80
jordanemonney 0:e73fe93596e9 81 using namespace events;
jordanemonney 0:e73fe93596e9 82
jordanemonney 0:e73fe93596e9 83 //Button configuration
jordanemonney 0:e73fe93596e9 84 InterruptIn mybutton(USER_BUTTON);
jordanemonney 0:e73fe93596e9 85
jordanemonney 0:e73fe93596e9 86 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
jordanemonney 0:e73fe93596e9 87 // This example only communicates with much shorter messages (<30 bytes).
jordanemonney 0:e73fe93596e9 88 // If longer messages are used, these buffers must be changed accordingly.
jordanemonney 0:e73fe93596e9 89 uint8_t tx_buffer[128];
jordanemonney 0:e73fe93596e9 90 uint8_t rx_buffer[128];
jordanemonney 0:e73fe93596e9 91 uint8_t buttonVal = 0;
jordanemonney 0:e73fe93596e9 92 /*
jordanemonney 0:e73fe93596e9 93 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
jordanemonney 0:e73fe93596e9 94 */
jordanemonney 0:e73fe93596e9 95 #define TX_TIMER 12000
jordanemonney 0:e73fe93596e9 96
jordanemonney 0:e73fe93596e9 97 /**
jordanemonney 0:e73fe93596e9 98 * Maximum number of events for the event queue.
jordanemonney 0:e73fe93596e9 99 * 10 is the safe number for the stack events, however, if application
jordanemonney 0:e73fe93596e9 100 * also uses the queue for whatever purposes, this number should be increased.
jordanemonney 0:e73fe93596e9 101 */
jordanemonney 0:e73fe93596e9 102 #define MAX_NUMBER_OF_EVENTS 10
jordanemonney 0:e73fe93596e9 103
jordanemonney 0:e73fe93596e9 104 /**
jordanemonney 0:e73fe93596e9 105 * Maximum number of retries for CONFIRMED messages before giving up
jordanemonney 0:e73fe93596e9 106 */
jordanemonney 0:e73fe93596e9 107 #define CONFIRMED_MSG_RETRY_COUNTER 2
jordanemonney 0:e73fe93596e9 108
jordanemonney 0:e73fe93596e9 109 /**
jordanemonney 0:e73fe93596e9 110 * Dummy pin for dummy sensor
jordanemonney 0:e73fe93596e9 111 */
jordanemonney 0:e73fe93596e9 112 #define PC_9 0
jordanemonney 0:e73fe93596e9 113
jordanemonney 0:e73fe93596e9 114 /**
jordanemonney 0:e73fe93596e9 115 * Dummy sensor class object
jordanemonney 0:e73fe93596e9 116 */
jordanemonney 0:e73fe93596e9 117 DS1820 ds1820(PC_9);
jordanemonney 0:e73fe93596e9 118
jordanemonney 0:e73fe93596e9 119 /**
jordanemonney 0:e73fe93596e9 120 * This event queue is the global event queue for both the
jordanemonney 0:e73fe93596e9 121 * application and stack. To conserve memory, the stack is designed to run
jordanemonney 0:e73fe93596e9 122 * in the same thread as the application and the application is responsible for
jordanemonney 0:e73fe93596e9 123 * providing an event queue to the stack that will be used for ISR deferment as
jordanemonney 0:e73fe93596e9 124 * well as application information event queuing.
jordanemonney 0:e73fe93596e9 125 */
jordanemonney 0:e73fe93596e9 126 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS *EVENTS_EVENT_SIZE);
jordanemonney 0:e73fe93596e9 127
jordanemonney 0:e73fe93596e9 128 /**
jordanemonney 0:e73fe93596e9 129 * Event handler.
jordanemonney 0:e73fe93596e9 130 *
jordanemonney 0:e73fe93596e9 131 * This will be passed to the LoRaWAN stack to queue events for the
jordanemonney 0:e73fe93596e9 132 * application which in turn drive the application.
jordanemonney 0:e73fe93596e9 133 */
jordanemonney 0:e73fe93596e9 134 static void lora_event_handler(lorawan_event_t event);
jordanemonney 0:e73fe93596e9 135
jordanemonney 0:e73fe93596e9 136 /**
jordanemonney 0:e73fe93596e9 137 * Constructing Mbed LoRaWANInterface and passing it the radio object from lora_radio_helper.
jordanemonney 0:e73fe93596e9 138 */
jordanemonney 0:e73fe93596e9 139 static LoRaWANInterface lorawan(radio);
jordanemonney 0:e73fe93596e9 140
jordanemonney 0:e73fe93596e9 141 /**
jordanemonney 0:e73fe93596e9 142 * Application specific callbacks
jordanemonney 0:e73fe93596e9 143 */
jordanemonney 0:e73fe93596e9 144 static lorawan_app_callbacks_t callbacks;
jordanemonney 0:e73fe93596e9 145
jordanemonney 0:e73fe93596e9 146 /**
jordanemonney 0:e73fe93596e9 147 * Entry point for application
jordanemonney 0:e73fe93596e9 148 */
jordanemonney 0:e73fe93596e9 149
jordanemonney 0:e73fe93596e9 150 /* //Set the button for active or deactive ADR
jordanemonney 0:e73fe93596e9 151 static void mod_lowRecept(){
jordanemonney 0:e73fe93596e9 152 if(buttonVal == 0){
jordanemonney 0:e73fe93596e9 153 lorawan.disable_adaptive_datarate ();
jordanemonney 0:e73fe93596e9 154 lorawan.set_datarate(0);
jordanemonney 0:e73fe93596e9 155 buttonVal = 1;
jordanemonney 0:e73fe93596e9 156 printf("\r\n ADR disable \r\n");
jordanemonney 0:e73fe93596e9 157 }
jordanemonney 0:e73fe93596e9 158 else{
jordanemonney 0:e73fe93596e9 159 lorawan.enable_adaptive_datarate ();
jordanemonney 0:e73fe93596e9 160 buttonVal = 0;
jordanemonney 0:e73fe93596e9 161 printf("\r\n ADR enable \r\n");
jordanemonney 0:e73fe93596e9 162 }
jordanemonney 0:e73fe93596e9 163 }
jordanemonney 0:e73fe93596e9 164 */
jordanemonney 0:e73fe93596e9 165 //Change the settings for send more than 5 packet
jordanemonney 0:e73fe93596e9 166 static void modBigTest(){
jordanemonney 0:e73fe93596e9 167 if(buttonVal == 0){
jordanemonney 0:e73fe93596e9 168 nbrACK = 100;
jordanemonney 0:e73fe93596e9 169 printf("Mode big test activated");
jordanemonney 0:e73fe93596e9 170 }
jordanemonney 0:e73fe93596e9 171 else{
jordanemonney 0:e73fe93596e9 172 nbrACK = 5;
jordanemonney 0:e73fe93596e9 173 printf("Mode big test deactivitad");
jordanemonney 0:e73fe93596e9 174 }
jordanemonney 0:e73fe93596e9 175 }
jordanemonney 0:e73fe93596e9 176 //Do the ESP average and set led
jordanemonney 0:e73fe93596e9 177 static void testEnd(){
jordanemonney 0:e73fe93596e9 178 if(buttonVal !=1){
jordanemonney 0:e73fe93596e9 179 myled2 = 0;
jordanemonney 0:e73fe93596e9 180 moyESP/=nbrACK;
spadaaa 2:b51532683489 181 // printf("Count ack = %d // CountfailAck = %d /// moyESP = %f", countAck, countFailAck, moyESP);
jordanemonney 0:e73fe93596e9 182 if(moyESP<=greenLimit){
jordanemonney 0:e73fe93596e9 183 StartLed1();
jordanemonney 0:e73fe93596e9 184 }
jordanemonney 0:e73fe93596e9 185 else if (moyESP<=blueLimit && moyESP>greenLimit){
jordanemonney 0:e73fe93596e9 186 StartLed3();
jordanemonney 0:e73fe93596e9 187 }
jordanemonney 0:e73fe93596e9 188 else{
jordanemonney 0:e73fe93596e9 189 StartLed4();
jordanemonney 0:e73fe93596e9 190 }
jordanemonney 0:e73fe93596e9 191 lorawan.disconnect();
jordanemonney 0:e73fe93596e9 192 }
jordanemonney 0:e73fe93596e9 193 moyESP = 0;
jordanemonney 0:e73fe93596e9 194 }
jordanemonney 0:e73fe93596e9 195 int main(void)
jordanemonney 0:e73fe93596e9 196 {
jordanemonney 0:e73fe93596e9 197 // setup tracing
jordanemonney 0:e73fe93596e9 198 setup_trace();
jordanemonney 0:e73fe93596e9 199
jordanemonney 0:e73fe93596e9 200 // stores the status of a call to LoRaWAN protocol
jordanemonney 0:e73fe93596e9 201 lorawan_status_t retcode;
jordanemonney 0:e73fe93596e9 202
jordanemonney 0:e73fe93596e9 203 // Initialize LoRaWAN stack
jordanemonney 0:e73fe93596e9 204 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
jordanemonney 0:e73fe93596e9 205 printf("\r\n LoRa initialization failed! \r\n");
jordanemonney 0:e73fe93596e9 206 return -1;
jordanemonney 0:e73fe93596e9 207 }
jordanemonney 0:e73fe93596e9 208 printf("\r\n Mbed LoRaWANStack initialized \r\n");
jordanemonney 0:e73fe93596e9 209 id = ev_queue.call_every(200, &toggleLed, myled2);
jordanemonney 0:e73fe93596e9 210 // prepare application callbacks
jordanemonney 0:e73fe93596e9 211 callbacks.events = mbed::callback(lora_event_handler);
jordanemonney 0:e73fe93596e9 212 lorawan.add_app_callbacks(&callbacks);
jordanemonney 0:e73fe93596e9 213
jordanemonney 0:e73fe93596e9 214 // Set number of retries in case of CONFIRMED messages
jordanemonney 0:e73fe93596e9 215 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER)
jordanemonney 0:e73fe93596e9 216 != LORAWAN_STATUS_OK) {
jordanemonney 0:e73fe93596e9 217 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
jordanemonney 0:e73fe93596e9 218 return -1;
jordanemonney 0:e73fe93596e9 219 }
jordanemonney 0:e73fe93596e9 220
spadaaa 2:b51532683489 221 //printf("\r\n CONFIRMED message retries : %d \r\n",
spadaaa 2:b51532683489 222 // CONFIRMED_MSG_RETRY_COUNTER);
jordanemonney 0:e73fe93596e9 223 //Enable adaptive data rate
jordanemonney 0:e73fe93596e9 224 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) {
jordanemonney 0:e73fe93596e9 225 printf("\r\n enable_adaptive_datarate failed! \r\n");
jordanemonney 0:e73fe93596e9 226 return -1;
jordanemonney 0:e73fe93596e9 227 }
jordanemonney 0:e73fe93596e9 228
spadaaa 2:b51532683489 229 //printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
jordanemonney 0:e73fe93596e9 230 retcode = lorawan.connect();
jordanemonney 0:e73fe93596e9 231
jordanemonney 0:e73fe93596e9 232 if (retcode == LORAWAN_STATUS_OK ||
jordanemonney 0:e73fe93596e9 233 retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
jordanemonney 0:e73fe93596e9 234 } else {
jordanemonney 0:e73fe93596e9 235 printf("\r\n Connection error, code = %d \r\n", retcode);
jordanemonney 0:e73fe93596e9 236 return -1;
jordanemonney 0:e73fe93596e9 237 }
jordanemonney 0:e73fe93596e9 238 mybutton.rise(ev_queue.event(modBigTest));
jordanemonney 0:e73fe93596e9 239 printf("\r\n Connection - In Progress ...\r\n");
jordanemonney 0:e73fe93596e9 240
jordanemonney 0:e73fe93596e9 241 // make your event queue dispatching events forever
jordanemonney 0:e73fe93596e9 242 ev_queue.dispatch_forever();
jordanemonney 0:e73fe93596e9 243
jordanemonney 0:e73fe93596e9 244 return 0;
jordanemonney 0:e73fe93596e9 245 }
jordanemonney 0:e73fe93596e9 246
jordanemonney 0:e73fe93596e9 247 /**
jordanemonney 0:e73fe93596e9 248 * Sends a message to the Network Server
jordanemonney 0:e73fe93596e9 249 */
jordanemonney 0:e73fe93596e9 250 static void send_message()
jordanemonney 0:e73fe93596e9 251 {
jordanemonney 0:e73fe93596e9 252 uint16_t packet_len;
jordanemonney 0:e73fe93596e9 253 int16_t retcode;
jordanemonney 0:e73fe93596e9 254 int32_t sensor_value;
jordanemonney 0:e73fe93596e9 255
jordanemonney 0:e73fe93596e9 256 if (ds1820.begin()) {
jordanemonney 0:e73fe93596e9 257 ds1820.startConversion();
jordanemonney 0:e73fe93596e9 258 sensor_value = ds1820.read();
spadaaa 2:b51532683489 259 //printf("\r\n Dummy Sensor Value = %d \r\n", sensor_value);
jordanemonney 0:e73fe93596e9 260 ds1820.startConversion();
jordanemonney 0:e73fe93596e9 261 } else {
jordanemonney 0:e73fe93596e9 262 printf("\r\n No sensor found \r\n");
jordanemonney 0:e73fe93596e9 263 return;
jordanemonney 0:e73fe93596e9 264 }
jordanemonney 0:e73fe93596e9 265
jordanemonney 0:e73fe93596e9 266 packet_len = sprintf((char *) tx_buffer, "ack");
jordanemonney 0:e73fe93596e9 267
jordanemonney 0:e73fe93596e9 268 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len,
jordanemonney 0:e73fe93596e9 269 MSG_CONFIRMED_FLAG);
jordanemonney 0:e73fe93596e9 270
jordanemonney 0:e73fe93596e9 271 if (retcode < 0) {
spadaaa 2:b51532683489 272 //retcode == LORAWAN_STATUS_WOULD_BLOCK; // printf("send - WOULD BLOCK\r\n")
spadaaa 2:b51532683489 273 // printf("\r\n send() - Error code %d \r\n", retcode);
jordanemonney 0:e73fe93596e9 274
jordanemonney 0:e73fe93596e9 275 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
jordanemonney 0:e73fe93596e9 276 //retry in 3 seconds
jordanemonney 0:e73fe93596e9 277 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
jordanemonney 0:e73fe93596e9 278 ev_queue.call_in(3000, send_message);
jordanemonney 0:e73fe93596e9 279 }
jordanemonney 0:e73fe93596e9 280 }
jordanemonney 0:e73fe93596e9 281 return;
jordanemonney 0:e73fe93596e9 282 }
spadaaa 2:b51532683489 283 //printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
jordanemonney 0:e73fe93596e9 284 memset(tx_buffer, 0, sizeof(tx_buffer));
jordanemonney 0:e73fe93596e9 285 }
jordanemonney 0:e73fe93596e9 286
jordanemonney 0:e73fe93596e9 287 /**
jordanemonney 0:e73fe93596e9 288 * Receive a message from the Network Server
jordanemonney 0:e73fe93596e9 289 */
jordanemonney 0:e73fe93596e9 290 static void receive_message()
jordanemonney 0:e73fe93596e9 291 {
jordanemonney 0:e73fe93596e9 292 uint8_t port;
jordanemonney 0:e73fe93596e9 293 int flags;
jordanemonney 0:e73fe93596e9 294 int16_t retcode = lorawan.receive(rx_buffer, sizeof(rx_buffer), port, flags);
jordanemonney 0:e73fe93596e9 295
jordanemonney 0:e73fe93596e9 296 if (retcode < 0) {
spadaaa 2:b51532683489 297 //printf("\r\n receive() - Error code %d \r\n", retcode);
jordanemonney 0:e73fe93596e9 298 return;
jordanemonney 0:e73fe93596e9 299 }
spadaaa 2:b51532683489 300 //printf(" RX Data on port %u (%d bytes): ", port, retcode);
jordanemonney 0:e73fe93596e9 301
jordanemonney 0:e73fe93596e9 302 for (uint8_t i = 0; i < retcode; i++) {
spadaaa 2:b51532683489 303 //printf("%02x ", rx_buffer[i]);
jordanemonney 0:e73fe93596e9 304 }
spadaaa 2:b51532683489 305 // printf("\r\n");
jordanemonney 0:e73fe93596e9 306 memset(rx_buffer, 0, sizeof(rx_buffer));
jordanemonney 0:e73fe93596e9 307 }
jordanemonney 0:e73fe93596e9 308 /*
jordanemonney 0:e73fe93596e9 309 * Set led after the test of the sent packet
jordanemonney 0:e73fe93596e9 310 */
jordanemonney 0:e73fe93596e9 311 static void show(double esp){
jordanemonney 0:e73fe93596e9 312 if(esp<=120.0){
jordanemonney 0:e73fe93596e9 313 StartLed1();
jordanemonney 0:e73fe93596e9 314 }
jordanemonney 0:e73fe93596e9 315 else if(esp<125.0 && esp>120.0){
jordanemonney 0:e73fe93596e9 316 StartLed3();
jordanemonney 0:e73fe93596e9 317 }
jordanemonney 0:e73fe93596e9 318 else{
jordanemonney 0:e73fe93596e9 319 StartLed4();
jordanemonney 0:e73fe93596e9 320 }
jordanemonney 0:e73fe93596e9 321 }
jordanemonney 0:e73fe93596e9 322 /*
jordanemonney 0:e73fe93596e9 323 * Calcul rx data
jordanemonney 0:e73fe93596e9 324 */
jordanemonney 0:e73fe93596e9 325 static void receive_data_calcul(int16_t rssi, int16_t snr){
jordanemonney 0:e73fe93596e9 326 //RSSI − 10∗LOG(1+10^(−SNR/100)).
jordanemonney 0:e73fe93596e9 327 //Convertie les valeurs pour effectuer les calculs
jordanemonney 0:e73fe93596e9 328 double s = (int) snr;
spadaaa 2:b51532683489 329 printf(" Original RSSI & SNR:\n %d \n %f\n", rssi, s/10);
jordanemonney 0:e73fe93596e9 330 if(rssi>0){
jordanemonney 0:e73fe93596e9 331 rssi=-rssi;
jordanemonney 0:e73fe93596e9 332 }
jordanemonney 0:e73fe93596e9 333 //Algo II
jordanemonney 0:e73fe93596e9 334 switch(rssi) {
jordanemonney 0:e73fe93596e9 335 case -115:
jordanemonney 0:e73fe93596e9 336 case -116:
jordanemonney 0:e73fe93596e9 337 case -117:
jordanemonney 0:e73fe93596e9 338 rssi +=2;
jordanemonney 0:e73fe93596e9 339 s +=20;
jordanemonney 0:e73fe93596e9 340 break;
jordanemonney 0:e73fe93596e9 341 case -118:
jordanemonney 0:e73fe93596e9 342 case -119:
jordanemonney 0:e73fe93596e9 343 rssi +=3;
jordanemonney 0:e73fe93596e9 344 s +=20;
jordanemonney 0:e73fe93596e9 345 break;
jordanemonney 0:e73fe93596e9 346 case -120:
jordanemonney 0:e73fe93596e9 347 case -121:
jordanemonney 0:e73fe93596e9 348 rssi +=5;
jordanemonney 0:e73fe93596e9 349 s +=20;
jordanemonney 0:e73fe93596e9 350 break;
jordanemonney 0:e73fe93596e9 351 case -122:
jordanemonney 0:e73fe93596e9 352 case -123:
jordanemonney 0:e73fe93596e9 353 rssi +=6;
jordanemonney 0:e73fe93596e9 354 s +=40;
jordanemonney 0:e73fe93596e9 355 break;
jordanemonney 0:e73fe93596e9 356 case -124:
jordanemonney 0:e73fe93596e9 357 rssi +=8;
jordanemonney 0:e73fe93596e9 358 s +=50;
jordanemonney 0:e73fe93596e9 359 break;
jordanemonney 0:e73fe93596e9 360 case -125:
jordanemonney 0:e73fe93596e9 361 rssi +=8;
jordanemonney 0:e73fe93596e9 362 s +=40;
jordanemonney 0:e73fe93596e9 363 break;
jordanemonney 0:e73fe93596e9 364 case -126:
jordanemonney 0:e73fe93596e9 365 rssi +=8;
jordanemonney 0:e73fe93596e9 366 s +=40;
jordanemonney 0:e73fe93596e9 367 break;
jordanemonney 0:e73fe93596e9 368 case -127:
jordanemonney 0:e73fe93596e9 369 rssi +=8;
jordanemonney 0:e73fe93596e9 370 break;
jordanemonney 0:e73fe93596e9 371 case -128:
jordanemonney 0:e73fe93596e9 372 rssi +=8;
jordanemonney 0:e73fe93596e9 373 s -=20;
jordanemonney 0:e73fe93596e9 374 break;
jordanemonney 0:e73fe93596e9 375 case -129:
jordanemonney 0:e73fe93596e9 376 case -130:
jordanemonney 0:e73fe93596e9 377 case -131:
jordanemonney 0:e73fe93596e9 378 case -132:
jordanemonney 0:e73fe93596e9 379 case -133:
jordanemonney 0:e73fe93596e9 380 case -134:
jordanemonney 0:e73fe93596e9 381 case -135:
jordanemonney 0:e73fe93596e9 382 rssi +=8;
jordanemonney 0:e73fe93596e9 383 s -=40;
jordanemonney 0:e73fe93596e9 384 break;
jordanemonney 0:e73fe93596e9 385 }
spadaaa 2:b51532683489 386 //printf(" Filtred RSSI & SNR %d %f\n", rssi, s/10);
jordanemonney 0:e73fe93596e9 387 double rs = (int) rssi;
jordanemonney 0:e73fe93596e9 388 s = -s;
jordanemonney 0:e73fe93596e9 389 s /= 100.0;
jordanemonney 0:e73fe93596e9 390 double p = pow(10, s);
jordanemonney 0:e73fe93596e9 391 p+=1.0;
jordanemonney 0:e73fe93596e9 392 double snrLog = log10(p);
jordanemonney 0:e73fe93596e9 393 double esp = rs - (10.0*snrLog);
spadaaa 2:b51532683489 394 //printf(" ESP value %f\n", esp);
jordanemonney 0:e73fe93596e9 395 printf(" Numero de trame %d\r\n", countAck);
jordanemonney 0:e73fe93596e9 396 esp*=-1;
jordanemonney 0:e73fe93596e9 397 moyESP+=esp; //Fais la moyenne de ESP
spadaaa 2:b51532683489 398 //printf(" moyenne esp %f\n", moyESP);
jordanemonney 0:e73fe93596e9 399 show(esp); //Envois la valeur de l'esp à la méthode qui va allumer les led correspondantes
jordanemonney 0:e73fe93596e9 400 }
jordanemonney 0:e73fe93596e9 401 /*
jordanemonney 0:e73fe93596e9 402 * get rx data
jordanemonney 0:e73fe93596e9 403 */
jordanemonney 0:e73fe93596e9 404 static void receive_data(){
jordanemonney 0:e73fe93596e9 405 lorawan_rx_metadata rxMetadata;
jordanemonney 0:e73fe93596e9 406 lorawan.get_rx_metadata(rxMetadata); //Get info of the downlink communcitation
jordanemonney 0:e73fe93596e9 407 receive_data_calcul(rxMetadata.rssi, rxMetadata.snr); //Send the value of RSSI & SNR to the next step
jordanemonney 0:e73fe93596e9 408 }
jordanemonney 0:e73fe93596e9 409 /**
jordanemonney 0:e73fe93596e9 410 * Event handler
jordanemonney 0:e73fe93596e9 411 */
jordanemonney 0:e73fe93596e9 412 static void lora_event_handler(lorawan_event_t event)
jordanemonney 0:e73fe93596e9 413 {
jordanemonney 0:e73fe93596e9 414 switch (event) {
jordanemonney 0:e73fe93596e9 415 case CONNECTED:
jordanemonney 0:e73fe93596e9 416 /* Enable this for fix sf to 12
jordanemonney 0:e73fe93596e9 417 printf("\r\n ADR disable");
jordanemonney 0:e73fe93596e9 418 lorawan.disable_adaptive_datarate();
jordanemonney 0:e73fe93596e9 419 lorawan.set_datarate(0); */
spadaaa 2:b51532683489 420 //printf("\r\n Connection - Successful \r\n");
jordanemonney 0:e73fe93596e9 421 ev_queue.cancel(id);
jordanemonney 0:e73fe93596e9 422 myled1 = 1;
jordanemonney 0:e73fe93596e9 423 myled2 = 1;
jordanemonney 0:e73fe93596e9 424 myled3 = 1;
jordanemonney 0:e73fe93596e9 425 myled4 = 1;
jordanemonney 0:e73fe93596e9 426 moyESP = 0; //Set la valeur de l'ESP à 0 pour commencer les test
jordanemonney 0:e73fe93596e9 427 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
jordanemonney 0:e73fe93596e9 428 send_message();
jordanemonney 0:e73fe93596e9 429 } else {
jordanemonney 0:e73fe93596e9 430 ev_queue.call_every(TX_TIMER, send_message);
jordanemonney 0:e73fe93596e9 431 }
jordanemonney 0:e73fe93596e9 432 break;
jordanemonney 0:e73fe93596e9 433 case DISCONNECTED:
jordanemonney 0:e73fe93596e9 434 ev_queue.break_dispatch();
jordanemonney 0:e73fe93596e9 435 printf("\r\n Disconnected Successfully \r\n");
jordanemonney 0:e73fe93596e9 436 break;
jordanemonney 0:e73fe93596e9 437 case TX_DONE:
spadaaa 3:514c9faeba80 438 thread_sleep_for(5900);
spadaaa 2:b51532683489 439 //printf("\r\n Message Sent to Network Server \r\n");
jordanemonney 0:e73fe93596e9 440 receive_data();
jordanemonney 0:e73fe93596e9 441 ev_queue.cancel(id);
jordanemonney 0:e73fe93596e9 442 if(countAck==nbrACK){
spadaaa 2:b51532683489 443 //testEnd();
jordanemonney 0:e73fe93596e9 444 }
spadaaa 2:b51532683489 445 //----------------------------------------------------ATTENTION !!
jordanemonney 0:e73fe93596e9 446 countAck++;
jordanemonney 0:e73fe93596e9 447 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
jordanemonney 0:e73fe93596e9 448 send_message();
jordanemonney 0:e73fe93596e9 449 }
jordanemonney 0:e73fe93596e9 450 break;
jordanemonney 0:e73fe93596e9 451 case TX_TIMEOUT:
jordanemonney 0:e73fe93596e9 452 case TX_ERROR:
jordanemonney 0:e73fe93596e9 453 case TX_CRYPTO_ERROR:
jordanemonney 0:e73fe93596e9 454 case TX_SCHEDULING_ERROR:
jordanemonney 0:e73fe93596e9 455 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
jordanemonney 0:e73fe93596e9 456 if(countFailAck==5){ //IF more than 5 ackfail
jordanemonney 0:e73fe93596e9 457 moyESP = 4000; //Set esp in red
jordanemonney 0:e73fe93596e9 458 testEnd(); //end of the test
jordanemonney 0:e73fe93596e9 459 }
jordanemonney 0:e73fe93596e9 460 countFailAck++;
jordanemonney 0:e73fe93596e9 461 //Set blink led if ack fail
jordanemonney 0:e73fe93596e9 462 if(ledStart == 1){
jordanemonney 0:e73fe93596e9 463 ev_queue.cancel(id);
jordanemonney 0:e73fe93596e9 464 id = ev_queue.call_every(500, &toggleLed, myled1);
jordanemonney 0:e73fe93596e9 465 }
jordanemonney 0:e73fe93596e9 466 else if(ledStart == 3){
jordanemonney 0:e73fe93596e9 467 ev_queue.cancel(id);
jordanemonney 0:e73fe93596e9 468 id = ev_queue.call_every(500, &toggleLed, myled3);
jordanemonney 0:e73fe93596e9 469 }
jordanemonney 0:e73fe93596e9 470 else if(ledStart == 4){
jordanemonney 0:e73fe93596e9 471 ev_queue.cancel(id);
jordanemonney 0:e73fe93596e9 472 id = ev_queue.call_every(500, &toggleLed, myled4);
jordanemonney 0:e73fe93596e9 473 }
jordanemonney 0:e73fe93596e9 474 else{
jordanemonney 0:e73fe93596e9 475 ev_queue.cancel(id);
jordanemonney 0:e73fe93596e9 476 id = ev_queue.call_every(200, &toggleLed, myled4);
jordanemonney 0:e73fe93596e9 477 }
jordanemonney 0:e73fe93596e9 478 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
jordanemonney 0:e73fe93596e9 479 send_message();
jordanemonney 0:e73fe93596e9 480 }
jordanemonney 0:e73fe93596e9 481 break;
jordanemonney 0:e73fe93596e9 482 case RX_DONE:
spadaaa 2:b51532683489 483 // printf("\r\n Received message from Network Server \r\n");
jordanemonney 0:e73fe93596e9 484 receive_message();
jordanemonney 0:e73fe93596e9 485 break;
jordanemonney 0:e73fe93596e9 486 case RX_TIMEOUT:
jordanemonney 0:e73fe93596e9 487 case RX_ERROR:
jordanemonney 0:e73fe93596e9 488 printf("\r\n Error in reception - Code = %d \r\n", event);
jordanemonney 0:e73fe93596e9 489 break;
jordanemonney 0:e73fe93596e9 490 case JOIN_FAILURE:
jordanemonney 0:e73fe93596e9 491 printf("\r\n OTAA Failed - Check Keys \r\n");
jordanemonney 0:e73fe93596e9 492 testEnd();
jordanemonney 0:e73fe93596e9 493 break;
jordanemonney 0:e73fe93596e9 494 case UPLINK_REQUIRED:
jordanemonney 0:e73fe93596e9 495 printf("\r\n Uplink required by NS \r\n");
jordanemonney 0:e73fe93596e9 496 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
jordanemonney 0:e73fe93596e9 497 send_message();
jordanemonney 0:e73fe93596e9 498 }
jordanemonney 0:e73fe93596e9 499 break;
jordanemonney 0:e73fe93596e9 500 default:
jordanemonney 0:e73fe93596e9 501 MBED_ASSERT("Unknown Event");
jordanemonney 0:e73fe93596e9 502 }
jordanemonney 0:e73fe93596e9 503 }