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:
swaitsandClaude Opus 4.6 committed 2026-03-29 20:42:54 -06:00
1 parent 7064110293
commit 3102fc747a
17624 files changed
+4564928 -38

No files matched your search

@@ -0,0 +1,11 @@
use embassy_sync::lazy_lock::LazyLock;
fn main() {
let x = 128u8;
let x_ptr: *const u8 = core::ptr::addr_of!(x);
let closure_capturing_non_sync_variable = || unsafe { core::ptr::read(x_ptr) };
check_sync(LazyLock::new(closure_capturing_non_sync_variable));
}
fn check_sync<T: Sync>(_lazy_lock: T) {}
@@ -0,0 +1,24 @@
error[E0277]: `*const u8` cannot be shared between threads safely
--> tests/ui/sync_impl/lazy_lock_function.rs:8:16
|
6 | let closure_capturing_non_sync_variable = || unsafe { core::ptr::read(x_ptr) };
| -- within this `{closure@$DIR/tests/ui/sync_impl/lazy_lock_function.rs:6:47: 6:49}`
7 |
8 | check_sync(LazyLock::new(closure_capturing_non_sync_variable));
| ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `*const u8` cannot be shared between threads safely
| |
| required by a bound introduced by this call
|
= help: within `{closure@$DIR/tests/ui/sync_impl/lazy_lock_function.rs:6:47: 6:49}`, the trait `Sync` is not implemented for `*const u8`
= note: required because it appears within the type `&*const u8`
note: required because it's used within this closure
--> tests/ui/sync_impl/lazy_lock_function.rs:6:47
|
6 | let closure_capturing_non_sync_variable = || unsafe { core::ptr::read(x_ptr) };
| ^^
= note: required for `embassy_sync::lazy_lock::LazyLock<u8, {closure@$DIR/tests/ui/sync_impl/lazy_lock_function.rs:6:47: 6:49}>` to implement `Sync`
note: required by a bound in `check_sync`
--> tests/ui/sync_impl/lazy_lock_function.rs:11:18
|
11 | fn check_sync<T: Sync>(_lazy_lock: T) {}
| ^^^^ required by this bound in `check_sync`
@@ -0,0 +1,6 @@
use embassy_sync::lazy_lock::LazyLock;
// *mut u8 is not Sync, so LazyLock should not implement Sync for this type. This should fail to compile.
static GLOBAL: LazyLock<*mut u8> = LazyLock::new(|| core::ptr::null_mut());
fn main() {}
@@ -0,0 +1,9 @@
error[E0277]: `*mut u8` cannot be shared between threads safely
--> tests/ui/sync_impl/lazy_lock_type.rs:4:16
|
4 | static GLOBAL: LazyLock<*mut u8> = LazyLock::new(|| core::ptr::null_mut());
| ^^^^^^^^^^^^^^^^^ `*mut u8` cannot be shared between threads safely
|
= help: the trait `Sync` is not implemented for `*mut u8`
= note: required for `embassy_sync::lazy_lock::LazyLock<*mut u8>` to implement `Sync`
= note: shared static variables must have a type that implements `Sync`
+6
View File
@@ -0,0 +1,6 @@
use embassy_sync::once_lock::OnceLock;
// *mut u8 is not Sync, so OnceLock should not implement Sync for this type. This should fail to compile.
static GLOBAL: OnceLock<*mut u8> = OnceLock::new();
fn main() {}
@@ -0,0 +1,9 @@
error[E0277]: `*mut u8` cannot be shared between threads safely
--> tests/ui/sync_impl/once_lock.rs:4:16
|
4 | static GLOBAL: OnceLock<*mut u8> = OnceLock::new();
| ^^^^^^^^^^^^^^^^^ `*mut u8` cannot be shared between threads safely
|
= help: the trait `Sync` is not implemented for `*mut u8`
= note: required for `embassy_sync::once_lock::OnceLock<*mut u8>` to implement `Sync`
= note: shared static variables must have a type that implements `Sync`