use crate::Result;
use embedded_hal::i2c::I2c;
pub const DEFAULT_ADDRESS: u8 = crate::addresses::HUB;
pub struct Hub<I2C> {
i2c: I2C,
address: u8,
}
impl<I2C, E> Hub<I2C>
where
I2C: I2c<Error = E>,
{
pub fn new(i2c: I2C) -> Self {
Self::new_with_address(i2c, DEFAULT_ADDRESS)
}
pub fn new_with_address(i2c: I2C, address: u8) -> Self {
Self { i2c, address }
}
pub fn select(&mut self, port: u8) -> Result<(), E> {
if port >= 8 {
return Err(crate::Error::InvalidParameter);
}
let control_byte = 1 << port;
self.i2c
.write(self.address, &[control_byte])
.map_err(crate::Error::I2c)
}
pub fn clear(&mut self) -> Result<(), E> {
self.i2c
.write(self.address, &[0x00])
.map_err(crate::Error::I2c)
}
pub fn release(self) -> I2C {
self.i2c
}
}
pub struct HubPort<'a, I2C> {
hub: &'a mut Hub<I2C>,
port: u8,
}
impl<'a, I2C, E> HubPort<'a, I2C>
where
I2C: I2c<Error = E>,
{
pub fn new(hub: &'a mut Hub<I2C>, port: u8) -> Self {
Self { hub, port }
}
pub fn select(&mut self) -> Result<(), E> {
self.hub.select(self.port)
}
pub fn clear(&mut self) -> Result<(), E> {
self.hub.clear()
}
}