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>
65 lines
1.2 KiB
Rust
65 lines
1.2 KiB
Rust
#![allow(clippy::extra_unused_type_parameters)]
|
|
|
|
use std::io;
|
|
use thiserror::Error;
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub struct ErrorStruct {
|
|
#[from]
|
|
source: io::Error,
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub struct ErrorStructOptional {
|
|
#[from]
|
|
source: Option<io::Error>,
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub struct ErrorTuple(#[from] io::Error);
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub struct ErrorTupleOptional(#[from] Option<io::Error>);
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub enum ErrorEnum {
|
|
Test {
|
|
#[from]
|
|
source: io::Error,
|
|
},
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub enum ErrorEnumOptional {
|
|
Test {
|
|
#[from]
|
|
source: Option<io::Error>,
|
|
},
|
|
}
|
|
|
|
#[derive(Error, Debug)]
|
|
#[error("...")]
|
|
pub enum Many {
|
|
Any(#[from] anyhow::Error),
|
|
Io(#[from] io::Error),
|
|
}
|
|
|
|
fn assert_impl<T: From<io::Error>>() {}
|
|
|
|
#[test]
|
|
fn test_from() {
|
|
assert_impl::<ErrorStruct>();
|
|
assert_impl::<ErrorStructOptional>();
|
|
assert_impl::<ErrorTuple>();
|
|
assert_impl::<ErrorTupleOptional>();
|
|
assert_impl::<ErrorEnum>();
|
|
assert_impl::<ErrorEnumOptional>();
|
|
assert_impl::<Many>();
|
|
}
|