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

+142
View File
@@ -0,0 +1,142 @@
# Copyright © 2018–2025 Trevor Spiteri
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.
variables:
MSRV: 1.83.0
before_script:
- getconf LONG_BIT
- rustup self update
- rustup --version
- if [ -d cargo/registry/cache ]; then rm -rf $CARGO_HOME/registry/cache; mkdir -p $CARGO_HOME/registry; cp -R cargo/registry/cache $CARGO_HOME/registry/; echo Copied registry/cache; fi
- if [ -d $CARGO_HOME/registry/src ]; then rm -r $CARGO_HOME/registry/src; fi
- if [ -d $CARGO_HOME/registry/cache ]; then (cd $CARGO_HOME/registry; find cache -name \*.crate | sort) fi
after_script:
- if [ -d $CARGO_HOME/registry/cache ]; then (cd $CARGO_HOME/registry; for c in cache/*/*.crate; do s=src/${c#cache/}; if [ ! -e ${s%.crate} ]; then rm -v $c; fi; done; find cache -name \*.crate | sort) fi
- rm -rf cargo
- mkdir -p cargo/registry
- if [ -d $CARGO_HOME/registry/cache ]; then cp -R $CARGO_HOME/registry/cache cargo/registry/; echo Updated registry/cache; fi
x86_64-gnulinux:
image: amd64/rust:1
variables:
TARGET: x86_64
cache:
key: $CI_JOB_NAME
paths:
- cargo/
script:
- rustup toolchain install --profile minimal beta-$TARGET $MSRV-$TARGET nightly-$TARGET
- cargo +beta-$TARGET test --features "fail-on-warnings arbitrary borsh num-traits serde std"
- cargo +beta-$TARGET test --release --features "fail-on-warnings arbitrary borsh num-traits serde std"
- cargo +$MSRV-$TARGET test --lib --features "fail-on-warnings num-traits std"
- cargo +$MSRV-$TARGET test --release --lib --features "fail-on-warnings num-traits std"
- cargo +nightly-$TARGET test --features "fail-on-warnings nightly-float"
only:
- ci
i686-gnulinux:
image: i386/rust:1
variables:
TARGET: i686
cache:
key: $CI_JOB_NAME
paths:
- cargo/
script:
- rustup toolchain install --profile minimal beta-$TARGET $MSRV-$TARGET nightly-$TARGET
- cargo +beta-$TARGET test --features "fail-on-warnings arbitrary borsh num-traits serde std"
- cargo +beta-$TARGET test --release --features "fail-on-warnings arbitrary borsh num-traits serde std"
- cargo +$MSRV-$TARGET test --lib --features "fail-on-warnings num-traits std"
- cargo +$MSRV-$TARGET test --release --lib --features "fail-on-warnings num-traits std"
- cargo +nightly-$TARGET test --features "fail-on-warnings nightly-float"
only:
- ci
x86_64-gnulinux-tidy:
image: amd64/rust:1
variables:
TARGET: x86_64
cache:
key: $CI_JOB_NAME
paths:
- cargo/
script:
- rustup toolchain install --profile minimal beta-$TARGET
- rustup component add --toolchain beta-$TARGET rustfmt clippy
- cargo +beta-$TARGET fmt -- --check
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings arbitrary borsh num-traits serde std"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings arbitrary"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings num-traits"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings borsh"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings serde"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings serde-str"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings std"
- cargo +beta-$TARGET clippy --all-targets --features fail-on-warnings
only:
- ci
i686-gnulinux-tidy:
image: i386/rust:1
variables:
TARGET: i686
cache:
key: $CI_JOB_NAME
paths:
- cargo/
script:
- rustup toolchain install --profile minimal beta-$TARGET
- rustup component add --toolchain beta-$TARGET rustfmt clippy
- cargo +beta-$TARGET fmt -- --check
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings arbitrary borsh num-traits serde std"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings arbitrary"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings num-traits"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings borsh"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings serde"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings serde-str"
- cargo +beta-$TARGET clippy --all-targets --features "fail-on-warnings std"
- cargo +beta-$TARGET clippy --all-targets --features fail-on-warnings
only:
- ci
x86_64-gnulinux-tarpaulin:
image: amd64/rust:1
variables:
TARGET: x86_64
REQ_COVERAGE: "70"
cache:
key: $CI_JOB_NAME
paths:
- cargo/
script:
- rustup toolchain install --profile minimal beta-$TARGET
- cargo +beta-$TARGET install --version 0.32.0 --locked cargo-tarpaulin
- cargo +beta-$TARGET tarpaulin --verbose --ignore-tests --fail-under $REQ_COVERAGE --exclude-files build.rs --features "arbitrary borsh num-traits serde std"
only:
- ci
pages:
image: amd64/rust:1
variables:
TARGET: x86_64
cache:
key: $CI_JOB_NAME
paths:
- cargo/
script:
- rustup toolchain install --profile minimal nightly-$TARGET
- rm -rf public
- mkdir public
- cp etc/index.html public
- cargo +nightly-$TARGET doc --no-deps --features "arbitrary borsh num-traits serde std" -Z rustdoc-map
- mv target/doc public/dev
artifacts:
paths:
- public
only:
- www