From 2efd020ea1889e15d9e06dac64d69d799b192008 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 14 Apr 2020 10:48:07 +0200 Subject: [PATCH] [LoRaWAN] Added dev files --- .../LoRaWAN_End_Device_APB.ino | 16 ++++ src/protocols/LoRaWAN/LoRaWAN.cpp | 96 +++++++++++++++++++ src/protocols/LoRaWAN/LoRaWAN.h | 62 ++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 examples/LoRaWAN/LoRaWAN_End_Device_APB/LoRaWAN_End_Device_APB.ino create mode 100644 src/protocols/LoRaWAN/LoRaWAN.cpp create mode 100644 src/protocols/LoRaWAN/LoRaWAN.h diff --git a/examples/LoRaWAN/LoRaWAN_End_Device_APB/LoRaWAN_End_Device_APB.ino b/examples/LoRaWAN/LoRaWAN_End_Device_APB/LoRaWAN_End_Device_APB.ino new file mode 100644 index 00000000..b5eb62f4 --- /dev/null +++ b/examples/LoRaWAN/LoRaWAN_End_Device_APB/LoRaWAN_End_Device_APB.ino @@ -0,0 +1,16 @@ +#define RADIOLIB_GODMODE +#include + +SX1268 lora = new Module(10, 2, 3, 9); + +LoRaWANNode node(&lora, &EU868); + +void setup() { + Serial.begin(9600); + Serial.println(node._band->uplinkDefault[0].freqStart); +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/src/protocols/LoRaWAN/LoRaWAN.cpp b/src/protocols/LoRaWAN/LoRaWAN.cpp new file mode 100644 index 00000000..d6a9d2f1 --- /dev/null +++ b/src/protocols/LoRaWAN/LoRaWAN.cpp @@ -0,0 +1,96 @@ +#include "LoRaWAN.h" + +/*LoRaWANBand_t EU868 { + .numChannelSpans = 2, + .downlinkChannelMod = 0xFF, + .uplinkDefault = { + { + .numChannels = 3, + .freqStart = 868.1, + .freqStep = 0.2, + .numDataRates = 6, + .dataRates = { + LORAWAN_DATA_RATE_SF_12 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_11 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_10 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_9 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_8 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_7 | LORAWAN_DATA_RATE_BW_125_KHZ + } + }, { + .numChannels = 0, + .freqStart = 0, + .freqStep = 0, + .numDataRates = 0, + .dataRates = { } + } + }, + .uplinkAvailable = { + .numChannels = 3, + .freqStart = 868.1, + .freqStep = 0.2, + .numDataRates = 6, + .dataRates = { + LORAWAN_DATA_RATE_SF_12 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_11 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_10 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_9 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_8 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_7 | LORAWAN_DATA_RATE_BW_125_KHZ + } + }, + .downlinkDefault = { + { + .numChannels = 3, + .freqStart = 868.1, + .freqStep = 0.2, + .numDataRates = 6, + .dataRates = { + LORAWAN_DATA_RATE_SF_12 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_11 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_10 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_9 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_8 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_7 | LORAWAN_DATA_RATE_BW_125_KHZ + } + }, { + .numChannels = 0, + .freqStart = 0, + .freqStep = 0, + .numDataRates = 0, + .dataRates = { } + } + }, + .downlinkAvailable = { + .numChannels = 3, + .freqStart = 868.1, + .freqStep = 0.2, + .numDataRates = 6, + .dataRates = { + LORAWAN_DATA_RATE_SF_12 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_11 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_10 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_9 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_8 | LORAWAN_DATA_RATE_BW_125_KHZ, + LORAWAN_DATA_RATE_SF_7 | LORAWAN_DATA_RATE_BW_125_KHZ + } + }, + .downlinkBackup = { + .numChannels = 1, + .freqStart = 869.858, + .freqStep = 0, + .numDataRates = 1, + .dataRates = { + LORAWAN_DATA_RATE_SF_12 | LORAWAN_DATA_RATE_BW_125_KHZ + } + } +};*/ + +uint8_t EU868::getDownlinkChannel(uint8_t txChan) { + return(txChan); +} + +LoRaWANNode::LoRaWANNode(PhysicalLayer* phy, LoRaWANBand_t* band) { + _phy = phy; + _band = band; +} diff --git a/src/protocols/LoRaWAN/LoRaWAN.h b/src/protocols/LoRaWAN/LoRaWAN.h new file mode 100644 index 00000000..7ceba636 --- /dev/null +++ b/src/protocols/LoRaWAN/LoRaWAN.h @@ -0,0 +1,62 @@ +#ifndef _RADIOLIB_LORAWAN_H +#define _RADIOLIB_LORAWAN_H + +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" + +//https://github.com/Lora-net/LoRaMac-node + +// preamble format +#define LORAWAN_LORA_SYNC_WORD 0x34 +#define LORAWAN_LORA_PREAMBLE_LEN 8 +#define LORAWAN_GFSK_SYNC_WORD 0xC194C1 +#define LORAWAN_GFSK_PREAMBLE_LEN 5 + +// data rate field encoding MSB LSB DESCRIPTION +#define LORAWAN_DATA_RATE_SF_12 0b00000000 // 7 4 LoRaWAN spreading factor: SF12 +#define LORAWAN_DATA_RATE_SF_11 0b00010000 // 7 4 SF11 +#define LORAWAN_DATA_RATE_SF_10 0b00100000 // 7 4 SF10 +#define LORAWAN_DATA_RATE_SF_9 0b00110000 // 7 4 SF9 +#define LORAWAN_DATA_RATE_SF_8 0b01000000 // 7 4 SF8 +#define LORAWAN_DATA_RATE_SF_7 0b01010000 // 7 4 SF7 +#define LORAWAN_DATA_RATE_FSK_50_K 0b01100000 // 7 4 FSK @ 50 kbps +#define LORAWAN_DATA_RATE_BW_500_KHZ 0b00000000 // 3 0 LoRaWAN bandwidth: 500 kHz +#define LORAWAN_DATA_RATE_BW_250_KHZ 0b00000001 // 3 0 250 kHz +#define LORAWAN_DATA_RATE_BW_125_KHZ 0b00000010 // 3 0 125 kHz + +// to save space, channels are saved in "spans" +struct LoRaWANChannelSpan_t { + uint8_t numChannels; // total number of channels in the span + float freqStart; // center frequency of the first channel in span + float freqStep; // frequency step between adjacent channels + uint8_t numDataRates; // number of datarates supported by the all channels in the span + uint8_t dataRates[6]; // array of datarates supported by all channels in the span (no channel span has more than 6 allowed data rates) +}; + +struct LoRaWANBand_t { + uint8_t numChannelSpans; // number of channel spans in the band + LoRaWANChannelSpan_t uplinkDefault[2]; // default uplink (TX) channels (defined by LoRaWAN Regional Parameters) + LoRaWANChannelSpan_t uplinkAvailable; // available uplink (TX) channels (not defined by LoRaWAN Regional Parameters) + LoRaWANChannelSpan_t downlinkDefault[2]; // default downlink (RX1) channels (defined by LoRaWAN Regional Parameters) + LoRaWANChannelSpan_t downlinkAvailable; // available downlink (RX1) channels (not defined by LoRaWAN Regional Parameters) + LoRaWANChannelSpan_t downlinkBackup; // backup downlink (RX2) channels - just a single channel, but using the same structure for convenience +}; + +struct EU868: public LoRaWANBand_t { + uint8_t getDownlinkChannel(uint8_t txChan); // method that returns RX1 channel number based on TX channel + uint8_t getDownlinkDataRate(uint8_t offset); // method that returns RX1 channel number based on TX channel +}; + +class LoRaWANNode { + public: + + LoRaWANNode(PhysicalLayer* phy, LoRaWANBand_t* band); + + #ifndef RADIOLIB_GODMODE + private: + #endif + PhysicalLayer* _phy; + LoRaWANBand_t* _band; +}; + +#endif