Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
patrick_duc
Date:
Fri Oct 19 15:08:35 2018 +0000
Branch:
Integration
Revision:
39:13e66d087ae9
Parent:
13:5414193da1de
Suite d'int?gration (ne compile pas encore).

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