Ward Mattar / Mbed 2 deprecated Formula_LoRa_Receiver

Dependencies:   mbed Buffer

Fork of DISCO-L072CZ-LRWAN1_LoRa_PingPong by ST

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Receiver.cpp Source File

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