use embedded_hal::digital::OutputPin;
use embedded_hal_async::spi::SpiBus;
pub use super::cmd::cmd_wmbus::*;
use super::{BusyPin, Lr2021, Lr2021Error, RxBw};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct WmbusPacketParams {
mode: WmbusMode,
rx_bw: RxBw,
pkt_format_tx: WmbusFormat,
addr_filt_en: bool,
pld_len: u8,
pbl_len_tx: u16,
pbl_len_detect: u8
}
impl WmbusPacketParams {
pub fn new(mode: WmbusMode, tx_format: WmbusFormat, tx_len: u8) -> Self {
let pbl_len = match mode {
WmbusMode::ModeS => 30,
WmbusMode::ModeR2 => 78,
WmbusMode::ModeF2 => 78,
WmbusMode::ModeT1 |
WmbusMode::ModeT2O2m |
WmbusMode::ModeT2M2o =>38,
WmbusMode::ModeC1 |
WmbusMode::ModeC2O2m |
WmbusMode::ModeC2M2o => 32,
WmbusMode::ModeN4p8 |
WmbusMode::ModeN2p4 |
WmbusMode::ModeN6p4 |
WmbusMode::ModeN19p2 => 16,
};
Self {
mode,
rx_bw: RxBw::BwAuto,
pkt_format_tx: tx_format,
addr_filt_en: false,
pld_len: tx_len,
pbl_len_tx: pbl_len,
pbl_len_detect: 255, }
}
pub fn with_addr_filt(self) -> Self {
Self {
addr_filt_en: true,
..self
}
}
pub fn with_pbl_len(self, pbl_len_tx: u16) -> Self {
Self {
pbl_len_tx,
..self
}
}
}
impl<O,SPI, M> Lr2021<O,SPI, M> where
O: OutputPin, SPI: SpiBus<u8>, M: BusyPin
{
pub async fn set_wmbus_packet(&mut self, params: WmbusPacketParams) -> Result<(), Lr2021Error> {
let req = set_wmbus_params_cmd(params.mode, params.rx_bw, params.pkt_format_tx, params.addr_filt_en, params.pld_len, params.pbl_len_tx, params.pbl_len_detect);
self.cmd_wr(&req).await
}
pub async fn set_wmbus_address(&mut self, addr: u64) -> Result<(), Lr2021Error> {
let req = set_wmbus_address_cmd(addr);
self.cmd_wr(&req).await
}
pub async fn get_wmbus_packet_status(&mut self) -> Result<WmbusPacketStatusRsp, Lr2021Error> {
let req = get_wmbus_packet_status_req();
let mut rsp = WmbusPacketStatusRsp::new();
self.cmd_rd(&req, rsp.as_mut()).await?;
Ok(rsp)
}
pub async fn get_wmbus_rx_stats(&mut self) -> Result<WmbusRxStatsRsp, Lr2021Error> {
let req = get_wmbus_rx_stats_req();
let mut rsp = WmbusRxStatsRsp::new();
self.cmd_rd(&req, rsp.as_mut()).await?;
Ok(rsp)
}
}