Diogo Almeida / lora_receiver_embedios

Dependencies:   mbed SoftSerial USBDevice Buffer

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 #include <SoftSerial.h>
00015 
00016 
00017 #ifdef FEATURE_LORA
00018 
00019 /* Set this flag to '1' to display debug messages on the console */
00020 #define DEBUG_MESSAGE   1
00021 
00022 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
00023 #define USE_MODEM_LORA  1
00024 #define USE_MODEM_FSK   !USE_MODEM_LORA
00025 #define RF_FREQUENCY            RF_FREQUENCY_868_1  // Hz
00026 #define TX_OUTPUT_POWER         14                  // 14 dBm
00027 
00028 #if USE_MODEM_LORA == 1
00029 
00030 #define LORA_BANDWIDTH          125000  // LoRa default, details in SX1276::BandwidthMap
00031 #define LORA_SPREADING_FACTOR   LORA_SF7
00032 #define LORA_CODINGRATE         LORA_ERROR_CODING_RATE_4_5
00033 
00034 #define LORA_PREAMBLE_LENGTH    8       // Same for Tx and Rx
00035 #define LORA_SYMBOL_TIMEOUT     5       // Symbols
00036 #define LORA_FIX_LENGTH_PAYLOAD_ON  false
00037 #define LORA_FHSS_ENABLED       false  
00038 #define LORA_NB_SYMB_HOP        4     
00039 #define LORA_IQ_INVERSION_ON    false
00040 #define LORA_CRC_ENABLED        true
00041     
00042 #elif USE_MODEM_FSK == 1
00043 
00044 #define FSK_FDEV                25000     // Hz
00045 #define FSK_DATARATE            19200     // bps
00046 #define FSK_BANDWIDTH           50000     // Hz
00047 #define FSK_AFC_BANDWIDTH       83333     // Hz
00048 #define FSK_PREAMBLE_LENGTH     5         // Same for Tx and Rx
00049 #define FSK_FIX_LENGTH_PAYLOAD_ON   false
00050 #define FSK_CRC_ENABLED         true
00051     
00052 #else
00053     #error "Please define a modem in the compiler options."
00054 #endif 
00055 
00056 
00057 #define RX_TIMEOUT_VALUE    8500    // in ms mudei de 3500
00058 
00059 #define BUFFER_SIZE         2048        
00060 
00061 
00062 int ii = 0;
00063 
00064 //SoftSerial ss(PA_9, PA_10);
00065 /*
00066  *  Global variables declarations
00067  */
00068 typedef enum
00069 {
00070     LOWPOWER = 0,
00071     IDLE,
00072     
00073     RX,
00074     RX_TIMEOUT,
00075     RX_ERROR,
00076     
00077     TX,
00078     TX_TIMEOUT,
00079     
00080     CAD,
00081     CAD_DONE
00082 } AppStates_t;
00083 
00084 
00085 volatile AppStates_t State = LOWPOWER;
00086 
00087 /*!
00088  * Radio events function pointer
00089  */
00090 static RadioEvents_t RadioEvents;
00091 
00092 /*
00093  *  Global variables declarations
00094  */
00095 SX1276Generic  *Radio ;
00096 
00097 uint16_t BufferSize = BUFFER_SIZE;
00098 uint8_t *Buffer;
00099 
00100 DigitalOut *led3;
00101 
00102 
00103 
00104 
00105 int Receiver() 
00106 {
00107 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
00108     DigitalOut *led = new DigitalOut(LED2);
00109 #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1)
00110     DigitalOut *led = new DigitalOut(LED4);   // RX red
00111     led3 = new DigitalOut(LED3);  // TX blue
00112 #else
00113     DigitalOut *led = new DigitalOut(LED1);
00114     led3 = led;
00115 #endif
00116     
00117     Buffer = new  uint8_t[BUFFER_SIZE];
00118     *led3 = 1;
00119 
00120 #ifdef B_L072Z_LRWAN1_LORA
00121     Radio = new SX1276Generic (NULL, MURATA_SX1276,
00122             LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
00123             LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
00124             LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
00125 #else // RFM95
00126     Radio = new SX1276Generic (NULL, RFM95_SX1276,
00127             LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
00128             LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
00129 
00130 #endif
00131     
00132     uint8_t i;
00133    
00134     bool isMaster = false;
00135 
00136     dprintf("Formula Technion GUI Application" );
00137     dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
00138     dprintf("TXPower: %d dBm",  TX_OUTPUT_POWER);
00139 #if USE_MODEM_LORA == 1
00140     dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
00141     dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
00142 #elif USE_MODEM_FSK == 1
00143     dprintf("Bandwidth: %d kHz",  FSK_BANDWIDTH);
00144     dprintf("Baudrate: %d", FSK_DATARATE);
00145 #endif
00146     // Initialize Radio driver
00147     RadioEvents.TxDone = OnTxDone;
00148     RadioEvents.RxDone = OnRxDone;
00149     RadioEvents.RxError = OnRxError;
00150     RadioEvents.TxTimeout = OnTxTimeout;
00151     RadioEvents.RxTimeout = OnRxTimeout;    
00152     if (Radio->Init( &RadioEvents ) == false) {
00153         while(1) {
00154             dprintf("Radio could not be detected!");
00155             //usb_serial.printf("Radio could not be detected!");
00156             wait( 1 );
00157         }
00158     }
00159 
00160     
00161     switch(Radio->DetectBoardType()) {
00162         case SX1276MB1LAS:
00163             if (DEBUG_MESSAGE)
00164                 dprintf(" > Board Type: SX1276MB1LAS <");
00165             break;
00166         case SX1276MB1MAS:
00167             if (DEBUG_MESSAGE)
00168                 dprintf(" > Board Type: SX1276MB1LAS <");
00169         case MURATA_SX1276:
00170             if (DEBUG_MESSAGE)
00171                 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
00172             break;
00173         case RFM95_SX1276:
00174             if (DEBUG_MESSAGE)
00175                 dprintf(" > HopeRF RFM95xx <");
00176             break;
00177         default:
00178             dprintf(" > Board Type: unknown <");
00179     }
00180 
00181     Radio->SetChannel(RF_FREQUENCY ); 
00182 
00183 #if USE_MODEM_LORA == 1
00184     
00185     if (LORA_FHSS_ENABLED)
00186         dprintf("             > LORA FHSS Mode <");
00187     if (!LORA_FHSS_ENABLED)
00188         dprintf("             > LORA Mode <");
00189 
00190     Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
00191                          LORA_SPREADING_FACTOR, LORA_CODINGRATE,
00192                          LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
00193                          LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 
00194                          LORA_IQ_INVERSION_ON, 2000 );
00195     
00196     Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
00197                          LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
00198                          LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
00199                          LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, 
00200                          LORA_IQ_INVERSION_ON, true );
00201                          
00202 #elif USE_MODEM_FSK == 1
00203 
00204     dprintf("              > FSK Mode <");
00205     Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
00206                          FSK_DATARATE, 0,
00207                          FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
00208                          FSK_CRC_ENABLED, 0, 0, 0, 2000 );
00209     
00210     Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
00211                          0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
00212                          0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
00213                          0, 0, false, true );
00214                          
00215 #else
00216 
00217 #error "Please define a modem in the compiler options."
00218 
00219 #endif
00220      
00221         
00222     Radio->Rx( RX_TIMEOUT_VALUE );
00223     while( 1 )
00224     {
00225 #ifdef TARGET_STM32L4
00226         WatchDogUpdate();
00227 #endif
00228     
00229         switch( State )
00230         {
00231         case RX:
00232             dprintf("SWITCH:::: RX \n");
00233             *led3 = 0;
00234             *led = !*led;
00235             wait_ms( 10 );  
00236             ///////////////////////////////
00237             State = LOWPOWER;
00238             break;
00239           case RX_TIMEOUT:
00240                 
00241             State = LOWPOWER;
00242             dprintf("SWTICH : RX_TIMEOUT");
00243             break;
00244         case RX_ERROR:
00245             // We have received a Packet with a CRC error, send reply as if packet was correct
00246             State = LOWPOWER;
00247             dprintf("SWTICH : RX_ERROR");
00248             break;
00249         case LOWPOWER:
00250              
00251              wait(1);
00252              if (BufferSize > 0){
00253                 
00254                 //usb_serial.printf("Entrou");
00255                 Radio->Rx( RX_TIMEOUT_VALUE ); 
00256                 //mode_buffer(Buffer,ii);
00257 
00258                 if (Buffer[0] == 'H'){
00259                     return -3;
00260                     }
00261                 //usb_serial.printf("%s",Buffer);
00262                 //ss.putc(usb_serial.getc());
00263                 //ss.putc("x\r\n");
00264                 
00265                 }
00266             
00267             Radio->Rx( RX_TIMEOUT_VALUE ); 
00268             //usb_serial.printf("saiu"); 
00269             break;
00270         default:
00271             dprintf("SWTICH : defualt");
00272             State = LOWPOWER;
00273             break;
00274         }    
00275     }
00276 }
00277 
00278 void OnTxDone(void *radio, void *userThisPtr, void *userData)
00279 {
00280     if (DEBUG_MESSAGE)
00281         dprintf("> OnTxDone [7]");
00282 }
00283 
00284 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
00285 {
00286     Radio->Sleep( );
00287     BufferSize = size;
00288     memcpy( Buffer, payload, BufferSize );
00289     State = RX;
00290     Buffer[500] = 0;
00291     
00292     //dprintf("%s", Buffer);
00293     //usb_serial.printf("D");
00294     
00295 }
00296 
00297 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
00298 {
00299     *led3 = 0;
00300     Radio->Sleep( );
00301     State = LOWPOWER;
00302 }
00303 
00304 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
00305 {
00306     *led3 = 0;
00307     Radio->Sleep( );
00308     Buffer[BufferSize-1] = 0;
00309     State = RX_TIMEOUT;
00310 }
00311 
00312 void OnRxError(void *radio, void *userThisPtr, void *userData)
00313 {
00314     Radio->Sleep( );
00315     State = RX_ERROR;
00316 }
00317 
00318 #endif