use embedded_hal::digital::OutputPin;
use embedded_hal_async::spi::SpiBus;
pub use super::cmd::cmd_flrc::*;
use super::{BusyPin, Lr2021, Lr2021Error, PulseShape};
pub struct FlrcPacketParams {
pub agc_pbl_len: AgcPblLen,
pub sw_len: SwLen,
pub sw_tx: SwTx,
pub sw_match: SwMatch,
pub hdr_format: PktFormat,
pub crc: Crc,
pub pld_len: u16
}
impl FlrcPacketParams {
pub fn new(agc_pbl_len: AgcPblLen, sw_len: SwLen, sw_tx: SwTx, sw_match: SwMatch, hdr_format: PktFormat, crc: Crc, pld_len: u16) -> Self {
Self{agc_pbl_len, sw_len, sw_tx, sw_match, hdr_format, crc, pld_len}
}
}
impl<O,SPI, M> Lr2021<O,SPI, M> where
O: OutputPin, SPI: SpiBus<u8>, M: BusyPin
{
pub async fn set_flrc_modulation(&mut self, bitrate: FlrcBitrate, cr: FlrcCr, pulse_shape: PulseShape) -> Result<(), Lr2021Error> {
let req = set_flrc_modulation_params_cmd(bitrate, cr, pulse_shape);
self.cmd_wr(&req).await
}
pub async fn set_flrc_packet(&mut self, params: &FlrcPacketParams) -> Result<(), Lr2021Error> {
let req = set_flrc_packet_params_cmd(
params.agc_pbl_len,
params.sw_len,
params.sw_tx,
params.sw_match,
params.hdr_format,
params.crc,
params.pld_len);
self.cmd_wr(&req).await
}
pub async fn set_flrc_syncword(&mut self, sw_num: u8, syncword: u32, is_16b: bool) -> Result<(), Lr2021Error> {
let sw = if is_16b {syncword << 16} else {syncword};
let req = set_flrc_syncword_cmd(sw_num, sw);
let req_s = if is_16b {&req[..5]} else {&req};
self.cmd_wr(req_s).await
}
pub async fn get_flrc_packet_status(&mut self) -> Result<FlrcPacketStatusRsp, Lr2021Error> {
let req = get_flrc_packet_status_req();
let mut rsp = FlrcPacketStatusRsp::new();
self.cmd_rd(&req, rsp.as_mut()).await?;
Ok(rsp)
}
pub async fn get_flrc_rx_stats(&mut self) -> Result<FlrcRxStatsRsp, Lr2021Error> {
let req = get_flrc_rx_stats_req();
let mut rsp = FlrcRxStatsRsp::new();
self.cmd_rd(&req, rsp.as_mut()).await?;
Ok(rsp)
}
}