use anyhow::Result;
#[cfg(feature = "serde")]
use serde::Serialize;
#[derive(PartialEq, Eq, Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize))]
pub struct DLSettings {
pub opt_neg: bool,
pub rx2_dr: u8,
pub rx1_dr_offset: u8,
}
impl DLSettings {
pub fn from_le_bytes(b: [u8; 1]) -> Self {
DLSettings {
opt_neg: (b[0] & (1 << 7)) != 0,
rx2_dr: b[0] & 15,
rx1_dr_offset: (b[0] & 112) >> 4,
}
}
pub fn to_le_bytes(&self) -> Result<[u8; 1]> {
if self.rx2_dr > 15 {
return Err(anyhow!("max value of rx2_dr is 15"));
}
if self.rx1_dr_offset > 7 {
return Err(anyhow!("max value of rx1_dr_offset is 7"));
}
let mut b: u8 = self.rx2_dr | (self.rx1_dr_offset << 4);
if self.opt_neg {
b |= 1 << 7;
}
Ok([b])
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dl_settings() {
let dl_settings = DLSettings {
rx2_dr: 15,
rx1_dr_offset: 7,
opt_neg: true,
};
assert_eq!([0xff], dl_settings.to_le_bytes().unwrap());
assert_eq!(dl_settings, DLSettings::from_le_bytes([0xff]));
}
}