MAX32625PICO LP0 mode

Dependencies:   SX1276GenericLib USBDevice

Fork of PICO_LP0 by Walter Luu

Committer:
walterluu
Date:
Fri Aug 07 00:50:01 2020 +0000
Revision:
0:664d9df11a00
Child:
2:f6ae69f3bfce
Functional firmware version 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
walterluu 0:664d9df11a00 1 #include "mbed.h"
walterluu 0:664d9df11a00 2 #include "PinMap.h"
walterluu 0:664d9df11a00 3
walterluu 0:664d9df11a00 4 //#include "BufferedSerial.h"
walterluu 0:664d9df11a00 5
walterluu 0:664d9df11a00 6 //#ifdef FEATURE_USBSERIAL
walterluu 0:664d9df11a00 7 //#include "USBSerialBuffered.h"
walterluu 0:664d9df11a00 8 //#endif
walterluu 0:664d9df11a00 9 //
walterluu 0:664d9df11a00 10 //#ifdef FEATURE_USBSERIAL
walterluu 0:664d9df11a00 11 //extern USBSerialBuffered *usb;
walterluu 0:664d9df11a00 12 //#endif
walterluu 0:664d9df11a00 13
walterluu 0:664d9df11a00 14 #include "GenericPingPong.h"
walterluu 0:664d9df11a00 15
walterluu 0:664d9df11a00 16 #define FEATURE_LORA
walterluu 0:664d9df11a00 17 #include "sx1276-mbed-hal.h"
walterluu 0:664d9df11a00 18 #include "main.h"
walterluu 0:664d9df11a00 19
walterluu 0:664d9df11a00 20
walterluu 0:664d9df11a00 21 //#if defined(TARGET_MAX32630FTHR) // using the RFM95 board
walterluu 0:664d9df11a00 22 #include "max32630fthr.h"
walterluu 0:664d9df11a00 23 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
walterluu 0:664d9df11a00 24 //#endif
walterluu 0:664d9df11a00 25
walterluu 0:664d9df11a00 26 #include "USBSerial.h" // for virtual COM
walterluu 0:664d9df11a00 27
walterluu 0:664d9df11a00 28 #define BS 8 // ASCII Back Space
walterluu 0:664d9df11a00 29 #define CR 13 // ASCII Carriage Return
walterluu 0:664d9df11a00 30
walterluu 0:664d9df11a00 31 // Virtual serial port over USB TODO NEW VID PID NEEDED!!
walterluu 0:664d9df11a00 32 USBSerial pc(0x0B6A, 0x0042, 0x0001, false);
walterluu 0:664d9df11a00 33
walterluu 0:664d9df11a00 34 DigitalOut myled(LED2); // LED = LED2 green
walterluu 0:664d9df11a00 35 DigitalOut rLED(LED1); // red LED
walterluu 0:664d9df11a00 36 DigitalOut bLED(LED3); // blue LED
walterluu 0:664d9df11a00 37
walterluu 0:664d9df11a00 38
walterluu 0:664d9df11a00 39 /*
walterluu 0:664d9df11a00 40 LoRa initialization
walterluu 0:664d9df11a00 41 */
walterluu 0:664d9df11a00 42
walterluu 0:664d9df11a00 43 /* Set this flag to '1' to display debug messages on the console */
walterluu 0:664d9df11a00 44 #define DEBUG_MESSAGE 1
walterluu 0:664d9df11a00 45
walterluu 0:664d9df11a00 46 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
walterluu 0:664d9df11a00 47 #define USE_MODEM_LORA 1
walterluu 0:664d9df11a00 48 #define USE_MODEM_FSK !USE_MODEM_LORA
walterluu 0:664d9df11a00 49 #define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz
walterluu 0:664d9df11a00 50 #define TX_OUTPUT_POWER 14 // 14 dBm
walterluu 0:664d9df11a00 51
walterluu 0:664d9df11a00 52 #if USE_MODEM_LORA == 1
walterluu 0:664d9df11a00 53
walterluu 0:664d9df11a00 54 #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap
walterluu 0:664d9df11a00 55 #define LORA_SPREADING_FACTOR LORA_SF7
walterluu 0:664d9df11a00 56 #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5
walterluu 0:664d9df11a00 57
walterluu 0:664d9df11a00 58 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
walterluu 0:664d9df11a00 59 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
walterluu 0:664d9df11a00 60 #define LORA_FIX_LENGTH_PAYLOAD_ON false
walterluu 0:664d9df11a00 61 #define LORA_FHSS_ENABLED false
walterluu 0:664d9df11a00 62 #define LORA_NB_SYMB_HOP 4
walterluu 0:664d9df11a00 63 #define LORA_IQ_INVERSION_ON false
walterluu 0:664d9df11a00 64 #define LORA_CRC_ENABLED true
walterluu 0:664d9df11a00 65
walterluu 0:664d9df11a00 66 #elif USE_MODEM_FSK == 1
walterluu 0:664d9df11a00 67
walterluu 0:664d9df11a00 68 #define FSK_FDEV 25000 // Hz
walterluu 0:664d9df11a00 69 #define FSK_DATARATE 19200 // bps
walterluu 0:664d9df11a00 70 #define FSK_BANDWIDTH 50000 // Hz
walterluu 0:664d9df11a00 71 #define FSK_AFC_BANDWIDTH 83333 // Hz
walterluu 0:664d9df11a00 72 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
walterluu 0:664d9df11a00 73 #define FSK_FIX_LENGTH_PAYLOAD_ON false
walterluu 0:664d9df11a00 74 #define FSK_CRC_ENABLED true
walterluu 0:664d9df11a00 75
walterluu 0:664d9df11a00 76 #else
walterluu 0:664d9df11a00 77 #error "Please define a modem in the compiler options."
walterluu 0:664d9df11a00 78 #endif
walterluu 0:664d9df11a00 79
walterluu 0:664d9df11a00 80
walterluu 0:664d9df11a00 81 #define RX_TIMEOUT_VALUE 3500 // in ms
walterluu 0:664d9df11a00 82
walterluu 0:664d9df11a00 83 //#define BUFFER_SIZE 32 // Define the payload size here
walterluu 0:664d9df11a00 84 #define BUFFER_SIZE 64 // Define the payload size here
walterluu 0:664d9df11a00 85
walterluu 0:664d9df11a00 86 /*
walterluu 0:664d9df11a00 87 * Global variables declarations
walterluu 0:664d9df11a00 88 */
walterluu 0:664d9df11a00 89 typedef enum
walterluu 0:664d9df11a00 90 {
walterluu 0:664d9df11a00 91 LOWPOWER = 0,
walterluu 0:664d9df11a00 92 IDLE,
walterluu 0:664d9df11a00 93
walterluu 0:664d9df11a00 94 RX,
walterluu 0:664d9df11a00 95 RX_TIMEOUT,
walterluu 0:664d9df11a00 96 RX_ERROR,
walterluu 0:664d9df11a00 97
walterluu 0:664d9df11a00 98 TX,
walterluu 0:664d9df11a00 99 TX_TIMEOUT,
walterluu 0:664d9df11a00 100
walterluu 0:664d9df11a00 101 CAD,
walterluu 0:664d9df11a00 102 CAD_DONE
walterluu 0:664d9df11a00 103 } AppStates_t;
walterluu 0:664d9df11a00 104
walterluu 0:664d9df11a00 105 volatile AppStates_t State = LOWPOWER;
walterluu 0:664d9df11a00 106
walterluu 0:664d9df11a00 107 /*!
walterluu 0:664d9df11a00 108 * Radio events function pointer
walterluu 0:664d9df11a00 109 */
walterluu 0:664d9df11a00 110 static RadioEvents_t RadioEvents;
walterluu 0:664d9df11a00 111
walterluu 0:664d9df11a00 112 /*
walterluu 0:664d9df11a00 113 * Global variables declarations
walterluu 0:664d9df11a00 114 */
walterluu 0:664d9df11a00 115 SX1276Generic *Radio;
walterluu 0:664d9df11a00 116
walterluu 0:664d9df11a00 117
walterluu 0:664d9df11a00 118 const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING";
walterluu 0:664d9df11a00 119 const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG";
walterluu 0:664d9df11a00 120
walterluu 0:664d9df11a00 121 uint16_t BufferSize = BUFFER_SIZE;
walterluu 0:664d9df11a00 122 uint8_t *Buffer;
walterluu 0:664d9df11a00 123
walterluu 0:664d9df11a00 124 DigitalOut *led3;
walterluu 0:664d9df11a00 125
walterluu 0:664d9df11a00 126 int main() {
walterluu 0:664d9df11a00 127
walterluu 0:664d9df11a00 128 // This mbed-os is copied from Joey's PICO_I2C_FW_Virtual_COM project: FTHR becomes a virtual serial port.
walterluu 0:664d9df11a00 129
walterluu 0:664d9df11a00 130 myled = 0; // green led off
walterluu 0:664d9df11a00 131 rLED = 0; // red led off
walterluu 0:664d9df11a00 132 bLED = 0; // blue led off
walterluu 0:664d9df11a00 133
walterluu 0:664d9df11a00 134 /************ Testing purpose ************
walterluu 0:664d9df11a00 135 */
walterluu 0:664d9df11a00 136 //pc.printf("Hello World\n");
walterluu 0:664d9df11a00 137 //bLED = 1;
walterluu 0:664d9df11a00 138 //wait(3);
walterluu 0:664d9df11a00 139 //bLED = 0;
walterluu 0:664d9df11a00 140 //
walterluu 0:664d9df11a00 141 //while (1) {
walterluu 0:664d9df11a00 142 // pc.printf("Testing\n");
walterluu 0:664d9df11a00 143 // pc.printf("Haha\n");
walterluu 0:664d9df11a00 144 // wait(1);
walterluu 0:664d9df11a00 145 // myled = !myled;
walterluu 0:664d9df11a00 146 // }
walterluu 0:664d9df11a00 147
walterluu 0:664d9df11a00 148 pc.printf("Starting LoRa Example\n");
walterluu 0:664d9df11a00 149 // GenericPingPong.SX1276PingPong();
walterluu 0:664d9df11a00 150 SX1276PingPong();
walterluu 0:664d9df11a00 151 }
walterluu 0:664d9df11a00 152
walterluu 0:664d9df11a00 153 int SX1276PingPong(void)
walterluu 0:664d9df11a00 154 {
walterluu 0:664d9df11a00 155 // dprintf("TEST" );
walterluu 0:664d9df11a00 156 pc.printf("TEST");
walterluu 0:664d9df11a00 157 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
walterluu 0:664d9df11a00 158 DigitalOut *led = new DigitalOut(LED2);
walterluu 0:664d9df11a00 159 #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1)
walterluu 0:664d9df11a00 160 DigitalOut *led = new DigitalOut(LED4); // RX red
walterluu 0:664d9df11a00 161 led3 = new DigitalOut(LED3); // TX blue
walterluu 0:664d9df11a00 162 #else
walterluu 0:664d9df11a00 163 DigitalOut *led = new DigitalOut(LED1); // led = LED1 red FTHR board
walterluu 0:664d9df11a00 164 led3 = led; // led3 = led red FTHR board
walterluu 0:664d9df11a00 165 #endif
walterluu 0:664d9df11a00 166
walterluu 0:664d9df11a00 167 Buffer = new uint8_t[BUFFER_SIZE];
walterluu 0:664d9df11a00 168 *led3 = 1; // red LED on
walterluu 0:664d9df11a00 169
walterluu 0:664d9df11a00 170 #ifdef B_L072Z_LRWAN1_LORA
walterluu 0:664d9df11a00 171 Radio = new SX1276Generic(NULL, MURATA_SX1276,
walterluu 0:664d9df11a00 172 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
walterluu 0:664d9df11a00 173 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5,
walterluu 0:664d9df11a00 174 LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO);
walterluu 0:664d9df11a00 175 #else // RFM95
walterluu 0:664d9df11a00 176 Radio = new SX1276Generic(NULL, RFM95_SX1276,
walterluu 0:664d9df11a00 177 LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET,
walterluu 0:664d9df11a00 178 LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5);
walterluu 0:664d9df11a00 179
walterluu 0:664d9df11a00 180 #endif
walterluu 0:664d9df11a00 181
walterluu 0:664d9df11a00 182 uint8_t i;
walterluu 0:664d9df11a00 183 bool isMaster = true;
walterluu 0:664d9df11a00 184
walterluu 0:664d9df11a00 185 // dprintf("SX1276 Ping Pong Demo Application" );
walterluu 0:664d9df11a00 186 pc.printf("SX1276 Ping Pong Demo Application");
walterluu 0:664d9df11a00 187 // dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
walterluu 0:664d9df11a00 188 pc.printf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0);
walterluu 0:664d9df11a00 189 // dprintf("TXPower: %d dBm", TX_OUTPUT_POWER);
walterluu 0:664d9df11a00 190 pc.printf("TXPower: %d dBm", TX_OUTPUT_POWER);
walterluu 0:664d9df11a00 191 #if USE_MODEM_LORA == 1
walterluu 0:664d9df11a00 192 // dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH);
walterluu 0:664d9df11a00 193 pc.printf("Bandwidth: %d Hz", LORA_BANDWIDTH);
walterluu 0:664d9df11a00 194 // dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
walterluu 0:664d9df11a00 195 pc.printf("Spreading factor: SF%d", LORA_SPREADING_FACTOR);
walterluu 0:664d9df11a00 196 #elif USE_MODEM_FSK == 1
walterluu 0:664d9df11a00 197 // dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH);
walterluu 0:664d9df11a00 198 pc.printf("Bandwidth: %d kHz", FSK_BANDWIDTH);
walterluu 0:664d9df11a00 199 // dprintf("Baudrate: %d", FSK_DATARATE);
walterluu 0:664d9df11a00 200 pc.printf("Baudrate: %d", FSK_DATARATE);
walterluu 0:664d9df11a00 201 #endif
walterluu 0:664d9df11a00 202 // Initialize Radio driver
walterluu 0:664d9df11a00 203 RadioEvents.TxDone = OnTxDone;
walterluu 0:664d9df11a00 204 RadioEvents.RxDone = OnRxDone;
walterluu 0:664d9df11a00 205 RadioEvents.RxError = OnRxError;
walterluu 0:664d9df11a00 206 RadioEvents.TxTimeout = OnTxTimeout;
walterluu 0:664d9df11a00 207 RadioEvents.RxTimeout = OnRxTimeout;
walterluu 0:664d9df11a00 208 if (Radio->Init( &RadioEvents ) == false) {
walterluu 0:664d9df11a00 209 while(1) {
walterluu 0:664d9df11a00 210 // dprintf("Radio could not be detected!");
walterluu 0:664d9df11a00 211 pc.printf("Radio could not be detected!");
walterluu 0:664d9df11a00 212 wait( 1 );
walterluu 0:664d9df11a00 213 }
walterluu 0:664d9df11a00 214 }
walterluu 0:664d9df11a00 215
walterluu 0:664d9df11a00 216
walterluu 0:664d9df11a00 217 switch(Radio->DetectBoardType()) { // check where DetectBoardType is!!
walterluu 0:664d9df11a00 218 case SX1276MB1LAS:
walterluu 0:664d9df11a00 219 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 220 // dprintf(" > Board Type: SX1276MB1LAS <");
walterluu 0:664d9df11a00 221 pc.printf(" > Board Type: SX1276MB1LAS <");
walterluu 0:664d9df11a00 222 break;
walterluu 0:664d9df11a00 223 case SX1276MB1MAS:
walterluu 0:664d9df11a00 224 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 225 // dprintf(" > Board Type: SX1276MB1LAS <");
walterluu 0:664d9df11a00 226 pc.printf(" > Board Type: SX1276MB1LAS <");
walterluu 0:664d9df11a00 227 case MURATA_SX1276:
walterluu 0:664d9df11a00 228 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 229 // dprintf(" > Board Type: MURATA_SX1276_STM32L0 <");
walterluu 0:664d9df11a00 230 pc.printf(" > Board Type: MURATA_SX1276_STM32L0 <");
walterluu 0:664d9df11a00 231 break;
walterluu 0:664d9df11a00 232 case RFM95_SX1276:
walterluu 0:664d9df11a00 233 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 234 // dprintf(" > HopeRF RFM95xx <");
walterluu 0:664d9df11a00 235 pc.printf(" > HopeRF RFM95xx <");
walterluu 0:664d9df11a00 236 break;
walterluu 0:664d9df11a00 237 default:
walterluu 0:664d9df11a00 238 // dprintf(" > Board Type: unknown <");
walterluu 0:664d9df11a00 239 pc.printf(" > Board Type: unknown <");
walterluu 0:664d9df11a00 240 }
walterluu 0:664d9df11a00 241
walterluu 0:664d9df11a00 242 Radio->SetChannel(RF_FREQUENCY );
walterluu 0:664d9df11a00 243
walterluu 0:664d9df11a00 244 #if USE_MODEM_LORA == 1
walterluu 0:664d9df11a00 245
walterluu 0:664d9df11a00 246 if (LORA_FHSS_ENABLED)
walterluu 0:664d9df11a00 247 // dprintf(" > LORA FHSS Mode <");
walterluu 0:664d9df11a00 248 pc.printf(" > LORA FHSS Mode <");
walterluu 0:664d9df11a00 249 if (!LORA_FHSS_ENABLED)
walterluu 0:664d9df11a00 250 // dprintf(" > LORA Mode <");
walterluu 0:664d9df11a00 251 pc.printf(" > LORA Mode <");
walterluu 0:664d9df11a00 252
walterluu 0:664d9df11a00 253 Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH,
walterluu 0:664d9df11a00 254 LORA_SPREADING_FACTOR, LORA_CODINGRATE,
walterluu 0:664d9df11a00 255 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
walterluu 0:664d9df11a00 256 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
walterluu 0:664d9df11a00 257 LORA_IQ_INVERSION_ON, 2000 );
walterluu 0:664d9df11a00 258
walterluu 0:664d9df11a00 259 Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR,
walterluu 0:664d9df11a00 260 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
walterluu 0:664d9df11a00 261 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
walterluu 0:664d9df11a00 262 LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
walterluu 0:664d9df11a00 263 LORA_IQ_INVERSION_ON, true );
walterluu 0:664d9df11a00 264
walterluu 0:664d9df11a00 265 #elif USE_MODEM_FSK == 1
walterluu 0:664d9df11a00 266
walterluu 0:664d9df11a00 267 // dprintf(" > FSK Mode <");
walterluu 0:664d9df11a00 268 pc.printf(" > FSK Mode <");
walterluu 0:664d9df11a00 269 Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0,
walterluu 0:664d9df11a00 270 FSK_DATARATE, 0,
walterluu 0:664d9df11a00 271 FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON,
walterluu 0:664d9df11a00 272 FSK_CRC_ENABLED, 0, 0, 0, 2000 );
walterluu 0:664d9df11a00 273
walterluu 0:664d9df11a00 274 Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE,
walterluu 0:664d9df11a00 275 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH,
walterluu 0:664d9df11a00 276 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED,
walterluu 0:664d9df11a00 277 0, 0, false, true );
walterluu 0:664d9df11a00 278
walterluu 0:664d9df11a00 279 #else
walterluu 0:664d9df11a00 280
walterluu 0:664d9df11a00 281 #error "Please define a modem in the compiler options."
walterluu 0:664d9df11a00 282
walterluu 0:664d9df11a00 283 #endif
walterluu 0:664d9df11a00 284
walterluu 0:664d9df11a00 285 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 286 pc.printf("Starting Ping-Pong loop");
walterluu 0:664d9df11a00 287 // dprintf("Starting Ping-Pong loop");
walterluu 0:664d9df11a00 288
walterluu 0:664d9df11a00 289
walterluu 0:664d9df11a00 290 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 0:664d9df11a00 291
walterluu 0:664d9df11a00 292 while( 1 )
walterluu 0:664d9df11a00 293 {
walterluu 0:664d9df11a00 294 #ifdef TARGET_STM32L4
walterluu 0:664d9df11a00 295 // WatchDogUpdate();
walterluu 0:664d9df11a00 296 #endif
walterluu 0:664d9df11a00 297
walterluu 0:664d9df11a00 298 switch( State )
walterluu 0:664d9df11a00 299 {
walterluu 0:664d9df11a00 300 case RX:
walterluu 0:664d9df11a00 301 *led3 = 0;
walterluu 0:664d9df11a00 302 if( isMaster == true )
walterluu 0:664d9df11a00 303 {
walterluu 0:664d9df11a00 304 if( BufferSize > 0 )
walterluu 0:664d9df11a00 305 {
walterluu 0:664d9df11a00 306 if( memcmp(Buffer, PongMsg, sizeof(PongMsg)) == 0 )
walterluu 0:664d9df11a00 307 {
walterluu 0:664d9df11a00 308 *led = !*led;
walterluu 0:664d9df11a00 309 // dprintf( "...Pong" );
walterluu 0:664d9df11a00 310 pc.printf( "...Pong" );
walterluu 0:664d9df11a00 311 // Send the next PING frame
walterluu 0:664d9df11a00 312 memcpy(Buffer, PingMsg, sizeof(PingMsg));
walterluu 0:664d9df11a00 313 // We fill the buffer with numbers for the payload
walterluu 0:664d9df11a00 314 for( i = sizeof(PingMsg); i < BufferSize; i++ )
walterluu 0:664d9df11a00 315 {
walterluu 0:664d9df11a00 316 Buffer[i] = i - sizeof(PingMsg);
walterluu 0:664d9df11a00 317 }
walterluu 0:664d9df11a00 318 wait_ms( 10 );
walterluu 0:664d9df11a00 319 Radio->Send( Buffer, BufferSize );
walterluu 0:664d9df11a00 320 }
walterluu 0:664d9df11a00 321 else if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
walterluu 0:664d9df11a00 322 { // A master already exists then become a slave
walterluu 0:664d9df11a00 323 // dprintf( "...Ping" );
walterluu 0:664d9df11a00 324 pc.printf( "...Ping" );
walterluu 0:664d9df11a00 325 *led = !*led;
walterluu 0:664d9df11a00 326 isMaster = false;
walterluu 0:664d9df11a00 327 // Send the next PONG frame
walterluu 0:664d9df11a00 328 memcpy(Buffer, PongMsg, sizeof(PongMsg));
walterluu 0:664d9df11a00 329 // We fill the buffer with numbers for the payload
walterluu 0:664d9df11a00 330 for( i = sizeof(PongMsg); i < BufferSize; i++ )
walterluu 0:664d9df11a00 331 {
walterluu 0:664d9df11a00 332 Buffer[i] = i - sizeof(PongMsg);
walterluu 0:664d9df11a00 333 }
walterluu 0:664d9df11a00 334 wait_ms( 10 );
walterluu 0:664d9df11a00 335 Radio->Send( Buffer, BufferSize );
walterluu 0:664d9df11a00 336 }
walterluu 0:664d9df11a00 337 else // valid reception but neither a PING or a PONG message
walterluu 0:664d9df11a00 338 { // Set device as master ans start again
walterluu 0:664d9df11a00 339 isMaster = true;
walterluu 0:664d9df11a00 340 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 0:664d9df11a00 341 }
walterluu 0:664d9df11a00 342 }
walterluu 0:664d9df11a00 343 }
walterluu 0:664d9df11a00 344 else
walterluu 0:664d9df11a00 345 {
walterluu 0:664d9df11a00 346 if( BufferSize > 0 )
walterluu 0:664d9df11a00 347 {
walterluu 0:664d9df11a00 348 if( memcmp(Buffer, PingMsg, sizeof(PingMsg)) == 0 )
walterluu 0:664d9df11a00 349 {
walterluu 0:664d9df11a00 350 *led = !*led;
walterluu 0:664d9df11a00 351 // dprintf( "...Ping" );
walterluu 0:664d9df11a00 352 pc.printf( "...Ping" );
walterluu 0:664d9df11a00 353 // Send the reply to the PING string
walterluu 0:664d9df11a00 354 memcpy(Buffer, PongMsg, sizeof(PongMsg));
walterluu 0:664d9df11a00 355 // We fill the buffer with numbers for the payload
walterluu 0:664d9df11a00 356 for( i = sizeof(PongMsg); i < BufferSize; i++ )
walterluu 0:664d9df11a00 357 {
walterluu 0:664d9df11a00 358 Buffer[i] = i - sizeof(PongMsg);
walterluu 0:664d9df11a00 359 }
walterluu 0:664d9df11a00 360 wait_ms( 10 );
walterluu 0:664d9df11a00 361 Radio->Send( Buffer, BufferSize );
walterluu 0:664d9df11a00 362 }
walterluu 0:664d9df11a00 363 else // valid reception but not a PING as expected
walterluu 0:664d9df11a00 364 { // Set device as master and start again
walterluu 0:664d9df11a00 365 isMaster = true;
walterluu 0:664d9df11a00 366 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 0:664d9df11a00 367 }
walterluu 0:664d9df11a00 368 }
walterluu 0:664d9df11a00 369 }
walterluu 0:664d9df11a00 370 State = LOWPOWER;
walterluu 0:664d9df11a00 371 break;
walterluu 0:664d9df11a00 372 case TX:
walterluu 0:664d9df11a00 373 *led3 = 1;
walterluu 0:664d9df11a00 374 if( isMaster == true )
walterluu 0:664d9df11a00 375 {
walterluu 0:664d9df11a00 376 // dprintf("Ping..." );
walterluu 0:664d9df11a00 377 pc.printf("Ping..." );
walterluu 0:664d9df11a00 378 }
walterluu 0:664d9df11a00 379 else
walterluu 0:664d9df11a00 380 {
walterluu 0:664d9df11a00 381 // dprintf("Pong..." );
walterluu 0:664d9df11a00 382 pc.printf("Pong..." );
walterluu 0:664d9df11a00 383 }
walterluu 0:664d9df11a00 384 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 0:664d9df11a00 385 State = LOWPOWER;
walterluu 0:664d9df11a00 386 break;
walterluu 0:664d9df11a00 387 case RX_TIMEOUT:
walterluu 0:664d9df11a00 388 if( isMaster == true )
walterluu 0:664d9df11a00 389 {
walterluu 0:664d9df11a00 390 // Send the next PING frame
walterluu 0:664d9df11a00 391 memcpy(Buffer, PingMsg, sizeof(PingMsg));
walterluu 0:664d9df11a00 392 for( i = sizeof(PingMsg); i < BufferSize; i++ )
walterluu 0:664d9df11a00 393 {
walterluu 0:664d9df11a00 394 Buffer[i] = i - sizeof(PingMsg);
walterluu 0:664d9df11a00 395 }
walterluu 0:664d9df11a00 396 wait_ms( 10 );
walterluu 0:664d9df11a00 397 Radio->Send( Buffer, BufferSize );
walterluu 0:664d9df11a00 398 }
walterluu 0:664d9df11a00 399 else
walterluu 0:664d9df11a00 400 {
walterluu 0:664d9df11a00 401 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 0:664d9df11a00 402 }
walterluu 0:664d9df11a00 403 State = LOWPOWER;
walterluu 0:664d9df11a00 404 break;
walterluu 0:664d9df11a00 405 case RX_ERROR:
walterluu 0:664d9df11a00 406 // We have received a Packet with a CRC error, send reply as if packet was correct
walterluu 0:664d9df11a00 407 if( isMaster == true )
walterluu 0:664d9df11a00 408 {
walterluu 0:664d9df11a00 409 // Send the next PING frame
walterluu 0:664d9df11a00 410 memcpy(Buffer, PingMsg, sizeof(PingMsg));
walterluu 0:664d9df11a00 411 for( i = 4; i < BufferSize; i++ )
walterluu 0:664d9df11a00 412 {
walterluu 0:664d9df11a00 413 Buffer[i] = i - 4;
walterluu 0:664d9df11a00 414 }
walterluu 0:664d9df11a00 415 wait_ms( 10 );
walterluu 0:664d9df11a00 416 Radio->Send( Buffer, BufferSize );
walterluu 0:664d9df11a00 417 }
walterluu 0:664d9df11a00 418 else
walterluu 0:664d9df11a00 419 {
walterluu 0:664d9df11a00 420 // Send the next PONG frame
walterluu 0:664d9df11a00 421 memcpy(Buffer, PongMsg, sizeof(PongMsg));
walterluu 0:664d9df11a00 422 for( i = sizeof(PongMsg); i < BufferSize; i++ )
walterluu 0:664d9df11a00 423 {
walterluu 0:664d9df11a00 424 Buffer[i] = i - sizeof(PongMsg);
walterluu 0:664d9df11a00 425 }
walterluu 0:664d9df11a00 426 wait_ms( 10 );
walterluu 0:664d9df11a00 427 Radio->Send( Buffer, BufferSize );
walterluu 0:664d9df11a00 428 }
walterluu 0:664d9df11a00 429 State = LOWPOWER;
walterluu 0:664d9df11a00 430 break;
walterluu 0:664d9df11a00 431 case TX_TIMEOUT:
walterluu 0:664d9df11a00 432 Radio->Rx( RX_TIMEOUT_VALUE );
walterluu 0:664d9df11a00 433 State = LOWPOWER;
walterluu 0:664d9df11a00 434 break;
walterluu 0:664d9df11a00 435 case LOWPOWER:
walterluu 0:664d9df11a00 436 sleep();
walterluu 0:664d9df11a00 437 break;
walterluu 0:664d9df11a00 438 default:
walterluu 0:664d9df11a00 439 State = LOWPOWER;
walterluu 0:664d9df11a00 440 break;
walterluu 0:664d9df11a00 441 }
walterluu 0:664d9df11a00 442 }
walterluu 0:664d9df11a00 443 }
walterluu 0:664d9df11a00 444
walterluu 0:664d9df11a00 445 void dump(const char *title, const void *data, int len, bool dwords)
walterluu 0:664d9df11a00 446 {
walterluu 0:664d9df11a00 447 // dprintf("dump(\"%s\", 0x%x, %d bytes)", title, data, len);
walterluu 0:664d9df11a00 448 pc.printf("dump(\"%s\", 0x%x, %d bytes)", title, data, len);
walterluu 0:664d9df11a00 449
walterluu 0:664d9df11a00 450 int i, j, cnt;
walterluu 0:664d9df11a00 451 unsigned char *u;
walterluu 0:664d9df11a00 452 const int width = 16;
walterluu 0:664d9df11a00 453 const int seppos = 7;
walterluu 0:664d9df11a00 454
walterluu 0:664d9df11a00 455 cnt = 0;
walterluu 0:664d9df11a00 456 u = (unsigned char *)data;
walterluu 0:664d9df11a00 457 while (len > 0) {
walterluu 0:664d9df11a00 458 // rprintf("%08x: ", (unsigned int)data + cnt);
walterluu 0:664d9df11a00 459 pc.printf("%08x: ", (unsigned int)data + cnt);
walterluu 0:664d9df11a00 460 if (dwords) {
walterluu 0:664d9df11a00 461 unsigned int *ip = ( unsigned int *)u;
walterluu 0:664d9df11a00 462 // rprintf(" 0x%08x\r\n", *ip);
walterluu 0:664d9df11a00 463 pc.printf(" 0x%08x\r\n", *ip);
walterluu 0:664d9df11a00 464 u+= 4;
walterluu 0:664d9df11a00 465 len -= 4;
walterluu 0:664d9df11a00 466 cnt += 4;
walterluu 0:664d9df11a00 467 continue;
walterluu 0:664d9df11a00 468 }
walterluu 0:664d9df11a00 469 cnt += width;
walterluu 0:664d9df11a00 470 j = len < width ? len : width;
walterluu 0:664d9df11a00 471 for (i = 0; i < j; i++) {
walterluu 0:664d9df11a00 472 // rprintf("%2.2x ", *(u + i));
walterluu 0:664d9df11a00 473 pc.printf("%2.2x ", *(u + i));
walterluu 0:664d9df11a00 474 if (i == seppos)
walterluu 0:664d9df11a00 475 // rprintf(" ");
walterluu 0:664d9df11a00 476 pc.printf(" ");
walterluu 0:664d9df11a00 477 }
walterluu 0:664d9df11a00 478 // rprintf(" ");
walterluu 0:664d9df11a00 479 pc.printf(" ");
walterluu 0:664d9df11a00 480 if (j < width) {
walterluu 0:664d9df11a00 481 i = width - j;
walterluu 0:664d9df11a00 482 if (i > seppos + 1)
walterluu 0:664d9df11a00 483 // rprintf(" ");
walterluu 0:664d9df11a00 484 pc.printf(" ");
walterluu 0:664d9df11a00 485 while (i--) {
walterluu 0:664d9df11a00 486 // rprintf("%s", " ");
walterluu 0:664d9df11a00 487 pc.printf("%s", " ");
walterluu 0:664d9df11a00 488 }
walterluu 0:664d9df11a00 489 }
walterluu 0:664d9df11a00 490 for (i = 0; i < j; i++) {
walterluu 0:664d9df11a00 491 int c = *(u + i);
walterluu 0:664d9df11a00 492 if (c >= ' ' && c <= '~')
walterluu 0:664d9df11a00 493 // rprintf("%c", c);
walterluu 0:664d9df11a00 494 pc.printf("%c", c);
walterluu 0:664d9df11a00 495 else
walterluu 0:664d9df11a00 496 // rprintf(".");
walterluu 0:664d9df11a00 497 pc.printf(".");
walterluu 0:664d9df11a00 498 if (i == seppos)
walterluu 0:664d9df11a00 499 // rprintf(" ");
walterluu 0:664d9df11a00 500 pc.printf(" ");
walterluu 0:664d9df11a00 501 }
walterluu 0:664d9df11a00 502 len -= width;
walterluu 0:664d9df11a00 503 u += width;
walterluu 0:664d9df11a00 504 // rprintf("\r\n");
walterluu 0:664d9df11a00 505 pc.printf("\r\n");
walterluu 0:664d9df11a00 506 }
walterluu 0:664d9df11a00 507 // rprintf("--\r\n");
walterluu 0:664d9df11a00 508 pc.printf("--\r\n");
walterluu 0:664d9df11a00 509 }
walterluu 0:664d9df11a00 510
walterluu 0:664d9df11a00 511
walterluu 0:664d9df11a00 512 void OnTxDone(void *radio, void *userThisPtr, void *userData)
walterluu 0:664d9df11a00 513 {
walterluu 0:664d9df11a00 514 Radio->Sleep( );
walterluu 0:664d9df11a00 515 State = TX;
walterluu 0:664d9df11a00 516 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 517 //dprintf("> OnTxDone");
walterluu 0:664d9df11a00 518 pc.printf("> OnTxDone");
walterluu 0:664d9df11a00 519 }
walterluu 0:664d9df11a00 520
walterluu 0:664d9df11a00 521 void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
walterluu 0:664d9df11a00 522 {
walterluu 0:664d9df11a00 523 Radio->Sleep( );
walterluu 0:664d9df11a00 524 BufferSize = size;
walterluu 0:664d9df11a00 525 memcpy( Buffer, payload, BufferSize );
walterluu 0:664d9df11a00 526 State = RX;
walterluu 0:664d9df11a00 527 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 528 pc.printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
walterluu 0:664d9df11a00 529 // dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr);
walterluu 0:664d9df11a00 530 // dump("Data:", payload, size);
walterluu 0:664d9df11a00 531 dump("Data:", payload, size, false);
walterluu 0:664d9df11a00 532 }
walterluu 0:664d9df11a00 533
walterluu 0:664d9df11a00 534 void OnTxTimeout(void *radio, void *userThisPtr, void *userData)
walterluu 0:664d9df11a00 535 {
walterluu 0:664d9df11a00 536 *led3 = 0;
walterluu 0:664d9df11a00 537 Radio->Sleep( );
walterluu 0:664d9df11a00 538 State = TX_TIMEOUT;
walterluu 0:664d9df11a00 539 if(DEBUG_MESSAGE)
walterluu 0:664d9df11a00 540 pc.printf("> OnTxTimeout");
walterluu 0:664d9df11a00 541 // dprintf("> OnTxTimeout");
walterluu 0:664d9df11a00 542 }
walterluu 0:664d9df11a00 543
walterluu 0:664d9df11a00 544 void OnRxTimeout(void *radio, void *userThisPtr, void *userData)
walterluu 0:664d9df11a00 545 {
walterluu 0:664d9df11a00 546 *led3 = 0;
walterluu 0:664d9df11a00 547 Radio->Sleep( );
walterluu 0:664d9df11a00 548 Buffer[BufferSize-1] = 0;
walterluu 0:664d9df11a00 549 State = RX_TIMEOUT;
walterluu 0:664d9df11a00 550 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 551 pc.printf("> OnRxTimeout");
walterluu 0:664d9df11a00 552 // dprintf("> OnRxTimeout");
walterluu 0:664d9df11a00 553 }
walterluu 0:664d9df11a00 554
walterluu 0:664d9df11a00 555 void OnRxError(void *radio, void *userThisPtr, void *userData)
walterluu 0:664d9df11a00 556 {
walterluu 0:664d9df11a00 557 Radio->Sleep( );
walterluu 0:664d9df11a00 558 State = RX_ERROR;
walterluu 0:664d9df11a00 559 if (DEBUG_MESSAGE)
walterluu 0:664d9df11a00 560 pc.printf("> OnRxError");
walterluu 0:664d9df11a00 561 // dprintf("> OnRxError");
walterluu 0:664d9df11a00 562 }
walterluu 0:664d9df11a00 563
walterluu 0:664d9df11a00 564
walterluu 0:664d9df11a00 565
walterluu 0:664d9df11a00 566 //#endif