Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SX1272PingPong by
main.cpp@10:7af820d1e1df, 2015-11-26 (annotated)
- Committer:
- mluis
- Date:
- Thu Nov 26 12:20:56 2015 +0000
- Revision:
- 10:7af820d1e1df
- Parent:
- 9:e764990e45df
- Child:
- 13:edb9b443c1dd
Adapted application to new version of SX1276Lib radio driver
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
GregCr | 0:1ed39951ab7b | 1 | #include "mbed.h" |
GregCr | 4:5ece30264cd9 | 2 | #include "main.h" |
GregCr | 0:1ed39951ab7b | 3 | #include "sx1276-hal.h" |
GregCr | 8:f956dee63a56 | 4 | #include "debug.h" |
GregCr | 0:1ed39951ab7b | 5 | |
GregCr | 0:1ed39951ab7b | 6 | /* Set this flag to '1' to display debug messages on the console */ |
GregCr | 5:f2431c4fe3bb | 7 | #define DEBUG_MESSAGE 0 |
GregCr | 0:1ed39951ab7b | 8 | |
GregCr | 0:1ed39951ab7b | 9 | /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ |
GregCr | 5:f2431c4fe3bb | 10 | #define USE_MODEM_LORA 1 |
GregCr | 0:1ed39951ab7b | 11 | #define USE_MODEM_FSK !USE_MODEM_LORA |
GregCr | 0:1ed39951ab7b | 12 | |
GregCr | 5:f2431c4fe3bb | 13 | #define RF_FREQUENCY 868000000 // Hz |
GregCr | 0:1ed39951ab7b | 14 | #define TX_OUTPUT_POWER 14 // 14 dBm |
GregCr | 0:1ed39951ab7b | 15 | |
GregCr | 0:1ed39951ab7b | 16 | #if USE_MODEM_LORA == 1 |
GregCr | 0:1ed39951ab7b | 17 | |
GregCr | 1:126d70d374f6 | 18 | #define LORA_BANDWIDTH 2 // [0: 125 kHz, |
GregCr | 0:1ed39951ab7b | 19 | // 1: 250 kHz, |
GregCr | 0:1ed39951ab7b | 20 | // 2: 500 kHz, |
GregCr | 0:1ed39951ab7b | 21 | // 3: Reserved] |
GregCr | 0:1ed39951ab7b | 22 | #define LORA_SPREADING_FACTOR 7 // [SF7..SF12] |
GregCr | 0:1ed39951ab7b | 23 | #define LORA_CODINGRATE 1 // [1: 4/5, |
GregCr | 0:1ed39951ab7b | 24 | // 2: 4/6, |
GregCr | 0:1ed39951ab7b | 25 | // 3: 4/7, |
GregCr | 0:1ed39951ab7b | 26 | // 4: 4/8] |
GregCr | 0:1ed39951ab7b | 27 | #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx |
GregCr | 0:1ed39951ab7b | 28 | #define LORA_SYMBOL_TIMEOUT 5 // Symbols |
GregCr | 0:1ed39951ab7b | 29 | #define LORA_FIX_LENGTH_PAYLOAD_ON false |
GregCr | 3:8b9e2a4df4b5 | 30 | #define LORA_FHSS_ENABLED false |
GregCr | 3:8b9e2a4df4b5 | 31 | #define LORA_NB_SYMB_HOP 4 |
GregCr | 0:1ed39951ab7b | 32 | #define LORA_IQ_INVERSION_ON false |
GregCr | 3:8b9e2a4df4b5 | 33 | #define LORA_CRC_ENABLED true |
GregCr | 3:8b9e2a4df4b5 | 34 | |
GregCr | 0:1ed39951ab7b | 35 | #elif USE_MODEM_FSK == 1 |
GregCr | 0:1ed39951ab7b | 36 | |
GregCr | 2:59e108728d71 | 37 | #define FSK_FDEV 25000 // Hz |
GregCr | 2:59e108728d71 | 38 | #define FSK_DATARATE 19200 // bps |
GregCr | 2:59e108728d71 | 39 | #define FSK_BANDWIDTH 50000 // Hz |
GregCr | 2:59e108728d71 | 40 | #define FSK_AFC_BANDWIDTH 83333 // Hz |
GregCr | 0:1ed39951ab7b | 41 | #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx |
GregCr | 0:1ed39951ab7b | 42 | #define FSK_FIX_LENGTH_PAYLOAD_ON false |
GregCr | 3:8b9e2a4df4b5 | 43 | #define FSK_CRC_ENABLED true |
GregCr | 3:8b9e2a4df4b5 | 44 | |
GregCr | 0:1ed39951ab7b | 45 | #else |
GregCr | 0:1ed39951ab7b | 46 | #error "Please define a modem in the compiler options." |
GregCr | 0:1ed39951ab7b | 47 | #endif |
GregCr | 0:1ed39951ab7b | 48 | |
GregCr | 7:c1bbd6c56979 | 49 | #define RX_TIMEOUT_VALUE 3500000 // in us |
GregCr | 0:1ed39951ab7b | 50 | #define BUFFER_SIZE 32 // Define the payload size here |
GregCr | 0:1ed39951ab7b | 51 | |
GregCr | 8:f956dee63a56 | 52 | #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) ) |
GregCr | 3:8b9e2a4df4b5 | 53 | DigitalOut led(LED2); |
GregCr | 3:8b9e2a4df4b5 | 54 | #else |
GregCr | 3:8b9e2a4df4b5 | 55 | DigitalOut led(LED1); |
GregCr | 3:8b9e2a4df4b5 | 56 | #endif |
GregCr | 3:8b9e2a4df4b5 | 57 | |
GregCr | 0:1ed39951ab7b | 58 | /* |
GregCr | 0:1ed39951ab7b | 59 | * Global variables declarations |
GregCr | 0:1ed39951ab7b | 60 | */ |
mluis | 10:7af820d1e1df | 61 | typedef enum |
mluis | 10:7af820d1e1df | 62 | { |
mluis | 10:7af820d1e1df | 63 | LOWPOWER = 0, |
mluis | 10:7af820d1e1df | 64 | IDLE, |
mluis | 10:7af820d1e1df | 65 | |
mluis | 10:7af820d1e1df | 66 | RX, |
mluis | 10:7af820d1e1df | 67 | RX_TIMEOUT, |
mluis | 10:7af820d1e1df | 68 | RX_ERROR, |
mluis | 10:7af820d1e1df | 69 | |
mluis | 10:7af820d1e1df | 70 | TX, |
mluis | 10:7af820d1e1df | 71 | TX_TIMEOUT, |
mluis | 10:7af820d1e1df | 72 | |
mluis | 10:7af820d1e1df | 73 | CAD, |
mluis | 10:7af820d1e1df | 74 | CAD_DONE |
mluis | 10:7af820d1e1df | 75 | }AppStates_t; |
GregCr | 0:1ed39951ab7b | 76 | |
mluis | 10:7af820d1e1df | 77 | volatile AppStates_t State = LOWPOWER; |
mluis | 10:7af820d1e1df | 78 | |
mluis | 10:7af820d1e1df | 79 | /*! |
mluis | 10:7af820d1e1df | 80 | * Radio events function pointer |
mluis | 10:7af820d1e1df | 81 | */ |
mluis | 10:7af820d1e1df | 82 | static RadioEvents_t RadioEvents; |
mluis | 10:7af820d1e1df | 83 | |
mluis | 10:7af820d1e1df | 84 | /* |
mluis | 10:7af820d1e1df | 85 | * Global variables declarations |
mluis | 10:7af820d1e1df | 86 | */ |
mluis | 10:7af820d1e1df | 87 | SX1276MB1xAS Radio( NULL ); |
GregCr | 0:1ed39951ab7b | 88 | |
GregCr | 0:1ed39951ab7b | 89 | const uint8_t PingMsg[] = "PING"; |
GregCr | 0:1ed39951ab7b | 90 | const uint8_t PongMsg[] = "PONG"; |
GregCr | 0:1ed39951ab7b | 91 | |
GregCr | 0:1ed39951ab7b | 92 | uint16_t BufferSize = BUFFER_SIZE; |
GregCr | 0:1ed39951ab7b | 93 | uint8_t Buffer[BUFFER_SIZE]; |
GregCr | 0:1ed39951ab7b | 94 | |
GregCr | 5:f2431c4fe3bb | 95 | int16_t RssiValue = 0.0; |
GregCr | 5:f2431c4fe3bb | 96 | int8_t SnrValue = 0.0; |
GregCr | 0:1ed39951ab7b | 97 | |
GregCr | 0:1ed39951ab7b | 98 | int main() |
GregCr | 0:1ed39951ab7b | 99 | { |
GregCr | 0:1ed39951ab7b | 100 | uint8_t i; |
GregCr | 0:1ed39951ab7b | 101 | bool isMaster = true; |
GregCr | 0:1ed39951ab7b | 102 | |
GregCr | 7:c1bbd6c56979 | 103 | debug( "\n\n\r SX1276 Ping Pong Demo Application \n\n\r" ); |
mluis | 10:7af820d1e1df | 104 | |
mluis | 10:7af820d1e1df | 105 | // Initialize Radio driver |
mluis | 10:7af820d1e1df | 106 | RadioEvents.TxDone = OnTxDone; |
mluis | 10:7af820d1e1df | 107 | RadioEvents.RxDone = OnRxDone; |
mluis | 10:7af820d1e1df | 108 | RadioEvents.RxError = OnRxError; |
mluis | 10:7af820d1e1df | 109 | RadioEvents.TxTimeout = OnTxTimeout; |
mluis | 10:7af820d1e1df | 110 | RadioEvents.RxTimeout = OnRxTimeout; |
mluis | 10:7af820d1e1df | 111 | Radio.Init( &RadioEvents ); |
GregCr | 0:1ed39951ab7b | 112 | |
GregCr | 7:c1bbd6c56979 | 113 | // verify the connection with the board |
GregCr | 7:c1bbd6c56979 | 114 | while( Radio.Read( REG_VERSION ) == 0x00 ) |
GregCr | 2:59e108728d71 | 115 | { |
GregCr | 7:c1bbd6c56979 | 116 | debug( "Radio could not be detected!\n\r", NULL ); |
GregCr | 7:c1bbd6c56979 | 117 | wait( 1 ); |
GregCr | 2:59e108728d71 | 118 | } |
GregCr | 7:c1bbd6c56979 | 119 | |
GregCr | 7:c1bbd6c56979 | 120 | debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , "\n\r > Board Type: SX1276MB1LAS < \n\r" ); |
GregCr | 7:c1bbd6c56979 | 121 | debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , "\n\r > Board Type: SX1276MB1MAS < \n\r" ); |
GregCr | 1:126d70d374f6 | 122 | |
GregCr | 0:1ed39951ab7b | 123 | Radio.SetChannel( RF_FREQUENCY ); |
GregCr | 0:1ed39951ab7b | 124 | |
GregCr | 0:1ed39951ab7b | 125 | #if USE_MODEM_LORA == 1 |
GregCr | 3:8b9e2a4df4b5 | 126 | |
GregCr | 7:c1bbd6c56979 | 127 | debug_if( LORA_FHSS_ENABLED, "\n\n\r > LORA FHSS Mode < \n\n\r"); |
GregCr | 7:c1bbd6c56979 | 128 | debug_if( !LORA_FHSS_ENABLED, "\n\n\r > LORA Mode < \n\n\r"); |
GregCr | 7:c1bbd6c56979 | 129 | |
GregCr | 0:1ed39951ab7b | 130 | Radio.SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
GregCr | 0:1ed39951ab7b | 131 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
GregCr | 0:1ed39951ab7b | 132 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
GregCr | 3:8b9e2a4df4b5 | 133 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
GregCr | 7:c1bbd6c56979 | 134 | LORA_IQ_INVERSION_ON, 2000000 ); |
GregCr | 0:1ed39951ab7b | 135 | |
GregCr | 0:1ed39951ab7b | 136 | Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
GregCr | 0:1ed39951ab7b | 137 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
mluis | 9:e764990e45df | 138 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
GregCr | 3:8b9e2a4df4b5 | 139 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
GregCr | 3:8b9e2a4df4b5 | 140 | LORA_IQ_INVERSION_ON, true ); |
GregCr | 0:1ed39951ab7b | 141 | |
GregCr | 0:1ed39951ab7b | 142 | #elif USE_MODEM_FSK == 1 |
GregCr | 0:1ed39951ab7b | 143 | |
GregCr | 7:c1bbd6c56979 | 144 | debug("\n\n\r > FSK Mode < \n\n\r"); |
GregCr | 0:1ed39951ab7b | 145 | Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, |
GregCr | 0:1ed39951ab7b | 146 | FSK_DATARATE, 0, |
GregCr | 0:1ed39951ab7b | 147 | FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, |
GregCr | 7:c1bbd6c56979 | 148 | FSK_CRC_ENABLED, 0, 0, 0, 2000000 ); |
GregCr | 0:1ed39951ab7b | 149 | |
GregCr | 0:1ed39951ab7b | 150 | Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, |
GregCr | 0:1ed39951ab7b | 151 | 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, |
mluis | 9:e764990e45df | 152 | 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, |
GregCr | 3:8b9e2a4df4b5 | 153 | 0, 0, false, true ); |
GregCr | 0:1ed39951ab7b | 154 | |
GregCr | 0:1ed39951ab7b | 155 | #else |
GregCr | 0:1ed39951ab7b | 156 | |
GregCr | 0:1ed39951ab7b | 157 | #error "Please define a modem in the compiler options." |
GregCr | 0:1ed39951ab7b | 158 | |
GregCr | 0:1ed39951ab7b | 159 | #endif |
GregCr | 1:126d70d374f6 | 160 | |
GregCr | 7:c1bbd6c56979 | 161 | debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" ); |
GregCr | 0:1ed39951ab7b | 162 | |
GregCr | 3:8b9e2a4df4b5 | 163 | led = 0; |
GregCr | 3:8b9e2a4df4b5 | 164 | |
GregCr | 0:1ed39951ab7b | 165 | Radio.Rx( RX_TIMEOUT_VALUE ); |
GregCr | 0:1ed39951ab7b | 166 | |
GregCr | 0:1ed39951ab7b | 167 | while( 1 ) |
GregCr | 0:1ed39951ab7b | 168 | { |
GregCr | 0:1ed39951ab7b | 169 | switch( State ) |
GregCr | 0:1ed39951ab7b | 170 | { |
GregCr | 0:1ed39951ab7b | 171 | case RX: |
GregCr | 0:1ed39951ab7b | 172 | if( isMaster == true ) |
GregCr | 0:1ed39951ab7b | 173 | { |
GregCr | 0:1ed39951ab7b | 174 | if( BufferSize > 0 ) |
GregCr | 0:1ed39951ab7b | 175 | { |
GregCr | 0:1ed39951ab7b | 176 | if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 ) |
GregCr | 0:1ed39951ab7b | 177 | { |
GregCr | 3:8b9e2a4df4b5 | 178 | led = !led; |
GregCr | 2:59e108728d71 | 179 | debug( "...Pong\r\n" ); |
GregCr | 0:1ed39951ab7b | 180 | // Send the next PING frame |
GregCr | 7:c1bbd6c56979 | 181 | strcpy( ( char* )Buffer, ( char* )PingMsg ); |
GregCr | 0:1ed39951ab7b | 182 | // We fill the buffer with numbers for the payload |
GregCr | 0:1ed39951ab7b | 183 | for( i = 4; i < BufferSize; i++ ) |
GregCr | 0:1ed39951ab7b | 184 | { |
GregCr | 0:1ed39951ab7b | 185 | Buffer[i] = i - 4; |
GregCr | 0:1ed39951ab7b | 186 | } |
GregCr | 0:1ed39951ab7b | 187 | wait_ms( 10 ); |
GregCr | 0:1ed39951ab7b | 188 | Radio.Send( Buffer, BufferSize ); |
GregCr | 0:1ed39951ab7b | 189 | } |
GregCr | 2:59e108728d71 | 190 | else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 ) |
GregCr | 0:1ed39951ab7b | 191 | { // A master already exists then become a slave |
GregCr | 2:59e108728d71 | 192 | debug( "...Ping\r\n" ); |
GregCr | 3:8b9e2a4df4b5 | 193 | led = !led; |
GregCr | 0:1ed39951ab7b | 194 | isMaster = false; |
GregCr | 7:c1bbd6c56979 | 195 | // Send the next PONG frame |
GregCr | 7:c1bbd6c56979 | 196 | strcpy( ( char* )Buffer, ( char* )PongMsg ); |
GregCr | 2:59e108728d71 | 197 | // We fill the buffer with numbers for the payload |
GregCr | 2:59e108728d71 | 198 | for( i = 4; i < BufferSize; i++ ) |
GregCr | 2:59e108728d71 | 199 | { |
GregCr | 2:59e108728d71 | 200 | Buffer[i] = i - 4; |
GregCr | 2:59e108728d71 | 201 | } |
GregCr | 3:8b9e2a4df4b5 | 202 | wait_ms( 10 ); |
GregCr | 2:59e108728d71 | 203 | Radio.Send( Buffer, BufferSize ); |
GregCr | 2:59e108728d71 | 204 | } |
GregCr | 2:59e108728d71 | 205 | else // valid reception but neither a PING or a PONG message |
GregCr | 2:59e108728d71 | 206 | { // Set device as master ans start again |
GregCr | 2:59e108728d71 | 207 | isMaster = true; |
GregCr | 0:1ed39951ab7b | 208 | Radio.Rx( RX_TIMEOUT_VALUE ); |
GregCr | 2:59e108728d71 | 209 | } |
GregCr | 0:1ed39951ab7b | 210 | } |
GregCr | 0:1ed39951ab7b | 211 | } |
GregCr | 0:1ed39951ab7b | 212 | else |
GregCr | 0:1ed39951ab7b | 213 | { |
GregCr | 0:1ed39951ab7b | 214 | if( BufferSize > 0 ) |
GregCr | 0:1ed39951ab7b | 215 | { |
GregCr | 0:1ed39951ab7b | 216 | if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 ) |
GregCr | 0:1ed39951ab7b | 217 | { |
GregCr | 3:8b9e2a4df4b5 | 218 | led = !led; |
GregCr | 2:59e108728d71 | 219 | debug( "...Ping\r\n" ); |
GregCr | 2:59e108728d71 | 220 | // Send the reply to the PING string |
GregCr | 7:c1bbd6c56979 | 221 | strcpy( ( char* )Buffer, ( char* )PongMsg ); |
GregCr | 0:1ed39951ab7b | 222 | // We fill the buffer with numbers for the payload |
GregCr | 0:1ed39951ab7b | 223 | for( i = 4; i < BufferSize; i++ ) |
GregCr | 0:1ed39951ab7b | 224 | { |
GregCr | 0:1ed39951ab7b | 225 | Buffer[i] = i - 4; |
GregCr | 0:1ed39951ab7b | 226 | } |
GregCr | 0:1ed39951ab7b | 227 | wait_ms( 10 ); |
GregCr | 0:1ed39951ab7b | 228 | Radio.Send( Buffer, BufferSize ); |
GregCr | 0:1ed39951ab7b | 229 | } |
GregCr | 2:59e108728d71 | 230 | else // valid reception but not a PING as expected |
GregCr | 2:59e108728d71 | 231 | { // Set device as master and start again |
GregCr | 2:59e108728d71 | 232 | isMaster = true; |
GregCr | 2:59e108728d71 | 233 | Radio.Rx( RX_TIMEOUT_VALUE ); |
GregCr | 2:59e108728d71 | 234 | } |
GregCr | 0:1ed39951ab7b | 235 | } |
GregCr | 0:1ed39951ab7b | 236 | } |
GregCr | 0:1ed39951ab7b | 237 | State = LOWPOWER; |
GregCr | 0:1ed39951ab7b | 238 | break; |
GregCr | 3:8b9e2a4df4b5 | 239 | case TX: |
GregCr | 3:8b9e2a4df4b5 | 240 | led = !led; |
GregCr | 2:59e108728d71 | 241 | if( isMaster == true ) |
GregCr | 0:1ed39951ab7b | 242 | { |
GregCr | 2:59e108728d71 | 243 | debug( "Ping...\r\n" ); |
GregCr | 0:1ed39951ab7b | 244 | } |
GregCr | 0:1ed39951ab7b | 245 | else |
GregCr | 0:1ed39951ab7b | 246 | { |
GregCr | 2:59e108728d71 | 247 | debug( "Pong...\r\n" ); |
GregCr | 0:1ed39951ab7b | 248 | } |
GregCr | 0:1ed39951ab7b | 249 | Radio.Rx( RX_TIMEOUT_VALUE ); |
GregCr | 0:1ed39951ab7b | 250 | State = LOWPOWER; |
GregCr | 0:1ed39951ab7b | 251 | break; |
GregCr | 0:1ed39951ab7b | 252 | case RX_TIMEOUT: |
GregCr | 0:1ed39951ab7b | 253 | if( isMaster == true ) |
GregCr | 0:1ed39951ab7b | 254 | { |
GregCr | 0:1ed39951ab7b | 255 | // Send the next PING frame |
GregCr | 7:c1bbd6c56979 | 256 | strcpy( ( char* )Buffer, ( char* )PingMsg ); |
GregCr | 0:1ed39951ab7b | 257 | for( i = 4; i < BufferSize; i++ ) |
GregCr | 0:1ed39951ab7b | 258 | { |
GregCr | 0:1ed39951ab7b | 259 | Buffer[i] = i - 4; |
GregCr | 0:1ed39951ab7b | 260 | } |
GregCr | 0:1ed39951ab7b | 261 | wait_ms( 10 ); |
GregCr | 0:1ed39951ab7b | 262 | Radio.Send( Buffer, BufferSize ); |
GregCr | 0:1ed39951ab7b | 263 | } |
GregCr | 0:1ed39951ab7b | 264 | else |
GregCr | 0:1ed39951ab7b | 265 | { |
GregCr | 0:1ed39951ab7b | 266 | Radio.Rx( RX_TIMEOUT_VALUE ); |
GregCr | 0:1ed39951ab7b | 267 | } |
GregCr | 0:1ed39951ab7b | 268 | State = LOWPOWER; |
GregCr | 0:1ed39951ab7b | 269 | break; |
GregCr | 0:1ed39951ab7b | 270 | case RX_ERROR: |
GregCr | 7:c1bbd6c56979 | 271 | // We have received a Packet with a CRC error, send reply as if packet was correct |
GregCr | 0:1ed39951ab7b | 272 | if( isMaster == true ) |
GregCr | 0:1ed39951ab7b | 273 | { |
GregCr | 0:1ed39951ab7b | 274 | // Send the next PING frame |
GregCr | 7:c1bbd6c56979 | 275 | strcpy( ( char* )Buffer, ( char* )PingMsg ); |
GregCr | 0:1ed39951ab7b | 276 | for( i = 4; i < BufferSize; i++ ) |
GregCr | 0:1ed39951ab7b | 277 | { |
GregCr | 0:1ed39951ab7b | 278 | Buffer[i] = i - 4; |
GregCr | 0:1ed39951ab7b | 279 | } |
GregCr | 0:1ed39951ab7b | 280 | wait_ms( 10 ); |
GregCr | 0:1ed39951ab7b | 281 | Radio.Send( Buffer, BufferSize ); |
GregCr | 0:1ed39951ab7b | 282 | } |
GregCr | 0:1ed39951ab7b | 283 | else |
GregCr | 0:1ed39951ab7b | 284 | { |
GregCr | 2:59e108728d71 | 285 | // Send the next PONG frame |
GregCr | 7:c1bbd6c56979 | 286 | strcpy( ( char* )Buffer, ( char* )PongMsg ); |
GregCr | 2:59e108728d71 | 287 | for( i = 4; i < BufferSize; i++ ) |
GregCr | 2:59e108728d71 | 288 | { |
GregCr | 2:59e108728d71 | 289 | Buffer[i] = i - 4; |
GregCr | 2:59e108728d71 | 290 | } |
GregCr | 2:59e108728d71 | 291 | wait_ms( 10 ); |
GregCr | 2:59e108728d71 | 292 | Radio.Send( Buffer, BufferSize ); |
GregCr | 0:1ed39951ab7b | 293 | } |
GregCr | 0:1ed39951ab7b | 294 | State = LOWPOWER; |
GregCr | 0:1ed39951ab7b | 295 | break; |
GregCr | 0:1ed39951ab7b | 296 | case TX_TIMEOUT: |
GregCr | 0:1ed39951ab7b | 297 | Radio.Rx( RX_TIMEOUT_VALUE ); |
GregCr | 0:1ed39951ab7b | 298 | State = LOWPOWER; |
GregCr | 0:1ed39951ab7b | 299 | break; |
GregCr | 0:1ed39951ab7b | 300 | case LOWPOWER: |
GregCr | 0:1ed39951ab7b | 301 | break; |
GregCr | 0:1ed39951ab7b | 302 | default: |
GregCr | 0:1ed39951ab7b | 303 | State = LOWPOWER; |
GregCr | 0:1ed39951ab7b | 304 | break; |
GregCr | 0:1ed39951ab7b | 305 | } |
GregCr | 0:1ed39951ab7b | 306 | } |
GregCr | 0:1ed39951ab7b | 307 | } |
GregCr | 0:1ed39951ab7b | 308 | |
GregCr | 0:1ed39951ab7b | 309 | void OnTxDone( void ) |
GregCr | 0:1ed39951ab7b | 310 | { |
GregCr | 5:f2431c4fe3bb | 311 | Radio.Sleep( ); |
GregCr | 0:1ed39951ab7b | 312 | State = TX; |
GregCr | 7:c1bbd6c56979 | 313 | debug_if( DEBUG_MESSAGE, "> OnTxDone\n\r" ); |
GregCr | 0:1ed39951ab7b | 314 | } |
GregCr | 0:1ed39951ab7b | 315 | |
GregCr | 4:5ece30264cd9 | 316 | void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
GregCr | 0:1ed39951ab7b | 317 | { |
GregCr | 0:1ed39951ab7b | 318 | Radio.Sleep( ); |
GregCr | 0:1ed39951ab7b | 319 | BufferSize = size; |
GregCr | 0:1ed39951ab7b | 320 | memcpy( Buffer, payload, BufferSize ); |
GregCr | 0:1ed39951ab7b | 321 | RssiValue = rssi; |
GregCr | 0:1ed39951ab7b | 322 | SnrValue = snr; |
GregCr | 0:1ed39951ab7b | 323 | State = RX; |
GregCr | 7:c1bbd6c56979 | 324 | debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" ); |
GregCr | 0:1ed39951ab7b | 325 | } |
GregCr | 0:1ed39951ab7b | 326 | |
GregCr | 0:1ed39951ab7b | 327 | void OnTxTimeout( void ) |
GregCr | 0:1ed39951ab7b | 328 | { |
GregCr | 0:1ed39951ab7b | 329 | Radio.Sleep( ); |
GregCr | 0:1ed39951ab7b | 330 | State = TX_TIMEOUT; |
GregCr | 7:c1bbd6c56979 | 331 | debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" ); |
GregCr | 0:1ed39951ab7b | 332 | } |
GregCr | 0:1ed39951ab7b | 333 | |
GregCr | 0:1ed39951ab7b | 334 | void OnRxTimeout( void ) |
GregCr | 0:1ed39951ab7b | 335 | { |
GregCr | 0:1ed39951ab7b | 336 | Radio.Sleep( ); |
GregCr | 1:126d70d374f6 | 337 | Buffer[ BufferSize ] = 0; |
GregCr | 0:1ed39951ab7b | 338 | State = RX_TIMEOUT; |
GregCr | 7:c1bbd6c56979 | 339 | debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" ); |
GregCr | 0:1ed39951ab7b | 340 | } |
GregCr | 0:1ed39951ab7b | 341 | |
GregCr | 0:1ed39951ab7b | 342 | void OnRxError( void ) |
GregCr | 0:1ed39951ab7b | 343 | { |
GregCr | 0:1ed39951ab7b | 344 | Radio.Sleep( ); |
GregCr | 0:1ed39951ab7b | 345 | State = RX_ERROR; |
GregCr | 7:c1bbd6c56979 | 346 | debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" ); |
GregCr | 0:1ed39951ab7b | 347 | } |
GregCr | 3:8b9e2a4df4b5 | 348 |