use crate::binrw_util;
use alloc::vec::Vec;
use binrw::binrw;
use bitflags::bitflags;
use num_enum::{FromPrimitive, IntoPrimitive};
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RFStatusFlags: u8 {
const SIG_AUTH_ALERT = 1 << 0;
const NAV_MSG_AUTH_ALERT = 1 << 1;
}
}
#[derive(Debug, Clone, Copy, FromPrimitive, IntoPrimitive)]
#[repr(u8)]
pub enum RFBandMode {
ManualNotch = 1,
Mitigated = 2,
Unmitigated = 8,
#[num_enum(catch_all)]
Unknown(u8),
}
#[binrw]
#[derive(Clone, Debug)]
pub struct RFBand {
pub frequency: u32,
pub bandwidth: u16,
pub info: u8,
#[br(map = binrw_util::map_i1_zero)]
#[bw(map = binrw_util::unmap_i1_zero)]
pub power: Option<i8>,
}
impl RFBand {
pub fn mode(&self) -> RFBandMode {
RFBandMode::from(self.info & 0x0F)
}
pub fn antenna_id(&self) -> u8 {
(self.info >> 6) & 0x03
}
}
#[binrw]
#[derive(Clone, Debug)]
pub struct RFStatus {
#[br(map = binrw_util::map_u4)]
#[bw(map = binrw_util::unmap_u4)]
pub tow: Option<u32>,
#[br(map = binrw_util::map_u2)]
#[bw(map = binrw_util::unmap_u2)]
pub wnc: Option<u16>,
n: u8,
pub sb_length: u8,
#[br(map = |x: u8| RFStatusFlags::from_bits_retain(x))]
#[bw(map = |x: &RFStatusFlags| x.bits())]
pub flags: RFStatusFlags,
_reserved: [u8; 3],
#[br(args { count: usize::from(n), inner: (usize::from(sb_length),) }, map = binrw_util::unwrap_subblocks)]
#[bw(args_raw = (usize::from(*sb_length),), map = binrw_util::wrap_subblocks)]
pub bands: Vec<RFBand>,
#[br(parse_with = binrw::helpers::until_eof)]
_padding: Vec<u8>,
}
impl RFStatus {
pub fn num_bands(&self) -> u8 {
self.n
}
}