adafruit-seesaw crates.io page docs.rs

Platform-agnostic driver to communicate with devices that implement the Adafruit Seesaw firmware. See the Seesaw guide for more information on the firmware.

Introduction

The library uses and follows the patterns of the shared-bus library so that multiple devices can be connected and communicated with without owning the I2C bus.

Communicating with Seesaw devices requires a bus that implements both I2C traits and Delay from embedded-hal.

Using within a single thread

If you're communicating with devices within a single thread, use the SeesawSingleThread struct, which uses the NullMutex bus mutex implementation from `shared-bus:

rs // Setup on an STM32F405 let cp = cortex_m::Peripherals::take().unwrap(); let clocks = dp.RCC.constrain().cfgr.freeze(); let delay = cp.SYST.delay(&clocks); let i2c = I2c::new(dp.I2C1, (scl, sda), 400.kHz(), &clocks); let seesaw = SeesawSingleThread::new(delay, i2c);

Using across multiple threads

[WIP] Pending implementation of Seesaw for other BusMutex types.

Creating a Device

All devices implement the SeesawDevice trait and have the same constructor function, along with lots of other device-specific information.

| Product value | Const method on all SeesawDevices | Notes | | --------------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | Default Address | Device::default_addr() | | Hardware ID | Device::hardware_id() | This value depends on the host MCU of the device | | Product ID | Device::product_id() | You can use this value to go to the product page at adafruit.com/product/$product_id |

Let's talk to a NeoKey1x4 using the seesaw manager we created above.

Using the default address

rs let neokeys = NeoKey1x4::new_with_default_addr(seesaw.acquire_driver());

Using a custom address

rs let neokeys = NeoKey1x4::new(0x00, seesaw.acquire_driver());

Initializing Devices

Devices that implement SeesawDevice also implmement SeesawDeviceInit, which defines a device-specific init function for setting up a device's hardware functionality. The intention is to run a set of sensible defaults so you don't have to remember to do it yourself.

rs let neokeys = NeoKey1x4::new_with_default_addr(seesaw.acquire_driver()) .init() .expect("Failed to initialize NeoKey1x4");

For instance, the init function for our Neokey1x4 does the following:

Calling init is of course optional, but without it you'll have to handle initialization yourself.

Creating Your Own Devices

So far, this library only implements a few Seesaw devices (i.e., the ones that I currently own). You can define your own device using the seesaw_device! macro.

Let's assume you have some future Adafruit Neokey-esque device that has 6 buttons and 6 neopixels.

rs seesaw_device! { name: Neokey2x3, hardware_id: HardwareId::_, product_id: _, default_addr: _, modules: [ GpioModule, NeopixelModule { num_leds: 6, pin: _ }, ] }

The last thing you might want to do is implmeent the SeesawDeviceInit trait to handle the device intialization:

rs impl<D: Driver> SeesawDeviceInit<D> for Neokey2x3<D> { fn init(mut self) -> Result<Self, Self::Error> { self.reset_and_verify_seesaw() .and_then(|_| self.enable_neopixel()) .and_then(|_| self.enable_button_pins()) .map(|_| self) } }

Now you can use the new device as you would any other:

rs let neokeys = NeoKey2x3::new_with_default_addr(seesaw.acquire_driver()) .init() .expect("Failed to initialize NeoKey1x4");

TODOs

Seesaw-related

Modules

| Seesaw Module | Implemented | | ------------- | ----------- | | ADC | ✅ | | EEPROM | ⬜️ | | Encoder | ✅ | | GPIO | ✅ | | Keypad | ⬜️ | | Neopixel | ✅ | | Sercom0 | ⬜️ | | Spectrum | ⬜️ | | Status | ✅ | | Timer | ✅ | | Touch | ⬜️ |

Devices

| Device | Product ID | MCU | Implemented | | ---------------------------------------------------- | ---------- | --------- | ----------- | | ArcadeButton1x4 | 5296 | ATTiny8x7 | ✅ | | NeoKey1x4 | 4980 | SAMD09 | ✅ | | NeoSlider | 5295 | ATTiny8x7 | ✅ | | RotaryEncoder | 4991 | SAMD09 | ✅ |

Library/API-related

License

adafruit-seesaw is licensed under either of

at your option.


Not affiliated with, nor officially supported by Adafruit.