diff --git a/src/modules/SX127x/SX1272.cpp b/src/modules/SX127x/SX1272.cpp index 8864297e..2c951401 100644 --- a/src/modules/SX127x/SX1272.cpp +++ b/src/modules/SX127x/SX1272.cpp @@ -252,6 +252,27 @@ int16_t SX1272::setDataRate(DataRate_t dr) { return(state); } +int16_t SX1272::checkDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0 <= 250.0) && (dr.fsk.freqDev <= 200.0))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + } else if(modem == RADIOLIB_SX127X_LORA) { + RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 12, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 100.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE); + + } + + return(state); +} + int16_t SX1272::setOutputPower(int8_t power) { return(this->setOutputPower(power, false)); } @@ -306,7 +327,7 @@ int16_t SX1272::setGain(uint8_t gain) { // get modem int16_t modem = getActiveModem(); - if(modem == RADIOLIB_SX127X_LORA){ + if(modem == RADIOLIB_SX127X_LORA) { // set gain if(gain == 0) { // gain set to 0, enable AGC loop diff --git a/src/modules/SX127x/SX1272.h b/src/modules/SX127x/SX1272.h index 974fa16b..3ea740ac 100644 --- a/src/modules/SX127x/SX1272.h +++ b/src/modules/SX127x/SX1272.h @@ -183,6 +183,13 @@ class SX1272: public SX127x { \returns \ref status_codes */ int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Check the data rate can be configured by this module. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t checkDataRate(DataRate_t dr) override; /*! \brief Sets transmission output power. Allowed values range from -1 to 14 dBm (RFO pin) or +2 to +20 dBm (PA_BOOST pin). diff --git a/src/modules/SX127x/SX1273.cpp b/src/modules/SX127x/SX1273.cpp index c3ae5eda..6edc8e4b 100644 --- a/src/modules/SX127x/SX1273.cpp +++ b/src/modules/SX127x/SX1273.cpp @@ -92,4 +92,25 @@ int16_t SX1273::setDataRate(DataRate_t dr) { return(state); } +int16_t SX1273::checkDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0 <= 250.0) && (dr.fsk.freqDev <= 200.0))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + } else if(modem == RADIOLIB_SX127X_LORA) { + RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 9, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 100.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE); + + } + + return(state); +} + #endif diff --git a/src/modules/SX127x/SX1273.h b/src/modules/SX127x/SX1273.h index 12bd05df..610bbccf 100644 --- a/src/modules/SX127x/SX1273.h +++ b/src/modules/SX127x/SX1273.h @@ -55,6 +55,13 @@ class SX1273: public SX1272 { \returns \ref status_codes */ int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Check the data rate can be configured by this module. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t checkDataRate(DataRate_t dr) override; #if !RADIOLIB_GODMODE private: diff --git a/src/modules/SX127x/SX1277.cpp b/src/modules/SX127x/SX1277.cpp index 76bbb0f6..d8089066 100644 --- a/src/modules/SX127x/SX1277.cpp +++ b/src/modules/SX127x/SX1277.cpp @@ -134,4 +134,25 @@ int16_t SX1277::setDataRate(DataRate_t dr) { return(state); } +int16_t SX1277::checkDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0 <= 250.0) && (dr.fsk.freqDev <= 200.0))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + } else if(modem == RADIOLIB_SX127X_LORA) { + RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 9, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 0.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE); + + } + + return(state); +} + #endif diff --git a/src/modules/SX127x/SX1277.h b/src/modules/SX127x/SX1277.h index fa2ac5ac..1d334cdc 100644 --- a/src/modules/SX127x/SX1277.h +++ b/src/modules/SX127x/SX1277.h @@ -76,6 +76,13 @@ class SX1277: public SX1278 { \returns \ref status_codes */ int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Check the data rate can be configured by this module. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t checkDataRate(DataRate_t dr) override; #if !RADIOLIB_GODMODE private: diff --git a/src/modules/SX127x/SX1278.cpp b/src/modules/SX127x/SX1278.cpp index 560a10bc..f20867ac 100644 --- a/src/modules/SX127x/SX1278.cpp +++ b/src/modules/SX127x/SX1278.cpp @@ -266,6 +266,27 @@ int16_t SX1278::setDataRate(DataRate_t dr) { return(state); } +int16_t SX1278::checkDataRate(DataRate_t dr) { + int16_t state = RADIOLIB_ERR_UNKNOWN; + + // select interpretation based on active modem + int16_t modem = getActiveModem(); + if(modem == RADIOLIB_SX127X_FSK_OOK) { + RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE); + if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0 <= 250.0) && (dr.fsk.freqDev <= 200.0))) { + return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); + } + + } else if(modem == RADIOLIB_SX127X_LORA) { + RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 12, RADIOLIB_ERR_INVALID_SPREADING_FACTOR); + RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 0.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH); + RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE); + + } + + return(state); +} + int16_t SX1278::setOutputPower(int8_t power) { return(this->setOutputPower(power, false)); } diff --git a/src/modules/SX127x/SX1278.h b/src/modules/SX127x/SX1278.h index 2140430e..979edb75 100644 --- a/src/modules/SX127x/SX1278.h +++ b/src/modules/SX127x/SX1278.h @@ -193,6 +193,13 @@ class SX1278: public SX127x { \returns \ref status_codes */ int16_t setDataRate(DataRate_t dr) override; + + /*! + \brief Check the data rate can be configured by this module. + \param dr Data rate struct. Interpretation depends on currently active modem (FSK or LoRa). + \returns \ref status_codes + */ + int16_t checkDataRate(DataRate_t dr) override; /*! \brief Sets transmission output power. Allowed values range from -3 to 15 dBm (RFO pin) or +2 to +17 dBm (PA_BOOST pin).