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

+118
View File
@@ -0,0 +1,118 @@
#![allow(non_snake_case)]
pub mod instances;
pub mod peripherals;
pub mod stm32f429;
pub use ral_registers as register;
pub use ral_registers::{modify_reg, read_reg, write_reg};
pub mod otg_global {
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_global::OTG_FS_GLOBAL as OTG_GLOBAL;
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_global::*;
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_global::OTG_HS_GLOBAL as OTG_GLOBAL;
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_global::*;
}
pub mod otg_device {
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_device::OTG_FS_DEVICE as OTG_DEVICE;
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_device::*;
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_device::OTG_HS_DEVICE as OTG_DEVICE;
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_device::*;
}
pub mod otg_pwrclk {
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_s_pwrclk::OTG_FS_PWRCLK as OTG_PWRCLK;
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_s_pwrclk::OTG_HS_PWRCLK as OTG_PWRCLK;
pub use super::stm32f429::otg_s_pwrclk::*;
}
pub mod otg_global_dieptxfx {
use super::register::RWRegister;
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_global::DIEPTXF1 as DIEPTXFx;
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_fs_global::DIEPTXF1 as DIEPTXFx;
pub struct RegisterBlock {
pub DIEPTXFx: RWRegister<u32>,
}
}
pub mod endpoint_in {
use super::register::RWRegister;
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_device::{
DIEPCTL1 as DIEPCTL, DIEPINT1 as DIEPINT, DIEPTSIZ1 as DIEPTSIZ, DTXFSTS1 as DTXFSTS,
};
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_device::{
DIEPCTL1 as DIEPCTL, DIEPINT1 as DIEPINT, DIEPTSIZ1 as DIEPTSIZ, DTXFSTS1 as DTXFSTS,
};
pub struct RegisterBlock {
pub DIEPCTL: RWRegister<u32>,
_reserved0: u32,
pub DIEPINT: RWRegister<u32>,
_reserved1: u32,
pub DIEPTSIZ: RWRegister<u32>,
_reserved2: u32,
pub DTXFSTS: RWRegister<u32>,
_reserved3: u32,
}
}
pub mod endpoint0_out {
use super::register::RWRegister;
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_device::{DOEPCTL0, DOEPINT0, DOEPTSIZ0};
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_device::{DOEPCTL0, DOEPINT0, DOEPTSIZ0};
pub struct RegisterBlock {
pub DOEPCTL0: RWRegister<u32>,
_reserved0: u32,
pub DOEPINT0: RWRegister<u32>,
_reserved1: u32,
pub DOEPTSIZ0: RWRegister<u32>,
_reserved2: [u32; 3],
}
}
pub mod endpoint_out {
use super::register::RWRegister;
#[cfg(feature = "fs")]
pub use super::stm32f429::otg_fs_device::{
DOEPCTL1 as DOEPCTL, DOEPINT1 as DOEPINT, DOEPTSIZ1 as DOEPTSIZ,
};
#[cfg(feature = "hs")]
pub use super::stm32f429::otg_hs_device::{
DOEPCTL1 as DOEPCTL, DOEPINT1 as DOEPINT, DOEPTSIZ1 as DOEPTSIZ,
};
pub struct RegisterBlock {
pub DOEPCTL: RWRegister<u32>,
_reserved0: u32,
pub DOEPINT: RWRegister<u32>,
_reserved1: u32,
pub DOEPTSIZ: RWRegister<u32>,
_reserved2: [u32; 3],
}
}