
MAX20361 System Demo with Low Power 2 mode
Dependencies: SX1276GenericLib USBDevice
Fork of NonPingPong_PICO_LoRa by
SX1276GenericPingPong/GenericPingPong2.cpp@3:85fc843a9d7d, 2020-10-12 (annotated)
- Committer:
- walterluu
- Date:
- Mon Oct 12 21:55:22 2020 +0000
- Revision:
- 3:85fc843a9d7d
- Child:
- 6:51f492ca61a2
MAX20361 Demo Firmware version 1.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
walterluu | 3:85fc843a9d7d | 1 | /* |
walterluu | 3:85fc843a9d7d | 2 | * This file contains a copy of the master content sx1276PingPong |
walterluu | 3:85fc843a9d7d | 3 | * with adaption for the SX1276Generic environment |
walterluu | 3:85fc843a9d7d | 4 | * (c) 2017 Helmut Tschemernjak |
walterluu | 3:85fc843a9d7d | 5 | * 30826 Garbsen (Hannover) Germany |
walterluu | 3:85fc843a9d7d | 6 | */ |
walterluu | 3:85fc843a9d7d | 7 | |
walterluu | 3:85fc843a9d7d | 8 | #include "mbed.h" |
walterluu | 3:85fc843a9d7d | 9 | #include "PinMap.h" |
walterluu | 3:85fc843a9d7d | 10 | #include "GenericPingPong2.h" |
walterluu | 3:85fc843a9d7d | 11 | #include "sx1276-mbed-hal.h" |
walterluu | 3:85fc843a9d7d | 12 | #include "main.h" |
walterluu | 3:85fc843a9d7d | 13 | #include "global_buffers.h" //adding this for development |
walterluu | 3:85fc843a9d7d | 14 | |
walterluu | 3:85fc843a9d7d | 15 | #include "sx1276.h" |
walterluu | 3:85fc843a9d7d | 16 | |
walterluu | 3:85fc843a9d7d | 17 | #include "USBSerial.h" |
walterluu | 3:85fc843a9d7d | 18 | |
walterluu | 3:85fc843a9d7d | 19 | #ifdef FEATURE_LORA // in main.cpp |
walterluu | 3:85fc843a9d7d | 20 | |
walterluu | 3:85fc843a9d7d | 21 | /* Set this flag to '1' to display debug messages on the console */ |
walterluu | 3:85fc843a9d7d | 22 | #define DEBUG_MESSAGE 1 |
walterluu | 3:85fc843a9d7d | 23 | |
walterluu | 3:85fc843a9d7d | 24 | /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ |
walterluu | 3:85fc843a9d7d | 25 | #define USE_MODEM_LORA 1 |
walterluu | 3:85fc843a9d7d | 26 | #define USE_MODEM_FSK !USE_MODEM_LORA |
walterluu | 3:85fc843a9d7d | 27 | #define RF_FREQUENCY RF_FREQUENCY_915_0 // Hz |
walterluu | 3:85fc843a9d7d | 28 | #define TX_OUTPUT_POWER 14 // 14 dBm |
walterluu | 3:85fc843a9d7d | 29 | |
walterluu | 3:85fc843a9d7d | 30 | #if USE_MODEM_LORA == 1 |
walterluu | 3:85fc843a9d7d | 31 | |
walterluu | 3:85fc843a9d7d | 32 | #define LORA_BANDWIDTH 125000 // LoRa default, details in SX1276::BandwidthMap |
walterluu | 3:85fc843a9d7d | 33 | #define LORA_SPREADING_FACTOR LORA_SF7 |
walterluu | 3:85fc843a9d7d | 34 | #define LORA_CODINGRATE LORA_ERROR_CODING_RATE_4_5 |
walterluu | 3:85fc843a9d7d | 35 | |
walterluu | 3:85fc843a9d7d | 36 | #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx |
walterluu | 3:85fc843a9d7d | 37 | #define LORA_SYMBOL_TIMEOUT 5 // Symbols |
walterluu | 3:85fc843a9d7d | 38 | #define LORA_FIX_LENGTH_PAYLOAD_ON false |
walterluu | 3:85fc843a9d7d | 39 | #define LORA_FHSS_ENABLED false |
walterluu | 3:85fc843a9d7d | 40 | #define LORA_NB_SYMB_HOP 4 |
walterluu | 3:85fc843a9d7d | 41 | #define LORA_IQ_INVERSION_ON false |
walterluu | 3:85fc843a9d7d | 42 | #define LORA_CRC_ENABLED true |
walterluu | 3:85fc843a9d7d | 43 | |
walterluu | 3:85fc843a9d7d | 44 | #elif USE_MODEM_FSK == 1 |
walterluu | 3:85fc843a9d7d | 45 | |
walterluu | 3:85fc843a9d7d | 46 | #define FSK_FDEV 25000 // Hz |
walterluu | 3:85fc843a9d7d | 47 | #define FSK_DATARATE 19200 // bps |
walterluu | 3:85fc843a9d7d | 48 | #define FSK_BANDWIDTH 50000 // Hz |
walterluu | 3:85fc843a9d7d | 49 | #define FSK_AFC_BANDWIDTH 83333 // Hz |
walterluu | 3:85fc843a9d7d | 50 | #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx |
walterluu | 3:85fc843a9d7d | 51 | #define FSK_FIX_LENGTH_PAYLOAD_ON false |
walterluu | 3:85fc843a9d7d | 52 | #define FSK_CRC_ENABLED true |
walterluu | 3:85fc843a9d7d | 53 | |
walterluu | 3:85fc843a9d7d | 54 | #else |
walterluu | 3:85fc843a9d7d | 55 | #error "Please define a modem in the compiler options." |
walterluu | 3:85fc843a9d7d | 56 | #endif |
walterluu | 3:85fc843a9d7d | 57 | |
walterluu | 3:85fc843a9d7d | 58 | |
walterluu | 3:85fc843a9d7d | 59 | #define RX_TIMEOUT_VALUE 3500 // in ms |
walterluu | 3:85fc843a9d7d | 60 | //#define RX_TIMEOUT_VALUE 333 // in ms |
walterluu | 3:85fc843a9d7d | 61 | |
walterluu | 3:85fc843a9d7d | 62 | //#define BUFFER_SIZE 32 // Define the payload size here |
walterluu | 3:85fc843a9d7d | 63 | //#define BUFFER_SIZE 64 // Define the payload size here |
walterluu | 3:85fc843a9d7d | 64 | |
walterluu | 3:85fc843a9d7d | 65 | |
walterluu | 3:85fc843a9d7d | 66 | /* |
walterluu | 3:85fc843a9d7d | 67 | * Global variables declarations |
walterluu | 3:85fc843a9d7d | 68 | */ |
walterluu | 3:85fc843a9d7d | 69 | typedef enum |
walterluu | 3:85fc843a9d7d | 70 | { |
walterluu | 3:85fc843a9d7d | 71 | LOWPOWER = 0, |
walterluu | 3:85fc843a9d7d | 72 | IDLE, |
walterluu | 3:85fc843a9d7d | 73 | |
walterluu | 3:85fc843a9d7d | 74 | RX, |
walterluu | 3:85fc843a9d7d | 75 | RX_TIMEOUT, |
walterluu | 3:85fc843a9d7d | 76 | RX_ERROR, |
walterluu | 3:85fc843a9d7d | 77 | |
walterluu | 3:85fc843a9d7d | 78 | TX, |
walterluu | 3:85fc843a9d7d | 79 | TX_TIMEOUT, |
walterluu | 3:85fc843a9d7d | 80 | |
walterluu | 3:85fc843a9d7d | 81 | CAD, |
walterluu | 3:85fc843a9d7d | 82 | CAD_DONE |
walterluu | 3:85fc843a9d7d | 83 | } AppStates_t; |
walterluu | 3:85fc843a9d7d | 84 | |
walterluu | 3:85fc843a9d7d | 85 | volatile AppStates_t State = LOWPOWER; |
walterluu | 3:85fc843a9d7d | 86 | |
walterluu | 3:85fc843a9d7d | 87 | /*! |
walterluu | 3:85fc843a9d7d | 88 | * Radio events function pointer |
walterluu | 3:85fc843a9d7d | 89 | */ |
walterluu | 3:85fc843a9d7d | 90 | static RadioEvents_t RadioEvents; |
walterluu | 3:85fc843a9d7d | 91 | |
walterluu | 3:85fc843a9d7d | 92 | /* |
walterluu | 3:85fc843a9d7d | 93 | * Global variables declarations |
walterluu | 3:85fc843a9d7d | 94 | */ |
walterluu | 3:85fc843a9d7d | 95 | SX1276Generic *Radio; |
walterluu | 3:85fc843a9d7d | 96 | |
walterluu | 3:85fc843a9d7d | 97 | |
walterluu | 3:85fc843a9d7d | 98 | //const uint8_t PingMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'I', 'N', 'G'};// "PING"; |
walterluu | 3:85fc843a9d7d | 99 | //const uint8_t PongMsg[] = { 0xff, 0xff, 0x00, 0x00, 'P', 'O', 'N', 'G'};// "PONG"; |
walterluu | 3:85fc843a9d7d | 100 | |
walterluu | 3:85fc843a9d7d | 101 | //uint16_t BufferSize = BUFFER_SIZE; |
walterluu | 3:85fc843a9d7d | 102 | //uint8_t *Buffer; |
walterluu | 3:85fc843a9d7d | 103 | |
walterluu | 3:85fc843a9d7d | 104 | // Aliases for the buffers that are made in the main() |
walterluu | 3:85fc843a9d7d | 105 | uint8_t *BufferTx; |
walterluu | 3:85fc843a9d7d | 106 | uint8_t *BufferRx; |
walterluu | 3:85fc843a9d7d | 107 | USBSerial *ad; |
walterluu | 3:85fc843a9d7d | 108 | |
walterluu | 3:85fc843a9d7d | 109 | DigitalOut *led3; |
walterluu | 3:85fc843a9d7d | 110 | |
walterluu | 3:85fc843a9d7d | 111 | |
walterluu | 3:85fc843a9d7d | 112 | /* |
walterluu | 3:85fc843a9d7d | 113 | This function is in Devin's main function |
walterluu | 3:85fc843a9d7d | 114 | |
walterluu | 3:85fc843a9d7d | 115 | */ |
walterluu | 3:85fc843a9d7d | 116 | int SX1276PingPongSetup(uint8_t *BufferTxFromMain, uint8_t *BufferRxFromMain, USBSerial *_ad) |
walterluu | 3:85fc843a9d7d | 117 | { |
walterluu | 3:85fc843a9d7d | 118 | ad = _ad; |
walterluu | 3:85fc843a9d7d | 119 | |
walterluu | 3:85fc843a9d7d | 120 | ad->printf("TEST\r\n" ); |
walterluu | 3:85fc843a9d7d | 121 | |
walterluu | 3:85fc843a9d7d | 122 | #if( defined ( TARGET_KL25Z ) || defined ( TARGET_Lad11U6X ) ) |
walterluu | 3:85fc843a9d7d | 123 | DigitalOut *led = new DigitalOut(LED2); |
walterluu | 3:85fc843a9d7d | 124 | #elif defined(TARGET_NUCLEO_L073RZ) || defined(TARGET_DISCO_L072CZ_LRWAN1) |
walterluu | 3:85fc843a9d7d | 125 | DigitalOut *led = new DigitalOut(LED4); // RX red |
walterluu | 3:85fc843a9d7d | 126 | led3 = new DigitalOut(LED3); // TX blue |
walterluu | 3:85fc843a9d7d | 127 | #else |
walterluu | 3:85fc843a9d7d | 128 | DigitalOut *led = new DigitalOut(LED1); |
walterluu | 3:85fc843a9d7d | 129 | // led = 0; |
walterluu | 3:85fc843a9d7d | 130 | led3 = led; |
walterluu | 3:85fc843a9d7d | 131 | #endif |
walterluu | 3:85fc843a9d7d | 132 | |
walterluu | 3:85fc843a9d7d | 133 | BufferTx = BufferTxFromMain; |
walterluu | 3:85fc843a9d7d | 134 | BufferRx = BufferRxFromMain; |
walterluu | 3:85fc843a9d7d | 135 | *led3 = 0; // change to 0 |
walterluu | 3:85fc843a9d7d | 136 | |
walterluu | 3:85fc843a9d7d | 137 | #ifdef B_L072Z_LRWAN1_LORA |
walterluu | 3:85fc843a9d7d | 138 | Radio = new SX1276Generic(NULL, MURATA_SX1276, |
walterluu | 3:85fc843a9d7d | 139 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
walterluu | 3:85fc843a9d7d | 140 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5, |
walterluu | 3:85fc843a9d7d | 141 | LORA_ANT_RX, LORA_ANT_TX, LORA_ANT_BOOST, LORA_TCXO); |
walterluu | 3:85fc843a9d7d | 142 | #else // RFM95 |
walterluu | 3:85fc843a9d7d | 143 | Radio = new SX1276Generic(NULL, RFM95_SX1276, |
walterluu | 3:85fc843a9d7d | 144 | LORA_SPI_MOSI, LORA_SPI_MISO, LORA_SPI_SCLK, LORA_CS, LORA_RESET, |
walterluu | 3:85fc843a9d7d | 145 | LORA_DIO0, LORA_DIO1, LORA_DIO2, LORA_DIO3, LORA_DIO4, LORA_DIO5); |
walterluu | 3:85fc843a9d7d | 146 | |
walterluu | 3:85fc843a9d7d | 147 | #endif |
walterluu | 3:85fc843a9d7d | 148 | |
walterluu | 3:85fc843a9d7d | 149 | // dprintf("SX1276 Ping Pong Demo Application" ); |
walterluu | 3:85fc843a9d7d | 150 | ad->printf("SX1276 Ping Pong Demo Application\r\n"); |
walterluu | 3:85fc843a9d7d | 151 | // dprintf("Freqency: %.1f", (double)RF_FREQUENCY/1000000.0); |
walterluu | 3:85fc843a9d7d | 152 | ad->printf("Freqency: %.1f\r\n", (double)RF_FREQUENCY/1000000.0); |
walterluu | 3:85fc843a9d7d | 153 | // dprintf("TXPower: %d dBm", TX_OUTPUT_POWER); |
walterluu | 3:85fc843a9d7d | 154 | ad->printf("TXPower: %d dBm\r\n", TX_OUTPUT_POWER); |
walterluu | 3:85fc843a9d7d | 155 | #if USE_MODEM_LORA == 1 |
walterluu | 3:85fc843a9d7d | 156 | // dprintf("Bandwidth: %d Hz", LORA_BANDWIDTH); |
walterluu | 3:85fc843a9d7d | 157 | ad->printf("Bandwidth: %d Hz\r\n", LORA_BANDWIDTH); |
walterluu | 3:85fc843a9d7d | 158 | // dprintf("Spreading factor: SF%d", LORA_SPREADING_FACTOR); |
walterluu | 3:85fc843a9d7d | 159 | ad->printf("Spreading factor: SF%d\r\n", LORA_SPREADING_FACTOR); |
walterluu | 3:85fc843a9d7d | 160 | #elif USE_MODEM_FSK == 1 |
walterluu | 3:85fc843a9d7d | 161 | // dprintf("Bandwidth: %d kHz", FSK_BANDWIDTH); |
walterluu | 3:85fc843a9d7d | 162 | ad->printf("Bandwidth: %d kHz\r\n", FSK_BANDWIDTH); |
walterluu | 3:85fc843a9d7d | 163 | // dprintf("Baudrate: %d", FSK_DATARATE); |
walterluu | 3:85fc843a9d7d | 164 | ad->printf("Baudrate: %d\r\n", FSK_DATARATE); |
walterluu | 3:85fc843a9d7d | 165 | #endif |
walterluu | 3:85fc843a9d7d | 166 | // Initialize Radio driver |
walterluu | 3:85fc843a9d7d | 167 | RadioEvents.TxDone = OnTxDone; |
walterluu | 3:85fc843a9d7d | 168 | RadioEvents.RxDone = OnRxDone; |
walterluu | 3:85fc843a9d7d | 169 | RadioEvents.RxError = OnRxError; |
walterluu | 3:85fc843a9d7d | 170 | RadioEvents.TxTimeout = OnTxTimeout; |
walterluu | 3:85fc843a9d7d | 171 | RadioEvents.RxTimeout = OnRxTimeout; |
walterluu | 3:85fc843a9d7d | 172 | if (Radio->Init( &RadioEvents ) == false) { |
walterluu | 3:85fc843a9d7d | 173 | while(1) { |
walterluu | 3:85fc843a9d7d | 174 | // dprintf("Radio could not be detected!"); |
walterluu | 3:85fc843a9d7d | 175 | ad->printf("Radio could not be detected!\r\n"); |
walterluu | 3:85fc843a9d7d | 176 | wait( 1 ); |
walterluu | 3:85fc843a9d7d | 177 | } |
walterluu | 3:85fc843a9d7d | 178 | } |
walterluu | 3:85fc843a9d7d | 179 | |
walterluu | 3:85fc843a9d7d | 180 | |
walterluu | 3:85fc843a9d7d | 181 | switch(Radio->DetectBoardType()) { |
walterluu | 3:85fc843a9d7d | 182 | case SX1276MB1LAS: |
walterluu | 3:85fc843a9d7d | 183 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 184 | ad->printf(" > Board Type: SX1276MB1LAS <\r\n"); |
walterluu | 3:85fc843a9d7d | 185 | break; |
walterluu | 3:85fc843a9d7d | 186 | case SX1276MB1MAS: |
walterluu | 3:85fc843a9d7d | 187 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 188 | ad->printf(" > Board Type: SX1276MB1LAS <\r\n"); |
walterluu | 3:85fc843a9d7d | 189 | case MURATA_SX1276: |
walterluu | 3:85fc843a9d7d | 190 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 191 | ad->printf(" > Board Type: MURATA_SX1276_STM32L0 <\r\n"); |
walterluu | 3:85fc843a9d7d | 192 | break; |
walterluu | 3:85fc843a9d7d | 193 | case RFM95_SX1276: |
walterluu | 3:85fc843a9d7d | 194 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 195 | ad->printf(" > HopeRF RFM95xx <\r\n"); |
walterluu | 3:85fc843a9d7d | 196 | break; |
walterluu | 3:85fc843a9d7d | 197 | default: |
walterluu | 3:85fc843a9d7d | 198 | ad->printf(" > Board Type: unknown <\r\n"); |
walterluu | 3:85fc843a9d7d | 199 | } |
walterluu | 3:85fc843a9d7d | 200 | |
walterluu | 3:85fc843a9d7d | 201 | Radio->SetChannel(RF_FREQUENCY ); |
walterluu | 3:85fc843a9d7d | 202 | |
walterluu | 3:85fc843a9d7d | 203 | #if USE_MODEM_LORA == 1 |
walterluu | 3:85fc843a9d7d | 204 | |
walterluu | 3:85fc843a9d7d | 205 | if (LORA_FHSS_ENABLED) |
walterluu | 3:85fc843a9d7d | 206 | ad->printf(" > LORA FHSS Mode <\r\n"); |
walterluu | 3:85fc843a9d7d | 207 | if (!LORA_FHSS_ENABLED) |
walterluu | 3:85fc843a9d7d | 208 | ad->printf(" > LORA Mode <\r\n"); |
walterluu | 3:85fc843a9d7d | 209 | |
walterluu | 3:85fc843a9d7d | 210 | |
walterluu | 3:85fc843a9d7d | 211 | // Without this line, the default max payload length is only 64 bytes |
walterluu | 3:85fc843a9d7d | 212 | Radio->SetMaxPayloadLength(MODEM_LORA, 255); |
walterluu | 3:85fc843a9d7d | 213 | |
walterluu | 3:85fc843a9d7d | 214 | Radio->SetTxConfig( MODEM_LORA, TX_OUTPUT_POWER, 0, LORA_BANDWIDTH, |
walterluu | 3:85fc843a9d7d | 215 | LORA_SPREADING_FACTOR, LORA_CODINGRATE, |
walterluu | 3:85fc843a9d7d | 216 | LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, |
walterluu | 3:85fc843a9d7d | 217 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
walterluu | 3:85fc843a9d7d | 218 | LORA_IQ_INVERSION_ON, 2000 ); |
walterluu | 3:85fc843a9d7d | 219 | |
walterluu | 3:85fc843a9d7d | 220 | Radio->SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, |
walterluu | 3:85fc843a9d7d | 221 | LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, |
walterluu | 3:85fc843a9d7d | 222 | LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, |
walterluu | 3:85fc843a9d7d | 223 | LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, |
walterluu | 3:85fc843a9d7d | 224 | LORA_IQ_INVERSION_ON, true ); |
walterluu | 3:85fc843a9d7d | 225 | |
walterluu | 3:85fc843a9d7d | 226 | #elif USE_MODEM_FSK == 1 |
walterluu | 3:85fc843a9d7d | 227 | |
walterluu | 3:85fc843a9d7d | 228 | ad->printf(" > FSK Mode <\n"); |
walterluu | 3:85fc843a9d7d | 229 | Radio->SetTxConfig( MODEM_FSK, TX_OUTPUT_POWER, FSK_FDEV, 0, |
walterluu | 3:85fc843a9d7d | 230 | FSK_DATARATE, 0, |
walterluu | 3:85fc843a9d7d | 231 | FSK_PREAMBLE_LENGTH, FSK_FIX_LENGTH_PAYLOAD_ON, |
walterluu | 3:85fc843a9d7d | 232 | FSK_CRC_ENABLED, 0, 0, 0, 2000 ); |
walterluu | 3:85fc843a9d7d | 233 | |
walterluu | 3:85fc843a9d7d | 234 | Radio->SetRxConfig( MODEM_FSK, FSK_BANDWIDTH, FSK_DATARATE, |
walterluu | 3:85fc843a9d7d | 235 | 0, FSK_AFC_BANDWIDTH, FSK_PREAMBLE_LENGTH, |
walterluu | 3:85fc843a9d7d | 236 | 0, FSK_FIX_LENGTH_PAYLOAD_ON, 0, FSK_CRC_ENABLED, |
walterluu | 3:85fc843a9d7d | 237 | 0, 0, false, true ); |
walterluu | 3:85fc843a9d7d | 238 | |
walterluu | 3:85fc843a9d7d | 239 | #else |
walterluu | 3:85fc843a9d7d | 240 | |
walterluu | 3:85fc843a9d7d | 241 | #error "Please define a modem in the compiler options." |
walterluu | 3:85fc843a9d7d | 242 | |
walterluu | 3:85fc843a9d7d | 243 | #endif |
walterluu | 3:85fc843a9d7d | 244 | |
walterluu | 3:85fc843a9d7d | 245 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 246 | ad->printf("Starting Ping-Pong loop\r\n"); |
walterluu | 3:85fc843a9d7d | 247 | |
walterluu | 3:85fc843a9d7d | 248 | |
walterluu | 3:85fc843a9d7d | 249 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 250 | return 0; //added by Walter due to "Control reaches end of non-void function" |
walterluu | 3:85fc843a9d7d | 251 | } |
walterluu | 3:85fc843a9d7d | 252 | |
walterluu | 3:85fc843a9d7d | 253 | /**************************************************************************************************************************************** |
walterluu | 3:85fc843a9d7d | 254 | * |
walterluu | 3:85fc843a9d7d | 255 | ****************************************************************************************************************************************/ |
walterluu | 3:85fc843a9d7d | 256 | int SX1276PingPong(void) |
walterluu | 3:85fc843a9d7d | 257 | { |
walterluu | 3:85fc843a9d7d | 258 | #if MASTER == 1 // Master Device: Bluetooth Gateway |
walterluu | 3:85fc843a9d7d | 259 | bool isMaster = true; |
walterluu | 3:85fc843a9d7d | 260 | #elif SLAVE == 1 // Slave Device: Robot |
walterluu | 3:85fc843a9d7d | 261 | bool isMaster = false; |
walterluu | 3:85fc843a9d7d | 262 | #endif |
walterluu | 3:85fc843a9d7d | 263 | |
walterluu | 3:85fc843a9d7d | 264 | switch( State ) |
walterluu | 3:85fc843a9d7d | 265 | { |
walterluu | 3:85fc843a9d7d | 266 | case RX: |
walterluu | 3:85fc843a9d7d | 267 | // *led3 = 0; // uncommented |
walterluu | 3:85fc843a9d7d | 268 | if( isMaster == true ) // Master Device received payload from Slave |
walterluu | 3:85fc843a9d7d | 269 | { |
walterluu | 3:85fc843a9d7d | 270 | if( BufferSizeRx > 0 ) |
walterluu | 3:85fc843a9d7d | 271 | { |
walterluu | 3:85fc843a9d7d | 272 | /* This checks if the ID of the received transaction is matching that of |
walterluu | 3:85fc843a9d7d | 273 | * the slave device's ID. This is defined in the GenericPingPong.h |
walterluu | 3:85fc843a9d7d | 274 | */ |
walterluu | 3:85fc843a9d7d | 275 | if( memcmp(&BufferRx[rx_idx_signature], PongMsg, sizeof(PongMsg)) == 0 ) |
walterluu | 3:85fc843a9d7d | 276 | { |
walterluu | 3:85fc843a9d7d | 277 | // *led = !*led; |
walterluu | 3:85fc843a9d7d | 278 | // *led = 0; // changed to 0 |
walterluu | 3:85fc843a9d7d | 279 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 280 | ad->printf( "...Pong\r\n" ); |
walterluu | 3:85fc843a9d7d | 281 | wait_ms( 10 ); |
walterluu | 3:85fc843a9d7d | 282 | Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 283 | } // memcmp != 0 |
walterluu | 3:85fc843a9d7d | 284 | else // valid reception but not a PONG message |
walterluu | 3:85fc843a9d7d | 285 | { // Set device as master and start again |
walterluu | 3:85fc843a9d7d | 286 | isMaster = true; // new update |
walterluu | 3:85fc843a9d7d | 287 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 288 | } // end of if memcmp |
walterluu | 3:85fc843a9d7d | 289 | } // end of if BufferSizeRx > 0 |
walterluu | 3:85fc843a9d7d | 290 | } // end of isMaster == true |
walterluu | 3:85fc843a9d7d | 291 | else // Slave Device received payload from Master |
walterluu | 3:85fc843a9d7d | 292 | { |
walterluu | 3:85fc843a9d7d | 293 | if( BufferSizeRx > 0 ) |
walterluu | 3:85fc843a9d7d | 294 | { |
walterluu | 3:85fc843a9d7d | 295 | if( memcmp(BufferRx, PingMsg, sizeof(PingMsg)) == 0 ) |
walterluu | 3:85fc843a9d7d | 296 | { |
walterluu | 3:85fc843a9d7d | 297 | // *led = !*led; |
walterluu | 3:85fc843a9d7d | 298 | // *led = 0 //changed to 0 |
walterluu | 3:85fc843a9d7d | 299 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 300 | ad->printf( "...Ping\r\n" ); |
walterluu | 3:85fc843a9d7d | 301 | wait_ms( 10 ); |
walterluu | 3:85fc843a9d7d | 302 | Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 303 | } |
walterluu | 3:85fc843a9d7d | 304 | else // valid reception but not a PING as expected |
walterluu | 3:85fc843a9d7d | 305 | { // Set device as slave and start again |
walterluu | 3:85fc843a9d7d | 306 | isMaster = false; // new update |
walterluu | 3:85fc843a9d7d | 307 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 308 | } |
walterluu | 3:85fc843a9d7d | 309 | } // end of if BufferSizeRx > 0 |
walterluu | 3:85fc843a9d7d | 310 | } // end of if (isMaster == True), end of checking devices |
walterluu | 3:85fc843a9d7d | 311 | |
walterluu | 3:85fc843a9d7d | 312 | State = LOWPOWER; // back to LOWPOWER State |
walterluu | 3:85fc843a9d7d | 313 | |
walterluu | 3:85fc843a9d7d | 314 | break; |
walterluu | 3:85fc843a9d7d | 315 | case TX: |
walterluu | 3:85fc843a9d7d | 316 | // *led3 = 0; // change to 0 |
walterluu | 3:85fc843a9d7d | 317 | if( isMaster == true ) // Master Device |
walterluu | 3:85fc843a9d7d | 318 | { |
walterluu | 3:85fc843a9d7d | 319 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 320 | ad->printf("Ping...\r\n" ); |
walterluu | 3:85fc843a9d7d | 321 | } |
walterluu | 3:85fc843a9d7d | 322 | else // Slave Device |
walterluu | 3:85fc843a9d7d | 323 | { |
walterluu | 3:85fc843a9d7d | 324 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 325 | ad->printf("Pong...\r\n" ); |
walterluu | 3:85fc843a9d7d | 326 | } |
walterluu | 3:85fc843a9d7d | 327 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 328 | State = LOWPOWER; // back to LOWPOWER State |
walterluu | 3:85fc843a9d7d | 329 | break; |
walterluu | 3:85fc843a9d7d | 330 | case RX_TIMEOUT: |
walterluu | 3:85fc843a9d7d | 331 | if( isMaster == true ) // Master Device |
walterluu | 3:85fc843a9d7d | 332 | { |
walterluu | 3:85fc843a9d7d | 333 | wait_ms( 10 ); |
walterluu | 3:85fc843a9d7d | 334 | Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 335 | } |
walterluu | 3:85fc843a9d7d | 336 | else // Slave Device |
walterluu | 3:85fc843a9d7d | 337 | { |
walterluu | 3:85fc843a9d7d | 338 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 339 | } |
walterluu | 3:85fc843a9d7d | 340 | State = LOWPOWER; // back to LOWPOWER State |
walterluu | 3:85fc843a9d7d | 341 | break; |
walterluu | 3:85fc843a9d7d | 342 | case RX_ERROR: |
walterluu | 3:85fc843a9d7d | 343 | // We have received a Packet with a CRC error, send reply as if packet was correct |
walterluu | 3:85fc843a9d7d | 344 | if( isMaster == true ) // Master Device |
walterluu | 3:85fc843a9d7d | 345 | { |
walterluu | 3:85fc843a9d7d | 346 | // Send the next PING frame |
walterluu | 3:85fc843a9d7d | 347 | // memcpy(BufferTx, PingMsg, sizeof(PingMsg)); |
walterluu | 3:85fc843a9d7d | 348 | /* |
walterluu | 3:85fc843a9d7d | 349 | for( i = 4; i < BufferSizeTx; i++ ) |
walterluu | 3:85fc843a9d7d | 350 | { |
walterluu | 3:85fc843a9d7d | 351 | BufferTx[i] = i - 4; |
walterluu | 3:85fc843a9d7d | 352 | } |
walterluu | 3:85fc843a9d7d | 353 | */ |
walterluu | 3:85fc843a9d7d | 354 | // fillPayloadWithGlobalBufs(BufferTx); |
walterluu | 3:85fc843a9d7d | 355 | wait_ms( 10 ); |
walterluu | 3:85fc843a9d7d | 356 | Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 357 | } |
walterluu | 3:85fc843a9d7d | 358 | else // Slave Device |
walterluu | 3:85fc843a9d7d | 359 | { |
walterluu | 3:85fc843a9d7d | 360 | // Send the next PONG frame |
walterluu | 3:85fc843a9d7d | 361 | // memcpy(BufferTx, PongMsg, sizeof(PongMsg)); |
walterluu | 3:85fc843a9d7d | 362 | /* |
walterluu | 3:85fc843a9d7d | 363 | for( i = sizeof(PongMsg); i < BufferSizeTx; i++ ) |
walterluu | 3:85fc843a9d7d | 364 | { |
walterluu | 3:85fc843a9d7d | 365 | BufferTx[i] = i - sizeof(PongMsg); |
walterluu | 3:85fc843a9d7d | 366 | } |
walterluu | 3:85fc843a9d7d | 367 | */ |
walterluu | 3:85fc843a9d7d | 368 | wait_ms( 10 ); |
walterluu | 3:85fc843a9d7d | 369 | Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 370 | } |
walterluu | 3:85fc843a9d7d | 371 | State = LOWPOWER; // Back to Low Power State |
walterluu | 3:85fc843a9d7d | 372 | break; |
walterluu | 3:85fc843a9d7d | 373 | case TX_TIMEOUT: |
walterluu | 3:85fc843a9d7d | 374 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 375 | State = LOWPOWER; |
walterluu | 3:85fc843a9d7d | 376 | break; |
walterluu | 3:85fc843a9d7d | 377 | case LOWPOWER: |
walterluu | 3:85fc843a9d7d | 378 | sleep(); |
walterluu | 3:85fc843a9d7d | 379 | break; |
walterluu | 3:85fc843a9d7d | 380 | default: |
walterluu | 3:85fc843a9d7d | 381 | State = LOWPOWER; |
walterluu | 3:85fc843a9d7d | 382 | break; |
walterluu | 3:85fc843a9d7d | 383 | } |
walterluu | 3:85fc843a9d7d | 384 | } |
walterluu | 3:85fc843a9d7d | 385 | |
walterluu | 3:85fc843a9d7d | 386 | |
walterluu | 3:85fc843a9d7d | 387 | int TimeOnAirSend(void) { |
walterluu | 3:85fc843a9d7d | 388 | |
walterluu | 3:85fc843a9d7d | 389 | return Radio->TimeOnAir( MODEM_LORA, sizeof(BufferSizeTx)); |
walterluu | 3:85fc843a9d7d | 390 | |
walterluu | 3:85fc843a9d7d | 391 | } |
walterluu | 3:85fc843a9d7d | 392 | |
walterluu | 3:85fc843a9d7d | 393 | |
walterluu | 3:85fc843a9d7d | 394 | int SX1276SensorSend(void) { |
walterluu | 3:85fc843a9d7d | 395 | |
walterluu | 3:85fc843a9d7d | 396 | switch( State ) |
walterluu | 3:85fc843a9d7d | 397 | { |
walterluu | 3:85fc843a9d7d | 398 | case RX: |
walterluu | 3:85fc843a9d7d | 399 | // if( BufferSizeRx > 0 ) |
walterluu | 3:85fc843a9d7d | 400 | // { |
walterluu | 3:85fc843a9d7d | 401 | // Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 402 | // Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 403 | // } // end of if BufferSizeRx > 0 |
walterluu | 3:85fc843a9d7d | 404 | |
walterluu | 3:85fc843a9d7d | 405 | Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 406 | Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 407 | |
walterluu | 3:85fc843a9d7d | 408 | State = LOWPOWER; // back to LOWPOWER State |
walterluu | 3:85fc843a9d7d | 409 | |
walterluu | 3:85fc843a9d7d | 410 | break; |
walterluu | 3:85fc843a9d7d | 411 | } // end of switch statement |
walterluu | 3:85fc843a9d7d | 412 | } |
walterluu | 3:85fc843a9d7d | 413 | |
walterluu | 3:85fc843a9d7d | 414 | |
walterluu | 3:85fc843a9d7d | 415 | |
walterluu | 3:85fc843a9d7d | 416 | int SX1276GateWayReceive(int TimeOut) { |
walterluu | 3:85fc843a9d7d | 417 | |
walterluu | 3:85fc843a9d7d | 418 | switch( State ) |
walterluu | 3:85fc843a9d7d | 419 | { |
walterluu | 3:85fc843a9d7d | 420 | case RX: |
walterluu | 3:85fc843a9d7d | 421 | // if( BufferSizeRx > 0 ) |
walterluu | 3:85fc843a9d7d | 422 | // { |
walterluu | 3:85fc843a9d7d | 423 | //// Radio->Send( BufferTx, BufferSizeTx ); |
walterluu | 3:85fc843a9d7d | 424 | // Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 425 | // } // end of if BufferSizeRx > 0 |
walterluu | 3:85fc843a9d7d | 426 | |
walterluu | 3:85fc843a9d7d | 427 | |
walterluu | 3:85fc843a9d7d | 428 | // Radio->Rx( RX_TIMEOUT_VALUE ); |
walterluu | 3:85fc843a9d7d | 429 | |
walterluu | 3:85fc843a9d7d | 430 | Radio->Rx( TimeOut ); |
walterluu | 3:85fc843a9d7d | 431 | |
walterluu | 3:85fc843a9d7d | 432 | State = LOWPOWER; // back to LOWPOWER State |
walterluu | 3:85fc843a9d7d | 433 | |
walterluu | 3:85fc843a9d7d | 434 | break; |
walterluu | 3:85fc843a9d7d | 435 | } // end of switch statement |
walterluu | 3:85fc843a9d7d | 436 | } |
walterluu | 3:85fc843a9d7d | 437 | |
walterluu | 3:85fc843a9d7d | 438 | |
walterluu | 3:85fc843a9d7d | 439 | |
walterluu | 3:85fc843a9d7d | 440 | |
walterluu | 3:85fc843a9d7d | 441 | //void OnTxDone(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 442 | //{ |
walterluu | 3:85fc843a9d7d | 443 | // Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 444 | // State = TX; |
walterluu | 3:85fc843a9d7d | 445 | // if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 446 | // dprintf("> OnTxDone"); |
walterluu | 3:85fc843a9d7d | 447 | //} |
walterluu | 3:85fc843a9d7d | 448 | |
walterluu | 3:85fc843a9d7d | 449 | // moved to main |
walterluu | 3:85fc843a9d7d | 450 | void OnTxDone(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 451 | { |
walterluu | 3:85fc843a9d7d | 452 | Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 453 | State = TX; |
walterluu | 3:85fc843a9d7d | 454 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 455 | //dprintf("> OnTxDone"); |
walterluu | 3:85fc843a9d7d | 456 | ad->printf("> OnTxDone"); |
walterluu | 3:85fc843a9d7d | 457 | } |
walterluu | 3:85fc843a9d7d | 458 | |
walterluu | 3:85fc843a9d7d | 459 | |
walterluu | 3:85fc843a9d7d | 460 | //void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
walterluu | 3:85fc843a9d7d | 461 | //{ |
walterluu | 3:85fc843a9d7d | 462 | // Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 463 | // BufferSize = size; |
walterluu | 3:85fc843a9d7d | 464 | // memcpy( Buffer, payload, BufferSize ); |
walterluu | 3:85fc843a9d7d | 465 | // State = RX; |
walterluu | 3:85fc843a9d7d | 466 | // if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 467 | // dprintf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d", rssi, snr); |
walterluu | 3:85fc843a9d7d | 468 | // dump("Data:", payload, size); |
walterluu | 3:85fc843a9d7d | 469 | //} |
walterluu | 3:85fc843a9d7d | 470 | |
walterluu | 3:85fc843a9d7d | 471 | // moved to main |
walterluu | 3:85fc843a9d7d | 472 | void OnRxDone(void *radio, void *userThisPtr, void *userData, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) |
walterluu | 3:85fc843a9d7d | 473 | { |
walterluu | 3:85fc843a9d7d | 474 | Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 475 | |
walterluu | 3:85fc843a9d7d | 476 | if(BufferSizeRx != size) |
walterluu | 3:85fc843a9d7d | 477 | memcpy( BufferRx, payload, size ); |
walterluu | 3:85fc843a9d7d | 478 | else |
walterluu | 3:85fc843a9d7d | 479 | memcpy( BufferRx, payload, BufferSizeRx ); |
walterluu | 3:85fc843a9d7d | 480 | State = RX; |
walterluu | 3:85fc843a9d7d | 481 | |
walterluu | 3:85fc843a9d7d | 482 | // Reset the RxTimeoutCount |
walterluu | 3:85fc843a9d7d | 483 | RxTimeoutCount = 0; |
walterluu | 3:85fc843a9d7d | 484 | |
walterluu | 3:85fc843a9d7d | 485 | if (DEBUG_MESSAGE) { |
walterluu | 3:85fc843a9d7d | 486 | ad->printf("> OnRxDone: RssiValue=%d dBm, SnrValue=%d\n", rssi, snr); |
walterluu | 3:85fc843a9d7d | 487 | dump("Data:", payload, size); |
walterluu | 3:85fc843a9d7d | 488 | } |
walterluu | 3:85fc843a9d7d | 489 | } |
walterluu | 3:85fc843a9d7d | 490 | |
walterluu | 3:85fc843a9d7d | 491 | //void OnTxTimeout(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 492 | //{ |
walterluu | 3:85fc843a9d7d | 493 | // *led3 = 0; |
walterluu | 3:85fc843a9d7d | 494 | // Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 495 | // State = TX_TIMEOUT; |
walterluu | 3:85fc843a9d7d | 496 | // if(DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 497 | // dprintf("> OnTxTimeout"); |
walterluu | 3:85fc843a9d7d | 498 | //} |
walterluu | 3:85fc843a9d7d | 499 | |
walterluu | 3:85fc843a9d7d | 500 | // moved to main |
walterluu | 3:85fc843a9d7d | 501 | void OnTxTimeout(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 502 | { |
walterluu | 3:85fc843a9d7d | 503 | // *led3 = 0; |
walterluu | 3:85fc843a9d7d | 504 | Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 505 | State = TX_TIMEOUT; |
walterluu | 3:85fc843a9d7d | 506 | if(DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 507 | ad->printf("> OnTxTimeout"); |
walterluu | 3:85fc843a9d7d | 508 | } |
walterluu | 3:85fc843a9d7d | 509 | |
walterluu | 3:85fc843a9d7d | 510 | //void OnRxTimeout(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 511 | //{ |
walterluu | 3:85fc843a9d7d | 512 | // *led3 = 0; |
walterluu | 3:85fc843a9d7d | 513 | // Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 514 | // Buffer[BufferSize-1] = 0; |
walterluu | 3:85fc843a9d7d | 515 | // State = RX_TIMEOUT; |
walterluu | 3:85fc843a9d7d | 516 | // if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 517 | // dprintf("> OnRxTimeout"); |
walterluu | 3:85fc843a9d7d | 518 | //} |
walterluu | 3:85fc843a9d7d | 519 | |
walterluu | 3:85fc843a9d7d | 520 | // moved to main |
walterluu | 3:85fc843a9d7d | 521 | void OnRxTimeout(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 522 | { |
walterluu | 3:85fc843a9d7d | 523 | Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 524 | BufferRx[BufferSizeRx-1] = 0; |
walterluu | 3:85fc843a9d7d | 525 | State = RX_TIMEOUT; |
walterluu | 3:85fc843a9d7d | 526 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 527 | ad->printf("> OnRxTimeout\n"); |
walterluu | 3:85fc843a9d7d | 528 | |
walterluu | 3:85fc843a9d7d | 529 | // Increment how many times a transmission times out\ |
walterluu | 3:85fc843a9d7d | 530 | RxTimeoutCount = RxTimeoutCount + 1; |
walterluu | 3:85fc843a9d7d | 531 | } |
walterluu | 3:85fc843a9d7d | 532 | |
walterluu | 3:85fc843a9d7d | 533 | //void OnRxError(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 534 | //{ |
walterluu | 3:85fc843a9d7d | 535 | // Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 536 | // State = RX_ERROR; |
walterluu | 3:85fc843a9d7d | 537 | // if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 538 | // dprintf("> OnRxError"); |
walterluu | 3:85fc843a9d7d | 539 | //} |
walterluu | 3:85fc843a9d7d | 540 | |
walterluu | 3:85fc843a9d7d | 541 | // moved to main |
walterluu | 3:85fc843a9d7d | 542 | void OnRxError(void *radio, void *userThisPtr, void *userData) |
walterluu | 3:85fc843a9d7d | 543 | { |
walterluu | 3:85fc843a9d7d | 544 | Radio->Sleep( ); |
walterluu | 3:85fc843a9d7d | 545 | State = RX_ERROR; |
walterluu | 3:85fc843a9d7d | 546 | if (DEBUG_MESSAGE) |
walterluu | 3:85fc843a9d7d | 547 | ad->printf("> OnRxError\n"); |
walterluu | 3:85fc843a9d7d | 548 | |
walterluu | 3:85fc843a9d7d | 549 | // Increment how many times a transmission times out\ |
walterluu | 3:85fc843a9d7d | 550 | RxTimeoutCount = RxTimeoutCount + 1; |
walterluu | 3:85fc843a9d7d | 551 | } |
walterluu | 3:85fc843a9d7d | 552 | |
walterluu | 3:85fc843a9d7d | 553 | |
walterluu | 3:85fc843a9d7d | 554 | int numOfRxTimeouts() |
walterluu | 3:85fc843a9d7d | 555 | { |
walterluu | 3:85fc843a9d7d | 556 | return RxTimeoutCount; |
walterluu | 3:85fc843a9d7d | 557 | } |
walterluu | 3:85fc843a9d7d | 558 | |
walterluu | 3:85fc843a9d7d | 559 | |
walterluu | 3:85fc843a9d7d | 560 | #endif |