nesso-rs
nesso-rs is a Rust-native SDK for the Arduino Nesso N1, an ESP32-C6 based
device with display, touch, IMU, Wi-Fi, audio, and battery/power-management
hardware and optional external unit support for Nesso-compatible expansion
sensors such as M5Stack Unit ENV Pro.
The public crate is nesso. The repository is
a Cargo workspace for examples and validation, but only the nesso crate is
published to crates.io.
Status
This project is an early hardware-validated SDK foundation.
This SDK targets only the Arduino Nesso N1. It intentionally does not provide a generic board abstraction layer, an M5Stack compatibility layer, or support for other ESP32-C6 boards.
Validated examples currently cover:
- ST7789P3 display initialization and text rendering
- FT6336U touch reads
- BMI270 IMU live axis reads
- KEY1/KEY2 button events
- Passive buzzer tone output
- BQ27220/AW32001 battery and charger status reads
- Heapless settings storage
- ESP32-C6 Wi-Fi scan/connect/disconnect lifecycle using
esp-radio - ESP32-C6 BLE controller lifecycle with a connectable GATT peripheral example and notification-mirroring GATT surface
- Motion/context helpers derived from BMI270 acceleration samples
- Lightweight layout, text, progress, transition, and sprite helpers
- M5Stack Unit ENV Pro BME688 environmental reads over I2C/Qwiic
- Board information display
Installation
Add the public facade crate:
Enable Wi-Fi only for applications that use the ESP32-C6 radio:
Enable ENV Pro support only for applications that use the external unit:
Enable BLE only for applications that use the ESP32-C6 Bluetooth controller:
Public Modules
nesso::Nesso: public facade and shared board ownership.nesso::bsp: Nesso N1 board constants, GPIOs, I2C addresses, and board-specific setup helpers.nesso::display: ST7789P3 display driver withembedded-graphicsintegration.nesso::env: external environmental unit support, gated behind theenvfeature.nesso::ble: ESP32-C6 BLE controller lifecycle and HCI handoff, gated behind theblefeature.nesso::touch: FT6336U touch controller support.nesso::input: button event state machine helpers.nesso::imu: BMI270 initialization, config upload, and sensor reads.nesso::motion: coarse motion and pose helpers built from accelerometer samples.nesso::audio: passive buzzer output and blocking tone generation.nesso::power: BQ27220 fuel gauge and AW32001 charger status support.nesso::wifi: ESP32-C6 Wi-Fi station lifecycle support, gated behind thewififeature.nesso::storage: heapless settings storage primitives andesp-storageflash-backed persistence.nesso::sprite: caller-owned RGB565 sprite/framebuffer support for flicker-free dirty-region rendering.nesso::ui: smallembedded-graphicslayout, label, progress, and transition helpers.
Examples
Each public module has one focused hardware or module-validation example:
| Module | Example |
|---|---|
nesso::Nesso |
hello_world |
nesso::bsp |
board_info |
nesso::display |
display_test |
nesso::touch |
touch_test |
nesso::input |
input_test |
nesso::imu |
imu_test |
nesso::motion |
motion_test |
nesso::audio |
audio_test |
nesso::power |
battery_test |
nesso::wifi |
wifi_scan |
nesso::ble |
ble_peripheral, ble_beacon, ble_notifications |
nesso::storage |
storage_test |
nesso::ui |
ui_test |
nesso::env |
env_pro_test |
Example
The facade owns the fixed Nesso N1 wiring. Applications initialize ESP-HAL once,
then hand the peripherals to Nesso::new.
use ;
use DelayNs;
use ;
use Nesso;
!
See examples/ for hardware-focused examples.
Wi-Fi is behind the optional wifi feature and is initialized lazily with
nesso.init_wifi(). Only applications that enable Wi-Fi need to compile
esp-radio/esp-rtos and provide an esp_alloc heap for the ESP radio stack.
BLE is behind the optional ble feature and is initialized lazily with
nesso.init_ble(). The SDK owns board/controller bring-up and can hand the HCI
connector to a host stack. The ble_peripheral example uses Trouble to
advertise as Nesso N1 and exposes a small custom GATT service that can be
inspected with nRF Connect. The ble_beacon example rotates passive
non-connectable advertising payloads using nesso::ble::BeaconSchedule. The
ble_notifications example accepts app|title|body writes on the Nesso mirror
characteristic and displays the latest mirrored phone/app notification.
Build
Install Rust with the target specified in rust-toolchain.toml, then run:
Flashing Examples
Build and flash an example with espflash:
Change the serial port for your host.
Documentation
Hardware and architecture notes are kept in docs/:
docs/hardware.mddocs/architecture.mddocs/m5gfx-analysis.mddocs/gap-analysis.mddocs/roadmap.md
Release Process
Releases are published from GitHub Releases.
- Merge through a pull request to
main. - Create and push the release tag.
- Publish a GitHub Release for that tag.
The release workflow validates the workspace and publishes only the public
nesso crate to crates.io.
The workflow uses crates.io trusted publishing and does not require a long-lived Cargo registry token.
License
Licensed under the MIT License. See the LICENSE file.