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
@@ -0,0 +1 @@
|
||||
{"files":{".cargo_vcs_info.json":"d776983ec74ef86f9ca083c19432762d7eb0f6030d4172319a6b3fae847d1594","Cargo.toml":"2e0b30c6a0573fdb00a2b4019a593560b65ec21555cb1c2662b8e03f8bbd74d4","Cargo.toml.orig":"7159e43a23d09099984d76b25e2dca39ab79fa88a97b0df29b04b0b73a09f52a","README.md":"fccd0cb1ba1def55909dcb53d46e5cc432d7445f2784a2b327057e3b5af8a7f2","build.rs":"536e506bb90914c243a12b397b9a998f85ae2cbd9ba02dfd03a9e155ca5ca0f4","src/lib.rs":"1b513f9bbbcc74ac32e7c3f7dec4ade6277ad344b0b9ec0ee8f0ab3936203997"},"package":"f1177859559ebf42cd24ae7ba8fe6ee707489b01d0bf471f8827b7b12dcb0bc0"}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"git": {
|
||||
"sha1": "17851c7ed0b7ef0081e46b31bd30e6169fa3a611"
|
||||
},
|
||||
"path_in_vcs": "embassy-time-queue-driver"
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
||||
#
|
||||
# When uploading crates to the registry Cargo will automatically
|
||||
# "normalize" Cargo.toml files for maximal compatibility
|
||||
# with all versions of Cargo and also rewrite `path` dependencies
|
||||
# to registry (e.g., crates.io) dependencies.
|
||||
#
|
||||
# If you are reading this file be aware that the original Cargo.toml
|
||||
# will likely look very different (and much more reasonable).
|
||||
# See Cargo.toml.orig for the original contents.
|
||||
|
||||
[package]
|
||||
edition = "2021"
|
||||
name = "embassy-time-queue-driver"
|
||||
version = "0.1.0"
|
||||
links = "embassy-time-queue"
|
||||
description = "Timer queue driver trait for embassy-time"
|
||||
readme = "README.md"
|
||||
categories = [
|
||||
"embedded",
|
||||
"no-std",
|
||||
"concurrency",
|
||||
"asynchronous",
|
||||
]
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/embassy-rs/embassy"
|
||||
|
||||
[package.metadata.embassy_docs]
|
||||
src_base = "https://github.com/embassy-rs/embassy/blob/embassy-time-queue-driver-v$VERSION/embassy-time-queue-driver/src/"
|
||||
src_base_git = "https://github.com/embassy-rs/embassy/blob/$COMMIT/embassy-time-queue-driver/src/"
|
||||
target = "x86_64-unknown-linux-gnu"
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
# embassy-time-queue-driver
|
||||
|
||||
This crate contains the driver trait used by the [`embassy-time`](https://crates.io/crates/embassy-time) timer queue.
|
||||
|
||||
You should rarely need to use this crate directly. Only use it when implementing your own timer queue.
|
||||
|
||||
There is two timer queue implementations, one in `embassy-time` enabled by the `generic-queue` feature, and
|
||||
another in `embassy-executor` enabled by the `integrated-timers` feature.
|
||||
+1
@@ -0,0 +1 @@
|
||||
fn main() {}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
#![no_std]
|
||||
#![doc = include_str!("../README.md")]
|
||||
#![warn(missing_docs)]
|
||||
|
||||
//! ## Implementing a timer queue
|
||||
//!
|
||||
//! - Define a struct `MyTimerQueue`
|
||||
//! - Implement [`TimerQueue`] for it
|
||||
//! - Register it as the global timer queue with [`timer_queue_impl`](crate::timer_queue_impl).
|
||||
//!
|
||||
//! ## Example
|
||||
//!
|
||||
//! ```
|
||||
//! use core::task::Waker;
|
||||
//!
|
||||
//! use embassy_time::Instant;
|
||||
//! use embassy_time::queue::{TimerQueue};
|
||||
//!
|
||||
//! struct MyTimerQueue{}; // not public!
|
||||
//!
|
||||
//! impl TimerQueue for MyTimerQueue {
|
||||
//! fn schedule_wake(&'static self, at: u64, waker: &Waker) {
|
||||
//! todo!()
|
||||
//! }
|
||||
//! }
|
||||
//!
|
||||
//! embassy_time_queue_driver::timer_queue_impl!(static QUEUE: MyTimerQueue = MyTimerQueue{});
|
||||
//! ```
|
||||
use core::task::Waker;
|
||||
|
||||
/// Timer queue
|
||||
pub trait TimerQueue {
|
||||
/// Schedules a waker in the queue to be awoken at moment `at`.
|
||||
/// If this moment is in the past, the waker might be awoken immediately.
|
||||
fn schedule_wake(&'static self, at: u64, waker: &Waker);
|
||||
}
|
||||
|
||||
extern "Rust" {
|
||||
fn _embassy_time_schedule_wake(at: u64, waker: &Waker);
|
||||
}
|
||||
|
||||
/// Schedule the given waker to be woken at `at`.
|
||||
pub fn schedule_wake(at: u64, waker: &Waker) {
|
||||
unsafe { _embassy_time_schedule_wake(at, waker) }
|
||||
}
|
||||
|
||||
/// Set the TimerQueue implementation.
|
||||
///
|
||||
/// See the module documentation for an example.
|
||||
#[macro_export]
|
||||
macro_rules! timer_queue_impl {
|
||||
(static $name:ident: $t: ty = $val:expr) => {
|
||||
static $name: $t = $val;
|
||||
|
||||
#[no_mangle]
|
||||
fn _embassy_time_schedule_wake(at: u64, waker: &core::task::Waker) {
|
||||
<$t as $crate::TimerQueue>::schedule_wake(&$name, at, waker);
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user