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
+209
@@ -0,0 +1,209 @@
|
||||
//! INTERNAL; DO NOT USE. Please use the `defmt` crate to access the functionality implemented here
|
||||
|
||||
#![doc(html_logo_url = "https://knurling.ferrous-systems.com/knurling_logo_light_text.svg")]
|
||||
|
||||
use defmt_parser::Level;
|
||||
use proc_macro::TokenStream;
|
||||
use proc_macro2::TokenStream as TokenStream2;
|
||||
use proc_macro_error2::proc_macro_error;
|
||||
use quote::quote;
|
||||
|
||||
mod attributes;
|
||||
mod cargo;
|
||||
mod construct;
|
||||
mod consts;
|
||||
mod derives;
|
||||
mod function_like;
|
||||
mod items;
|
||||
|
||||
// NOTE some proc-macro functions have an `_` (underscore) suffix. This is intentional.
|
||||
// If left unsuffixed the procedural macros would shadow macros defined in `std` (like `assert`)
|
||||
// within the context of this entire crate, which leads to lots of confusion.
|
||||
|
||||
/* # Attributes */
|
||||
#[proc_macro_attribute]
|
||||
#[proc_macro_error]
|
||||
pub fn global_logger(args: TokenStream, item: TokenStream) -> TokenStream {
|
||||
attributes::global_logger::expand(args, item)
|
||||
}
|
||||
|
||||
#[proc_macro_attribute]
|
||||
#[proc_macro_error]
|
||||
pub fn panic_handler(args: TokenStream, item: TokenStream) -> TokenStream {
|
||||
attributes::panic_handler::expand(args, item)
|
||||
}
|
||||
|
||||
/* # Derives */
|
||||
#[proc_macro_derive(Format, attributes(defmt))]
|
||||
#[proc_macro_error]
|
||||
pub fn format(input: TokenStream) -> TokenStream {
|
||||
derives::format::expand(input)
|
||||
}
|
||||
|
||||
/* # Function-like */
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn assert_(args: TokenStream) -> TokenStream {
|
||||
function_like::assert_like::assert::expand(args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn assert_eq_(args: TokenStream) -> TokenStream {
|
||||
function_like::assert_binop::eq(args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn assert_ne_(args: TokenStream) -> TokenStream {
|
||||
function_like::assert_binop::ne(args)
|
||||
}
|
||||
|
||||
/* ## `debug_` variants */
|
||||
// NOTE these `debug_*` macros can be written using `macro_rules!` (that'd be simpler) but that
|
||||
// results in an incorrect source code location being reported: the location of the `macro_rules!`
|
||||
// statement is reported. Using a proc-macro results in the call site being reported, which is what
|
||||
// we want
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn debug_assert_(input: TokenStream) -> TokenStream {
|
||||
let assert = TokenStream2::from(assert_(input));
|
||||
quote!(if cfg!(debug_assertions) {
|
||||
#assert
|
||||
})
|
||||
.into()
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn debug_assert_eq_(input: TokenStream) -> TokenStream {
|
||||
let assert = TokenStream2::from(assert_eq_(input));
|
||||
quote!(if cfg!(debug_assertions) {
|
||||
#assert
|
||||
})
|
||||
.into()
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn debug_assert_ne_(input: TokenStream) -> TokenStream {
|
||||
let assert = TokenStream2::from(assert_ne_(input));
|
||||
quote!(if cfg!(debug_assertions) {
|
||||
#assert
|
||||
})
|
||||
.into()
|
||||
}
|
||||
/* ## end of `debug_` variants */
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn dbg(args: TokenStream) -> TokenStream {
|
||||
function_like::dbg::expand(args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn intern(args: TokenStream) -> TokenStream {
|
||||
function_like::intern::expand(args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn internp(args: TokenStream) -> TokenStream {
|
||||
function_like::internp::expand(args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn println(args: TokenStream) -> TokenStream {
|
||||
function_like::println::expand(args)
|
||||
}
|
||||
|
||||
/* ## Logging macros */
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn trace(args: TokenStream) -> TokenStream {
|
||||
function_like::log::expand(Level::Trace, args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn debug(args: TokenStream) -> TokenStream {
|
||||
function_like::log::expand(Level::Debug, args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn info(args: TokenStream) -> TokenStream {
|
||||
function_like::log::expand(Level::Info, args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn warn(args: TokenStream) -> TokenStream {
|
||||
function_like::log::expand(Level::Warn, args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn error(args: TokenStream) -> TokenStream {
|
||||
function_like::log::expand(Level::Error, args)
|
||||
}
|
||||
/* ## end of logging macros */
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn panic_(args: TokenStream) -> TokenStream {
|
||||
function_like::panic_like::expand(args, "panicked at 'explicit panic'", |format_string| {
|
||||
format!("panicked at '{format_string}'")
|
||||
})
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn todo_(args: TokenStream) -> TokenStream {
|
||||
function_like::panic_like::expand(args, "panicked at 'not yet implemented'", |format_string| {
|
||||
format!("panicked at 'not yet implemented: {format_string}'")
|
||||
})
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn unreachable_(args: TokenStream) -> TokenStream {
|
||||
function_like::panic_like::expand(
|
||||
args,
|
||||
"panicked at 'internal error: entered unreachable code'",
|
||||
|format_string| {
|
||||
format!(
|
||||
"panicked at 'internal error: entered unreachable code: {}'",
|
||||
format_string
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn unwrap(args: TokenStream) -> TokenStream {
|
||||
function_like::assert_like::unwrap::expand(args)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn write(args: TokenStream) -> TokenStream {
|
||||
function_like::write::expand(args)
|
||||
}
|
||||
|
||||
/* # Items */
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn bitflags(ts: TokenStream) -> TokenStream {
|
||||
items::bitflags::expand(ts)
|
||||
}
|
||||
|
||||
#[proc_macro]
|
||||
#[proc_macro_error]
|
||||
pub fn timestamp(args: TokenStream) -> TokenStream {
|
||||
items::timestamp::expand(args)
|
||||
}
|
||||
Reference in new issue
Block a user