Return LinkCheckAns with margin=0 for non-LoRa modulations.
Some checks failed
CI / tests (postgres) (push) Has been cancelled
CI / tests (sqlite) (push) Has been cancelled
CI / dist (postgres) (push) Has been cancelled
CI / dist (sqlite) (push) Has been cancelled

This commit is contained in:
Orne Brocaar 2025-01-22 09:09:27 +00:00
parent 8cb2d4f383
commit 99613014ad

View File

@ -27,7 +27,11 @@ pub fn handle(
.as_ref() .as_ref()
.ok_or_else(|| anyhow!("parameters can not be None"))?; .ok_or_else(|| anyhow!("parameters can not be None"))?;
if let gw::modulation::Parameters::Lora(pl) = mod_params { // For non-LoRa modulations, the margin will be set to 0, as it can not be calculated.
// This way, at least the gw_cnt can be provided and the end-device is able to confirm
// it is still connected.
let margin = match mod_params {
gw::modulation::Parameters::Lora(pl) => {
let required_snr = config::get_required_snr_for_sf(pl.spreading_factor as u8)?; let required_snr = config::get_required_snr_for_sf(pl.spreading_factor as u8)?;
let mut max_snr: f32 = 0.0; let mut max_snr: f32 = 0.0;
@ -37,21 +41,26 @@ pub fn handle(
} }
} }
let mut margin = max_snr - required_snr; let margin = max_snr - required_snr;
if margin < 0.0 { if margin < 0.0 {
margin = 0.0; 0.0
} else {
margin
} }
}
_ => {
warn!("Modulation does not provide margin to LinkCheckReq");
0.0
}
};
return Ok(Some(lrwn::MACCommandSet::new(vec![ // We always return a LinkCheckAns, even
Ok(Some(lrwn::MACCommandSet::new(vec![
lrwn::MACCommand::LinkCheckAns(lrwn::LinkCheckAnsPayload { lrwn::MACCommand::LinkCheckAns(lrwn::LinkCheckAnsPayload {
margin: margin as u8, margin: margin as u8,
gw_cnt: ufs.rx_info_set.len() as u8, gw_cnt: ufs.rx_info_set.len() as u8,
}), }),
]))); ])))
}
warn!("Unsupported modulation for LinkCheckReq");
Ok(None)
} }
#[cfg(test)] #[cfg(test)]