use embedded_hal::spi;
use super::Awake;
use crate::{fast_command, ll, time::Duration, Error, DW3000};
use smoltcp::wire::{Ieee802154Address, Ieee802154Pan};
impl<SPI, State> DW3000<SPI, State>
where
SPI: spi::SpiDevice<u8>,
State: Awake,
{
pub fn get_tx_antenna_delay(&mut self) -> Result<Duration, Error<SPI>> {
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>> {
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<(Ieee802154Pan, Ieee802154Address), Error<SPI>> {
let panadr = self.ll.panadr().read()?;
Ok((
smoltcp::wire::Ieee802154Pan(panadr.pan_id()),
Ieee802154Address::Short(panadr.short_addr().to_be_bytes()),
))
}
pub fn sys_time(&mut self) -> Result<u32, Error<SPI>> {
let sys_time = self.ll.sys_time().read()?.value();
Ok(sys_time)
}
pub fn state(&mut self) -> Result<u8, Error<SPI>> {
Ok(self.ll.sys_state().read()?.pmsc_state())
}
pub fn cmd_status(&mut self) -> Result<u8, Error<SPI>> {
Ok(self.ll.fcmd_stat().read()?.value())
}
pub fn init_rc_passed(&mut self) -> Result<bool, Error<SPI>> {
Ok(self.ll.sys_status().read()?.rcinit() == 0x1)
}
pub fn idle_rc_passed(&mut self) -> Result<bool, Error<SPI>> {
Ok(self.ll.sys_status().read()?.spirdy() == 0x1)
}
pub fn idle_pll_passed(&mut self) -> Result<bool, Error<SPI>> {
Ok(self.ll.sys_status().read()?.cplock() == 0x1)
}
pub fn ll(&mut self) -> &mut ll::DW3000<SPI> {
&mut self.ll
}
pub fn force_idle(&mut self) -> Result<(), Error<SPI>> {
self.ll.fast_command(0)?;
Ok(())
}
pub fn fast_cmd(&mut self, fc: fast_command::FastCommand) -> Result<(), Error<SPI>> {
self.ll.fast_command(fc as u8)?;
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
use embedded_hal_mock::eh1::spi::{Mock as SpiMock, Transaction as SpiTransaction};
#[test]
fn test_new_device() {
let spi = SpiMock::new(&[
SpiTransaction::transaction_start(),
SpiTransaction::transfer_in_place(
vec![0x40, 0x30, 0, 0, 0, 0],
vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x06],
),
SpiTransaction::transaction_end(),
]);
let mut dw3000 = DW3000::new(spi);
let addr = dw3000.get_address().unwrap();
assert_eq!(
addr,
(
Ieee802154Pan(0x0605),
Ieee802154Address::Short([0x04, 0x03])
)
);
let mut spi = dw3000.ll.spi;
spi.done();
}
}