Bleeding edge development version of the mDot library for mbed 5. This version of the library is not guaranteed to be stable or well tested and should not be used in production or deployment scenarios.

Dependents:   mDot-IKS01A1 mDot-IKS01A1 mDot-Examples mDot-IKS01A1-Explora ... more

Fork of libmDot-dev-mbed2-deprecated by MultiTech

The Dot library provides a LoRaWan certified stack for LoRa communication using MultiTech mDot and xDot devices. The stack is compatible with mbed 5.

Dot Library Version 3 Updates

Dot Library versions 3.x.x require a channel plan to be injected into the stack. Channel plans are included with the 3.x.x Dot Library releases. The following code snippet demonstrates how to create a channel plan and inject it into the stack.

#include "mDot.h"
#include "channel_plans.h"

int main() {
    ChannelPlan* plan = new lora::ChannelPlan_US915();
    assert(plan);
    mDot* dot = mDot::getInstance(plan);
    assert(dot);

    // ...
}

Dot devices must not be deployed with software using a different channel plan than the Dot's default plan! This functionality is for development and testing only!

Multicast Sessions

Multicast sessions and packet rx events in library. When in Class C mode Multicast downlinks can be received. Recieved packets should be filtered on address, counter value will be maintained in the session or can be set explicitly depending on Application support to share Multicast Address, Keys and Counters.

mDot.h

        /**
         * Add a multicast session address and keys
         * Downlink counter is set to 0
         * Up to 3 MULTICAST_SESSIONS can be set
         */
        int32_t setMulticastSession(uint8_t index, uint32_t addr, const uint8_t* nsk, const uint8_t* dsk);
 
        /**
         * Set a multicast session counter
         * Up to 3 MULTICAST_SESSIONS can be set
         */
        int32_t setMulticastDownlinkCounter(uint8_t index, uint32_t count);

mDotEvent.h

The address field was added to PacketRx event.

        virtual void PacketRx(uint8_t port, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot, uint8_t retries, uint32_t address);

The name of the repository can be used to determine which device the stack was compiled for and if it's a development or production-ready build:

A changelog for the Dot library can be found here.

The Dot library version and the version of mbed-os it was compiled against can both be found in the commit message for that revision of the Dot library. Building your application with the same version of mbed-os as what was used to build the Dot library is highly recommended!

The Dot-Examples repository demonstrates how to use the Dot library in a custom application.

The mDot and xDot platform pages have lots of platform specific information and document potential issues, gotchas, etc, and provide instructions for getting started with development. Please take a look at the platform page before starting development as they should answer many questions you will have.

Committer:
Jenkins@KEILDM1.dc.multitech.prv
Date:
Mon Jun 19 16:03:40 2017 -0500
Revision:
82:0f5a742a08cd
Child:
84:29648b580369
mdot-library revision 3.0.0-rc7-1-ga5165ae and mbed-os revision mbed-os-5.4.7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1 /**********************************************************************
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 2 * COPYRIGHT 2016 MULTI-TECH SYSTEMS, INC.
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 3 *
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 4 * ALL RIGHTS RESERVED BY AND FOR THE EXCLUSIVE BENEFIT OF
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 5 * MULTI-TECH SYSTEMS, INC.
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 6 *
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 7 * MULTI-TECH SYSTEMS, INC. - CONFIDENTIAL AND PROPRIETARY
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 8 * INFORMATION AND/OR TRADE SECRET.
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 9 *
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 10 * NOTICE: ALL CODE, PROGRAM, INFORMATION, SCRIPT, INSTRUCTION,
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 11 * DATA, AND COMMENT HEREIN IS AND SHALL REMAIN THE CONFIDENTIAL
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 12 * INFORMATION AND PROPERTY OF MULTI-TECH SYSTEMS, INC.
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 13 * USE AND DISCLOSURE THEREOF, EXCEPT AS STRICTLY AUTHORIZED IN A
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 14 * WRITTEN AGREEMENT SIGNED BY MULTI-TECH SYSTEMS, INC. IS PROHIBITED.
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 15 *
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 16 ***********************************************************************/
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 17
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 18 #include "ChannelPlan_US915.h"
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 19 #include "limits.h"
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 20
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 21 using namespace lora;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 22
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 23 const uint8_t ChannelPlan_US915::US915_TX_POWERS[] = { 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10 };
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 24 const uint8_t ChannelPlan_US915::US915_RADIO_POWERS[] = { 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 19 };
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 25 const uint8_t ChannelPlan_US915::US915_MAX_PAYLOAD_SIZE[] = { 11, 53, 126, 242, 242, 0, 0, 0, 53, 129, 242, 242, 242, 242, 0, 0 };
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 26 const uint8_t ChannelPlan_US915::US915_MAX_PAYLOAD_SIZE_REPEATER[] = { 11, 53, 126, 222, 222, 0, 0, 33, 109, 222, 222, 222, 0, 0 };
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 27
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 28 ChannelPlan_US915::ChannelPlan_US915()
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 29 :
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 30 ChannelPlan(NULL, NULL)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 31 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 32
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 33 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 34
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 35 ChannelPlan_US915::ChannelPlan_US915(Settings* settings)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 36 :
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 37 ChannelPlan(NULL, settings)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 38 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 39
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 40 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 41
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 42 ChannelPlan_US915::ChannelPlan_US915(SxRadio* radio, Settings* settings)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 43 :
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 44 ChannelPlan(radio, settings)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 45 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 46
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 47 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 48
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 49 ChannelPlan_US915::~ChannelPlan_US915() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 50
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 51 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 52
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 53 void ChannelPlan_US915::Init() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 54 _plan = US915;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 55 _planName = "US915";
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 56
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 57 _datarates.clear();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 58 _channels.clear();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 59 _dutyBands.clear();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 60
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 61 DutyBand band;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 62
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 63 band.Index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 64 band.DutyCycle = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 65
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 66 Datarate dr;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 67
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 68 _maxTxPower = 30;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 69 _minTxPower = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 70
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 71 _minFrequency = US915_FREQ_MIN;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 72 _maxFrequency = US915_FREQ_MAX;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 73
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 74 TX_POWERS = US915_TX_POWERS;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 75 RADIO_POWERS = US915_RADIO_POWERS;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 76 MAX_PAYLOAD_SIZE = US915_MAX_PAYLOAD_SIZE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 77 MAX_PAYLOAD_SIZE_REPEATER = US915_MAX_PAYLOAD_SIZE_REPEATER;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 78
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 79 band.FrequencyMin = US915_FREQ_MIN;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 80 band.FrequencyMax = US915_FREQ_MAX;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 81
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 82 _freqUBase125k = US915_125K_FREQ_BASE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 83 _freqUStep125k = US915_125K_FREQ_STEP;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 84 _freqUBase500k = US915_500K_FREQ_BASE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 85 _freqUStep500k = US915_500K_FREQ_STEP;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 86 _freqDBase500k = US915_500K_DBASE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 87 _freqDStep500k = US915_500K_DSTEP;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 88 GetSettings()->Session.Rx2Frequency = US915_500K_DBASE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 89
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 90 _minDatarate = US915_MIN_DATARATE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 91 _maxDatarate = US915_MAX_DATARATE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 92 _minRx2Datarate = DR_8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 93 _maxRx2Datarate = DR_13;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 94 _minDatarateOffset = US915_MIN_DATARATE_OFFSET;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 95 _maxDatarateOffset = US915_MAX_DATARATE_OFFSET;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 96
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 97 _numChans125k = US915_125K_NUM_CHANS;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 98 _numChans500k = US915_500K_NUM_CHANS;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 99
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 100 logInfo("Initialize channels...");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 101
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 102 SetNumberOfChannels(US915_125K_NUM_CHANS + US915_500K_NUM_CHANS, false);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 103
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 104 dr.SpreadingFactor = SF_10;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 105
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 106 logInfo("Initialize datarates...");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 107
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 108 // Add DR0-3
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 109 while (dr.SpreadingFactor >= SF_7) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 110 AddDatarate(-1, dr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 111 dr.SpreadingFactor--;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 112 dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 113 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 114
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 115 // Add DR4
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 116 dr.SpreadingFactor = SF_8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 117 dr.Bandwidth = BW_500;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 118 AddDatarate(-1, dr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 119 dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 120
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 121 // Skip DR5-7 RFU
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 122 dr.SpreadingFactor = SF_INVALID;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 123 AddDatarate(-1, dr), dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 124 AddDatarate(-1, dr), dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 125 AddDatarate(-1, dr), dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 126
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 127 band.PowerMax = 30;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 128
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 129 band.TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 130
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 131 AddDutyBand(-1, band);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 132
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 133 GetSettings()->Session.Rx2DatarateIndex = DR_8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 134
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 135 // Add DR8-13
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 136 dr.SpreadingFactor = SF_12;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 137 while (dr.SpreadingFactor >= SF_7) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 138 AddDatarate(-1, dr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 139 dr.SpreadingFactor--;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 140 dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 141 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 142
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 143 // Skip DR14-15 RFU
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 144 dr.SpreadingFactor = SF_INVALID;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 145 AddDatarate(-1, dr), AddDatarate(-1, dr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 146
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 147 GetSettings()->Session.TxDatarate = DR_0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 148 GetSettings()->Session.TxPower = GetSettings()->Network.TxPower;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 149
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 150 SetFrequencySubBand(GetSettings()->Network.FrequencySubBand);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 151
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 152 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 153
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 154 uint8_t ChannelPlan_US915::HandleJoinAccept(const uint8_t* buffer, uint8_t size) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 155
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 156 if (size > 17) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 157 // TODO: Handle future channel mask settings
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 158 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 159
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 160 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 161 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 162
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 163 void ChannelPlan_US915::SetNumberOfChannels(uint8_t channels, bool resize) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 164 uint8_t newsize = ((channels - 1) / CHAN_MASK_SIZE) + 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 165
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 166 if (resize) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 167 _channels.resize(channels);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 168 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 169
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 170 _channelMask.resize(newsize, 0x0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 171 _numChans = channels;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 172
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 173 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 174
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 175 bool ChannelPlan_US915::IsChannelEnabled(uint8_t channel) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 176 uint8_t index = channel / CHAN_MASK_SIZE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 177 uint8_t shift = channel % CHAN_MASK_SIZE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 178
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 179 assert(index < _channelMask.size() * CHAN_MASK_SIZE);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 180
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 181 // cannot shift over 32 bits
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 182 assert(shift < 32);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 183
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 184 // logDebug("index: %d shift %d cm: %04x bit: %04x enabled: %d", index, shift, _channelMask[index], (1 << shift), (_channelMask[index] & (1 << shift)) == (1 << shift));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 185
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 186 return (_channelMask[index] & (1 << shift)) == (1 << shift);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 187 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 188
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 189 uint8_t ChannelPlan_US915::GetMinDatarate() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 190 if (GetSettings()->Network.Mode == lora::PEER_TO_PEER)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 191 return 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 192 else
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 193 return _minDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 194 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 195
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 196 uint8_t ChannelPlan_US915::GetMaxDatarate() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 197 if (GetSettings()->Network.Mode == lora::PEER_TO_PEER)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 198 return 13;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 199 else
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 200 return _maxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 201 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 202
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 203 uint8_t ChannelPlan_US915::SetRx1Offset(uint8_t offset) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 204 GetSettings()->Session.Rx1DatarateOffset = offset;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 205 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 206 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 207
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 208 uint8_t ChannelPlan_US915::SetRx2Frequency(uint32_t freq) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 209 GetSettings()->Session.Rx2Frequency = freq;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 210 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 211 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 212
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 213 uint8_t ChannelPlan_US915::SetRx2DatarateIndex(uint8_t index) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 214 GetSettings()->Session.Rx2DatarateIndex = index;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 215 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 216 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 217
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 218 uint8_t ChannelPlan_US915::SetTxConfig() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 219 logInfo("Configure radio for TX");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 220
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 221 uint8_t band = GetDutyBand(GetChannel(_txChannel).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 222 Datarate txDr = GetDatarate(GetSettings()->Session.TxDatarate);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 223 int8_t max_pwr = _dutyBands[band].PowerMax;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 224 uint8_t chans_enabled = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 225
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 226 int8_t pwr = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 227
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 228 pwr = std::min < int8_t > (GetSettings()->Session.TxPower, max_pwr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 229
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 230 // spec states that if < 50 125kHz channels are enabled, power is limited to 21dB conducted
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 231 chans_enabled += CountBits(_channelMask[0]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 232 chans_enabled += CountBits(_channelMask[1]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 233 chans_enabled += CountBits(_channelMask[2]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 234 chans_enabled += CountBits(_channelMask[3]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 235 if (chans_enabled < 50 && pwr > 21) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 236 pwr = 21;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 237 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 238
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 239 if (pwr + GetSettings()->Network.AntennaGain >= max_pwr + 6 && GetSettings()->Network.AntennaGain > 6) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 240 pwr -= (GetSettings()->Network.AntennaGain - 6);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 241 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 242
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 243 for (int i = 20; i >= 0; i--) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 244 if (RADIO_POWERS[i] <= pwr) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 245 pwr = i;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 246 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 247 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 248 if (i == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 249 pwr = i;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 250 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 251 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 252
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 253 logDebug("Session pwr: %d ant: %d max: %d", GetSettings()->Session.TxPower, GetSettings()->Network.AntennaGain, max_pwr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 254 logDebug("Radio Power index: %d output: %d total: %d", pwr, RADIO_POWERS[pwr], RADIO_POWERS[pwr] + GetSettings()->Network.AntennaGain);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 255
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 256 uint32_t bw = txDr.Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 257 uint32_t sf = txDr.SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 258 uint8_t cr = txDr.Coderate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 259 uint8_t pl = txDr.PreambleLength;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 260 uint16_t fdev = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 261 bool crc = txDr.Crc;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 262 bool iq = txDr.TxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 263
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 264 if (GetSettings()->Network.DisableCRC == true)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 265 crc = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 266
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 267 SxRadio::RadioModems_t modem = SxRadio::MODEM_LORA;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 268
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 269 if (sf == SF_FSK) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 270 modem = SxRadio::MODEM_FSK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 271 sf = 50e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 272 fdev = 25e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 273 bw = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 274 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 275
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 276 GetRadio()->SetTxConfig(modem, pwr, fdev, bw, sf, cr, pl, false, crc, false, 0, iq, 3e3);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 277
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 278 logDebug("TX PWR: %u DR: %u SF: %u BW: %u CR: %u PL: %u CRC: %d IQ: %d", pwr, txDr.Index, sf, bw, cr, pl, crc, iq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 279
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 280 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 281 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 282
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 283 uint8_t ChannelPlan_US915::SetRxConfig(uint8_t window, bool continuous) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 284
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 285 RxWindow rxw = GetRxWindow(window);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 286 GetRadio()->SetChannel(rxw.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 287
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 288 Datarate rxDr = GetDatarate(rxw.DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 289 uint32_t bw = rxDr.Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 290 uint32_t sf = rxDr.SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 291 uint8_t cr = rxDr.Coderate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 292 uint8_t pl = rxDr.PreambleLength;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 293 uint16_t sto = rxDr.SymbolTimeout();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 294 uint32_t afc = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 295 bool crc = false; // downlink does not use CRC according to LORAWAN
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 296
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 297 if (GetSettings()->Network.DisableCRC == true)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 298 crc = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 299
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 300 Datarate txDr = GetDatarate(GetSettings()->Session.TxDatarate);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 301 bool iq = txDr.RxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 302
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 303 if (P2PEnabled()) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 304 iq = txDr.TxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 305 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 306
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 307 SxRadio::RadioModems_t modem = SxRadio::MODEM_LORA;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 308
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 309 if (sf == SF_FSK) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 310 modem = SxRadio::MODEM_FSK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 311 sf = 50e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 312 cr = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 313 bw = 50e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 314 afc = 83333;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 315 iq = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 316 crc = true; // FSK must use CRC
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 317 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 318
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 319 // Disable printf's to actually receive packets, printing to debug may mess up the timing
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 320 // logTrace("Configure radio for RX%d on freq: %lu", window, rxw.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 321 // logTrace("RX SF: %u BW: %u CR: %u PL: %u STO: %u CRC: %d IQ: %d", sf, bw, cr, pl, sto, crc, iq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 322
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 323 GetRadio()->SetRxConfig(modem, bw, sf, cr, afc, pl, sto, false, 0, crc, false, 0, iq, continuous);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 324
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 325 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 326 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 327
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 328 uint8_t ChannelPlan_US915::AddChannel(int8_t index, Channel channel) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 329 logTrace("Add Channel %d : %lu : %02x %d", index, channel.Frequency, channel.DrRange.Value, _channels.size());
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 330
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 331 assert(index < (int) _channels.size());
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 332
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 333 if (index >= 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 334 _channels[index] = channel;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 335 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 336 _channels.push_back(channel);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 337 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 338
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 339 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 340 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 341
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 342 Channel ChannelPlan_US915::GetChannel(int8_t index) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 343 Channel chan;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 344 memset(&chan, 0, sizeof(Channel));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 345
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 346 if (_channels.size() > 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 347 chan = _channels[index];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 348 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 349 if (index < 64) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 350 chan.Index = index;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 351 chan.DrRange.Fields.Min = _minDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 352 chan.DrRange.Fields.Max = _maxDatarate - 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 353 chan.Frequency = _freqUBase125k + (_freqUStep125k * index);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 354 } else if (index < 72) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 355 chan.Index = index;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 356 chan.DrRange.Fields.Min = _maxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 357 chan.DrRange.Fields.Max = _maxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 358 chan.Frequency = _freqUBase500k + (_freqUStep500k * (index - 64));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 359 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 360 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 361
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 362 return chan;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 363 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 364
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 365 uint8_t ChannelPlan_US915::SetFrequencySubBand(uint8_t sub_band) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 366
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 367 _txFrequencySubBand = sub_band;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 368
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 369 if (sub_band > 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 370 SetChannelMask(0, 0x0000);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 371 SetChannelMask(1, 0x0000);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 372 SetChannelMask(2, 0x0000);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 373 SetChannelMask(3, 0x0000);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 374 SetChannelMask(4, 0x0000);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 375 SetChannelMask((sub_band - 1) / 2, (sub_band % 2) ? 0x00FF : 0xFF00);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 376 SetChannelMask(4, 1 << (sub_band - 1));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 377 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 378 SetChannelMask(0, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 379 SetChannelMask(1, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 380 SetChannelMask(2, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 381 SetChannelMask(3, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 382 SetChannelMask(4, 0x00FF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 383 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 384
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 385 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 386 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 387
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 388
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 389 void ChannelPlan_US915::LogRxWindow(uint8_t wnd) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 390
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 391 RxWindow rxw = GetRxWindow(wnd);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 392 Datarate rxDr = GetDatarate(rxw.DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 393 uint8_t bw = rxDr.Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 394 uint8_t sf = rxDr.SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 395 uint8_t cr = rxDr.Coderate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 396 uint8_t pl = rxDr.PreambleLength;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 397 uint16_t sto = rxDr.SymbolTimeout();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 398 bool crc = false; // downlink does not use CRC according to LORAWAN
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 399 bool iq = GetTxDatarate().RxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 400
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 401 logTrace("RX%d on freq: %lu", wnd, rxw.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 402 logTrace("RX DR: %u SF: %u BW: %u CR: %u PL: %u STO: %u CRC: %d IQ: %d", rxDr.Index, sf, bw, cr, pl, sto, crc, iq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 403 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 404
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 405 RxWindow ChannelPlan_US915::GetRxWindow(uint8_t window) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 406 RxWindow rxw;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 407 int index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 408
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 409 if (P2PEnabled()) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 410 rxw.Frequency = GetSettings()->Network.TxFrequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 411 index = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 412 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 413 if (window == 1) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 414 if (_txChannel < _numChans125k) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 415 if (GetSettings()->Network.Mode == PUBLIC) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 416 rxw.Frequency = _freqDBase500k + (_txChannel % 8) * _freqDStep500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 417 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 418 rxw.Frequency = _freqDBase500k + (_txChannel / 8) * _freqDStep500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 419 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 420 } else
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 421 rxw.Frequency = _freqDBase500k + (_txChannel - _numChans125k) * _freqDStep500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 422
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 423 if (GetSettings()->Session.TxDatarate <= DR_6) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 424 index = GetSettings()->Session.TxDatarate + 10 - GetSettings()->Session.Rx1DatarateOffset;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 425
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 426 if (index < DR_8)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 427 index = DR_8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 428 if (index > DR_13)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 429 index = DR_13;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 430 } else if (GetSettings()->Session.TxDatarate >= DR_8) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 431 index = GetSettings()->Session.TxDatarate - GetSettings()->Session.Rx1DatarateOffset;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 432 if (index < DR_8)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 433 index = DR_8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 434 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 435 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 436 if (GetSettings()->Network.Mode == PUBLIC) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 437 rxw.Frequency = GetSettings()->Session.Rx2Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 438 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 439 if (_txChannel < 64)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 440 rxw.Frequency = _freqDBase500k + (_txChannel / 8) * _freqDStep500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 441 else
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 442 rxw.Frequency = _freqDBase500k + (_txChannel % 8) * _freqDStep500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 443 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 444 index = GetSettings()->Session.Rx2DatarateIndex;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 445 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 446 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 447
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 448 rxw.DatarateIndex = index;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 449
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 450 return rxw;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 451 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 452
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 453 uint8_t ChannelPlan_US915::HandleRxParamSetup(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 454 status = 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 455 int8_t datarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 456 int8_t drOffset = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 457 uint32_t freq = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 458
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 459 drOffset = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 460 datarate = drOffset & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 461 drOffset = (drOffset >> 4) & 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 462
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 463 freq = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 464 freq |= payload[index++] << 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 465 freq |= payload[index++] << 16;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 466 freq *= 100;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 467
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 468 if (!CheckRfFrequency(freq)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 469 logInfo("Freq KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 470 status &= 0xFE; // Channel frequency KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 471 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 472
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 473 if (datarate < _minRx2Datarate || datarate > _maxRx2Datarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 474 logInfo("DR KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 475 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 476 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 477
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 478 if (drOffset < 0 || drOffset > _maxDatarateOffset) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 479 logInfo("DR Offset KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 480 status &= 0xFB; // Rx1DrOffset range KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 481 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 482
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 483 if ((status & 0x07) == 0x07) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 484 logInfo("RxParamSetup accepted Rx2DR: %d Rx2Freq: %d Rx1Offset: %d", datarate, freq, drOffset);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 485 SetRx2DatarateIndex(datarate);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 486 SetRx2Frequency(freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 487 SetRx1Offset(drOffset);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 488 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 489 logInfo("RxParamSetup rejected Rx2DR: %d Rx2Freq: %d Rx1Offset: %d", datarate, freq, drOffset);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 490 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 491
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 492 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 493 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 494
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 495 uint8_t ChannelPlan_US915::HandleNewChannel(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 496
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 497 // Not Supported in US915
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 498 status = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 499 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 500 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 501
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 502 uint8_t ChannelPlan_US915::HandlePingSlotChannelReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 503
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 504 lora::CopyFreqtoInt(payload + index, _beaconRxChannel.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 505 index += 3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 506
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 507 if (_beaconRxChannel.Frequency != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 508 _beaconRxChannel.DrRange.Value = payload[index];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 509 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 510 // TODO: set to default beacon rx channel
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 511 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 512
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 513 status = 0x03;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 514 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 515 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 516
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 517 uint8_t ChannelPlan_US915::HandleBeaconFrequencyReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 518
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 519 status = 0x03;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 520 Channel chParam;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 521
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 522 // Skip channel index
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 523 index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 524
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 525 lora::CopyFreqtoInt(payload + index, chParam.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 526 index += 3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 527 chParam.DrRange.Value = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 528
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 529 if (!GetRadio()->CheckRfFrequency(chParam.Frequency)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 530 status &= 0xFE; // Channel frequency KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 531 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 532
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 533 if (chParam.DrRange.Fields.Min < chParam.DrRange.Fields.Max) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 534 status &= 0xFD; // Datarate range KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 535 } else if (chParam.DrRange.Fields.Min < _minDatarate || chParam.DrRange.Fields.Min > _maxDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 536 status &= 0xFD; // Datarate range KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 537 } else if (chParam.DrRange.Fields.Max < _minDatarate || chParam.DrRange.Fields.Max > _maxDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 538 status &= 0xFD; // Datarate range KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 539 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 540
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 541 if ((status & 0x03) == 0x03) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 542 _beaconChannel = chParam;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 543 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 544
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 545 if (_beaconChannel.Frequency == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 546 // TODO: Set to default
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 547 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 548
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 549 status = 0x01;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 550
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 551 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 552 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 553
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 554
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 555 uint8_t ChannelPlan_US915::HandleAdrCommand(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 556
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 557 uint8_t power = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 558 uint8_t datarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 559 uint16_t mask = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 560 uint8_t ctrl = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 561 uint8_t nbRep = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 562
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 563 status = 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 564 datarate = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 565 power = datarate & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 566 datarate = (datarate >> 4) & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 567
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 568 mask = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 569 mask |= payload[index++] << 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 570
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 571 nbRep = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 572 ctrl = (nbRep >> 4) & 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 573 nbRep &= 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 574
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 575 if (nbRep == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 576 nbRep = 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 577 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 578
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 579 if (datarate > _maxDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 580 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 581 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 582 //
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 583 // Remark MaxTxPower = 0 and MinTxPower = 10
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 584 //
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 585 if (power < 0 || power > 10) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 586 status &= 0xFB; // TxPower KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 587 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 588
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 589 switch (ctrl) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 590 case 0:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 591 case 1:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 592 case 2:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 593 case 3:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 594 case 4:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 595 SetChannelMask(ctrl, mask);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 596 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 597
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 598 case 6:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 599 // enable all 125 kHz channels
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 600 SetChannelMask(0, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 601 SetChannelMask(1, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 602 SetChannelMask(2, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 603 SetChannelMask(3, 0xFFFF);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 604 SetChannelMask(4, mask);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 605 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 606
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 607 case 7:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 608 // disable all 125 kHz channels
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 609 SetChannelMask(0, 0x0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 610 SetChannelMask(1, 0x0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 611 SetChannelMask(2, 0x0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 612 SetChannelMask(3, 0x0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 613 SetChannelMask(4, mask);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 614 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 615
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 616 default:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 617 logWarning("rejecting RFU or unknown control value %d", ctrl);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 618 status &= 0xFE; // ChannelMask KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 619 return LORA_ERROR;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 620 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 621
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 622 if (GetSettings()->Network.ADREnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 623 GetSettings()->Session.TxDatarate = datarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 624 GetSettings()->Session.TxPower = TX_POWERS[power];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 625 GetSettings()->Session.Redundancy = nbRep;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 626 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 627 logDebug("ADR is disabled, DR and Power not changed.");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 628 status &= 0xFB; // TxPower KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 629 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 630 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 631
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 632 logDebug("ADR DR: %u PWR: %u Ctrl: %02x Mask: %04x NbRep: %u Stat: %02x", datarate, power, ctrl, mask, nbRep, status);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 633
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 634 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 635 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 636
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 637 uint8_t ChannelPlan_US915::ValidateAdrConfiguration() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 638 uint8_t status = 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 639 uint8_t chans_enabled = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 640 uint8_t datarate = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 641 uint8_t power = GetSettings()->Session.TxPower;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 642
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 643 if (!GetSettings()->Network.ADREnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 644 logDebug("ADR disabled - no applied changes to validate");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 645 return status;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 646 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 647
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 648 if (datarate > _maxDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 649 logWarning("ADR Datarate KO - outside allowed range");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 650 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 651 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 652 if (power < _minTxPower || power > _maxTxPower) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 653 logWarning("ADR TX Power KO - outside allowed range");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 654 status &= 0xFB; // TxPower KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 655 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 656
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 657 // at least 6 125kHz channels must be enabled
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 658 chans_enabled += CountBits(_channelMask[0]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 659 chans_enabled += CountBits(_channelMask[1]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 660 chans_enabled += CountBits(_channelMask[2]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 661 chans_enabled += CountBits(_channelMask[3]);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 662 if (chans_enabled < 6) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 663 logWarning("ADR Channel Mask KO - at least 6 125kHz channels must be enabled");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 664 status &= 0xFE; // ChannelMask KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 665 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 666
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 667 // if TXDR == 4 (SF8@500kHz) at least 1 500kHz channel must be enabled
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 668 if (datarate == DR_4 && (CountBits(_channelMask[4] & 0xFF) == 0)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 669 logWarning("ADR Datarate KO - DR4 requires at least 1 500kHz channel enabled");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 670 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 671 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 672
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 673 return status;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 674 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 675
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 676 uint32_t ChannelPlan_US915::GetTimeOffAir()
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 677 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 678 if (GetSettings()->Test.DisableDutyCycle == lora::ON)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 679 return 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 680
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 681 uint32_t min = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 682 uint32_t now = _dutyCycleTimer.read_ms();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 683
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 684 if (GetSettings()->Session.AggregatedTimeOffEnd > 0 && GetSettings()->Session.AggregatedTimeOffEnd > now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 685 min = std::max < uint32_t > (min, GetSettings()->Session.AggregatedTimeOffEnd - now);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 686 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 687
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 688 now = time(NULL);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 689 uint32_t join_time = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 690
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 691 if (GetSettings()->Session.JoinFirstAttempt != 0 && now < GetSettings()->Session.JoinTimeOffEnd) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 692 join_time = (GetSettings()->Session.JoinTimeOffEnd - now) * 1000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 693 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 694
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 695 min = std::max < uint32_t > (join_time, min);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 696
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 697 return min;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 698 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 699
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 700 std::vector<uint32_t> lora::ChannelPlan_US915::GetChannels() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 701 std::vector < uint32_t > chans;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 702
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 703 if (GetSettings()->Network.FrequencySubBand > 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 704 uint8_t chans_per_group = 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 705 size_t start = (GetSettings()->Network.FrequencySubBand - 1) * chans_per_group;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 706 for (int8_t i = start; i < int8_t(start + chans_per_group); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 707 chans.push_back(GetChannel(i).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 708 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 709 chans.push_back(GetChannel(_numChans125k + (GetSettings()->Network.FrequencySubBand - 1)).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 710 chans.push_back(GetRxWindow(2).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 711 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 712 for (int8_t i = 0; i < _numChans; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 713 chans.push_back(GetChannel(i).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 714 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 715 chans.push_back(GetRxWindow(2).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 716 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 717
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 718 return chans;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 719 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 720
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 721 std::vector<uint8_t> lora::ChannelPlan_US915::GetChannelRanges() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 722 std::vector < uint8_t > ranges;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 723
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 724 if (GetSettings()->Network.FrequencySubBand > 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 725 uint8_t chans_per_group = 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 726 size_t start = (GetSettings()->Network.FrequencySubBand - 1) * chans_per_group;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 727 for (int8_t i = start; i < int8_t(start + chans_per_group); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 728 ranges.push_back(GetChannel(i).DrRange.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 729 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 730 ranges.push_back(GetChannel(_numChans125k + (GetSettings()->Network.FrequencySubBand - 1)).DrRange.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 731 ranges.push_back(GetRxWindow(2).DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 732 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 733 for (int8_t i = 0; i < _numChans; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 734 ranges.push_back(GetChannel(i).DrRange.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 735 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 736 ranges.push_back(GetRxWindow(2).DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 737 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 738
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 739 ranges.push_back(GetRxWindow(2).DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 740
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 741 return ranges;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 742
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 743 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 744
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 745 void lora::ChannelPlan_US915::EnableDefaultChannels() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 746 SetFrequencySubBand(GetFrequencySubBand());
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 747 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 748
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 749 uint8_t ChannelPlan_US915::GetNextChannel()
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 750 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 751 if (GetSettings()->Session.AggregatedTimeOffEnd != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 752 return LORA_AGGREGATED_DUTY_CYCLE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 753 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 754
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 755 if (P2PEnabled() || GetSettings()->Network.TxFrequency != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 756 logDebug("Using frequency %d", GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 757
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 758 if (GetSettings()->Test.DisableDutyCycle != lora::ON) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 759 int8_t band = GetDutyBand(GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 760 logDebug("band: %d freq: %d", band, GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 761 if (band != -1 && _dutyBands[band].TimeOffEnd != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 762 return LORA_NO_CHANS_ENABLED;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 763 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 764 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 765
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 766 GetRadio()->SetChannel(GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 767 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 768 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 769
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 770 uint8_t start = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 771 uint8_t maxChannels = _numChans125k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 772 uint8_t nbEnabledChannels = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 773 uint8_t *enabledChannels = new uint8_t[maxChannels];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 774
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 775 if (GetTxDatarate().Bandwidth == BW_500) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 776 maxChannels = _numChans500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 777 start = _numChans125k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 778 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 779
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 780 // Search how many channels are enabled
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 781 DatarateRange range;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 782 uint8_t dr_index = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 783 uint32_t now = _dutyCycleTimer.read_ms();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 784
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 785 for (size_t i = 0; i < _dutyBands.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 786 if (_dutyBands[i].TimeOffEnd < now || GetSettings()->Test.DisableDutyCycle == lora::ON) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 787 _dutyBands[i].TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 788 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 789 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 790
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 791 for (uint8_t i = start; i < start + maxChannels; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 792 range = GetChannel(i).DrRange;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 793 // logDebug("chan: %d freq: %d range:%02x", i, GetChannel(i).Frequency, range.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 794
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 795 if (IsChannelEnabled(i) && (dr_index >= range.Fields.Min && dr_index <= range.Fields.Max)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 796 int8_t band = GetDutyBand(GetChannel(i).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 797 // logDebug("band: %d freq: %d", band, _channels[i].Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 798 if (band != -1 && _dutyBands[band].TimeOffEnd == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 799 enabledChannels[nbEnabledChannels++] = i;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 800 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 801 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 802 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 803
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 804 if (GetTxDatarate().Bandwidth == BW_500) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 805 _dutyBands[0].PowerMax = 26;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 806 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 807 if (nbEnabledChannels < 50)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 808 _dutyBands[0].PowerMax = 21;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 809 else
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 810 _dutyBands[0].PowerMax = 30;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 811 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 812
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 813 logTrace("Number of available channels: %d", nbEnabledChannels);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 814
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 815 uint32_t freq = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 816 uint8_t sf = GetTxDatarate().SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 817 uint8_t bw = GetTxDatarate().Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 818 int16_t thres = DEFAULT_FREE_CHAN_RSSI_THRESHOLD;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 819
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 820 if (nbEnabledChannels == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 821 delete [] enabledChannels;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 822 return LORA_NO_CHANS_ENABLED;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 823 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 824
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 825 if (GetSettings()->Network.CADEnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 826 // Search for free channel with ms timeout
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 827 int16_t timeout = 10000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 828 Timer tmr;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 829 tmr.start();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 830
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 831 for (uint8_t j = rand_r(0, nbEnabledChannels - 1); tmr.read_ms() < timeout; j++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 832 freq = GetChannel(enabledChannels[j]).Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 833
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 834 if (GetRadio()->IsChannelFree(SxRadio::MODEM_LORA, freq, sf, thres, bw)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 835 _txChannel = enabledChannels[j];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 836 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 837 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 838 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 839 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 840 uint8_t j = rand_r(0, nbEnabledChannels - 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 841 _txChannel = enabledChannels[j];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 842 freq = GetChannel(_txChannel).Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 843 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 844
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 845 assert(freq != 0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 846
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 847 logDebug("Using channel %d : %d", _txChannel, freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 848 GetRadio()->SetChannel(freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 849
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 850 delete [] enabledChannels;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 851 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 852 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 853
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 854 uint8_t lora::ChannelPlan_US915::GetJoinDatarate() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 855 uint8_t dr = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 856
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 857 if (GetSettings()->Test.DisableRandomJoinDatarate == lora::OFF) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 858 static bool altDatarate = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 859
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 860 if (GetSettings()->Network.FrequencySubBand == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 861 static uint16_t used_bands_125k = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 862 static uint16_t used_bands_500k = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 863 uint8_t frequency_sub_band = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 864
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 865 if (altDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 866 // 500k channel
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 867 if (CountBits(used_bands_500k) == 8) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 868 used_bands_500k = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 869 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 870 while ((frequency_sub_band = rand_r(1, 8)) && (used_bands_500k & (1 << (frequency_sub_band - 1))) != 0)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 871 ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 872 used_bands_500k |= (1 << (frequency_sub_band - 1));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 873 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 874 // 125k channel
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 875 if (CountBits(used_bands_125k) == 8) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 876 used_bands_125k = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 877 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 878 while ((frequency_sub_band = rand_r(1, 8)) && (used_bands_125k & (1 << (frequency_sub_band - 1))) != 0)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 879 ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 880 used_bands_125k |= (1 << (frequency_sub_band - 1));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 881 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 882
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 883 logWarning("JoinDatarate setting frequency sub band to %d 125k: %04x 500k: %04x", frequency_sub_band, used_bands_125k, used_bands_500k);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 884 SetFrequencySubBand(frequency_sub_band);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 885 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 886
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 887 if (altDatarate && CountBits(_channelMask[4] > 0)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 888 dr = lora::DR_4;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 889 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 890 dr = lora::DR_0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 891 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 892 altDatarate = !altDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 893 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 894
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 895 return dr;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 896 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 897
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 898 uint8_t lora::ChannelPlan_US915::CalculateJoinBackoff(uint8_t size) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 899
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 900 time_t now = time(NULL);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 901 uint32_t time_on_max = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 902 static uint32_t time_off_max = 15;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 903 uint32_t rand_time_off = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 904 static uint16_t join_cnt = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 905
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 906 // TODO: calc time-off-max based on RTC time from JoinFirstAttempt, time-off-max is lost over sleep
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 907
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 908 if ((time_t)GetSettings()->Session.JoinTimeOffEnd > now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 909 return LORA_JOIN_BACKOFF;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 910 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 911
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 912 uint32_t secs_since_first_attempt = (now - GetSettings()->Session.JoinFirstAttempt);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 913 uint16_t hours_since_first_attempt = secs_since_first_attempt / (60 * 60);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 914
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 915 join_cnt = (join_cnt+1) % 16;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 916
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 917 if (GetSettings()->Session.JoinFirstAttempt == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 918 /* 1 % duty-cycle for first hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 919 * 0.1 % next 10 hours
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 920 * 0.01 % upto 24 hours */
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 921 GetSettings()->Session.JoinFirstAttempt = now;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 922 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 923 GetSettings()->Session.JoinTimeOffEnd = now + rand_r(GetSettings()->Network.JoinDelay + 2, GetSettings()->Network.JoinDelay + 3);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 924 } else if (join_cnt == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 925 if (hours_since_first_attempt < 1) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 926 time_on_max = 36000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 927 rand_time_off = rand_r(time_off_max - 1, time_off_max + 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 928 // time off max 1 hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 929 time_off_max = std::min < uint32_t > (time_off_max * 2, 60 * 60);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 930
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 931 if (GetSettings()->Session.JoinTimeOnAir < time_on_max) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 932 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 933 GetSettings()->Session.JoinTimeOffEnd = now + rand_time_off;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 934 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 935 logWarning("Max time-on-air limit met for current join backoff period");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 936 GetSettings()->Session.JoinTimeOffEnd = GetSettings()->Session.JoinFirstAttempt + 60 * 60;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 937 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 938 } else if (hours_since_first_attempt < 11) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 939 if (GetSettings()->Session.JoinTimeOnAir < 36000) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 940 GetSettings()->Session.JoinTimeOnAir = 36000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 941 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 942 time_on_max = 72000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 943 rand_time_off = rand_r(time_off_max - 1, time_off_max + 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 944 // time off max 1 hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 945 time_off_max = std::min < uint32_t > (time_off_max * 2, 60 * 60);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 946
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 947 if (GetSettings()->Session.JoinTimeOnAir < time_on_max) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 948 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 949 GetSettings()->Session.JoinTimeOffEnd = now + rand_time_off;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 950 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 951 logWarning("Max time-on-air limit met for current join backoff period");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 952 GetSettings()->Session.JoinTimeOffEnd = GetSettings()->Session.JoinFirstAttempt + 11 * 60 * 60;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 953 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 954 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 955 if (GetSettings()->Session.JoinTimeOnAir < 72000) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 956 GetSettings()->Session.JoinTimeOnAir = 72000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 957 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 958 uint32_t join_time = 2500;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 959
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 960 // 16 join attempts is ~2754 ms, check if this is the third of the 24 hour period
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 961
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 962 time_on_max = 80700;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 963 time_off_max = 1 * 60 * 60; // 1 hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 964 rand_time_off = rand_r(time_off_max - 1, time_off_max + 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 965
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 966 if (GetSettings()->Session.JoinTimeOnAir < time_on_max - join_time) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 967 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 968 GetSettings()->Session.JoinTimeOffEnd = now + rand_time_off;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 969 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 970 logWarning("Max time-on-air limit met for current join backoff period");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 971 // Reset the join time on air and set end of restriction to the next 24 hour period
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 972 GetSettings()->Session.JoinTimeOnAir = 72000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 973 uint16_t days = (now - GetSettings()->Session.JoinFirstAttempt) / (24 * 60 * 60) + 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 974 logWarning("days : %d", days);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 975 GetSettings()->Session.JoinTimeOffEnd = GetSettings()->Session.JoinFirstAttempt + ((days * 24) + 11) * 60 * 60;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 976 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 977 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 978
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 979 logWarning("JoinBackoff: %lu seconds Time On Air: %lu / %lu", GetSettings()->Session.JoinTimeOffEnd - now, GetSettings()->Session.JoinTimeOnAir, time_on_max);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 980 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 981 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 982 GetSettings()->Session.JoinTimeOffEnd = now + rand_r(GetSettings()->Network.JoinDelay + 2, GetSettings()->Network.JoinDelay + 3);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 983 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 984
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 985 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 986 }