diff --git a/Drivers/SX126x/Source/Sx1262.cpp b/Drivers/SX126x/Source/Sx1262.cpp index 91dc015a..de319d7e 100644 --- a/Drivers/SX126x/Source/Sx1262.cpp +++ b/Drivers/SX126x/Source/Sx1262.cpp @@ -36,7 +36,7 @@ void IRAM_ATTR dio1handler(void* context) { ((Sx1262*)context)->dio1Event(); } -Sx1262::ParameterStatus Sx1262::setParameter(const Parameter parameter, const float value) { +Sx1262::ParameterStatus Sx1262::setLoraParameter(const Parameter parameter, const float value) { using enum Parameter; switch (parameter) { @@ -46,12 +46,7 @@ Sx1262::ParameterStatus Sx1262::setParameter(const Parameter parameter, const fl return checkLimitsAndApply(frequency, value, 150.0, 960.0); case Bandwidth: return checkValuesAndApply(bandwidth, value, { - //LoRa - 7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125.0, 250.0, 500.0, - // FSK - 4.8, 5.8, 7.3, 9.7, 11.7, 14.6, 19.5, 23.4, 29.3, 39.0, 46.9, 58.6, 78.2, - // LR-FHSS - 39.06, 85.94, 136.72, 183.59, 335.94, 386.72, 722.66, 773.44, 1523.4, 1574.2 + 7.8, 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125.0, 250.0, 500.0 }); case SpreadFactor: return checkLimitsAndApply(spreadFactor, value, 7.0, 12.0, 1); @@ -61,21 +56,85 @@ Sx1262::ParameterStatus Sx1262::setParameter(const Parameter parameter, const fl return checkLimitsAndApply(syncWord, value, 0.0, 255.0, 1); case PreambleLength: return checkLimitsAndApply(preambleLength, value, 0.0, 65535.0, 1); + default: + break; + } + + TT_LOG_W(TAG, "Tried to set unsupported LoRa parameter \"%s\" to %f", toString(parameter), value); + return Sx1262::ParameterStatus::Unavailable; +} + +Sx1262::ParameterStatus Sx1262::setFskParameter(const Parameter parameter, const float value) { + using enum Parameter; + + switch (parameter) { + case Power: + return checkLimitsAndApply(power, value, -9.0, 22.0); + case Frequency: + return checkLimitsAndApply(frequency, value, 150.0, 960.0); + case Bandwidth: + return checkValuesAndApply(bandwidth, value, { + 4.8, 5.8, 7.3, 9.7, 11.7, 14.6, 19.5, 23.4, 29.3, 39.0, 46.9, 58.6, 78.2 + }); + case PreambleLength: + return checkLimitsAndApply(preambleLength, value, 0.0, 65535.0, 1); case DataRate: return checkLimitsAndApply(bitRate, value, 0.6, 300.0); case FrequencyDeviation: return checkLimitsAndApply(frequencyDeviation, value, 0.0, 200.0); + default: + break; + } + + TT_LOG_W(TAG, "Tried to set unsupported FSK parameter \"%s\" to %f", toString(parameter), value); + return Sx1262::ParameterStatus::Unavailable; +} + +Sx1262::ParameterStatus Sx1262::setLrFhssParameter(const Parameter parameter, const float value) { + using enum Parameter; + + switch (parameter) { + case Bandwidth: + return checkValuesAndApply(bandwidth, value, { + 39.06, 85.94, 136.72, 183.59, 335.94, 386.72, 722.66, 773.44, 1523.4, 1574.2 + }); + case CodingRate: + return checkValuesAndApply(codingRate, value, { + RADIOLIB_SX126X_LR_FHSS_CR_5_6, + RADIOLIB_SX126X_LR_FHSS_CR_2_3, + RADIOLIB_SX126X_LR_FHSS_CR_1_2, + RADIOLIB_SX126X_LR_FHSS_CR_1_3 + }); case NarrowGrid: return checkLimitsAndApply(narrowGrid, value, 0.0, 1.0, 1); default: break; } - TT_LOG_W(TAG, "Tried to set unsupported parameter \"%s\" to %f", toString(parameter), value); - return Sx1262::ParameterStatus::NotDefined; + TT_LOG_W(TAG, "Tried to set unsupported LR-FHSS parameter \"%s\" to %f", toString(parameter), value); + return Sx1262::ParameterStatus::Unavailable; } -Sx1262::ParameterStatus Sx1262::getParameter(const Parameter parameter, float &value) const { + +Sx1262::ParameterStatus Sx1262::setParameter(const Parameter parameter, const float value) { + const auto currentModulation = getModulation(); + + switch (currentModulation) { + case Modulation::LoRa: + return setLoraParameter(parameter, value); + case Modulation::Fsk: + return setFskParameter(parameter, value); + case Modulation::LrFhss: + return setLrFhssParameter(parameter, value); + default: + break; + } + + // Shouldn't be reachable, return failsafe value + return Sx1262::ParameterStatus::Unavailable; +} + +Sx1262::ParameterStatus Sx1262::getLoraParameter(const Parameter parameter, float &value) const { using enum Parameter; switch (parameter) { @@ -100,12 +159,54 @@ Sx1262::ParameterStatus Sx1262::getParameter(const Parameter parameter, float &v case PreambleLength: value = preambleLength; return Sx1262::ParameterStatus::Success; + default: + break; + } + + TT_LOG_W(TAG, "Tried to get unsupported LoRa parameter \"%s\"", toString(parameter)); + return Sx1262::ParameterStatus::Unavailable; +} + +Sx1262::ParameterStatus Sx1262::getFskParameter(const Parameter parameter, float &value) const { + using enum Parameter; + + switch (parameter) { + case Power: + value = power; + return Sx1262::ParameterStatus::Success; + case Frequency: + value = frequency; + return Sx1262::ParameterStatus::Success; + case Bandwidth: + value = bandwidth; + return Sx1262::ParameterStatus::Success; case DataRate: value = bitRate; return Sx1262::ParameterStatus::Success; case FrequencyDeviation: value = frequencyDeviation; return Sx1262::ParameterStatus::Success; + default: + break; + } + + TT_LOG_W(TAG, "Tried to get unsupported FSK parameter \"%s\"", toString(parameter)); + return Sx1262::ParameterStatus::Unavailable; +} + +Sx1262::ParameterStatus Sx1262::getLrFhssParameter(const Parameter parameter, float &value) const { + using enum Parameter; + + switch (parameter) { + case Power: + value = power; + return Sx1262::ParameterStatus::Success; + case Bandwidth: + value = bandwidth; + return Sx1262::ParameterStatus::Success; + case CodingRate: + value = codingRate; + return Sx1262::ParameterStatus::Success; case NarrowGrid: value = narrowGrid; return Sx1262::ParameterStatus::Success; @@ -113,8 +214,27 @@ Sx1262::ParameterStatus Sx1262::getParameter(const Parameter parameter, float &v break; } - TT_LOG_W(TAG, "Tried to get unsupported parameter \"%s\"", toString(parameter)); - return Sx1262::ParameterStatus::NotDefined; + TT_LOG_W(TAG, "Tried to get unsupported LR-FHSS parameter \"%s\"", toString(parameter)); + return Sx1262::ParameterStatus::Unavailable; +} + + +Sx1262::ParameterStatus Sx1262::getParameter(const Parameter parameter, float &value) const { + const auto currentModulation = getModulation(); + + switch (currentModulation) { + case Modulation::LoRa: + return getLoraParameter(parameter, value); + case Modulation::Fsk: + return getFskParameter(parameter, value); + case Modulation::LrFhss: + return getLrFhssParameter(parameter, value); + default: + break; + } + + // Shouldn't be reachable, return failsafe value + return Sx1262::ParameterStatus::Unavailable; } tt::hal::radio::Unit Sx1262::getParameterUnit(const Parameter parameter) const { diff --git a/Drivers/SX126x/Source/Sx1262.h b/Drivers/SX126x/Source/Sx1262.h index 9a34c8ab..1bd4ab10 100644 --- a/Drivers/SX126x/Source/Sx1262.h +++ b/Drivers/SX126x/Source/Sx1262.h @@ -53,6 +53,14 @@ private: void registerDio1Isr(); void unregisterDio1Isr(); + ParameterStatus setLoraParameter(const Parameter parameter, const float value); + ParameterStatus setFskParameter(const Parameter parameter, const float value); + ParameterStatus setLrFhssParameter(const Parameter parameter, const float value); + ParameterStatus getLoraParameter(const Parameter parameter, float &value) const; + ParameterStatus getFskParameter(const Parameter parameter, float &value) const; + ParameterStatus getLrFhssParameter(const Parameter parameter, float &value) const; + + protected: virtual void txQueuedSignal() override; virtual void interruptSignal() override; diff --git a/Tactility/Include/Tactility/hal/radio/RadioDevice.h b/Tactility/Include/Tactility/hal/radio/RadioDevice.h index 7c707214..c3c53277 100644 --- a/Tactility/Include/Tactility/hal/radio/RadioDevice.h +++ b/Tactility/Include/Tactility/hal/radio/RadioDevice.h @@ -47,7 +47,7 @@ public: }; enum class ParameterStatus { - NotDefined, + Unavailable, ValueError, Success };