feat: add display UI with splash screen, dashboard, and RSSI sparkline
Implement full SSD1306 OLED display support: - Splash screen on boot (1.5s) with project name, version, board - Dashboard showing radio state, config, counters, RSSI/SNR - RSSI history sparkline (64-sample ring buffer, 2px-wide bars) - DisplayOn/DisplayOff host commands routed via dedicated channel - Pure render functions against generic DrawTarget (no hardware coupling) - Display on/off control bypasses radio task entirely Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
17624 files changed
+4564928
-38
No files matched your search
Vendored
+284
@@ -0,0 +1,284 @@
|
||||
<p align="center">
|
||||
<img width="150" src="https://raw.githubusercontent.com/embedded-graphics/embedded-graphics/191fe7f8a0fedc713f9722b9dc59208dacadee7e/assets/logo.svg?sanitize=true" alt="Embedded graphics logo">
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://circleci.com/gh/embedded-graphics/embedded-graphics/tree/master"><img src="https://circleci.com/gh/embedded-graphics/embedded-graphics/tree/master.svg?style=shield" alt="Build Status"></a>
|
||||
<a href="https://crates.io/crates/embedded-graphics"><img src="https://img.shields.io/crates/v/embedded-graphics.svg" alt="Crates.io"></a>
|
||||
<a href="https://docs.rs/embedded-graphics"><img src="https://docs.rs/embedded-graphics/badge.svg" alt="Docs.rs"></a>
|
||||
<a href="https://matrix.to/#/#rust-embedded-graphics:matrix.org"><img src="https://img.shields.io/matrix/rust-embedded-graphics:matrix.org" alt="embedded-graphics on Matrix"></a>
|
||||
</p>
|
||||
|
||||
# Embedded graphics
|
||||
|
||||
Embedded-graphics is a 2D graphics library that is focused on memory constrained embedded devices.
|
||||
|
||||
A core goal of embedded-graphics is to draw graphics without using any buffers; the crate is
|
||||
`no_std` compatible and works without a dynamic memory allocator, and without pre-allocating
|
||||
large chunks of memory. To achieve this, it takes an `Iterator` based approach, where pixel
|
||||
colors and positions are calculated on the fly, with the minimum of saved state. This allows the
|
||||
consuming application to use far less RAM at little to no performance penalty.
|
||||
|
||||
It contains built in items that make it easy to draw 2D graphics primitives:
|
||||
|
||||
* [Raw data images]
|
||||
* [Primitives]
|
||||
* [Lines]
|
||||
* [Rectangles (and squares)]
|
||||
* [Circles]
|
||||
* [Ellipses]
|
||||
* [Arcs]
|
||||
* [Sectors]
|
||||
* [Triangles]
|
||||
* [Polylines]
|
||||
* [Rounded rectangles]
|
||||
* [Text]
|
||||
* [Monospaced fonts]
|
||||
|
||||
## Additional functions provided by external crates
|
||||
|
||||
Embedded-graphics is designed to be extended by the application or other crates. Examples of
|
||||
this are adding support for different image formats or implementing custom fonts.
|
||||
|
||||
* [BMP images - `tinybmp`](https://crates.io/crates/tinybmp)
|
||||
* [TGA images - `tinytga`](https://crates.io/crates/tinytga)
|
||||
* [QOI images - `tinyqoi`](https://crates.io/crates/tinyqoi)
|
||||
* [Large collection of fonts - `u8g2-fonts`](https://crates.io/crates/u8g2-fonts)
|
||||
* [ProFont monospace font - `profont`](https://crates.io/crates/profont)
|
||||
* [Picofont Pico8 font - `embedded-picofont`](https://crates.io/crates/embedded_picofont)
|
||||
* [IBM437 font - `ibm437`](https://crates.io/crates/ibm437)
|
||||
* [The fonts shipped with `embedded-graphics` 0.6 - `embedded-vintage-fonts`](https://crates.io/crates/embedded-vintage-fonts)
|
||||
* [Simple layout/alignment functions - `embedded-layout`](https://crates.io/crates/embedded-layout)
|
||||
* [TextBox with text alignment options - `embedded-text`](https://crates.io/crates/embedded-text)
|
||||
* [Heapless plotting library for small embedded targets - `embedded-plots`](https://crates.io/crates/embedded-plots)
|
||||
* [Virtual seven-segment displays - `eg-seven-segment`](https://crates.io/crates/eg-seven-segment)
|
||||
* [Canvas for drawing onto before drawing on the display - `embedded-canvas`](https://crates.io/crates/embedded-canvas)
|
||||
* [Frames Per Second counter for embedded devices - `embedded-fps`](https://crates.io/crates/embedded-fps)
|
||||
* [Framebuffer with DMA support - `embedded-graphics-framebuf`](https://crates.io/crates/embedded-graphics-framebuf)
|
||||
|
||||
Note that some of these crates may not support the latest version of embedded-graphics.
|
||||
|
||||
If you know of a crate that is not in this list, please [open an
|
||||
issue](https://github.com/embedded-graphics/embedded-graphics/issues/new) to add it.
|
||||
|
||||
## Display drivers
|
||||
|
||||
To support many different kinds of display, embedded-graphics doesn't include any drivers
|
||||
directly but provides the [`DrawTarget`] API in [`embedded-graphics-core`] that can be
|
||||
implemented by external crates. In addition to the drivers for real displays, the
|
||||
[simulator](https://docs.rs/embedded-graphics-simulator/) can be used to test code during
|
||||
development.
|
||||
|
||||

|
||||
|
||||
These are just some of the displays the community has added embedded-graphics support to. This
|
||||
list is taken from the [dependent crates
|
||||
list](https://crates.io/crates/embedded-graphics/reverse_dependencies) on crates.io so might be
|
||||
missing some unpublished entries. Please [open an
|
||||
issue](https://github.com/embedded-graphics/embedded-graphics/issues/new) if there's a display driver
|
||||
that should be added to this list.
|
||||
|
||||
Note that some drivers may not support the latest version of embedded-graphics.
|
||||
|
||||
* [embedded-graphics-web-simulator](https://crates.io/crates/embedded-graphics-web-simulator): Simulated display in your browser via Webassembly
|
||||
* [epd-waveshare](https://crates.io/crates/epd-waveshare) Driver for various ePaper displays (EPD) from Waveshare
|
||||
* [hub75](https://crates.io/crates/hub75): A rust driver for hub75 rgb matrix displays
|
||||
* [ili9341](https://crates.io/crates/ili9341): A platform agnostic driver to interface with the ILI9341 (and ILI9340C) TFT LCD display
|
||||
* [ls010b7dh01](https://crates.io/crates/ls010b7dh01): A platform agnostic driver for the LS010B7DH01 memory LCD display
|
||||
* [push2_display](https://crates.io/crates/push2_display): Ableton Push2 embedded-graphics display driver
|
||||
* [sh1106](https://crates.io/crates/sh1106): I2C driver for the SH1106 OLED display
|
||||
* [smart-leds-matrix](https://github.com/smart-leds-rs/smart-leds-matrix): Driver for smart LED (like ws2812) based LED matrixes.
|
||||
* [ssd1306](https://crates.io/crates/ssd1306): I2C and SPI (4 wire) driver for the SSD1306 OLED display
|
||||
* [ssd1309](https://crates.io/crates/ssd1309): I2C/SPI driver for the SSD1309 OLED display written in 100% Rust.
|
||||
* [ssd1322](https://crates.io/crates/ssd1322): Pure Rust driver for the SSD1322 OLED display chip
|
||||
* [ssd1331](https://crates.io/crates/ssd1331): SPI (4 wire) driver for the SSD1331 OLED display
|
||||
* [ssd1351](https://crates.io/crates/ssd1351): SSD1351 driver
|
||||
* [ssd1675](https://crates.io/crates/ssd1675): Rust driver for the Solomon Systech SSD1675 e-Paper display (EPD) controller
|
||||
* [st7565](https://crates.io/crates/st7565): SPI driver for ST7565 based displays
|
||||
* [st7735-lcd](https://crates.io/crates/st7735-lcd): Rust library for displays using the ST7735 driver
|
||||
* [st7789](https://crates.io/crates/st7789): A Rust driver library for ST7789 displays
|
||||
* [st7920](https://crates.io/crates/st7920): ST7920 LCD driver in Rust
|
||||
* [gc9a01-rs](https://crates.io/crates/gc9a01-rs): SPI 4-wire driver for the Gc9a01 display driver
|
||||
|
||||
## Simulator
|
||||
|
||||
Embedded graphics comes with a [simulator]! The simulator can be used to test and debug
|
||||
embedded graphics code, or produce examples and interactive demos to show off embedded graphics
|
||||
features.
|
||||
|
||||

|
||||
|
||||
Take a look at the [examples repository](https://github.com/embedded-graphics/examples) to see what
|
||||
embedded-graphics can do, and how it might look on a display. You can run the examples like
|
||||
this:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/embedded-graphics/examples.git
|
||||
cd examples/eg-0.7
|
||||
|
||||
cargo run --example hello-world
|
||||
```
|
||||
|
||||
## Crate features
|
||||
|
||||
Additional features can be enabled by adding the following features to your `Cargo.toml`.
|
||||
|
||||
* `nalgebra_support` - use the [Nalgebra](https://crates.io/crates/nalgebra) crate with `no_std`
|
||||
support to enable conversions from `nalgebra::Vector2` to [`Point`] and [`Size`].
|
||||
|
||||
* `fixed_point` - use fixed point arithmetic instead of floating point for all trigonometric
|
||||
calculation.
|
||||
|
||||
* `defmt` - provide implementations of `defmt::Format` for all types where possible. [`defmt`]
|
||||
is a library for logging that moves as much work as possible over to a separate logging
|
||||
machine, making it especially suited to low-resource MCUs. Note that `defmt` might not work with
|
||||
older versions of rustc that are otherwise supported by embedded-graphics.
|
||||
|
||||
## Migrating from older versions
|
||||
|
||||
* [Migration guide from 0.5 to 0.6](https://github.com/embedded-graphics/embedded-graphics/blob/master/MIGRATING-0.5-0.6.md).
|
||||
* [Migration guide from 0.6 to 0.7](https://github.com/embedded-graphics/embedded-graphics/blob/master/MIGRATING-0.6-0.7.md).
|
||||
|
||||
## Implementing `embedded_graphics` support for a display driver
|
||||
|
||||
To add support for embedded-graphics to a display driver, [`DrawTarget`] from
|
||||
[`embedded-graphics-core`] must be implemented. This allows all embedded-graphics items to be
|
||||
rendered by the display. See the [`DrawTarget`] documentation for implementation details.
|
||||
|
||||
## Examples
|
||||
|
||||
### Drawing examples
|
||||
|
||||
[][examples]
|
||||
|
||||
Example usage of drawing primitives, text and images with embedded-graphics can be found [here][examples].
|
||||
|
||||
### Shapes and text
|
||||
|
||||
The following example draws some shapes and text to a [`MockDisplay`] in place of target
|
||||
hardware. The [simulator](https://docs.rs/embedded-graphics-simulator/) can also be used for
|
||||
debugging, development or if hardware is not available.
|
||||
|
||||
```rust
|
||||
use embedded_graphics::{
|
||||
mono_font::{ascii::FONT_6X10, MonoTextStyle},
|
||||
pixelcolor::BinaryColor,
|
||||
prelude::*,
|
||||
primitives::{
|
||||
Circle, PrimitiveStyle, PrimitiveStyleBuilder, Rectangle, StrokeAlignment, Triangle,
|
||||
},
|
||||
text::{Alignment, Text},
|
||||
mock_display::MockDisplay,
|
||||
};
|
||||
|
||||
fn main() -> Result<(), std::convert::Infallible> {
|
||||
// Create a new mock display
|
||||
let mut display: MockDisplay<BinaryColor> = MockDisplay::new();
|
||||
|
||||
// Create styles used by the drawing operations.
|
||||
let thin_stroke = PrimitiveStyle::with_stroke(BinaryColor::On, 1);
|
||||
let thick_stroke = PrimitiveStyle::with_stroke(BinaryColor::On, 3);
|
||||
let border_stroke = PrimitiveStyleBuilder::new()
|
||||
.stroke_color(BinaryColor::On)
|
||||
.stroke_width(3)
|
||||
.stroke_alignment(StrokeAlignment::Inside)
|
||||
.build();
|
||||
let fill = PrimitiveStyle::with_fill(BinaryColor::On);
|
||||
let character_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On);
|
||||
|
||||
let yoffset = 10;
|
||||
|
||||
// Draw a 3px wide outline around the display.
|
||||
display
|
||||
.bounding_box()
|
||||
.into_styled(border_stroke)
|
||||
.draw(&mut display)?;
|
||||
|
||||
// Draw a triangle.
|
||||
Triangle::new(
|
||||
Point::new(16, 16 + yoffset),
|
||||
Point::new(16 + 16, 16 + yoffset),
|
||||
Point::new(16 + 8, yoffset),
|
||||
)
|
||||
.into_styled(thin_stroke)
|
||||
.draw(&mut display)?;
|
||||
|
||||
// Draw a filled square
|
||||
Rectangle::new(Point::new(52, yoffset), Size::new(16, 16))
|
||||
.into_styled(fill)
|
||||
.draw(&mut display)?;
|
||||
|
||||
// Draw a circle with a 3px wide stroke.
|
||||
Circle::new(Point::new(88, yoffset), 17)
|
||||
.into_styled(thick_stroke)
|
||||
.draw(&mut display)?;
|
||||
|
||||
// Draw centered text.
|
||||
let text = "embedded-graphics";
|
||||
Text::with_alignment(
|
||||
text,
|
||||
display.bounding_box().center() + Point::new(0, 15),
|
||||
character_style,
|
||||
Alignment::Center,
|
||||
)
|
||||
.draw(&mut display)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
This example is also included in the [examples](https://github.com/embedded-graphics/examples) repository and
|
||||
can be run using `cargo run --example hello-world`. It produces this output:
|
||||
|
||||

|
||||
|
||||
Additional examples can be found in the [examples](https://github.com/embedded-graphics/examples) repository.
|
||||
|
||||
[`Circle`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/circle/struct.Circle.html
|
||||
[`MockDisplay`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/mock_display/struct.MockDisplay.html
|
||||
[`Point`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/geometry/struct.Point.html
|
||||
[`Size`]: https://docs.rs/embedded-graphics/latest/embedded_graphics/geometry/struct.Size.html
|
||||
[Raw data images]: https://docs.rs/embedded-graphics/latest/embedded_graphics/image/struct.ImageRaw.html
|
||||
[Primitives]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/index.html
|
||||
[Lines]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/line/struct.Line.html
|
||||
[Rectangles (and squares)]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/rectangle/struct.Rectangle.html
|
||||
[Circles]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/circle/struct.Circle.html
|
||||
[Ellipses]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/ellipse/struct.Ellipse.html
|
||||
[Arcs]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/arc/struct.Arc.html
|
||||
[Sectors]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/sector/struct.Sector.html
|
||||
[Triangles]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/triangle/struct.Triangle.html
|
||||
[Polylines]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/polyline/struct.Polyline.html
|
||||
[Rounded rectangles]: https://docs.rs/embedded-graphics/latest/embedded_graphics/primitives/rounded_rectangle/struct.RoundedRectangle.html
|
||||
[Text]: https://docs.rs/embedded-graphics/latest/embedded_graphics/text/index.html
|
||||
[Monospaced fonts]: https://docs.rs/embedded-graphics/latest/embedded_graphics/mono_font/index.html
|
||||
[examples]: https://docs.rs/embedded-graphics/latest/embedded_graphics/examples/index.html
|
||||
|
||||
[`DrawTarget`]: https://docs.rs/embedded-graphics-core/latest/embedded_graphics_core/draw_target/trait.DrawTarget.html
|
||||
[`embedded-graphics-core`]: https://docs.rs/embedded-graphics-core/
|
||||
[simulator]: https://github.com/embedded-graphics/simulator
|
||||
[simulator examples]: https://github.com/embedded-graphics/simulator/tree/master/examples
|
||||
[`defmt`]: https://defmt.ferrous-systems.com/
|
||||
|
||||
## Minimum supported Rust version
|
||||
|
||||
The minimum supported Rust version for embedded-graphics is `1.71.1` or greater.
|
||||
Ensure you have the correct version of Rust installed, preferably through <https://rustup.rs>.
|
||||
|
||||
## Development setup
|
||||
|
||||
Please see the [development setup guide](https://github.com/embedded-graphics/embedded-graphics/blob/master/doc/development-setup.md).
|
||||
|
||||
## License
|
||||
|
||||
Licensed under either of
|
||||
|
||||
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||
http://www.apache.org/licenses/LICENSE-2.0)
|
||||
- MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
### Contribution
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the
|
||||
work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
|
||||
additional terms or conditions.
|
||||
Reference in new issue
Block a user