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
+81
@@ -0,0 +1,81 @@
|
||||
//! A low-level interface for writing out TOML
|
||||
//!
|
||||
//! Considerations when serializing arbitrary data:
|
||||
//! - Verify the implementation with [`toml-test-harness`](https://docs.rs/toml-test-harness)
|
||||
//! - Be sure to group keys under a table before writing another table
|
||||
//! - Watch for extra trailing newlines and leading newlines, both when starting with top-level
|
||||
//! keys or a table
|
||||
//! - When serializing an array-of-tables, be sure to verify that all elements of the array
|
||||
//! serialize as tables
|
||||
//! - Standard tables and inline tables may need separate implementations of corner cases,
|
||||
//! requiring verifying them both
|
||||
//!
|
||||
//! When serializing Rust data structures
|
||||
//! - `Option`: Skip key-value pairs with a value of `None`, otherwise error when seeing `None`
|
||||
//! - When skipping key-value pairs, be careful that a deeply nested `None` doesn't get skipped
|
||||
//! - Scalars and arrays are unsupported as top-level data types
|
||||
//! - Tuples and tuple variants seriallize as arrays
|
||||
//! - Structs, struct variants, and maps serialize as tables
|
||||
//! - Newtype variants serialize as to the inner type
|
||||
//! - Unit variants serialize to a string
|
||||
//! - Unit and unit structs don't have a clear meaning in TOML
|
||||
//!
|
||||
//! # Example
|
||||
//!
|
||||
//! ```rust
|
||||
//! use toml_write::TomlWrite as _;
|
||||
//!
|
||||
//! # fn main() -> std::fmt::Result {
|
||||
//! let mut output = String::new();
|
||||
//! output.newline()?;
|
||||
//! output.open_table_header()?;
|
||||
//! output.key("table")?;
|
||||
//! output.close_table_header()?;
|
||||
//! output.newline()?;
|
||||
//!
|
||||
//! output.key("key")?;
|
||||
//! output.space()?;
|
||||
//! output.keyval_sep()?;
|
||||
//! output.space()?;
|
||||
//! output.value("value")?;
|
||||
//! output.newline()?;
|
||||
//!
|
||||
//! assert_eq!(output, r#"
|
||||
//! [table]
|
||||
//! key = "value"
|
||||
//! "#);
|
||||
//! # Ok(())
|
||||
//! # }
|
||||
//! ```
|
||||
|
||||
#![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
|
||||
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
||||
#![forbid(unsafe_code)]
|
||||
#![warn(clippy::std_instead_of_core)]
|
||||
#![warn(clippy::std_instead_of_alloc)]
|
||||
#![warn(clippy::print_stderr)]
|
||||
#![warn(clippy::print_stdout)]
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
extern crate alloc;
|
||||
|
||||
mod key;
|
||||
mod string;
|
||||
mod value;
|
||||
mod write;
|
||||
|
||||
#[cfg(feature = "alloc")]
|
||||
pub use key::ToTomlKey;
|
||||
pub use key::WriteTomlKey;
|
||||
pub use string::TomlKey;
|
||||
pub use string::TomlKeyBuilder;
|
||||
pub use string::TomlString;
|
||||
pub use string::TomlStringBuilder;
|
||||
#[cfg(feature = "alloc")]
|
||||
pub use value::ToTomlValue;
|
||||
pub use value::WriteTomlValue;
|
||||
pub use write::TomlWrite;
|
||||
|
||||
#[doc = include_str!("../README.md")]
|
||||
#[cfg(doctest)]
|
||||
pub struct ReadmeDoctests;
|
||||
Reference in new issue
Block a user