adafruit_seesaw/modules/
encoder.rs1use super::{
2    gpio::{GpioModule, PinMode},
3    Modules, Reg,
4};
5use crate::{Driver, DriverExt, SeesawError};
6
7#[allow(dead_code)]
8const STATUS: &Reg = &[Modules::Encoder.into_u8(), 0x00];
9const INT_SET: &Reg = &[Modules::Encoder.into_u8(), 0x10];
10const INT_CLR: &Reg = &[Modules::Encoder.into_u8(), 0x20];
11const POSITION: &Reg = &[Modules::Encoder.into_u8(), 0x30];
12const DELTA: &Reg = &[Modules::Encoder.into_u8(), 0x40];
13
14pub trait EncoderModule<D: Driver, const N_ENCODERS: usize>: GpioModule<D> {
15    const ENCODER_BTN_PINS: [u8; N_ENCODERS];
16
17    fn enable_button(&mut self, encoder: usize) -> Result<(), SeesawError<D::Error>> {
18        self.set_pin_mode(Self::ENCODER_BTN_PINS[encoder], PinMode::InputPullup)
19            .map(|_| self.driver().delay_us(125))
20    }
21
22    fn button(&mut self, encoder: usize) -> Result<bool, SeesawError<D::Error>> {
23        self.digital_read(Self::ENCODER_BTN_PINS[encoder])
24    }
25
26    fn delta(&mut self, encoder: usize) -> Result<i32, SeesawError<D::Error>> {
27        let addr = self.addr();
28        let reg = &[DELTA[0], DELTA[1] | encoder as u8];
29        self.driver().read_i32(addr, reg).map_err(SeesawError::I2c)
30    }
31
32    fn disable_interrupt(&mut self, encoder: usize) -> Result<(), SeesawError<D::Error>> {
33        let addr = self.addr();
34        let reg = &[INT_CLR[0], INT_CLR[1] | encoder as u8];
35        self.driver()
36            .write_u8(addr, reg, 1)
37            .map_err(SeesawError::I2c)
38    }
39
40    fn enable_interrupt(&mut self, encoder: usize) -> Result<(), SeesawError<D::Error>> {
41        let addr = self.addr();
42        let reg = &[INT_SET[0], INT_SET[1] | encoder as u8];
43        self.driver()
44            .write_u8(addr, reg, 1)
45            .map_err(SeesawError::I2c)
46    }
47
48    fn position(&mut self, encoder: usize) -> Result<i32, SeesawError<D::Error>> {
49        let addr = self.addr();
50        let reg = &[POSITION[0], POSITION[1] | encoder as u8];
51        self.driver().read_i32(addr, reg).map_err(SeesawError::I2c)
52    }
53
54    fn set_position(&mut self, encoder: usize, pos: i32) -> Result<(), SeesawError<D::Error>> {
55        let addr = self.addr();
56        let reg = &[POSITION[0], POSITION[1] | encoder as u8];
57        self.driver()
58            .write_i32(addr, reg, pos)
59            .map_err(SeesawError::I2c)
60    }
61}