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>
50 lines
1.9 KiB
Rust
50 lines
1.9 KiB
Rust
use alloc::sync::Arc;
|
|
|
|
/// A way of waking up a specific task.
|
|
///
|
|
/// By implementing this trait, types that are expected to be wrapped in an `Arc`
|
|
/// can be converted into [`Waker`] objects.
|
|
/// Those Wakers can be used to signal executors that a task it owns
|
|
/// is ready to be `poll`ed again.
|
|
///
|
|
/// Currently, there are two ways to convert `ArcWake` into [`Waker`]:
|
|
///
|
|
/// * [`waker`](super::waker()) converts `Arc<impl ArcWake>` into [`Waker`].
|
|
/// * [`waker_ref`](super::waker_ref()) converts `&Arc<impl ArcWake>` into [`WakerRef`] that
|
|
/// provides access to a [`&Waker`][`Waker`].
|
|
///
|
|
/// [`Waker`]: std::task::Waker
|
|
/// [`WakerRef`]: super::WakerRef
|
|
// Note: Send + Sync required because `Arc<T>` doesn't automatically imply
|
|
// those bounds, but `Waker` implements them.
|
|
pub trait ArcWake: Send + Sync {
|
|
/// Indicates that the associated task is ready to make progress and should
|
|
/// be `poll`ed.
|
|
///
|
|
/// This function can be called from an arbitrary thread, including threads which
|
|
/// did not create the `ArcWake` based [`Waker`].
|
|
///
|
|
/// Executors generally maintain a queue of "ready" tasks; `wake` should place
|
|
/// the associated task onto this queue.
|
|
///
|
|
/// [`Waker`]: std::task::Waker
|
|
fn wake(self: Arc<Self>) {
|
|
Self::wake_by_ref(&self)
|
|
}
|
|
|
|
/// Indicates that the associated task is ready to make progress and should
|
|
/// be `poll`ed.
|
|
///
|
|
/// This function can be called from an arbitrary thread, including threads which
|
|
/// did not create the `ArcWake` based [`Waker`].
|
|
///
|
|
/// Executors generally maintain a queue of "ready" tasks; `wake_by_ref` should place
|
|
/// the associated task onto this queue.
|
|
///
|
|
/// This function is similar to [`wake`](ArcWake::wake), but must not consume the provided data
|
|
/// pointer.
|
|
///
|
|
/// [`Waker`]: std::task::Waker
|
|
fn wake_by_ref(arc_self: &Arc<Self>);
|
|
}
|