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