sx126x 0.3.0

A driver for the SX126X Family of LoRa modems
Documentation
#[repr(u16)]
#[derive(Copy, Clone)]
pub enum IrqMaskBit {
    None = 0x0000,
    TxDone = 1 << 0,
    RxDone = 1 << 1,
    PreambleDetected = 1 << 2,
    SyncwordValid = 1 << 3,
    HeaderValid = 1 << 4,
    HeaderError = 1 << 5,
    CrcErr = 1 << 6,
    CadDone = 1 << 7,
    CadDetected = 1 << 8,
    Timeout = 1 << 9,
    All = 0xFFFF,
}

#[derive(Copy, Clone)]
pub struct IrqMask {
    inner: u16,
}

impl IrqMask {
    pub const fn none() -> Self {
        Self {
            inner: IrqMaskBit::None as u16,
        }
    }

    pub const fn all() -> Self {
        Self {
            inner: IrqMaskBit::All as u16,
        }
    }

    pub const fn combine(self, bit: IrqMaskBit) -> Self {
        let inner = self.inner | bit as u16;
        Self { inner }
    }
}

impl From<IrqMask> for u16 {
    fn from(val: IrqMask) -> Self {
        val.inner
    }
}

impl From<u16> for IrqMask {
    fn from(mask: u16) -> Self {
        Self { inner: mask }
    }
}

impl Default for IrqMask {
    fn default() -> Self {
        Self::none()
    }
}

#[derive(Copy, Clone)]
pub struct IrqStatus {
    inner: u16,
}

impl From<u16> for IrqStatus {
    fn from(status: u16) -> Self {
        Self { inner: status }
    }
}

impl core::fmt::Debug for IrqStatus {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        write!(
            f,
            "IrqStatus {{inner: {:#016b}, tx_done: {}, rx_done: {}, preamble_detected: {}, syncword_valid: {}, header_valid: {}, header_error: {}, crc_err: {}, cad_done: {}, cad_detected: {}, timeout : {}}}",
            self.inner,
            self.tx_done(),
            self.rx_done(),
            self.preamble_detected(),
            self.syncword_valid(),
            self.header_valid(),
            self.header_error(),
            self.crc_err(),
            self.cad_done(),
            self.cad_detected(),
            self.timeout(),
        )
    }
}

impl IrqStatus {
    pub fn tx_done(self) -> bool {
        (self.inner & IrqMaskBit::TxDone as u16) > 0
    }

    pub fn rx_done(self) -> bool {
        (self.inner & IrqMaskBit::RxDone as u16) > 0
    }

    pub fn preamble_detected(self) -> bool {
        (self.inner & IrqMaskBit::PreambleDetected as u16) > 0
    }

    pub fn syncword_valid(self) -> bool {
        (self.inner & IrqMaskBit::SyncwordValid as u16) > 0
    }

    pub fn header_valid(self) -> bool {
        (self.inner & IrqMaskBit::HeaderValid as u16) > 0
    }

    pub fn header_error(self) -> bool {
        (self.inner & IrqMaskBit::HeaderError as u16) > 0
    }

    pub fn crc_err(self) -> bool {
        (self.inner & IrqMaskBit::CrcErr as u16) > 0
    }

    pub fn cad_done(self) -> bool {
        (self.inner & IrqMaskBit::CadDone as u16) > 0
    }

    pub fn cad_detected(self) -> bool {
        (self.inner & IrqMaskBit::CadDetected as u16) > 0
    }

    pub fn timeout(self) -> bool {
        (self.inner & IrqMaskBit::Timeout as u16) > 0
    }
}