[SX127x] Added methods to manually set LoRa LDRO (#162)
This commit is contained in:
parent
96405b938d
commit
58194483b1
4 changed files with 128 additions and 35 deletions
|
@ -106,15 +106,17 @@ int16_t SX1272::setBandwidth(float bw) {
|
||||||
if(state == ERR_NONE) {
|
if(state == ERR_NONE) {
|
||||||
SX127x::_bw = bw;
|
SX127x::_bw = bw;
|
||||||
|
|
||||||
// calculate symbol length and set low data rate optimization, if needed
|
// calculate symbol length and set low data rate optimization, if auto-configuration is enabled
|
||||||
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
if(_ldroAuto) {
|
||||||
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
||||||
RADIOLIB_DEBUG_PRINT(symbolLength);
|
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
||||||
RADIOLIB_DEBUG_PRINTLN(" ms");
|
RADIOLIB_DEBUG_PRINT(symbolLength);
|
||||||
if(symbolLength >= 16.0) {
|
RADIOLIB_DEBUG_PRINTLN(" ms");
|
||||||
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
|
if(symbolLength >= 16.0) {
|
||||||
} else {
|
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
|
||||||
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0);
|
} else {
|
||||||
|
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(state);
|
return(state);
|
||||||
|
@ -160,15 +162,17 @@ int16_t SX1272::setSpreadingFactor(uint8_t sf) {
|
||||||
if(state == ERR_NONE) {
|
if(state == ERR_NONE) {
|
||||||
SX127x::_sf = sf;
|
SX127x::_sf = sf;
|
||||||
|
|
||||||
// calculate symbol length and set low data rate optimization, if needed
|
// calculate symbol length and set low data rate optimization, if auto-configuration is enabled
|
||||||
|
if(_ldroAuto) {
|
||||||
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
||||||
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
||||||
RADIOLIB_DEBUG_PRINT(symbolLength);
|
RADIOLIB_DEBUG_PRINT(symbolLength);
|
||||||
RADIOLIB_DEBUG_PRINTLN(" ms");
|
RADIOLIB_DEBUG_PRINTLN(" ms");
|
||||||
if(symbolLength >= 16.0) {
|
if(symbolLength >= 16.0) {
|
||||||
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
|
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0);
|
state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(state);
|
return(state);
|
||||||
|
@ -372,6 +376,29 @@ int16_t SX1272::setCRC(bool enableCRC) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t SX1272::forceLDRO(bool enable) {
|
||||||
|
if(getActiveModem() != SX127X_LORA) {
|
||||||
|
return(ERR_WRONG_MODEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
_ldroAuto = false;
|
||||||
|
if(enable) {
|
||||||
|
return(_mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0));
|
||||||
|
} else {
|
||||||
|
return(_mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t SX1272::autoLDRO() {
|
||||||
|
if(getActiveModem() != SX127X_LORA) {
|
||||||
|
return(ERR_WRONG_MODEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
_ldroAuto = true;
|
||||||
|
return(ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int16_t SX1272::setBandwidthRaw(uint8_t newBandwidth) {
|
int16_t SX1272::setBandwidthRaw(uint8_t newBandwidth) {
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
int16_t state = SX127x::standby();
|
int16_t state = SX127x::standby();
|
||||||
|
|
|
@ -253,6 +253,24 @@ class SX1272: public SX127x {
|
||||||
*/
|
*/
|
||||||
int16_t setCRC(bool enableCRC);
|
int16_t setCRC(bool enableCRC);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method, LDRO will always be set to
|
||||||
|
the provided value, regardless of symbol length. To re-enable automatic LDRO configuration, call SX1278::autoLDRO()
|
||||||
|
|
||||||
|
\param enable Force LDRO to be always enabled (true) or disabled (false).
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t forceLDRO(bool enable);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method, LDRO will be enabled automatically
|
||||||
|
when symbol length exceeds 16 ms.
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t autoLDRO();
|
||||||
|
|
||||||
#ifndef RADIOLIB_GODMODE
|
#ifndef RADIOLIB_GODMODE
|
||||||
protected:
|
protected:
|
||||||
#endif
|
#endif
|
||||||
|
@ -265,6 +283,8 @@ class SX1272: public SX127x {
|
||||||
#ifndef RADIOLIB_GODMODE
|
#ifndef RADIOLIB_GODMODE
|
||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
|
bool _ldroAuto = true;
|
||||||
|
bool _ldroEnabled = false;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -178,15 +178,17 @@ int16_t SX1278::setBandwidth(float bw) {
|
||||||
if(state == ERR_NONE) {
|
if(state == ERR_NONE) {
|
||||||
SX127x::_bw = bw;
|
SX127x::_bw = bw;
|
||||||
|
|
||||||
// calculate symbol length and set low data rate optimization, if needed
|
// calculate symbol length and set low data rate optimization, if auto-configuration is enabled
|
||||||
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
if(_ldroAuto) {
|
||||||
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
||||||
RADIOLIB_DEBUG_PRINT(symbolLength);
|
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
||||||
RADIOLIB_DEBUG_PRINTLN(" ms");
|
RADIOLIB_DEBUG_PRINT(symbolLength);
|
||||||
if(symbolLength >= 16.0) {
|
RADIOLIB_DEBUG_PRINTLN(" ms");
|
||||||
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3);
|
if(symbolLength >= 16.0) {
|
||||||
} else {
|
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3);
|
||||||
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3);
|
} else {
|
||||||
|
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(state);
|
return(state);
|
||||||
|
@ -232,15 +234,17 @@ int16_t SX1278::setSpreadingFactor(uint8_t sf) {
|
||||||
if(state == ERR_NONE) {
|
if(state == ERR_NONE) {
|
||||||
SX127x::_sf = sf;
|
SX127x::_sf = sf;
|
||||||
|
|
||||||
// calculate symbol length and set low data rate optimization, if needed
|
// calculate symbol length and set low data rate optimization, if auto-configuration is enabled
|
||||||
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
if(_ldroAuto) {
|
||||||
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw;
|
||||||
RADIOLIB_DEBUG_PRINT(symbolLength);
|
RADIOLIB_DEBUG_PRINT("Symbol length: ");
|
||||||
RADIOLIB_DEBUG_PRINTLN(" ms");
|
RADIOLIB_DEBUG_PRINT(symbolLength);
|
||||||
if(symbolLength >= 16.0) {
|
RADIOLIB_DEBUG_PRINTLN(" ms");
|
||||||
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3);
|
if(symbolLength >= 16.0) {
|
||||||
} else {
|
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3);
|
||||||
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3);
|
} else {
|
||||||
|
state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(state);
|
return(state);
|
||||||
|
@ -450,6 +454,28 @@ int16_t SX1278::setCRC(bool enableCRC) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t SX1278::forceLDRO(bool enable) {
|
||||||
|
if(getActiveModem() != SX127X_LORA) {
|
||||||
|
return(ERR_WRONG_MODEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
_ldroAuto = false;
|
||||||
|
if(enable) {
|
||||||
|
return(_mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3));
|
||||||
|
} else {
|
||||||
|
return(_mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_OFF, 3, 3));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t SX1278::autoLDRO() {
|
||||||
|
if(getActiveModem() != SX127X_LORA) {
|
||||||
|
return(ERR_WRONG_MODEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
_ldroAuto = true;
|
||||||
|
return(ERR_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
int16_t SX1278::setBandwidthRaw(uint8_t newBandwidth) {
|
int16_t SX1278::setBandwidthRaw(uint8_t newBandwidth) {
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
int16_t state = SX127x::standby();
|
int16_t state = SX127x::standby();
|
||||||
|
|
|
@ -261,6 +261,24 @@ class SX1278: public SX127x {
|
||||||
*/
|
*/
|
||||||
int16_t setCRC(bool enableCRC);
|
int16_t setCRC(bool enableCRC);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Forces LoRa low data rate optimization. Only available in LoRa mode. After calling this method, LDRO will always be set to
|
||||||
|
the provided value, regardless of symbol length. To re-enable automatic LDRO configuration, call SX1278::autoLDRO()
|
||||||
|
|
||||||
|
\param enable Force LDRO to be always enabled (true) or disabled (false).
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t forceLDRO(bool enable);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Re-enables automatic LDRO configuration. Only available in LoRa mode. After calling this method, LDRO will be enabled automatically
|
||||||
|
when symbol length exceeds 16 ms.
|
||||||
|
|
||||||
|
\returns \ref status_codes
|
||||||
|
*/
|
||||||
|
int16_t autoLDRO();
|
||||||
|
|
||||||
#ifndef RADIOLIB_GODMODE
|
#ifndef RADIOLIB_GODMODE
|
||||||
protected:
|
protected:
|
||||||
#endif
|
#endif
|
||||||
|
@ -273,6 +291,8 @@ class SX1278: public SX127x {
|
||||||
#ifndef RADIOLIB_GODMODE
|
#ifndef RADIOLIB_GODMODE
|
||||||
private:
|
private:
|
||||||
#endif
|
#endif
|
||||||
|
bool _ldroAuto = true;
|
||||||
|
bool _ldroEnabled = false;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue