From 5b4685ac8dbb4bbaa1337a3dbd5afb29a0f5a143 Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 26 Dec 2018 11:36:30 +0100 Subject: [PATCH] [SX127x] Sync with LoRaLib v7.1.0 --- keywords.txt | 2 ++ src/TypeDef.h | 1 + src/modules/SX1272.cpp | 37 ++++++++++++++++++++++++++++++------- src/modules/SX1272.h | 3 ++- src/modules/SX1278.cpp | 37 ++++++++++++++++++++++++++++++------- src/modules/SX1278.h | 3 ++- src/modules/SX127x.cpp | 2 +- 7 files changed, 68 insertions(+), 17 deletions(-) diff --git a/keywords.txt b/keywords.txt index 0ee526c3..c1b55979 100644 --- a/keywords.txt +++ b/keywords.txt @@ -77,6 +77,7 @@ setFrequencyDeviation KEYWORD2 setNodeAddress KEYWORD2 setBroadcastAddress KEYWORD2 disableAddressFiltering KEYWORD2 +setDataShaping KEYWORD2 # RF69-specific setAESKey KEYWORD2 @@ -151,6 +152,7 @@ ERR_INVALID_FREQUENCY_DEVIATION LITERAL1 ERR_INVALID_BIT_RATE_BW_RATIO LITERAL1 ERR_INVALID_RX_BANDWIDTH LITERAL1 ERR_INVALID_SYNC_WORD LITERAL1 +ERR_INVALID_DATA_SHAPING LITERAL1 ERR_AT_FAILED LITERAL1 ERR_URL_MALFORMED LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index ebf6cf8a..3cff33ed 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -87,6 +87,7 @@ #define ERR_INVALID_BIT_RATE_BW_RATIO -103 #define ERR_INVALID_RX_BANDWIDTH -104 #define ERR_INVALID_SYNC_WORD -105 +#define ERR_INVALID_DATA_SHAPING -106 // ESP8266 status codes #define ERR_AT_FAILED -201 diff --git a/src/modules/SX1272.cpp b/src/modules/SX1272.cpp index d19d580e..04288d08 100644 --- a/src/modules/SX1272.cpp +++ b/src/modules/SX1272.cpp @@ -58,7 +58,7 @@ int16_t SX1272::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync return(state); } -int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t currentLimit) { +int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t currentLimit, float sh) { // execute common part int16_t state = SX127x::beginFSK(SX1272_CHIP_VERSION, br, rxBw, freqDev, currentLimit); if(state != ERR_NONE) { @@ -82,6 +82,11 @@ int16_t SX1272::beginFSK(float freq, float br, float rxBw, float freqDev, int8_t return(state); } + state = setDataShaping(sh); + if(state != ERR_NONE) { + return(state); + } + return(state); } @@ -257,6 +262,30 @@ int16_t SX1272::setGain(uint8_t gain) { return(state); } +int16_t SX1272::setDataShaping(float sh) { + // check active modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + // set data shaping + if(abs(sh - 0.0) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_NO_SHAPING, 4, 3); + } else if(abs(sh - 0.3) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_FSK_GAUSSIAN_0_3, 4, 3); + } else if(abs(sh - 0.5) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_FSK_GAUSSIAN_0_5, 4, 3); + } else if(abs(sh - 1.0) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_OP_MODE, SX1272_FSK_GAUSSIAN_1_0, 4, 3); + } else { + return(ERR_INVALID_DATA_SHAPING); + } + return(state); +} + int8_t SX1272::getRSSI() { // check active modem if(getActiveModem() != SX127X_LORA) { @@ -337,12 +366,6 @@ int16_t SX1272::configFSK() { return(state); } - // set data shaping - state = _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1272_FSK_GAUSSIAN_0_3, 6, 5); - if(state != ERR_NONE) { - return(state); - } - // set fast PLL hop state = _mod->SPIsetRegValue(SX1272_REG_PLL_HOP, SX127X_FAST_HOP_ON, 7, 7); diff --git a/src/modules/SX1272.h b/src/modules/SX1272.h index cbea544c..bb1b1adc 100644 --- a/src/modules/SX1272.h +++ b/src/modules/SX1272.h @@ -90,7 +90,7 @@ class SX1272: public SX127x { // basic methods int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - int16_t beginFSK(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13, uint8_t currentLimit = 100); + int16_t beginFSK(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13, uint8_t currentLimit = 100, float sh = 0.3); // configuration methods int16_t setFrequency(float freq); @@ -99,6 +99,7 @@ class SX1272: public SX127x { int16_t setCodingRate(uint8_t cr); int16_t setOutputPower(int8_t power); int16_t setGain(uint8_t gain); + int16_t setDataShaping(float sh); int8_t getRSSI(); protected: diff --git a/src/modules/SX1278.cpp b/src/modules/SX1278.cpp index c4d63e34..91d9ef7a 100644 --- a/src/modules/SX1278.cpp +++ b/src/modules/SX1278.cpp @@ -51,7 +51,7 @@ int16_t SX1278::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t sync return(state); } -int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t currentLimit) { +int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t currentLimit, float sh) { // execute common part int16_t state = SX127x::beginFSK(SX1278_CHIP_VERSION, br, freqDev, rxBw, currentLimit); if(state != ERR_NONE) { @@ -75,6 +75,11 @@ int16_t SX1278::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t return(state); } + state = setDataShaping(sh); + if(state != ERR_NONE) { + return(state); + } + return(state); } @@ -327,6 +332,30 @@ int16_t SX1278::setGain(uint8_t gain) { return(state); } +int16_t SX1278::setDataShaping(float sh) { + // check active modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = SX127x::standby(); + + // set data shaping + if(abs(sh - 0.0) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_NO_SHAPING, 6, 5); + } else if(abs(sh - 0.3) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_0_3, 6, 5); + } else if(abs(sh - 0.5) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_0_5, 6, 5); + } else if(abs(sh - 1.0) <= 0.001) { + state |= _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_1_0, 6, 5); + } else { + return(ERR_INVALID_DATA_SHAPING); + } + return(state); +} + int8_t SX1278::getRSSI() { // check active modem if(getActiveModem() != SX127X_LORA) { @@ -414,12 +443,6 @@ int16_t SX1278::configFSK() { return(state); } - // set data shaping - state = _mod->SPIsetRegValue(SX127X_REG_PA_RAMP, SX1278_FSK_GAUSSIAN_0_3, 6, 5); - if(state != ERR_NONE) { - return(state); - } - // set fast PLL hop state = _mod->SPIsetRegValue(SX1278_REG_PLL_HOP, SX127X_FAST_HOP_ON, 7, 7); diff --git a/src/modules/SX1278.h b/src/modules/SX1278.h index 19ec13c7..a961d2be 100644 --- a/src/modules/SX1278.h +++ b/src/modules/SX1278.h @@ -99,7 +99,7 @@ class SX1278: public SX127x { // basic methods int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 125.0, int8_t power = 13, uint8_t currentLimit = 100); + int16_t beginFSK(float freq = 434.0, float br = 48.0, float freqDev = 50.0, float rxBw = 125.0, int8_t power = 13, uint8_t currentLimit = 100, float sh = 0.3); // configuration methods int16_t setFrequency(float freq); @@ -108,6 +108,7 @@ class SX1278: public SX127x { int16_t setCodingRate(uint8_t cr); int16_t setOutputPower(int8_t power); int16_t setGain(uint8_t gain); + int16_t setDataShaping(float sh); int8_t getRSSI(); protected: diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index bfb9a552..5ce41b2d 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -136,7 +136,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { } float ih = (float)_mod->SPIgetRegValue(SX127X_REG_MODEM_CONFIG_1, 0, 0); float crc = (float)(_mod->SPIgetRegValue(SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); - float n_pre = (float)_mod->SPIgetRegValue(SX127X_REG_PREAMBLE_LSB); + float n_pre = (float)((_mod->SPIgetRegValue(SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(SX127X_REG_PREAMBLE_LSB)); float n_pay = 8.0 + max(ceil((8.0 * (float)len - 4.0 * (float)_sf + 28.0 + 16.0 * crc - 20.0 * ih)/(4.0 * (float)_sf - 8.0 * de)) * (float)_cr, 0.0); uint32_t timeout = ceil(symbolLength * (n_pre + n_pay + 4.25) * 1.5);