MultiTech / libmDot-Custom

Fork of libmDot-custom by Jason Reiss

Information

Library has been updated to mbed 5.x

The LoRaWAN Certification test mode implementation is built-in to libmDot code. When a start test mode packet is received the library will not return until test mode has ended.

Warning

This library is currently in BETA release. Unresolved issues may be experienced. Software is provided as is with no expectation of support of bug fixes in the future. Please report issues found through the mbed website or directly to support.multitech.com.

Changing of channel plan parameters may cause the device to no longer respect local RF regulations. Please use caution and respect your local regulations.

In AT Command Firmware remove line 803.

CommandTerminal/CommandTerminal.cpp

        delete[] info->RxBuffer;

Likewise, if your application is handling events from the library asynchronously.

Creating new channel plans

Copy EU868 or US915 custom channel plan as a starting point

Import programmDot_AT_firmware_CUSTOM

AT Firmware with custom channel plan support

EU868 provides a framework for a DYNAMIC channel plan with duty-cycle limitations

US915 provides a framework for a FIXED channel plan

RADIO_POWERS are measured output in dBm for each radio tx power setting.

Additional MAC Commands can be implemented by overriding the HandleMacCommand function.

Steps

  1. Setup datarates, duty-cycle bands and channels in ChannelPlan_* constructor
  2. Modify GetJoinDatarate and CalculateJoinBackoff to change join datarates and backoff
  3. Customize HandleJoinAccept datarates
  4. Use GetRxWindow(int) to define how the device open Rx window 1 and 2
  5. GetNextChannel will pick a channel from the enabled channel at the current datarate before each TX
Committer:
jreiss
Date:
Wed Jan 18 13:35:33 2017 +0000
Revision:
25:36d92b31ad2b
Parent:
Lora.h@23:3830a5f61f09
Add appkey and appeui functions; Add dwelltime and maxeirp getters/setters; KR920: max DR 7; AS923: max tx power 36 and maxeirp 20 defaults

Who changed what in which revision?

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