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
+131
@@ -0,0 +1,131 @@
|
||||
// Copyright 2024 The Fuchsia Authors
|
||||
//
|
||||
// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
|
||||
// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
|
||||
// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
|
||||
// This file may not be copied, modified, or distributed except according to
|
||||
// those terms.
|
||||
|
||||
// See comment in `include.rs` for why we disable the prelude.
|
||||
#![no_implicit_prelude]
|
||||
#![allow(warnings)]
|
||||
#![deny(deprecated)]
|
||||
|
||||
include!("include.rs");
|
||||
|
||||
// Make sure no deprecation warnings are generated from our derives (see #553).
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! test {
|
||||
($name:ident => $ty:item => $($trait:ident),*) => {
|
||||
#[allow(non_snake_case)]
|
||||
mod $name {
|
||||
$(
|
||||
mod $trait {
|
||||
use super::super::*;
|
||||
|
||||
#[deprecated = "do not use"]
|
||||
#[derive(imp::$trait)]
|
||||
#[zerocopy(crate = "zerocopy_renamed")]
|
||||
$ty
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn _allow_deprecated() {
|
||||
util_assert_impl_all!($name: imp::$trait);
|
||||
}
|
||||
}
|
||||
)*
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// NOTE: `FromBytes` is tested separately in `enum_from_bytes.rs` since it
|
||||
// requires 256-variant enums which are extremely verbose; such enums are
|
||||
// already in that file.
|
||||
test!(Enum => #[repr(u8)] enum Enum { A, } => TryFromBytes, FromZeros, KnownLayout, Immutable, IntoBytes, Unaligned);
|
||||
|
||||
test!(Struct => #[repr(C)] struct Struct; => TryFromBytes, FromZeros, FromBytes, KnownLayout, Immutable, IntoBytes, Unaligned);
|
||||
|
||||
test!(Union => #[repr(C)] union Union{ a: (), } => TryFromBytes, FromZeros, FromBytes, KnownLayout, Immutable, IntoBytes, Unaligned);
|
||||
|
||||
// Tests for ByteHash and ByteEq which require IntoBytes + Immutable
|
||||
mod enum_hash_eq {
|
||||
mod ByteHash {
|
||||
use super::super::*;
|
||||
#[deprecated = "do not use"]
|
||||
#[derive(imp::ByteHash, imp::IntoBytes, imp::Immutable)]
|
||||
#[zerocopy(crate = "zerocopy_renamed")]
|
||||
#[repr(u8)]
|
||||
enum Enum {
|
||||
A,
|
||||
}
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn _allow_deprecated() {
|
||||
util_assert_impl_all!(Enum: ::core::hash::Hash);
|
||||
}
|
||||
}
|
||||
mod ByteEq {
|
||||
use super::super::*;
|
||||
#[deprecated = "do not use"]
|
||||
#[derive(imp::ByteEq, imp::IntoBytes, imp::Immutable)]
|
||||
#[zerocopy(crate = "zerocopy_renamed")]
|
||||
#[repr(u8)]
|
||||
enum Enum {
|
||||
A,
|
||||
}
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn _allow_deprecated() {
|
||||
util_assert_impl_all!(Enum: ::core::cmp::PartialEq, ::core::cmp::Eq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mod struct_hash_eq {
|
||||
mod ByteHash {
|
||||
use super::super::*;
|
||||
#[deprecated = "do not use"]
|
||||
#[derive(imp::ByteHash, imp::IntoBytes, imp::Immutable)]
|
||||
#[zerocopy(crate = "zerocopy_renamed")]
|
||||
#[repr(C)]
|
||||
struct Struct;
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn _allow_deprecated() {
|
||||
util_assert_impl_all!(Struct: ::core::hash::Hash);
|
||||
}
|
||||
}
|
||||
mod ByteEq {
|
||||
use super::super::*;
|
||||
#[deprecated = "do not use"]
|
||||
#[derive(imp::ByteEq, imp::IntoBytes, imp::Immutable)]
|
||||
#[zerocopy(crate = "zerocopy_renamed")]
|
||||
#[repr(C)]
|
||||
struct Struct;
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn _allow_deprecated() {
|
||||
util_assert_impl_all!(Struct: ::core::cmp::PartialEq, ::core::cmp::Eq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Tests for SplitAt which requires repr(C) and at least one field
|
||||
mod split_at_test {
|
||||
mod SplitAt {
|
||||
use super::super::*;
|
||||
#[deprecated = "do not use"]
|
||||
#[derive(imp::SplitAt, imp::KnownLayout)]
|
||||
#[zerocopy(crate = "zerocopy_renamed")]
|
||||
#[repr(C)]
|
||||
struct Struct {
|
||||
a: [u8],
|
||||
}
|
||||
|
||||
#[allow(deprecated)]
|
||||
fn _allow_deprecated() {
|
||||
util_assert_impl_all!(Struct: imp::SplitAt);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user