1
Dependents: 0A101_mDot_Sensor_Rev3_AUS 601_mDot_Sensor_RevJT_AUS
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 for type of network 00213 * PUBLIC - defaults to 5/6 second join windows and 0x34 sync word 00214 * PRIVATE - defaults to 1/2 second join windows and 0x12 sync word 00215 */ 00216 enum NetworkType { 00217 PRIVATE = 0, 00218 PUBLIC = 1, 00219 PEER_TO_PEER = 4 00220 }; 00221 00222 /** 00223 * Enum for on/off settings 00224 */ 00225 enum Enabled { 00226 OFF = 0, 00227 ON = 1 00228 }; 00229 00230 /** 00231 * Return status of mac functions 00232 */ 00233 enum MacStatus { 00234 LORA_OK = 0, 00235 LORA_ERROR = 1, 00236 LORA_JOIN_ERROR = 2, 00237 LORA_SEND_ERROR = 3, 00238 LORA_MIC_ERROR = 4, 00239 LORA_ADDRESS_ERROR = 5, 00240 LORA_NO_CHANS_ENABLED = 6, 00241 LORA_COMMAND_BUFFER_FULL = 7, 00242 LORA_UNKNOWN_MAC_COMMAND = 8, 00243 LORA_ADR_OFF = 9, 00244 LORA_BUSY = 10, 00245 LORA_LINK_BUSY = 11, 00246 LORA_RADIO_BUSY = 12, 00247 LORA_BUFFER_FULL = 13, 00248 LORA_JOIN_BACKOFF = 14, 00249 LORA_NO_FREE_CHAN = 15, 00250 LORA_AGGREGATED_DUTY_CYCLE = 16, 00251 LORA_MAC_COMMAND_ERROR = 17, 00252 LORA_MAX_PAYLOAD_EXCEEDED = 18, 00253 LORA_LBT_CHANNEL_BUSY = 19 00254 }; 00255 00256 /** 00257 * State for Link 00258 */ 00259 enum LinkState { 00260 LINK_IDLE = 0, //!< Link ready to send or receive 00261 LINK_TX, //!< Link is busy sending 00262 LINK_ACK_TX, //!< Link is busy resending after missed ACK 00263 LINK_REP_TX, //!< Link is busy repeating 00264 LINK_RX, //!< Link has receive window open 00265 LINK_RX1, //!< Link has first received window open 00266 LINK_RX2, //!< Link has second received window open 00267 LINK_RXC, //!< Link has class C received window open 00268 LINK_P2P, //!< Link is busy sending 00269 }; 00270 00271 /** 00272 * State for MAC 00273 */ 00274 enum MacState { 00275 MAC_IDLE, 00276 MAC_RX1, 00277 MAC_RX2, 00278 MAC_RXC, 00279 MAC_TX, 00280 MAC_JOIN 00281 }; 00282 00283 /** 00284 * Operation class for device 00285 */ 00286 enum MoteClass { 00287 CLASS_A = 0x00, //!< Device can only receive in windows opened after a transmit 00288 CLASS_B = 0x01, //!< Device can receive in windows sychronized with gateway beacon 00289 CLASS_C = 0x02 //!< Device can receive any time when not transmitting 00290 }; 00291 00292 /** 00293 * Direction of a packet 00294 */ 00295 enum Direction { 00296 DIR_UP = 0, //!< Packet is sent from mote to gateway 00297 DIR_DOWN = 1, //!< Packet was received from gateway 00298 DIR_PEER = 2 //!< Packet was received from peer 00299 }; 00300 00301 00302 /** 00303 * Received window used by Link 00304 */ 00305 enum ReceiveWindows { 00306 RX_1 = 1, //!< First receive window 00307 RX_2, //!< Second receive window 00308 RX_BEACON, //!< Beacon receive window 00309 RX_SLOT, //!< Beacon Slot receive window 00310 RX_TEST 00311 }; 00312 00313 /** 00314 * Datarate range for a Channel 00315 */ 00316 typedef union { 00317 int8_t Value; 00318 struct { 00319 int8_t Min :4; 00320 int8_t Max :4; 00321 } Fields; 00322 } DatarateRange; 00323 00324 /** 00325 * Datarate used for transmitting and receiving 00326 */ 00327 typedef struct Datarate { 00328 uint8_t Index; 00329 uint8_t Bandwidth; 00330 uint8_t Coderate; 00331 uint8_t PreambleLength; 00332 uint8_t SpreadingFactor; 00333 uint8_t Crc; 00334 uint8_t TxIQ; 00335 uint8_t RxIQ; 00336 uint8_t SymbolTimeout(); 00337 Datarate(); 00338 } Datarate; 00339 00340 /** 00341 * Channel used for transmitting 00342 */ 00343 typedef struct { 00344 uint8_t Index; 00345 uint32_t Frequency; 00346 DatarateRange DrRange; 00347 } Channel; 00348 00349 /** 00350 * Receive window 00351 */ 00352 typedef struct { 00353 uint8_t Index; 00354 uint32_t Frequency; 00355 uint8_t DatarateIndex; 00356 } RxWindow; 00357 00358 /** 00359 * Duty band for limiting time-on-air for regional regulations 00360 */ 00361 typedef struct { 00362 uint8_t Index; 00363 uint32_t FrequencyMin; 00364 uint32_t FrequencyMax; 00365 uint8_t PowerMax; 00366 uint16_t DutyCycle; //!< Multiplier of time on air, 0:100%, 1:50%, 2:33%, 10:10%, 100:1%, 1000,0.1% 00367 uint32_t TimeOffEnd; //!< Timestamp when this band will be available 00368 } DutyBand; 00369 00370 /** 00371 * Device configuration 00372 */ 00373 typedef struct { 00374 uint8_t FrequencyBand; //!< Used to choose ChannelPlan 00375 uint8_t EUI[8]; //!< Unique identifier assigned to device 00376 } DeviceConfig; 00377 00378 /** 00379 * Network configuration 00380 */ 00381 typedef struct { 00382 uint8_t Mode; //!< PUBLIC, PRIVATE or PEER_TO_PEER network mode 00383 uint8_t Class; //!< Operating class of device 00384 uint8_t EUI[8]; //!< Network ID or AppEUI 00385 uint8_t Key[16]; //!< Network Key or AppKey 00386 uint8_t JoinDelay; //!< Number of seconds to wait before 1st RX Window 00387 uint8_t RxDelay; //!< Number of seconds to wait before 1st RX Window 00388 uint8_t FrequencySubBand; //!< FrequencySubBand used for US915 hybrid operation 0:72 channels, 1:1-8 channels ... 00389 uint8_t AckAttempts; //!< Number of attempts to send packet and receive an ACK from server 00390 uint8_t Retries; //!< Number of times to resend a packet without receiving an ACK, redundancy 00391 uint8_t ADREnabled; //!< Enable adaptive datarate 00392 uint8_t CADEnabled; //!< Enable listen before talk/channel activity detection 00393 uint8_t RepeaterMode; //!< Limit payloads to repeater compatible sizes 00394 uint8_t TxPower; //!< Default radio output power in dBm 00395 uint8_t TxPowerMax; //!< Max transmit power 00396 uint8_t TxDatarate; //!< Datarate for P2P transmit 00397 uint32_t TxFrequency; //!< Frequency for P2P transmit 00398 int8_t AntennaGain; //!< Antenna Gain 00399 uint8_t DisableEncryption; //!< Disable Encryption 00400 uint8_t DisableCRC; //!< Disable CRC on uplink packets 00401 uint16_t P2PACKTimeout; 00402 uint16_t P2PACKBackoff; 00403 uint8_t JoinRx1DatarateOffset; //!< Offset for datarate for first window 00404 uint32_t JoinRx2Frequency; //!< Frequency used in second window 00405 uint8_t JoinRx2DatarateIndex; //!< Datarate for second window 00406 } NetworkConfig; 00407 00408 /** 00409 * Network session info 00410 * Some settings are acquired in join message and others may be changed through Mac Commands from server 00411 */ 00412 typedef struct { 00413 uint8_t Joined; //!< State of session 00414 uint8_t Rx1DatarateOffset; //!< Offset for datarate for first window 00415 uint32_t Rx2Frequency; //!< Frequency used in second window 00416 uint8_t Rx2DatarateIndex; //!< Datarate for second window 00417 uint8_t TxPower; //!< Current total radiated output power in dBm 00418 uint8_t TxDatarate; //!< Current datarate can be changed when ADR is enabled 00419 uint32_t Address; //!< Network address 00420 uint32_t NetworkID; //!< Network ID 24-bits 00421 uint8_t NetworkSessionKey[16]; //!< Network session key 00422 uint8_t ApplicationSessionKey[16]; //!< Data session key 00423 uint16_t ChannelMask[4]; //!< Current channel mask 00424 uint16_t ChannelMask500k; //!< Current channel mask for 500k channels 00425 uint32_t DownlinkCounter; //!< Downlink counter of last packet received from server 00426 uint32_t UplinkCounter; //!< Uplink counter of last packet received from server 00427 uint8_t Redundancy; //!< Number of time to repeat an uplink 00428 uint8_t MaxDutyCycle; //!< Current Max Duty Cycle value 00429 uint32_t JoinTimeOnAir; //!< Balance of time on air used during join attempts 00430 uint32_t JoinTimeOffEnd; //!< RTC time of next join attempt 00431 uint32_t JoinFirstAttempt; //!< RTC time of first failed join attempt 00432 uint32_t AggregatedTimeOffEnd; //!< Time off air expiration for aggregate duty cycle 00433 uint16_t AggregateDutyCycle; //!< Used for enforcing time-on-air 00434 uint8_t AckCounter; //!< Current number of packets sent without ACK from server 00435 uint8_t AdrCounter; //!< Current number of packets received without downlink from server 00436 uint8_t RxDelay; //!< Number of seconds to wait before 1st RX Window 00437 uint8_t CommandBuffer[COMMANDS_BUFFER_SIZE]; //!< Buffer to hold Mac Commands and parameters to be sent in next packet 00438 uint8_t CommandBufferIndex; //!< Index to place next Mac Command, also current size of Command Buffer 00439 bool SrvRequestedAck; //!< Indicator of ACK requested by server in last packet received 00440 bool DataPending; //!< Indicator of data pending at server 00441 uint8_t RxTimingSetupReqReceived; //!< Indicator that RxTimingSetupAns should be included in uplink 00442 uint8_t RxParamSetupReqAnswer; //!< Indicator that RxParamSetupAns should be included in uplink 00443 uint8_t DlChannelReqAnswer; //!< Indicator that DlChannelAns should be included in uplink 00444 uint8_t DownlinkDwelltime; //!< On air dwell time for downlink packets 0:NONE,1:400ms 00445 uint8_t UplinkDwelltime; //!< On air dwell time for uplink packets 0:NONE,1:400ms 00446 uint8_t Max_EIRP; //!< Maximum allowed EIRP for uplink 00447 } NetworkSession; 00448 00449 /** 00450 * Multicast session info 00451 */ 00452 typedef struct { 00453 uint32_t Address; //!< Network address 00454 uint8_t NetworkSessionKey[16]; //!< Network session key 00455 uint8_t DataSessionKey[16]; //!< Data session key 00456 uint32_t DownlinkCounter; //!< Downlink counter of last packet received from server 00457 } MulticastSession; 00458 00459 /** 00460 * Application configuration 00461 */ 00462 typedef struct { 00463 uint8_t Port; //!< Port used by application 00464 uint8_t AppEUI; //!< Application ID 00465 uint8_t AppKey[16]; //!< Application Key 00466 } ApplicationConfig; 00467 00468 /** 00469 * Statistics of current network session 00470 */ 00471 typedef struct Statistics { 00472 uint32_t Up; //!< Number of uplink packets sent 00473 uint32_t Down; //!< Number of downlink packets received 00474 uint32_t Joins; //!< Number of join requests sent 00475 uint32_t JoinFails; //!< Number of join requests without response or invalid response 00476 uint32_t MissedAcks; //!< Number of missed acknowledgement attempts of confirmed packets 00477 uint32_t CRCErrors; //!< Number of CRC errors in received packets 00478 int32_t AvgCount; //!< Number of packets used to compute rolling average of RSSI and SNR 00479 int16_t Rssi; //!< RSSI of last packet received 00480 int16_t RssiMin; //!< Minimum RSSI of last AvgCount packets 00481 int16_t RssiMax; //!< Maximum RSSI of last AvgCount packets 00482 int16_t RssiAvg; //!< Rolling average RSSI of last AvgCount packets 00483 int16_t Snr; //!< SNR of last packet received 00484 int16_t SnrMin; //!< Minimum SNR of last AvgCount packets 00485 int16_t SnrMax; //!< Maximum SNR of last AvgCount packets 00486 int16_t SnrAvg; //!< Rolling average SNR of last AvgCount packets 00487 } Statistics; 00488 00489 /** 00490 * Testing settings 00491 */ 00492 typedef struct { 00493 uint8_t TestMode; 00494 uint8_t SkipMICCheck; 00495 uint8_t DisableDutyCycle; 00496 uint8_t DisableRx1; 00497 uint8_t DisableRx2; 00498 uint8_t FixedUplinkCounter; 00499 uint8_t DisableRandomJoinDatarate; 00500 } Testing; 00501 00502 /** 00503 * Combination of device, network, testing settings and statistics 00504 */ 00505 typedef struct { 00506 DeviceConfig Device; 00507 NetworkConfig Network; 00508 NetworkSession Session; 00509 ApplicationConfig Applications[MAX_APPS]; 00510 MulticastSession Multicast[MAX_MULTICAST_SESSIONS]; 00511 Statistics Stats; 00512 Testing Test; 00513 } Settings; 00514 00515 /** 00516 * Downlink settings sent in Join Accept message 00517 */ 00518 typedef union { 00519 uint8_t Value; 00520 struct { 00521 uint8_t Rx2Datarate :4; 00522 uint8_t Rx1Offset :3; 00523 uint8_t RFU :1; 00524 }; 00525 } DownlinkSettings; 00526 00527 /** 00528 * Frame structure for Join Request 00529 */ 00530 typedef struct { 00531 uint8_t Type; 00532 uint8_t AppEUI[8]; 00533 uint8_t DevEUI[8]; 00534 uint8_t Nonce[2]; 00535 uint8_t MIC[4]; 00536 } JoinRequestFrame; 00537 00538 /** 00539 * Mac header of uplink and downlink packets 00540 */ 00541 typedef union { 00542 uint8_t Value; 00543 struct { 00544 uint8_t Major :2; 00545 uint8_t RFU :3; 00546 uint8_t MType :3; 00547 } Bits; 00548 } MacHeader; 00549 00550 /** 00551 * Frame control field of uplink packets 00552 */ 00553 typedef union { 00554 uint8_t Value; 00555 struct { 00556 uint8_t OptionsLength :4; 00557 uint8_t ClassB :1; 00558 uint8_t Ack :1; 00559 uint8_t AdrAckReq :1; 00560 uint8_t Adr :1; 00561 } Bits; 00562 } UplinkControl; 00563 00564 /** 00565 * Frame control field of downlink packets 00566 */ 00567 typedef union { 00568 uint8_t Value; 00569 struct { 00570 uint8_t OptionsLength :4; 00571 uint8_t FPending :1; 00572 uint8_t Ack :1; 00573 uint8_t RFU :1; 00574 uint8_t Adr :1; 00575 } Bits; 00576 } DownlinkControl; 00577 00578 /** 00579 * Frame type of packet 00580 */ 00581 typedef enum { 00582 FRAME_TYPE_JOIN_REQ = 0x00, 00583 FRAME_TYPE_JOIN_ACCEPT = 0x01, 00584 FRAME_TYPE_DATA_UNCONFIRMED_UP = 0x02, 00585 FRAME_TYPE_DATA_UNCONFIRMED_DOWN = 0x03, 00586 FRAME_TYPE_DATA_CONFIRMED_UP = 0x04, 00587 FRAME_TYPE_DATA_CONFIRMED_DOWN = 0x05, 00588 FRAME_TYPE_RFU = 0x06, 00589 FRAME_TYPE_PROPRIETARY = 0x07, 00590 } FrameType; 00591 00592 /** 00593 * LoRaWAN mote MAC commands 00594 */ 00595 typedef enum { 00596 /* Class A */ 00597 MOTE_MAC_LINK_CHECK_REQ = 0x02, 00598 MOTE_MAC_LINK_ADR_ANS = 0x03, 00599 MOTE_MAC_DUTY_CYCLE_ANS = 0x04, 00600 MOTE_MAC_RX_PARAM_SETUP_ANS = 0x05, 00601 MOTE_MAC_DEV_STATUS_ANS = 0x06, 00602 MOTE_MAC_NEW_CHANNEL_ANS = 0x07, 00603 MOTE_MAC_RX_TIMING_SETUP_ANS = 0x08, 00604 MOTE_MAC_TX_PARAM_SETUP_ANS = 0x09, 00605 MOTE_MAC_DL_CHANNEL_ANS = 0x0A, 00606 00607 /* Class B */ 00608 MOTE_MAC_PING_SLOT_INFO_REQ = 0x0B, 00609 MOTE_MAC_PING_SLOT_FREQ_ANS = 0x0C, 00610 MOTE_MAC_PING_SLOT_CHANNEL_ANS = 0x0D, 00611 MOTE_MAC_BEACON_TIMING_REQ = 0x0E, 00612 MOTE_MAC_BEACON_FREQ_ANS = 0x0F, 00613 00614 /* Multitech */ 00615 MOTE_MAC_PING_REQ = 0x80, 00616 MOTE_MAC_CHANGE_CLASS = 0x81, 00617 MOTE_MAC_MULTIPART_START_REQ = 0x82, 00618 MOTE_MAC_MULTIPART_START_ANS = 0x83, 00619 MOTE_MAC_MULTIPART_CHUNK = 0x84, 00620 MOTE_MAC_MULTIPART_END_REQ = 0x85, 00621 MOTE_MAC_MULTIPART_END_ANS = 0x86 00622 } MoteCommand; 00623 00624 /*! 00625 * LoRaWAN server MAC commands 00626 */ 00627 typedef enum { 00628 /* Class A */ 00629 SRV_MAC_LINK_CHECK_ANS = 0x02, 00630 SRV_MAC_LINK_ADR_REQ = 0x03, 00631 SRV_MAC_DUTY_CYCLE_REQ = 0x04, 00632 SRV_MAC_RX_PARAM_SETUP_REQ = 0x05, 00633 SRV_MAC_DEV_STATUS_REQ = 0x06, 00634 SRV_MAC_NEW_CHANNEL_REQ = 0x07, 00635 SRV_MAC_RX_TIMING_SETUP_REQ = 0x08, 00636 SRV_MAC_TX_PARAM_SETUP_REQ = 0x09, 00637 SRV_MAC_DL_CHANNEL_REQ = 0x0A, 00638 00639 /* Class B */ 00640 SRV_MAC_PING_SLOT_INFO_ANS = 0x0B, 00641 SRV_MAC_PING_SLOT_FREQ_REQ = 0x0C, 00642 SRV_MAC_PING_SLOT_CHANNEL_REQ = 0x0D, 00643 SRV_MAC_BEACON_TIMING_ANS = 0x0E, 00644 SRV_MAC_BEACON_FREQ_REQ = 0x0F, 00645 00646 /* Multitech */ 00647 SRV_MAC_PING_ANS = 0x80, 00648 SRV_MAC_CHANGE_CLASS = 0x81, 00649 SRV_MAC_MULTIPART_START_REQ = 0x82, 00650 SRV_MAC_MULTIPART_START_ANS = 0x83, 00651 SRV_MAC_MULTIPART_CHUNK = 0x84, 00652 SRV_MAC_MULTIPART_END_REQ = 0x85, 00653 SRV_MAC_MULTIPART_END_ANS = 0x86 00654 } ServerCommand; 00655 00656 /** 00657 * Random seed for software RNG 00658 */ 00659 void srand(uint32_t seed); 00660 00661 /** 00662 * Software RNG for consistent results across differing hardware 00663 */ 00664 int rand(void); 00665 00666 /** 00667 * Generate random number bounded by min and max 00668 */ 00669 int32_t rand_r(int32_t min, int32_t max); 00670 00671 uint8_t CountBits(uint16_t mask); 00672 00673 /** 00674 * Copy 3-bytes network order from array into LSB of integer value 00675 */ 00676 void CopyNetIDtoInt(const uint8_t* arr, uint32_t& val); 00677 00678 /** 00679 * Copy LSB 3-bytes from integer value into array network order 00680 */ 00681 void CopyNetIDtoArray(uint32_t val, uint8_t* arr); 00682 00683 /** 00684 * Copy 4-bytes network order from array in to integer value 00685 */ 00686 void CopyAddrtoInt(const uint8_t* arr, uint32_t& val); 00687 00688 /** 00689 * Copy 4-bytes from integer in to array network order 00690 */ 00691 void CopyAddrtoArray(uint32_t val, uint8_t* arr); 00692 00693 /** 00694 * Copy 3-bytes network order from array into integer value and multiply by 100 00695 */ 00696 void CopyFreqtoInt(const uint8_t* arr, uint32_t& freq); 00697 00698 /** 00699 * Reverse memory copy 00700 */ 00701 void memcpy_r(uint8_t *dst, const uint8_t *src, size_t n); 00702 00703 } 00704 00705 #endif 00706
Generated on Sun Jul 17 2022 03:09:03 by 1.7.2