adafruit_seesaw/devices/
arcade_button_1x4.rs

1use 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  /// ArcadeButton1x4
14  ///
15  /// Button | Pin | GPIO
16  /// ---|---|---
17  /// SW1 | 18 | PA01
18  /// SW2 | 19 | PA02
19  /// SW3 | 20 | PA03
20  /// SW4 | 2 | PA06
21  ///
22  /// LED | PIN | GPIO
23  /// ---|---|---
24  /// PWM1 | 12 | PC00
25  /// PWM2 | 13 | PC01
26  /// PWM3 | 0 | PA04
27  /// PWM4 | 1 | PA05
28  ///
29  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    /// Set the pin mode of the 4 buttons to input pullup:
56    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}