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
+101
@@ -0,0 +1,101 @@
|
||||
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
|
||||
#![allow(dead_code)]
|
||||
|
||||
#[macro_use]
|
||||
mod auxiliary;
|
||||
|
||||
pub mod default {
|
||||
use std::marker::PhantomPinned;
|
||||
|
||||
use pin_project_lite::pin_project;
|
||||
|
||||
struct Inner<T> {
|
||||
f: T,
|
||||
}
|
||||
|
||||
assert_unpin!(Inner<()>);
|
||||
assert_not_unpin!(Inner<PhantomPinned>);
|
||||
|
||||
pin_project! {
|
||||
struct Struct<T, U> {
|
||||
#[pin]
|
||||
f1: Inner<T>,
|
||||
f2: U,
|
||||
}
|
||||
}
|
||||
|
||||
assert_unpin!(Struct<(), ()>);
|
||||
assert_unpin!(Struct<(), PhantomPinned>);
|
||||
assert_not_unpin!(Struct<PhantomPinned, ()>);
|
||||
assert_not_unpin!(Struct<PhantomPinned, PhantomPinned>);
|
||||
|
||||
pin_project! {
|
||||
#[project = EnumProj]
|
||||
#[project_ref = EnumProjRef]
|
||||
enum Enum<T, U> {
|
||||
V1 {
|
||||
#[pin]
|
||||
f1: Inner<T>,
|
||||
f2: U,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
assert_unpin!(Enum<(), ()>);
|
||||
assert_unpin!(Enum<(), PhantomPinned>);
|
||||
assert_not_unpin!(Enum<PhantomPinned, ()>);
|
||||
assert_not_unpin!(Enum<PhantomPinned, PhantomPinned>);
|
||||
|
||||
pin_project! {
|
||||
#[project(!Unpin)]
|
||||
enum NotUnpinEnum<T, U> {
|
||||
V1 {
|
||||
#[pin] f1: Inner<T>,
|
||||
f2: U,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert_not_unpin!(NotUnpinEnum<(), ()>);
|
||||
|
||||
pin_project! {
|
||||
struct TrivialBounds {
|
||||
#[pin]
|
||||
f: PhantomPinned,
|
||||
}
|
||||
}
|
||||
|
||||
assert_not_unpin!(TrivialBounds);
|
||||
|
||||
pin_project! {
|
||||
struct PinRef<'a, T, U> {
|
||||
#[pin]
|
||||
f1: &'a mut Inner<T>,
|
||||
f2: U,
|
||||
}
|
||||
}
|
||||
|
||||
assert_unpin!(PinRef<'_, PhantomPinned, PhantomPinned>);
|
||||
|
||||
pin_project! {
|
||||
#[project(!Unpin)]
|
||||
struct NotUnpin<U> {
|
||||
#[pin]
|
||||
u: U
|
||||
}
|
||||
}
|
||||
|
||||
assert_not_unpin!(NotUnpin<()>);
|
||||
|
||||
pin_project! {
|
||||
#[project(!Unpin)]
|
||||
struct NotUnpinRef<'a, T, U> {
|
||||
#[pin]
|
||||
f1: &'a mut Inner<T>,
|
||||
f2: U
|
||||
}
|
||||
}
|
||||
|
||||
assert_not_unpin!(NotUnpinRef<'_, (), ()>);
|
||||
}
|
||||
Reference in new issue
Block a user