Smartage application

Dependencies:   BufferedSerial SX1276GenericLib USBDeviceHT mbed Crypto X_NUCLEO_IKS01A2

Fork of STM32L0_LoRa by Helmut Tschemernjak

Committer:
marcozecchini
Date:
Mon Sep 17 22:16:48 2018 +0000
Revision:
34:8393ded26b4f
Parent:
33:4aacefcb2b48
Bug fixed 4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcozecchini 19:7763501775e5 1 #include "mbed.h"
marcozecchini 19:7763501775e5 2 #include "PinMap.h"
marcozecchini 19:7763501775e5 3 #include "smartage.h"
marcozecchini 19:7763501775e5 4 #include "sx1276-mbed-hal.h"
marcozecchini 19:7763501775e5 5 #include "main.h"
marcozecchini 27:d308dd4d8f51 6 #include "Crypto.h"
marcozecchini 19:7763501775e5 7
marcozecchini 19:7763501775e5 8 #ifdef FEATURE_LORA
marcozecchini 19:7763501775e5 9
marcozecchini 19:7763501775e5 10 /* Set this flag to '1' to display debug messages on the console */
marcozecchini 19:7763501775e5 11 #define DEBUG_MESSAGE 1
marcozecchini 19:7763501775e5 12
marcozecchini 19:7763501775e5 13 #define USE_MODEM_LORA 1
marcozecchini 19:7763501775e5 14 #define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz
marcozecchini 19:7763501775e5 15 #define TX_OUTPUT_POWER 14 // 14 dBm
marcozecchini 19:7763501775e5 16
marcozecchini 19:7763501775e5 17 #if USE_MODEM_LORA == 1
marcozecchini 19:7763501775e5 18
marcozecchini 19:7763501775e5 19 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
marcozecchini 19:7763501775e5 20 #define LORA_SPREADING_FACTOR LORA_SF7
marcozecchini 19:7763501775e5 21 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
marcozecchini 19:7763501775e5 22
marcozecchini 19:7763501775e5 23 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
marcozecchini 19:7763501775e5 24 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
marcozecchini 19:7763501775e5 25 #define LORA_FIX_LENGTH_PAYLOAD_ON false
marcozecchini 19:7763501775e5 26 #define LORA_FHSS_ENABLED false
marcozecchini 19:7763501775e5 27 #define LORA_NB_SYMB_HOP 4
marcozecchini 19:7763501775e5 28 #define LORA_IQ_INVERSION_ON false
marcozecchini 19:7763501775e5 29 #define LORA_CRC_ENABLED true
marcozecchini 33:4aacefcb2b48 30
marcozecchini 19:7763501775e5 31 #else
marcozecchini 19:7763501775e5 32 #error "Please define a modem in the compiler options."
marcozecchini 19:7763501775e5 33 #endif
marcozecchini 19:7763501775e5 34
marcozecchini 19:7763501775e5 35 #define WHILE_QUANTITY 5
marcozecchini 19:7763501775e5 36 #define RX_TIMEOUT_VALUE 3500 // in ms
marcozecchini 19:7763501775e5 37
marcozecchini 19:7763501775e5 38 //#define BUFFER_SIZE 32 // Define the payload size here
marcozecchini 19:7763501775e5 39 #define BUFFER_SIZE 64 // Define the payload size here
marcozecchini 19:7763501775e5 40
marcozecchini 19:7763501775e5 41 /*
marcozecchini 19:7763501775e5 42 * Global variables declarations
marcozecchini 19:7763501775e5 43 */
marcozecchini 19:7763501775e5 44 typedef enum
marcozecchini 19:7763501775e5 45 {
marcozecchini 19:7763501775e5 46 LOWPOWER = 0,
marcozecchini 19:7763501775e5 47 IDLE,
marcozecchini 19:7763501775e5 48 RX,
marcozecchini 19:7763501775e5 49 TX,
marcozecchini 19:7763501775e5 50 TX_TIMEOUT,
marcozecchini 19:7763501775e5 51 DO_TX,
marcozecchini 19:7763501775e5 52 CAD,
marcozecchini 19:7763501775e5 53 CAD_DONE
marcozecchini 19:7763501775e5 54 } AppStates_t;
marcozecchini 19:7763501775e5 55
marcozecchini 19:7763501775e5 56 volatile AppStates_t State = LOWPOWER;
marcozecchini 19:7763501775e5 57
marcozecchini 19:7763501775e5 58 /*!
marcozecchini 19:7763501775e5 59 * Radio events function pointer
marcozecchini 19:7763501775e5 60 */
marcozecchini 19:7763501775e5 61 static RadioEvents_t RadioEvents;
marcozecchini 19:7763501775e5 62
marcozecchini 19:7763501775e5 63 /*
marcozecchini 19:7763501775e5 64 * Global variables declarations
marcozecchini 19:7763501775e5 65 */
marcozecchini 19:7763501775e5 66 SX1276Generic *Radio;
marcozecchini 19:7763501775e5 67
marcozecchini 19:7763501775e5 68 uint16_t BufferSize = BUFFER_SIZE;
marcozecchini 19:7763501775e5 69 uint8_t *Buffer;
marcozecchini 27:d308dd4d8f51 70 unsigned char myKEY[16] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,};
marcozecchini 27:d308dd4d8f51 71 unsigned char myIV[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, } ;
marcozecchini 28:9d7be893610d 72 const uint8_t ack[] = { 0xff, 0xff, 0x00, 0x00, 'A', 'C', 'K', '!'};
marcozecchini 19:7763501775e5 73
marcozecchini 19:7763501775e5 74 DigitalOut *led3;
marcozecchini 19:7763501775e5 75 void print_stuff(){
marcozecchini 19:7763501775e5 76 dprintf("Smartage Application" );
marcozecchini 19:7763501775e5 77 dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
marcozecchini 19:7763501775e5 78 dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
marcozecchini 19:7763501775e5 79 #if USE_MODEM_LORA == 1
marcozecchini 19:7763501775e5 80 dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
marcozecchini 19:7763501775e5 81 dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
marcozecchini 19:7763501775e5 82 #elif USE_MODEM_FSK == 1
marcozecchini 19:7763501775e5 83 dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
marcozecchini 19:7763501775e5 84 dprintf("Baudrate: %d", FSK_DATARATE);
marcozecchini 19:7763501775e5 85 #endif
marcozecchini 19:7763501775e5 86 }
marcozecchini 19:7763501775e5 87
marcozecchini 24:bb733d746bda 88 void SendAndBack(uint8_t* str, uint8_t* empty_distance, uint8_t* temperature, bool tilt_status)
marcozecchini 19:7763501775e5 89 {
marcozecchini 33:4aacefcb2b48 90 #if defined(TARGET_DISCO_L072CZ_LRWAN1)
marcozecchini 19:7763501775e5 91 DigitalOut *led = new DigitalOut(LED4); // RX red
marcozecchini 19:7763501775e5 92 led3 = new DigitalOut(LED3); // TX blue
marcozecchini 19:7763501775e5 93 #else
marcozecchini 19:7763501775e5 94 DigitalOut *led = new DigitalOut(LED1);
marcozecchini 19:7763501775e5 95 led3 = led;
marcozecchini 19:7763501775e5 96 #endif
marcozecchini 19:7763501775e5 97
marcozecchini 19:7763501775e5 98 Buffer = new uint8_t[BUFFER_SIZE];
marcozecchini 19:7763501775e5 99 *led3 = 1;
marcozecchini 19:7763501775e5 100
marcozecchini 19:7763501775e5 101 #ifdef B_L072Z_LRWAN1_LORA
marcozecchini 19:7763501775e5 102 Radio = new SX1276Generic(NULL, MURATA_SX1276,
marcozecchini 19:7763501775e5 103 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
marcozecchini 19:7763501775e5 104 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
marcozecchini 19:7763501775e5 105 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
marcozecchini 19:7763501775e5 106 #endif
marcozecchini 19:7763501775e5 107 uint8_t i;
marcozecchini 19:7763501775e5 108 // Initialize Radio driver
marcozecchini 19:7763501775e5 109 RadioEvents.TxDone = OnTxDone;
marcozecchini 19:7763501775e5 110 RadioEvents.RxDone = OnRxDone;
marcozecchini 19:7763501775e5 111 RadioEvents.RxError = OnRxError;
marcozecchini 19:7763501775e5 112 RadioEvents.TxTimeout = OnTxTimeout;
marcozecchini 19:7763501775e5 113 RadioEvents.RxTimeout = OnRxTimeout;
marcozecchini 19:7763501775e5 114 if (Radio->Init( &RadioEvents ) == false) {
marcozecchini 19:7763501775e5 115 while(1) {
marcozecchini 19:7763501775e5 116 dprintf("Radio could not be detected!");
marcozecchini 19:7763501775e5 117 wait( 1 );
marcozecchini 19:7763501775e5 118 }
marcozecchini 19:7763501775e5 119 }
marcozecchini 19:7763501775e5 120
marcozecchini 19:7763501775e5 121
marcozecchini 19:7763501775e5 122 switch(Radio->DetectBoardType()) {
marcozecchini 19:7763501775e5 123 case MURATA_SX1276:
marcozecchini 19:7763501775e5 124 if (DEBUG_MESSAGE)
marcozecchini 19:7763501775e5 125 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
marcozecchini 19:7763501775e5 126 break;
marcozecchini 19:7763501775e5 127 default:
marcozecchini 19:7763501775e5 128 dprintf(" > Board Type: unknown <");
marcozecchini 19:7763501775e5 129 }
marcozecchini 19:7763501775e5 130
marcozecchini 19:7763501775e5 131 Radio->SetChannel(RF_FREQUENCY );
marcozecchini 19:7763501775e5 132
marcozecchini 19:7763501775e5 133 #if USE_MODEM_LORA == 1
marcozecchini 19:7763501775e5 134
marcozecchini 19:7763501775e5 135 if (LORA_FHSS_ENABLED)
marcozecchini 19:7763501775e5 136 dprintf(" > LORA FHSS Mode <");
marcozecchini 19:7763501775e5 137 if (!LORA_FHSS_ENABLED)
marcozecchini 19:7763501775e5 138 dprintf(" > LORA Mode <");
marcozecchini 19:7763501775e5 139
marcozecchini 19:7763501775e5 140 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
marcozecchini 19:7763501775e5 141 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
marcozecchini 19:7763501775e5 142 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
marcozecchini 19:7763501775e5 143 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
marcozecchini 19:7763501775e5 144 LORA_IQ_INVERSION_ON, 2000 );
marcozecchini 19:7763501775e5 145
marcozecchini 19:7763501775e5 146 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
marcozecchini 19:7763501775e5 147 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
marcozecchini 19:7763501775e5 148 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
marcozecchini 19:7763501775e5 149 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
marcozecchini 19:7763501775e5 150 LORA_IQ_INVERSION_ON, true );
marcozecchini 33:4aacefcb2b48 151
marcozecchini 19:7763501775e5 152 #else
marcozecchini 19:7763501775e5 153
marcozecchini 19:7763501775e5 154 #error "Please define a modem in the compiler options."
marcozecchini 19:7763501775e5 155
marcozecchini 19:7763501775e5 156 #endif
marcozecchini 19:7763501775e5 157
marcozecchini 19:7763501775e5 158 if (DEBUG_MESSAGE)
marcozecchini 19:7763501775e5 159 dprintf("Sending the message ... ");
marcozecchini 19:7763501775e5 160
marcozecchini 19:7763501775e5 161
marcozecchini 19:7763501775e5 162 Radio->Rx( RX_TIMEOUT_VALUE ); //CHIAMERà il timeout rx da cui poi chiamo DO_TX case.
marcozecchini 19:7763501775e5 163
marcozecchini 19:7763501775e5 164 int trasmission_routine = 0;
marcozecchini 27:d308dd4d8f51 165 AES myAES(AES_128, myKEY, myIV);
marcozecchini 19:7763501775e5 166 while (trasmission_routine<=WHILE_QUANTITY){
marcozecchini 19:7763501775e5 167 switch( State )
marcozecchini 19:7763501775e5 168 {
marcozecchini 19:7763501775e5 169 case RX:
marcozecchini 19:7763501775e5 170 //SE RICEVO HO GIà STAMPATO IL MESSAGGIO QUINDI DEVO SOLO USCIRE
marcozecchini 19:7763501775e5 171 *led3 = 0;
marcozecchini 19:7763501775e5 172
marcozecchini 19:7763501775e5 173 if( BufferSize > 0 )
marcozecchini 19:7763501775e5 174 {
marcozecchini 19:7763501775e5 175 //setto trasmission_routine a un valore maggiore di quello necessario per rimanere nel ciclo
marcozecchini 19:7763501775e5 176 trasmission_routine = WHILE_QUANTITY+1;
marcozecchini 19:7763501775e5 177 }
marcozecchini 19:7763501775e5 178 State = LOWPOWER;
marcozecchini 19:7763501775e5 179 break;
marcozecchini 19:7763501775e5 180 case DO_TX:
marcozecchini 19:7763501775e5 181 *led3 = 1;
marcozecchini 24:bb733d746bda 182
marcozecchini 19:7763501775e5 183 // We fill the buffer with numbers for the payload
marcozecchini 24:bb733d746bda 184 Buffer[4]='G';
marcozecchini 24:bb733d746bda 185 Buffer[5]='C';
marcozecchini 24:bb733d746bda 186 Buffer[6]='-';
marcozecchini 24:bb733d746bda 187 Buffer[7]='1';
marcozecchini 24:bb733d746bda 188 i += 4;
marcozecchini 24:bb733d746bda 189 // Then it follows the distance
marcozecchini 24:bb733d746bda 190 memcpy(Buffer, str, sizeof(str));
marcozecchini 24:bb733d746bda 191 i += 4;
marcozecchini 24:bb733d746bda 192 // Then it follows the empty distance
marcozecchini 24:bb733d746bda 193 memcpy(Buffer+8, empty_distance, sizeof(empty_distance));
marcozecchini 24:bb733d746bda 194 i+= 4;
marcozecchini 24:bb733d746bda 195 // Then temperature ...
marcozecchini 24:bb733d746bda 196 memcpy(Buffer+12, temperature, sizeof(temperature));
marcozecchini 24:bb733d746bda 197 i +=4;
marcozecchini 24:bb733d746bda 198
marcozecchini 24:bb733d746bda 199 //Finally, tilt status
marcozecchini 24:bb733d746bda 200 if (tilt_status){
marcozecchini 24:bb733d746bda 201 Buffer[16] = 'T';
marcozecchini 24:bb733d746bda 202 Buffer[17] = 'I';
marcozecchini 24:bb733d746bda 203 Buffer[18] = 'L';
marcozecchini 24:bb733d746bda 204 Buffer[19] = 'T';
marcozecchini 24:bb733d746bda 205
marcozecchini 24:bb733d746bda 206 }
marcozecchini 24:bb733d746bda 207 else{
marcozecchini 24:bb733d746bda 208 Buffer[16] = 'F';
marcozecchini 24:bb733d746bda 209 Buffer[17] = 'I';
marcozecchini 24:bb733d746bda 210 Buffer[18] = 'N';
marcozecchini 24:bb733d746bda 211 Buffer[19] = 'E';
marcozecchini 24:bb733d746bda 212
marcozecchini 24:bb733d746bda 213 }
marcozecchini 24:bb733d746bda 214 i += 4;
marcozecchini 24:bb733d746bda 215
marcozecchini 24:bb733d746bda 216 for( i; i < BufferSize; i++ )
marcozecchini 19:7763501775e5 217 {
marcozecchini 21:5d64f9f79190 218 Buffer[i] = i - sizeof(str)+4;
marcozecchini 19:7763501775e5 219 }
marcozecchini 21:5d64f9f79190 220 dump("Check: ", Buffer, BufferSize);
marcozecchini 27:d308dd4d8f51 221 myAES.encrypt(Buffer, Buffer, BufferSize);
marcozecchini 27:d308dd4d8f51 222 dump("Crypto: ", Buffer, BufferSize);
marcozecchini 19:7763501775e5 223 wait_ms( 10 );
marcozecchini 19:7763501775e5 224 Radio->Send( Buffer, BufferSize );
marcozecchini 19:7763501775e5 225 trasmission_routine += 1;
marcozecchini 19:7763501775e5 226 State = LOWPOWER;
marcozecchini 19:7763501775e5 227 break;
marcozecchini 19:7763501775e5 228 case TX:
marcozecchini 19:7763501775e5 229 Radio->Rx( RX_TIMEOUT_VALUE );
marcozecchini 19:7763501775e5 230 State = LOWPOWER;
marcozecchini 19:7763501775e5 231 break;
marcozecchini 19:7763501775e5 232 case TX_TIMEOUT:
marcozecchini 19:7763501775e5 233 Radio->Rx( RX_TIMEOUT_VALUE );
marcozecchini 19:7763501775e5 234 State = LOWPOWER;
marcozecchini 19:7763501775e5 235 break;
marcozecchini 19:7763501775e5 236 case LOWPOWER:
marcozecchini 19:7763501775e5 237 sleep();
marcozecchini 19:7763501775e5 238 break;
marcozecchini 19:7763501775e5 239 default:
marcozecchini 19:7763501775e5 240 State = LOWPOWER;
marcozecchini 19:7763501775e5 241 break;
marcozecchini 19:7763501775e5 242 }
marcozecchini 19:7763501775e5 243 }
marcozecchini 19:7763501775e5 244 dprintf("> Finished!");
marcozecchini 23:5d46bbe685a1 245 //wait for a bit - in seconds.
marcozecchini 26:d93f1206909c 246 wait(10.0f);
marcozecchini 20:1557c9d9c183 247 //destroy led led3 e Buffer e radio
marcozecchini 20:1557c9d9c183 248 delete(led);
marcozecchini 21:5d64f9f79190 249 delete(led3);
marcozecchini 20:1557c9d9c183 250 delete(Buffer);
marcozecchini 20:1557c9d9c183 251 delete(Radio);
marcozecchini 19:7763501775e5 252 }
marcozecchini 19:7763501775e5 253
marcozecchini 19:7763501775e5 254 void OnTxDone(void *radio, void *userThisPtr, void *userData)
marcozecchini 19:7763501775e5 255 {
marcozecchini 19:7763501775e5 256 Radio->Sleep( );
marcozecchini 19:7763501775e5 257 State = TX;
marcozecchini 19:7763501775e5 258 if (DEBUG_MESSAGE)
marcozecchini 19:7763501775e5 259 dprintf("> OnTxDone");
marcozecchini 19:7763501775e5 260 }
marcozecchini 19:7763501775e5 261
marcozecchini 19:7763501775e5 262 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
marcozecchini 19:7763501775e5 263 {
marcozecchini 28:9d7be893610d 264 if(memcmp(payload, ack, 8) == 0) {
marcozecchini 28:9d7be893610d 265 Radio->Sleep( );
marcozecchini 28:9d7be893610d 266 BufferSize = size;
marcozecchini 28:9d7be893610d 267 memcpy( Buffer, payload, BufferSize );
marcozecchini 28:9d7be893610d 268 State = RX;
marcozecchini 28:9d7be893610d 269 if (DEBUG_MESSAGE)
marcozecchini 28:9d7be893610d 270 dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
marcozecchini 28:9d7be893610d 271 //dump("Data:", payload, size);
marcozecchini 28:9d7be893610d 272 }
marcozecchini 19:7763501775e5 273 }
marcozecchini 19:7763501775e5 274
marcozecchini 19:7763501775e5 275 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
marcozecchini 19:7763501775e5 276 {
marcozecchini 19:7763501775e5 277 *led3 = 0;
marcozecchini 19:7763501775e5 278 Radio->Sleep( );
marcozecchini 19:7763501775e5 279 State = TX_TIMEOUT;
marcozecchini 19:7763501775e5 280 if(DEBUG_MESSAGE)
marcozecchini 19:7763501775e5 281 dprintf("> OnTxTimeout");
marcozecchini 19:7763501775e5 282 }
marcozecchini 19:7763501775e5 283
marcozecchini 19:7763501775e5 284 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
marcozecchini 19:7763501775e5 285 {
marcozecchini 19:7763501775e5 286 *led3 = 0;
marcozecchini 19:7763501775e5 287 Radio->Sleep( );
marcozecchini 19:7763501775e5 288 Buffer[BufferSize-1] = 0;
marcozecchini 19:7763501775e5 289 State = DO_TX;
marcozecchini 24:bb733d746bda 290 Radio->Rx( RX_TIMEOUT_VALUE );
marcozecchini 19:7763501775e5 291 if (DEBUG_MESSAGE)
marcozecchini 19:7763501775e5 292 dprintf("> OnRxTimeout");
marcozecchini 19:7763501775e5 293 }
marcozecchini 19:7763501775e5 294
marcozecchini 19:7763501775e5 295 void OnRxError(void *radio, void *userThisPtr, void *userData)
marcozecchini 19:7763501775e5 296 {
marcozecchini 19:7763501775e5 297 Radio->Sleep( );
marcozecchini 19:7763501775e5 298 State = DO_TX;
marcozecchini 19:7763501775e5 299 if (DEBUG_MESSAGE)
marcozecchini 19:7763501775e5 300 dprintf("> OnRxError");
marcozecchini 19:7763501775e5 301 }
marcozecchini 19:7763501775e5 302
marcozecchini 19:7763501775e5 303 #endif