pixtend 0.1.0

Rust library for the PiXtend V2L board
Documentation
use crate::error::PiXtendError;
use deku::prelude::*;

#[derive(Debug, DekuRead, DekuWrite, Default)]
pub struct RelayOut {
    #[deku(pad_bits_before = "4")]
    #[deku(bits = "1")]
    pub relay3: bool,
    #[deku(bits = "1")]
    pub relay2: bool,
    #[deku(bits = "1")]
    pub relay1: bool,
    #[deku(bits = "1")]
    pub relay0: bool,
}

impl RelayOut {
    pub fn set_relay_output(&mut self, index: u8, value: bool) -> Result<(), PiXtendError> {
        match index {
            0 => self.relay0 = value,
            1 => self.relay1 = value,
            2 => self.relay2 = value,
            3 => self.relay3 = value,
            _ => return Err(PiXtendError::InvalidRelayOutputIndex(index)),
        }

        Ok(())
    }
}

#[test]
fn test_relay_out_control() {
    let data = [0b0000_0101];
    let (_, relay_out) = RelayOut::from_bytes((data.as_ref(), 0)).unwrap();
    assert_eq!(relay_out.relay0, true);
    assert_eq!(relay_out.relay1, false);
    assert_eq!(relay_out.relay2, true);
    assert_eq!(relay_out.relay3, false);
    assert_eq!(relay_out.to_bytes().unwrap(), data);

    let data = [0b0000_1001];
    let (_, relay_out) = RelayOut::from_bytes((data.as_ref(), 0)).unwrap();
    assert_eq!(relay_out.relay0, true);
    assert_eq!(relay_out.relay1, false);
    assert_eq!(relay_out.relay2, false);
    assert_eq!(relay_out.relay3, true);
    assert_eq!(relay_out.to_bytes().unwrap(), data);
}