wasm-embedded-rt 0.4.0

Runtime for embedded-wasm applications


use log::debug;

use crate::api::{Spi, Error};
use super::{MockCtx, Op, Kind};


impl Spi for MockCtx {
    fn init(&mut self, port: u32, baud: u32, mosi: i32, miso: i32, sck: i32, cs: i32) -> Result<i32, Error> {
        debug!("Opening SPI port: {} (baud: {} mosi: {} miso: {} sck: {} cs: {})", port, baud, mosi, miso, sck, cs);

        let op = Kind::SpiInit{port, baud, mosi, miso, sck, cs};
        let Op{kind, res} = &self.expected[self.index];

        assert_eq!(&op, kind);

        self.actual.push(op);
        self.index += 1;

        Ok(*res)
    }

    fn deinit(&mut self, handle: i32) -> Result<(), Error> {
        debug!("Closing SPI handle: {}", handle);
        let op = Kind::SpiDeinit{handle};
        let Op{kind, ..} = &self.expected[self.index];

        assert_eq!(&op, kind);

        self.actual.push(op);
        self.index += 1;

        Ok(())
    }

    fn read<'a>(&mut self, handle: i32, data: &mut [u8]) -> Result<(), Error> {
        let Op{kind, ..} = &self.expected[self.index];

        if let Kind::SpiRead{data_in, ..} = kind {
            data.copy_from_slice(&data_in);
        }

        debug!("SPI write read: {} data: {:02x?}", handle, data);

        let op = Kind::SpiRead{handle, data_in: data.to_vec()};
        assert_eq!(&op, kind);

        self.actual.push(op);
        self.index += 1;

        Ok(())
    }

    fn write<'a>(&mut self, handle: i32, data: &[u8]) -> Result<(), Error> {
        let op = Kind::SpiWrite{handle, data_out: data.to_vec()};
        let Op{kind, ..} = &self.expected[self.index];

        debug!("SPI write handle: {} data: {:02x?}", handle, data);

        assert_eq!(&op, kind);

        self.actual.push(op);
        self.index += 1;

        Ok(())
    }

    fn transfer_inplace<'a>(&mut self, handle: i32, data: &mut [u8]) -> Result<(), Error> {
        let Op{kind, ..} = &self.expected[self.index];

        let d = data.to_vec();

        if let Kind::SpiTransfer{data_in, ..} = kind {
            data.copy_from_slice(&data_in);
        }

        debug!("SPI transfer handle: {} write: {:02x?} read: {:02x?}", handle, d, data);

        let op = Kind::SpiTransfer{handle, data_out: d, data_in: data.to_vec()};
        assert_eq!(&op, kind);

        self.actual.push(op);
        self.index += 1;
        
        Ok(())
    }

    fn transfer<'a>(&mut self, handle: i32, read: &mut [u8], write: &[u8]) -> Result<(), Error> {
        let Op{kind, ..} = &self.expected[self.index];

        if let Kind::SpiTransfer{data_in, ..} = kind {
            read.copy_from_slice(&data_in);
        }

        debug!("SPI transfer handle: {} write: {:02x?} read: {:02x?}", handle, write, read);

        let op = Kind::SpiTransfer{handle, data_out: write.to_vec(), data_in: read.to_vec()};
        assert_eq!(&op, kind);

        self.actual.push(op);
        self.index += 1;
        
        Ok(())
    }

}