gabrio gabrio / Mbed 2 deprecated RECEIVER

Dependencies:   BufferedSerial SX1276GenericLib mbed

Fork of TRANSMITTER by gabrio gabrio

Committer:
gabrio
Date:
Wed May 23 21:01:35 2018 +0000
Revision:
1:247f19702edd
Parent:
0:acd8e2ba10c5
Child:
2:5ddb3de762a0
removed unused var;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gabrio 0:acd8e2ba10c5 1 /*
gabrio 0:acd8e2ba10c5 2 * This file contains a copy of the master content sx1276PingPong
gabrio 0:acd8e2ba10c5 3 * with adaption for the SX1276Generic environment
gabrio 0:acd8e2ba10c5 4 * (c) 2017 Helmut Tschemernjak
gabrio 0:acd8e2ba10c5 5 * 30826 Garbsen (Hannover) Germany
gabrio 0:acd8e2ba10c5 6 */
gabrio 0:acd8e2ba10c5 7
gabrio 0:acd8e2ba10c5 8 #include "mbed.h"
gabrio 0:acd8e2ba10c5 9 #include "PinMap.h"
gabrio 0:acd8e2ba10c5 10 #include "Transmitter.h"
gabrio 0:acd8e2ba10c5 11 #include "sx1276-mbed-hal.h"
gabrio 0:acd8e2ba10c5 12 #include "main.h"
gabrio 0:acd8e2ba10c5 13
gabrio 0:acd8e2ba10c5 14 #ifdef FEATURE_LORA
gabrio 0:acd8e2ba10c5 15
gabrio 0:acd8e2ba10c5 16 /* Set this flag to '1' to display debug messages on the console */
gabrio 0:acd8e2ba10c5 17 #define DEBUG_MESSAGE 1
gabrio 0:acd8e2ba10c5 18
gabrio 0:acd8e2ba10c5 19 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
gabrio 0:acd8e2ba10c5 20 #define USE_MODEM_LORA 1
gabrio 0:acd8e2ba10c5 21 #define USE_MODEM_FSK !USE_MODEM_LORA
gabrio 0:acd8e2ba10c5 22 #define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz
gabrio 0:acd8e2ba10c5 23 #define TX_OUTPUT_POWER 14 // 14 dBm
gabrio 0:acd8e2ba10c5 24
gabrio 0:acd8e2ba10c5 25 #if USE_MODEM_LORA == 1
gabrio 0:acd8e2ba10c5 26
gabrio 0:acd8e2ba10c5 27 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
gabrio 0:acd8e2ba10c5 28 #define LORA_SPREADING_FACTOR LORA_SF7
gabrio 0:acd8e2ba10c5 29 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
gabrio 0:acd8e2ba10c5 30
gabrio 0:acd8e2ba10c5 31 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
gabrio 0:acd8e2ba10c5 32 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
gabrio 0:acd8e2ba10c5 33 #define LORA_FIX_LENGTH_PAYLOAD_ON false
gabrio 0:acd8e2ba10c5 34 #define LORA_FHSS_ENABLED false
gabrio 0:acd8e2ba10c5 35 #define LORA_NB_SYMB_HOP 4
gabrio 0:acd8e2ba10c5 36 #define LORA_IQ_INVERSION_ON false
gabrio 0:acd8e2ba10c5 37 #define LORA_CRC_ENABLED true
gabrio 0:acd8e2ba10c5 38
gabrio 0:acd8e2ba10c5 39 #elif USE_MODEM_FSK == 1
gabrio 0:acd8e2ba10c5 40
gabrio 0:acd8e2ba10c5 41 #define FSK_FDEV 25000 // Hz
gabrio 0:acd8e2ba10c5 42 #define FSK_DATARATE 19200 // bps
gabrio 0:acd8e2ba10c5 43 #define FSK_BANDWIDTH 50000 // Hz
gabrio 0:acd8e2ba10c5 44 #define FSK_AFC_BANDWIDTH 83333 // Hz
gabrio 0:acd8e2ba10c5 45 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
gabrio 0:acd8e2ba10c5 46 #define FSK_FIX_LENGTH_PAYLOAD_ON false
gabrio 0:acd8e2ba10c5 47 #define FSK_CRC_ENABLED true
gabrio 0:acd8e2ba10c5 48
gabrio 0:acd8e2ba10c5 49 #else
gabrio 0:acd8e2ba10c5 50 #error "Please define a modem in the compiler options."
gabrio 0:acd8e2ba10c5 51 #endif
gabrio 0:acd8e2ba10c5 52
gabrio 0:acd8e2ba10c5 53
gabrio 0:acd8e2ba10c5 54 #define RX_TIMEOUT_VALUE 3500 // in ms
gabrio 0:acd8e2ba10c5 55
gabrio 0:acd8e2ba10c5 56 //#define BUFFER_SIZE 32 // Define the payload size here
gabrio 0:acd8e2ba10c5 57 #define BUFFER_SIZE 64 // Define the payload size here
gabrio 0:acd8e2ba10c5 58
gabrio 0:acd8e2ba10c5 59 /*
gabrio 0:acd8e2ba10c5 60 * Global variables declarations
gabrio 0:acd8e2ba10c5 61 */
gabrio 0:acd8e2ba10c5 62 typedef enum
gabrio 0:acd8e2ba10c5 63 {
gabrio 0:acd8e2ba10c5 64 LOWPOWER = 0,
gabrio 0:acd8e2ba10c5 65 IDLE,
gabrio 0:acd8e2ba10c5 66
gabrio 0:acd8e2ba10c5 67 RX,
gabrio 0:acd8e2ba10c5 68 RX_TIMEOUT,
gabrio 0:acd8e2ba10c5 69 RX_ERROR,
gabrio 0:acd8e2ba10c5 70
gabrio 0:acd8e2ba10c5 71 TX,
gabrio 0:acd8e2ba10c5 72 TX_TIMEOUT,
gabrio 0:acd8e2ba10c5 73
gabrio 0:acd8e2ba10c5 74 CAD,
gabrio 0:acd8e2ba10c5 75 CAD_DONE
gabrio 0:acd8e2ba10c5 76 } AppStates_t;
gabrio 0:acd8e2ba10c5 77
gabrio 0:acd8e2ba10c5 78 volatile AppStates_t State = LOWPOWER;
gabrio 0:acd8e2ba10c5 79
gabrio 0:acd8e2ba10c5 80 /*!
gabrio 0:acd8e2ba10c5 81 * Radio events function pointer
gabrio 0:acd8e2ba10c5 82 */
gabrio 0:acd8e2ba10c5 83 static RadioEvents_t RadioEvents;
gabrio 0:acd8e2ba10c5 84
gabrio 0:acd8e2ba10c5 85 /*
gabrio 0:acd8e2ba10c5 86 * Global variables declarations
gabrio 0:acd8e2ba10c5 87 */
gabrio 0:acd8e2ba10c5 88 SX1276Generic *Radio;
gabrio 0:acd8e2ba10c5 89
gabrio 0:acd8e2ba10c5 90 uint16_t BufferSize = BUFFER_SIZE;
gabrio 0:acd8e2ba10c5 91 uint8_t *Buffer;
gabrio 0:acd8e2ba10c5 92
gabrio 0:acd8e2ba10c5 93 DigitalOut *led3;
gabrio 0:acd8e2ba10c5 94
gabrio 0:acd8e2ba10c5 95 AnalogIn analog0(A0);
gabrio 0:acd8e2ba10c5 96 AnalogIn analog2(A2);
gabrio 0:acd8e2ba10c5 97
gabrio 0:acd8e2ba10c5 98 int Transmitter()
gabrio 0:acd8e2ba10c5 99 {
gabrio 0:acd8e2ba10c5 100
gabrio 0:acd8e2ba10c5 101 Buffer = new uint8_t[BUFFER_SIZE];
gabrio 0:acd8e2ba10c5 102
gabrio 0:acd8e2ba10c5 103 #ifdef B_L072Z_LRWAN1_LORA
gabrio 0:acd8e2ba10c5 104 Radio = new SX1276Generic(NULL, MURATA_SX1276,
gabrio 0:acd8e2ba10c5 105 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
gabrio 0:acd8e2ba10c5 106 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
gabrio 0:acd8e2ba10c5 107 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
gabrio 0:acd8e2ba10c5 108 #else // RFM95
gabrio 0:acd8e2ba10c5 109 Radio = new SX1276Generic(NULL, RFM95_SX1276,
gabrio 0:acd8e2ba10c5 110 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
gabrio 0:acd8e2ba10c5 111 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
gabrio 0:acd8e2ba10c5 112
gabrio 0:acd8e2ba10c5 113 #endif
gabrio 0:acd8e2ba10c5 114
gabrio 0:acd8e2ba10c5 115 dprintf("Transmitter Application, Be-P" );
gabrio 0:acd8e2ba10c5 116 dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
gabrio 0:acd8e2ba10c5 117 dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
gabrio 0:acd8e2ba10c5 118 #if USE_MODEM_LORA == 1
gabrio 0:acd8e2ba10c5 119 dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
gabrio 0:acd8e2ba10c5 120 dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
gabrio 0:acd8e2ba10c5 121 #elif USE_MODEM_FSK == 1
gabrio 0:acd8e2ba10c5 122 dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
gabrio 0:acd8e2ba10c5 123 dprintf("Baudrate: %d", FSK_DATARATE);
gabrio 0:acd8e2ba10c5 124 #endif
gabrio 0:acd8e2ba10c5 125
gabrio 0:acd8e2ba10c5 126 // Initialize Radio driver
gabrio 0:acd8e2ba10c5 127 RadioEvents.TxDone = OnTxDone;
gabrio 0:acd8e2ba10c5 128 RadioEvents.RxDone = OnRxDone;
gabrio 0:acd8e2ba10c5 129 RadioEvents.RxError = OnRxError;
gabrio 0:acd8e2ba10c5 130 RadioEvents.TxTimeout = OnTxTimeout;
gabrio 0:acd8e2ba10c5 131 RadioEvents.RxTimeout = OnRxTimeout;
gabrio 0:acd8e2ba10c5 132 if (Radio->Init( &RadioEvents ) == false) {
gabrio 0:acd8e2ba10c5 133 while(1) {
gabrio 0:acd8e2ba10c5 134 dprintf("Radio could not be detected!");
gabrio 0:acd8e2ba10c5 135 wait( 1 );
gabrio 0:acd8e2ba10c5 136 }
gabrio 0:acd8e2ba10c5 137 }
gabrio 0:acd8e2ba10c5 138
gabrio 0:acd8e2ba10c5 139
gabrio 0:acd8e2ba10c5 140 switch(Radio->DetectBoardType()) {
gabrio 0:acd8e2ba10c5 141 case SX1276MB1LAS:
gabrio 0:acd8e2ba10c5 142 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 143 dprintf(" > Board Type: SX1276MB1LAS <");
gabrio 0:acd8e2ba10c5 144 break;
gabrio 0:acd8e2ba10c5 145 case SX1276MB1MAS:
gabrio 0:acd8e2ba10c5 146 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 147 dprintf(" > Board Type: SX1276MB1LAS <");
gabrio 0:acd8e2ba10c5 148 case MURATA_SX1276:
gabrio 0:acd8e2ba10c5 149 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 150 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
gabrio 0:acd8e2ba10c5 151 break;
gabrio 0:acd8e2ba10c5 152 case RFM95_SX1276:
gabrio 0:acd8e2ba10c5 153 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 154 dprintf(" > HopeRF RFM95xx <");
gabrio 0:acd8e2ba10c5 155 break;
gabrio 0:acd8e2ba10c5 156 default:
gabrio 0:acd8e2ba10c5 157 dprintf(" > Board Type: unknown <");
gabrio 0:acd8e2ba10c5 158 }
gabrio 0:acd8e2ba10c5 159
gabrio 0:acd8e2ba10c5 160 Radio->SetChannel(RF_FREQUENCY );
gabrio 0:acd8e2ba10c5 161
gabrio 0:acd8e2ba10c5 162 #if USE_MODEM_LORA == 1
gabrio 0:acd8e2ba10c5 163
gabrio 0:acd8e2ba10c5 164 if (LORA_FHSS_ENABLED)
gabrio 0:acd8e2ba10c5 165 dprintf(" > LORA FHSS Mode <");
gabrio 0:acd8e2ba10c5 166 if (!LORA_FHSS_ENABLED)
gabrio 0:acd8e2ba10c5 167 dprintf(" > LORA Mode <");
gabrio 0:acd8e2ba10c5 168
gabrio 0:acd8e2ba10c5 169 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
gabrio 0:acd8e2ba10c5 170 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
gabrio 0:acd8e2ba10c5 171 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
gabrio 0:acd8e2ba10c5 172 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
gabrio 0:acd8e2ba10c5 173 LORA_IQ_INVERSION_ON, 2000 );
gabrio 0:acd8e2ba10c5 174
gabrio 0:acd8e2ba10c5 175 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
gabrio 0:acd8e2ba10c5 176 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
gabrio 0:acd8e2ba10c5 177 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
gabrio 0:acd8e2ba10c5 178 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
gabrio 0:acd8e2ba10c5 179 LORA_IQ_INVERSION_ON, true );
gabrio 0:acd8e2ba10c5 180
gabrio 0:acd8e2ba10c5 181 #elif USE_MODEM_FSK == 1
gabrio 0:acd8e2ba10c5 182
gabrio 0:acd8e2ba10c5 183 dprintf(" > FSK Mode <");
gabrio 0:acd8e2ba10c5 184 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
gabrio 0:acd8e2ba10c5 185 FSK_DATARATE, 0,
gabrio 0:acd8e2ba10c5 186 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
gabrio 0:acd8e2ba10c5 187 FSK_CRC_ENABLED, 0, 0, 0, 2000 );
gabrio 0:acd8e2ba10c5 188
gabrio 0:acd8e2ba10c5 189 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
gabrio 0:acd8e2ba10c5 190 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
gabrio 0:acd8e2ba10c5 191 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
gabrio 0:acd8e2ba10c5 192 0, 0, false, true );
gabrio 0:acd8e2ba10c5 193
gabrio 0:acd8e2ba10c5 194 #else
gabrio 0:acd8e2ba10c5 195
gabrio 0:acd8e2ba10c5 196 #error "Please define a modem in the compiler options."
gabrio 0:acd8e2ba10c5 197
gabrio 0:acd8e2ba10c5 198 #endif
gabrio 0:acd8e2ba10c5 199
gabrio 0:acd8e2ba10c5 200 Radio->Rx( RX_TIMEOUT_VALUE );
gabrio 0:acd8e2ba10c5 201
gabrio 0:acd8e2ba10c5 202 //@START
gabrio 0:acd8e2ba10c5 203 float readed;
gabrio 0:acd8e2ba10c5 204 char readed_tostr[100]={0};
gabrio 0:acd8e2ba10c5 205
gabrio 0:acd8e2ba10c5 206 while(1){
gabrio 0:acd8e2ba10c5 207
gabrio 0:acd8e2ba10c5 208 //ANALOG0 READ AND SEND
gabrio 0:acd8e2ba10c5 209 readed = analog0.read();
gabrio 0:acd8e2ba10c5 210 snprintf(readed_tostr,sizeof(readed_tostr),"ALGG A0:%f",readed);
gabrio 0:acd8e2ba10c5 211
gabrio 0:acd8e2ba10c5 212 dprintf("sending:%s",readed_tostr);
gabrio 0:acd8e2ba10c5 213
gabrio 0:acd8e2ba10c5 214 Radio->Send(readed_tostr,strlen(readed_tostr));
gabrio 0:acd8e2ba10c5 215 wait_ms(1000);
gabrio 0:acd8e2ba10c5 216
gabrio 0:acd8e2ba10c5 217 //ANALOG3 READ AND SEND
gabrio 0:acd8e2ba10c5 218 readed = analog2.read();
gabrio 0:acd8e2ba10c5 219 snprintf(readed_tostr,sizeof(readed_tostr),"ALGG A2:%f",readed);
gabrio 0:acd8e2ba10c5 220
gabrio 0:acd8e2ba10c5 221 dprintf("sending:%s",readed_tostr);
gabrio 0:acd8e2ba10c5 222
gabrio 0:acd8e2ba10c5 223 Radio->Send(readed_tostr,strlen(readed_tostr));
gabrio 0:acd8e2ba10c5 224 wait_ms(1000);
gabrio 0:acd8e2ba10c5 225
gabrio 0:acd8e2ba10c5 226
gabrio 0:acd8e2ba10c5 227 }
gabrio 0:acd8e2ba10c5 228
gabrio 0:acd8e2ba10c5 229 }
gabrio 0:acd8e2ba10c5 230
gabrio 0:acd8e2ba10c5 231 void OnTxDone(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 232 {
gabrio 0:acd8e2ba10c5 233 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 234 State = TX;
gabrio 0:acd8e2ba10c5 235 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 236 dprintf("> OnTxDone");
gabrio 0:acd8e2ba10c5 237 }
gabrio 0:acd8e2ba10c5 238
gabrio 0:acd8e2ba10c5 239 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
gabrio 0:acd8e2ba10c5 240 {
gabrio 0:acd8e2ba10c5 241 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 242 BufferSize = size;
gabrio 0:acd8e2ba10c5 243 memcpy( Buffer, payload, BufferSize );
gabrio 0:acd8e2ba10c5 244 State = RX;
gabrio 0:acd8e2ba10c5 245 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 246 dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
gabrio 0:acd8e2ba10c5 247 dump("Data:", payload, size);
gabrio 0:acd8e2ba10c5 248 }
gabrio 0:acd8e2ba10c5 249
gabrio 0:acd8e2ba10c5 250 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 251 {
gabrio 0:acd8e2ba10c5 252 *led3 = 0;
gabrio 0:acd8e2ba10c5 253 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 254 State = TX_TIMEOUT;
gabrio 0:acd8e2ba10c5 255 if(DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 256 dprintf("> OnTxTimeout");
gabrio 0:acd8e2ba10c5 257 }
gabrio 0:acd8e2ba10c5 258
gabrio 0:acd8e2ba10c5 259 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 260 {
gabrio 0:acd8e2ba10c5 261 *led3 = 0;
gabrio 0:acd8e2ba10c5 262 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 263 Buffer[BufferSize-1] = 0;
gabrio 0:acd8e2ba10c5 264 State = RX_TIMEOUT;
gabrio 0:acd8e2ba10c5 265 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 266 dprintf("> OnRxTimeout");
gabrio 0:acd8e2ba10c5 267 }
gabrio 0:acd8e2ba10c5 268
gabrio 0:acd8e2ba10c5 269 void OnRxError(void *radio, void *userThisPtr, void *userData)
gabrio 0:acd8e2ba10c5 270 {
gabrio 0:acd8e2ba10c5 271 Radio->Sleep( );
gabrio 0:acd8e2ba10c5 272 State = RX_ERROR;
gabrio 0:acd8e2ba10c5 273 if (DEBUG_MESSAGE)
gabrio 0:acd8e2ba10c5 274 dprintf("> OnRxError");
gabrio 0:acd8e2ba10c5 275 }
gabrio 0:acd8e2ba10c5 276
gabrio 0:acd8e2ba10c5 277 #endif