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:
Thu Aug 30 09:05:16 2018 -0500
Revision:
172:7ec44396a51b
Parent:
167:09fd17fee0f5
Child:
178:8f7d93f3bbb5
mdot-library revision 3.1.0-class-b-alpha-1-15-g0c33f0a and mbed-os revision mbed-os-5.7.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_KR920.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 // MWF - changed KR920 to match final 1.0.2 regional spec
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 24 const uint8_t ChannelPlan_KR920::KR920_TX_POWERS[] = { 14, 12, 10, 8, 6, 4, 2, 0 };
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 25 const uint8_t ChannelPlan_KR920::KR920_RADIO_POWERS[] = { 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20 };
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 26 const uint8_t ChannelPlan_KR920::KR920_MAX_PAYLOAD_SIZE[] = { 51, 51, 51, 115, 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 27 const uint8_t ChannelPlan_KR920::KR920_MAX_PAYLOAD_SIZE_REPEATER[] = { 51, 51, 51, 115, 222, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 28
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 29 ChannelPlan_KR920::ChannelPlan_KR920()
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 30 :
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 31 ChannelPlan(NULL, NULL)
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
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 36 ChannelPlan_KR920::ChannelPlan_KR920(Settings* settings)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 37 :
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 38 ChannelPlan(NULL, settings)
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
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 43 ChannelPlan_KR920::ChannelPlan_KR920(SxRadio* radio, Settings* settings)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 44 :
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 45 ChannelPlan(radio, settings)
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
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 50 ChannelPlan_KR920::~ChannelPlan_KR920() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 51
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 52 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 53
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 54 void ChannelPlan_KR920::Init() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 55
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 56 _datarates.clear();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 57 _channels.clear();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 58 _dutyBands.clear();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 59
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 60 DutyBand band;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 61
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 62 band.Index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 63 band.DutyCycle = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 64
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 65 Datarate dr;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 66
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 67 _plan = KR920;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 68 _planName = "KR920";
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 69 _maxTxPower = 14;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 70 _minTxPower = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 71
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 72 _minFrequency = 920900000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 73 _maxFrequency = 923300000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 74
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 75 DefaultLBT();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 76
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 77 TX_POWERS = KR920_TX_POWERS;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 78 RADIO_POWERS = KR920_RADIO_POWERS;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 79 MAX_PAYLOAD_SIZE = KR920_MAX_PAYLOAD_SIZE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 80 MAX_PAYLOAD_SIZE_REPEATER = KR920_MAX_PAYLOAD_SIZE_REPEATER;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 81
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 82 _minDatarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 83 _maxDatarate = 5;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 84
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 85 _minRx2Datarate = DR_0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 86 _maxRx2Datarate = DR_5;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 87
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 88 _minDatarateOffset = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 89 _maxDatarateOffset = 5;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 90
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 91 _numChans125k = 16;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 92 _numChans500k = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 93
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 94 GetSettings()->Session.Rx2Frequency = 921900000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 95 GetSettings()->Session.Rx2DatarateIndex = DR_0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 96
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 97 GetSettings()->Session.BeaconFrequency = KR920_BEACON_FREQ;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 98 GetSettings()->Session.BeaconDatarateIndex = KR920_BEACON_DR;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 99 GetSettings()->Session.PingSlotFrequency = KR920_BEACON_FREQ;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 100 GetSettings()->Session.PingSlotDatarateIndex = KR920_BEACON_DR;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 101
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 102 logInfo("Initialize datarates...");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 103
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 104 dr.SpreadingFactor = SF_12;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 105
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 106 // Add DR0-5
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 107 while (dr.SpreadingFactor >= SF_7) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 108 AddDatarate(-1, dr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 109 dr.SpreadingFactor--;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 110 dr.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 111 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 112
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 113 // Skip DR6-15 RFU
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 114 dr.SpreadingFactor = SF_INVALID;
Jenkins@KEILDM1.dc.multitech.prv 118:64f20bc150dd 115 while (dr.Index++ <= DR_15) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 116 AddDatarate(-1, dr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 117 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 118
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 119 GetSettings()->Session.TxDatarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 120
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 121 logInfo("Initialize channels...");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 122
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 123 Channel chan;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 124 chan.DrRange.Fields.Min = DR_0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 125 chan.DrRange.Fields.Max = DR_5;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 126 chan.Index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 127 chan.Frequency = 922100000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 128 SetNumberOfChannels(16);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 129
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 130 uint8_t numDefaultChannels = 3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 131
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 132 for (uint8_t i = 0; i < numDefaultChannels; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 133 AddChannel(i, chan);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 134 chan.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 135 chan.Frequency += 200000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 136 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 137
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 138 chan.DrRange.Value = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 139 chan.Frequency = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 140
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 141 for (uint8_t i = numDefaultChannels; i < 16; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 142 AddChannel(i, chan);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 143 chan.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 144 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 145
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 146 // Add downlink channel defaults
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 147 chan.Index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 148 _dlChannels.resize(16);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 149 for (uint8_t i = 0; i < 16; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 150 AddDownlinkChannel(i, chan);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 151 chan.Index++;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 152 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 153
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 154 SetChannelMask(0, 0x07);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 155
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 156 band.Index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 157 band.FrequencyMin = _minFrequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 158 band.FrequencyMax = _maxFrequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 159 band.PowerMax = 14;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 160 band.TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 161
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 162 // Disable duty-cycle limits
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 163 band.DutyCycle = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 164
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 165 AddDutyBand(-1, band);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 166
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 167 GetSettings()->Session.TxPower = GetSettings()->Network.TxPower;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 168 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 169
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 170 uint8_t ChannelPlan_KR920::AddChannel(int8_t index, Channel channel) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 171 logTrace("Add Channel %d : %lu : %02x %d", index, channel.Frequency, channel.DrRange.Value, _channels.size());
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 172
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 173 assert(index < (int) _channels.size());
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 174
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 175 if (index >= 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 176 _channels[index] = channel;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 177 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 178 _channels.push_back(channel);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 179 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 180
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 181 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 182 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 183
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 184 uint8_t ChannelPlan_KR920::HandleJoinAccept(const uint8_t* buffer, uint8_t size) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 185
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 186 if (size == 33) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 187 Channel ch;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 188 int index = 3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 189 for (int i = 13; i < size - 5; i += 3) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 190
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 191 ch.Frequency = ((buffer[i]) | (buffer[i + 1] << 8) | (buffer[i + 2] << 16)) * 100u;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 192
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 193 if (ch.Frequency > 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 194 ch.Index = index;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 195 ch.DrRange.Fields.Min = static_cast<int8_t>(DR_0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 196 ch.DrRange.Fields.Max = static_cast<int8_t>(DR_5);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 197 AddChannel(index, ch);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 198
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 199 if (GetDutyBand(ch.Frequency) > -1)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 200 _channelMask[0] |= (1 << index);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 201 else
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 202 _channelMask[0] |= ~(1 << index);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 203
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 204 index += 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 205 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 206 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 207 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 208
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 209 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 210 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 211
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 212 uint8_t ChannelPlan_KR920::SetTxConfig() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 213
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 214 logInfo("Configure radio for TX");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 215
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 216 uint8_t band = GetDutyBand(GetChannel(_txChannel).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 217 Datarate txDr = GetDatarate(GetSettings()->Session.TxDatarate);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 218 int8_t max_pwr = _dutyBands[band].PowerMax;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 219
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 220 if (GetChannel(_txChannel).Frequency < 922100000) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 221 max_pwr = 10;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 222 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 223 max_pwr = 14;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 224 }
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 167:09fd17fee0f5 228 pwr = std::min < int8_t > (GetSettings()->Session.TxPower, max_pwr);
Jenkins@KEILDM1.dc.multitech.prv 167:09fd17fee0f5 229 pwr -= GetSettings()->Network.AntennaGain;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 230
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 231 for (int i = 20; i >= 0; i--) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 232 if (RADIO_POWERS[i] <= pwr) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 233 pwr = i;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 234 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 235 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 236 if (i == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 237 pwr = i;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 238 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 239 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 240
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 241 logDebug("Session pwr: %d ant: %d max: %d", GetSettings()->Session.TxPower, GetSettings()->Network.AntennaGain, max_pwr);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 242 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 243
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 244 uint32_t bw = txDr.Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 245 uint32_t sf = txDr.SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 246 uint8_t cr = txDr.Coderate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 247 uint8_t pl = txDr.PreambleLength;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 248 uint16_t fdev = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 249 bool crc = txDr.Crc;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 250 bool iq = txDr.TxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 251
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 252 if (GetSettings()->Network.DisableCRC == true)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 253 crc = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 254
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 255 SxRadio::RadioModems_t modem = SxRadio::MODEM_LORA;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 256
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 257 if (sf == SF_FSK) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 258 modem = SxRadio::MODEM_FSK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 259 sf = 50e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 260 fdev = 25e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 261 bw = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 262 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 263
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 264 GetRadio()->SetTxConfig(modem, pwr, fdev, bw, sf, cr, pl, false, crc, false, 0, iq, 3e3);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 265
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 266 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 267
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 268 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 269 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 270
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 271
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 272 uint8_t ChannelPlan_KR920::SetRxConfig(uint8_t window, bool continuous, uint16_t wnd_growth) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 273
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 274 RxWindow rxw = GetRxWindow(window);
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 275
Jenkins@KEILDM1.dc.multitech.prv 157:8e9b1e84ffac 276 if (_dlChannels[_txChannel].Frequency != 0 && window == 1)
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 277 GetRadio()->SetChannel(_dlChannels[_txChannel].Frequency);
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 278 else
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 279 GetRadio()->SetChannel(rxw.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 280
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 281 Datarate rxDr = GetDatarate(rxw.DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 282 uint32_t bw = rxDr.Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 283 uint32_t sf = rxDr.SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 284 uint8_t cr = rxDr.Coderate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 285 uint8_t pl = rxDr.PreambleLength;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 286 uint16_t sto = rxDr.SymbolTimeout() * wnd_growth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 287 uint32_t afc = 0;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 288 bool fixLen = false;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 289 uint8_t payloadLen = 0U;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 290 bool crc = false; // downlink does not use CRC according to LORAWAN
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 291
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 292 if (GetSettings()->Network.DisableCRC == true)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 293 crc = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 294
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 295 Datarate txDr = GetDatarate(GetSettings()->Session.TxDatarate);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 296 bool iq = txDr.RxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 297
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 298 if (P2PEnabled()) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 299 iq = txDr.TxIQ;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 300 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 301
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 302 // Beacon modifications - no I/Q inversion, fixed length rx, preamble
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 303 if (window == RX_BEACON) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 304 iq = txDr.TxIQ;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 305 fixLen = true;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 306 payloadLen = sizeof(BCNPayload);
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 307 pl = BEACON_PREAMBLE_LENGTH;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 308 }
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 309
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 310 SxRadio::RadioModems_t modem = SxRadio::MODEM_LORA;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 311
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 312 if (sf == SF_FSK) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 313 modem = SxRadio::MODEM_FSK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 314 sf = 50e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 315 cr = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 316 bw = 50e3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 317 afc = 83333;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 318 iq = false;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 319 crc = true; // FSK must use CRC
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 320 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 321
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 322 // Disable printf's to actually receive packets, printing to debug may mess up the timing
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 323 // logTrace("Configure radio for RX%d on freq: %lu", window, rxw.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 324 // 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 325
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 326 GetRadio()->SetRxConfig(modem, bw, sf, cr, afc, pl, sto, fixLen, payloadLen, crc, false, 0, iq, continuous);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 327
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 328 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 329 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 330
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 331 Channel ChannelPlan_KR920::GetChannel(int8_t index) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 332 Channel chan;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 333 memset(&chan, 0, sizeof(Channel));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 334
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 335 chan = _channels[index];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 336
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 337 return chan;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 338 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 339
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 340 uint8_t ChannelPlan_KR920::SetFrequencySubBand(uint8_t sub_band) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 341 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 342 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 343
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 344 void ChannelPlan_KR920::LogRxWindow(uint8_t wnd) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 345
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 346 RxWindow rxw = GetRxWindow(wnd);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 347 Datarate rxDr = GetDatarate(rxw.DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 348 uint8_t bw = rxDr.Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 349 uint8_t sf = rxDr.SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 350 uint8_t cr = rxDr.Coderate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 351 uint8_t pl = rxDr.PreambleLength;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 352 uint16_t sto = rxDr.SymbolTimeout();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 353 bool crc = false; // downlink does not use CRC according to LORAWAN
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 354 bool iq = GetTxDatarate().RxIQ;
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 355 uint32_t freq = rxw.Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 356
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 357 if (wnd == 1 && _dlChannels[_txChannel].Frequency != 0)
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 358 freq = _dlChannels[_txChannel].Frequency;
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 359
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 360 logTrace("RX%d on freq: %lu", wnd, freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 361 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 362 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 363
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 364 RxWindow ChannelPlan_KR920::GetRxWindow(uint8_t window) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 365 RxWindow rxw;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 366 int index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 367
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 368 if (P2PEnabled()) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 369 rxw.Frequency = GetSettings()->Network.TxFrequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 370 index = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 371 } else {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 372 switch (window) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 373 case RX_1:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 374 // Use same frequency as TX
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 375 rxw.Frequency = _channels[_txChannel].Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 376
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 377 if (GetSettings()->Session.TxDatarate > GetSettings()->Session.Rx1DatarateOffset) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 378 index = GetSettings()->Session.TxDatarate - GetSettings()->Session.Rx1DatarateOffset;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 379 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 380 index = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 381 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 382
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 383 break;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 384
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 385 case RX_BEACON:
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 386 rxw.Frequency = GetSettings()->Session.BeaconFrequency;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 387 index = GetSettings()->Session.BeaconDatarateIndex;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 388 break;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 389
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 390 case RX_SLOT:
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 391 rxw.Frequency = GetSettings()->Session.PingSlotFrequency;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 392 index = GetSettings()->Session.PingSlotDatarateIndex;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 393 break;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 394
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 395 // RX2, RXC, RX_TEST, etc..
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 396 default:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 397 rxw.Frequency = GetSettings()->Session.Rx2Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 398 index = GetSettings()->Session.Rx2DatarateIndex;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 399 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 400 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 401
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 402 rxw.DatarateIndex = index;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 403
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 404 return rxw;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 405 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 406
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 407 uint8_t ChannelPlan_KR920::HandleRxParamSetup(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 408 status = 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 409 int8_t datarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 410 int8_t drOffset = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 411 uint32_t freq = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 412
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 413 drOffset = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 414 datarate = drOffset & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 415 drOffset = (drOffset >> 4) & 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 416
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 417 freq = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 418 freq |= payload[index++] << 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 419 freq |= payload[index++] << 16;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 420 freq *= 100;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 421
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 422 if (!CheckRfFrequency(freq)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 423 logInfo("Freq KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 424 status &= 0xFE; // Channel frequency KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 425 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 426
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 427 if (datarate < _minRx2Datarate || datarate > _maxRx2Datarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 428 logInfo("DR KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 429 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 430 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 431
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 432 if (drOffset < 0 || drOffset > _maxDatarateOffset) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 433 logInfo("DR Offset KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 434 status &= 0xFB; // Rx1DrOffset range KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 435 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 436
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 437 if ((status & 0x07) == 0x07) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 438 logInfo("RxParamSetup accepted Rx2DR: %d Rx2Freq: %d Rx1Offset: %d", datarate, freq, drOffset);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 439 SetRx2DatarateIndex(datarate);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 440 SetRx2Frequency(freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 441 SetRx1Offset(drOffset);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 442 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 443 logInfo("RxParamSetup rejected Rx2DR: %d Rx2Freq: %d Rx1Offset: %d", datarate, freq, drOffset);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 444 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 445
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 446 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 447 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 448
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 449 uint8_t ChannelPlan_KR920::HandleNewChannel(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 450
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 451 status = 0x03;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 452 uint8_t channelIndex = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 453 Channel chParam;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 454
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 455 channelIndex = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 456 lora::CopyFreqtoInt(payload + index, chParam.Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 457 index += 3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 458 chParam.DrRange.Value = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 459
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 460 if (channelIndex < 3 || channelIndex > _channels.size() - 1) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 461 logError("New Channel index KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 462 status &= 0xFE; // Channel index KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 463 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 464
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 465 if (chParam.Frequency == 0) {
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 466 chParam.DrRange.Value = 0;
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 467 } else if (chParam.Frequency < _minFrequency || chParam.Frequency > _maxFrequency) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 468 logError("New Channel frequency KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 469 status &= 0xFE; // Channel frequency KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 470 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 471
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 472 if (chParam.DrRange.Fields.Min > chParam.DrRange.Fields.Max && chParam.Frequency != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 473 logError("New Channel datarate min/max KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 474 status &= 0xFD; // Datarate range KO
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 475 } else if ((chParam.DrRange.Fields.Min < _minDatarate || chParam.DrRange.Fields.Min > _maxDatarate) &&
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 476 chParam.Frequency != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 477 logError("New Channel datarate min KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 478 status &= 0xFD; // Datarate range KO
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 479 } else if ((chParam.DrRange.Fields.Max < _minDatarate || chParam.DrRange.Fields.Max > _maxDatarate) &&
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 480 chParam.Frequency != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 481 logError("New Channel datarate max KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 482 status &= 0xFD; // Datarate range KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 483 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 484
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 485 if ((status & 0x03) == 0x03) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 486 logInfo("New Channel accepted index: %d freq: %lu drRange: %02x", channelIndex, chParam.Frequency, chParam.DrRange.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 487 AddChannel(channelIndex, chParam);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 488 SetChannelMask(0, _channelMask[0] | 1 << (channelIndex));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 489 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 490
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 491 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 492 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 493
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 494 uint8_t ChannelPlan_KR920::HandlePingSlotChannelReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 495 uint8_t datarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 496 uint32_t freq = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 497
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 498 status = 0x03;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 499
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 500 freq = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 501 freq |= payload[index++] << 8;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 502 freq |= payload[index++] << 16;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 503 freq *= 100;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 504
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 505 datarate = payload[index] & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 506
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 507 if (freq == 0U) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 508 logInfo("Received request to reset ping slot frequency to default");
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 509 freq = KR920_BEACON_FREQ;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 510 } else if (!CheckRfFrequency(freq)) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 511 logInfo("Freq KO");
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 512 status &= 0xFE; // Channel frequency KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 513 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 514
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 515 if (datarate < _minRx2Datarate || datarate > _maxRx2Datarate) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 516 logInfo("DR KO");
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 517 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 518 }
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 519
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 520 if ((status & 0x03) == 0x03) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 521 logInfo("PingSlotChannelReq accepted DR: %d Freq: %d", datarate, freq);
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 522 GetSettings()->Session.PingSlotFrequency = freq;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 523 GetSettings()->Session.PingSlotDatarateIndex = datarate;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 524 } else {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 525 logInfo("PingSlotChannelReq rejected DR: %d Freq: %d", datarate, freq);
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 526 }
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 527
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 528 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 529 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 530
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 531 uint8_t ChannelPlan_KR920::HandleBeaconFrequencyReq(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 532 uint32_t freq = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 533
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 534 status = 0x01;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 535
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 536 freq = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 537 freq |= payload[index++] << 8;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 538 freq |= payload[index] << 16;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 539 freq *= 100;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 540
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 541 if (freq == 0U) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 542 logInfo("Received request to reset beacon frequency to default");
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 543 freq = KR920_BEACON_FREQ;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 544 } else if (!CheckRfFrequency(freq)) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 545 logInfo("Freq KO");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 546 status &= 0xFE; // Channel frequency KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 547 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 548
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 549 if (status & 0x01) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 550 logInfo("BeaconFrequencyReq accepted Freq: %d", freq);
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 551 GetSettings()->Session.BeaconFrequency = freq;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 552 } else {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 553 logInfo("BeaconFrequencyReq rejected Freq: %d", freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 554 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 555
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 556 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 557 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 558
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 559
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 560 uint8_t ChannelPlan_KR920::HandleAdrCommand(const uint8_t* payload, uint8_t index, uint8_t size, uint8_t& status) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 561 uint8_t power = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 562 uint8_t datarate = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 563 uint16_t mask = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 564 uint16_t new_mask = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 565 uint8_t ctrl = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 566 uint8_t nbRep = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 567
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 568 status = 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 569 datarate = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 570 power = datarate & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 571 datarate = (datarate >> 4) & 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 572
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 573 mask = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 574 mask |= payload[index++] << 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 575
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 576 nbRep = payload[index++];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 577 ctrl = (nbRep >> 4) & 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 578 nbRep &= 0x0F;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 579
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 580 if (nbRep == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 581 nbRep = 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 582 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 583
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 584 if (datarate > _maxDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 585 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 586 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 587 //
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 588 // Remark MaxTxPower = 0 and MinTxPower = 7
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 589 //
Jenkins@KEILDM1.dc.multitech.prv 151:2242ecfd733a 590 if (power > 7) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 591 status &= 0xFB; // TxPower KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 592 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 593
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 594 switch (ctrl) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 595 case 0:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 596 SetChannelMask(0, mask);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 597 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 598
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 599 case 6:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 600 // enable all currently defined channels
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 601 // set bits 0 - N of a number by (2<<N)-1
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 602 new_mask = (1 << _channels.size()) - 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 603 SetChannelMask(0, new_mask);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 604 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 605
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 606 default:
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 607 logWarning("rejecting RFU or unknown control value %d", ctrl);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 608 status &= 0xFE; // ChannelMask KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 609 return LORA_ERROR;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 610 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 611
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 612 if (GetSettings()->Network.ADREnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 613 GetSettings()->Session.TxDatarate = datarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 614 GetSettings()->Session.TxPower = TX_POWERS[power];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 615 GetSettings()->Session.Redundancy = nbRep;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 616 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 617 logDebug("ADR is disabled, DR and Power not changed.");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 618 status &= 0xFB; // TxPower KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 619 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 620 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 621
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 622 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 623
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 624 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 625 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 626
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 627 uint8_t ChannelPlan_KR920::ValidateAdrConfiguration() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 628 uint8_t status = 0x07;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 629 uint8_t datarate = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 630 uint8_t power = GetSettings()->Session.TxPower;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 631
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 632 if (!GetSettings()->Network.ADREnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 633 logDebug("ADR disabled - no applied changes to validate");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 634 return status;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 635 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 636
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 637 if (datarate > _maxDatarate) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 638 logWarning("ADR Datarate KO - outside allowed range");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 639 status &= 0xFD; // Datarate KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 640 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 641 if (power < _minTxPower || power > _maxTxPower) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 642 logWarning("ADR TX Power KO - outside allowed range");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 643 status &= 0xFB; // TxPower KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 644 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 645
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 646 // mask must not contain any undefined channels
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 647 for (int i = 3; i < 16; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 648 if ((_channelMask[0] & (1 << i)) && (_channels[i].Frequency == 0)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 649 logWarning("ADR Channel Mask KO - cannot enable undefined channel");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 650 status &= 0xFE; // ChannelMask KO
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 651 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 652 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 653 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 654
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 655 return status;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 656 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 657
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 658 uint8_t ChannelPlan_KR920::HandleAckTimeout() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 659
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 660 if (!GetSettings()->Network.ADREnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 661 return LORA_ADR_OFF;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 662 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 663
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 664 if ((++(GetSettings()->Session.AckCounter) % 2) == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 665 if (GetSettings()->Session.TxPower < GetSettings()->Network.TxPowerMax) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 666 logTrace("ADR Setting power to maximum");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 667 GetSettings()->Session.TxPower = GetSettings()->Network.TxPowerMax;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 668 } else if (GetSettings()->Session.TxDatarate > 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 669 logTrace("ADR Lowering datarate");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 670 (GetSettings()->Session.TxDatarate)--;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 671 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 672 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 673
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 674 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 675 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 676
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 677
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 678 uint32_t ChannelPlan_KR920::GetTimeOffAir()
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 679 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 680 if (GetSettings()->Test.DisableDutyCycle == lora::ON)
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 681 return 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 682
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 683 uint32_t min = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 684 uint32_t now = _dutyCycleTimer.read_ms();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 685
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 686
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 687 min = UINT_MAX;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 688 int8_t band = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 689
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 690 if (P2PEnabled()) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 691 int8_t band = GetDutyBand(GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 692 if (_dutyBands[band].TimeOffEnd > now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 693 min = _dutyBands[band].TimeOffEnd - now;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 694 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 695 min = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 696 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 697 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 698 for (size_t i = 0; i < _channels.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 699 if (IsChannelEnabled(i) && GetChannel(i).Frequency != 0 &&
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 700 !(GetSettings()->Session.TxDatarate < GetChannel(i).DrRange.Fields.Min ||
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 701 GetSettings()->Session.TxDatarate > GetChannel(i).DrRange.Fields.Max)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 702
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 703 band = GetDutyBand(GetChannel(i).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 704 if (band != -1) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 705 // logDebug("band: %d time-off: %d now: %d", band, _dutyBands[band].TimeOffEnd, now);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 706 if (_dutyBands[band].TimeOffEnd > now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 707 min = std::min < uint32_t > (min, _dutyBands[band].TimeOffEnd - now);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 708 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 709 min = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 710 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 711 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 712 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 713 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 714 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 715 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 716
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 717
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 718 if (GetSettings()->Session.AggregatedTimeOffEnd > 0 && GetSettings()->Session.AggregatedTimeOffEnd > now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 719 min = std::max < uint32_t > (min, GetSettings()->Session.AggregatedTimeOffEnd - now);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 720 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 721
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 722 now = time(NULL);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 723 uint32_t join_time = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 724
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 725 if (GetSettings()->Session.JoinFirstAttempt != 0 && now < GetSettings()->Session.JoinTimeOffEnd) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 726 join_time = (GetSettings()->Session.JoinTimeOffEnd - now) * 1000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 727 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 728
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 729 min = std::max < uint32_t > (join_time, min);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 730
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 731 return min;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 732 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 733
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 734
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 735 void ChannelPlan_KR920::UpdateDutyCycle(uint32_t freq, uint32_t time_on_air_ms) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 736 if (GetSettings()->Test.DisableDutyCycle == lora::ON) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 737 _dutyCycleTimer.stop();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 738 for (size_t i = 0; i < _dutyBands.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 739 _dutyBands[i].TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 740 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 741 return;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 742 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 743
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 744 _dutyCycleTimer.start();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 745
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 746 if (GetSettings()->Session.MaxDutyCycle > 0 && GetSettings()->Session.MaxDutyCycle <= 15) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 747 GetSettings()->Session.AggregatedTimeOffEnd = _dutyCycleTimer.read_ms() + time_on_air_ms * GetSettings()->Session.AggregateDutyCycle;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 748 logDebug("Updated Aggregate DCycle Time-off: %lu DC: %f%%", GetSettings()->Session.AggregatedTimeOffEnd, 1 / float(GetSettings()->Session.AggregateDutyCycle));
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 749 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 750 GetSettings()->Session.AggregatedTimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 751 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 752
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 753
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 754 uint32_t time_off_air = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 755 uint32_t now = _dutyCycleTimer.read_ms();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 756
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 757 for (size_t i = 0; i < _dutyBands.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 758 if (_dutyBands[i].TimeOffEnd < now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 759 _dutyBands[i].TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 760 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 761 _dutyBands[i].TimeOffEnd -= now;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 762 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 763
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 764 if (freq >= _dutyBands[i].FrequencyMin && freq <= _dutyBands[i].FrequencyMax) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 765 logDebug("update TOE: freq: %d i:%d toa: %d DC:%d", freq, i, time_on_air_ms, _dutyBands[i].DutyCycle);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 766
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 767 if (freq > _minFrequency && freq < _maxFrequency && (GetSettings()->Session.TxPower + GetSettings()->Network.AntennaGain) <= 7) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 768 _dutyBands[i].TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 769 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 770 time_off_air = time_on_air_ms * _dutyBands[i].DutyCycle;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 771 _dutyBands[i].TimeOffEnd = time_off_air;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 772 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 773 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 774 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 775
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 776
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 777 ResetDutyCycleTimer();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 778 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 779
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 780 std::vector<uint32_t> lora::ChannelPlan_KR920::GetChannels() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 781 std::vector < uint32_t > chans;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 782
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 783 for (int8_t i = 0; i < (int) _channels.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 784 chans.push_back(_channels[i].Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 785 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 786 chans.push_back(GetRxWindow(2).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 787
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 788 return chans;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 789 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 790
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 791 std::vector<uint8_t> lora::ChannelPlan_KR920::GetChannelRanges() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 792 std::vector < uint8_t > ranges;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 793
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 794 for (int8_t i = 0; i < (int) _channels.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 795 ranges.push_back(_channels[i].DrRange.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 796 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 797
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 798 ranges.push_back(GetRxWindow(2).DatarateIndex);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 799
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 800 return ranges;
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 void lora::ChannelPlan_KR920::EnableDefaultChannels() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 805 _channelMask[0] |= 0x0003;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 806 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 807
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 808 uint8_t ChannelPlan_KR920::GetNextChannel()
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 809 {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 810 if (GetSettings()->Session.AggregatedTimeOffEnd != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 811 return LORA_AGGREGATED_DUTY_CYCLE;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 812 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 813
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 814 if (P2PEnabled() || GetSettings()->Network.TxFrequency != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 815 logDebug("Using frequency %d", GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 816
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 817 if (GetSettings()->Test.DisableDutyCycle != lora::ON) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 818 int8_t band = GetDutyBand(GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 819 logDebug("band: %d freq: %d", band, GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 820 if (band != -1 && _dutyBands[band].TimeOffEnd != 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 821 return LORA_NO_CHANS_ENABLED;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 822 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 823 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 824
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 825 GetRadio()->SetChannel(GetSettings()->Network.TxFrequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 826 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 827 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 828
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 829 uint8_t start = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 830 uint8_t maxChannels = _numChans125k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 831 uint8_t nbEnabledChannels = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 832 uint8_t *enabledChannels = new uint8_t[maxChannels];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 833
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 834 if (GetTxDatarate().Bandwidth == BW_500) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 835 maxChannels = _numChans500k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 836 start = _numChans125k;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 837 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 838
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 839 // Search how many channels are enabled
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 840 DatarateRange range;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 841 uint8_t dr_index = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 842 uint32_t now = _dutyCycleTimer.read_ms();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 843
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 844 for (size_t i = 0; i < _dutyBands.size(); i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 845 if (_dutyBands[i].TimeOffEnd < now || GetSettings()->Test.DisableDutyCycle == lora::ON) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 846 _dutyBands[i].TimeOffEnd = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 847 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 848 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 849
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 850 for (uint8_t i = start; i < start + maxChannels; i++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 851 range = GetChannel(i).DrRange;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 852 // logDebug("chan: %d freq: %d range:%02x", i, GetChannel(i).Frequency, range.Value);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 853
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 854 if (IsChannelEnabled(i) && (dr_index >= range.Fields.Min && dr_index <= range.Fields.Max)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 855 int8_t band = GetDutyBand(GetChannel(i).Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 856 // logDebug("band: %d freq: %d", band, _channels[i].Frequency);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 857 if (band != -1 && _dutyBands[band].TimeOffEnd == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 858 enabledChannels[nbEnabledChannels++] = i;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 859 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 860 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 861 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 862
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 863 logTrace("Number of available channels: %d", nbEnabledChannels);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 864
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 865 uint32_t freq = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 866 uint8_t sf = GetTxDatarate().SpreadingFactor;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 867 uint8_t bw = GetTxDatarate().Bandwidth;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 868 int16_t thres = DEFAULT_FREE_CHAN_RSSI_THRESHOLD;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 869
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 870 if (nbEnabledChannels == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 871 delete [] enabledChannels;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 872 return LORA_NO_CHANS_ENABLED;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 873 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 874
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 875 if (GetSettings()->Network.CADEnabled) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 876 // Search for free channel with ms timeout
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 877 int16_t timeout = 10000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 878 Timer tmr;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 879 tmr.start();
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 880
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 881 for (uint8_t j = rand_r(0, nbEnabledChannels - 1); tmr.read_ms() < timeout; j++) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 882 freq = GetChannel(enabledChannels[j]).Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 883
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 884 if (GetRadio()->IsChannelFree(SxRadio::MODEM_LORA, freq, sf, thres, bw)) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 885 _txChannel = enabledChannels[j];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 886 break;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 887 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 888 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 889 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 890 uint8_t j = rand_r(0, nbEnabledChannels - 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 891 _txChannel = enabledChannels[j];
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 892 freq = GetChannel(_txChannel).Frequency;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 893 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 894
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 895 assert(freq != 0);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 896
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 897 logDebug("Using channel %d : %d", _txChannel, freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 898 GetRadio()->SetChannel(freq);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 899
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 900 delete [] enabledChannels;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 901 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 902 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 903
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 904
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 905 uint8_t lora::ChannelPlan_KR920::GetJoinDatarate() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 906 uint8_t dr = GetSettings()->Session.TxDatarate;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 907 static uint8_t cnt = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 908
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 909 if (GetSettings()->Test.DisableRandomJoinDatarate == lora::OFF) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 910 if ((cnt++ % 20) == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 911 dr = lora::DR_0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 912 } else if ((cnt % 16) == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 913 dr = lora::DR_1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 914 } else if ((cnt % 12) == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 915 dr = lora::DR_2;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 916 } else if ((cnt % 8) == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 917 dr = lora::DR_3;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 918 } else if ((cnt % 4) == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 919 dr = lora::DR_4;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 920 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 921 dr = lora::DR_5;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 922 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 923 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 924
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 925 return dr;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 926 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 927
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 928 uint8_t ChannelPlan_KR920::CalculateJoinBackoff(uint8_t size) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 929
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 930 time_t now = time(NULL);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 931 uint32_t time_on_max = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 932 static uint32_t time_off_max = 15;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 933 uint32_t rand_time_off = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 934
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 935 // 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 936
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 937 if ((time_t)GetSettings()->Session.JoinTimeOffEnd > now) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 938 return LORA_JOIN_BACKOFF;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 939 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 940
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 941 uint32_t secs_since_first_attempt = (now - GetSettings()->Session.JoinFirstAttempt);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 942 uint16_t hours_since_first_attempt = secs_since_first_attempt / (60 * 60);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 943
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 944 static uint8_t join_cnt = 0;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 945
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 946 join_cnt = (join_cnt+1) % 8;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 947
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 948 if (GetSettings()->Session.JoinFirstAttempt == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 949 /* 1 % duty-cycle for first hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 950 * 0.1 % next 10 hours
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 951 * 0.01 % upto 24 hours */
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 952 GetSettings()->Session.JoinFirstAttempt = now;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 953 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 954 GetSettings()->Session.JoinTimeOffEnd = now + (GetTimeOnAir(size) / 10);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 955 } else if (join_cnt == 0) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 956 if (hours_since_first_attempt < 1) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 957 time_on_max = 36000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 958 rand_time_off = rand_r(time_off_max - 1, time_off_max + 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 959 // time off max 1 hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 960 time_off_max = std::min < uint32_t > (time_off_max * 2, 60 * 60);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 961
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 962 if (GetSettings()->Session.JoinTimeOnAir < time_on_max) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 963 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 964 GetSettings()->Session.JoinTimeOffEnd = now + rand_time_off;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 965 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 966 logWarning("Max time-on-air limit met for current join backoff period");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 967 GetSettings()->Session.JoinTimeOffEnd = GetSettings()->Session.JoinFirstAttempt + 60 * 60;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 968 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 969 } else if (hours_since_first_attempt < 11) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 970 if (GetSettings()->Session.JoinTimeOnAir < 36000) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 971 GetSettings()->Session.JoinTimeOnAir = 36000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 972 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 973 time_on_max = 72000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 974 rand_time_off = rand_r(time_off_max - 1, time_off_max + 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 975 // time off max 1 hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 976 time_off_max = std::min < uint32_t > (time_off_max * 2, 60 * 60);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 977
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 978 if (GetSettings()->Session.JoinTimeOnAir < time_on_max) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 979 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 980 GetSettings()->Session.JoinTimeOffEnd = now + rand_time_off;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 981 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 982 logWarning("Max time-on-air limit met for current join backoff period");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 983 GetSettings()->Session.JoinTimeOffEnd = GetSettings()->Session.JoinFirstAttempt + 11 * 60 * 60;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 984 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 985 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 986 if (GetSettings()->Session.JoinTimeOnAir < 72000) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 987 GetSettings()->Session.JoinTimeOnAir = 72000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 988 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 989 uint32_t join_time = 2500;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 990
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 991 time_on_max = 80700;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 992 time_off_max = 1 * 60 * 60; // 1 hour
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 993 rand_time_off = rand_r(time_off_max - 1, time_off_max + 1);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 994
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 995 if (GetSettings()->Session.JoinTimeOnAir < time_on_max - join_time) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 996 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 997 GetSettings()->Session.JoinTimeOffEnd = now + rand_time_off;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 998 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 999 logWarning("Max time-on-air limit met for current join backoff period");
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1000 // Reset the join time on air and set end of restriction to the next 24 hour period
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1001 GetSettings()->Session.JoinTimeOnAir = 72000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1002 uint16_t days = (now - GetSettings()->Session.JoinFirstAttempt) / (24 * 60 * 60) + 1;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1003 logWarning("days : %d", days);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1004 GetSettings()->Session.JoinTimeOffEnd = GetSettings()->Session.JoinFirstAttempt + ((days * 24) + 11) * 60 * 60;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1005 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1006 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1007
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1008 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 1009 } else {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1010 GetSettings()->Session.JoinTimeOnAir += GetTimeOnAir(size);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1011 GetSettings()->Session.JoinTimeOffEnd = now + (GetTimeOnAir(size) / 10);
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1012 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1013
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1014 return LORA_OK;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1015 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1016
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1017 uint8_t ChannelPlan_KR920::HandleMacCommand(uint8_t* payload, uint8_t& index) {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1018 return LORA_ERROR;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1019 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1020
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1021 void ChannelPlan_KR920::DefaultLBT() {
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1022 _LBT_TimeUs = 5000;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1023 _LBT_Threshold = -65;
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1024 }
Jenkins@KEILDM1.dc.multitech.prv 82:0f5a742a08cd 1025
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1026 bool ChannelPlan_KR920::DecodeBeacon(const uint8_t* payload, size_t size, BeaconData_t& data) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1027 uint16_t crc1, crc1_rx, crc2, crc2_rx;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1028 const BCNPayload* beacon = (const BCNPayload*)payload;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1029
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1030 // First check the size of the packet
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1031 if (size != sizeof(BCNPayload))
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1032 return false;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1033
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1034 // Next we verify the CRCs are correct
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1035 crc1 = CRC16(beacon->RFU, sizeof(beacon->RFU) + sizeof(beacon->Time));
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1036 memcpy((uint8_t*)&crc1_rx, beacon->CRC1, sizeof(uint16_t));
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1037
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1038 if (crc1 != crc1_rx)
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1039 return false;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1040
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1041 crc2 = CRC16(beacon->GwSpecific, sizeof(beacon->GwSpecific));
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1042 memcpy((uint8_t*)&crc2_rx, beacon->CRC2, sizeof(uint16_t));
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1043
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1044 if (crc2 != crc2_rx)
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1045 return false;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1046
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1047 // Now that we have confirmed this packet is a beacon, parse and complete the output struct
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1048 memcpy(&data.Time, beacon->Time, sizeof(beacon->Time));
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1049 data.InfoDesc = beacon->GwSpecific[0];
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1050
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1051 // Update the GPS fields if we have a gps info descriptor
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1052 if (data.InfoDesc == GPS_FIRST_ANTENNA ||
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1053 data.InfoDesc == GPS_SECOND_ANTENNA ||
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1054 data.InfoDesc == GPS_THIRD_ANTENNA) {
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1055 // Latitude and Longitude 3 bytes in length
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1056 memcpy(&data.Latitude, &beacon->GwSpecific[1], 3);
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1057 memcpy(&data.Longitude, &beacon->GwSpecific[4], 3);
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1058 }
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1059
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1060 return true;
Jenkins@KEILDM1.dc.multitech.prv 172:7ec44396a51b 1061 }