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 libmDot-mbed5 by
Lora.h
00001 /** __ ___ ____ _ ______ __ ____ __ ____ 00002 * / |/ /_ __/ / /_(_)__/_ __/__ ____/ / / __/_ _____ / /____ __ _ ___ / _/__ ____ 00003 * / /|_/ / // / / __/ /___// / / -_) __/ _ \ _\ \/ // (_-</ __/ -_) ' \(_-< _/ // _ \/ __/ __ 00004 * /_/ /_/\_,_/_/\__/_/ /_/ \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/ 00005 * Copyright (C) 2015 by Multi-Tech Systems /___/ 00006 * 00007 * 00008 * @author Jason Reiss 00009 * @date 10-31-2015 00010 * @brief lora namespace defines global settings, structures and enums for the lora library 00011 * 00012 * @details 00013 * 00014 * 00015 * 00016 */ 00017 00018 #ifndef __LORA_H__ 00019 #define __LORA_H__ 00020 00021 #include "mbed.h" 00022 #include <assert.h> 00023 #include "MTSLog.h" 00024 //#include <cstring> 00025 #include <inttypes.h> 00026 00027 namespace lora { 00028 00029 /** 00030 * Frequency bandwidth of a Datarate, higher bandwidth gives higher datarate 00031 */ 00032 enum Bandwidth { 00033 BW_125, 00034 BW_250, 00035 BW_500, 00036 BW_FSK = 50 00037 }; 00038 00039 /** 00040 * Spreading factor of a Datarate, lower spreading factor gives higher datarate 00041 */ 00042 enum SpreadingFactors { 00043 SF_6 = 6, 00044 SF_7, 00045 SF_8, 00046 SF_9, 00047 SF_10, 00048 SF_11, 00049 SF_12, 00050 SF_FSK, 00051 SF_INVALID 00052 }; 00053 00054 /** 00055 * Datarates for use with ChannelPlan 00056 */ 00057 enum Datarates { 00058 DR_0 = 0, 00059 DR_1, 00060 DR_2, 00061 DR_3, 00062 DR_4, 00063 DR_5, 00064 DR_6, 00065 DR_7, 00066 DR_8, 00067 DR_9, 00068 DR_10, 00069 DR_11, 00070 DR_12, 00071 DR_13, 00072 DR_14, 00073 DR_15 00074 }; 00075 00076 const uint8_t MIN_DATARATE = (uint8_t) DR_0; //!< Minimum datarate 00077 00078 00079 const uint8_t MAX_PHY_PACKET_SIZE = 255; //!< Maximum size for a packet 00080 const uint8_t MAX_APPS = 8; //!< Maximum number of apps sessions to save 00081 const uint8_t MAX_MULTICAST_SESSIONS = 8; //!< Maximum number of multicast sessions to save 00082 const uint8_t EUI_SIZE = 8; //!< Number of bytes in an EUI 00083 const uint8_t KEY_SIZE = 16; //!< Number of bytes in an AES key 00084 00085 const uint8_t DEFAULT_NUM_CHANNELS = 16; //!< Default number of channels in a plan 00086 const uint8_t DEFAULT_RX1_DR_OFFSET = 0; //!< Default datarate offset for first rx window 00087 const uint8_t DEFAULT_RX2_DATARATE = 0; //!< Default datarate for second rx window 00088 const uint8_t DEFAULT_TX_POWER = 14; //!< Default transmit power 00089 const uint8_t DEFAULT_CODE_RATE = 1; //!< Default coding rate 1:4/5, 2:4/6, 3:4/7, 4:4/8 00090 const uint8_t DEFAULT_PREAMBLE_LEN = 8; //!< Default preamble length 00091 00092 const int32_t MAX_FCNT_GAP = 16384; //!< Maximum allowed gap in sequence numbers before roll-over 00093 00094 const uint16_t PRIVATE_JOIN_DELAY = 1000; //!< Default join delay used for private network 00095 const uint16_t PUBLIC_JOIN_DELAY = 5000; //!< Default join delay used for public network 00096 const uint16_t DEFAULT_JOIN_DELAY = PRIVATE_JOIN_DELAY; //!< Default join delay1 00097 const uint16_t DEFAULT_RX_DELAY = 1000; //!< Default delay for first receive window 00098 const uint16_t DEFAULT_RX_TIMEOUT = 3000; //!< Default timeout for receive windows 00099 00100 const uint8_t HI_DR_SYMBOL_TIMEOUT = 12; //!< Symbol timeout for receive at datarate with SF < 11 00101 const uint8_t LO_DR_SYMBOL_TIMEOUT = 8; //!< Symbol timeout for receive at datarate with SF > 10 00102 00103 const uint16_t RX2_DELAY_OFFSET = 1000; //!< Delay between first and second window 00104 const uint16_t RXC_OFFSET = 50; //!< Time between end of RXC after TX and RX1 00105 00106 const uint8_t US915_125K_NUM_CHANS = 64; //!< Number of 125k channels in US915 channel plan 00107 const uint8_t US915_500K_NUM_CHANS = 8; //!< Number of 500k channels in US915 channel plan 00108 00109 const uint32_t US915_125K_FREQ_BASE = 902300000; //!< Frequency base for 125k US915 uplink channels 00110 const uint32_t US915_125K_FREQ_STEP = 200000; //!< Frequency step for 125k US915 uplink channels 00111 00112 const uint32_t US915_500K_FREQ_BASE = 903000000; //!< Frequency base for 500k US915 uplink channels 00113 const uint32_t US915_500K_FREQ_STEP = 1600000; //!< Frequency step for 500k US915 uplink channels 00114 00115 const uint32_t US915_500K_DBASE = 923300000; //!< Frequency base for 500k US915 downlink channels 00116 const uint32_t US915_500K_DSTEP = 600000; //!< Frequency step for 500k US915 downlink channels 00117 00118 const uint32_t US915_FREQ_MIN = 902000000; 00119 const uint32_t US915_FREQ_MAX = 928000000; 00120 00121 const uint8_t US915_MIN_DATARATE = (uint8_t) DR_0; //!< Minimum transmit datarate for US915 00122 const uint8_t US915_MAX_DATARATE = (uint8_t) DR_4; //!< Maximum transmit datarate for US915 00123 00124 const uint8_t US915_MIN_DATARATE_OFFSET = (uint8_t) 0; //!< Minimum transmit datarate for US915 00125 const uint8_t US915_MAX_DATARATE_OFFSET = (uint8_t) 3; //!< Maximum transmit datarate for US915 00126 00127 const uint8_t AU915_125K_NUM_CHANS = 64; //!< Number of 125k channels in AU915 channel plan 00128 const uint8_t AU915_500K_NUM_CHANS = 8; //!< Number of 500k channels in AU915 channel plan 00129 00130 const uint32_t AU915_125K_FREQ_BASE = 915200000; //!< Frequency base for 125k AU915 uplink channels 00131 const uint32_t AU915_125K_FREQ_STEP = 200000; //!< Frequency step for 125k AU915 uplink channels 00132 00133 const uint32_t AU915_500K_FREQ_BASE = 915900000; //!< Frequency base for 500k AU915 uplink channels 00134 const uint32_t AU915_500K_FREQ_STEP = 1600000; //!< Frequency step for 500k AU915 uplink channels 00135 00136 const uint32_t AU915_500K_DBASE = 923300000; //!< Frequency base for 500k AU915 downlink channels 00137 const uint32_t AU915_500K_DSTEP = 600000; //!< Frequency step for 500k AU915 downlink channels 00138 00139 const uint32_t AU915_FREQ_MIN = 915000000; 00140 const uint32_t AU915_FREQ_MAX = 928000000; 00141 00142 const uint8_t AU915_MIN_DATARATE = (uint8_t) DR_0; //!< Minimum transmit datarate for AU915 00143 const uint8_t AU915_MAX_DATARATE = (uint8_t) DR_4; //!< Maximum transmit datarate for AU915 00144 00145 const uint8_t AU915_MIN_DATARATE_OFFSET = (uint8_t) 0; //!< Minimum transmit datarate for AU915 00146 const uint8_t AU915_MAX_DATARATE_OFFSET = (uint8_t) 3; //!< Maximum transmit datarate for AU915 00147 00148 const uint8_t EU868_125K_NUM_CHANS = 16; //!< Number of 125k channels in EU868 channel plan 00149 const uint8_t EU868_DEFAULT_NUM_CHANS = 3; //!< Number of defualt channels in EU868 channel plan 00150 const uint32_t EU868_125K_FREQ_BASE = 868100000; //!< Frequency base for 125k EU868 uplink channels 00151 const uint32_t EU868_125K_FREQ_STEP = 200000; //!< Frequency step for 125k EU868 uplink channels 00152 const uint32_t EU868_RX2_FREQ = 869525000; //!< Frequency default for second rx window in EU868 00153 00154 const uint8_t EU868_TX_POWER_MAX = 14; //!< Max power for EU868 channel plan 00155 00156 // 0.1% duty cycle 863-868 00157 // Limiting to 865-868 allows for 1% duty cycle 00158 const uint32_t EU868_MILLI_FREQ_MIN = 865000000; 00159 const uint32_t EU868_MILLI_FREQ_MAX = 868000000; 00160 00161 const uint32_t EU868_MILLI_1_FREQ_MIN = 868700000; 00162 const uint32_t EU868_MILLI_1_FREQ_MAX = 869200000; 00163 00164 // 1% duty cycle 00165 const uint32_t EU868_CENTI_FREQ_MIN = 868000000; 00166 const uint32_t EU868_CENTI_FREQ_MAX = 868600000; 00167 00168 // 10% duty cycle 00169 const uint32_t EU868_DECI_FREQ_MIN = 869400000; 00170 const uint32_t EU868_DECI_FREQ_MAX = 869650000; 00171 00172 // Below 7dBm there is no duty cycle for these frequencies 00173 // Up to 14dBm there is 1% duty cycle 00174 const uint32_t EU868_VAR_FREQ_MIN = 869700000; 00175 const uint32_t EU868_VAR_FREQ_MAX = 870000000; 00176 00177 const uint32_t EU868_FREQ_MIN = 863000000; 00178 const uint32_t EU868_FREQ_MAX = 870000000; 00179 00180 const uint8_t EU868_MIN_DATARATE = (uint8_t) DR_0; //!< Minimum transmit datarate for EU868 00181 const uint8_t EU868_MAX_DATARATE = (uint8_t) DR_7; //!< Maximum transmit datarate for EU868 00182 00183 const uint8_t EU868_MIN_DATARATE_OFFSET = (uint8_t) 0; //!< Minimum transmit datarate for US915 00184 const uint8_t EU868_MAX_DATARATE_OFFSET = (uint8_t) 5; //!< Maximum transmit datarate for US915 00185 00186 const int16_t DEFAULT_FREE_CHAN_RSSI_THRESHOLD = -90; //!< Threshold for channel activity detection (CAD) dBm 00187 00188 const uint8_t CHAN_MASK_SIZE = 16; //!< Number of bits in a channel mask 00189 const uint8_t COMMANDS_BUFFER_SIZE = 15; //!< Size of Mac Command buffer 00190 00191 const uint8_t PKT_HEADER = 0; //!< Index to packet mHdr field 00192 const uint8_t PKT_ADDRESS = 1; //!< Index to first byte of packet address field 00193 const uint8_t PKT_FRAME_CONTROL = PKT_ADDRESS + 4; //!< Index to packet fCtrl field @see UplinkControl 00194 const uint8_t PKT_FRAME_COUNTER = PKT_FRAME_CONTROL + 1; //!< Index to packet frame counter field 00195 const uint8_t PKT_OPTIONS_START = PKT_FRAME_COUNTER + 2; //!< Index to start of optional mac commands 00196 00197 const uint8_t PKT_JOIN_APP_NONCE = 1; //!< Index to application nonce in Join Accept message 00198 const uint8_t PKT_JOIN_NETWORK_ID = 4; //!< Index to network id in Join Accept message 00199 const uint8_t PKT_JOIN_NETWORK_ADDRESS = 7; //!< Index to network address in Join Accept message 00200 const uint8_t PKT_JOIN_DL_SETTINGS = 11; //!< Index to downlink settings in Join Accept message 00201 const uint8_t PKT_JOIN_RX_DELAY = 12; //!< Index to rx delay in Join Accept message 00202 00203 const uint8_t ADR_ACK_LIMIT = 64; //!< Number of packets without ADR ACK Request 00204 const uint8_t ADR_ACK_DELAY = 32; //!< Number of packets to expect ADR ACK Response within 00205 00206 const uint16_t ACK_TIMEOUT = 2000; //!< Base millisecond timeout to resend after missed ACK 00207 const uint16_t ACK_TIMEOUT_RND = 1000; //!< Random millisecond adjustment to resend after missed ACK 00208 00209 const uint8_t FRAME_OVERHEAD = 13; //!< Bytes of network info overhead in a frame 00210 00211 /** 00212 * Settings to choose ChannelPlan 00213 */ 00214 enum FrequencyBand { 00215 EU868, //!< EU 863-870 16 channel uplink 00216 US915, //!< US 902-928 64-125k/8-500k uplink and 8-500k downlink channels 00217 AU915, //!< US 915-928 64-125k/8-500k uplink and 8-500k downlink channels 00218 CN779, //!< 00219 CN470, //!< 00220 EU433, //!< 00221 }; 00222 00223 /** 00224 * Settings for type of network 00225 * PUBLIC - defaults to 5/6 second join windows and 0x34 sync word 00226 * PRIVATE - defaults to 1/2 second join windows and 0x12 sync word 00227 */ 00228 enum NetworkType { 00229 PRIVATE = 0, 00230 PUBLIC = 1, 00231 PEER_TO_PEER = 4 00232 }; 00233 00234 /** 00235 * Enum for on/off settings 00236 */ 00237 enum Enabled { 00238 OFF = 0, 00239 ON = 1 00240 }; 00241 00242 /** 00243 * Return status of mac functions 00244 */ 00245 enum MacStatus { 00246 LORA_OK = 0, 00247 LORA_ERROR = 1, 00248 LORA_JOIN_ERROR = 2, 00249 LORA_SEND_ERROR = 3, 00250 LORA_MIC_ERROR = 4, 00251 LORA_ADDRESS_ERROR = 5, 00252 LORA_NO_CHANS_ENABLED = 6, 00253 LORA_COMMAND_BUFFER_FULL = 7, 00254 LORA_UNKNOWN_MAC_COMMAND = 8, 00255 LORA_ADR_OFF = 9, 00256 LORA_BUSY = 10, 00257 LORA_LINK_BUSY = 11, 00258 LORA_RADIO_BUSY = 12, 00259 LORA_BUFFER_FULL = 13, 00260 LORA_JOIN_BACKOFF = 14, 00261 LORA_NO_FREE_CHAN = 15, 00262 LORA_AGGREGATED_DUTY_CYCLE = 16, 00263 LORA_MAC_COMMAND_ERROR = 17, 00264 LORA_MAX_PAYLOAD_EXCEEDED = 18 00265 }; 00266 00267 /** 00268 * State for Link 00269 */ 00270 enum LinkState { 00271 LINK_IDLE = 0, //!< Link ready to send or receive 00272 LINK_TX, //!< Link is busy sending 00273 LINK_ACK_TX, //!< Link is busy resending after missed ACK 00274 LINK_REP_TX, //!< Link is busy repeating 00275 LINK_RX, //!< Link has receive window open 00276 LINK_RX1, //!< Link has first received window open 00277 LINK_RX2, //!< Link has second received window open 00278 LINK_RXC, //!< Link has class C received window open 00279 LINK_P2P, //!< Link is busy sending 00280 }; 00281 00282 /** 00283 * State for MAC 00284 */ 00285 enum MacState { 00286 MAC_IDLE, 00287 MAC_RX1, 00288 MAC_RX2, 00289 MAC_RXC, 00290 MAC_TX, 00291 MAC_JOIN 00292 }; 00293 00294 /** 00295 * Operation class for device 00296 */ 00297 enum MoteClass { 00298 CLASS_A = 0x00, //!< Device can only receive in windows opened after a transmit 00299 CLASS_B = 0x01, //!< Device can receive in windows sychronized with gateway beacon 00300 CLASS_C = 0x02 //!< Device can receive any time when not transmitting 00301 }; 00302 00303 /** 00304 * Direction of a packet 00305 */ 00306 enum Direction { 00307 DIR_UP = 0, //!< Packet is sent from mote to gateway 00308 DIR_DOWN = 1, //!< Packet was received from gateway 00309 DIR_PEER = 2 //!< Packet was received from peer 00310 }; 00311 00312 00313 /** 00314 * Received window used by Link 00315 */ 00316 enum ReceiveWindows { 00317 RX_1 = 1, //!< First receive window 00318 RX_2, //!< Second receive window 00319 RX_BEACON, //!< Beacon receive window 00320 RX_SLOT, //!< Beacon Slot receive window 00321 RX_TEST 00322 }; 00323 00324 /** 00325 * Datarate range for a Channel 00326 */ 00327 typedef union { 00328 int8_t Value; 00329 struct { 00330 int8_t Min :4; 00331 int8_t Max :4; 00332 } Fields; 00333 } DatarateRange; 00334 00335 /** 00336 * Datarate used for transmitting and receiving 00337 */ 00338 typedef struct Datarate { 00339 uint8_t Index; 00340 uint8_t Bandwidth; 00341 uint8_t Coderate; 00342 uint8_t PreambleLength; 00343 uint8_t SpreadingFactor; 00344 uint8_t Crc; 00345 uint8_t TxIQ; 00346 uint8_t RxIQ; 00347 uint8_t SymbolTimeout(); 00348 Datarate(); 00349 } Datarate; 00350 00351 /** 00352 * Channel used for transmitting 00353 */ 00354 typedef struct { 00355 uint8_t Index; 00356 uint32_t Frequency; 00357 DatarateRange DrRange; 00358 } Channel; 00359 00360 /** 00361 * Receive window 00362 */ 00363 typedef struct { 00364 uint8_t Index; 00365 uint32_t Frequency; 00366 uint8_t DatarateIndex; 00367 } RxWindow; 00368 00369 /** 00370 * Duty band for limiting time-on-air for regional regulations 00371 */ 00372 typedef struct { 00373 uint8_t Index; 00374 uint32_t FrequencyMin; 00375 uint32_t FrequencyMax; 00376 uint8_t PowerMax; 00377 uint16_t DutyCycle; //!< Multiplier of time on air, 0:100%, 1:50%, 2:33%, 10:10%, 100:1%, 1000,0.1% 00378 uint32_t TimeOffEnd; //!< Timestamp when this band will be available 00379 } DutyBand; 00380 00381 /** 00382 * Device configuration 00383 */ 00384 typedef struct { 00385 uint8_t FrequencyBand; //!< Used to choose ChannelPlan 00386 uint8_t EUI[8]; //!< Unique identifier assigned to device 00387 } DeviceConfig; 00388 00389 /** 00390 * Network configuration 00391 */ 00392 typedef struct { 00393 uint8_t Mode; //!< PUBLIC, PRIVATE or PEER_TO_PEER network mode 00394 uint8_t Class; //!< Operating class of device 00395 uint8_t EUI[8]; //!< Network ID or AppEUI 00396 uint8_t Key[16]; //!< Network Key or AppKey 00397 uint8_t JoinDelay; //!< Number of seconds to wait before 1st RX Window 00398 uint8_t RxDelay; //!< Number of seconds to wait before 1st RX Window 00399 uint8_t ChannelGroup; //!< ChannelGroup used for US915 hybrid operation 0:72 channels, 1:1-8 channels ... 00400 uint8_t AckAttempts; //!< Number of attempts to send packet and receive an ACK from server 00401 uint8_t Retries; //!< Number of times to resend a packet without receiving an ACK, redundancy 00402 uint8_t ADREnabled; //!< Enable adaptive datarate 00403 uint8_t CADEnabled; //!< Enable listen before talk/channel activity detection 00404 uint8_t RepeaterMode; //!< Limit payloads to repeater compatible sizes 00405 uint8_t TxPower; //!< Default radio output power in dBm 00406 uint8_t TxPowerMax; //!< Max transmit power 00407 uint8_t TxDatarate; //!< Datarate for P2P transmit 00408 uint32_t TxFrequency; //!< Frequency for P2P transmit 00409 int8_t AntennaGain; //!< Antenna Gain 00410 uint8_t DisableEncryption; //!< Disable Encryption 00411 uint8_t DisableCRC; //!< Disable CRC on uplink packets 00412 uint16_t P2PACKTimeout; 00413 uint16_t P2PACKBackoff; 00414 uint8_t JoinRx1DatarateOffset; //!< Offset for datarate for first window 00415 uint32_t JoinRx2Frequency; //!< Frequency used in second window 00416 uint8_t JoinRx2DatarateIndex; //!< Datarate for second window 00417 } NetworkConfig; 00418 00419 /** 00420 * Network session info 00421 * Some settings are acquired in join message and others may be changed through Mac Commands from server 00422 */ 00423 typedef struct { 00424 uint8_t Joined; //!< State of session 00425 uint8_t Rx1DatarateOffset; //!< Offset for datarate for first window 00426 uint32_t Rx2Frequency; //!< Frequency used in second window 00427 uint8_t Rx2DatarateIndex; //!< Datarate for second window 00428 uint8_t TxPower; //!< Current total radiated output power in dBm 00429 uint8_t TxDatarate; //!< Current datarate can be changed when ADR is enabled 00430 uint32_t Address; //!< Network address 00431 uint32_t NetworkID; //!< Network ID 24-bits 00432 uint8_t NetworkSessionKey[16]; //!< Network session key 00433 uint8_t ApplicationSessionKey[16]; //!< Data session key 00434 uint16_t ChannelMask[4]; //!< Current channel mask 00435 uint16_t ChannelMask500k; //!< Current channel mask for 500k channels 00436 uint32_t DownlinkCounter; //!< Downlink counter of last packet received from server 00437 uint32_t UplinkCounter; //!< Uplink counter of last packet received from server 00438 uint8_t Redundancy; //!< Number of time to repeat an uplink 00439 uint8_t MaxDutyCycle; //!< Current Max Duty Cycle value 00440 uint32_t JoinTimeOnAir; //!< Balance of time on air used during join attempts 00441 uint32_t JoinTimeOffEnd; //!< RTC time of next join attempt 00442 uint32_t JoinFirstAttempt; //!< RTC time of first failed join attempt 00443 uint32_t AggregatedTimeOffEnd; //!< Time off air expiration for aggregate duty cycle 00444 uint16_t AggregateDutyCycle; //!< Used for enforcing time-on-air 00445 uint8_t AckCounter; //!< Current number of packets sent without ACK from server 00446 uint8_t AdrCounter; //!< Current number of packets received without downlink from server 00447 uint8_t RxDelay; //!< Number of seconds to wait before 1st RX Window 00448 uint8_t CommandBuffer[COMMANDS_BUFFER_SIZE]; //!< Buffer to hold Mac Commands and parameters to be sent in next packet 00449 uint8_t CommandBufferIndex; //!< Index to place next Mac Command, also current size of Command Buffer 00450 bool SrvRequestedAck; //!< Indicator of ACK requested by server in last packet received 00451 bool DataPending; //!< Indicator of data pending at server 00452 uint8_t RxTimingSetupReqReceived; //!< Indicator that RxTimingSetupAns should be included in uplink 00453 uint8_t RxParamSetupReqAnswer; //!< Indicator that RxParamSetupAns should be included in uplink 00454 } NetworkSession; 00455 00456 /** 00457 * Multicast session info 00458 */ 00459 typedef struct { 00460 uint32_t Address; //!< Network address 00461 uint8_t NetworkSessionKey[16]; //!< Network session key 00462 uint8_t DataSessionKey[16]; //!< Data session key 00463 uint32_t DownlinkCounter; //!< Downlink counter of last packet received from server 00464 } MulticastSession; 00465 00466 /** 00467 * Application configuration 00468 */ 00469 typedef struct { 00470 uint8_t Port; //!< Port used by application 00471 uint8_t AppEUI; //!< Application ID 00472 uint8_t AppKey[16]; //!< Application Key 00473 } ApplicationConfig; 00474 00475 /** 00476 * Statistics of current network session 00477 */ 00478 typedef struct Statistics { 00479 uint32_t Up; //!< Number of uplink packets sent 00480 uint32_t Down; //!< Number of downlink packets received 00481 uint32_t Joins; //!< Number of join requests sent 00482 uint32_t JoinFails; //!< Number of join requests without response or invalid response 00483 uint32_t MissedAcks; //!< Number of missed acknowledgement attempts of confirmed packets 00484 uint32_t CRCErrors; //!< Number of CRC errors in received packets 00485 int32_t AvgCount; //!< Number of packets used to compute rolling average of RSSI and SNR 00486 int16_t Rssi; //!< RSSI of last packet received 00487 int16_t RssiMin; //!< Minimum RSSI of last AvgCount packets 00488 int16_t RssiMax; //!< Maximum RSSI of last AvgCount packets 00489 int16_t RssiAvg; //!< Rolling average RSSI of last AvgCount packets 00490 int16_t Snr; //!< SNR of last packet received 00491 int16_t SnrMin; //!< Minimum SNR of last AvgCount packets 00492 int16_t SnrMax; //!< Maximum SNR of last AvgCount packets 00493 int16_t SnrAvg; //!< Rolling average SNR of last AvgCount packets 00494 } Statistics; 00495 00496 /** 00497 * Testing settings 00498 */ 00499 typedef struct { 00500 uint8_t TestMode; 00501 uint8_t SkipMICCheck; 00502 uint8_t DisableDutyCycle; 00503 uint8_t DisableRx1; 00504 uint8_t DisableRx2; 00505 uint8_t FixedUplinkCounter; 00506 uint8_t DisableRandomJoinDatarate; 00507 } Testing; 00508 00509 /** 00510 * Combination of device, network, testing settings and statistics 00511 */ 00512 typedef struct { 00513 DeviceConfig Device; 00514 NetworkConfig Network; 00515 NetworkSession Session; 00516 ApplicationConfig Applications[MAX_APPS]; 00517 MulticastSession Multicast[MAX_MULTICAST_SESSIONS]; 00518 Statistics Stats; 00519 Testing Test; 00520 } Settings; 00521 00522 /** 00523 * Downlink settings sent in Join Accept message 00524 */ 00525 typedef union { 00526 uint8_t Value; 00527 struct { 00528 uint8_t Rx2Datarate :4; 00529 uint8_t Rx1Offset :3; 00530 uint8_t RFU :1; 00531 }; 00532 } DownlinkSettings; 00533 00534 /** 00535 * Frame structure for Join Request 00536 */ 00537 typedef struct { 00538 uint8_t Type; 00539 uint8_t AppEUI[8]; 00540 uint8_t DevEUI[8]; 00541 uint8_t Nonce[2]; 00542 uint8_t MIC[4]; 00543 } JoinRequestFrame; 00544 00545 /** 00546 * Mac header of uplink and downlink packets 00547 */ 00548 typedef union { 00549 uint8_t Value; 00550 struct { 00551 uint8_t Major :2; 00552 uint8_t RFU :3; 00553 uint8_t MType :3; 00554 } Bits; 00555 } MacHeader; 00556 00557 /** 00558 * Frame control field of uplink packets 00559 */ 00560 typedef union { 00561 uint8_t Value; 00562 struct { 00563 uint8_t OptionsLength :4; 00564 uint8_t ClassB :1; 00565 uint8_t Ack :1; 00566 uint8_t AdrAckReq :1; 00567 uint8_t Adr :1; 00568 } Bits; 00569 } UplinkControl; 00570 00571 /** 00572 * Frame control field of downlink packets 00573 */ 00574 typedef union { 00575 uint8_t Value; 00576 struct { 00577 uint8_t OptionsLength :4; 00578 uint8_t FPending :1; 00579 uint8_t Ack :1; 00580 uint8_t RFU :1; 00581 uint8_t Adr :1; 00582 } Bits; 00583 } DownlinkControl; 00584 00585 /** 00586 * Frame type of packet 00587 */ 00588 typedef enum { 00589 FRAME_TYPE_JOIN_REQ = 0x00, 00590 FRAME_TYPE_JOIN_ACCEPT = 0x01, 00591 FRAME_TYPE_DATA_UNCONFIRMED_UP = 0x02, 00592 FRAME_TYPE_DATA_UNCONFIRMED_DOWN = 0x03, 00593 FRAME_TYPE_DATA_CONFIRMED_UP = 0x04, 00594 FRAME_TYPE_DATA_CONFIRMED_DOWN = 0x05, 00595 FRAME_TYPE_RFU = 0x06, 00596 FRAME_TYPE_PROPRIETARY = 0x07, 00597 } FrameType; 00598 00599 /** 00600 * LoRaWAN mote MAC commands 00601 */ 00602 typedef enum { 00603 /* Class A */ 00604 MOTE_MAC_LINK_CHECK_REQ = 0x02, 00605 MOTE_MAC_LINK_ADR_ANS = 0x03, 00606 MOTE_MAC_DUTY_CYCLE_ANS = 0x04, 00607 MOTE_MAC_RX_PARAM_SETUP_ANS = 0x05, 00608 MOTE_MAC_DEV_STATUS_ANS = 0x06, 00609 MOTE_MAC_NEW_CHANNEL_ANS = 0x07, 00610 MOTE_MAC_RX_TIMING_SETUP_ANS = 0x08, 00611 00612 /* Class B */ 00613 MOTE_MAC_PING_SLOT_INFO_REQ = 0x09, 00614 MOTE_MAC_PING_SLOT_FREQ_ANS = 0x0a, 00615 MOTE_MAC_PING_SLOT_CHANNEL_ANS = 0x0a, 00616 MOTE_MAC_BEACON_TIMING_REQ = 0x0b, 00617 MOTE_MAC_BEACON_FREQ_ANS = 0x0c, 00618 00619 /* Multitech */ 00620 MOTE_MAC_PING_REQ = 0x80, 00621 MOTE_MAC_CHANGE_CLASS = 0x81, 00622 MOTE_MAC_MULTIPART_START_REQ = 0x82, 00623 MOTE_MAC_MULTIPART_START_ANS = 0x83, 00624 MOTE_MAC_MULTIPART_CHUNK = 0x84, 00625 MOTE_MAC_MULTIPART_END_REQ = 0x85, 00626 MOTE_MAC_MULTIPART_END_ANS = 0x86 00627 } MoteCommand; 00628 00629 /*! 00630 * LoRaWAN server MAC commands 00631 */ 00632 typedef enum { 00633 /* Class A */ 00634 SRV_MAC_LINK_CHECK_ANS = 0x02, 00635 SRV_MAC_LINK_ADR_REQ = 0x03, 00636 SRV_MAC_DUTY_CYCLE_REQ = 0x04, 00637 SRV_MAC_RX_PARAM_SETUP_REQ = 0x05, 00638 SRV_MAC_DEV_STATUS_REQ = 0x06, 00639 SRV_MAC_NEW_CHANNEL_REQ = 0x07, 00640 SRV_MAC_RX_TIMING_SETUP_REQ = 0x08, 00641 00642 /* Class B */ 00643 SRV_MAC_PING_SLOT_INFO_ANS = 0x09, 00644 SRV_MAC_PING_SLOT_FREQ_REQ = 0x0a, 00645 SRV_MAC_PING_SLOT_CHANNEL_REQ = 0x0a, 00646 SRV_MAC_BEACON_TIMING_ANS = 0x0b, 00647 SRV_MAC_BEACON_FREQ_REQ = 0x0c, 00648 00649 /* Multitech */ 00650 SRV_MAC_PING_ANS = 0x80, 00651 SRV_MAC_CHANGE_CLASS = 0x81, 00652 SRV_MAC_MULTIPART_START_REQ = 0x82, 00653 SRV_MAC_MULTIPART_START_ANS = 0x83, 00654 SRV_MAC_MULTIPART_CHUNK = 0x84, 00655 SRV_MAC_MULTIPART_END_REQ = 0x85, 00656 SRV_MAC_MULTIPART_END_ANS = 0x86 00657 } ServerCommand; 00658 00659 /** 00660 * Random seed for software RNG 00661 */ 00662 void srand(uint32_t seed); 00663 00664 /** 00665 * Software RNG for consistent results across differing hardware 00666 */ 00667 int rand(void); 00668 00669 /** 00670 * Generate random number bounded by min and max 00671 */ 00672 int32_t rand_r(int32_t min, int32_t max); 00673 00674 uint8_t CountBits(uint16_t mask); 00675 00676 /** 00677 * Copy 3-bytes network order from array into LSB of integer value 00678 */ 00679 void CopyNetIDtoInt(const uint8_t* arr, uint32_t& val); 00680 00681 /** 00682 * Copy LSB 3-bytes from integer value into array network order 00683 */ 00684 void CopyNetIDtoArray(uint32_t val, uint8_t* arr); 00685 00686 /** 00687 * Copy 4-bytes network order from array in to integer value 00688 */ 00689 void CopyAddrtoInt(const uint8_t* arr, uint32_t& val); 00690 00691 /** 00692 * Copy 4-bytes from integer in to array network order 00693 */ 00694 void CopyAddrtoArray(uint32_t val, uint8_t* arr); 00695 00696 /** 00697 * Copy 3-bytes network order from array into integer value and multiply by 100 00698 */ 00699 void CopyFreqtoInt(const uint8_t* arr, uint32_t& freq); 00700 00701 /** 00702 * Reverse memory copy 00703 */ 00704 void memcpy_r(uint8_t *dst, const uint8_t *src, size_t n); 00705 00706 } 00707 00708 #endif 00709
Generated on Sat Jul 16 2022 05:44:25 by
1.7.2
