SX126x: Per-modem validation of parameters

This commit is contained in:
Dominic Höglinger 2025-09-21 21:29:36 +02:00
parent e2db52c0dc
commit 933ce93fb1
3 changed files with 141 additions and 13 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -47,7 +47,7 @@ public:
};
enum class ParameterStatus {
NotDefined,
Unavailable,
ValueError,
Success
};