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*)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; using enum Parameter;
switch (parameter) { switch (parameter) {
@ -46,12 +46,7 @@ Sx1262::ParameterStatus Sx1262::setParameter(const Parameter parameter, const fl
return checkLimitsAndApply(frequency, value, 150.0, 960.0); return checkLimitsAndApply(frequency, value, 150.0, 960.0);
case Bandwidth: case Bandwidth:
return checkValuesAndApply(bandwidth, value, { 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
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
}); });
case SpreadFactor: case SpreadFactor:
return checkLimitsAndApply(spreadFactor, value, 7.0, 12.0, 1); 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); return checkLimitsAndApply(syncWord, value, 0.0, 255.0, 1);
case PreambleLength: case PreambleLength:
return checkLimitsAndApply(preambleLength, value, 0.0, 65535.0, 1); 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: case DataRate:
return checkLimitsAndApply(bitRate, value, 0.6, 300.0); return checkLimitsAndApply(bitRate, value, 0.6, 300.0);
case FrequencyDeviation: case FrequencyDeviation:
return checkLimitsAndApply(frequencyDeviation, value, 0.0, 200.0); 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: case NarrowGrid:
return checkLimitsAndApply(narrowGrid, value, 0.0, 1.0, 1); return checkLimitsAndApply(narrowGrid, value, 0.0, 1.0, 1);
default: default:
break; break;
} }
TT_LOG_W(TAG, "Tried to set unsupported parameter \"%s\" to %f", toString(parameter), value); TT_LOG_W(TAG, "Tried to set unsupported LR-FHSS parameter \"%s\" to %f", toString(parameter), value);
return Sx1262::ParameterStatus::NotDefined; 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; using enum Parameter;
switch (parameter) { switch (parameter) {
@ -100,12 +159,54 @@ Sx1262::ParameterStatus Sx1262::getParameter(const Parameter parameter, float &v
case PreambleLength: case PreambleLength:
value = preambleLength; value = preambleLength;
return Sx1262::ParameterStatus::Success; 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: case DataRate:
value = bitRate; value = bitRate;
return Sx1262::ParameterStatus::Success; return Sx1262::ParameterStatus::Success;
case FrequencyDeviation: case FrequencyDeviation:
value = frequencyDeviation; value = frequencyDeviation;
return Sx1262::ParameterStatus::Success; 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: case NarrowGrid:
value = narrowGrid; value = narrowGrid;
return Sx1262::ParameterStatus::Success; return Sx1262::ParameterStatus::Success;
@ -113,8 +214,27 @@ Sx1262::ParameterStatus Sx1262::getParameter(const Parameter parameter, float &v
break; break;
} }
TT_LOG_W(TAG, "Tried to get unsupported parameter \"%s\"", toString(parameter)); TT_LOG_W(TAG, "Tried to get unsupported LR-FHSS parameter \"%s\"", toString(parameter));
return Sx1262::ParameterStatus::NotDefined; 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 { tt::hal::radio::Unit Sx1262::getParameterUnit(const Parameter parameter) const {

View File

@ -53,6 +53,14 @@ private:
void registerDio1Isr(); void registerDio1Isr();
void unregisterDio1Isr(); 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: protected:
virtual void txQueuedSignal() override; virtual void txQueuedSignal() override;
virtual void interruptSignal() override; virtual void interruptSignal() override;

View File

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