use crate::status::Status;
use super::RxBw;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ZwaveMode {
Lr1 = 0,
R1 = 1,
R2 = 2,
R3 = 3,
}
impl ZwaveMode {
pub fn new(val: u8) -> Self{
match val {
3 => ZwaveMode::R3,
2 => ZwaveMode::R2,
_ => ZwaveMode::R1,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ZwaveAddrComp {
Off = 0,
Homeid = 1,
HomeidBeam = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FcsMode {
Auto = 0,
Fifo = 1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum AddrLen {
Addr8bit = 0,
Addr12bit = 1,
}
pub fn set_zwave_params_cmd(zwave_mode: ZwaveMode, rx_bw: RxBw, zwave_addr_comp: ZwaveAddrComp, pld_len: u8, pbl_len_tx: u16, pbl_len_detect: u8, fcs_mode: FcsMode) -> [u8; 10] {
let mut cmd = [0u8; 10];
cmd[0] = 0x02;
cmd[1] = 0x97;
cmd[2] |= (zwave_mode as u8) & 0x3;
cmd[3] |= rx_bw as u8;
cmd[4] |= zwave_addr_comp as u8;
cmd[5] |= pld_len;
cmd[6] |= ((pbl_len_tx >> 8) & 0xFF) as u8;
cmd[7] |= (pbl_len_tx & 0xFF) as u8;
cmd[8] |= pbl_len_detect;
cmd[9] |= (fcs_mode as u8) & 0x1;
cmd
}
pub fn set_zwave_home_id_filtering_cmd(home_id: u32) -> [u8; 6] {
let mut cmd = [0u8; 6];
cmd[0] = 0x02;
cmd[1] = 0x98;
cmd[2] |= ((home_id >> 24) & 0xFF) as u8;
cmd[3] |= ((home_id >> 16) & 0xFF) as u8;
cmd[4] |= ((home_id >> 8) & 0xFF) as u8;
cmd[5] |= (home_id & 0xFF) as u8;
cmd
}
pub fn get_zwave_packet_status_req() -> [u8; 2] {
[0x02, 0x9A]
}
pub fn set_zwave_beam_filtering_cmd(beam_tag: u8, addr_len: AddrLen, node_id: u16, id_hash: u8) -> [u8; 6] {
let mut cmd = [0u8; 6];
cmd[0] = 0x02;
cmd[1] = 0x9B;
cmd[2] |= beam_tag;
cmd[3] |= ((addr_len as u8) & 0x1) << 7;
cmd[3] |= ((node_id >> 8) & 0xFF) as u8;
cmd[4] |= (node_id & 0xFF) as u8;
cmd[5] |= id_hash;
cmd
}
pub fn set_zwave_scan_cmd() -> [u8; 2] {
[0x02, 0x9D]
}
pub fn get_zwave_rx_stats_req() -> [u8; 2] {
[0x02, 0x99]
}
#[derive(Default)]
pub struct ZwavePacketStatusRsp([u8; 9]);
impl ZwavePacketStatusRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
Status::from_slice(&self.0[..2])
}
pub fn pkt_len(&self) -> u16 {
(self.0[3] as u16) |
((self.0[2] as u16) << 8)
}
pub fn rssi_avg(&self) -> u16 {
(((self.0[7] >> 2) & 0x1) as u16) |
((self.0[4] as u16) << 1)
}
pub fn rssi_sync(&self) -> u16 {
((self.0[7] & 0x1) as u16) |
((self.0[5] as u16) << 1)
}
pub fn last_detect(&self) -> ZwaveMode {
ZwaveMode::new(self.0[6] & 0x3)
}
pub fn lqi(&self) -> u8 {
self.0[8]
}
}
impl AsMut<[u8]> for ZwavePacketStatusRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}
#[derive(Default)]
pub struct ZwaveRxStatsRsp([u8; 8]);
impl ZwaveRxStatsRsp {
pub fn new() -> Self {
Self::default()
}
pub fn status(&mut self) -> Status {
Status::from_slice(&self.0[..2])
}
pub fn pkt_rx(&self) -> u16 {
(self.0[3] as u16) |
((self.0[2] as u16) << 8)
}
pub fn crc_error(&self) -> u16 {
(self.0[5] as u16) |
((self.0[4] as u16) << 8)
}
pub fn len_error(&self) -> u16 {
(self.0[7] as u16) |
((self.0[6] as u16) << 8)
}
}
impl AsMut<[u8]> for ZwaveRxStatsRsp {
fn as_mut(&mut self) -> &mut [u8] {
&mut self.0
}
}