Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
FCH_31
Date:
Mon Oct 22 09:37:50 2018 +0000
Revision:
41:5a436163dddf
Parent:
Lora.cpp@13:5414193da1de
avec radio;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FCH_31 8:cd489b7c49a0 1 /*
FCH_31 8:cd489b7c49a0 2 * MISNet
FCH_31 8:cd489b7c49a0 3 *
FCH_31 8:cd489b7c49a0 4 * Lora: Radio Management
FCH_31 8:cd489b7c49a0 5 *
FCH_31 8:cd489b7c49a0 6 * Created on: August 17, 2018 Author: Francis CHATAIN
FCH_31 8:cd489b7c49a0 7 *
FCH_31 8:cd489b7c49a0 8 */
FCH_31 8:cd489b7c49a0 9
FCH_31 8:cd489b7c49a0 10
FCH_31 8:cd489b7c49a0 11 // ===================================== Includes
FCH_31 8:cd489b7c49a0 12 #include "Lora.h"
FCH_31 8:cd489b7c49a0 13 #include "mbed.h"
FCH_31 8:cd489b7c49a0 14 #include "main.h"
FCH_31 8:cd489b7c49a0 15 #include "sx1280-hal.h"
FCH_31 8:cd489b7c49a0 16
FCH_31 8:cd489b7c49a0 17 // ========================================================================== DEFINE
FCH_31 8:cd489b7c49a0 18 #define MODE_LORA // Lora modulation
FCH_31 8:cd489b7c49a0 19
FCH_31 8:cd489b7c49a0 20 #define TX_TIMEOUT_VALUE 100 // ms Number of tick size steps for tx timeout
FCH_31 8:cd489b7c49a0 21 #define RX_TIMEOUT_VALUE 100 // ms Number of tick size steps for rx timeout
FCH_31 8:cd489b7c49a0 22 #define RX_TIMEOUT_TICK_SIZE RADIO_TICK_SIZE_1000_US // Size of ticks (used for Tx and Rx timeout)
FCH_31 8:cd489b7c49a0 23 #define MODE_ADDR 0x8000
FCH_31 8:cd489b7c49a0 24
FCH_31 8:cd489b7c49a0 25
FCH_31 8:cd489b7c49a0 26 // ========================================================================== HW
FCH_31 8:cd489b7c49a0 27 DigitalOut F_CS ( D6 ) ; // MBED description of pin
FCH_31 8:cd489b7c49a0 28 DigitalOut SD_CS ( D8 ) ; // MBED description of pin
FCH_31 8:cd489b7c49a0 29 DigitalOut ANT_SW ( A3 ) ;
FCH_31 8:cd489b7c49a0 30 DigitalOut TxLed ( A4 ) ;
FCH_31 8:cd489b7c49a0 31 DigitalOut RxLed ( A5 ) ;
FCH_31 8:cd489b7c49a0 32
FCH_31 8:cd489b7c49a0 33
FCH_31 8:cd489b7c49a0 34 // ========================================================================== VARIABLES
FCH_31 8:cd489b7c49a0 35 uint16_t RxIrqMask ; // Mask of IRQs to listen to in rx mode
FCH_31 8:cd489b7c49a0 36 uint16_t TxIrqMask ; // Mask of IRQs to listen to in tx mode
FCH_31 8:cd489b7c49a0 37
FCH_31 8:cd489b7c49a0 38
FCH_31 8:cd489b7c49a0 39 uint32_t valueTimeTx ;
FCH_31 8:cd489b7c49a0 40 uint32_t valueTimeLoop ;
FCH_31 8:cd489b7c49a0 41
FCH_31 8:cd489b7c49a0 42 int dataCounter = 0 ;
FCH_31 8:cd489b7c49a0 43 uint8_t oldFreq ;
FCH_31 8:cd489b7c49a0 44 uint8_t oldBw ;
FCH_31 8:cd489b7c49a0 45 uint8_t oldPwr ;
FCH_31 8:cd489b7c49a0 46 uint8_t oldSf ;
FCH_31 8:cd489b7c49a0 47 uint8_t oldTimer ;
FCH_31 8:cd489b7c49a0 48
FCH_31 8:cd489b7c49a0 49 // States of the application
FCH_31 8:cd489b7c49a0 50 typedef enum { APP_LOWPOWER, APP_RX, APP_RX_TIMEOUT, APP_RX_ERROR, APP_TX, APP_TX_TIMEOUT, } AppStates_t ;
FCH_31 8:cd489b7c49a0 51 AppStates_t AppState = APP_LOWPOWER; // Init State of the application
FCH_31 8:cd489b7c49a0 52
FCH_31 8:cd489b7c49a0 53 PacketStatus_t PacketStatus ;
FCH_31 8:cd489b7c49a0 54 int8_t RssiValue = 0 ;
FCH_31 8:cd489b7c49a0 55 int8_t SnrValue = 0 ;
FCH_31 8:cd489b7c49a0 56
FCH_31 8:cd489b7c49a0 57 ModulationParams_t modulationParams;
FCH_31 8:cd489b7c49a0 58 PacketParams_t PacketParams ; // Locals parameters and status for radio API
FCH_31 8:cd489b7c49a0 59 PacketStatus_t packetStatus ; // NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING
FCH_31 8:cd489b7c49a0 60
FCH_31 8:cd489b7c49a0 61 uint32_t RF_FREQUENCY ; // HzNominal frequency
FCH_31 8:cd489b7c49a0 62 RadioLoRaBandwidths_t LORA_BW ; /* 200; 400; 800; 1600 */
FCH_31 8:cd489b7c49a0 63 RadioLoRaSpreadingFactors_t LORA_SF ; /* SF5; SF6=; SF7; SF8 ; SF9; SF10; SF11 ; SF12 */
FCH_31 8:cd489b7c49a0 64 int8_t TX_OUTPUT_POWER ; /* Output power in dBm [-18..+13] dBm */
FCH_31 8:cd489b7c49a0 65 uint8_t BUFFER_SIZE_MAX ; /* Payload size max */
FCH_31 8:cd489b7c49a0 66 int16_t TIMER ; /* timer entre reemission en ms */
FCH_31 8:cd489b7c49a0 67 uint8_t BUFFER_SIZE_MIN ; /* Payload return size */
FCH_31 8:cd489b7c49a0 68
FCH_31 8:cd489b7c49a0 69
FCH_31 8:cd489b7c49a0 70 // ========================================================================== Function
FCH_31 8:cd489b7c49a0 71 void initRadio () ;
FCH_31 8:cd489b7c49a0 72 void setRadioTx () ;
FCH_31 8:cd489b7c49a0 73 void setRadioRx () ;
FCH_31 8:cd489b7c49a0 74 void watchDogRxCRNoReceived () ;
FCH_31 8:cd489b7c49a0 75
FCH_31 8:cd489b7c49a0 76
FCH_31 8:cd489b7c49a0 77
FCH_31 8:cd489b7c49a0 78 Timer timerRadio ;
FCH_31 8:cd489b7c49a0 79 Timeout watchDogRx ;
FCH_31 8:cd489b7c49a0 80 Timeout watchDogTx ;
FCH_31 8:cd489b7c49a0 81
FCH_31 8:cd489b7c49a0 82 void OnTxDone ( void ); // Function to be executed on Radio Tx Done event
FCH_31 8:cd489b7c49a0 83 void OnRxDone ( void ); // Function to be executed on Radio Rx Done event
FCH_31 8:cd489b7c49a0 84 void OnTxTimeout ( void ); // Function executed on Radio Tx Timeout event
FCH_31 8:cd489b7c49a0 85 void OnRxTimeout ( void ); // Function executed on Radio Rx Timeout event
FCH_31 8:cd489b7c49a0 86 void OnRxError ( IrqErrorCode_t ); // Function executed on Radio Rx Error event
FCH_31 8:cd489b7c49a0 87
FCH_31 8:cd489b7c49a0 88 RadioCallbacks_t callbacks = {
FCH_31 8:cd489b7c49a0 89 &OnTxDone, // txDone
FCH_31 8:cd489b7c49a0 90 &OnRxDone, // rxDone
FCH_31 8:cd489b7c49a0 91 NULL, // syncWordDone
FCH_31 8:cd489b7c49a0 92 NULL, // headerDone
FCH_31 8:cd489b7c49a0 93 &OnTxTimeout, // txTimeout
FCH_31 8:cd489b7c49a0 94 &OnRxTimeout, // rxTimeout
FCH_31 8:cd489b7c49a0 95 &OnRxError, // rxError
FCH_31 8:cd489b7c49a0 96 NULL, // rangingDone
FCH_31 8:cd489b7c49a0 97 NULL, // cadDone
FCH_31 8:cd489b7c49a0 98 };
FCH_31 8:cd489b7c49a0 99
FCH_31 8:cd489b7c49a0 100 // mosi, miso, sclk, nss, busy , dio1 , dio2, dio3, rst , callbacks...
FCH_31 8:cd489b7c49a0 101 SX1280Hal Radio ( D11 , D12 , D13 , D7 , D3 , D5 , NC , NC , A0 , &callbacks );
FCH_31 8:cd489b7c49a0 102
FCH_31 8:cd489b7c49a0 103
FCH_31 8:cd489b7c49a0 104
FCH_31 8:cd489b7c49a0 105 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 106 void initLora (uint32_t rf,RadioLoRaBandwidths_t bw,RadioLoRaSpreadingFactors_t sf,int8_t pwr)
FCH_31 8:cd489b7c49a0 107 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 108 {
FCH_31 8:cd489b7c49a0 109 // Default value initialisation
FCH_31 8:cd489b7c49a0 110 printf( "*** LORA *** Lora Initialisation \r\n");
FCH_31 8:cd489b7c49a0 111
FCH_31 8:cd489b7c49a0 112 RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in rx mode
FCH_31 8:cd489b7c49a0 113 TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT; // Mask of IRQs to listen to in tx mode
FCH_31 8:cd489b7c49a0 114
FCH_31 8:cd489b7c49a0 115 RF_FREQUENCY = rf ; // HzNominal frequency
FCH_31 8:cd489b7c49a0 116 LORA_BW = bw ; /* 200; 400; 800; 1600 */
FCH_31 8:cd489b7c49a0 117 LORA_SF = sf ; /* SF5; SF6=; SF7; SF8 ; SF9; SF10; SF11 ; SF12 */
FCH_31 8:cd489b7c49a0 118 TX_OUTPUT_POWER = pwr ; /* Output power in dBm [-18..+13] dBm */
FCH_31 8:cd489b7c49a0 119 BUFFER_SIZE_MAX = 100 ; /* Payload size max */
patrick_duc 13:5414193da1de 120 BUFFER_SIZE_MIN = 5 ; /* Payload return size */
FCH_31 8:cd489b7c49a0 121 TIMER = 1000 ; /* timer entre reemission en ms */
FCH_31 8:cd489b7c49a0 122
FCH_31 8:cd489b7c49a0 123
FCH_31 8:cd489b7c49a0 124
FCH_31 8:cd489b7c49a0 125 Radio.Reset () ;
FCH_31 8:cd489b7c49a0 126 Radio.Init () ;
FCH_31 8:cd489b7c49a0 127 initRadio () ;
FCH_31 8:cd489b7c49a0 128 Radio.SetRegulatorMode ( USE_DCDC ) ; // Can also be set in LDO mode but consume more power
FCH_31 8:cd489b7c49a0 129 wait_ms ( 10 ) ; // wait for on board DC/DC start-up time
FCH_31 8:cd489b7c49a0 130
FCH_31 8:cd489b7c49a0 131 TxLed = 0 ;
FCH_31 8:cd489b7c49a0 132 RxLed = 0 ;
FCH_31 8:cd489b7c49a0 133
FCH_31 8:cd489b7c49a0 134 }
FCH_31 8:cd489b7c49a0 135
FCH_31 8:cd489b7c49a0 136
FCH_31 8:cd489b7c49a0 137 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 138 void sendMessageLora () {
FCH_31 8:cd489b7c49a0 139 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 140 uint8_t Buffer [BUFFER_SIZE_MAX] ; // Buffer
FCH_31 8:cd489b7c49a0 141 char frameMISNET [BUFFER_SIZE_MAX] ; // Misnet Frame
FCH_31 8:cd489b7c49a0 142 uint8_t *pointer ;
FCH_31 8:cd489b7c49a0 143 char *ptr_int ;
FCH_31 8:cd489b7c49a0 144
FCH_31 8:cd489b7c49a0 145
FCH_31 8:cd489b7c49a0 146 dataCounter = dataCounter + 1 ;
FCH_31 8:cd489b7c49a0 147 memset ( &Buffer , 0x00, BUFFER_SIZE_MAX );
FCH_31 8:cd489b7c49a0 148 memset ( &frameMISNET , 0x00, BUFFER_SIZE_MAX );
FCH_31 8:cd489b7c49a0 149
FCH_31 8:cd489b7c49a0 150
FCH_31 8:cd489b7c49a0 151 uint16_t clearPart = 0x0 ;
FCH_31 8:cd489b7c49a0 152
FCH_31 8:cd489b7c49a0 153 uint32_t servicePayload = 0x0 ;
FCH_31 8:cd489b7c49a0 154 //char serviceMessage[16] ; // TRACES
FCH_31 8:cd489b7c49a0 155
FCH_31 8:cd489b7c49a0 156 uint8_t SFT = 0 ;
FCH_31 8:cd489b7c49a0 157 uint8_t DFT = 0 ;
FCH_31 8:cd489b7c49a0 158 uint8_t FDL = 8 ;
FCH_31 8:cd489b7c49a0 159 uint8_t BL = 7 ;
FCH_31 8:cd489b7c49a0 160 uint8_t DMI = 66 ;
FCH_31 8:cd489b7c49a0 161 uint16_t RCA = 0xBEEF & 0x7FFF ;
FCH_31 8:cd489b7c49a0 162 uint32_t MIC = 0xCAFECAFE & 0xFFFFFFFF ;
FCH_31 8:cd489b7c49a0 163
FCH_31 8:cd489b7c49a0 164
FCH_31 8:cd489b7c49a0 165 clearPart = MODE_ADDR | ( ID_TERMINAL << 6 ) | ID_GATEWAY ;
FCH_31 8:cd489b7c49a0 166 printf( "*** LORA *** CLEAR PART= %8X \r\n ", clearPart);
FCH_31 8:cd489b7c49a0 167
FCH_31 8:cd489b7c49a0 168 servicePayload = (uint32_t)( (SFT & 0x03) << 30) |
FCH_31 8:cd489b7c49a0 169 (uint32_t)( (DFT & 0x03) << 28) |
FCH_31 8:cd489b7c49a0 170 (uint32_t)( (FDL & 0x3F) << 22) |
FCH_31 8:cd489b7c49a0 171 (uint32_t)( (BL & 0x07) << 19) |
FCH_31 8:cd489b7c49a0 172 (uint32_t)( (DMI & 0xFF) << 11) |
FCH_31 8:cd489b7c49a0 173 (RCA & 0x7FF) ;
FCH_31 8:cd489b7c49a0 174
FCH_31 8:cd489b7c49a0 175 //sprintf (serviceMessage, "%08X%08X", servicePayload, MIC) ; // traces
FCH_31 8:cd489b7c49a0 176 //printf( "*** LORA *** SERVICE Payload = %08X \r\n ", servicePayload);
FCH_31 8:cd489b7c49a0 177 //printf( "*** LORA *** SERVICE MIC = %08X \r\n ", MIC);
FCH_31 8:cd489b7c49a0 178
FCH_31 8:cd489b7c49a0 179 // CLEAR PART + Indianess correction
FCH_31 8:cd489b7c49a0 180 pointer = (uint8_t*) &clearPart ; for (int i = 0, j=1 ; i<2 ; i++, j--) frameMISNET[j] = pointer[i] ;
FCH_31 8:cd489b7c49a0 181
FCH_31 8:cd489b7c49a0 182 // SERVICE + Indianess correction
FCH_31 8:cd489b7c49a0 183 pointer = (uint8_t*) &servicePayload ; for (int i=0, j=3 ; i<4 ; i++, j--) frameMISNET[2+i] = pointer[j] ;
FCH_31 8:cd489b7c49a0 184 pointer = (uint8_t*) &MIC ; for (int i=0, j=3 ; i<4 ; i++, j--) frameMISNET[6+i] = pointer[j] ;
FCH_31 8:cd489b7c49a0 185
FCH_31 8:cd489b7c49a0 186 printf( "*** LORA *** START Buffer "); for (int i = 0 ; i<10 ; i++) printf ("%02X,", frameMISNET[i] ) ; printf( "\n") ;
FCH_31 8:cd489b7c49a0 187
FCH_31 8:cd489b7c49a0 188
FCH_31 8:cd489b7c49a0 189 int n = sprintf (frameMISNET, "%1c%1c", ID_TERMINAL, ID_GATEWAY);
FCH_31 8:cd489b7c49a0 190
FCH_31 8:cd489b7c49a0 191 pointer = (uint8_t*) &dataCounter ; for (int i = 0 ; i<4 ; i++) frameMISNET[2+i] = pointer[i] ;
FCH_31 8:cd489b7c49a0 192 //(int32*)&frameMISNET[2]=(int32*)&ptr_int; // -> aton OR ntoa
FCH_31 8:cd489b7c49a0 193
FCH_31 8:cd489b7c49a0 194 printf( "*** LORA *** TX SEND %05d ", dataCounter);
FCH_31 8:cd489b7c49a0 195 for (int i = 0 ; i<10 ; i++) printf ("%d,", frameMISNET[i] ) ; printf( "\n") ;
FCH_31 8:cd489b7c49a0 196
FCH_31 8:cd489b7c49a0 197
FCH_31 8:cd489b7c49a0 198 // Send SF, BW, COUNTER, POWER, FREQ, TIMETX, TIMELOOP, RSSIVALUE
FCH_31 8:cd489b7c49a0 199 frameMISNET[6] = LORA_SF ;
FCH_31 8:cd489b7c49a0 200 ptr_int = (char*) &LORA_BW ;
FCH_31 8:cd489b7c49a0 201 frameMISNET[7]= ptr_int[1] ;
FCH_31 8:cd489b7c49a0 202 frameMISNET[8]= ptr_int[0] ;
FCH_31 8:cd489b7c49a0 203 frameMISNET[9] = TX_OUTPUT_POWER ;
FCH_31 8:cd489b7c49a0 204 ptr_int = (char*) &RF_FREQUENCY ; for (int i = 0 ; i<4 ; i++) frameMISNET[10+i] = ptr_int[i] ;
FCH_31 8:cd489b7c49a0 205 ptr_int = (char*) &valueTimeTx ; for (int i = 0 ; i<4 ; i++) frameMISNET[14+i] = ptr_int[i] ; //printf( "*** LORA *** TimeTx %d %d ", valueTimeTx, valueTimeLoop); //delay temps Tx
FCH_31 8:cd489b7c49a0 206 ptr_int = (char*) &valueTimeLoop ; for (int i = 0 ; i<4 ; i++) frameMISNET[18+i] = ptr_int[i] ; //delay temps Loop
FCH_31 8:cd489b7c49a0 207 frameMISNET[22] = RssiValue ;
FCH_31 8:cd489b7c49a0 208
FCH_31 8:cd489b7c49a0 209 memcpy ( Buffer , frameMISNET , 23 );
FCH_31 8:cd489b7c49a0 210
FCH_31 8:cd489b7c49a0 211 valueTimeTx = 0 ;
FCH_31 8:cd489b7c49a0 212 valueTimeLoop = 0 ;
FCH_31 8:cd489b7c49a0 213 timerRadio.reset () ; // Record tile for close loop
FCH_31 8:cd489b7c49a0 214 timerRadio.start () ;
FCH_31 8:cd489b7c49a0 215 setRadioTx () ;
FCH_31 8:cd489b7c49a0 216 TxLed = 1 ;
FCH_31 8:cd489b7c49a0 217 PacketParams.Params.LoRa.PayloadLength = 23 ;
FCH_31 8:cd489b7c49a0 218 Radio.SetPacketParams ( &PacketParams ) ;
FCH_31 8:cd489b7c49a0 219 Radio.SendPayload ( Buffer , 23,( TickTime_t ) {RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE} );
FCH_31 8:cd489b7c49a0 220 TxLed = 0 ;
FCH_31 8:cd489b7c49a0 221
FCH_31 8:cd489b7c49a0 222 //printf( "*** LORA *** ARM watchDogRxRxRxRx \r\n" );
FCH_31 8:cd489b7c49a0 223 watchDogRx.attach (&watchDogRxCRNoReceived, 1.0); // Arm watchDogRx if the response is not received in less 500 ms => force retry
FCH_31 8:cd489b7c49a0 224 }
FCH_31 8:cd489b7c49a0 225 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 226
FCH_31 8:cd489b7c49a0 227
FCH_31 8:cd489b7c49a0 228 // Time out si pas de message de CR recu
FCH_31 8:cd489b7c49a0 229 void watchDogRxCRNoReceived () {
FCH_31 8:cd489b7c49a0 230 printf( "*** LORA *** watchDogRxNoReceive NO RESPONSE \r\n");
FCH_31 8:cd489b7c49a0 231 } // Force new emission
FCH_31 8:cd489b7c49a0 232
FCH_31 8:cd489b7c49a0 233
FCH_31 8:cd489b7c49a0 234
FCH_31 8:cd489b7c49a0 235
FCH_31 8:cd489b7c49a0 236 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 237 void initRadio () {
FCH_31 8:cd489b7c49a0 238 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 239 F_CS = 1 ;
FCH_31 8:cd489b7c49a0 240 SD_CS = 1 ;
FCH_31 8:cd489b7c49a0 241 ANT_SW = 1 ;
FCH_31 8:cd489b7c49a0 242
FCH_31 8:cd489b7c49a0 243 // SET MODULATION
FCH_31 8:cd489b7c49a0 244 modulationParams.PacketType = PACKET_TYPE_LORA ;
FCH_31 8:cd489b7c49a0 245 modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ;
FCH_31 8:cd489b7c49a0 246 modulationParams.Params.LoRa.Bandwidth = LORA_BW_0200 ;
FCH_31 8:cd489b7c49a0 247 modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ;
FCH_31 8:cd489b7c49a0 248 // SET PACKET PARAM
FCH_31 8:cd489b7c49a0 249 PacketParams.PacketType = PACKET_TYPE_LORA ;
FCH_31 8:cd489b7c49a0 250 PacketParams.Params.LoRa.PreambleLength = 0x08 ;
FCH_31 8:cd489b7c49a0 251 PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
FCH_31 8:cd489b7c49a0 252 PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MAX ;
patrick_duc 13:5414193da1de 253 PacketParams.Params.LoRa.Crc = LORA_CRC_ON ;
FCH_31 8:cd489b7c49a0 254 PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ;
FCH_31 8:cd489b7c49a0 255 // RADIO
FCH_31 8:cd489b7c49a0 256 Radio.SetStandby ( STDBY_RC ) ;
FCH_31 8:cd489b7c49a0 257 Radio.SetPacketType ( modulationParams.PacketType );
FCH_31 8:cd489b7c49a0 258 Radio.SetModulationParams ( &modulationParams ) ;
FCH_31 8:cd489b7c49a0 259 Radio.SetPacketParams ( &PacketParams ) ;
FCH_31 8:cd489b7c49a0 260 Radio.SetBufferBaseAddresses ( 0x00, 0x00 );
FCH_31 8:cd489b7c49a0 261 Radio.SetTxParams ( TX_OUTPUT_POWER, RADIO_RAMP_20_US ) ;
FCH_31 8:cd489b7c49a0 262 Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ;
FCH_31 8:cd489b7c49a0 263 //AppState = APP_LOWPOWER;
FCH_31 8:cd489b7c49a0 264 }
FCH_31 8:cd489b7c49a0 265 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 266
FCH_31 8:cd489b7c49a0 267
FCH_31 8:cd489b7c49a0 268
FCH_31 8:cd489b7c49a0 269 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 270 void setRadioTx () {
FCH_31 8:cd489b7c49a0 271 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 272 RxLed = 0 ;
FCH_31 8:cd489b7c49a0 273 TxLed = 0 ;
FCH_31 8:cd489b7c49a0 274 F_CS = 1 ;
FCH_31 8:cd489b7c49a0 275 SD_CS = 1 ;
FCH_31 8:cd489b7c49a0 276 ANT_SW = 1 ;
FCH_31 8:cd489b7c49a0 277
FCH_31 8:cd489b7c49a0 278 // SET MODULATION
FCH_31 8:cd489b7c49a0 279 modulationParams.PacketType = PACKET_TYPE_LORA ;
FCH_31 8:cd489b7c49a0 280 modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ;
FCH_31 8:cd489b7c49a0 281 modulationParams.Params.LoRa.Bandwidth = LORA_BW ;
FCH_31 8:cd489b7c49a0 282 modulationParams.Params.LoRa.SpreadingFactor = LORA_SF ;
FCH_31 8:cd489b7c49a0 283
FCH_31 8:cd489b7c49a0 284 // SET PACKET PARAM
FCH_31 8:cd489b7c49a0 285 PacketParams.PacketType = PACKET_TYPE_LORA ;
FCH_31 8:cd489b7c49a0 286 PacketParams.Params.LoRa.PreambleLength = 0x08 ;
FCH_31 8:cd489b7c49a0 287 PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
FCH_31 8:cd489b7c49a0 288 PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MAX ;
patrick_duc 13:5414193da1de 289 PacketParams.Params.LoRa.Crc = LORA_CRC_ON ;
FCH_31 8:cd489b7c49a0 290 PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ;
FCH_31 8:cd489b7c49a0 291
FCH_31 8:cd489b7c49a0 292 // RADIO
FCH_31 8:cd489b7c49a0 293 Radio.SetStandby ( STDBY_RC ) ;
FCH_31 8:cd489b7c49a0 294 Radio.SetPacketType ( modulationParams.PacketType );
FCH_31 8:cd489b7c49a0 295 Radio.SetModulationParams ( &modulationParams ) ;
FCH_31 8:cd489b7c49a0 296 Radio.SetPacketParams ( &PacketParams ) ;
FCH_31 8:cd489b7c49a0 297 Radio.SetRfFrequency ( RF_FREQUENCY ) ;
FCH_31 8:cd489b7c49a0 298 Radio.SetBufferBaseAddresses ( 0x00, 0x00 );
FCH_31 8:cd489b7c49a0 299 Radio.SetTxParams ( TX_OUTPUT_POWER, RADIO_RAMP_20_US ) ;
FCH_31 8:cd489b7c49a0 300 Radio.SetDioIrqParams ( TxIrqMask , TxIrqMask , IRQ_RADIO_NONE, IRQ_RADIO_NONE );
FCH_31 8:cd489b7c49a0 301 Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ;
FCH_31 8:cd489b7c49a0 302
FCH_31 8:cd489b7c49a0 303 //AppState = APP_LOWPOWER;
FCH_31 8:cd489b7c49a0 304
FCH_31 8:cd489b7c49a0 305 }
FCH_31 8:cd489b7c49a0 306
FCH_31 8:cd489b7c49a0 307
FCH_31 8:cd489b7c49a0 308 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 309 void setRadioRx () {
FCH_31 8:cd489b7c49a0 310 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 311 RxLed = 0 ;
FCH_31 8:cd489b7c49a0 312 TxLed = 0 ;
patrick_duc 13:5414193da1de 313
patrick_duc 13:5414193da1de 314 F_CS = 1 ;
patrick_duc 13:5414193da1de 315 SD_CS = 1 ;
patrick_duc 13:5414193da1de 316 ANT_SW = 1 ;
patrick_duc 13:5414193da1de 317
patrick_duc 13:5414193da1de 318 // SET MODULATION
FCH_31 8:cd489b7c49a0 319 modulationParams.PacketType = PACKET_TYPE_LORA ;
FCH_31 8:cd489b7c49a0 320 modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5 ;
FCH_31 8:cd489b7c49a0 321 modulationParams.Params.LoRa.Bandwidth = LORA_BW_0200 ;
FCH_31 8:cd489b7c49a0 322 modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7 ;
FCH_31 8:cd489b7c49a0 323
FCH_31 8:cd489b7c49a0 324 // SET PACKET PARAM
FCH_31 8:cd489b7c49a0 325 PacketParams.PacketType = PACKET_TYPE_LORA ;
FCH_31 8:cd489b7c49a0 326 PacketParams.Params.LoRa.PreambleLength = 0x08 ;
FCH_31 8:cd489b7c49a0 327 PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
FCH_31 8:cd489b7c49a0 328 PacketParams.Params.LoRa.PayloadLength = BUFFER_SIZE_MIN ;
patrick_duc 13:5414193da1de 329 PacketParams.Params.LoRa.Crc = LORA_CRC_ON ;
FCH_31 8:cd489b7c49a0 330 PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED ;
FCH_31 8:cd489b7c49a0 331
FCH_31 8:cd489b7c49a0 332 // RADIO
FCH_31 8:cd489b7c49a0 333 Radio.SetStandby ( STDBY_RC ) ;
FCH_31 8:cd489b7c49a0 334 Radio.SetPacketType ( modulationParams.PacketType );
FCH_31 8:cd489b7c49a0 335 Radio.SetModulationParams ( &modulationParams ) ;
FCH_31 8:cd489b7c49a0 336 Radio.SetPacketParams ( &PacketParams ) ;
FCH_31 8:cd489b7c49a0 337 Radio.SetRfFrequency ( RF_FREQUENCY + 440000UL) ;
FCH_31 8:cd489b7c49a0 338
FCH_31 8:cd489b7c49a0 339 Radio.SetBufferBaseAddresses ( 0x00, 0x00 );
FCH_31 8:cd489b7c49a0 340 Radio.SetDioIrqParams ( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ) ;
patrick_duc 13:5414193da1de 341 Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x00000000 } ) ;
patrick_duc 13:5414193da1de 342 // Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ;
FCH_31 8:cd489b7c49a0 343 }
FCH_31 8:cd489b7c49a0 344 //===============================================================================================================================
FCH_31 8:cd489b7c49a0 345
FCH_31 8:cd489b7c49a0 346
FCH_31 8:cd489b7c49a0 347
FCH_31 8:cd489b7c49a0 348
FCH_31 8:cd489b7c49a0 349 // ============================================================================ RADIO CALLBACK
FCH_31 8:cd489b7c49a0 350 void OnTxDone ( void ) {
FCH_31 8:cd489b7c49a0 351 //==============================================================================
FCH_31 8:cd489b7c49a0 352 valueTimeTx = timerRadio.read_ms () ;
FCH_31 8:cd489b7c49a0 353 printf( "*** LORA *** OnTxDone \r\n" );
FCH_31 8:cd489b7c49a0 354 TxLed = 0 ;
FCH_31 8:cd489b7c49a0 355 setRadioRx () ;
FCH_31 8:cd489b7c49a0 356 }
FCH_31 8:cd489b7c49a0 357 //==============================================================================
FCH_31 8:cd489b7c49a0 358
FCH_31 8:cd489b7c49a0 359
FCH_31 8:cd489b7c49a0 360
FCH_31 8:cd489b7c49a0 361 //void OnRxDone ( void ) { AppState = APP_RX ; }
FCH_31 8:cd489b7c49a0 362 //==============================================================================
FCH_31 8:cd489b7c49a0 363 void OnRxDone ( void ) {
FCH_31 8:cd489b7c49a0 364 //==============================================================================
FCH_31 8:cd489b7c49a0 365 uint8_t Buffer1 [BUFFER_SIZE_MAX+1]; // Buffer Radio
FCH_31 8:cd489b7c49a0 366 uint8_t BufferSize = BUFFER_SIZE_MAX ; // Size of the buffer
FCH_31 8:cd489b7c49a0 367
FCH_31 8:cd489b7c49a0 368 RxLed = 1 ; // Show the reception
FCH_31 8:cd489b7c49a0 369
FCH_31 8:cd489b7c49a0 370 printf( "*** LORA *** RX DONE \r\n" );
FCH_31 8:cd489b7c49a0 371 valueTimeLoop = timerRadio.read_ms () ;
FCH_31 8:cd489b7c49a0 372 timerRadio.stop () ;
FCH_31 8:cd489b7c49a0 373 watchDogRx.detach () ;
FCH_31 8:cd489b7c49a0 374 //printf( "*** LORA *** DISARM watchDogRx \r\n" );
FCH_31 8:cd489b7c49a0 375
FCH_31 8:cd489b7c49a0 376 Radio.GetPacketStatus(&packetStatus) ;
FCH_31 8:cd489b7c49a0 377 RssiValue = packetStatus.LoRa.RssiPkt ;
FCH_31 8:cd489b7c49a0 378
FCH_31 8:cd489b7c49a0 379 memset ( &Buffer1 , 0x00, BUFFER_SIZE_MAX );
FCH_31 8:cd489b7c49a0 380 Radio.GetPayload ( Buffer1, &BufferSize, BUFFER_SIZE_MAX );
FCH_31 8:cd489b7c49a0 381
patrick_duc 13:5414193da1de 382 RxLed = 0 ; // Show the reception
patrick_duc 13:5414193da1de 383
FCH_31 8:cd489b7c49a0 384 Buffer1[7] = 0 ;
FCH_31 8:cd489b7c49a0 385
FCH_31 8:cd489b7c49a0 386 printf ( "*** LORA *** RX DONE => %s \r\n", Buffer1 ); wait(1) ; // flush serial
FCH_31 8:cd489b7c49a0 387
FCH_31 8:cd489b7c49a0 388 // Extract value
FCH_31 8:cd489b7c49a0 389
FCH_31 8:cd489b7c49a0 390 switch (Buffer1[2]) {
FCH_31 8:cd489b7c49a0 391 case '1': RF_FREQUENCY = 2400000000UL ; break ;
FCH_31 8:cd489b7c49a0 392 case '2': RF_FREQUENCY = 2400680000UL ; break ;
FCH_31 8:cd489b7c49a0 393 case '3': RF_FREQUENCY = 2423840000UL ; break ;
FCH_31 8:cd489b7c49a0 394 case '4': RF_FREQUENCY = 2424520000UL ; break ;
FCH_31 8:cd489b7c49a0 395 case '5': RF_FREQUENCY = 2448840000UL ; break ;
FCH_31 8:cd489b7c49a0 396 case '6': RF_FREQUENCY = 2449520000UL ; break ;
FCH_31 8:cd489b7c49a0 397 case '7': RF_FREQUENCY = 2473840000UL ; break ;
FCH_31 8:cd489b7c49a0 398 case '8': RF_FREQUENCY = 2474520000UL ; break ;
FCH_31 8:cd489b7c49a0 399 }
FCH_31 8:cd489b7c49a0 400
FCH_31 8:cd489b7c49a0 401 switch (Buffer1[3]) {
FCH_31 8:cd489b7c49a0 402 case '1': LORA_BW = LORA_BW_0200 ; break ;
FCH_31 8:cd489b7c49a0 403 case '2': LORA_BW = LORA_BW_0400 ; break ;
FCH_31 8:cd489b7c49a0 404 case '3': LORA_BW = LORA_BW_0800 ; break ;
FCH_31 8:cd489b7c49a0 405 case '4': LORA_BW = LORA_BW_1600 ; break ;
FCH_31 8:cd489b7c49a0 406 }
FCH_31 8:cd489b7c49a0 407
FCH_31 8:cd489b7c49a0 408 switch (Buffer1[4]) {
FCH_31 8:cd489b7c49a0 409 case '1': TX_OUTPUT_POWER = -18 ; break ;
FCH_31 8:cd489b7c49a0 410 case '2': TX_OUTPUT_POWER = 0 ; break ;
FCH_31 8:cd489b7c49a0 411 case '3': TX_OUTPUT_POWER = 8 ; break ;
FCH_31 8:cd489b7c49a0 412 case '4': TX_OUTPUT_POWER = 10 ; break ;
FCH_31 8:cd489b7c49a0 413 case '5': TX_OUTPUT_POWER = 13 ; break ;
FCH_31 8:cd489b7c49a0 414 }
FCH_31 8:cd489b7c49a0 415
FCH_31 8:cd489b7c49a0 416 switch (Buffer1[5]) {
FCH_31 8:cd489b7c49a0 417 case '1': LORA_SF = LORA_SF5 ; break ;
FCH_31 8:cd489b7c49a0 418 case '2': LORA_SF = LORA_SF6 ; break ;
FCH_31 8:cd489b7c49a0 419 case '3': LORA_SF = LORA_SF7 ; break ;
FCH_31 8:cd489b7c49a0 420 case '4': LORA_SF = LORA_SF8 ; break ;
FCH_31 8:cd489b7c49a0 421 case '5': LORA_SF = LORA_SF9 ; break ;
FCH_31 8:cd489b7c49a0 422 case '6': LORA_SF = LORA_SF10 ; break ;
FCH_31 8:cd489b7c49a0 423 case '7': LORA_SF = LORA_SF12 ; break ;
FCH_31 8:cd489b7c49a0 424 }
FCH_31 8:cd489b7c49a0 425
FCH_31 8:cd489b7c49a0 426 int OLD_TIMER = TIMER ;
FCH_31 8:cd489b7c49a0 427
FCH_31 8:cd489b7c49a0 428 switch (Buffer1[6]) {
FCH_31 8:cd489b7c49a0 429 case '1': TIMER = 50 ; break ;
FCH_31 8:cd489b7c49a0 430 case '2': TIMER = 75 ; break ;
FCH_31 8:cd489b7c49a0 431 case '3': TIMER = 125 ; break ;
FCH_31 8:cd489b7c49a0 432 case '4': TIMER = 250 ; break ;
FCH_31 8:cd489b7c49a0 433 case '5': TIMER = 500 ; break ;
FCH_31 8:cd489b7c49a0 434 case '6': TIMER = 1000 ; break ;
FCH_31 8:cd489b7c49a0 435 case '7': TIMER = 2000 ; break ;
FCH_31 8:cd489b7c49a0 436 }
FCH_31 8:cd489b7c49a0 437
FCH_31 8:cd489b7c49a0 438 RxLed = 0 ;
FCH_31 8:cd489b7c49a0 439
FCH_31 8:cd489b7c49a0 440 if (oldFreq != Buffer1[2] || oldBw != Buffer1[3] || oldPwr != Buffer1[4] || oldSf != Buffer1[5] || oldTimer != Buffer1[6] ) {
FCH_31 8:cd489b7c49a0 441 oldFreq = Buffer1[2] ;
FCH_31 8:cd489b7c49a0 442 oldBw = Buffer1[3] ;
FCH_31 8:cd489b7c49a0 443 oldPwr = Buffer1[4] ;
FCH_31 8:cd489b7c49a0 444 oldSf = Buffer1[5] ;
FCH_31 8:cd489b7c49a0 445 oldTimer = Buffer1[6] ;
FCH_31 8:cd489b7c49a0 446 //printf ( "*** LORA *** Reset Radio \r\n" );
FCH_31 8:cd489b7c49a0 447 //app.updateDisplay ( LORA_SF, LORA_BW, TX_OUTPUT_POWER, BUFFER_SIZE_MAX, RF_FREQUENCY, TIMER ) ;
FCH_31 8:cd489b7c49a0 448 }
FCH_31 8:cd489b7c49a0 449
FCH_31 8:cd489b7c49a0 450 if (OLD_TIMER != TIMER) {
FCH_31 8:cd489b7c49a0 451 //wakeUpTerminal.detach ();
FCH_31 8:cd489b7c49a0 452 //wakeUpTerminal.attach (&wakeUpTerminalFunction, (float) TIMER/1000);
FCH_31 8:cd489b7c49a0 453 }
FCH_31 8:cd489b7c49a0 454 }
FCH_31 8:cd489b7c49a0 455 //==============================================================================
FCH_31 8:cd489b7c49a0 456
FCH_31 8:cd489b7c49a0 457 void OnTxTimeout ( void ) { AppState = APP_TX_TIMEOUT ;}
FCH_31 8:cd489b7c49a0 458 void OnRxTimeout ( void ) { AppState = APP_RX_TIMEOUT ; }
FCH_31 8:cd489b7c49a0 459 void OnRxError ( IrqErrorCode_t errorCode ) { AppState = APP_RX_ERROR ; }
FCH_31 8:cd489b7c49a0 460 void OnRangingDone ( IrqRangingCode_t val ) { }
FCH_31 8:cd489b7c49a0 461 void OnCadDone ( bool channelActivityDetected ){ }
FCH_31 8:cd489b7c49a0 462
FCH_31 8:cd489b7c49a0 463