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 SX1276PingPong by
main.cpp@10:9184674b5cfd, 2016-03-06 (annotated)
- Committer:
- donsez
- Date:
- Sun Mar 06 11:10:13 2016 +0000
- Revision:
- 10:9184674b5cfd
- Parent:
- 9:e764990e45df
- Child:
- 16:352011886276
add lib
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" |
| donsez | 10:9184674b5cfd | 4 | |
| GregCr | 8:f956dee63a56 | 5 | #include "debug.h" |
| GregCr | 0:1ed39951ab7b | 6 | |
| donsez | 10:9184674b5cfd | 7 | /* CONFIGURATION */ |
| donsez | 10:9184674b5cfd | 8 | |
| donsez | 10:9184674b5cfd | 9 | #define NODE_ADDR 0x411A |
| donsez | 10:9184674b5cfd | 10 | |
| GregCr | 0:1ed39951ab7b | 11 | /* Set this flag to '1' to display debug messages on the console */ |
| donsez | 10:9184674b5cfd | 12 | #define DEBUG_MESSAGE 1 |
| donsez | 10:9184674b5cfd | 13 | |
| donsez | 10:9184674b5cfd | 14 | #define RX_MODE 1 |
| donsez | 10:9184674b5cfd | 15 | |
| donsez | 10:9184674b5cfd | 16 | #define TX_MODE !RX_MODE |
| donsez | 10:9184674b5cfd | 17 | |
| donsez | 10:9184674b5cfd | 18 | /* Set the mode RX_MODE or TX_MODE */ |
| donsez | 10:9184674b5cfd | 19 | #define MODE RX_MODE |
| donsez | 10:9184674b5cfd | 20 | |
| donsez | 10:9184674b5cfd | 21 | /* Set the delay (according the duty cycle for the ISM band of the frequency RF_FREQUENCY */ |
| donsez | 10:9184674b5cfd | 22 | |
| donsez | 10:9184674b5cfd | 23 | #define DUTY_CYCLE 0.01 |
| donsez | 10:9184674b5cfd | 24 | //#define DELAY_NEXT_TX_IN_MILLISEC ((int)((timeOnAirInMilli / DUTY_CYCLE)-timeOnAirInMilli)) |
| donsez | 10:9184674b5cfd | 25 | |
| donsez | 10:9184674b5cfd | 26 | #define DELAY_NEXT_TX_IN_MILLISEC 5000 |
| GregCr | 0:1ed39951ab7b | 27 | |
| GregCr | 0:1ed39951ab7b | 28 | /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ |
| GregCr | 5:f2431c4fe3bb | 29 | #define USE_MODEM_LORA 1 |
| GregCr | 0:1ed39951ab7b | 30 | #define USE_MODEM_FSK !USE_MODEM_LORA |
| GregCr | 0:1ed39951ab7b | 31 | |
| donsez | 10:9184674b5cfd | 32 | #define RF_FREQUENCY 868100000 // Hz |
| GregCr | 0:1ed39951ab7b | 33 | #define TX_OUTPUT_POWER 14 // 14 dBm |
| GregCr | 0:1ed39951ab7b | 34 | |
| donsez | 10:9184674b5cfd | 35 | |
| GregCr | 0:1ed39951ab7b | 36 | #if USE_MODEM_LORA == 1 |
| GregCr | 0:1ed39951ab7b | 37 | |
| donsez | 10:9184674b5cfd | 38 | #define LORA_BANDWIDTH 0 // [0: 125 kHz, |
| GregCr | 0:1ed39951ab7b | 39 | // 1: 250 kHz, |
| GregCr | 0:1ed39951ab7b | 40 | // 2: 500 kHz, |
| GregCr | 0:1ed39951ab7b | 41 | // 3: Reserved] |
| donsez | 10:9184674b5cfd | 42 | #define LORA_SPREADING_FACTOR 12 // [SF7..SF12] |
| GregCr | 0:1ed39951ab7b | 43 | #define LORA_CODINGRATE 1 // [1: 4/5, |
| GregCr | 0:1ed39951ab7b | 44 | // 2: 4/6, |
| GregCr | 0:1ed39951ab7b | 45 | // 3: 4/7, |
| GregCr | 0:1ed39951ab7b | 46 | // 4: 4/8] |
| GregCr | 0:1ed39951ab7b | 47 | #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx |
| GregCr | 0:1ed39951ab7b | 48 | #define LORA_SYMBOL_TIMEOUT 5 // Symbols |
| GregCr | 0:1ed39951ab7b | 49 | #define LORA_FIX_LENGTH_PAYLOAD_ON false |
| GregCr | 3:8b9e2a4df4b5 | 50 | #define LORA_FHSS_ENABLED false |
| GregCr | 3:8b9e2a4df4b5 | 51 | #define LORA_NB_SYMB_HOP 4 |
| GregCr | 0:1ed39951ab7b | 52 | #define LORA_IQ_INVERSION_ON false |
| GregCr | 3:8b9e2a4df4b5 | 53 | #define LORA_CRC_ENABLED true |
| GregCr | 3:8b9e2a4df4b5 | 54 | |
| GregCr | 0:1ed39951ab7b | 55 | #elif USE_MODEM_FSK == 1 |
| GregCr | 0:1ed39951ab7b | 56 | |
| GregCr | 2:59e108728d71 | 57 | #define FSK_FDEV 25000 // Hz |
| GregCr | 2:59e108728d71 | 58 | #define FSK_DATARATE 19200 // bps |
| GregCr | 2:59e108728d71 | 59 | #define FSK_BANDWIDTH 50000 // Hz |
| GregCr | 2:59e108728d71 | 60 | #define FSK_AFC_BANDWIDTH 83333 // Hz |
| GregCr | 0:1ed39951ab7b | 61 | #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx |
| GregCr | 0:1ed39951ab7b | 62 | #define FSK_FIX_LENGTH_PAYLOAD_ON false |
| GregCr | 3:8b9e2a4df4b5 | 63 | #define FSK_CRC_ENABLED true |
| GregCr | 3:8b9e2a4df4b5 | 64 | |
| GregCr | 0:1ed39951ab7b | 65 | #else |
| GregCr | 0:1ed39951ab7b | 66 | #error "Please define a modem in the compiler options." |
| GregCr | 0:1ed39951ab7b | 67 | #endif |
| GregCr | 0:1ed39951ab7b | 68 | |
| donsez | 10:9184674b5cfd | 69 | #define RX_TIMEOUT_VALUE 1000000000 // in us |
| donsez | 10:9184674b5cfd | 70 | #define BUFFER_SIZE 17 // Define the payload size here |
| donsez | 10:9184674b5cfd | 71 | |
| donsez | 10:9184674b5cfd | 72 | |
| donsez | 10:9184674b5cfd | 73 | Serial pc(USBTX,USBRX); |
| GregCr | 0:1ed39951ab7b | 74 | |
| GregCr | 8:f956dee63a56 | 75 | #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) ) |
| GregCr | 3:8b9e2a4df4b5 | 76 | DigitalOut led(LED2); |
| GregCr | 3:8b9e2a4df4b5 | 77 | #else |
| GregCr | 3:8b9e2a4df4b5 | 78 | DigitalOut led(LED1); |
| GregCr | 3:8b9e2a4df4b5 | 79 | #endif |
| GregCr | 3:8b9e2a4df4b5 | 80 | |
| GregCr | 0:1ed39951ab7b | 81 | /* |
| GregCr | 0:1ed39951ab7b | 82 | * Global variables declarations |
| GregCr | 0:1ed39951ab7b | 83 | */ |
| GregCr | 0:1ed39951ab7b | 84 | typedef RadioState States_t; |
| GregCr | 7:c1bbd6c56979 | 85 | volatile States_t State = LOWPOWER; |
| GregCr | 0:1ed39951ab7b | 86 | |
| donsez | 10:9184674b5cfd | 87 | SX1276MB1xAS Radio( OnTxDone, OnTxTimeout, OnRxDone, OnRxTimeout, OnRxError, NULL /*OnFhssChangeChannel*/, NULL /*OnCadDone*/ ); |
| GregCr | 0:1ed39951ab7b | 88 | |
| GregCr | 0:1ed39951ab7b | 89 | uint16_t BufferSize = BUFFER_SIZE; |
| GregCr | 0:1ed39951ab7b | 90 | uint8_t Buffer[BUFFER_SIZE]; |
| GregCr | 0:1ed39951ab7b | 91 | |
| donsez | 10:9184674b5cfd | 92 | int16_t RssiValue = 0; |
| donsez | 10:9184674b5cfd | 93 | int8_t SnrValue = 0; |
| donsez | 10:9184674b5cfd | 94 | |
| donsez | 10:9184674b5cfd | 95 | ModemType Modem; |
| donsez | 10:9184674b5cfd | 96 | |
| donsez | 10:9184674b5cfd | 97 | uint16_t SeqNum = 0; |
| donsez | 10:9184674b5cfd | 98 | |
| donsez | 10:9184674b5cfd | 99 | // Address of the Source Node |
| donsez | 10:9184674b5cfd | 100 | uint16_t NodeSrcAddr = NODE_ADDR; |
| donsez | 10:9184674b5cfd | 101 | |
| donsez | 10:9184674b5cfd | 102 | void hexprintf(Serial* pc, const uint8_t* buffer, uint16_t size) |
| donsez | 10:9184674b5cfd | 103 | { |
| donsez | 10:9184674b5cfd | 104 | for(uint16_t count = 0; count < size; count++) |
| donsez | 10:9184674b5cfd | 105 | { |
| donsez | 10:9184674b5cfd | 106 | pc->printf("%02x", buffer[count]); |
| donsez | 10:9184674b5cfd | 107 | } |
| donsez | 10:9184674b5cfd | 108 | } |
| donsez | 10:9184674b5cfd | 109 | const uint8_t Msg[] = "TEST**##abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#"; /* abc.. is for padding */ |
| donsez | 10:9184674b5cfd | 110 | |
| GregCr | 0:1ed39951ab7b | 111 | |
| GregCr | 0:1ed39951ab7b | 112 | int main() |
| donsez | 10:9184674b5cfd | 113 | { |
| donsez | 10:9184674b5cfd | 114 | |
| donsez | 10:9184674b5cfd | 115 | pc.format(8, Serial::None, 1); |
| donsez | 10:9184674b5cfd | 116 | pc.baud(115200); |
| GregCr | 0:1ed39951ab7b | 117 | |
| donsez | 10:9184674b5cfd | 118 | sx_debug( ">INFO RX/TX Modem \r\n\n" ); |
| GregCr | 0:1ed39951ab7b | 119 | |
| GregCr | 7:c1bbd6c56979 | 120 | // verify the connection with the board |
| GregCr | 7:c1bbd6c56979 | 121 | while( Radio.Read( REG_VERSION ) == 0x00 ) |
| GregCr | 2:59e108728d71 | 122 | { |
| donsez | 10:9184674b5cfd | 123 | sx_debug( ">ERROR : Radio could not be detected!\r\n", NULL ); |
| GregCr | 7:c1bbd6c56979 | 124 | wait( 1 ); |
| GregCr | 2:59e108728d71 | 125 | } |
| GregCr | 7:c1bbd6c56979 | 126 | |
| donsez | 10:9184674b5cfd | 127 | sx_debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1LAS ) ) , ">INFO Board Type: SX1276MB1LAS\r\n" ); |
| donsez | 10:9184674b5cfd | 128 | sx_debug_if( ( DEBUG_MESSAGE & ( Radio.DetectBoardType( ) == SX1276MB1MAS ) ) , ">INFO Board Type: SX1276MB1MAS\r\n" ); |
| GregCr | 1:126d70d374f6 | 129 | |
| GregCr | 0:1ed39951ab7b | 130 | Radio.SetChannel( RF_FREQUENCY ); |
| GregCr | 0:1ed39951ab7b | 131 | |
| donsez | 10:9184674b5cfd | 132 | |
| GregCr | 0:1ed39951ab7b | 133 | #if USE_MODEM_LORA == 1 |
| GregCr | 3:8b9e2a4df4b5 | 134 | |
| donsez | 10:9184674b5cfd | 135 | sx_debug_if( LORA_FHSS_ENABLED, ">INFO LORA FHSS Mode\r\n"); |
| donsez | 10:9184674b5cfd | 136 | sx_debug_if( !LORA_FHSS_ENABLED, ">INFO LORA Mode\r\n"); |
| GregCr | 7:c1bbd6c56979 | 137 | |
| donsez | 10:9184674b5cfd | 138 | Modem = MODEM_LORA; |
| donsez | 10:9184674b5cfd | 139 | |
| donsez | 10:9184674b5cfd | 140 | Radio.SetTxConfig( Modem, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
| GregCr | 0:1ed39951ab7b | 141 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
| GregCr | 0:1ed39951ab7b | 142 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
| GregCr | 3:8b9e2a4df4b5 | 143 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
| GregCr | 7:c1bbd6c56979 | 144 | LORA_IQ_INVERSION_ON, 2000000 ); |
| GregCr | 0:1ed39951ab7b | 145 | |
| donsez | 10:9184674b5cfd | 146 | pc.printf(">INFO TX Parameters freq=%d bw=%d sf=%d cr=%d preamble=%d crc=%d fhss=%d hop=%d iq=%d\r\n", |
| donsez | 10:9184674b5cfd | 147 | RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
| donsez | 10:9184674b5cfd | 148 | LORA_PREAMBLE_LENGTH, LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
| donsez | 10:9184674b5cfd | 149 | LORA_IQ_INVERSION_ON |
| donsez | 10:9184674b5cfd | 150 | ); |
| donsez | 10:9184674b5cfd | 151 | |
| donsez | 10:9184674b5cfd | 152 | Radio.SetRxConfig( Modem, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
| GregCr | 0:1ed39951ab7b | 153 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
| mluis | 9:e764990e45df | 154 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
| GregCr | 3:8b9e2a4df4b5 | 155 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
| GregCr | 3:8b9e2a4df4b5 | 156 | LORA_IQ_INVERSION_ON, true ); |
| GregCr | 0:1ed39951ab7b | 157 | |
| donsez | 10:9184674b5cfd | 158 | |
| donsez | 10:9184674b5cfd | 159 | pc.printf(">INFO RX Parameters freq=%d bw=%d sf=%d cr=%d preamble=%d crc=%d fhss=%d hop=%d iq=%d\r\n", |
| donsez | 10:9184674b5cfd | 160 | RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
| donsez | 10:9184674b5cfd | 161 | LORA_PREAMBLE_LENGTH, LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
| donsez | 10:9184674b5cfd | 162 | LORA_IQ_INVERSION_ON |
| donsez | 10:9184674b5cfd | 163 | ); |
| donsez | 10:9184674b5cfd | 164 | |
| GregCr | 0:1ed39951ab7b | 165 | #elif USE_MODEM_FSK == 1 |
| GregCr | 0:1ed39951ab7b | 166 | |
| donsez | 10:9184674b5cfd | 167 | sx_debug(">INFO FSK Mode\r\n"); |
| donsez | 10:9184674b5cfd | 168 | |
| donsez | 10:9184674b5cfd | 169 | Modem = MODEM_FSK; |
| donsez | 10:9184674b5cfd | 170 | |
| GregCr | 0:1ed39951ab7b | 171 | Radio.SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, |
| GregCr | 0:1ed39951ab7b | 172 | FSK_DATARATE, 0, |
| GregCr | 0:1ed39951ab7b | 173 | FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, |
| GregCr | 7:c1bbd6c56979 | 174 | FSK_CRC_ENABLED, 0, 0, 0, 2000000 ); |
| donsez | 10:9184674b5cfd | 175 | |
| donsez | 10:9184674b5cfd | 176 | pc.printf(">INFO TX Parameters freq=%d bw=%d sf=%d dr=%d\r\n", |
| donsez | 10:9184674b5cfd | 177 | RF_FREQUENCY, FSK_BANDWIDTH, FSK_DATARATE ); |
| GregCr | 0:1ed39951ab7b | 178 | |
| GregCr | 0:1ed39951ab7b | 179 | Radio.SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, |
| GregCr | 0:1ed39951ab7b | 180 | 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, |
| mluis | 9:e764990e45df | 181 | 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, |
| GregCr | 3:8b9e2a4df4b5 | 182 | 0, 0, false, true ); |
| GregCr | 0:1ed39951ab7b | 183 | |
| donsez | 10:9184674b5cfd | 184 | pc.printf(">INFO RX Parameters freq=%d bw=%d dr=%d afc_bw=%d preamble=%d crc=%d\r\n", |
| donsez | 10:9184674b5cfd | 185 | RF_FREQUENCY, FSK_BANDWIDTH, FSK_DATARATE, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, FSK_CRC_ENABLED ); |
| donsez | 10:9184674b5cfd | 186 | |
| donsez | 10:9184674b5cfd | 187 | |
| GregCr | 0:1ed39951ab7b | 188 | #else |
| GregCr | 0:1ed39951ab7b | 189 | |
| GregCr | 0:1ed39951ab7b | 190 | #error "Please define a modem in the compiler options." |
| GregCr | 0:1ed39951ab7b | 191 | |
| GregCr | 0:1ed39951ab7b | 192 | #endif |
| donsez | 10:9184674b5cfd | 193 | |
| GregCr | 0:1ed39951ab7b | 194 | |
| GregCr | 3:8b9e2a4df4b5 | 195 | led = 0; |
| donsez | 10:9184674b5cfd | 196 | #if MODE == RX_MODE |
| donsez | 10:9184674b5cfd | 197 | sx_debug_if( DEBUG_MESSAGE, ">INFO Starting RX loop\r\n" ); |
| donsez | 10:9184674b5cfd | 198 | |
| donsez | 10:9184674b5cfd | 199 | // start RX |
| GregCr | 0:1ed39951ab7b | 200 | Radio.Rx( RX_TIMEOUT_VALUE ); |
| donsez | 10:9184674b5cfd | 201 | State = LOWPOWER; |
| GregCr | 0:1ed39951ab7b | 202 | |
| donsez | 10:9184674b5cfd | 203 | #elif MODE == TX_MODE |
| donsez | 10:9184674b5cfd | 204 | sx_debug_if( DEBUG_MESSAGE, ">INFO Starting TX loop\r\n" ); |
| donsez | 10:9184674b5cfd | 205 | State = TX; |
| donsez | 10:9184674b5cfd | 206 | |
| donsez | 10:9184674b5cfd | 207 | #else |
| donsez | 10:9184674b5cfd | 208 | #error "Please define a valid mode (RX_MODE, TX_MODE)." |
| donsez | 10:9184674b5cfd | 209 | #endif |
| donsez | 10:9184674b5cfd | 210 | |
| donsez | 10:9184674b5cfd | 211 | // TODO ECHO_MODE : RX_MODE then TX_MODE |
| donsez | 10:9184674b5cfd | 212 | |
| GregCr | 0:1ed39951ab7b | 213 | while( 1 ) |
| GregCr | 0:1ed39951ab7b | 214 | { |
| GregCr | 0:1ed39951ab7b | 215 | switch( State ) |
| GregCr | 0:1ed39951ab7b | 216 | { |
| GregCr | 0:1ed39951ab7b | 217 | case RX: |
| GregCr | 0:1ed39951ab7b | 218 | if( BufferSize > 0 ) |
| GregCr | 0:1ed39951ab7b | 219 | { |
| donsez | 10:9184674b5cfd | 220 | led = !led; // Invert LED |
| donsez | 10:9184674b5cfd | 221 | |
| donsez | 10:9184674b5cfd | 222 | |
| donsez | 10:9184674b5cfd | 223 | // TODO ADD tmst | number | Internal timestamp of "RX finished" event (32b unsigned) |
| donsez | 10:9184674b5cfd | 224 | |
| donsez | 10:9184674b5cfd | 225 | pc.printf(">INFO RX modem=%d size=%d rssi=%d snr=%d freq=%d bw=%d sf=%d cr=%d buffer=", |
| donsez | 10:9184674b5cfd | 226 | Modem, BufferSize, RssiValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE ); |
| donsez | 10:9184674b5cfd | 227 | hexprintf(&pc, Buffer, BufferSize); |
| donsez | 10:9184674b5cfd | 228 | pc.printf("\r\n"); |
| donsez | 10:9184674b5cfd | 229 | |
| donsez | 10:9184674b5cfd | 230 | pc.printf("RX;%d;%d;%d;%d;%d;%d;%d;%d;", |
| donsez | 10:9184674b5cfd | 231 | Modem, BufferSize, RssiValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE ); |
| donsez | 10:9184674b5cfd | 232 | hexprintf(&pc, Buffer, BufferSize); |
| donsez | 10:9184674b5cfd | 233 | pc.printf("\r\n"); |
| donsez | 10:9184674b5cfd | 234 | // wait_ms( 10 ); |
| donsez | 10:9184674b5cfd | 235 | Radio.Rx( RX_TIMEOUT_VALUE ); |
| GregCr | 0:1ed39951ab7b | 236 | } |
| donsez | 10:9184674b5cfd | 237 | |
| GregCr | 0:1ed39951ab7b | 238 | State = LOWPOWER; |
| GregCr | 0:1ed39951ab7b | 239 | break; |
| GregCr | 0:1ed39951ab7b | 240 | case RX_TIMEOUT: |
| donsez | 10:9184674b5cfd | 241 | Radio.Rx( RX_TIMEOUT_VALUE ); |
| GregCr | 0:1ed39951ab7b | 242 | State = LOWPOWER; |
| GregCr | 0:1ed39951ab7b | 243 | break; |
| GregCr | 0:1ed39951ab7b | 244 | case RX_ERROR: |
| donsez | 10:9184674b5cfd | 245 | // We have received a Packet with a CRC error |
| donsez | 10:9184674b5cfd | 246 | pc.printf(">INFO RX_ERROR size=%d\r\n", BufferSize); |
| donsez | 10:9184674b5cfd | 247 | pc.printf("RX_ERROR;%d\r\n", BufferSize); |
| donsez | 10:9184674b5cfd | 248 | Radio.Rx( RX_TIMEOUT_VALUE ); |
| GregCr | 0:1ed39951ab7b | 249 | State = LOWPOWER; |
| GregCr | 0:1ed39951ab7b | 250 | break; |
| GregCr | 0:1ed39951ab7b | 251 | case TX_TIMEOUT: |
| donsez | 10:9184674b5cfd | 252 | pc.printf(">TX: TIMEOUT\r\n"); |
| donsez | 10:9184674b5cfd | 253 | case TX: |
| donsez | 10:9184674b5cfd | 254 | int timeOnAirInMilli = Radio.TimeOnAir(Modem,BufferSize)/1000; |
| donsez | 10:9184674b5cfd | 255 | if(DELAY_NEXT_TX_IN_MILLISEC!=0) { |
| donsez | 10:9184674b5cfd | 256 | pc.printf(">INFO: wait %.4f sec before TX\r\n", DELAY_NEXT_TX_IN_MILLISEC/1000.0); |
| donsez | 10:9184674b5cfd | 257 | wait_ms( DELAY_NEXT_TX_IN_MILLISEC ); |
| donsez | 10:9184674b5cfd | 258 | } |
| donsez | 10:9184674b5cfd | 259 | led = !led; // Invert LED |
| donsez | 10:9184674b5cfd | 260 | memcpy(( char* )Buffer, ( char* ) Msg, BufferSize); |
| donsez | 10:9184674b5cfd | 261 | ++SeqNum; |
| donsez | 10:9184674b5cfd | 262 | /* refresh counters in payload (big endian, for readability) */ |
| donsez | 10:9184674b5cfd | 263 | Buffer[4] = (uint8_t)(SeqNum >> 8); /* MSB */ |
| donsez | 10:9184674b5cfd | 264 | Buffer[5] = (uint8_t)(SeqNum & 0x00FF); /* LSB */ |
| donsez | 10:9184674b5cfd | 265 | Buffer[6] = (uint8_t)(NodeSrcAddr >> 8); /* MSB */ |
| donsez | 10:9184674b5cfd | 266 | Buffer[7] = (uint8_t)(NodeSrcAddr & 0x00FF); /* LSB */ |
| donsez | 10:9184674b5cfd | 267 | |
| donsez | 10:9184674b5cfd | 268 | /* send packet */ |
| donsez | 10:9184674b5cfd | 269 | pc.printf(">TX: src=%4x seqnum=%u size=%d timeOnAir=%.4f\r\n", NodeSrcAddr, SeqNum, BufferSize, timeOnAirInMilli/1000.0); |
| donsez | 10:9184674b5cfd | 270 | wait_ms( 10 ); |
| donsez | 10:9184674b5cfd | 271 | Radio.Send( Buffer, BufferSize ); |
| GregCr | 0:1ed39951ab7b | 272 | State = LOWPOWER; |
| donsez | 10:9184674b5cfd | 273 | break; |
| GregCr | 0:1ed39951ab7b | 274 | case LOWPOWER: |
| GregCr | 0:1ed39951ab7b | 275 | break; |
| GregCr | 0:1ed39951ab7b | 276 | default: |
| GregCr | 0:1ed39951ab7b | 277 | State = LOWPOWER; |
| GregCr | 0:1ed39951ab7b | 278 | break; |
| GregCr | 0:1ed39951ab7b | 279 | } |
| GregCr | 0:1ed39951ab7b | 280 | } |
| GregCr | 0:1ed39951ab7b | 281 | } |
| GregCr | 0:1ed39951ab7b | 282 | |
| GregCr | 0:1ed39951ab7b | 283 | void OnTxDone( void ) |
| GregCr | 0:1ed39951ab7b | 284 | { |
| GregCr | 5:f2431c4fe3bb | 285 | Radio.Sleep( ); |
| GregCr | 0:1ed39951ab7b | 286 | State = TX; |
| donsez | 10:9184674b5cfd | 287 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnTxDone\r\n" ); |
| GregCr | 0:1ed39951ab7b | 288 | } |
| GregCr | 0:1ed39951ab7b | 289 | |
| GregCr | 4:5ece30264cd9 | 290 | void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
| GregCr | 0:1ed39951ab7b | 291 | { |
| GregCr | 0:1ed39951ab7b | 292 | Radio.Sleep( ); |
| GregCr | 0:1ed39951ab7b | 293 | BufferSize = size; |
| GregCr | 0:1ed39951ab7b | 294 | memcpy( Buffer, payload, BufferSize ); |
| GregCr | 0:1ed39951ab7b | 295 | RssiValue = rssi; |
| GregCr | 0:1ed39951ab7b | 296 | SnrValue = snr; |
| GregCr | 0:1ed39951ab7b | 297 | State = RX; |
| donsez | 10:9184674b5cfd | 298 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnRxDone\r\n" ); |
| GregCr | 0:1ed39951ab7b | 299 | } |
| GregCr | 0:1ed39951ab7b | 300 | |
| GregCr | 0:1ed39951ab7b | 301 | void OnTxTimeout( void ) |
| GregCr | 0:1ed39951ab7b | 302 | { |
| GregCr | 0:1ed39951ab7b | 303 | Radio.Sleep( ); |
| GregCr | 0:1ed39951ab7b | 304 | State = TX_TIMEOUT; |
| donsez | 10:9184674b5cfd | 305 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnTxTimeout\r\n" ); |
| GregCr | 0:1ed39951ab7b | 306 | } |
| GregCr | 0:1ed39951ab7b | 307 | |
| GregCr | 0:1ed39951ab7b | 308 | void OnRxTimeout( void ) |
| GregCr | 0:1ed39951ab7b | 309 | { |
| GregCr | 0:1ed39951ab7b | 310 | Radio.Sleep( ); |
| GregCr | 1:126d70d374f6 | 311 | Buffer[ BufferSize ] = 0; |
| GregCr | 0:1ed39951ab7b | 312 | State = RX_TIMEOUT; |
| donsez | 10:9184674b5cfd | 313 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnRxTimeout\r\n" ); |
| GregCr | 0:1ed39951ab7b | 314 | } |
| GregCr | 0:1ed39951ab7b | 315 | |
| GregCr | 0:1ed39951ab7b | 316 | void OnRxError( void ) |
| GregCr | 0:1ed39951ab7b | 317 | { |
| GregCr | 0:1ed39951ab7b | 318 | Radio.Sleep( ); |
| GregCr | 0:1ed39951ab7b | 319 | State = RX_ERROR; |
| donsez | 10:9184674b5cfd | 320 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnRxError\r\n" ); |
| GregCr | 0:1ed39951ab7b | 321 | } |
| GregCr | 3:8b9e2a4df4b5 | 322 | |
| donsez | 10:9184674b5cfd | 323 | /*! |
| donsez | 10:9184674b5cfd | 324 | * @brief Function executed on Radio Fhss Change Channel event |
| donsez | 10:9184674b5cfd | 325 | */ |
| donsez | 10:9184674b5cfd | 326 | void OnFhssChangeChannel( uint8_t channelIndex ) |
| donsez | 10:9184674b5cfd | 327 | { |
| donsez | 10:9184674b5cfd | 328 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnFhssChangeChannel\r\n" ); |
| donsez | 10:9184674b5cfd | 329 | } |
| donsez | 10:9184674b5cfd | 330 | |
| donsez | 10:9184674b5cfd | 331 | /*! |
| donsez | 10:9184674b5cfd | 332 | * @brief Function executed on CAD Done event |
| donsez | 10:9184674b5cfd | 333 | */ |
| donsez | 10:9184674b5cfd | 334 | void OnCadDone( void ) |
| donsez | 10:9184674b5cfd | 335 | { |
| donsez | 10:9184674b5cfd | 336 | State = TX; |
| donsez | 10:9184674b5cfd | 337 | sx_debug_if( DEBUG_MESSAGE, ">INFO OnCadDone\r\n" ); |
| donsez | 10:9184674b5cfd | 338 | } |
