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
@@ -0,0 +1,20 @@
|
||||
#[maybe_async_cfg::maybe(
|
||||
sync(feature = "is_sync"),
|
||||
)]
|
||||
async fn async_fn() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
#[maybe_async_cfg::maybe(
|
||||
idents(async_fn(fn)),
|
||||
sync(feature = "is_sync"),
|
||||
async(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn test_async_fn() {
|
||||
let res = async_fn().await;
|
||||
assert_eq!(res, true);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
error[E0425]: cannot find function `async_fn_async` in this scope
|
||||
--> tests/ui/test_fail/01-empty-test.rs:14:15
|
||||
|
|
||||
14 | let res = async_fn().await;
|
||||
| ^^^^^^^^ not found in this scope
|
||||
@@ -0,0 +1,21 @@
|
||||
#[maybe_async_cfg::maybe(
|
||||
sync(feature = "is_sync"),
|
||||
unknown(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn async_fn() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
#[maybe_async_cfg::maybe(
|
||||
idents(async_fn(fn)),
|
||||
sync(feature = "is_sync"),
|
||||
async(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn test_async_fn() {
|
||||
let res = async_fn().await;
|
||||
assert_eq!(res, true);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
error[E0425]: cannot find function `async_fn_async` in this scope
|
||||
--> tests/ui/test_fail/02-unknown-path.rs:15:15
|
||||
|
|
||||
15 | let res = async_fn().await;
|
||||
| ^^^^^^^^ not found in this scope
|
||||
@@ -0,0 +1,23 @@
|
||||
#[maybe_async_cfg::maybe(
|
||||
sync(feature = "is_sync"),
|
||||
async(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn async_fn() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
//#[maybe_async::test(feature="is_sync", async(feature="async", async_std::test, added))]
|
||||
#[maybe_async_cfg::maybe(
|
||||
idents(async_fn(fn)),
|
||||
sync(feature = "is_sync"),
|
||||
async(not(feature = "is_sync")),
|
||||
async(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn test_async_fn() {
|
||||
let res = async_fn().await;
|
||||
assert_eq!(res, true);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
error[E0428]: the name `test_async_fn_async` is defined multiple times
|
||||
--> tests/ui/test_fail/03-async-gt2.rs:16:1
|
||||
|
|
||||
16 | async fn test_async_fn() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| `test_async_fn_async` redefined here
|
||||
| previous definition of the value `test_async_fn_async` here
|
||||
|
|
||||
= note: `test_async_fn_async` must be defined only once in the value namespace of this module
|
||||
@@ -0,0 +1,23 @@
|
||||
#[maybe_async_cfg::maybe(
|
||||
sync(feature = "is_sync"),
|
||||
async(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn async_fn() -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
// bad sync condition
|
||||
//#[maybe_async::test(unknown(feature="async", async_std::test))]
|
||||
#[maybe_async_cfg::maybe(
|
||||
idents(async_fn(fn)),
|
||||
sync(unknown = "is_sync"),
|
||||
async(not(feature = "is_sync")),
|
||||
)]
|
||||
async fn test_async_fn() {
|
||||
let res = async_fn().await;
|
||||
assert_eq!(res, true);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
error: Wrong name for name-value pair: unknown
|
||||
--> tests/ui/test_fail/04-bad-sync-cond.rs:13:10
|
||||
|
|
||||
13 | sync(unknown = "is_sync"),
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
Reference in new issue
Block a user