LP Long Distance IR Vision Robot

Dependencies:   max77650_charger_sample BufferedSerial SX1276GenericLib Adafruit-MotorShield NEO-6m-GPS MAX17055_EZconfig Adafruit_GFX USBDeviceHT Adafruit-PWM-Servo-Driver

Committer:
dev_alexander
Date:
Fri Jul 13 18:22:53 2018 +0000
Revision:
22:abca9d17d13d
Parent:
19:9f035b9e65ec
Child:
23:f74a50977593
This basic working revision sets up communication with dedicated master or slave compile options based on the board it was compiled for. MAX32630FTHR assumes Master, and MAX32620FHTR assumes Slave.

Who changed what in which revision?

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