use crate::{
PacketType, Radio, RadioConfig,
params::LoraBandwidth6x,
shared::{RadioError, Register, Register6x},
};
impl Radio {
pub fn set_rxgain_retention(&mut self) -> Result<(), RadioError> {
self.interface
.write_reg_word(Register::Reg6x(Register6x::RxGainRetention0), 0x01)?;
self.interface
.write_reg_word(Register::Reg6x(Register6x::RxGainRetention1), 0x08)?;
self.interface
.write_reg_word(Register::Reg6x(Register6x::RxGainRetention2), 0xac)
}
pub fn tx_clamp_workaround(&mut self) -> Result<(), RadioError> {
let val = self
.interface
.read_reg_word(Register::Reg6x(Register6x::TxClampConfig))?;
self.interface
.write_reg_word(Register::Reg6x(Register6x::TxClampConfig), val | 0x1e)
}
pub fn mod_quality_workaround(&mut self) -> Result<(), RadioError> {
let mut value = self
.interface
.read_reg_word(Register::Reg6x(Register6x::TxModulation))?;
match &self.config {
RadioConfig::R6x(config) => {
if config.packet_type == PacketType::Lora
&& config.modulation_params.mod_bandwidth == LoraBandwidth6x::BW_500
{
value &= 0xFB;
} else {
value |= 0x04;
}
self.interface
.write_reg_word(Register::Reg6x(Register6x::TxModulation), value)
}
_ => unimplemented!(),
}
}
pub fn implicit_header_to_workaround(&mut self) -> Result<(), RadioError> {
self.interface
.write_reg_word(Register::Reg6x(Register6x::RtcControl), 0x00)?;
let val = self
.interface
.read_reg_word(Register::Reg6x(Register6x::EventMask))?;
self.interface
.write_reg_word(Register::Reg6x(Register6x::EventMask), val | 0x02)
}
}