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
Vendored
+102
@@ -0,0 +1,102 @@
|
||||
# enum-as-inner
|
||||
|
||||
A deriving proc-macro for generating functions to automatically give access to the inner members of enum.
|
||||
|
||||
## Basic unnamed field case
|
||||
|
||||
The basic case is meant for single item enums, like:
|
||||
|
||||
```rust
|
||||
use enum_as_inner::EnumAsInner;
|
||||
|
||||
#[derive(Debug, EnumAsInner)]
|
||||
enum OneEnum {
|
||||
One(u32),
|
||||
}
|
||||
```
|
||||
|
||||
where the inner item can be retrieved with the `as_*()`/`as_*_mut()` or with the `into_*()` functions:
|
||||
|
||||
```rust
|
||||
let one = OneEnum::One(1);
|
||||
|
||||
assert_eq!(*one.as_one().unwrap(), 1);
|
||||
assert_eq!(one.into_one().unwrap(), 1);
|
||||
|
||||
let mut one = OneEnum::One(2);
|
||||
|
||||
assert_eq!(*one.as_one().unwrap(), 1);
|
||||
assert_eq!(*one.as_one_mut().unwrap(), 1);
|
||||
assert_eq!(one.into_one().unwrap(), 1);
|
||||
```
|
||||
|
||||
where the result is either a reference for inner items or a tuple containing the inner items.
|
||||
|
||||
## Unit case
|
||||
|
||||
This will return true if enum's variant matches the expected type
|
||||
|
||||
```rust
|
||||
use enum_as_inner::EnumAsInner;
|
||||
|
||||
#[derive(EnumAsInner)]
|
||||
enum UnitVariants {
|
||||
Zero,
|
||||
One,
|
||||
Two,
|
||||
}
|
||||
|
||||
let unit = UnitVariants::Two;
|
||||
|
||||
assert!(unit.is_two());
|
||||
```
|
||||
|
||||
## Mutliple, unnamed field case
|
||||
|
||||
This will return a tuple of the inner types:
|
||||
|
||||
```rust
|
||||
use enum_as_inner::EnumAsInner;
|
||||
|
||||
#[derive(Debug, EnumAsInner)]
|
||||
enum ManyVariants {
|
||||
One(u32),
|
||||
Two(u32, i32),
|
||||
Three(bool, u32, i64),
|
||||
}
|
||||
```
|
||||
|
||||
And can be accessed like:
|
||||
|
||||
```rust
|
||||
let mut many = ManyVariants::Three(true, 1, 2);
|
||||
|
||||
assert_eq!(many.as_three().unwrap(), (&true, &1_u32, &2_i64));
|
||||
assert_eq!(many.as_three_mut().unwrap(), (&mut true, &mut 1_u32, &mut 2_i64));
|
||||
assert_eq!(many.into_three().unwrap(), (true, 1_u32, 2_i64));
|
||||
```
|
||||
|
||||
## Multiple, named field case
|
||||
|
||||
This will return a tuple of the inner types, like the unnamed option:
|
||||
|
||||
```rust
|
||||
use enum_as_inner::EnumAsInner;
|
||||
|
||||
#[derive(Debug, EnumAsInner)]
|
||||
enum ManyVariants {
|
||||
One{ one: u32 },
|
||||
Two{ one: u32, two: i32 },
|
||||
Three{ one: bool, two: u32, three: i64 },
|
||||
}
|
||||
```
|
||||
|
||||
And can be accessed like:
|
||||
|
||||
```rust
|
||||
let mut many = ManyVariants::Three{ one: true, two: 1, three: 2 };
|
||||
|
||||
assert_eq!(many.as_three().unwrap(), (&true, &1_u32, &2_i64));
|
||||
assert_eq!(many.as_three_mut().unwrap(), (&mut true, &mut 1_u32, &mut 2_i64));
|
||||
assert_eq!(many.into_three().unwrap(), (true, 1_u32, 2_i64));
|
||||
```
|
||||
Reference in new issue
Block a user