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:
Thu Jul 19 21:13:19 2018 +0000
Revision:
25:1a031add188a
Parent:
24:e8d03912f303
Child:
26:69aba05f010f
Got messages of different sizes to send to each other.  Changed maximum number of bytes per payload to a max value of 255 for more sensor data to be added. Also began debugging the grid eye sensor data acquisition issue.

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