use embedded_hal::{blocking::spi, digital::v2::OutputPin};
use crate::{
ll,
mac,
time::{Duration, Instant},
Error,
DW3000,
fast_command,
};
use super::Awake;
impl<SPI, CS, State> DW3000<SPI, CS, State>
where
SPI: spi::Transfer<u8> + spi::Write<u8>,
CS: OutputPin,
State: Awake,
{
pub fn get_tx_antenna_delay(&mut self) -> Result<Duration, Error<SPI, CS>> {
let tx_antenna_delay = self.ll.tx_antd().read()?.value();
let tx_antenna_delay = Duration::new(tx_antenna_delay.into()).unwrap();
Ok(tx_antenna_delay)
}
pub fn get_rx_antenna_delay(&mut self) -> Result<Duration, Error<SPI, CS>> {
let rx_antenna_delay = self.ll.cia_conf().read()?.rxantd();
let rx_antenna_delay = Duration::new(rx_antenna_delay.into()).unwrap();
Ok(rx_antenna_delay)
}
pub fn get_address(&mut self) -> Result<mac::Address, Error<SPI, CS>> {
let panadr = self.ll.panadr().read()?;
Ok(mac::Address::Short(
mac::PanId(panadr.pan_id()),
mac::ShortAddress(panadr.short_addr()),
))
}
pub fn sys_time(&mut self) -> Result<Instant, Error<SPI, CS>> {
let sys_time = self.ll.sys_time().read()?.value();
Ok(Instant::new(sys_time.into()).unwrap())
}
pub fn state(&mut self) -> Result<u8, Error<SPI, CS>> {
Ok(self.ll.sys_state().read()?.pmsc_state())
}
pub fn cmd_status(&mut self) -> Result<u8, Error<SPI, CS>> {
Ok(self.ll.fcmd_stat().read()?.value())
}
pub fn init_rc_passed(&mut self) -> Result<bool, Error<SPI, CS>> {
Ok(self.ll.sys_status().read()?.rcinit() == 0x1)
}
pub fn idle_rc_passed(&mut self) -> Result<bool, Error<SPI, CS>> {
Ok(self.ll.sys_status().read()?.spirdy() == 0x1)
}
pub fn idle_pll_passed(&mut self) -> Result<bool, Error<SPI, CS>> {
Ok(self.ll.sys_status().read()?.cplock() == 0x1)
}
pub fn ll(&mut self) -> &mut ll::DW3000<SPI, CS> { &mut self.ll }
pub fn force_idle(&mut self) -> Result<(), Error<SPI, CS>> {
self.ll.fast_command(0)?;
Ok(())
}
pub fn fast_cmd(&mut self, fc: fast_command::FastCommand) -> Result<(), Error<SPI, CS>> {
self.ll.fast_command(fc as u8)?;
Ok(())
}
}