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}