1#![no_std]
2
3use embedded_hal::i2c::I2c;
4use embedded_hal_bus::i2c::AtomicDevice;
5use embedded_hal_bus::util::AtomicCell;
6use error::Error;
7use pin::interrupt::InterruptController;
8use pin::{Pin, Pins};
9
10pub mod error;
11pub mod pin;
12
13pub(crate) mod registers;
14
15pub struct Mcp23017<S: I2c, const A: u8> {
19 cell: AtomicCell<S>,
20}
21
22impl<S: I2c, const A: u8> Mcp23017<S, A> {
23 pub fn new(i2c: S) -> Self {
25 Self {
26 cell: AtomicCell::new(i2c),
27 }
28 }
29
30 pub fn split(&mut self) -> Result<(Pins<S, A>, InterruptController<S, A>), Error<S>> {
37 unsafe {
38 Ok((
39 Pins {
40 a0: Pin::new(AtomicDevice::new(&self.cell)),
41 a1: Pin::new(AtomicDevice::new(&self.cell)),
42 a2: Pin::new(AtomicDevice::new(&self.cell)),
43 a3: Pin::new(AtomicDevice::new(&self.cell)),
44 a4: Pin::new(AtomicDevice::new(&self.cell)),
45 a5: Pin::new(AtomicDevice::new(&self.cell)),
46 a6: Pin::new(AtomicDevice::new(&self.cell)),
47 a7: Pin::new(AtomicDevice::new(&self.cell)).try_into()?,
48
49 b0: Pin::new(AtomicDevice::new(&self.cell)),
50 b1: Pin::new(AtomicDevice::new(&self.cell)),
51 b2: Pin::new(AtomicDevice::new(&self.cell)),
52 b3: Pin::new(AtomicDevice::new(&self.cell)),
53 b4: Pin::new(AtomicDevice::new(&self.cell)),
54 b5: Pin::new(AtomicDevice::new(&self.cell)),
55 b6: Pin::new(AtomicDevice::new(&self.cell)),
56 b7: Pin::new(AtomicDevice::new(&self.cell)).try_into()?,
57 },
58 InterruptController::new(AtomicDevice::new(&self.cell)),
59 ))
60 }
61 }
62}