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
+52
@@ -0,0 +1,52 @@
|
||||
//! Just like [`Cell`] but with [volatile] read / write operations
|
||||
//!
|
||||
//! [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html
|
||||
//! [volatile]: https://doc.rust-lang.org/std/ptr/fn.read_volatile.html
|
||||
|
||||
#![deny(missing_docs)]
|
||||
#![deny(warnings)]
|
||||
#![no_std]
|
||||
|
||||
use core::cell::UnsafeCell;
|
||||
use core::ptr;
|
||||
|
||||
/// Just like [`Cell`] but with [volatile] read / write operations
|
||||
///
|
||||
/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html
|
||||
/// [volatile]: https://doc.rust-lang.org/std/ptr/fn.read_volatile.html
|
||||
#[repr(transparent)]
|
||||
pub struct VolatileCell<T> {
|
||||
value: UnsafeCell<T>,
|
||||
}
|
||||
|
||||
impl<T> VolatileCell<T> {
|
||||
/// Creates a new `VolatileCell` containing the given value
|
||||
pub const fn new(value: T) -> Self {
|
||||
VolatileCell { value: UnsafeCell::new(value) }
|
||||
}
|
||||
|
||||
/// Returns a copy of the contained value
|
||||
#[inline(always)]
|
||||
pub fn get(&self) -> T
|
||||
where T: Copy
|
||||
{
|
||||
unsafe { ptr::read_volatile(self.value.get()) }
|
||||
}
|
||||
|
||||
/// Sets the contained value
|
||||
#[inline(always)]
|
||||
pub fn set(&self, value: T)
|
||||
where T: Copy
|
||||
{
|
||||
unsafe { ptr::write_volatile(self.value.get(), value) }
|
||||
}
|
||||
|
||||
/// Returns a raw pointer to the underlying data in the cell
|
||||
#[inline(always)]
|
||||
pub fn as_ptr(&self) -> *mut T {
|
||||
self.value.get()
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE implicit because of `UnsafeCell`
|
||||
// unsafe impl<T> !Sync for VolatileCell<T> {}
|
||||
Reference in new issue
Block a user