Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DISCO-L072CZ-LRWAN1_LoRa_PingPong by
Receiver.cpp
00001 /* 00002 * This file contains a copy of the master content sx1276PingPong 00003 * with adaption for the SX1276Generic environment 00004 * (c) 2017 Helmut Tschemernjak 00005 * 30826 Garbsen (Hannover) Germany 00006 */ 00007 00008 #include "mbed.h" 00009 #include "PinMap.h" 00010 #include "Receiver.h" 00011 #include "sx1276-mbed-hal.h" 00012 #include "main.h" 00013 00014 #ifdef FEATURE_LORA 00015 00016 /* Set this flag to '1' to display debug messages on the console */ 00017 #define DEBUG_MESSAGE 1 00018 00019 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ 00020 #define USE_MODEM_LORA 1 00021 #define USE_MODEM_FSK !USE_MODEM_LORA 00022 #define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz 00023 #define TX_OUTPUT_POWER 14 // 14 dBm 00024 00025 #if USE_MODEM_LORA == 1 00026 00027 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap 00028 #define LORA_SPREADING_FACTOR LORA_SF7 00029 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5 00030 00031 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx 00032 #define LORA_SYMBOL_TIMEOUT 5 // Symbols 00033 #define LORA_FIX_LENGTH_PAYLOAD_ON false 00034 #define LORA_FHSS_ENABLED false 00035 #define LORA_NB_SYMB_HOP 4 00036 #define LORA_IQ_INVERSION_ON false 00037 #define LORA_CRC_ENABLED true 00038 00039 #elif USE_MODEM_FSK == 1 00040 00041 #define FSK_FDEV 25000 // Hz 00042 #define FSK_DATARATE 19200 // bps 00043 #define FSK_BANDWIDTH 50000 // Hz 00044 #define FSK_AFC_BANDWIDTH 83333 // Hz 00045 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx 00046 #define FSK_FIX_LENGTH_PAYLOAD_ON false 00047 #define FSK_CRC_ENABLED true 00048 00049 #else 00050 #error "Please define a modem in the compiler options." 00051 #endif 00052 00053 00054 #define RX_TIMEOUT_VALUE 3500 // in ms 00055 00056 #define BUFFER_SIZE 2048 00057 00058 /* 00059 * Global variables declarations 00060 */ 00061 typedef enum 00062 { 00063 LOWPOWER = 0, 00064 IDLE, 00065 00066 RX, 00067 RX_TIMEOUT, 00068 RX_ERROR, 00069 00070 TX, 00071 TX_TIMEOUT, 00072 00073 CAD, 00074 CAD_DONE 00075 } AppStates_t; 00076 00077 volatile AppStates_t State = LOWPOWER; 00078 00079 /*! 00080 * Radio events function pointer 00081 */ 00082 static RadioEvents_t RadioEvents; 00083 00084 /* 00085 * Global variables declarations 00086 */ 00087 SX1276Generic *Radio ; 00088 00089 uint16_t BufferSize = BUFFER_SIZE; 00090 uint8_t *Buffer; 00091 00092 DigitalOut *led3; 00093 00094 00095 int Receiver() 00096 { 00097 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) ) 00098 DigitalOut *led = new DigitalOut(LED2); 00099 #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1) 00100 DigitalOut *led = new DigitalOut(LED4); // RX red 00101 led3 = new DigitalOut(LED3); // TX blue 00102 #else 00103 DigitalOut *led = new DigitalOut(LED1); 00104 led3 = led; 00105 #endif 00106 00107 Buffer = new uint8_t[BUFFER_SIZE]; 00108 *led3 = 1; 00109 00110 #ifdef B_L072Z_LRWAN1_LORA 00111 Radio = new SX1276Generic (NULL, MURATA_SX1276, 00112 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, 00113 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, 00114 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); 00115 #else // RFM95 00116 Radio = new SX1276Generic (NULL, RFM95_SX1276, 00117 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, 00118 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5); 00119 00120 #endif 00121 00122 uint8_t i; 00123 00124 bool isMaster = false; 00125 00126 dprintf("Formula Technion GUI Application" ); 00127 dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0); 00128 dprintf("TXPower: %d dBm", TX_OUTPUT_POWER); 00129 #if USE_MODEM_LORA == 1 00130 dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH); 00131 dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR); 00132 #elif USE_MODEM_FSK == 1 00133 dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH); 00134 dprintf("Baudrate: %d", FSK_DATARATE); 00135 #endif 00136 // Initialize Radio driver 00137 RadioEvents.TxDone = OnTxDone; 00138 RadioEvents.RxDone = OnRxDone; 00139 RadioEvents.RxError = OnRxError; 00140 RadioEvents.TxTimeout = OnTxTimeout; 00141 RadioEvents.RxTimeout = OnRxTimeout; 00142 if (Radio->Init( &RadioEvents ) == false) { 00143 while(1) { 00144 dprintf("Radio could not be detected!"); 00145 wait( 1 ); 00146 } 00147 } 00148 00149 00150 switch(Radio->DetectBoardType()) { 00151 case SX1276MB1LAS: 00152 if (DEBUG_MESSAGE) 00153 dprintf(" > Board Type: SX1276MB1LAS <"); 00154 break; 00155 case SX1276MB1MAS: 00156 if (DEBUG_MESSAGE) 00157 dprintf(" > Board Type: SX1276MB1LAS <"); 00158 case MURATA_SX1276: 00159 if (DEBUG_MESSAGE) 00160 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <"); 00161 break; 00162 case RFM95_SX1276: 00163 if (DEBUG_MESSAGE) 00164 dprintf(" > HopeRF RFM95xx <"); 00165 break; 00166 default: 00167 dprintf(" > Board Type: unknown <"); 00168 } 00169 00170 Radio->SetChannel(RF_FREQUENCY ); 00171 00172 #if USE_MODEM_LORA == 1 00173 00174 if (LORA_FHSS_ENABLED) 00175 dprintf(" > LORA FHSS Mode <"); 00176 if (!LORA_FHSS_ENABLED) 00177 dprintf(" > LORA Mode <"); 00178 00179 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, 00180 LORA_SPREADING_FACTOR, LORA_CODINGRATE, 00181 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, 00182 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 00183 LORA_IQ_INVERSION_ON, 2000 ); 00184 00185 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, 00186 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, 00187 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, 00188 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 00189 LORA_IQ_INVERSION_ON, true ); 00190 00191 #elif USE_MODEM_FSK == 1 00192 00193 dprintf(" > FSK Mode <"); 00194 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, 00195 FSK_DATARATE, 0, 00196 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, 00197 FSK_CRC_ENABLED, 0, 0, 0, 2000 ); 00198 00199 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, 00200 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, 00201 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, 00202 0, 0, false, true ); 00203 00204 #else 00205 00206 #error "Please define a modem in the compiler options." 00207 00208 #endif 00209 00210 00211 Radio->Rx( RX_TIMEOUT_VALUE ); 00212 while( 1 ) 00213 { 00214 #ifdef TARGET_STM32L4 00215 WatchDogUpdate(); 00216 #endif 00217 00218 switch( State ) 00219 { 00220 case RX: 00221 dprintf("SWITCH:::: RX \n"); 00222 *led3 = 0; 00223 *led = !*led; 00224 wait_ms( 10 ); 00225 /////////////////////////////// 00226 State = LOWPOWER; 00227 break; 00228 case RX_TIMEOUT: 00229 00230 State = LOWPOWER; 00231 dprintf("SWTICH : RX_TIMEOUT"); 00232 break; 00233 case RX_ERROR: 00234 // We have received a Packet with a CRC error, send reply as if packet was correct 00235 State = LOWPOWER; 00236 dprintf("SWTICH : RX_ERROR"); 00237 break; 00238 case LOWPOWER: 00239 dprintf("LOWPOWER, wait for input"); 00240 wait(1); 00241 Radio->Rx( RX_TIMEOUT_VALUE ); 00242 break; 00243 default: 00244 dprintf("SWTICH : defualt"); 00245 State = LOWPOWER; 00246 break; 00247 } 00248 } 00249 } 00250 00251 void OnTxDone(void *radio, void *userThisPtr, void *userData) 00252 { 00253 if (DEBUG_MESSAGE) 00254 dprintf("> OnTxDone [7]"); 00255 } 00256 00257 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) 00258 { 00259 Radio->Sleep( ); 00260 BufferSize = size; 00261 memcpy( Buffer, payload, BufferSize ); 00262 State = RX; 00263 Buffer[500] = 0; 00264 dprintf("%s", Buffer); 00265 } 00266 00267 void OnTxTimeout(void *radio, void *userThisPtr, void *userData) 00268 { 00269 *led3 = 0; 00270 Radio->Sleep( ); 00271 State = LOWPOWER; 00272 } 00273 00274 void OnRxTimeout(void *radio, void *userThisPtr, void *userData) 00275 { 00276 *led3 = 0; 00277 Radio->Sleep( ); 00278 Buffer[BufferSize-1] = 0; 00279 State = RX_TIMEOUT; 00280 } 00281 00282 void OnRxError(void *radio, void *userThisPtr, void *userData) 00283 { 00284 Radio->Sleep( ); 00285 State = RX_ERROR; 00286 } 00287 00288 #endif
Generated on Thu Jul 14 2022 18:25:31 by
1.7.2
