mod device_address;
mod register_address;
pub use crate::i2c::device_address::{DeviceAddress, DeviceAddress10, DeviceAddress7};
pub use crate::i2c::register_address::{RegisterAddress, RegisterAddress16, RegisterAddress8};
use crate::sizes::{RegisterSizeInformation, R1, R2};
use crate::{FromBits, HardwareRegister, ToBits, WritableHardwareRegister};
pub trait I2CRegister<D, R, Size>:
HardwareRegister<Size> + ToBits<Target = Self::Backing> + FromBits<Self::Backing>
where
D: DeviceAddress,
R: RegisterAddress,
Size: RegisterSizeInformation,
{
const DEFAULT_DEVICE_ADDRESS: D;
const REGISTER_ADDRESS: R;
type Backing;
}
pub trait WritableI2CRegister<D, R, Size>:
I2CRegister<D, R, Size> + WritableHardwareRegister<Size>
where
D: DeviceAddress,
R: RegisterAddress,
Size: RegisterSizeInformation,
{
}
impl<I, D, R, Size> WritableI2CRegister<D, R, Size> for I
where
I: I2CRegister<D, R, Size> + WritableHardwareRegister<Size>,
D: DeviceAddress,
R: RegisterAddress,
Size: RegisterSizeInformation,
{
}
pub trait I2CRegister8<D>:
I2CRegister<D, RegisterAddress8, R1, Backing = u8>
+ HardwareRegister<R1>
+ Copy
+ Clone
+ ToBits<Target = u8>
+ FromBits<u8>
where
D: DeviceAddress,
{
}
pub trait WritableI2CRegister8<D>:
WritableI2CRegister<D, RegisterAddress8, R1> + WritableHardwareRegister<R1> + Copy + Clone
where
D: DeviceAddress,
{
}
pub trait I2CRegister16<D>:
I2CRegister<D, RegisterAddress16, R2> + HardwareRegister<R2> + Copy + Clone
where
D: DeviceAddress,
{
}
pub trait WritableI2CRegister16<D>:
WritableI2CRegister<D, RegisterAddress16, R2> + WritableHardwareRegister<R2> + Copy + Clone
where
D: DeviceAddress,
{
}
impl<I, D> I2CRegister8<D> for I
where
I: I2CRegister<D, RegisterAddress8, R1, Backing = u8>
+ HardwareRegister<R1>
+ Copy
+ Clone
+ ToBits<Target = u8>
+ FromBits<u8>,
D: DeviceAddress,
{
}
impl<I, D> WritableI2CRegister8<D> for I
where
I: WritableI2CRegister<D, RegisterAddress8, R1> + WritableHardwareRegister<R1> + Copy + Clone,
D: DeviceAddress,
{
}
impl<I, D> I2CRegister16<D> for I
where
I: I2CRegister<D, RegisterAddress16, R2> + HardwareRegister<R2> + Copy + Clone,
D: DeviceAddress,
{
}
impl<I, D> WritableI2CRegister16<D> for I
where
I: WritableI2CRegister<D, RegisterAddress16, R2> + WritableHardwareRegister<R2> + Copy + Clone,
D: DeviceAddress,
{
}