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

@@ -0,0 +1 @@
no-leads = 1987-7-05T17:45:00Z
@@ -0,0 +1 @@
no-secs = 1987-07-05T17:45Z
@@ -0,0 +1 @@
no-t = 1987-07-0517:45:00Z
@@ -0,0 +1 @@
with-milli = 1987-07-5T17:45:00.12Z
@@ -0,0 +1,5 @@
[fruit]
type = "apple"
[fruit.type]
apple = "yes"
+2
View File
@@ -0,0 +1,2 @@
dupe = false
dupe = true
+8
View File
@@ -0,0 +1,8 @@
[dependencies.openssl-sys]
version = "0.5.2"
[dependencies]
libc = "0.1"
[dependencies]
bitflags = "0.1.1"
+2
View File
@@ -0,0 +1,2 @@
[a]
[a]
@@ -0,0 +1 @@
[naughty..naughty]
+1
View File
@@ -0,0 +1 @@
[]
@@ -0,0 +1,2 @@
answer = .12345
neganswer = -.12345
+1
View File
@@ -0,0 +1 @@
a = 1.2f
@@ -0,0 +1,2 @@
answer = 1.
neganswer = -1.
+1
View File
@@ -0,0 +1 @@
[[agencies]] owner = "S Cjelli"
+1
View File
@@ -0,0 +1 @@
[history] guard = "sleeping"
+1
View File
@@ -0,0 +1 @@
= 1
+1
View File
@@ -0,0 +1 @@
a# = 1
+2
View File
@@ -0,0 +1,2 @@
a
= 1
+1
View File
@@ -0,0 +1 @@
[abc = 1
@@ -0,0 +1 @@
[
+1
View File
@@ -0,0 +1 @@
a b = 1
@@ -0,0 +1,3 @@
[a]
[xyz = 5
[b]
+1
View File
@@ -0,0 +1 @@
key= = 1
@@ -0,0 +1 @@
naughty = "\xAg"
@@ -0,0 +1 @@
invalid-escape = "This string has a bad \a escape character."
@@ -0,0 +1,3 @@
invalid-escape = """\
This string has a non whitespace-character after the line ending escape. \ a
"""
@@ -0,0 +1 @@
answer = "\x33"
+1
View File
@@ -0,0 +1 @@
no-ending-quote = "One time, at band camp
@@ -0,0 +1,14 @@
# This test is a bit tricky. It should fail because the first use of
# `[[albums.songs]]` without first declaring `albums` implies that `albums`
# must be a table. The alternative would be quite weird. Namely, it wouldn't
# comply with the TOML spec: "Each double-bracketed sub-table will belong to
# the most *recently* defined table element *above* it."
#
# This is in contrast to the *valid* test, table-array-implicit where
# `[[albums.songs]]` works by itself, so long as `[[albums]]` isn't declared
# later. (Although, `[albums]` could be.)
[[albums.songs]]
name = "Glory Days"
[[albums]]
name = "Born in the USA"
@@ -0,0 +1,2 @@
[[albums]
name = "Born to Run"
@@ -0,0 +1,2 @@
[[]]
name = "Born to Run"
+1
View File
@@ -0,0 +1 @@
[]
@@ -0,0 +1,2 @@
[a]b]
zyx = 42
@@ -0,0 +1,2 @@
[a[b]
zyx = 42
+1
View File
@@ -0,0 +1 @@
[invalid key]
+2
View File
@@ -0,0 +1,2 @@
[key#group]
answer = 42
@@ -0,0 +1,4 @@
array = [
"Is there life after an array separator?", No
"Entry"
]
@@ -0,0 +1 @@
answer = 42 the ultimate answer?
@@ -0,0 +1 @@
string = "Is there life after strings?" No.
+1
View File
@@ -0,0 +1 @@
[error] this shouldn't be here
@@ -0,0 +1,4 @@
array = [
"Is there life before an array separator?" No,
"Entry"
]
+5
View File
@@ -0,0 +1,5 @@
array = [
"Entry 1",
I don't belong,
"Entry 2",
]