090819

Dependencies:   mbed BufferedSerial SX1276GenericLib

Committer:
AWonline01
Date:
Fri Aug 09 10:54:20 2019 +0000
Revision:
0:c4d8c7cf69bb
first090819

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AWonline01 0:c4d8c7cf69bb 1 /*
AWonline01 0:c4d8c7cf69bb 2 * This file contains a copy of the master content sx1276PingPong
AWonline01 0:c4d8c7cf69bb 3 * with adaption for the SX1276Generic environment
AWonline01 0:c4d8c7cf69bb 4 * (c) 2017 Helmut Tschemernjak
AWonline01 0:c4d8c7cf69bb 5 * 30826 Garbsen (Hannover) Germany
AWonline01 0:c4d8c7cf69bb 6 */
AWonline01 0:c4d8c7cf69bb 7
AWonline01 0:c4d8c7cf69bb 8 #include "mbed.h"
AWonline01 0:c4d8c7cf69bb 9 #include "PinMap.h"
AWonline01 0:c4d8c7cf69bb 10 #include "GenericPingPong.h"
AWonline01 0:c4d8c7cf69bb 11 #include "sx1276-mbed-hal.h"
AWonline01 0:c4d8c7cf69bb 12 #include "main.h"
AWonline01 0:c4d8c7cf69bb 13
AWonline01 0:c4d8c7cf69bb 14 #ifdef FEATURE_LORA
AWonline01 0:c4d8c7cf69bb 15
AWonline01 0:c4d8c7cf69bb 16 /* Set this flag to '1' to display debug messages on the console */
AWonline01 0:c4d8c7cf69bb 17 #define DEBUG_MESSAGE 1
AWonline01 0:c4d8c7cf69bb 18
AWonline01 0:c4d8c7cf69bb 19 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
AWonline01 0:c4d8c7cf69bb 20 #define USE_MODEM_LORA 1
AWonline01 0:c4d8c7cf69bb 21 #define USE_MODEM_FSK !USE_MODEM_LORA
AWonline01 0:c4d8c7cf69bb 22 #define RF_FREQUENCY RF_FREQUENCY_868_1 // Hz
AWonline01 0:c4d8c7cf69bb 23 #define TX_OUTPUT_POWER 14 // 14 dBm
AWonline01 0:c4d8c7cf69bb 24
AWonline01 0:c4d8c7cf69bb 25 #if USE_MODEM_LORA == 1
AWonline01 0:c4d8c7cf69bb 26
AWonline01 0:c4d8c7cf69bb 27 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
AWonline01 0:c4d8c7cf69bb 28 #define LORA_SPREADING_FACTOR LORA_SF7
AWonline01 0:c4d8c7cf69bb 29 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
AWonline01 0:c4d8c7cf69bb 30
AWonline01 0:c4d8c7cf69bb 31 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
AWonline01 0:c4d8c7cf69bb 32 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
AWonline01 0:c4d8c7cf69bb 33 #define LORA_FIX_LENGTH_PAYLOAD_ON false
AWonline01 0:c4d8c7cf69bb 34 #define LORA_FHSS_ENABLED false
AWonline01 0:c4d8c7cf69bb 35 #define LORA_NB_SYMB_HOP 4
AWonline01 0:c4d8c7cf69bb 36 #define LORA_IQ_INVERSION_ON false
AWonline01 0:c4d8c7cf69bb 37 #define LORA_CRC_ENABLED true
AWonline01 0:c4d8c7cf69bb 38
AWonline01 0:c4d8c7cf69bb 39 #elif USE_MODEM_FSK == 1
AWonline01 0:c4d8c7cf69bb 40
AWonline01 0:c4d8c7cf69bb 41 #define FSK_FDEV 25000 // Hz
AWonline01 0:c4d8c7cf69bb 42 #define FSK_DATARATE 19200 // bps
AWonline01 0:c4d8c7cf69bb 43 #define FSK_BANDWIDTH 50000 // Hz
AWonline01 0:c4d8c7cf69bb 44 #define FSK_AFC_BANDWIDTH 83333 // Hz
AWonline01 0:c4d8c7cf69bb 45 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
AWonline01 0:c4d8c7cf69bb 46 #define FSK_FIX_LENGTH_PAYLOAD_ON false
AWonline01 0:c4d8c7cf69bb 47 #define FSK_CRC_ENABLED true
AWonline01 0:c4d8c7cf69bb 48
AWonline01 0:c4d8c7cf69bb 49 #else
AWonline01 0:c4d8c7cf69bb 50 #error "Please define a modem in the compiler options."
AWonline01 0:c4d8c7cf69bb 51 #endif
AWonline01 0:c4d8c7cf69bb 52
AWonline01 0:c4d8c7cf69bb 53
AWonline01 0:c4d8c7cf69bb 54 #define RX_TIMEOUT_VALUE 3500 // in ms
AWonline01 0:c4d8c7cf69bb 55
AWonline01 0:c4d8c7cf69bb 56 //#define BUFFER_SIZE 32 // Define the payload size here
AWonline01 0:c4d8c7cf69bb 57 #define BUFFER_SIZE 64 // Define the payload size here
AWonline01 0:c4d8c7cf69bb 58
AWonline01 0:c4d8c7cf69bb 59 /*
AWonline01 0:c4d8c7cf69bb 60 * Global variables declarations
AWonline01 0:c4d8c7cf69bb 61 */
AWonline01 0:c4d8c7cf69bb 62 typedef enum
AWonline01 0:c4d8c7cf69bb 63 {
AWonline01 0:c4d8c7cf69bb 64 LOWPOWER = 0,
AWonline01 0:c4d8c7cf69bb 65 IDLE,
AWonline01 0:c4d8c7cf69bb 66
AWonline01 0:c4d8c7cf69bb 67 RX,
AWonline01 0:c4d8c7cf69bb 68 RX_TIMEOUT,
AWonline01 0:c4d8c7cf69bb 69 RX_ERROR,
AWonline01 0:c4d8c7cf69bb 70
AWonline01 0:c4d8c7cf69bb 71 TX,
AWonline01 0:c4d8c7cf69bb 72 TX_TIMEOUT,
AWonline01 0:c4d8c7cf69bb 73
AWonline01 0:c4d8c7cf69bb 74 CAD,
AWonline01 0:c4d8c7cf69bb 75 CAD_DONE
AWonline01 0:c4d8c7cf69bb 76 } AppStates_t;
AWonline01 0:c4d8c7cf69bb 77
AWonline01 0:c4d8c7cf69bb 78 volatile AppStates_t State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 79
AWonline01 0:c4d8c7cf69bb 80 /*!
AWonline01 0:c4d8c7cf69bb 81 * Radio events function pointer
AWonline01 0:c4d8c7cf69bb 82 */
AWonline01 0:c4d8c7cf69bb 83 static RadioEvents_t RadioEvents;
AWonline01 0:c4d8c7cf69bb 84
AWonline01 0:c4d8c7cf69bb 85 /*
AWonline01 0:c4d8c7cf69bb 86 * Global variables declarations
AWonline01 0:c4d8c7cf69bb 87 */
AWonline01 0:c4d8c7cf69bb 88 SX1276Generic *Radio;
AWonline01 0:c4d8c7cf69bb 89
AWonline01 0:c4d8c7cf69bb 90
AWonline01 0:c4d8c7cf69bb 91 const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING";
AWonline01 0:c4d8c7cf69bb 92 const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG";
AWonline01 0:c4d8c7cf69bb 93
AWonline01 0:c4d8c7cf69bb 94 uint16_t BufferSize = BUFFER_SIZE;
AWonline01 0:c4d8c7cf69bb 95 uint8_t *Buffer;
AWonline01 0:c4d8c7cf69bb 96
AWonline01 0:c4d8c7cf69bb 97 DigitalOut *led3;
AWonline01 0:c4d8c7cf69bb 98
AWonline01 0:c4d8c7cf69bb 99
AWonline01 0:c4d8c7cf69bb 100 int SX1276PingPong()
AWonline01 0:c4d8c7cf69bb 101 {
AWonline01 0:c4d8c7cf69bb 102 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
AWonline01 0:c4d8c7cf69bb 103 DigitalOut *led = new DigitalOut(LED2);
AWonline01 0:c4d8c7cf69bb 104 #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1)
AWonline01 0:c4d8c7cf69bb 105 DigitalOut *led = new DigitalOut(LED4); // RX red
AWonline01 0:c4d8c7cf69bb 106 led3 = new DigitalOut(LED3); // TX blue
AWonline01 0:c4d8c7cf69bb 107 #else
AWonline01 0:c4d8c7cf69bb 108 DigitalOut *led = new DigitalOut(LED1);
AWonline01 0:c4d8c7cf69bb 109 led3 = led;
AWonline01 0:c4d8c7cf69bb 110 #endif
AWonline01 0:c4d8c7cf69bb 111
AWonline01 0:c4d8c7cf69bb 112 Buffer = new uint8_t[BUFFER_SIZE];
AWonline01 0:c4d8c7cf69bb 113 *led3 = 1;
AWonline01 0:c4d8c7cf69bb 114
AWonline01 0:c4d8c7cf69bb 115 #ifdef B_L072Z_LRWAN1_LORA
AWonline01 0:c4d8c7cf69bb 116 Radio = new SX1276Generic(NULL, MURATA_SX1276,
AWonline01 0:c4d8c7cf69bb 117 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
AWonline01 0:c4d8c7cf69bb 118 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
AWonline01 0:c4d8c7cf69bb 119 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
AWonline01 0:c4d8c7cf69bb 120 #else // RFM95
AWonline01 0:c4d8c7cf69bb 121 Radio = new SX1276Generic(NULL, RFM95_SX1276,
AWonline01 0:c4d8c7cf69bb 122 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
AWonline01 0:c4d8c7cf69bb 123 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
AWonline01 0:c4d8c7cf69bb 124
AWonline01 0:c4d8c7cf69bb 125 #endif
AWonline01 0:c4d8c7cf69bb 126
AWonline01 0:c4d8c7cf69bb 127 uint8_t i;
AWonline01 0:c4d8c7cf69bb 128 bool isMaster = true;
AWonline01 0:c4d8c7cf69bb 129
AWonline01 0:c4d8c7cf69bb 130 dprintf("SX1276 Ping Pong Demo Application" );
AWonline01 0:c4d8c7cf69bb 131 dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
AWonline01 0:c4d8c7cf69bb 132 dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
AWonline01 0:c4d8c7cf69bb 133 #if USE_MODEM_LORA == 1
AWonline01 0:c4d8c7cf69bb 134 dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
AWonline01 0:c4d8c7cf69bb 135 dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
AWonline01 0:c4d8c7cf69bb 136 #elif USE_MODEM_FSK == 1
AWonline01 0:c4d8c7cf69bb 137 dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
AWonline01 0:c4d8c7cf69bb 138 dprintf("Baudrate: %d", FSK_DATARATE);
AWonline01 0:c4d8c7cf69bb 139 #endif
AWonline01 0:c4d8c7cf69bb 140 // Initialize Radio driver
AWonline01 0:c4d8c7cf69bb 141 RadioEvents.TxDone = OnTxDone;
AWonline01 0:c4d8c7cf69bb 142 RadioEvents.RxDone = OnRxDone;
AWonline01 0:c4d8c7cf69bb 143 RadioEvents.RxError = OnRxError;
AWonline01 0:c4d8c7cf69bb 144 RadioEvents.TxTimeout = OnTxTimeout;
AWonline01 0:c4d8c7cf69bb 145 RadioEvents.RxTimeout = OnRxTimeout;
AWonline01 0:c4d8c7cf69bb 146 if (Radio->Init( &RadioEvents ) == false) {
AWonline01 0:c4d8c7cf69bb 147 while(1) {
AWonline01 0:c4d8c7cf69bb 148 dprintf("Radio could not be detected!");
AWonline01 0:c4d8c7cf69bb 149 wait( 1 );
AWonline01 0:c4d8c7cf69bb 150 }
AWonline01 0:c4d8c7cf69bb 151 }
AWonline01 0:c4d8c7cf69bb 152
AWonline01 0:c4d8c7cf69bb 153
AWonline01 0:c4d8c7cf69bb 154 switch(Radio->DetectBoardType()) {
AWonline01 0:c4d8c7cf69bb 155 case SX1276MB1LAS:
AWonline01 0:c4d8c7cf69bb 156 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 157 dprintf(" > Board Type: SX1276MB1LAS <");
AWonline01 0:c4d8c7cf69bb 158 break;
AWonline01 0:c4d8c7cf69bb 159 case SX1276MB1MAS:
AWonline01 0:c4d8c7cf69bb 160 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 161 dprintf(" > Board Type: SX1276MB1LAS <");
AWonline01 0:c4d8c7cf69bb 162 case MURATA_SX1276:
AWonline01 0:c4d8c7cf69bb 163 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 164 dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
AWonline01 0:c4d8c7cf69bb 165 break;
AWonline01 0:c4d8c7cf69bb 166 case RFM95_SX1276:
AWonline01 0:c4d8c7cf69bb 167 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 168 dprintf(" > HopeRF RFM95xx <");
AWonline01 0:c4d8c7cf69bb 169 break;
AWonline01 0:c4d8c7cf69bb 170 default:
AWonline01 0:c4d8c7cf69bb 171 dprintf(" > Board Type: unknown <");
AWonline01 0:c4d8c7cf69bb 172 }
AWonline01 0:c4d8c7cf69bb 173
AWonline01 0:c4d8c7cf69bb 174 Radio->SetChannel(RF_FREQUENCY );
AWonline01 0:c4d8c7cf69bb 175
AWonline01 0:c4d8c7cf69bb 176 #if USE_MODEM_LORA == 1
AWonline01 0:c4d8c7cf69bb 177
AWonline01 0:c4d8c7cf69bb 178 if (LORA_FHSS_ENABLED)
AWonline01 0:c4d8c7cf69bb 179 dprintf(" > LORA FHSS Mode <");
AWonline01 0:c4d8c7cf69bb 180 if (!LORA_FHSS_ENABLED)
AWonline01 0:c4d8c7cf69bb 181 dprintf(" > LORA Mode <");
AWonline01 0:c4d8c7cf69bb 182
AWonline01 0:c4d8c7cf69bb 183 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
AWonline01 0:c4d8c7cf69bb 184 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
AWonline01 0:c4d8c7cf69bb 185 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
AWonline01 0:c4d8c7cf69bb 186 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
AWonline01 0:c4d8c7cf69bb 187 LORA_IQ_INVERSION_ON, 2000 );
AWonline01 0:c4d8c7cf69bb 188
AWonline01 0:c4d8c7cf69bb 189 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
AWonline01 0:c4d8c7cf69bb 190 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
AWonline01 0:c4d8c7cf69bb 191 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
AWonline01 0:c4d8c7cf69bb 192 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
AWonline01 0:c4d8c7cf69bb 193 LORA_IQ_INVERSION_ON, true );
AWonline01 0:c4d8c7cf69bb 194
AWonline01 0:c4d8c7cf69bb 195 #elif USE_MODEM_FSK == 1
AWonline01 0:c4d8c7cf69bb 196
AWonline01 0:c4d8c7cf69bb 197 dprintf(" > FSK Mode <");
AWonline01 0:c4d8c7cf69bb 198 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
AWonline01 0:c4d8c7cf69bb 199 FSK_DATARATE, 0,
AWonline01 0:c4d8c7cf69bb 200 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
AWonline01 0:c4d8c7cf69bb 201 FSK_CRC_ENABLED, 0, 0, 0, 2000 );
AWonline01 0:c4d8c7cf69bb 202
AWonline01 0:c4d8c7cf69bb 203 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
AWonline01 0:c4d8c7cf69bb 204 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
AWonline01 0:c4d8c7cf69bb 205 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
AWonline01 0:c4d8c7cf69bb 206 0, 0, false, true );
AWonline01 0:c4d8c7cf69bb 207
AWonline01 0:c4d8c7cf69bb 208 #else
AWonline01 0:c4d8c7cf69bb 209
AWonline01 0:c4d8c7cf69bb 210 #error "Please define a modem in the compiler options."
AWonline01 0:c4d8c7cf69bb 211
AWonline01 0:c4d8c7cf69bb 212 #endif
AWonline01 0:c4d8c7cf69bb 213
AWonline01 0:c4d8c7cf69bb 214 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 215 dprintf("Starting Ping-Pong loop");
AWonline01 0:c4d8c7cf69bb 216
AWonline01 0:c4d8c7cf69bb 217
AWonline01 0:c4d8c7cf69bb 218 Radio->Rx( RX_TIMEOUT_VALUE );
AWonline01 0:c4d8c7cf69bb 219
AWonline01 0:c4d8c7cf69bb 220 while( 1 )
AWonline01 0:c4d8c7cf69bb 221 {
AWonline01 0:c4d8c7cf69bb 222 #ifdef TARGET_STM32L4
AWonline01 0:c4d8c7cf69bb 223 WatchDogUpdate();
AWonline01 0:c4d8c7cf69bb 224 #endif
AWonline01 0:c4d8c7cf69bb 225
AWonline01 0:c4d8c7cf69bb 226 switch( State )
AWonline01 0:c4d8c7cf69bb 227 {
AWonline01 0:c4d8c7cf69bb 228 case RX:
AWonline01 0:c4d8c7cf69bb 229 *led3 = 0;
AWonline01 0:c4d8c7cf69bb 230 if( isMaster == true )
AWonline01 0:c4d8c7cf69bb 231 {
AWonline01 0:c4d8c7cf69bb 232 if( BufferSize > 0 )
AWonline01 0:c4d8c7cf69bb 233 {
AWonline01 0:c4d8c7cf69bb 234 if( memcmp(Buffer, PongMsg, sizeof(PongMsg)) == 0 )
AWonline01 0:c4d8c7cf69bb 235 {
AWonline01 0:c4d8c7cf69bb 236 *led = !*led;
AWonline01 0:c4d8c7cf69bb 237 dprintf( "...Pong" );
AWonline01 0:c4d8c7cf69bb 238 // Send the next PING frame
AWonline01 0:c4d8c7cf69bb 239 memcpy(Buffer, PingMsg, sizeof(PingMsg));
AWonline01 0:c4d8c7cf69bb 240 // We fill the buffer with numbers for the payload
AWonline01 0:c4d8c7cf69bb 241 for( i = sizeof(PingMsg); i < BufferSize; i++ )
AWonline01 0:c4d8c7cf69bb 242 {
AWonline01 0:c4d8c7cf69bb 243 Buffer[i] = i - sizeof(PingMsg);
AWonline01 0:c4d8c7cf69bb 244 }
AWonline01 0:c4d8c7cf69bb 245 wait_ms( 10 );
AWonline01 0:c4d8c7cf69bb 246 Radio->Send( Buffer, BufferSize );
AWonline01 0:c4d8c7cf69bb 247 }
AWonline01 0:c4d8c7cf69bb 248 else if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
AWonline01 0:c4d8c7cf69bb 249 { // A master already exists then become a slave
AWonline01 0:c4d8c7cf69bb 250 dprintf( "...Ping" );
AWonline01 0:c4d8c7cf69bb 251 *led = !*led;
AWonline01 0:c4d8c7cf69bb 252 isMaster = false;
AWonline01 0:c4d8c7cf69bb 253 // Send the next PONG frame
AWonline01 0:c4d8c7cf69bb 254 memcpy(Buffer, PongMsg, sizeof(PongMsg));
AWonline01 0:c4d8c7cf69bb 255 // We fill the buffer with numbers for the payload
AWonline01 0:c4d8c7cf69bb 256 for( i = sizeof(PongMsg); i < BufferSize; i++ )
AWonline01 0:c4d8c7cf69bb 257 {
AWonline01 0:c4d8c7cf69bb 258 Buffer[i] = i - sizeof(PongMsg);
AWonline01 0:c4d8c7cf69bb 259 }
AWonline01 0:c4d8c7cf69bb 260 wait_ms( 10 );
AWonline01 0:c4d8c7cf69bb 261 Radio->Send( Buffer, BufferSize );
AWonline01 0:c4d8c7cf69bb 262 }
AWonline01 0:c4d8c7cf69bb 263 else // valid reception but neither a PING or a PONG message
AWonline01 0:c4d8c7cf69bb 264 { // Set device as master ans start again
AWonline01 0:c4d8c7cf69bb 265 isMaster = true;
AWonline01 0:c4d8c7cf69bb 266 Radio->Rx( RX_TIMEOUT_VALUE );
AWonline01 0:c4d8c7cf69bb 267 }
AWonline01 0:c4d8c7cf69bb 268 }
AWonline01 0:c4d8c7cf69bb 269 }
AWonline01 0:c4d8c7cf69bb 270 else
AWonline01 0:c4d8c7cf69bb 271 {
AWonline01 0:c4d8c7cf69bb 272 if( BufferSize > 0 )
AWonline01 0:c4d8c7cf69bb 273 {
AWonline01 0:c4d8c7cf69bb 274 if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
AWonline01 0:c4d8c7cf69bb 275 {
AWonline01 0:c4d8c7cf69bb 276 *led = !*led;
AWonline01 0:c4d8c7cf69bb 277 dprintf( "...Ping" );
AWonline01 0:c4d8c7cf69bb 278 // Send the reply to the PING string
AWonline01 0:c4d8c7cf69bb 279 memcpy(Buffer, PongMsg, sizeof(PongMsg));
AWonline01 0:c4d8c7cf69bb 280 // We fill the buffer with numbers for the payload
AWonline01 0:c4d8c7cf69bb 281 for( i = sizeof(PongMsg); i < BufferSize; i++ )
AWonline01 0:c4d8c7cf69bb 282 {
AWonline01 0:c4d8c7cf69bb 283 Buffer[i] = i - sizeof(PongMsg);
AWonline01 0:c4d8c7cf69bb 284 }
AWonline01 0:c4d8c7cf69bb 285 wait_ms( 10 );
AWonline01 0:c4d8c7cf69bb 286 Radio->Send( Buffer, BufferSize );
AWonline01 0:c4d8c7cf69bb 287 }
AWonline01 0:c4d8c7cf69bb 288 else // valid reception but not a PING as expected
AWonline01 0:c4d8c7cf69bb 289 { // Set device as master and start again
AWonline01 0:c4d8c7cf69bb 290 isMaster = true;
AWonline01 0:c4d8c7cf69bb 291 Radio->Rx( RX_TIMEOUT_VALUE );
AWonline01 0:c4d8c7cf69bb 292 }
AWonline01 0:c4d8c7cf69bb 293 }
AWonline01 0:c4d8c7cf69bb 294 }
AWonline01 0:c4d8c7cf69bb 295 State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 296 break;
AWonline01 0:c4d8c7cf69bb 297 case TX:
AWonline01 0:c4d8c7cf69bb 298 *led3 = 1;
AWonline01 0:c4d8c7cf69bb 299 if( isMaster == true )
AWonline01 0:c4d8c7cf69bb 300 {
AWonline01 0:c4d8c7cf69bb 301 dprintf("Ping..." );
AWonline01 0:c4d8c7cf69bb 302 }
AWonline01 0:c4d8c7cf69bb 303 else
AWonline01 0:c4d8c7cf69bb 304 {
AWonline01 0:c4d8c7cf69bb 305 dprintf("Pong..." );
AWonline01 0:c4d8c7cf69bb 306 }
AWonline01 0:c4d8c7cf69bb 307 Radio->Rx( RX_TIMEOUT_VALUE );
AWonline01 0:c4d8c7cf69bb 308 State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 309 break;
AWonline01 0:c4d8c7cf69bb 310 case RX_TIMEOUT:
AWonline01 0:c4d8c7cf69bb 311 if( isMaster == true )
AWonline01 0:c4d8c7cf69bb 312 {
AWonline01 0:c4d8c7cf69bb 313 // Send the next PING frame
AWonline01 0:c4d8c7cf69bb 314 memcpy(Buffer, PingMsg, sizeof(PingMsg));
AWonline01 0:c4d8c7cf69bb 315 for( i = sizeof(PingMsg); i < BufferSize; i++ )
AWonline01 0:c4d8c7cf69bb 316 {
AWonline01 0:c4d8c7cf69bb 317 Buffer[i] = i - sizeof(PingMsg);
AWonline01 0:c4d8c7cf69bb 318 }
AWonline01 0:c4d8c7cf69bb 319 wait_ms( 10 );
AWonline01 0:c4d8c7cf69bb 320 Radio->Send( Buffer, BufferSize );
AWonline01 0:c4d8c7cf69bb 321 }
AWonline01 0:c4d8c7cf69bb 322 else
AWonline01 0:c4d8c7cf69bb 323 {
AWonline01 0:c4d8c7cf69bb 324 Radio->Rx( RX_TIMEOUT_VALUE );
AWonline01 0:c4d8c7cf69bb 325 }
AWonline01 0:c4d8c7cf69bb 326 State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 327 break;
AWonline01 0:c4d8c7cf69bb 328 case RX_ERROR:
AWonline01 0:c4d8c7cf69bb 329 // We have received a Packet with a CRC error, send reply as if packet was correct
AWonline01 0:c4d8c7cf69bb 330 if( isMaster == true )
AWonline01 0:c4d8c7cf69bb 331 {
AWonline01 0:c4d8c7cf69bb 332 // Send the next PING frame
AWonline01 0:c4d8c7cf69bb 333 memcpy(Buffer, PingMsg, sizeof(PingMsg));
AWonline01 0:c4d8c7cf69bb 334 for( i = 4; i < BufferSize; i++ )
AWonline01 0:c4d8c7cf69bb 335 {
AWonline01 0:c4d8c7cf69bb 336 Buffer[i] = i - 4;
AWonline01 0:c4d8c7cf69bb 337 }
AWonline01 0:c4d8c7cf69bb 338 wait_ms( 10 );
AWonline01 0:c4d8c7cf69bb 339 Radio->Send( Buffer, BufferSize );
AWonline01 0:c4d8c7cf69bb 340 }
AWonline01 0:c4d8c7cf69bb 341 else
AWonline01 0:c4d8c7cf69bb 342 {
AWonline01 0:c4d8c7cf69bb 343 // Send the next PONG frame
AWonline01 0:c4d8c7cf69bb 344 memcpy(Buffer, PongMsg, sizeof(PongMsg));
AWonline01 0:c4d8c7cf69bb 345 for( i = sizeof(PongMsg); i < BufferSize; i++ )
AWonline01 0:c4d8c7cf69bb 346 {
AWonline01 0:c4d8c7cf69bb 347 Buffer[i] = i - sizeof(PongMsg);
AWonline01 0:c4d8c7cf69bb 348 }
AWonline01 0:c4d8c7cf69bb 349 wait_ms( 10 );
AWonline01 0:c4d8c7cf69bb 350 Radio->Send( Buffer, BufferSize );
AWonline01 0:c4d8c7cf69bb 351 }
AWonline01 0:c4d8c7cf69bb 352 State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 353 break;
AWonline01 0:c4d8c7cf69bb 354 case TX_TIMEOUT:
AWonline01 0:c4d8c7cf69bb 355 Radio->Rx( RX_TIMEOUT_VALUE );
AWonline01 0:c4d8c7cf69bb 356 State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 357 break;
AWonline01 0:c4d8c7cf69bb 358 case LOWPOWER:
AWonline01 0:c4d8c7cf69bb 359 sleep();
AWonline01 0:c4d8c7cf69bb 360 break;
AWonline01 0:c4d8c7cf69bb 361 default:
AWonline01 0:c4d8c7cf69bb 362 State = LOWPOWER;
AWonline01 0:c4d8c7cf69bb 363 break;
AWonline01 0:c4d8c7cf69bb 364 }
AWonline01 0:c4d8c7cf69bb 365 }
AWonline01 0:c4d8c7cf69bb 366 }
AWonline01 0:c4d8c7cf69bb 367
AWonline01 0:c4d8c7cf69bb 368 void OnTxDone(void *radio, void *userThisPtr, void *userData)
AWonline01 0:c4d8c7cf69bb 369 {
AWonline01 0:c4d8c7cf69bb 370 Radio->Sleep( );
AWonline01 0:c4d8c7cf69bb 371 State = TX;
AWonline01 0:c4d8c7cf69bb 372 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 373 dprintf("> OnTxDone");
AWonline01 0:c4d8c7cf69bb 374 }
AWonline01 0:c4d8c7cf69bb 375
AWonline01 0:c4d8c7cf69bb 376 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
AWonline01 0:c4d8c7cf69bb 377 {
AWonline01 0:c4d8c7cf69bb 378 Radio->Sleep( );
AWonline01 0:c4d8c7cf69bb 379 BufferSize = size;
AWonline01 0:c4d8c7cf69bb 380 memcpy( Buffer, payload, BufferSize );
AWonline01 0:c4d8c7cf69bb 381 State = RX;
AWonline01 0:c4d8c7cf69bb 382 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 383 dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
AWonline01 0:c4d8c7cf69bb 384 dump("Data:", payload, size);
AWonline01 0:c4d8c7cf69bb 385 }
AWonline01 0:c4d8c7cf69bb 386
AWonline01 0:c4d8c7cf69bb 387 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
AWonline01 0:c4d8c7cf69bb 388 {
AWonline01 0:c4d8c7cf69bb 389 *led3 = 0;
AWonline01 0:c4d8c7cf69bb 390 Radio->Sleep( );
AWonline01 0:c4d8c7cf69bb 391 State = TX_TIMEOUT;
AWonline01 0:c4d8c7cf69bb 392 if(DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 393 dprintf("> OnTxTimeout");
AWonline01 0:c4d8c7cf69bb 394 }
AWonline01 0:c4d8c7cf69bb 395
AWonline01 0:c4d8c7cf69bb 396 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
AWonline01 0:c4d8c7cf69bb 397 {
AWonline01 0:c4d8c7cf69bb 398 *led3 = 0;
AWonline01 0:c4d8c7cf69bb 399 Radio->Sleep( );
AWonline01 0:c4d8c7cf69bb 400 Buffer[BufferSize-1] = 0;
AWonline01 0:c4d8c7cf69bb 401 State = RX_TIMEOUT;
AWonline01 0:c4d8c7cf69bb 402 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 403 dprintf("> OnRxTimeout");
AWonline01 0:c4d8c7cf69bb 404 }
AWonline01 0:c4d8c7cf69bb 405
AWonline01 0:c4d8c7cf69bb 406 void OnRxError(void *radio, void *userThisPtr, void *userData)
AWonline01 0:c4d8c7cf69bb 407 {
AWonline01 0:c4d8c7cf69bb 408 Radio->Sleep( );
AWonline01 0:c4d8c7cf69bb 409 State = RX_ERROR;
AWonline01 0:c4d8c7cf69bb 410 if (DEBUG_MESSAGE)
AWonline01 0:c4d8c7cf69bb 411 dprintf("> OnRxError");
AWonline01 0:c4d8c7cf69bb 412 }
AWonline01 0:c4d8c7cf69bb 413
AWonline01 0:c4d8c7cf69bb 414 #endif