the node firmware of ChiaYi Xingang
Lora.h@68:34f40174207a, 2020-08-20 (annotated)
- Committer:
- jialiang8455
- Date:
- Thu Aug 20 01:33:08 2020 +0000
- Revision:
- 68:34f40174207a
- Parent:
- 65:acc0468b9aec
for ChiaYi Xingang
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Mike Fiore |
16:b630e18103e5 | 1 | /** __ ___ ____ _ ______ __ ____ __ ____ |
Mike Fiore |
16:b630e18103e5 | 2 | * / |/ /_ __/ / /_(_)__/_ __/__ ____/ / / __/_ _____ / /____ __ _ ___ / _/__ ____ |
Mike Fiore |
16:b630e18103e5 | 3 | * / /|_/ / // / / __/ /___// / / -_) __/ _ \ _\ \/ // (_-</ __/ -_) ' \(_-< _/ // _ \/ __/ __ |
Mike Fiore |
16:b630e18103e5 | 4 | * /_/ /_/\_,_/_/\__/_/ /_/ \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/ |
Mike Fiore |
16:b630e18103e5 | 5 | * Copyright (C) 2015 by Multi-Tech Systems /___/ |
Mike Fiore |
16:b630e18103e5 | 6 | * |
Mike Fiore |
16:b630e18103e5 | 7 | * |
Mike Fiore |
16:b630e18103e5 | 8 | * @author Jason Reiss |
Mike Fiore |
16:b630e18103e5 | 9 | * @date 10-31-2015 |
Mike Fiore |
16:b630e18103e5 | 10 | * @brief lora namespace defines global settings, structures and enums for the lora library |
Mike Fiore |
16:b630e18103e5 | 11 | * |
Mike Fiore |
16:b630e18103e5 | 12 | * @details |
Mike Fiore |
16:b630e18103e5 | 13 | * |
Mike Fiore |
16:b630e18103e5 | 14 | * |
Mike Fiore |
16:b630e18103e5 | 15 | * |
Mike Fiore |
16:b630e18103e5 | 16 | */ |
Mike Fiore |
16:b630e18103e5 | 17 | |
Mike Fiore |
16:b630e18103e5 | 18 | #ifndef __LORA_H__ |
Mike Fiore |
16:b630e18103e5 | 19 | #define __LORA_H__ |
Mike Fiore |
16:b630e18103e5 | 20 | |
Mike Fiore |
16:b630e18103e5 | 21 | #include "mbed.h" |
Mike Fiore |
16:b630e18103e5 | 22 | #include <assert.h> |
Mike Fiore |
16:b630e18103e5 | 23 | #include "MTSLog.h" |
Mike Fiore |
16:b630e18103e5 | 24 | //#include <cstring> |
Mike Fiore |
16:b630e18103e5 | 25 | #include <inttypes.h> |
Mike Fiore |
16:b630e18103e5 | 26 | |
Mike Fiore |
16:b630e18103e5 | 27 | namespace lora { |
Mike Fiore |
16:b630e18103e5 | 28 | |
Mike Fiore |
16:b630e18103e5 | 29 | /** |
Mike Fiore |
16:b630e18103e5 | 30 | * Frequency bandwidth of a Datarate, higher bandwidth gives higher datarate |
Mike Fiore |
16:b630e18103e5 | 31 | */ |
Mike Fiore |
16:b630e18103e5 | 32 | enum Bandwidth { |
Mike Fiore |
16:b630e18103e5 | 33 | BW_125, |
Mike Fiore |
16:b630e18103e5 | 34 | BW_250, |
Mike Fiore |
16:b630e18103e5 | 35 | BW_500, |
Mike Fiore |
16:b630e18103e5 | 36 | BW_FSK = 50 |
Mike Fiore |
16:b630e18103e5 | 37 | }; |
Mike Fiore |
16:b630e18103e5 | 38 | |
Mike Fiore |
16:b630e18103e5 | 39 | /** |
Mike Fiore |
16:b630e18103e5 | 40 | * Spreading factor of a Datarate, lower spreading factor gives higher datarate |
Mike Fiore |
16:b630e18103e5 | 41 | */ |
Mike Fiore |
16:b630e18103e5 | 42 | enum SpreadingFactors { |
Mike Fiore |
16:b630e18103e5 | 43 | SF_6 = 6, |
Mike Fiore |
16:b630e18103e5 | 44 | SF_7, |
Mike Fiore |
16:b630e18103e5 | 45 | SF_8, |
Mike Fiore |
16:b630e18103e5 | 46 | SF_9, |
Mike Fiore |
16:b630e18103e5 | 47 | SF_10, |
Mike Fiore |
16:b630e18103e5 | 48 | SF_11, |
Mike Fiore |
16:b630e18103e5 | 49 | SF_12, |
Mike Fiore |
16:b630e18103e5 | 50 | SF_FSK, |
Mike Fiore |
16:b630e18103e5 | 51 | SF_INVALID |
Mike Fiore |
16:b630e18103e5 | 52 | }; |
Mike Fiore |
16:b630e18103e5 | 53 | |
Mike Fiore |
16:b630e18103e5 | 54 | /** |
Mike Fiore |
16:b630e18103e5 | 55 | * Datarates for use with ChannelPlan |
Mike Fiore |
16:b630e18103e5 | 56 | */ |
Mike Fiore |
16:b630e18103e5 | 57 | enum Datarates { |
Mike Fiore |
16:b630e18103e5 | 58 | DR_0 = 0, |
Mike Fiore |
16:b630e18103e5 | 59 | DR_1, |
Mike Fiore |
16:b630e18103e5 | 60 | DR_2, |
Mike Fiore |
16:b630e18103e5 | 61 | DR_3, |
Mike Fiore |
16:b630e18103e5 | 62 | DR_4, |
Mike Fiore |
16:b630e18103e5 | 63 | DR_5, |
Mike Fiore |
16:b630e18103e5 | 64 | DR_6, |
Mike Fiore |
16:b630e18103e5 | 65 | DR_7, |
Mike Fiore |
16:b630e18103e5 | 66 | DR_8, |
Mike Fiore |
16:b630e18103e5 | 67 | DR_9, |
Mike Fiore |
16:b630e18103e5 | 68 | DR_10, |
Mike Fiore |
16:b630e18103e5 | 69 | DR_11, |
Mike Fiore |
16:b630e18103e5 | 70 | DR_12, |
Mike Fiore |
16:b630e18103e5 | 71 | DR_13, |
Mike Fiore |
16:b630e18103e5 | 72 | DR_14, |
Mike Fiore |
16:b630e18103e5 | 73 | DR_15 |
Mike Fiore |
16:b630e18103e5 | 74 | }; |
Mike Fiore |
16:b630e18103e5 | 75 | |
Mike Fiore |
16:b630e18103e5 | 76 | const uint8_t MIN_DATARATE = (uint8_t) DR_0; //!< Minimum datarate |
Mike Fiore |
16:b630e18103e5 | 77 | |
Mike Fiore |
16:b630e18103e5 | 78 | |
Mike Fiore |
16:b630e18103e5 | 79 | const uint8_t MAX_PHY_PACKET_SIZE = 255; //!< Maximum size for a packet |
Mike Fiore |
16:b630e18103e5 | 80 | const uint8_t MAX_APPS = 8; //!< Maximum number of apps sessions to save |
Mike Fiore |
16:b630e18103e5 | 81 | const uint8_t MAX_MULTICAST_SESSIONS = 8; //!< Maximum number of multicast sessions to save |
Mike Fiore |
16:b630e18103e5 | 82 | const uint8_t EUI_SIZE = 8; //!< Number of bytes in an EUI |
Mike Fiore |
16:b630e18103e5 | 83 | const uint8_t KEY_SIZE = 16; //!< Number of bytes in an AES key |
Mike Fiore |
16:b630e18103e5 | 84 | |
Mike Fiore |
16:b630e18103e5 | 85 | const uint8_t DEFAULT_NUM_CHANNELS = 16; //!< Default number of channels in a plan |
Mike Fiore |
16:b630e18103e5 | 86 | const uint8_t DEFAULT_RX1_DR_OFFSET = 0; //!< Default datarate offset for first rx window |
Mike Fiore |
16:b630e18103e5 | 87 | const uint8_t DEFAULT_RX2_DATARATE = 0; //!< Default datarate for second rx window |
Mike Fiore |
16:b630e18103e5 | 88 | const uint8_t DEFAULT_TX_POWER = 14; //!< Default transmit power |
Mike Fiore |
16:b630e18103e5 | 89 | const uint8_t DEFAULT_CODE_RATE = 1; //!< Default coding rate 1:4/5, 2:4/6, 3:4/7, 4:4/8 |
Mike Fiore |
16:b630e18103e5 | 90 | const uint8_t DEFAULT_PREAMBLE_LEN = 8; //!< Default preamble length |
Mike Fiore |
16:b630e18103e5 | 91 | |
Mike Fiore |
16:b630e18103e5 | 92 | const int32_t MAX_FCNT_GAP = 16384; //!< Maximum allowed gap in sequence numbers before roll-over |
Mike Fiore |
16:b630e18103e5 | 93 | |
Mike Fiore |
16:b630e18103e5 | 94 | const uint16_t PRIVATE_JOIN_DELAY = 1000; //!< Default join delay used for private network |
Mike Fiore |
16:b630e18103e5 | 95 | const uint16_t PUBLIC_JOIN_DELAY = 5000; //!< Default join delay used for public network |
Mike Fiore |
16:b630e18103e5 | 96 | const uint16_t DEFAULT_JOIN_DELAY = PRIVATE_JOIN_DELAY; //!< Default join delay1 |
Mike Fiore |
16:b630e18103e5 | 97 | const uint16_t DEFAULT_RX_DELAY = 1000; //!< Default delay for first receive window |
Mike Fiore |
16:b630e18103e5 | 98 | const uint16_t DEFAULT_RX_TIMEOUT = 3000; //!< Default timeout for receive windows |
Mike Fiore |
16:b630e18103e5 | 99 | |
Mike Fiore |
16:b630e18103e5 | 100 | const uint8_t HI_DR_SYMBOL_TIMEOUT = 12; //!< Symbol timeout for receive at datarate with SF < 11 |
Mike Fiore |
16:b630e18103e5 | 101 | const uint8_t LO_DR_SYMBOL_TIMEOUT = 8; //!< Symbol timeout for receive at datarate with SF > 10 |
Mike Fiore |
16:b630e18103e5 | 102 | |
Mike Fiore |
16:b630e18103e5 | 103 | const uint16_t RX2_DELAY_OFFSET = 1000; //!< Delay between first and second window |
Mike Fiore |
16:b630e18103e5 | 104 | const uint16_t RXC_OFFSET = 50; //!< Time between end of RXC after TX and RX1 |
Mike Fiore |
16:b630e18103e5 | 105 | |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 106 | const uint16_t BEACON_PREAMBLE_LENGTH = 10U; //!< Beacon preamble length |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 107 | const uint16_t DEFAULT_BEACON_PERIOD = 128U; //!< Default period of the beacon (in seconds) |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 108 | const uint16_t PING_SLOT_LENGTH = 30U; //!< Duration of each class B ping slot (in milliseconds) |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 109 | const uint16_t BEACON_RESERVED_TIME = 2120U; //!< Time reserved for beacon broadcast (in milliseconds) |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 110 | const uint16_t BEACON_GUARD_TIME = 3000U; //!< Guard time before beacon transmission where no ping slots can be scheduled (in milliseconds) |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 111 | const uint32_t MAX_BEACONLESS_OP_TIME = 7200U; //!< Maximum time to operate in class B since last beacon received (in seconds) |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 112 | const uint16_t MAX_CLASS_B_WINDOW_GROWTH = 3U; //!< Maximum window growth factor for beacons and ping slots in beacon-less operation |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 113 | const uint16_t DEFAULT_PING_NB = 1U; //!< Default number of ping slots per beacon interval |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 114 | const uint16_t CLS_B_PAD = 15U; //!< Pad added to the beginning of ping slot rx windows (in milliseconds) |
Mike Fiore |
16:b630e18103e5 | 115 | |
Mike Fiore |
16:b630e18103e5 | 116 | const int16_t DEFAULT_FREE_CHAN_RSSI_THRESHOLD = -90; //!< Threshold for channel activity detection (CAD) dBm |
Mike Fiore |
16:b630e18103e5 | 117 | |
Mike Fiore |
16:b630e18103e5 | 118 | const uint8_t CHAN_MASK_SIZE = 16; //!< Number of bits in a channel mask |
Mike Fiore |
16:b630e18103e5 | 119 | const uint8_t COMMANDS_BUFFER_SIZE = 15; //!< Size of Mac Command buffer |
Mike Fiore |
16:b630e18103e5 | 120 | |
Mike Fiore |
16:b630e18103e5 | 121 | const uint8_t PKT_HEADER = 0; //!< Index to packet mHdr field |
Mike Fiore |
16:b630e18103e5 | 122 | const uint8_t PKT_ADDRESS = 1; //!< Index to first byte of packet address field |
Mike Fiore |
16:b630e18103e5 | 123 | const uint8_t PKT_FRAME_CONTROL = PKT_ADDRESS + 4; //!< Index to packet fCtrl field @see UplinkControl |
Mike Fiore |
16:b630e18103e5 | 124 | const uint8_t PKT_FRAME_COUNTER = PKT_FRAME_CONTROL + 1; //!< Index to packet frame counter field |
Mike Fiore |
16:b630e18103e5 | 125 | const uint8_t PKT_OPTIONS_START = PKT_FRAME_COUNTER + 2; //!< Index to start of optional mac commands |
Mike Fiore |
16:b630e18103e5 | 126 | |
Mike Fiore |
16:b630e18103e5 | 127 | const uint8_t PKT_JOIN_APP_NONCE = 1; //!< Index to application nonce in Join Accept message |
Mike Fiore |
16:b630e18103e5 | 128 | const uint8_t PKT_JOIN_NETWORK_ID = 4; //!< Index to network id in Join Accept message |
Mike Fiore |
16:b630e18103e5 | 129 | const uint8_t PKT_JOIN_NETWORK_ADDRESS = 7; //!< Index to network address in Join Accept message |
Mike Fiore |
16:b630e18103e5 | 130 | const uint8_t PKT_JOIN_DL_SETTINGS = 11; //!< Index to downlink settings in Join Accept message |
Mike Fiore |
16:b630e18103e5 | 131 | const uint8_t PKT_JOIN_RX_DELAY = 12; //!< Index to rx delay in Join Accept message |
Mike Fiore |
16:b630e18103e5 | 132 | |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 133 | const uint8_t DEFAULT_ADR_ACK_LIMIT = 64; //!< Number of packets without ADR ACK Request |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 134 | const uint8_t DEFAULT_ADR_ACK_DELAY = 32; //!< Number of packets to expect ADR ACK Response within |
Mike Fiore |
16:b630e18103e5 | 135 | |
Mike Fiore |
16:b630e18103e5 | 136 | const uint16_t ACK_TIMEOUT = 2000; //!< Base millisecond timeout to resend after missed ACK |
Mike Fiore |
16:b630e18103e5 | 137 | const uint16_t ACK_TIMEOUT_RND = 1000; //!< Random millisecond adjustment to resend after missed ACK |
Mike Fiore |
16:b630e18103e5 | 138 | |
Mike Fiore |
16:b630e18103e5 | 139 | const uint8_t FRAME_OVERHEAD = 13; //!< Bytes of network info overhead in a frame |
Mike Fiore |
16:b630e18103e5 | 140 | |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 141 | const uint16_t MAX_OFF_AIR_WAIT = 5000U; //!< Max time in ms to block for a duty cycle restriction to expire before erroring out |
Mike Fiore |
16:b630e18103e5 | 142 | /** |
Mike Fiore |
16:b630e18103e5 | 143 | * Settings for type of network |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 144 | * |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 145 | * PRIVATE_MTS - Sync Word 0x12, US/AU Downlink frequencies per Frequency Sub Band |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 146 | * PUBLIC_LORAWAN - Sync Word 0x34 |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 147 | * PRIVATE_LORAWAN - Sync Word 0x12 |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 148 | * PEER_TO_PEER - Sync Word 0x56 used for Dot to Dot communication |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 149 | * |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 150 | * Join Delay window settings are independent of Network Type setting |
Mike Fiore |
16:b630e18103e5 | 151 | */ |
Mike Fiore |
16:b630e18103e5 | 152 | enum NetworkType { |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 153 | PRIVATE_MTS = 0, |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 154 | PUBLIC_LORAWAN = 1, |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 155 | PRIVATE_LORAWAN = 2, |
Mike Fiore |
16:b630e18103e5 | 156 | PEER_TO_PEER = 4 |
Mike Fiore |
16:b630e18103e5 | 157 | }; |
Mike Fiore |
16:b630e18103e5 | 158 | |
Mike Fiore |
16:b630e18103e5 | 159 | /** |
Mike Fiore |
16:b630e18103e5 | 160 | * Enum for on/off settings |
Mike Fiore |
16:b630e18103e5 | 161 | */ |
Mike Fiore |
16:b630e18103e5 | 162 | enum Enabled { |
Mike Fiore |
16:b630e18103e5 | 163 | OFF = 0, |
Mike Fiore |
16:b630e18103e5 | 164 | ON = 1 |
Mike Fiore |
16:b630e18103e5 | 165 | }; |
Mike Fiore |
16:b630e18103e5 | 166 | |
Mike Fiore |
16:b630e18103e5 | 167 | /** |
Mike Fiore |
16:b630e18103e5 | 168 | * Return status of mac functions |
Mike Fiore |
16:b630e18103e5 | 169 | */ |
Mike Fiore |
16:b630e18103e5 | 170 | enum MacStatus { |
Mike Fiore |
16:b630e18103e5 | 171 | LORA_OK = 0, |
Mike Fiore |
16:b630e18103e5 | 172 | LORA_ERROR = 1, |
Mike Fiore |
16:b630e18103e5 | 173 | LORA_JOIN_ERROR = 2, |
Mike Fiore |
16:b630e18103e5 | 174 | LORA_SEND_ERROR = 3, |
Mike Fiore |
16:b630e18103e5 | 175 | LORA_MIC_ERROR = 4, |
Mike Fiore |
16:b630e18103e5 | 176 | LORA_ADDRESS_ERROR = 5, |
Mike Fiore |
16:b630e18103e5 | 177 | LORA_NO_CHANS_ENABLED = 6, |
Mike Fiore |
16:b630e18103e5 | 178 | LORA_COMMAND_BUFFER_FULL = 7, |
Mike Fiore |
16:b630e18103e5 | 179 | LORA_UNKNOWN_MAC_COMMAND = 8, |
Mike Fiore |
16:b630e18103e5 | 180 | LORA_ADR_OFF = 9, |
Mike Fiore |
16:b630e18103e5 | 181 | LORA_BUSY = 10, |
Mike Fiore |
16:b630e18103e5 | 182 | LORA_LINK_BUSY = 11, |
Mike Fiore |
16:b630e18103e5 | 183 | LORA_RADIO_BUSY = 12, |
Mike Fiore |
16:b630e18103e5 | 184 | LORA_BUFFER_FULL = 13, |
Mike Fiore |
16:b630e18103e5 | 185 | LORA_JOIN_BACKOFF = 14, |
Mike Fiore |
16:b630e18103e5 | 186 | LORA_NO_FREE_CHAN = 15, |
Mike Fiore |
16:b630e18103e5 | 187 | LORA_AGGREGATED_DUTY_CYCLE = 16, |
Jenkins@KEILDM1.dc.multitech.prv | 26:17479e0039f6 | 188 | LORA_MAC_COMMAND_ERROR = 17, |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 189 | LORA_MAX_PAYLOAD_EXCEEDED = 18, |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 190 | LORA_LBT_CHANNEL_BUSY = 19 |
Mike Fiore |
16:b630e18103e5 | 191 | }; |
Mike Fiore |
16:b630e18103e5 | 192 | |
Mike Fiore |
16:b630e18103e5 | 193 | /** |
Mike Fiore |
16:b630e18103e5 | 194 | * State for Link |
Mike Fiore |
16:b630e18103e5 | 195 | */ |
Mike Fiore |
16:b630e18103e5 | 196 | enum LinkState { |
Mike Fiore |
16:b630e18103e5 | 197 | LINK_IDLE = 0, //!< Link ready to send or receive |
Mike Fiore |
16:b630e18103e5 | 198 | LINK_TX, //!< Link is busy sending |
Mike Fiore |
16:b630e18103e5 | 199 | LINK_ACK_TX, //!< Link is busy resending after missed ACK |
Mike Fiore |
16:b630e18103e5 | 200 | LINK_REP_TX, //!< Link is busy repeating |
Mike Fiore |
16:b630e18103e5 | 201 | LINK_RX, //!< Link has receive window open |
Mike Fiore |
16:b630e18103e5 | 202 | LINK_RX1, //!< Link has first received window open |
Mike Fiore |
16:b630e18103e5 | 203 | LINK_RX2, //!< Link has second received window open |
Mike Fiore |
16:b630e18103e5 | 204 | LINK_RXC, //!< Link has class C received window open |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 205 | LINK_RX_BEACON, //!< Link has a beacon receive window open |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 206 | LINK_RX_PING, //!< Link has a ping slot receive window open |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 207 | LINK_P2P //!< Link is busy sending |
Mike Fiore |
16:b630e18103e5 | 208 | }; |
Mike Fiore |
16:b630e18103e5 | 209 | |
Mike Fiore |
16:b630e18103e5 | 210 | /** |
Mike Fiore |
16:b630e18103e5 | 211 | * State for MAC |
Mike Fiore |
16:b630e18103e5 | 212 | */ |
Mike Fiore |
16:b630e18103e5 | 213 | enum MacState { |
Mike Fiore |
16:b630e18103e5 | 214 | MAC_IDLE, |
Mike Fiore |
16:b630e18103e5 | 215 | MAC_RX1, |
Mike Fiore |
16:b630e18103e5 | 216 | MAC_RX2, |
Mike Fiore |
16:b630e18103e5 | 217 | MAC_RXC, |
jreiss | 17:306ffaa5d79b | 218 | MAC_TX, |
jreiss | 17:306ffaa5d79b | 219 | MAC_JOIN |
Mike Fiore |
16:b630e18103e5 | 220 | }; |
Mike Fiore |
16:b630e18103e5 | 221 | |
Mike Fiore |
16:b630e18103e5 | 222 | /** |
Mike Fiore |
16:b630e18103e5 | 223 | * Operation class for device |
Mike Fiore |
16:b630e18103e5 | 224 | */ |
Mike Fiore |
16:b630e18103e5 | 225 | enum MoteClass { |
Mike Fiore |
16:b630e18103e5 | 226 | CLASS_A = 0x00, //!< Device can only receive in windows opened after a transmit |
Mike Fiore |
16:b630e18103e5 | 227 | CLASS_B = 0x01, //!< Device can receive in windows sychronized with gateway beacon |
Mike Fiore |
16:b630e18103e5 | 228 | CLASS_C = 0x02 //!< Device can receive any time when not transmitting |
Mike Fiore |
16:b630e18103e5 | 229 | }; |
Mike Fiore |
16:b630e18103e5 | 230 | |
Mike Fiore |
16:b630e18103e5 | 231 | /** |
Mike Fiore |
16:b630e18103e5 | 232 | * Direction of a packet |
Mike Fiore |
16:b630e18103e5 | 233 | */ |
Mike Fiore |
16:b630e18103e5 | 234 | enum Direction { |
Mike Fiore |
16:b630e18103e5 | 235 | DIR_UP = 0, //!< Packet is sent from mote to gateway |
Mike Fiore |
16:b630e18103e5 | 236 | DIR_DOWN = 1, //!< Packet was received from gateway |
Mike Fiore |
16:b630e18103e5 | 237 | DIR_PEER = 2 //!< Packet was received from peer |
Mike Fiore |
16:b630e18103e5 | 238 | }; |
Mike Fiore |
16:b630e18103e5 | 239 | |
Mike Fiore |
16:b630e18103e5 | 240 | |
Mike Fiore |
16:b630e18103e5 | 241 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 242 | * Receive window used by Link |
Mike Fiore |
16:b630e18103e5 | 243 | */ |
Mike Fiore |
16:b630e18103e5 | 244 | enum ReceiveWindows { |
Mike Fiore |
16:b630e18103e5 | 245 | RX_1 = 1, //!< First receive window |
Mike Fiore |
16:b630e18103e5 | 246 | RX_2, //!< Second receive window |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 247 | RX_SLOT, //!< Ping slot receive window |
Mike Fiore |
16:b630e18103e5 | 248 | RX_BEACON, //!< Beacon receive window |
Jenkins@KEILDM1.dc.multitech.prv | 64:64982192a2af | 249 | RXC, //!< Class C continuous window |
Mike Fiore |
16:b630e18103e5 | 250 | RX_TEST |
Mike Fiore |
16:b630e18103e5 | 251 | }; |
Mike Fiore |
16:b630e18103e5 | 252 | |
Mike Fiore |
16:b630e18103e5 | 253 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 254 | * Beacon info descriptors for the GwSpecific Info field |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 255 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 256 | enum BeaconInfoDesc { |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 257 | GPS_FIRST_ANTENNA = 0, //!< GPS coordinates of the gateway's first antenna |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 258 | GPS_SECOND_ANTENNA, //!< GPS coordinates of the gateway's second antenna |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 259 | GPS_THIRD_ANTENNA, //!< GPS coordinates of the gateway's third antenna |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 260 | }; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 261 | |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 262 | /** |
Mike Fiore |
16:b630e18103e5 | 263 | * Datarate range for a Channel |
Mike Fiore |
16:b630e18103e5 | 264 | */ |
Mike Fiore |
16:b630e18103e5 | 265 | typedef union { |
Mike Fiore |
16:b630e18103e5 | 266 | int8_t Value; |
Mike Fiore |
16:b630e18103e5 | 267 | struct { |
Mike Fiore |
16:b630e18103e5 | 268 | int8_t Min :4; |
Mike Fiore |
16:b630e18103e5 | 269 | int8_t Max :4; |
Mike Fiore |
16:b630e18103e5 | 270 | } Fields; |
Mike Fiore |
16:b630e18103e5 | 271 | } DatarateRange; |
Mike Fiore |
16:b630e18103e5 | 272 | |
Mike Fiore |
16:b630e18103e5 | 273 | /** |
Mike Fiore |
16:b630e18103e5 | 274 | * Datarate used for transmitting and receiving |
Mike Fiore |
16:b630e18103e5 | 275 | */ |
Mike Fiore |
16:b630e18103e5 | 276 | typedef struct Datarate { |
Mike Fiore |
16:b630e18103e5 | 277 | uint8_t Index; |
Mike Fiore |
16:b630e18103e5 | 278 | uint8_t Bandwidth; |
Mike Fiore |
16:b630e18103e5 | 279 | uint8_t Coderate; |
Mike Fiore |
16:b630e18103e5 | 280 | uint8_t PreambleLength; |
Mike Fiore |
16:b630e18103e5 | 281 | uint8_t SpreadingFactor; |
Mike Fiore |
16:b630e18103e5 | 282 | uint8_t Crc; |
Mike Fiore |
16:b630e18103e5 | 283 | uint8_t TxIQ; |
Mike Fiore |
16:b630e18103e5 | 284 | uint8_t RxIQ; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 285 | uint8_t SymbolTimeout(uint16_t pad_ms = 0); |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 286 | float Timeout(); |
Mike Fiore |
16:b630e18103e5 | 287 | Datarate(); |
Mike Fiore |
16:b630e18103e5 | 288 | } Datarate; |
Mike Fiore |
16:b630e18103e5 | 289 | |
Mike Fiore |
16:b630e18103e5 | 290 | /** |
Mike Fiore |
16:b630e18103e5 | 291 | * Channel used for transmitting |
Mike Fiore |
16:b630e18103e5 | 292 | */ |
Mike Fiore |
16:b630e18103e5 | 293 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 294 | uint8_t Index; |
Mike Fiore |
16:b630e18103e5 | 295 | uint32_t Frequency; |
Mike Fiore |
16:b630e18103e5 | 296 | DatarateRange DrRange; |
Mike Fiore |
16:b630e18103e5 | 297 | } Channel; |
Mike Fiore |
16:b630e18103e5 | 298 | |
Mike Fiore |
16:b630e18103e5 | 299 | /** |
Mike Fiore |
16:b630e18103e5 | 300 | * Receive window |
Mike Fiore |
16:b630e18103e5 | 301 | */ |
Mike Fiore |
16:b630e18103e5 | 302 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 303 | uint8_t Index; |
Mike Fiore |
16:b630e18103e5 | 304 | uint32_t Frequency; |
Mike Fiore |
16:b630e18103e5 | 305 | uint8_t DatarateIndex; |
Mike Fiore |
16:b630e18103e5 | 306 | } RxWindow; |
Mike Fiore |
16:b630e18103e5 | 307 | |
Mike Fiore |
16:b630e18103e5 | 308 | /** |
Mike Fiore |
16:b630e18103e5 | 309 | * Duty band for limiting time-on-air for regional regulations |
Mike Fiore |
16:b630e18103e5 | 310 | */ |
Mike Fiore |
16:b630e18103e5 | 311 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 312 | uint8_t Index; |
Mike Fiore |
16:b630e18103e5 | 313 | uint32_t FrequencyMin; |
Mike Fiore |
16:b630e18103e5 | 314 | uint32_t FrequencyMax; |
Mike Fiore |
16:b630e18103e5 | 315 | uint8_t PowerMax; |
Mike Fiore |
16:b630e18103e5 | 316 | uint16_t DutyCycle; //!< Multiplier of time on air, 0:100%, 1:50%, 2:33%, 10:10%, 100:1%, 1000,0.1% |
Mike Fiore |
16:b630e18103e5 | 317 | uint32_t TimeOffEnd; //!< Timestamp when this band will be available |
Mike Fiore |
16:b630e18103e5 | 318 | } DutyBand; |
Mike Fiore |
16:b630e18103e5 | 319 | |
Mike Fiore |
16:b630e18103e5 | 320 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 321 | * Beacon data content (w/o CRCs and RFUs) |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 322 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 323 | typedef struct { |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 324 | uint32_t Time; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 325 | uint8_t InfoDesc; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 326 | uint32_t Latitude; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 327 | uint32_t Longitude; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 328 | } BeaconData_t; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 329 | |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 330 | /** |
Mike Fiore |
16:b630e18103e5 | 331 | * Device configuration |
Mike Fiore |
16:b630e18103e5 | 332 | */ |
Mike Fiore |
16:b630e18103e5 | 333 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 334 | uint8_t FrequencyBand; //!< Used to choose ChannelPlan |
Mike Fiore |
16:b630e18103e5 | 335 | uint8_t EUI[8]; //!< Unique identifier assigned to device |
Mike Fiore |
16:b630e18103e5 | 336 | } DeviceConfig; |
Mike Fiore |
16:b630e18103e5 | 337 | |
Mike Fiore |
16:b630e18103e5 | 338 | /** |
Mike Fiore |
16:b630e18103e5 | 339 | * Network configuration |
Mike Fiore |
16:b630e18103e5 | 340 | */ |
Mike Fiore |
16:b630e18103e5 | 341 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 342 | uint8_t Mode; //!< PUBLIC, PRIVATE or PEER_TO_PEER network mode |
Mike Fiore |
16:b630e18103e5 | 343 | uint8_t Class; //!< Operating class of device |
Mike Fiore |
16:b630e18103e5 | 344 | uint8_t EUI[8]; //!< Network ID or AppEUI |
Mike Fiore |
16:b630e18103e5 | 345 | uint8_t Key[16]; //!< Network Key or AppKey |
Mike Fiore |
16:b630e18103e5 | 346 | uint8_t JoinDelay; //!< Number of seconds to wait before 1st RX Window |
Mike Fiore |
16:b630e18103e5 | 347 | uint8_t RxDelay; //!< Number of seconds to wait before 1st RX Window |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 348 | uint8_t FrequencySubBand; //!< FrequencySubBand used for US915 hybrid operation 0:72 channels, 1:1-8 channels ... |
Mike Fiore |
16:b630e18103e5 | 349 | uint8_t AckAttempts; //!< Number of attempts to send packet and receive an ACK from server |
Mike Fiore |
16:b630e18103e5 | 350 | uint8_t Retries; //!< Number of times to resend a packet without receiving an ACK, redundancy |
Mike Fiore |
16:b630e18103e5 | 351 | uint8_t ADREnabled; //!< Enable adaptive datarate |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 352 | uint16_t AdrAckLimit; //!< Number of uplinks without a downlink to allow before setting ADRACKReq |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 353 | uint16_t AdrAckDelay; //!< Number of downlinks to expect ADR ACK Response within |
Mike Fiore |
16:b630e18103e5 | 354 | uint8_t CADEnabled; //!< Enable listen before talk/channel activity detection |
Mike Fiore |
16:b630e18103e5 | 355 | uint8_t RepeaterMode; //!< Limit payloads to repeater compatible sizes |
Mike Fiore |
16:b630e18103e5 | 356 | uint8_t TxPower; //!< Default radio output power in dBm |
Mike Fiore |
16:b630e18103e5 | 357 | uint8_t TxPowerMax; //!< Max transmit power |
Mike Fiore |
16:b630e18103e5 | 358 | uint8_t TxDatarate; //!< Datarate for P2P transmit |
Mike Fiore |
16:b630e18103e5 | 359 | uint32_t TxFrequency; //!< Frequency for P2P transmit |
Mike Fiore |
16:b630e18103e5 | 360 | int8_t AntennaGain; //!< Antenna Gain |
Mike Fiore |
16:b630e18103e5 | 361 | uint8_t DisableEncryption; //!< Disable Encryption |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 362 | uint8_t DisableCRC; //!< Disable CRC on uplink packets |
Mike Fiore |
16:b630e18103e5 | 363 | uint16_t P2PACKTimeout; |
Mike Fiore |
16:b630e18103e5 | 364 | uint16_t P2PACKBackoff; |
Mike Fiore |
16:b630e18103e5 | 365 | uint8_t JoinRx1DatarateOffset; //!< Offset for datarate for first window |
Mike Fiore |
16:b630e18103e5 | 366 | uint32_t JoinRx2Frequency; //!< Frequency used in second window |
Mike Fiore |
16:b630e18103e5 | 367 | uint8_t JoinRx2DatarateIndex; //!< Datarate for second window |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 368 | uint8_t PingPeriodicity; //!< Number of ping slots to open in a beacon interval (2^(7-PingPeriodicity)) |
Mike Fiore |
16:b630e18103e5 | 369 | } NetworkConfig; |
Mike Fiore |
16:b630e18103e5 | 370 | |
Mike Fiore |
16:b630e18103e5 | 371 | /** |
Mike Fiore |
16:b630e18103e5 | 372 | * Network session info |
Mike Fiore |
16:b630e18103e5 | 373 | * Some settings are acquired in join message and others may be changed through Mac Commands from server |
Mike Fiore |
16:b630e18103e5 | 374 | */ |
Mike Fiore |
16:b630e18103e5 | 375 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 376 | uint8_t Joined; //!< State of session |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 377 | uint8_t Class; //!< Operating class of device |
Mike Fiore |
16:b630e18103e5 | 378 | uint8_t Rx1DatarateOffset; //!< Offset for datarate for first window |
Mike Fiore |
16:b630e18103e5 | 379 | uint32_t Rx2Frequency; //!< Frequency used in second window |
Mike Fiore |
16:b630e18103e5 | 380 | uint8_t Rx2DatarateIndex; //!< Datarate for second window |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 381 | uint32_t BeaconFrequency; //!< Frequency used for the beacon window |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 382 | bool BeaconFreqHop; //!< Beacon frequency hopping enable |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 383 | uint32_t PingSlotFrequency; //!< Frequency used for ping slot windows |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 384 | uint8_t PingSlotDatarateIndex; //!< Datarate for the ping slots |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 385 | bool PingSlotFreqHop; //!< Ping slot frequency hopping enable |
Mike Fiore |
16:b630e18103e5 | 386 | uint8_t TxPower; //!< Current total radiated output power in dBm |
Mike Fiore |
16:b630e18103e5 | 387 | uint8_t TxDatarate; //!< Current datarate can be changed when ADR is enabled |
Mike Fiore |
16:b630e18103e5 | 388 | uint32_t Address; //!< Network address |
Mike Fiore |
16:b630e18103e5 | 389 | uint32_t NetworkID; //!< Network ID 24-bits |
Mike Fiore |
16:b630e18103e5 | 390 | uint8_t NetworkSessionKey[16]; //!< Network session key |
Mike Fiore |
16:b630e18103e5 | 391 | uint8_t ApplicationSessionKey[16]; //!< Data session key |
Mike Fiore |
16:b630e18103e5 | 392 | uint16_t ChannelMask[4]; //!< Current channel mask |
Mike Fiore |
16:b630e18103e5 | 393 | uint16_t ChannelMask500k; //!< Current channel mask for 500k channels |
Mike Fiore |
16:b630e18103e5 | 394 | uint32_t DownlinkCounter; //!< Downlink counter of last packet received from server |
Mike Fiore |
16:b630e18103e5 | 395 | uint32_t UplinkCounter; //!< Uplink counter of last packet received from server |
Mike Fiore |
16:b630e18103e5 | 396 | uint8_t Redundancy; //!< Number of time to repeat an uplink |
Mike Fiore |
16:b630e18103e5 | 397 | uint8_t MaxDutyCycle; //!< Current Max Duty Cycle value |
Mike Fiore |
16:b630e18103e5 | 398 | uint32_t JoinTimeOnAir; //!< Balance of time on air used during join attempts |
Mike Fiore |
16:b630e18103e5 | 399 | uint32_t JoinTimeOffEnd; //!< RTC time of next join attempt |
Mike Fiore |
16:b630e18103e5 | 400 | uint32_t JoinFirstAttempt; //!< RTC time of first failed join attempt |
Mike Fiore |
16:b630e18103e5 | 401 | uint32_t AggregatedTimeOffEnd; //!< Time off air expiration for aggregate duty cycle |
Mike Fiore |
16:b630e18103e5 | 402 | uint16_t AggregateDutyCycle; //!< Used for enforcing time-on-air |
Mike Fiore |
16:b630e18103e5 | 403 | uint8_t AckCounter; //!< Current number of packets sent without ACK from server |
Mike Fiore |
16:b630e18103e5 | 404 | uint8_t AdrCounter; //!< Current number of packets received without downlink from server |
Mike Fiore |
16:b630e18103e5 | 405 | uint8_t RxDelay; //!< Number of seconds to wait before 1st RX Window |
Mike Fiore |
16:b630e18103e5 | 406 | uint8_t CommandBuffer[COMMANDS_BUFFER_SIZE]; //!< Buffer to hold Mac Commands and parameters to be sent in next packet |
Mike Fiore |
16:b630e18103e5 | 407 | uint8_t CommandBufferIndex; //!< Index to place next Mac Command, also current size of Command Buffer |
Mike Fiore |
16:b630e18103e5 | 408 | bool SrvRequestedAck; //!< Indicator of ACK requested by server in last packet received |
Mike Fiore |
16:b630e18103e5 | 409 | bool DataPending; //!< Indicator of data pending at server |
Mike Fiore |
16:b630e18103e5 | 410 | uint8_t RxTimingSetupReqReceived; //!< Indicator that RxTimingSetupAns should be included in uplink |
Mike Fiore |
16:b630e18103e5 | 411 | uint8_t RxParamSetupReqAnswer; //!< Indicator that RxParamSetupAns should be included in uplink |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 412 | uint8_t DlChannelReqAnswer; //!< Indicator that DlChannelAns should be included in uplink |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 413 | uint8_t DownlinkDwelltime; //!< On air dwell time for downlink packets 0:NONE,1:400ms |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 414 | uint8_t UplinkDwelltime; //!< On air dwell time for uplink packets 0:NONE,1:400ms |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 415 | uint8_t Max_EIRP; //!< Maximum allowed EIRP for uplink |
Mike Fiore |
16:b630e18103e5 | 416 | } NetworkSession; |
Mike Fiore |
16:b630e18103e5 | 417 | |
Mike Fiore |
16:b630e18103e5 | 418 | /** |
Mike Fiore |
16:b630e18103e5 | 419 | * Multicast session info |
Mike Fiore |
16:b630e18103e5 | 420 | */ |
Mike Fiore |
16:b630e18103e5 | 421 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 422 | uint32_t Address; //!< Network address |
Mike Fiore |
16:b630e18103e5 | 423 | uint8_t NetworkSessionKey[16]; //!< Network session key |
Mike Fiore |
16:b630e18103e5 | 424 | uint8_t DataSessionKey[16]; //!< Data session key |
Mike Fiore |
16:b630e18103e5 | 425 | uint32_t DownlinkCounter; //!< Downlink counter of last packet received from server |
Mike Fiore |
16:b630e18103e5 | 426 | } MulticastSession; |
Mike Fiore |
16:b630e18103e5 | 427 | |
Mike Fiore |
16:b630e18103e5 | 428 | /** |
Mike Fiore |
16:b630e18103e5 | 429 | * Statistics of current network session |
Mike Fiore |
16:b630e18103e5 | 430 | */ |
Mike Fiore |
16:b630e18103e5 | 431 | typedef struct Statistics { |
Mike Fiore |
16:b630e18103e5 | 432 | uint32_t Up; //!< Number of uplink packets sent |
Mike Fiore |
16:b630e18103e5 | 433 | uint32_t Down; //!< Number of downlink packets received |
Mike Fiore |
16:b630e18103e5 | 434 | uint32_t Joins; //!< Number of join requests sent |
Mike Fiore |
16:b630e18103e5 | 435 | uint32_t JoinFails; //!< Number of join requests without response or invalid response |
Mike Fiore |
16:b630e18103e5 | 436 | uint32_t MissedAcks; //!< Number of missed acknowledgement attempts of confirmed packets |
Mike Fiore |
16:b630e18103e5 | 437 | uint32_t CRCErrors; //!< Number of CRC errors in received packets |
Mike Fiore |
16:b630e18103e5 | 438 | int32_t AvgCount; //!< Number of packets used to compute rolling average of RSSI and SNR |
Mike Fiore |
16:b630e18103e5 | 439 | int16_t Rssi; //!< RSSI of last packet received |
Mike Fiore |
16:b630e18103e5 | 440 | int16_t RssiMin; //!< Minimum RSSI of last AvgCount packets |
Mike Fiore |
16:b630e18103e5 | 441 | int16_t RssiMax; //!< Maximum RSSI of last AvgCount packets |
Mike Fiore |
16:b630e18103e5 | 442 | int16_t RssiAvg; //!< Rolling average RSSI of last AvgCount packets |
Mike Fiore |
16:b630e18103e5 | 443 | int16_t Snr; //!< SNR of last packet received |
Mike Fiore |
16:b630e18103e5 | 444 | int16_t SnrMin; //!< Minimum SNR of last AvgCount packets |
Mike Fiore |
16:b630e18103e5 | 445 | int16_t SnrMax; //!< Maximum SNR of last AvgCount packets |
Mike Fiore |
16:b630e18103e5 | 446 | int16_t SnrAvg; //!< Rolling average SNR of last AvgCount packets |
Mike Fiore |
16:b630e18103e5 | 447 | } Statistics; |
Mike Fiore |
16:b630e18103e5 | 448 | |
Mike Fiore |
16:b630e18103e5 | 449 | /** |
Mike Fiore |
16:b630e18103e5 | 450 | * Testing settings |
Mike Fiore |
16:b630e18103e5 | 451 | */ |
Mike Fiore |
16:b630e18103e5 | 452 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 453 | uint8_t TestMode; |
Mike Fiore |
16:b630e18103e5 | 454 | uint8_t SkipMICCheck; |
Mike Fiore |
16:b630e18103e5 | 455 | uint8_t DisableDutyCycle; |
Mike Fiore |
16:b630e18103e5 | 456 | uint8_t DisableRx1; |
Mike Fiore |
16:b630e18103e5 | 457 | uint8_t DisableRx2; |
Mike Fiore |
16:b630e18103e5 | 458 | uint8_t FixedUplinkCounter; |
Mike Fiore |
16:b630e18103e5 | 459 | uint8_t DisableRandomJoinDatarate; |
Mike Fiore |
16:b630e18103e5 | 460 | } Testing; |
Mike Fiore |
16:b630e18103e5 | 461 | |
Mike Fiore |
16:b630e18103e5 | 462 | /** |
Mike Fiore |
16:b630e18103e5 | 463 | * Combination of device, network, testing settings and statistics |
Mike Fiore |
16:b630e18103e5 | 464 | */ |
Mike Fiore |
16:b630e18103e5 | 465 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 466 | DeviceConfig Device; |
Mike Fiore |
16:b630e18103e5 | 467 | NetworkConfig Network; |
Mike Fiore |
16:b630e18103e5 | 468 | NetworkSession Session; |
Mike Fiore |
16:b630e18103e5 | 469 | MulticastSession Multicast[MAX_MULTICAST_SESSIONS]; |
Mike Fiore |
16:b630e18103e5 | 470 | Statistics Stats; |
Mike Fiore |
16:b630e18103e5 | 471 | Testing Test; |
Mike Fiore |
16:b630e18103e5 | 472 | } Settings; |
Mike Fiore |
16:b630e18103e5 | 473 | |
Mike Fiore |
16:b630e18103e5 | 474 | /** |
Mike Fiore |
16:b630e18103e5 | 475 | * Downlink settings sent in Join Accept message |
Mike Fiore |
16:b630e18103e5 | 476 | */ |
Mike Fiore |
16:b630e18103e5 | 477 | typedef union { |
Mike Fiore |
16:b630e18103e5 | 478 | uint8_t Value; |
Mike Fiore |
16:b630e18103e5 | 479 | struct { |
Mike Fiore |
16:b630e18103e5 | 480 | uint8_t Rx2Datarate :4; |
Mike Fiore |
16:b630e18103e5 | 481 | uint8_t Rx1Offset :3; |
Mike Fiore |
16:b630e18103e5 | 482 | uint8_t RFU :1; |
Mike Fiore |
16:b630e18103e5 | 483 | }; |
Mike Fiore |
16:b630e18103e5 | 484 | } DownlinkSettings; |
Mike Fiore |
16:b630e18103e5 | 485 | |
Mike Fiore |
16:b630e18103e5 | 486 | /** |
Mike Fiore |
16:b630e18103e5 | 487 | * Frame structure for Join Request |
Mike Fiore |
16:b630e18103e5 | 488 | */ |
Mike Fiore |
16:b630e18103e5 | 489 | typedef struct { |
Mike Fiore |
16:b630e18103e5 | 490 | uint8_t Type; |
Mike Fiore |
16:b630e18103e5 | 491 | uint8_t AppEUI[8]; |
Mike Fiore |
16:b630e18103e5 | 492 | uint8_t DevEUI[8]; |
Mike Fiore |
16:b630e18103e5 | 493 | uint8_t Nonce[2]; |
Mike Fiore |
16:b630e18103e5 | 494 | uint8_t MIC[4]; |
Mike Fiore |
16:b630e18103e5 | 495 | } JoinRequestFrame; |
Mike Fiore |
16:b630e18103e5 | 496 | |
Mike Fiore |
16:b630e18103e5 | 497 | /** |
Mike Fiore |
16:b630e18103e5 | 498 | * Mac header of uplink and downlink packets |
Mike Fiore |
16:b630e18103e5 | 499 | */ |
Mike Fiore |
16:b630e18103e5 | 500 | typedef union { |
Mike Fiore |
16:b630e18103e5 | 501 | uint8_t Value; |
Mike Fiore |
16:b630e18103e5 | 502 | struct { |
Mike Fiore |
16:b630e18103e5 | 503 | uint8_t Major :2; |
Mike Fiore |
16:b630e18103e5 | 504 | uint8_t RFU :3; |
Mike Fiore |
16:b630e18103e5 | 505 | uint8_t MType :3; |
Mike Fiore |
16:b630e18103e5 | 506 | } Bits; |
Mike Fiore |
16:b630e18103e5 | 507 | } MacHeader; |
Mike Fiore |
16:b630e18103e5 | 508 | |
Mike Fiore |
16:b630e18103e5 | 509 | /** |
Mike Fiore |
16:b630e18103e5 | 510 | * Frame control field of uplink packets |
Mike Fiore |
16:b630e18103e5 | 511 | */ |
Mike Fiore |
16:b630e18103e5 | 512 | typedef union { |
Mike Fiore |
16:b630e18103e5 | 513 | uint8_t Value; |
Mike Fiore |
16:b630e18103e5 | 514 | struct { |
Mike Fiore |
16:b630e18103e5 | 515 | uint8_t OptionsLength :4; |
Mike Fiore |
16:b630e18103e5 | 516 | uint8_t ClassB :1; |
Mike Fiore |
16:b630e18103e5 | 517 | uint8_t Ack :1; |
Mike Fiore |
16:b630e18103e5 | 518 | uint8_t AdrAckReq :1; |
Mike Fiore |
16:b630e18103e5 | 519 | uint8_t Adr :1; |
Mike Fiore |
16:b630e18103e5 | 520 | } Bits; |
Mike Fiore |
16:b630e18103e5 | 521 | } UplinkControl; |
Mike Fiore |
16:b630e18103e5 | 522 | |
Mike Fiore |
16:b630e18103e5 | 523 | /** |
Mike Fiore |
16:b630e18103e5 | 524 | * Frame control field of downlink packets |
Mike Fiore |
16:b630e18103e5 | 525 | */ |
Mike Fiore |
16:b630e18103e5 | 526 | typedef union { |
Mike Fiore |
16:b630e18103e5 | 527 | uint8_t Value; |
Mike Fiore |
16:b630e18103e5 | 528 | struct { |
Mike Fiore |
16:b630e18103e5 | 529 | uint8_t OptionsLength :4; |
Mike Fiore |
16:b630e18103e5 | 530 | uint8_t FPending :1; |
Mike Fiore |
16:b630e18103e5 | 531 | uint8_t Ack :1; |
Mike Fiore |
16:b630e18103e5 | 532 | uint8_t RFU :1; |
Mike Fiore |
16:b630e18103e5 | 533 | uint8_t Adr :1; |
Mike Fiore |
16:b630e18103e5 | 534 | } Bits; |
Mike Fiore |
16:b630e18103e5 | 535 | } DownlinkControl; |
Mike Fiore |
16:b630e18103e5 | 536 | |
Mike Fiore |
16:b630e18103e5 | 537 | /** |
Mike Fiore |
16:b630e18103e5 | 538 | * Frame type of packet |
Mike Fiore |
16:b630e18103e5 | 539 | */ |
Mike Fiore |
16:b630e18103e5 | 540 | typedef enum { |
Mike Fiore |
16:b630e18103e5 | 541 | FRAME_TYPE_JOIN_REQ = 0x00, |
Mike Fiore |
16:b630e18103e5 | 542 | FRAME_TYPE_JOIN_ACCEPT = 0x01, |
Mike Fiore |
16:b630e18103e5 | 543 | FRAME_TYPE_DATA_UNCONFIRMED_UP = 0x02, |
Mike Fiore |
16:b630e18103e5 | 544 | FRAME_TYPE_DATA_UNCONFIRMED_DOWN = 0x03, |
Mike Fiore |
16:b630e18103e5 | 545 | FRAME_TYPE_DATA_CONFIRMED_UP = 0x04, |
Mike Fiore |
16:b630e18103e5 | 546 | FRAME_TYPE_DATA_CONFIRMED_DOWN = 0x05, |
Mike Fiore |
16:b630e18103e5 | 547 | FRAME_TYPE_RFU = 0x06, |
Mike Fiore |
16:b630e18103e5 | 548 | FRAME_TYPE_PROPRIETARY = 0x07, |
Mike Fiore |
16:b630e18103e5 | 549 | } FrameType; |
Mike Fiore |
16:b630e18103e5 | 550 | |
Mike Fiore |
16:b630e18103e5 | 551 | /** |
Mike Fiore |
16:b630e18103e5 | 552 | * LoRaWAN mote MAC commands |
Mike Fiore |
16:b630e18103e5 | 553 | */ |
Mike Fiore |
16:b630e18103e5 | 554 | typedef enum { |
Mike Fiore |
16:b630e18103e5 | 555 | /* Class A */ |
Mike Fiore |
16:b630e18103e5 | 556 | MOTE_MAC_LINK_CHECK_REQ = 0x02, |
Mike Fiore |
16:b630e18103e5 | 557 | MOTE_MAC_LINK_ADR_ANS = 0x03, |
Mike Fiore |
16:b630e18103e5 | 558 | MOTE_MAC_DUTY_CYCLE_ANS = 0x04, |
Mike Fiore |
16:b630e18103e5 | 559 | MOTE_MAC_RX_PARAM_SETUP_ANS = 0x05, |
Mike Fiore |
16:b630e18103e5 | 560 | MOTE_MAC_DEV_STATUS_ANS = 0x06, |
Mike Fiore |
16:b630e18103e5 | 561 | MOTE_MAC_NEW_CHANNEL_ANS = 0x07, |
Mike Fiore |
16:b630e18103e5 | 562 | MOTE_MAC_RX_TIMING_SETUP_ANS = 0x08, |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 563 | MOTE_MAC_TX_PARAM_SETUP_ANS = 0x09, |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 564 | MOTE_MAC_DL_CHANNEL_ANS = 0x0A, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 565 | MOTE_MAC_REKEY_IND = 0x0B, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 566 | MOTE_MAC_ADR_PARAM_SETUP_ANS = 0x0C, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 567 | MOTE_MAC_DEVICE_TIME_REQ = 0x0D, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 568 | MOTE_MAC_REJOIN_PARAM_SETUP_ANS = 0x0F, |
Mike Fiore |
16:b630e18103e5 | 569 | |
Mike Fiore |
16:b630e18103e5 | 570 | /* Class B */ |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 571 | MOTE_MAC_PING_SLOT_INFO_REQ = 0x10, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 572 | MOTE_MAC_PING_SLOT_CHANNEL_ANS = 0x11, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 573 | MOTE_MAC_BEACON_TIMING_REQ = 0x12, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 574 | MOTE_MAC_BEACON_FREQ_ANS = 0x13, |
Mike Fiore |
16:b630e18103e5 | 575 | |
Mike Fiore |
16:b630e18103e5 | 576 | /* Multitech */ |
Mike Fiore |
16:b630e18103e5 | 577 | MOTE_MAC_PING_REQ = 0x80, |
Mike Fiore |
16:b630e18103e5 | 578 | MOTE_MAC_CHANGE_CLASS = 0x81, |
Mike Fiore |
16:b630e18103e5 | 579 | MOTE_MAC_MULTIPART_START_REQ = 0x82, |
Mike Fiore |
16:b630e18103e5 | 580 | MOTE_MAC_MULTIPART_START_ANS = 0x83, |
Mike Fiore |
16:b630e18103e5 | 581 | MOTE_MAC_MULTIPART_CHUNK = 0x84, |
Mike Fiore |
16:b630e18103e5 | 582 | MOTE_MAC_MULTIPART_END_REQ = 0x85, |
Mike Fiore |
16:b630e18103e5 | 583 | MOTE_MAC_MULTIPART_END_ANS = 0x86 |
Mike Fiore |
16:b630e18103e5 | 584 | } MoteCommand; |
Mike Fiore |
16:b630e18103e5 | 585 | |
Mike Fiore |
16:b630e18103e5 | 586 | /*! |
Mike Fiore |
16:b630e18103e5 | 587 | * LoRaWAN server MAC commands |
Mike Fiore |
16:b630e18103e5 | 588 | */ |
Mike Fiore |
16:b630e18103e5 | 589 | typedef enum { |
Mike Fiore |
16:b630e18103e5 | 590 | /* Class A */ |
Mike Fiore |
16:b630e18103e5 | 591 | SRV_MAC_LINK_CHECK_ANS = 0x02, |
Mike Fiore |
16:b630e18103e5 | 592 | SRV_MAC_LINK_ADR_REQ = 0x03, |
Mike Fiore |
16:b630e18103e5 | 593 | SRV_MAC_DUTY_CYCLE_REQ = 0x04, |
Mike Fiore |
16:b630e18103e5 | 594 | SRV_MAC_RX_PARAM_SETUP_REQ = 0x05, |
Mike Fiore |
16:b630e18103e5 | 595 | SRV_MAC_DEV_STATUS_REQ = 0x06, |
Mike Fiore |
16:b630e18103e5 | 596 | SRV_MAC_NEW_CHANNEL_REQ = 0x07, |
Mike Fiore |
16:b630e18103e5 | 597 | SRV_MAC_RX_TIMING_SETUP_REQ = 0x08, |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 598 | SRV_MAC_TX_PARAM_SETUP_REQ = 0x09, |
Jenkins@KEILDM1.dc.multitech.prv | 60:7985b4783af9 | 599 | SRV_MAC_DL_CHANNEL_REQ = 0x0A, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 600 | SRV_MAC_REKEY_CONF = 0x0B, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 601 | SRV_MAC_ADR_PARAM_SETUP_REQ = 0x0C, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 602 | SRV_MAC_DEVICE_TIME_ANS = 0x0D, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 603 | SRV_MAC_FORCE_REJOIN_REQ = 0x0E, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 604 | SRV_MAC_REJOIN_PARAM_SETUP_REQ = 0x0F, |
Mike Fiore |
16:b630e18103e5 | 605 | |
Mike Fiore |
16:b630e18103e5 | 606 | /* Class B */ |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 607 | SRV_MAC_PING_SLOT_INFO_ANS = 0x10, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 608 | SRV_MAC_PING_SLOT_CHANNEL_REQ = 0x11, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 609 | SRV_MAC_BEACON_TIMING_ANS = 0x12, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 610 | SRV_MAC_BEACON_FREQ_REQ = 0x13, |
Mike Fiore |
16:b630e18103e5 | 611 | |
Mike Fiore |
16:b630e18103e5 | 612 | /* Multitech */ |
Mike Fiore |
16:b630e18103e5 | 613 | SRV_MAC_PING_ANS = 0x80, |
Mike Fiore |
16:b630e18103e5 | 614 | SRV_MAC_CHANGE_CLASS = 0x81, |
Mike Fiore |
16:b630e18103e5 | 615 | SRV_MAC_MULTIPART_START_REQ = 0x82, |
Mike Fiore |
16:b630e18103e5 | 616 | SRV_MAC_MULTIPART_START_ANS = 0x83, |
Mike Fiore |
16:b630e18103e5 | 617 | SRV_MAC_MULTIPART_CHUNK = 0x84, |
Mike Fiore |
16:b630e18103e5 | 618 | SRV_MAC_MULTIPART_END_REQ = 0x85, |
Mike Fiore |
16:b630e18103e5 | 619 | SRV_MAC_MULTIPART_END_ANS = 0x86 |
Mike Fiore |
16:b630e18103e5 | 620 | } ServerCommand; |
Mike Fiore |
16:b630e18103e5 | 621 | |
Mike Fiore |
16:b630e18103e5 | 622 | /** |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 623 | * Radio configuration options |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 624 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 625 | typedef enum RadioCfg { |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 626 | NO_RADIO_CFG, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 627 | TX_RADIO_CFG, |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 628 | RX_RADIO_CFG |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 629 | } RadioCfg_t; |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 630 | |
Jenkins@KEILDM1.dc.multitech.prv | 65:acc0468b9aec | 631 | /** |
Mike Fiore |
16:b630e18103e5 | 632 | * Random seed for software RNG |
Mike Fiore |
16:b630e18103e5 | 633 | */ |
Mike Fiore |
16:b630e18103e5 | 634 | void srand(uint32_t seed); |
Mike Fiore |
16:b630e18103e5 | 635 | |
Mike Fiore |
16:b630e18103e5 | 636 | /** |
Mike Fiore |
16:b630e18103e5 | 637 | * Software RNG for consistent results across differing hardware |
Mike Fiore |
16:b630e18103e5 | 638 | */ |
Mike Fiore |
16:b630e18103e5 | 639 | int rand(void); |
Mike Fiore |
16:b630e18103e5 | 640 | |
Mike Fiore |
16:b630e18103e5 | 641 | /** |
Mike Fiore |
16:b630e18103e5 | 642 | * Generate random number bounded by min and max |
Mike Fiore |
16:b630e18103e5 | 643 | */ |
Mike Fiore |
16:b630e18103e5 | 644 | int32_t rand_r(int32_t min, int32_t max); |
Mike Fiore |
16:b630e18103e5 | 645 | |
Mike Fiore |
16:b630e18103e5 | 646 | uint8_t CountBits(uint16_t mask); |
Mike Fiore |
16:b630e18103e5 | 647 | |
Mike Fiore |
16:b630e18103e5 | 648 | /** |
Mike Fiore |
16:b630e18103e5 | 649 | * Copy 3-bytes network order from array into LSB of integer value |
Mike Fiore |
16:b630e18103e5 | 650 | */ |
Mike Fiore |
16:b630e18103e5 | 651 | void CopyNetIDtoInt(const uint8_t* arr, uint32_t& val); |
Mike Fiore |
16:b630e18103e5 | 652 | |
Mike Fiore |
16:b630e18103e5 | 653 | /** |
Mike Fiore |
16:b630e18103e5 | 654 | * Copy LSB 3-bytes from integer value into array network order |
Mike Fiore |
16:b630e18103e5 | 655 | */ |
Mike Fiore |
16:b630e18103e5 | 656 | void CopyNetIDtoArray(uint32_t val, uint8_t* arr); |
Mike Fiore |
16:b630e18103e5 | 657 | |
Mike Fiore |
16:b630e18103e5 | 658 | /** |
Mike Fiore |
16:b630e18103e5 | 659 | * Copy 4-bytes network order from array in to integer value |
Mike Fiore |
16:b630e18103e5 | 660 | */ |
Mike Fiore |
16:b630e18103e5 | 661 | void CopyAddrtoInt(const uint8_t* arr, uint32_t& val); |
Mike Fiore |
16:b630e18103e5 | 662 | |
Mike Fiore |
16:b630e18103e5 | 663 | /** |
Mike Fiore |
16:b630e18103e5 | 664 | * Copy 4-bytes from integer in to array network order |
Mike Fiore |
16:b630e18103e5 | 665 | */ |
Mike Fiore |
16:b630e18103e5 | 666 | void CopyAddrtoArray(uint32_t val, uint8_t* arr); |
Mike Fiore |
16:b630e18103e5 | 667 | |
Mike Fiore |
16:b630e18103e5 | 668 | /** |
Mike Fiore |
16:b630e18103e5 | 669 | * Copy 3-bytes network order from array into integer value and multiply by 100 |
Mike Fiore |
16:b630e18103e5 | 670 | */ |
Mike Fiore |
16:b630e18103e5 | 671 | void CopyFreqtoInt(const uint8_t* arr, uint32_t& freq); |
Mike Fiore |
16:b630e18103e5 | 672 | |
Mike Fiore |
16:b630e18103e5 | 673 | /** |
Mike Fiore |
16:b630e18103e5 | 674 | * Reverse memory copy |
Mike Fiore |
16:b630e18103e5 | 675 | */ |
Mike Fiore |
16:b630e18103e5 | 676 | void memcpy_r(uint8_t *dst, const uint8_t *src, size_t n); |
Mike Fiore |
16:b630e18103e5 | 677 | |
Mike Fiore |
16:b630e18103e5 | 678 | } |
Mike Fiore |
16:b630e18103e5 | 679 | |
Mike Fiore |
16:b630e18103e5 | 680 | #endif |
Mike Fiore |
16:b630e18103e5 | 681 |