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
+110
@@ -0,0 +1,110 @@
|
||||
//! The `join` macro.
|
||||
|
||||
macro_rules! document_join_macro {
|
||||
($join:item $try_join:item) => {
|
||||
/// Polls multiple futures simultaneously, returning a tuple
|
||||
/// of all results once complete.
|
||||
///
|
||||
/// While `join!(a, b)` is similar to `(a.await, b.await)`,
|
||||
/// `join!` polls both futures concurrently and therefore is more efficient.
|
||||
///
|
||||
/// This macro is only usable inside of async functions, closures, and blocks.
|
||||
/// It is also gated behind the `async-await` feature of this library, which is
|
||||
/// activated by default.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// # futures::executor::block_on(async {
|
||||
/// use futures::join;
|
||||
///
|
||||
/// let a = async { 1 };
|
||||
/// let b = async { 2 };
|
||||
/// assert_eq!(join!(a, b), (1, 2));
|
||||
///
|
||||
/// // `join!` is variadic, so you can pass any number of futures
|
||||
/// let c = async { 3 };
|
||||
/// let d = async { 4 };
|
||||
/// let e = async { 5 };
|
||||
/// assert_eq!(join!(c, d, e), (3, 4, 5));
|
||||
/// # });
|
||||
/// ```
|
||||
$join
|
||||
|
||||
/// Polls multiple futures simultaneously, resolving to a [`Result`] containing
|
||||
/// either a tuple of the successful outputs or an error.
|
||||
///
|
||||
/// `try_join!` is similar to [`join!`], but completes immediately if any of
|
||||
/// the futures return an error.
|
||||
///
|
||||
/// This macro is only usable inside of async functions, closures, and blocks.
|
||||
/// It is also gated behind the `async-await` feature of this library, which is
|
||||
/// activated by default.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// When used on multiple futures that return `Ok`, `try_join!` will return
|
||||
/// `Ok` of a tuple of the values:
|
||||
///
|
||||
/// ```
|
||||
/// # futures::executor::block_on(async {
|
||||
/// use futures::try_join;
|
||||
///
|
||||
/// let a = async { Ok::<i32, i32>(1) };
|
||||
/// let b = async { Ok::<i32, i32>(2) };
|
||||
/// assert_eq!(try_join!(a, b), Ok((1, 2)));
|
||||
///
|
||||
/// // `try_join!` is variadic, so you can pass any number of futures
|
||||
/// let c = async { Ok::<i32, i32>(3) };
|
||||
/// let d = async { Ok::<i32, i32>(4) };
|
||||
/// let e = async { Ok::<i32, i32>(5) };
|
||||
/// assert_eq!(try_join!(c, d, e), Ok((3, 4, 5)));
|
||||
/// # });
|
||||
/// ```
|
||||
///
|
||||
/// If one of the futures resolves to an error, `try_join!` will return
|
||||
/// that error:
|
||||
///
|
||||
/// ```
|
||||
/// # futures::executor::block_on(async {
|
||||
/// use futures::try_join;
|
||||
///
|
||||
/// let a = async { Ok::<i32, i32>(1) };
|
||||
/// let b = async { Err::<u64, i32>(2) };
|
||||
///
|
||||
/// assert_eq!(try_join!(a, b), Err(2));
|
||||
/// # });
|
||||
/// ```
|
||||
$try_join
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unreachable_pub)]
|
||||
#[doc(hidden)]
|
||||
pub use futures_macro::join_internal;
|
||||
|
||||
#[allow(unreachable_pub)]
|
||||
#[doc(hidden)]
|
||||
pub use futures_macro::try_join_internal;
|
||||
|
||||
document_join_macro! {
|
||||
#[macro_export]
|
||||
macro_rules! join {
|
||||
($($tokens:tt)*) => {{
|
||||
use $crate::__private as __futures_crate;
|
||||
$crate::join_internal! {
|
||||
$( $tokens )*
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! try_join {
|
||||
($($tokens:tt)*) => {{
|
||||
use $crate::__private as __futures_crate;
|
||||
$crate::try_join_internal! {
|
||||
$( $tokens )*
|
||||
}
|
||||
}}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user