fota lib for mdot

Dependents:   UQ_LoraWAN

Committer:
Jenkins@KEILDM1.dc.multitech.prv
Date:
Fri Sep 14 15:39:09 2018 -0500
Revision:
3:63d10f2375ea
fota lib updates

Who changed what in which revision?

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