1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

use linux_embedded_hal::{Spidev};
use linux_embedded_hal::spidev::{SpiModeFlags, SpidevOptions};

use crate::error::Error;

pub struct Spi {
    dev: Spidev,
}

impl Spi {
    pub fn new(path: &str, baud: u32, mode: u32) -> Result<Self, Error> {
        let mut dev = Spidev::open(path)?;

        let mode = SpiModeFlags::from_bits_truncate(mode);

        let mut config = SpidevOptions::new();
        config.max_speed_hz(baud);
        config.mode(mode);

        dev.configure(&config)?;

        Ok(Self{dev})
    }
}

impl std::ops::Deref for Spi {
    type Target = Spidev;

    fn deref(&self) -> &Self::Target {
        &self.dev
    }
}

impl std::ops::DerefMut for Spi {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.dev
    }
}