use core::cell::RefCell;
use modulino::{Buttons, Hub};
struct SharedI2c<'a>(&'a RefCell<DummyI2c>);
impl<'a> embedded_hal::i2c::ErrorType for SharedI2c<'a> {
type Error = DummyError;
}
impl<'a> embedded_hal::i2c::I2c for SharedI2c<'a> {
fn read(&mut self, address: u8, read: &mut [u8]) -> Result<(), Self::Error> {
self.0.borrow_mut().read(address, read)
}
fn write(&mut self, address: u8, write: &[u8]) -> Result<(), Self::Error> {
self.0.borrow_mut().write(address, write)
}
fn write_read(
&mut self,
_address: u8,
_write: &[u8],
_read: &mut [u8],
) -> Result<(), Self::Error> {
self.0.borrow_mut().write_read(_address, _write, _read)
}
fn transaction(
&mut self,
_address: u8,
_operations: &mut [embedded_hal::i2c::Operation<'_>],
) -> Result<(), Self::Error> {
self.0.borrow_mut().transaction(_address, _operations)
}
}
fn main() {
let i2c = dummy_i2c_initialization();
let shared_i2c = RefCell::new(i2c);
let mut hub = Hub::new(SharedI2c(&shared_i2c));
hub.select(0).unwrap();
let mut buttons_a = Buttons::new(SharedI2c(&shared_i2c)).unwrap();
hub.select(1).unwrap();
let mut buttons_b = Buttons::new(SharedI2c(&shared_i2c)).unwrap();
loop {
hub.select(0).unwrap();
if let Ok(state) = buttons_a.read() {
buttons_a.led_a.set(state.a);
buttons_a.update_leds().unwrap();
}
hub.select(1).unwrap();
if let Ok(state) = buttons_b.read() {
buttons_b.led_a.set(state.a);
buttons_b.update_leds().unwrap();
}
std::thread::sleep(std::time::Duration::from_millis(50));
}
}
fn dummy_i2c_initialization() -> DummyI2c {
DummyI2c
}
struct DummyI2c;
impl embedded_hal::i2c::ErrorType for DummyI2c {
type Error = DummyError;
}
#[derive(Debug, Clone, Copy)]
struct DummyError;
impl embedded_hal::i2c::Error for DummyError {
fn kind(&self) -> embedded_hal::i2c::ErrorKind {
embedded_hal::i2c::ErrorKind::Other
}
}
impl embedded_hal::i2c::I2c for DummyI2c {
fn read(&mut self, _address: u8, _read: &mut [u8]) -> Result<(), Self::Error> {
Ok(())
}
fn write(&mut self, _address: u8, _write: &[u8]) -> Result<(), Self::Error> {
Ok(())
}
fn write_read(
&mut self,
_address: u8,
_write: &[u8],
_read: &mut [u8],
) -> Result<(), Self::Error> {
if _address == 0x3E && !_read.is_empty() {
_read[0] = 0x7C; }
Ok(())
}
fn transaction(
&mut self,
_address: u8,
_operations: &mut [embedded_hal::i2c::Operation<'_>],
) -> Result<(), Self::Error> {
Ok(())
}
}