Skip to main content

bao1x_api/
i2c.rs

1pub trait I2cApi {
2    fn i2c_write(&mut self, dev: u8, adr: u8, data: &[u8]) -> Result<I2cResult, xous::Error>;
3
4    /// initiate an i2c read. The read buffer is passed during the await.
5    fn i2c_read(
6        &mut self,
7        dev: u8,
8        adr: u8,
9        buf: &mut [u8],
10        repeated_start: bool,
11    ) -> Result<I2cResult, xous::Error>;
12}
13
14#[cfg_attr(feature = "derive-rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
15#[derive(Debug, PartialEq, Eq)]
16pub enum I2cTransactionType {
17    Write,
18    Read,
19    ReadRepeatedStart,
20}
21
22#[cfg_attr(feature = "derive-rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
23#[derive(Debug, PartialEq, Eq, Copy, Clone)]
24pub enum I2cResult {
25    /// For the outbound message holder
26    Pending,
27    /// Returns # of bytes read or written if successful
28    Ack(usize),
29    /// An error occurred.
30    Nack,
31    /// An unhandled error has occurred.
32    InternalError,
33}
34#[cfg_attr(feature = "derive-rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
35#[cfg(feature = "std")]
36#[derive(Debug)]
37pub struct I2cTransaction {
38    pub i2c_type: I2cTransactionType,
39    pub device: u8,
40    pub address: u8,
41    pub data: Vec<u8>,
42    pub result: I2cResult,
43}
44
45#[cfg_attr(feature = "derive-rkyv", derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize))]
46#[cfg(feature = "std")]
47pub struct I2cTransactions {
48    pub transactions: Vec<I2cTransaction>,
49}
50#[cfg(feature = "std")]
51impl From<Vec<I2cTransaction>> for I2cTransactions {
52    fn from(value: Vec<I2cTransaction>) -> Self { Self { transactions: value } }
53}