Basic MAC data interface for LoRa transceiver

Dependencies:   L2Frame crc

Dependents:   LoRaBaseStation LoRaTerminal

Committer:
rba90
Date:
Thu Aug 11 02:37:30 2016 +0000
Revision:
17:c6e2e2cd6e5f
Parent:
15:0dc9df48687a
Child:
18:3e6483550f25
add sequence id for each devices; hide more detail from users; rename getDeviceId() to getDeviceID()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rba90 0:e2ccabf3f30c 1 #include "AlohaTransceiver.h"
rba90 0:e2ccabf3f30c 2 #include "mbed.h"
rba90 0:e2ccabf3f30c 3 #include "radio.h"
rba90 0:e2ccabf3f30c 4 #include "AlohaFrame.h"
rba90 15:0dc9df48687a 5 #include "RingBuffer.h"
rba90 0:e2ccabf3f30c 6
rba90 0:e2ccabf3f30c 7 // declear the type of radio state
rba90 0:e2ccabf3f30c 8 typedef enum
rba90 0:e2ccabf3f30c 9 {
rba90 0:e2ccabf3f30c 10 LOWPOWER = 0,
rba90 0:e2ccabf3f30c 11 IDLE,
rba90 0:e2ccabf3f30c 12
rba90 0:e2ccabf3f30c 13 RX,
rba90 0:e2ccabf3f30c 14 RX_TIMEOUT,
rba90 0:e2ccabf3f30c 15 RX_ERROR,
rba90 0:e2ccabf3f30c 16
rba90 0:e2ccabf3f30c 17 TX,
rba90 0:e2ccabf3f30c 18 TX_TIMEOUT,
rba90 0:e2ccabf3f30c 19
rba90 0:e2ccabf3f30c 20 CAD,
rba90 0:e2ccabf3f30c 21 CAD_DONE
rba90 0:e2ccabf3f30c 22 }AppStates_t;
rba90 0:e2ccabf3f30c 23
rba90 0:e2ccabf3f30c 24 // radio driver related variables
rba90 0:e2ccabf3f30c 25 static uint16_t BufferSize;
rba90 0:e2ccabf3f30c 26 static uint8_t Buffer[BUFFER_SIZE];
rba90 0:e2ccabf3f30c 27
rba90 0:e2ccabf3f30c 28 static int16_t RssiValue;
rba90 0:e2ccabf3f30c 29 static int8_t SnrValue;
rba90 0:e2ccabf3f30c 30
rba90 0:e2ccabf3f30c 31 static volatile AppStates_t State;
rba90 0:e2ccabf3f30c 32 static RadioEvents_t RadioEvents;
rba90 0:e2ccabf3f30c 33
rba90 17:c6e2e2cd6e5f 34
rba90 17:c6e2e2cd6e5f 35
rba90 0:e2ccabf3f30c 36 // callback functions for radio driver
rba90 0:e2ccabf3f30c 37 void OnTxDone();
rba90 0:e2ccabf3f30c 38 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
rba90 0:e2ccabf3f30c 39 void OnTxTimeout();
rba90 0:e2ccabf3f30c 40 void OnRxTimeout();
rba90 0:e2ccabf3f30c 41 void OnRxError();
rba90 0:e2ccabf3f30c 42 void OnFhssChangeChannel( uint8_t channelIndex );
rba90 0:e2ccabf3f30c 43 void OnCadDone();
rba90 0:e2ccabf3f30c 44
rba90 0:e2ccabf3f30c 45 // radio driver
rba90 0:e2ccabf3f30c 46 #ifdef BUILD_FOR_BS
rba90 0:e2ccabf3f30c 47 SX1276MB1xAS Radio( NULL );
rba90 0:e2ccabf3f30c 48 #endif
rba90 0:e2ccabf3f30c 49
rba90 0:e2ccabf3f30c 50 #ifdef BUILD_FOR_TERMINAL
rba90 0:e2ccabf3f30c 51 SX1276inAir Radio( NULL );
rba90 0:e2ccabf3f30c 52 #endif
rba90 0:e2ccabf3f30c 53
rba90 0:e2ccabf3f30c 54
rba90 0:e2ccabf3f30c 55 /*
rba90 0:e2ccabf3f30c 56 * Abstract interface for accessing radio driver
rba90 0:e2ccabf3f30c 57 */
rba90 0:e2ccabf3f30c 58
rba90 11:3e1ff29da71a 59 AlohaTransceiver::AlohaTransceiver(uint8_t id)
rba90 0:e2ccabf3f30c 60 {
rba90 11:3e1ff29da71a 61 // store unique device id
rba90 11:3e1ff29da71a 62 deviceId = id;
rba90 11:3e1ff29da71a 63
rba90 17:c6e2e2cd6e5f 64 // initialize sequenceid
rba90 17:c6e2e2cd6e5f 65 memset(seqid, 0x0, sizeof(seqid));
rba90 17:c6e2e2cd6e5f 66
rba90 0:e2ccabf3f30c 67 // configure properties
rba90 0:e2ccabf3f30c 68 #if USE_MODEM_LORA == 1
rba90 0:e2ccabf3f30c 69 Settings.Power = TX_OUTPUT_POWER;
rba90 0:e2ccabf3f30c 70 Settings.Bandwidth = LORA_BANDWIDTH;
rba90 0:e2ccabf3f30c 71 Settings.Datarate = LORA_SPREADING_FACTOR;
rba90 0:e2ccabf3f30c 72 Settings.Coderate = LORA_CODINGRATE;
rba90 0:e2ccabf3f30c 73 Settings.PreambleLen = LORA_PREAMBLE_LENGTH;
rba90 0:e2ccabf3f30c 74 Settings.SymbolTimeout = LORA_SYMBOL_TIMEOUT;
rba90 0:e2ccabf3f30c 75 Settings.FixLen = LORA_FIX_LENGTH_PAYLOAD_ON;
rba90 0:e2ccabf3f30c 76 Settings.PayloadLen = 0;
rba90 0:e2ccabf3f30c 77 Settings.CrcOn = LORA_CRC_ENABLED;
rba90 0:e2ccabf3f30c 78 Settings.FreqHopOn = LORA_FHSS_ENABLED;
rba90 0:e2ccabf3f30c 79 Settings.HopPeriod = LORA_NB_SYMB_HOP;
rba90 0:e2ccabf3f30c 80 Settings.IqInverted = LORA_IQ_INVERSION_ON;
rba90 0:e2ccabf3f30c 81 Settings.RxContinuous = true;
rba90 0:e2ccabf3f30c 82 Settings.TxTimeout = TX_TIMEOUT_VALUE;
rba90 0:e2ccabf3f30c 83
rba90 0:e2ccabf3f30c 84 #elif USE_MODEM_FSK == 1
rba90 0:e2ccabf3f30c 85 // TODO: Complete settings for FSK mode
rba90 0:e2ccabf3f30c 86 #error "FSK not implemented"
rba90 0:e2ccabf3f30c 87 #else
rba90 0:e2ccabf3f30c 88 #error "Please define a modem in the compiler options."
rba90 0:e2ccabf3f30c 89 #endif
rba90 0:e2ccabf3f30c 90 }
rba90 0:e2ccabf3f30c 91
rba90 0:e2ccabf3f30c 92 AlohaTransceiver::~AlohaTransceiver()
rba90 0:e2ccabf3f30c 93 {
rba90 0:e2ccabf3f30c 94
rba90 0:e2ccabf3f30c 95 }
rba90 0:e2ccabf3f30c 96
rba90 6:f545f5aa7de3 97 void AlohaTransceiver::boardInit()
rba90 0:e2ccabf3f30c 98 {
rba90 0:e2ccabf3f30c 99 // configure callback functions
rba90 0:e2ccabf3f30c 100 RadioEvents.TxDone = OnTxDone;
rba90 0:e2ccabf3f30c 101 RadioEvents.RxDone = OnRxDone;
rba90 0:e2ccabf3f30c 102 RadioEvents.RxError = OnRxError;
rba90 0:e2ccabf3f30c 103 RadioEvents.TxTimeout = OnTxTimeout;
rba90 0:e2ccabf3f30c 104 RadioEvents.RxTimeout = OnRxTimeout;
rba90 0:e2ccabf3f30c 105 Radio.Init( &RadioEvents );
rba90 0:e2ccabf3f30c 106
rba90 0:e2ccabf3f30c 107 // verify the connection with the board
rba90 0:e2ccabf3f30c 108 while( Radio.Read( REG_VERSION ) == 0x00 )
rba90 0:e2ccabf3f30c 109 {
rba90 0:e2ccabf3f30c 110 printf( "Radio could not be detected!\n\r" );
rba90 0:e2ccabf3f30c 111 wait( 1 );
rba90 0:e2ccabf3f30c 112 }
rba90 0:e2ccabf3f30c 113 printf("RadioRegVersion: %d\r\n", Radio.Read( REG_VERSION ));
rba90 0:e2ccabf3f30c 114 }
rba90 0:e2ccabf3f30c 115
rba90 0:e2ccabf3f30c 116 void AlohaTransceiver::updateSettings()
rba90 0:e2ccabf3f30c 117 {
rba90 6:f545f5aa7de3 118 Radio.SetChannel( RF_FREQUENCY );
rba90 0:e2ccabf3f30c 119 #if USE_MODEM_LORA == 1
rba90 0:e2ccabf3f30c 120
rba90 0:e2ccabf3f30c 121 Radio.SetTxConfig( MODEM_LORA, Settings.Power, 0, Settings.Bandwidth,
rba90 0:e2ccabf3f30c 122 Settings.Datarate, Settings.Coderate,
rba90 0:e2ccabf3f30c 123 Settings.PreambleLen, Settings.FixLen,
rba90 0:e2ccabf3f30c 124 Settings.CrcOn, Settings.FreqHopOn, Settings.HopPeriod,
rba90 0:e2ccabf3f30c 125 Settings.IqInverted, Settings.TxTimeout );
rba90 0:e2ccabf3f30c 126
rba90 0:e2ccabf3f30c 127 Radio.SetRxConfig( MODEM_LORA, Settings.Bandwidth, Settings.Datarate,
rba90 0:e2ccabf3f30c 128 Settings.Coderate, 0, Settings.PreambleLen,
rba90 0:e2ccabf3f30c 129 Settings.SymbolTimeout, Settings.FixLen, Settings.PayloadLen,
rba90 0:e2ccabf3f30c 130 Settings.CrcOn, Settings.FreqHopOn, Settings.HopPeriod,
rba90 0:e2ccabf3f30c 131 Settings.IqInverted, Settings.RxContinuous );
rba90 0:e2ccabf3f30c 132
rba90 0:e2ccabf3f30c 133 #elif USE_MODEM_FSK == 1
rba90 0:e2ccabf3f30c 134 #error "FSK not implemented"
rba90 0:e2ccabf3f30c 135 #else
rba90 0:e2ccabf3f30c 136 #error "Please define a modem in the compiler options."
rba90 0:e2ccabf3f30c 137 #endif
rba90 0:e2ccabf3f30c 138 }
rba90 0:e2ccabf3f30c 139
rba90 6:f545f5aa7de3 140 void AlohaTransceiver::enable()
rba90 6:f545f5aa7de3 141 {
rba90 6:f545f5aa7de3 142 // entering passive receiver mode
rba90 10:065a4b58c6ff 143 Radio.Rx( 0 );
rba90 6:f545f5aa7de3 144 }
rba90 6:f545f5aa7de3 145
rba90 0:e2ccabf3f30c 146 void AlohaTransceiver::poll()
rba90 0:e2ccabf3f30c 147 {
rba90 0:e2ccabf3f30c 148 switch( State )
rba90 0:e2ccabf3f30c 149 {
rba90 0:e2ccabf3f30c 150 case RX:
rba90 5:c3741633dc6f 151 {
rba90 0:e2ccabf3f30c 152 // create new frame instance
rba90 0:e2ccabf3f30c 153 AlohaFrame frame(Buffer, BufferSize);
rba90 0:e2ccabf3f30c 154
rba90 11:3e1ff29da71a 155 // check destination
rba90 11:3e1ff29da71a 156 // if the destination is the device id, then processing, otherwise drop the packet and continue
rba90 11:3e1ff29da71a 157 // listening
rba90 11:3e1ff29da71a 158 if (frame.getDestinationAddress() == (deviceId & 0x0f))
rba90 17:c6e2e2cd6e5f 159 {
rba90 17:c6e2e2cd6e5f 160 // currently we only have 1 payload per frame
rba90 17:c6e2e2cd6e5f 161 uint8_t payload_length = frame.getPayloadLength();
rba90 17:c6e2e2cd6e5f 162 uint8_t payload[payload_length];
rba90 17:c6e2e2cd6e5f 163 uint8_t src_addr = frame.getSourceAddress();
rba90 17:c6e2e2cd6e5f 164 uint8_t type = frame.getType();
rba90 17:c6e2e2cd6e5f 165
rba90 17:c6e2e2cd6e5f 166 // extract payload
rba90 17:c6e2e2cd6e5f 167 for (uint8_t i = 0; i < payload_length; i++)
rba90 17:c6e2e2cd6e5f 168 {
rba90 17:c6e2e2cd6e5f 169 payload[i] = frame.getPayload(i);
rba90 17:c6e2e2cd6e5f 170 }
rba90 17:c6e2e2cd6e5f 171
rba90 11:3e1ff29da71a 172 // check registered callback function
rba90 11:3e1ff29da71a 173 // execute callback functions if registered
rba90 17:c6e2e2cd6e5f 174
rba90 17:c6e2e2cd6e5f 175 if (AlohaTypeCallbackTable[type] != NULL)
rba90 11:3e1ff29da71a 176 {
rba90 17:c6e2e2cd6e5f 177 AlohaTypeCallbackTable[type](payload, payload_length, src_addr);
rba90 11:3e1ff29da71a 178 }
rba90 0:e2ccabf3f30c 179 }
rba90 0:e2ccabf3f30c 180
rba90 10:065a4b58c6ff 181 Radio.Rx( 0 );
rba90 0:e2ccabf3f30c 182 State = LOWPOWER;
rba90 0:e2ccabf3f30c 183 break;
rba90 0:e2ccabf3f30c 184 }
rba90 0:e2ccabf3f30c 185 case TX:
rba90 0:e2ccabf3f30c 186 {
rba90 10:065a4b58c6ff 187 Radio.Rx( 0 );
rba90 0:e2ccabf3f30c 188 State = LOWPOWER;
rba90 0:e2ccabf3f30c 189 break;
rba90 0:e2ccabf3f30c 190 }
rba90 0:e2ccabf3f30c 191 case RX_TIMEOUT:
rba90 0:e2ccabf3f30c 192 {
rba90 10:065a4b58c6ff 193 Radio.Rx( 0 );
rba90 0:e2ccabf3f30c 194 State = LOWPOWER;
rba90 0:e2ccabf3f30c 195 break;
rba90 0:e2ccabf3f30c 196 }
rba90 0:e2ccabf3f30c 197 case RX_ERROR:
rba90 0:e2ccabf3f30c 198 {
rba90 10:065a4b58c6ff 199 Radio.Rx( 0 );
rba90 0:e2ccabf3f30c 200 State = LOWPOWER;
rba90 0:e2ccabf3f30c 201 break;
rba90 0:e2ccabf3f30c 202 }
rba90 0:e2ccabf3f30c 203 case TX_TIMEOUT:
rba90 0:e2ccabf3f30c 204 {
rba90 10:065a4b58c6ff 205 Radio.Rx( 0 );
rba90 0:e2ccabf3f30c 206 State = LOWPOWER;
rba90 0:e2ccabf3f30c 207 break;
rba90 0:e2ccabf3f30c 208 }
rba90 0:e2ccabf3f30c 209 case LOWPOWER:
rba90 0:e2ccabf3f30c 210 {
rba90 0:e2ccabf3f30c 211 break;
rba90 0:e2ccabf3f30c 212 }
rba90 0:e2ccabf3f30c 213 default:
rba90 0:e2ccabf3f30c 214 {
rba90 0:e2ccabf3f30c 215 State = LOWPOWER;
rba90 0:e2ccabf3f30c 216 break;
rba90 0:e2ccabf3f30c 217 }
rba90 0:e2ccabf3f30c 218 }
rba90 0:e2ccabf3f30c 219 }
rba90 0:e2ccabf3f30c 220
rba90 17:c6e2e2cd6e5f 221 bool AlohaTransceiver::send(uint8_t *payload, uint8_t payload_length, uint8_t dest_addr)
rba90 0:e2ccabf3f30c 222 {
rba90 17:c6e2e2cd6e5f 223 // assume the user will not transmit payload longer than 16 bytes
rba90 17:c6e2e2cd6e5f 224 if (payload_length > 16)
rba90 17:c6e2e2cd6e5f 225 {
rba90 17:c6e2e2cd6e5f 226 return false;
rba90 17:c6e2e2cd6e5f 227 }
rba90 17:c6e2e2cd6e5f 228
rba90 17:c6e2e2cd6e5f 229 // create a new frame
rba90 17:c6e2e2cd6e5f 230 AlohaFrame frame;
rba90 17:c6e2e2cd6e5f 231 uint8_t frame_length = payload_length + FIXED_BYTE;
rba90 17:c6e2e2cd6e5f 232
rba90 17:c6e2e2cd6e5f 233 frame.setType(AlohaFrame::Aloha_Data);
rba90 17:c6e2e2cd6e5f 234 frame.setPayloadLength(payload_length);
rba90 17:c6e2e2cd6e5f 235 frame.setSourceAddress(deviceId);
rba90 17:c6e2e2cd6e5f 236 frame.setDestinationAddress(dest_addr & 0x0f);
rba90 17:c6e2e2cd6e5f 237 frame.setFullMessageFlag(0x1);
rba90 17:c6e2e2cd6e5f 238 frame.setSequenceID(seqid[dest_addr]++); // use dest_addr as key for accessing sequence id
rba90 17:c6e2e2cd6e5f 239 // the seqid should increase as it successfully transmit the packet
rba90 17:c6e2e2cd6e5f 240 for (uint8_t i = 0; i < payload_length; i++)
rba90 17:c6e2e2cd6e5f 241 {
rba90 17:c6e2e2cd6e5f 242 frame.setPayload(i, payload[i]);
rba90 17:c6e2e2cd6e5f 243 }
rba90 17:c6e2e2cd6e5f 244
rba90 17:c6e2e2cd6e5f 245 // calculate crc
rba90 17:c6e2e2cd6e5f 246 frame.generateCrc();
rba90 17:c6e2e2cd6e5f 247
rba90 17:c6e2e2cd6e5f 248 // create a buffer for transmit
rba90 17:c6e2e2cd6e5f 249 uint8_t buffer[frame_length]; // 4 fix fields
rba90 17:c6e2e2cd6e5f 250 memset(buffer, 0x0, sizeof(buffer));
rba90 17:c6e2e2cd6e5f 251
rba90 17:c6e2e2cd6e5f 252 // copy content to buffer
rba90 17:c6e2e2cd6e5f 253 frame.serialize(buffer);
rba90 17:c6e2e2cd6e5f 254
rba90 17:c6e2e2cd6e5f 255 // send to radio
rba90 17:c6e2e2cd6e5f 256 Radio.Send(buffer, frame_length);
rba90 10:065a4b58c6ff 257 State = LOWPOWER;
rba90 17:c6e2e2cd6e5f 258
rba90 17:c6e2e2cd6e5f 259 return true;
rba90 0:e2ccabf3f30c 260 }
rba90 0:e2ccabf3f30c 261
rba90 17:c6e2e2cd6e5f 262 bool AlohaTransceiver::send(AlohaFrame *frame)
rba90 15:0dc9df48687a 263 {
rba90 17:c6e2e2cd6e5f 264 // TODO: finish this
rba90 17:c6e2e2cd6e5f 265 return false;
rba90 15:0dc9df48687a 266 }
rba90 15:0dc9df48687a 267
rba90 0:e2ccabf3f30c 268 void AlohaTransceiver::registerType(AlohaFrame::AlohaType_t type, aloha_callback_func f)
rba90 0:e2ccabf3f30c 269 {
rba90 0:e2ccabf3f30c 270 AlohaTypeCallbackTable[type] = f;
rba90 0:e2ccabf3f30c 271 }
rba90 0:e2ccabf3f30c 272
rba90 0:e2ccabf3f30c 273 void AlohaTransceiver::deRegisterType(AlohaFrame::AlohaType_t type, aloha_callback_func f)
rba90 0:e2ccabf3f30c 274 {
rba90 0:e2ccabf3f30c 275 AlohaTypeCallbackTable[type] = NULL;
rba90 0:e2ccabf3f30c 276 }
rba90 0:e2ccabf3f30c 277
rba90 2:fa264e48d5f7 278 int16_t AlohaTransceiver::getRssi()
rba90 2:fa264e48d5f7 279 {
rba90 2:fa264e48d5f7 280 return RssiValue;
rba90 2:fa264e48d5f7 281 }
rba90 2:fa264e48d5f7 282
rba90 2:fa264e48d5f7 283 int8_t AlohaTransceiver::getSnr()
rba90 2:fa264e48d5f7 284 {
rba90 2:fa264e48d5f7 285 return SnrValue;
rba90 2:fa264e48d5f7 286 }
rba90 2:fa264e48d5f7 287
rba90 17:c6e2e2cd6e5f 288 uint8_t AlohaTransceiver::getDeviceID()
rba90 11:3e1ff29da71a 289 {
rba90 11:3e1ff29da71a 290 return deviceId;
rba90 11:3e1ff29da71a 291 }
rba90 11:3e1ff29da71a 292
rba90 17:c6e2e2cd6e5f 293 void AlohaTransceiver::setDeviceID(uint8_t id)
rba90 11:3e1ff29da71a 294 {
rba90 11:3e1ff29da71a 295 deviceId = id;
rba90 11:3e1ff29da71a 296 }
rba90 11:3e1ff29da71a 297
rba90 8:4bda842f73d4 298 #if USE_MODEM_LORA == 1
rba90 8:4bda842f73d4 299 AlohaTransceiver::LoRaSettings_t *AlohaTransceiver::getSettings()
rba90 8:4bda842f73d4 300 {
rba90 8:4bda842f73d4 301 return &Settings;
rba90 8:4bda842f73d4 302 }
rba90 8:4bda842f73d4 303
rba90 8:4bda842f73d4 304 #elif USE_MODEM_FSK == 1
rba90 8:4bda842f73d4 305 AlohaTransceiver::FskSettings_t *AlohaTransceiver::getSettings()
rba90 8:4bda842f73d4 306 {
rba90 8:4bda842f73d4 307 return &Settings;
rba90 8:4bda842f73d4 308 }
rba90 8:4bda842f73d4 309 #else
rba90 8:4bda842f73d4 310 #error "Please define a modem in the compiler options."
rba90 8:4bda842f73d4 311 #endif
rba90 8:4bda842f73d4 312
rba90 0:e2ccabf3f30c 313 void OnTxDone( void )
rba90 0:e2ccabf3f30c 314 {
rba90 0:e2ccabf3f30c 315 Radio.Sleep( );
rba90 0:e2ccabf3f30c 316 State = TX;
rba90 0:e2ccabf3f30c 317 printf( "> OnTxDone\n\r" );
rba90 0:e2ccabf3f30c 318 }
rba90 0:e2ccabf3f30c 319
rba90 0:e2ccabf3f30c 320 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
rba90 0:e2ccabf3f30c 321 {
rba90 0:e2ccabf3f30c 322 Radio.Sleep( );
rba90 0:e2ccabf3f30c 323
rba90 0:e2ccabf3f30c 324 // safeguard: if size exceeded maximum buffer size, it will cause memory overflow
rba90 0:e2ccabf3f30c 325 BufferSize = size ? BUFFER_SIZE : size <= BUFFER_SIZE;
rba90 0:e2ccabf3f30c 326
rba90 0:e2ccabf3f30c 327 memcpy( Buffer, payload, BufferSize );
rba90 0:e2ccabf3f30c 328 RssiValue = rssi;
rba90 0:e2ccabf3f30c 329 SnrValue = snr;
rba90 0:e2ccabf3f30c 330 State = RX;
rba90 0:e2ccabf3f30c 331 printf( "> OnRxDone\n\r" );
rba90 0:e2ccabf3f30c 332 }
rba90 0:e2ccabf3f30c 333
rba90 0:e2ccabf3f30c 334 void OnTxTimeout( void )
rba90 0:e2ccabf3f30c 335 {
rba90 0:e2ccabf3f30c 336 Radio.Sleep( );
rba90 0:e2ccabf3f30c 337 State = TX_TIMEOUT;
rba90 0:e2ccabf3f30c 338 printf( "> OnTxTimeout\n\r" );
rba90 0:e2ccabf3f30c 339 }
rba90 0:e2ccabf3f30c 340
rba90 0:e2ccabf3f30c 341 void OnRxTimeout( void )
rba90 0:e2ccabf3f30c 342 {
rba90 0:e2ccabf3f30c 343 Radio.Sleep( );
rba90 0:e2ccabf3f30c 344 Buffer[ BufferSize ] = 0;
rba90 0:e2ccabf3f30c 345 State = RX_TIMEOUT;
rba90 0:e2ccabf3f30c 346 printf( "> OnRxTimeout\n\r" );
rba90 0:e2ccabf3f30c 347 }
rba90 0:e2ccabf3f30c 348
rba90 0:e2ccabf3f30c 349 void OnRxError( void )
rba90 0:e2ccabf3f30c 350 {
rba90 0:e2ccabf3f30c 351 Radio.Sleep( );
rba90 0:e2ccabf3f30c 352 State = RX_ERROR;
rba90 0:e2ccabf3f30c 353 printf( "> OnRxError\n\r" );
rba90 0:e2ccabf3f30c 354 }