stm32f1-hal 0.12.3

HAL for the STM32F1 family
Documentation
use super::{Address, Error, I2cBusInterface};
use embedded_hal::i2c::{ErrorType, I2c, Operation, SevenBitAddress, TenBitAddress};
use os_trait::{Mutex, OsInterface, prelude::*};

pub struct I2cMutexDevice<OS: OsInterface, BUS>
where
    OS: OsInterface,
    BUS: I2cBusInterface,
{
    bus: Arc<Mutex<OS, BUS>>,
}

impl<OS, BUS> I2cMutexDevice<OS, BUS>
where
    OS: OsInterface,
    BUS: I2cBusInterface,
{
    pub fn new(bus: Arc<Mutex<OS, BUS>>) -> Self {
        Self { bus }
    }
}

impl<OS, BUS> I2c<SevenBitAddress> for I2cMutexDevice<OS, BUS>
where
    OS: OsInterface,
    BUS: I2cBusInterface,
{
    #[inline]
    fn transaction(
        &mut self,
        address: SevenBitAddress,
        operations: &mut [Operation<'_>],
    ) -> Result<(), Self::Error> {
        let mut bus = self.bus.lock();
        bus.bus_transaction(Address::Seven(address), operations)
    }
}

impl<OS, BUS> I2c<TenBitAddress> for I2cMutexDevice<OS, BUS>
where
    OS: OsInterface,
    BUS: I2cBusInterface,
{
    #[inline]
    fn transaction(
        &mut self,
        address: TenBitAddress,
        operations: &mut [Operation<'_>],
    ) -> Result<(), Self::Error> {
        let mut bus = self.bus.lock();
        bus.bus_transaction(Address::Ten(address), operations)
    }
}

impl<OS, BUS> ErrorType for I2cMutexDevice<OS, BUS>
where
    OS: OsInterface,
    BUS: I2cBusInterface,
{
    type Error = Error;
}