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 20 16:31:41 2018 +0000
Revision:
26:69aba05f010f
Parent:
25:1a031add188a
Child:
27:6b549f838f0a
Tried to change how the global buffers are instantiated and where they are to be stored.

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