adafruit_seesaw/devices/
arcade_button_1x4.rs1use super::SeesawDeviceInit;
2use crate::{
3    modules::{
4        gpio::{GpioModule, PinMode},
5        status::StatusModule,
6        timer::TimerModule,
7        HardwareId,
8    },
9    seesaw_device, Driver, SeesawError,
10};
11
12seesaw_device! {
13  name: ArcadeButton1x4,
30  hardware_id: HardwareId::ATTINY817,
31  product_id: 5296,
32  default_addr: 0x3A
33}
34
35impl<D: Driver> GpioModule<D> for ArcadeButton1x4<D> {}
36impl<D: Driver> TimerModule<D> for ArcadeButton1x4<D> {}
37
38impl<D: Driver> SeesawDeviceInit<D> for ArcadeButton1x4<D> {
39    fn init(mut self) -> Result<Self, SeesawError<D::Error>> {
40        self.reset_and_verify_seesaw()
41            .and_then(|_| self.enable_buttons())
42            .map(|_| self)
43    }
44}
45
46impl<D: Driver> ArcadeButton1x4<D> {
47    pub fn button_values(&mut self) -> Result<[bool; 4], SeesawError<D::Error>> {
48        let mut values = [false; 4];
49        for (i, pin) in [18, 19, 20, 2].iter().enumerate() {
50            values[i] = self.digital_read(*pin)?;
51        }
52        Ok(values)
53    }
54
55    pub fn enable_buttons(&mut self) -> Result<(), SeesawError<D::Error>> {
57        self.set_pin_mode(18, PinMode::InputPullup)?;
58        self.set_pin_mode(19, PinMode::InputPullup)?;
59        self.set_pin_mode(20, PinMode::InputPullup)?;
60        self.set_pin_mode(2, PinMode::InputPullup)?;
61        Ok(())
62    }
63
64    pub fn set_led_duty_cycles(&mut self, pwms: &[u8; 4]) -> Result<(), SeesawError<D::Error>> {
65        [12u8, 13, 0, 1]
66            .iter()
67            .enumerate()
68            .try_for_each(|(i, &pin)| self.analog_write(pin, pwms[i]))
69    }
70}