Add coding_rate field to LoraDataRate (+ fix 2.4GHz coding-rate).

Per Regional Parameters Specification, the LoRa modulation always uses
coding-rate 4/5, however this is not the case for ISM2400 (which is
currently not covered by the reg. params) in which case coding-rate
4/8LI must be used.

Closes #51.
This commit is contained in:
Orne Brocaar
2022-11-08 15:19:45 +00:00
parent 0ac4ef51e2
commit e2214f9485
15 changed files with 116 additions and 7 deletions

View File

@ -1,3 +1,5 @@
use std::str::FromStr;
use anyhow::Result; use anyhow::Result;
use rand::seq::SliceRandom; use rand::seq::SliceRandom;
@ -65,7 +67,9 @@ pub fn set_tx_info_data_rate(
parameters: Some(gw::modulation::Parameters::Lora(gw::LoraModulationInfo { parameters: Some(gw::modulation::Parameters::Lora(gw::LoraModulationInfo {
bandwidth: v.bandwidth, bandwidth: v.bandwidth,
spreading_factor: v.spreading_factor as u32, spreading_factor: v.spreading_factor as u32,
code_rate: chirpstack_api::gw::CodeRate::Cr45.into(), code_rate: gw::CodeRate::from_str(&v.coding_rate)
.map_err(|e| anyhow!("{}", e))?
.into(),
polarization_inversion: true, polarization_inversion: true,
code_rate_legacy: "".into(), code_rate_legacy: "".into(),
})), })),

View File

@ -25,6 +25,7 @@ pub fn get_uplink_dr(region_name: &str, tx_info: &chirpstack_api::gw::UplinkTxIn
lrwn::region::DataRateModulation::Lora(lrwn::region::LoraDataRate { lrwn::region::DataRateModulation::Lora(lrwn::region::LoraDataRate {
spreading_factor: v.spreading_factor as u8, spreading_factor: v.spreading_factor as u8,
bandwidth: v.bandwidth, bandwidth: v.bandwidth,
coding_rate: v.code_rate().into(),
}) })
} }
chirpstack_api::gw::modulation::Parameters::Fsk(v) => { chirpstack_api::gw::modulation::Parameters::Fsk(v) => {
@ -57,7 +58,9 @@ pub fn set_uplink_modulation(
gw::modulation::Parameters::Lora(gw::LoraModulationInfo { gw::modulation::Parameters::Lora(gw::LoraModulationInfo {
bandwidth: v.bandwidth, bandwidth: v.bandwidth,
spreading_factor: v.spreading_factor as u32, spreading_factor: v.spreading_factor as u32,
code_rate: gw::CodeRate::Cr45.into(), code_rate: gw::CodeRate::from_str(&v.coding_rate)
.map_err(|e| anyhow!("{}", e))?
.into(),
code_rate_legacy: "".into(), code_rate_legacy: "".into(),
polarization_inversion: true, polarization_inversion: true,
}) })

View File

@ -255,6 +255,7 @@ fn per_modultation_to_per_dr(
lrwn::region::DataRateModulation::Lora(lrwn::region::LoraDataRate { lrwn::region::DataRateModulation::Lora(lrwn::region::LoraDataRate {
spreading_factor: v.spreading_factor as u8, spreading_factor: v.spreading_factor as u8,
bandwidth: v.bandwidth, bandwidth: v.bandwidth,
coding_rate: v.code_rate().into(),
}) })
} }
gw::modulation::Parameters::Fsk(v) => { gw::modulation::Parameters::Fsk(v) => {

View File

@ -42,6 +42,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -53,6 +54,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -64,6 +66,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -75,6 +78,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -86,6 +90,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -97,6 +102,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -108,6 +114,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -116,6 +123,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -127,6 +135,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -138,6 +147,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -149,6 +159,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -160,6 +171,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -171,6 +183,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -1362,6 +1375,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
uplink: true, uplink: true,
expected_dr: 0, expected_dr: 0,
@ -1370,6 +1384,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
uplink: false, uplink: false,
expected_dr: 8, expected_dr: 8,
@ -1378,6 +1393,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
uplink: true, uplink: true,
expected_dr: 6, expected_dr: 6,
@ -1386,6 +1402,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
uplink: false, uplink: false,
expected_dr: 12, expected_dr: 12,

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -764,6 +771,7 @@ mod tests {
DataRateModulation::Lora(LoraDataRate { DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
0, 0,
), ),
@ -772,6 +780,7 @@ mod tests {
DataRateModulation::Lora(LoraDataRate { DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
0, 0,
), ),
@ -780,6 +789,7 @@ mod tests {
DataRateModulation::Lora(LoraDataRate { DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
5, 5,
), ),
@ -788,6 +798,7 @@ mod tests {
DataRateModulation::Lora(LoraDataRate { DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
5, 5,
), ),
@ -796,6 +807,7 @@ mod tests {
DataRateModulation::Lora(LoraDataRate { DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
6, 6,
), ),
@ -804,6 +816,7 @@ mod tests {
DataRateModulation::Lora(LoraDataRate { DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
6, 6,
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 6, spreading_factor: 6,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),
@ -105,6 +112,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 5, spreading_factor: 5,
bandwidth: 812000, bandwidth: 812000,
coding_rate: "4/8LI".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -274,25 +274,26 @@ pub struct DataRate {
pub modulation: DataRateModulation, pub modulation: DataRateModulation,
} }
#[derive(Clone, PartialEq)] #[derive(Clone, PartialEq, Debug)]
pub enum DataRateModulation { pub enum DataRateModulation {
Lora(LoraDataRate), Lora(LoraDataRate),
Fsk(FskDataRate), Fsk(FskDataRate),
LrFhss(LrFhssDataRate), LrFhss(LrFhssDataRate),
} }
#[derive(Clone, PartialEq)] #[derive(Clone, PartialEq, Debug)]
pub struct LoraDataRate { pub struct LoraDataRate {
pub spreading_factor: u8, pub spreading_factor: u8,
pub bandwidth: u32, pub bandwidth: u32,
pub coding_rate: String,
} }
#[derive(Clone, PartialEq)] #[derive(Clone, PartialEq, Debug)]
pub struct FskDataRate { pub struct FskDataRate {
pub bitrate: u32, pub bitrate: u32,
} }
#[derive(Clone, PartialEq)] #[derive(Clone, PartialEq, Debug)]
pub struct LrFhssDataRate { pub struct LrFhssDataRate {
pub coding_rate: String, pub coding_rate: String,
pub occupied_channel_width: u32, pub occupied_channel_width: u32,
@ -465,7 +466,7 @@ impl RegionBaseConfig {
} }
} }
Err(anyhow!("Unknown data-rate")) Err(anyhow!("Unknown data-rate: {:?}", modulation))
} }
fn get_data_rate(&self, dr: u8) -> Result<DataRateModulation> { fn get_data_rate(&self, dr: u8) -> Result<DataRateModulation> {

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -83,6 +88,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -94,6 +100,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 250000, bandwidth: 250000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),

View File

@ -28,6 +28,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -39,6 +40,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -50,6 +52,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -61,6 +64,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -72,6 +76,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -106,6 +111,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -117,6 +123,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 11, spreading_factor: 11,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -128,6 +135,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -139,6 +147,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 9, spreading_factor: 9,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -150,6 +159,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -161,6 +171,7 @@ impl Configuration {
modulation: DataRateModulation::Lora(LoraDataRate { modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 7, spreading_factor: 7,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
}, },
), ),
@ -1054,6 +1065,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 10, spreading_factor: 10,
bandwidth: 125000, bandwidth: 125000,
coding_rate: "4/5".into(),
}), }),
uplink: true, uplink: true,
expected_dr: 0, expected_dr: 0,
@ -1062,6 +1074,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 12, spreading_factor: 12,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
uplink: false, uplink: false,
expected_dr: 8, expected_dr: 8,
@ -1070,6 +1083,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
uplink: true, uplink: true,
expected_dr: 4, expected_dr: 4,
@ -1078,6 +1092,7 @@ pub mod test {
dr_modulation: DataRateModulation::Lora(LoraDataRate { dr_modulation: DataRateModulation::Lora(LoraDataRate {
spreading_factor: 8, spreading_factor: 8,
bandwidth: 500000, bandwidth: 500000,
coding_rate: "4/5".into(),
}), }),
uplink: false, uplink: false,
expected_dr: 12, expected_dr: 12,