initial commit
This commit is contained in:
@@ -0,0 +1,575 @@
|
||||
# RadiantWave Kiosk — User Manual (Reference Draft)
|
||||
|
||||
> **Reference edition.** Every keybind, navigation path, screen behavior, and
|
||||
> status message below is derived directly from the application source code.
|
||||
> Use this as the checklist when writing the polished end-user manual.
|
||||
|
||||
**Input device:** physical keyboard only. No mouse or touchscreen. The cursor
|
||||
is hidden. Text input uses the on-screen text-entry model (SDL text input).
|
||||
|
||||
---
|
||||
|
||||
## 0. Screen Map (UX Flow)
|
||||
|
||||
```
|
||||
Power on
|
||||
└─ First-Run Walkthrough (if a prerequisite is missing)
|
||||
1. Internet reachable? no → WiFi Setup
|
||||
2. Email address set? no → Email Address
|
||||
3. License key set? no → License Key
|
||||
4. All satisfied → Home
|
||||
└─ Home
|
||||
├─ [Play] ────────────────────────────→ Scroller ──(ESC)──→ Home
|
||||
└─ [Settings] ────────────────────────→ Settings
|
||||
├─ WiFi Setup (ESC/TAB → Settings)
|
||||
├─ Audio Options (ESC/TAB → Settings)
|
||||
├─ Time Zone Setup (ESC/TAB → Settings)
|
||||
├─ Proclamations (ESC → Settings) [license-gated]
|
||||
├─ Email Address (ESC/TAB → Settings)
|
||||
├─ License Key (ESC/TAB → Settings)
|
||||
├─ Date Format (ESC/TAB → Settings)
|
||||
├─ View System Logs (ESC/TAB → Settings)
|
||||
└─ Back to Home → Home
|
||||
```
|
||||
|
||||
When **Play** or **Proclamations** is selected but the license cannot be
|
||||
verified, a **License Blocked** screen appears instead (ESC → Home).
|
||||
|
||||
The **Home** screen is the root of the whole UI. **TAB** is intended to return
|
||||
to Home from anywhere (see the caveat in §12).
|
||||
|
||||
---
|
||||
|
||||
## 1. Global Controls
|
||||
|
||||
These binds are registered at startup (`main.cpp`) and are the only binds not
|
||||
owned by a specific screen.
|
||||
|
||||
| Key | Action | Where it actually works |
|
||||
| :--- | :--- | :--- |
|
||||
| **`TAB`** | Return to the Home screen (pops every page on the stack and pushes a fresh Home). | Home; most screens also handle TAB locally (see per-screen tables) |
|
||||
| **`UP` / `DOWN`** | Move the Home menu selection. **Both keys increment the same counter** — there is no separate "down" behavior; either key cycles Play ↔ Settings. | Home |
|
||||
|
||||
> **No key quits the application.** There is intentionally no quit keybind;
|
||||
> the app is meant to run as a kiosk. (The underlying SDL window/system close
|
||||
> path still exists, but no keyboard key triggers it.)
|
||||
|
||||
**Per-screen binds are checked before the screen sees key events.** A keybind
|
||||
registered on the current screen is consumed by the keybind system; keys not
|
||||
bound there fall through to the screen's own event handler.
|
||||
|
||||
---
|
||||
|
||||
## 2. Boot & First-Run Walkthrough
|
||||
|
||||
On every boot the app checks three prerequisites in a fixed order and shows the
|
||||
**first** missing one (`provisioning.h`):
|
||||
|
||||
| # | Prerequisite | Screen shown if missing |
|
||||
| :--- | :--- | :--- |
|
||||
| 1 | Internet reachable (real connectivity probe — Ethernet, WiFi, or any OS link) | WiFi Setup |
|
||||
| 2 | Email address saved | Email Address |
|
||||
| 3 | License key saved | License Key |
|
||||
| 4 | — | Home |
|
||||
|
||||
Walkthrough screens call "advance" when they finish or are backed out of, which
|
||||
pops the current step and re-evaluates. Completing the WiFi page does **not**
|
||||
re-run the internet probe (cached); the other steps only read the DB.
|
||||
|
||||
- A brand-new device (no internet, no email, no license) also raises an
|
||||
internal `firstRunWalkthrough` flag (a future welcome walkthrough; today it
|
||||
is only set and logged).
|
||||
- If the database failed to open, the walkthrough is skipped entirely and the
|
||||
app goes straight to Home.
|
||||
- On the WiFi page during the walkthrough, once the internet becomes reachable
|
||||
the page waits ~1.5 s ("Internet connected. Continuing setup...") and then
|
||||
advances automatically.
|
||||
- On the Email and License pages, after a successful save the page waits ~1 s
|
||||
and then advances automatically.
|
||||
|
||||
---
|
||||
|
||||
## 3. Home
|
||||
|
||||
**Reached from:** app start, TAB, ESC on License Blocked, "Back to Home" in
|
||||
Settings, ESC on the Scroller.
|
||||
|
||||
**Screen contents:**
|
||||
- Centered "Radiant Wave" logo title.
|
||||
- Two menu items: **Play** and **Settings** (white underline marks the
|
||||
selection).
|
||||
- Bottom-right status footer (see §11).
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** | Cycle menu selection (Play → Settings → Play). |
|
||||
| **`DOWN`** | Same as UP — cycles the selection the same way. |
|
||||
| **`RETURN`** / **`ENTER`** | Activate the highlighted item. |
|
||||
| **`TAB`** | Re-push Home (no visible change) (until a page is pushed on top of Home). |
|
||||
|
||||
> The **UP** and **DOWN** keys are wired identically (both increment the
|
||||
> selection), so either arrow moves the highlight the same way; there is no
|
||||
> dedicated "down" behavior. There is **no quit key** on Home.
|
||||
|
||||
**Behavior:**
|
||||
- **Play** (item 0) with a confirmed-valid license → **Scroller**.
|
||||
- **Play** with an invalid/unverifiable license → **License Blocked**.
|
||||
- **Settings** (item 1) → replaces Home with **Settings**.
|
||||
- The internet status refreshes automatically every 5 seconds while Home is
|
||||
shown. Play only unlocks when the license is valid (validated in the
|
||||
background; result shown in the footer).
|
||||
|
||||
---
|
||||
|
||||
## 4. Scroller (Play)
|
||||
|
||||
**Reached from:** Home → Play (license-gated).
|
||||
|
||||
**Screen contents:** full-screen, vertically scrolling proclamation text.
|
||||
Proclamation text is never rendered as readable type — each glyph is permuted
|
||||
into a scrambled tile by the Fibonacci affine map, so letterforms are
|
||||
destroyed on screen. Lines follow the Fibonacci line-length pattern; colors
|
||||
come from per-frequency palettes; audio crossfades between streams.
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`ESC`** | Exit back to Home. |
|
||||
|
||||
No other keys do anything on this screen. Scrolling speed ramps automatically
|
||||
(up and down) with pauses at each extreme; there is no user speed control.
|
||||
|
||||
**Behavior:**
|
||||
- Plays audio with a 5 s fade-in; on exit fades out over ~5 s.
|
||||
- Dynamic Audio mode: the current stream's solfeggio-frequency track is
|
||||
crossfaded as proclamations change. Fixed-track mode: the configured track
|
||||
plays and never switches.
|
||||
- If a stream's audio file is not on disk yet, playback falls back to the
|
||||
manual track rather than silence.
|
||||
|
||||
---
|
||||
|
||||
## 5. Settings
|
||||
|
||||
**Reached from:** Home → Settings. (Home is replaced, not stacked.)
|
||||
|
||||
**Screen contents:** title "Settings" and a 9-item menu:
|
||||
|
||||
| # | Item | Opens | License-gated? |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| 0 | WiFi Setup | WiFi Setup screen | no |
|
||||
| 1 | Audio Options | Audio Options screen | no |
|
||||
| 2 | Time Zone Setup | Time Zone Setup screen | no |
|
||||
| 3 | Proclamations | Proclamation Options | **yes** (else License Blocked) |
|
||||
| 4 | Email Address | Email Address screen | no |
|
||||
| 5 | License Key | License Key screen | no |
|
||||
| 6 | Date Format | Date Format screen | no |
|
||||
| 7 | View System Logs | System Log Viewer | no |
|
||||
| 8 | Back to Home | Home | — |
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** | Move selection up (wraps around). |
|
||||
| **`DOWN`** | Move selection down (wraps around). |
|
||||
| **`RETURN`** / **`ENTER`** | Open the highlighted item. |
|
||||
| **`ESC`** | Return to Home (replaces Settings). |
|
||||
| **`TAB`** | Return to Home. |
|
||||
|
||||
---
|
||||
|
||||
## 6. WiFi Setup
|
||||
|
||||
**Reached from:** Settings → WiFi Setup, or the First-Run walkthrough.
|
||||
|
||||
**Screen contents:**
|
||||
- Title "WiFi Configuration".
|
||||
- Status row: **WiFi: Connected/Disconnected** (green/red), **Network:
|
||||
\<SSID\>/None**, **Internet: Reachable/Unreachable** (green/red).
|
||||
- Status message banner (blue-bordered): "Scanning for available
|
||||
networks...", "Connecting to \<SSID\>...", "Connected successfully!",
|
||||
"Connection failed: \<reason\>", "Password entry cancelled", etc.
|
||||
- Network list (50 px rows). Color coding:
|
||||
- 🟢 **GREEN** — currently connected network.
|
||||
- 🟡 **YELLOW** — previously saved/remembered network.
|
||||
- ⚪ **WHITE** — new/unknown network.
|
||||
- Each row also shows a security badge `[Open]/[WPA/...]` and a signal
|
||||
strength percentage.
|
||||
- Empty state: "No WiFi networks found. Press F5 to scan."
|
||||
- Footer: `[UP/DOWN] Select [ENTER] Connect [F5] Rescan Networks [ESC/TAB] Back`.
|
||||
|
||||
**Keybinds (normal mode):**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** | Select previous network. |
|
||||
| **`DOWN`** | Select next network. |
|
||||
| **`RETURN`** / **`ENTER`** | Connect. Open network → connects immediately. Secured network → opens the password box. |
|
||||
| **`F5`** | Re-scan for networks. |
|
||||
| **`ESC`** | Back (Settings, or walkthrough advance). |
|
||||
| **`TAB`** | Back (same as ESC). |
|
||||
|
||||
**Password box (modal):**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **type any keys** | Type the password (shown in plain text, unmasked, with a cursor). |
|
||||
| **`BACKSPACE`** | Delete the last character. |
|
||||
| **`RETURN`** / **`ENTER`** | Submit password and connect. |
|
||||
| **`ESC`** | Cancel password entry (returns to the network list). |
|
||||
|
||||
Password modal footer: `[ENTER] Submit Password [ESC] Cancel`.
|
||||
|
||||
**Behavior:**
|
||||
- Connect is asynchronous. On completion: "Connected successfully!" or
|
||||
"Connection failed: \<error\>" (falls back to "Authentication or signal
|
||||
error").
|
||||
- While a connection is in progress the list is locked.
|
||||
- **Walkthrough only:** once internet is reachable, auto-advances after ~1.5 s.
|
||||
|
||||
---
|
||||
|
||||
## 7. Audio Options
|
||||
|
||||
**Reached from:** Settings → Audio Options.
|
||||
|
||||
**Screen contents:** title "Audio Configuration"; status row **Audio:
|
||||
Enabled/Disabled** (green/red) and **Device: \<name\>**; status banner; 5-item
|
||||
menu:
|
||||
|
||||
| # | Item | Interaction |
|
||||
| :--- | :--- | :--- |
|
||||
| 0 | Volume: `[▓▓▓▓▓▓▓▓░░] 80%` | LEFT/RIGHT step −/+ 5% (0–100, clamps). |
|
||||
| 1 | Output Device: `[\<name\>]` | ENTER opens the Device selector modal. |
|
||||
| 2 | Audio Track: `[\<name\>]` | ENTER opens the Track selector modal. |
|
||||
| 3 | Audio Status: `[ON]`/`[OFF]` | ENTER toggles audio system-wide on/off. |
|
||||
| 4 | Back to Settings | ENTER pops back to Settings. |
|
||||
|
||||
Footer: `[UP/DOWN] Select [LEFT/RIGHT] Volume [ENTER] Confirm [ESC/TAB] Back`.
|
||||
|
||||
**Keybinds (main menu):**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** | Select previous item. |
|
||||
| **`DOWN`** | Select next item. |
|
||||
| **`LEFT`** | Volume −5% (only when Volume is highlighted). |
|
||||
| **`RIGHT`** | Volume +5% (only when Volume is highlighted). |
|
||||
| **`RETURN`** / **`ENTER`** | Open device/track modal, toggle audio, or Back. |
|
||||
| **`ESC`** | Back to Settings (closes a modal first if one is open). |
|
||||
| **`TAB`** | Back to Settings (only when no modal is open). |
|
||||
|
||||
**Device selector modal** — "Select Output Device":
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Move selection. |
|
||||
| **`PAGE UP`** / **`PAGE DOWN`** | Jump selection by 8. |
|
||||
| **`RETURN`** / **`ENTER`** | Switch to the highlighted device. |
|
||||
| **`ESC`** | Cancel (no change). |
|
||||
|
||||
**Track selector modal** — "Select Audio Track":
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Move selection. |
|
||||
| **`PAGE UP`** / **`PAGE DOWN`** | Jump selection by 8. |
|
||||
| **`RETURN`** / **`ENTER`** | Select the highlighted option. |
|
||||
| **`ESC`** | Cancel (no change). |
|
||||
|
||||
Modal footer: `[UP/DOWN] Select [ENTER] Confirm [ESC] Cancel`.
|
||||
|
||||
**Behavior:**
|
||||
- The track list always leads with **Dynamic Audio** (cyan; "audio follows the
|
||||
displayed proclamation"), then **Original Audio** pinned first, then every
|
||||
other track sorted alphabetically. Up to 8 rows visible; the list scrolls
|
||||
and stays centered on the selection.
|
||||
- Choosing a fixed track turns Dynamic Audio **off**. Choosing Dynamic Audio
|
||||
turns it on (status: "Dynamic Audio mode enabled - audio follows the
|
||||
displayed proclamation"). Choosing a track shows "Fixed track selected".
|
||||
Playback itself starts when the Scroller plays, not here.
|
||||
- Device and track lists refresh automatically every 1 second.
|
||||
|
||||
---
|
||||
|
||||
## 8. Time Zone Setup
|
||||
|
||||
**Reached from:** Settings → Time Zone Setup.
|
||||
|
||||
**Screen contents:** title "Time Zone Configuration"; **Configured Timezone:
|
||||
\<code\>** (yellow) and a live **Local Time:** sample (green); status banner;
|
||||
then either a **country list** or a **timezone list** for the chosen country.
|
||||
Green rows mark the currently configured country/zone; the white underline
|
||||
marks the selection.
|
||||
|
||||
**Country step:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Select country/region. |
|
||||
| **`RETURN`** / **`ENTER`** | Show that country's timezone list ("Select timezone for \<Country\>"). |
|
||||
| **`ESC`** / **`TAB`** / **`BACKSPACE`** | Back to Settings. |
|
||||
|
||||
**Timezone step:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Select a timezone. |
|
||||
| **`RETURN`** / **`ENTER`** | Save the timezone (status "Timezone set to \<code\>") and return to the country list. |
|
||||
| **`ESC`** / **`BACKSPACE`** / **`TAB`** | Back to the country list. |
|
||||
|
||||
Footers:
|
||||
- Country: `[UP/DOWN] Select Country [ENTER] Choose [ESC/TAB] Back to Settings`
|
||||
- Timezone: `[UP/DOWN] Select Timezone [ENTER] Apply Timezone [ESC/BACKSPACE] Back to Countries`
|
||||
|
||||
**Behavior:** the saved timezone is written to the live config immediately;
|
||||
logs and the Home clock use it right away.
|
||||
|
||||
---
|
||||
|
||||
## 9. Proclamations
|
||||
|
||||
**Reached from:** Settings → Proclamations (license-gated; else License
|
||||
Blocked).
|
||||
|
||||
**Screen contents:** title "Proclamation Options"; status line (sync result +
|
||||
"Selected: N"); an optional **search bar** while searching; a collapsible
|
||||
category tree (or a flat search-result list); footer hints.
|
||||
|
||||
**Colors:** categories blue; selected proclamations orange; the always-on
|
||||
top-level proclamation orange; locked (above your subscription) rows flash
|
||||
**red**; search text yellow.
|
||||
|
||||
**Keybinds (browse mode):**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Move highlight. |
|
||||
| **`RETURN`** / **`ENTER`** | Toggle the highlighted row: expand/collapse a category, or select/deselect a proclamation. |
|
||||
| **`LEFT`** | Collapse the highlighted category; if the row is a sub-item, jump to its parent. |
|
||||
| **`RIGHT`** | Expand the highlighted category. |
|
||||
| **`PAGE UP`** / **`PAGE DOWN`** | Scroll by a page. |
|
||||
| **`CTRL` + `D`** | Clear all selections (the top-level proclamation stays on). |
|
||||
| **type any printable character** | Enter search mode. |
|
||||
| **`ESC`** | Back to Settings. |
|
||||
|
||||
**Search mode:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **type any printable character** | Add to the search query (word-prefix match on title + content). |
|
||||
| **`BACKSPACE`** | Delete the last query character; when the query empties, search mode closes. |
|
||||
| **`UP`** / **`DOWN`** | Move highlight. |
|
||||
| **`RETURN`** / **`ENTER`** | Toggle the highlighted result. |
|
||||
| **`ESC`** | Cancel search and return to the browse tree. |
|
||||
|
||||
Footers:
|
||||
- Browse: `[UP/DOWN] Move [ENTER] Toggle [Type to Search] [LEFT/RIGHT] Expand/Collapse [CTRL+D] Clear All [ESC] Back`
|
||||
- Search: `[UP/DOWN] Move [ENTER] Select [BACKSPACE] Edit [ESC] Cancel Search`
|
||||
|
||||
**Behavior:**
|
||||
- On open the app syncs the list with the server: "Synced with server" or
|
||||
"Offline - showing saved proclamations". The "Selected: N" count on the
|
||||
status line excludes the always-on top-level proclamation.
|
||||
- The top-level proclamation ("Synchronize, Harmonize & Energize") is **always
|
||||
on** and cannot be deselected ("The top-level proclamation is always on").
|
||||
- Selecting a proclamation whose required subscription level is above the one
|
||||
attached to your license key is rejected: the row flashes red and a status
|
||||
line explains it's "available on \<Level\> systems".
|
||||
- A bare **SPACE** does not open search and never selects anything; in search
|
||||
mode SPACE types a space into the query.
|
||||
- **TAB is NOT handled on this screen** — use ESC to go back.
|
||||
|
||||
---
|
||||
|
||||
## 10. Email Address, License Key, Date Format
|
||||
|
||||
### 10.1 Email Address
|
||||
|
||||
**Reached from:** Settings → Email Address, or the walkthrough.
|
||||
|
||||
**Screen contents:** title "Email Address"; "Saved: \<address\>" (gray = not
|
||||
set, yellow = set); input box with cursor; status line; footer.
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **type any keys** | Type/edit the email (up to 254 chars). |
|
||||
| **`BACKSPACE`** | Delete the last character. |
|
||||
| **`RETURN`** / **`ENTER`** | Save. Empty input clears the saved address ("Cleared"). Invalid address shows "Invalid email address". Valid save shows "Saved". |
|
||||
| **`ESC`** | Back without saving (Settings, or walkthrough advance). |
|
||||
| **`TAB`** | Back (same as ESC). |
|
||||
|
||||
- After a successful save/clear, the page auto-exits after ~1 s.
|
||||
- Footer: `[Type] Enter email [ENTER] Save [BACKSPACE] Delete [ESC/TAB] Back`.
|
||||
|
||||
### 10.2 License Key
|
||||
|
||||
**Reached from:** Settings → License Key, or the walkthrough.
|
||||
|
||||
**Screen contents:** title "License Key"; "Saved: \<key\>" (gray/yellow); input
|
||||
box showing the key formatted `XXXX-XXXX-XXXX-XXXX`; status line; footer.
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **type any keys** | Type the key. Only alphanumerics are accepted (uppercased); max 16 characters. Dashes are added automatically for display. |
|
||||
| **`BACKSPACE`** | Delete the last character. |
|
||||
| **`RETURN`** / **`ENTER`** | Save and validate. |
|
||||
| **`ESC`** | Back without saving (Settings, or walkthrough advance). |
|
||||
| **`TAB`** | Back (same as ESC). |
|
||||
|
||||
**Validation statuses on ENTER:**
|
||||
- Fewer than 16 characters → "License key must be 16 characters
|
||||
(XXXX-XXXX-XXXX-XXXX)".
|
||||
- Save failed → "Failed to save license key".
|
||||
- Server validated → "License validated (\<level\>)".
|
||||
- Missing email → "Saved - add your email address to validate the license".
|
||||
- Invalid → "License check failed: \<reason\>".
|
||||
- No network → "License saved, but the server could not be reached to
|
||||
validate".
|
||||
|
||||
- Auto-exits after ~1 s once saved.
|
||||
- Footer: `[Type] Enter key (dashes added automatically) [ENTER] Save [BACKSPACE] Delete [ESC/TAB] Back`.
|
||||
|
||||
### 10.3 Date Format
|
||||
|
||||
**Reached from:** Settings → Date Format.
|
||||
|
||||
**Screen contents:** title "Date Format"; "Today looks like: \<example\>"
|
||||
(yellow); 7 format options each with a live sample date; status line; footer.
|
||||
|
||||
**Format options:** Month/Day/Year, Day/Month/Year, Year-Month-Day,
|
||||
Month.Day.Year, Day.Month.Year, "Month Day, Year", "Day Month Year".
|
||||
|
||||
> The option currently in use is shown in yellow, the others in white; every
|
||||
> option's live sample date is gray.
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Choose a format. |
|
||||
| **`RETURN`** / **`ENTER`** | Apply the format and return to Settings ("Date format saved"). |
|
||||
| **`ESC`** | Back without saving. |
|
||||
| **`TAB`** | Back (same as ESC). |
|
||||
|
||||
- Footer: `[UP/DOWN] Choose [ENTER] Apply & Back [ESC/TAB] Back`.
|
||||
|
||||
---
|
||||
|
||||
## 11. System Log Viewer
|
||||
|
||||
**Reached from:** Settings → View System Logs.
|
||||
|
||||
**Screen contents:** title "System Event Log Viewer"; header bar showing
|
||||
**Filter: \<level\> | Sort: Newest/Oldest First | Entries: N | TZ: \<code\>**;
|
||||
word-wrapped log lines (color-coded by severity) with local-time timestamps;
|
||||
footer.
|
||||
|
||||
**Log line colors:** DEBUG gray, INFO white, WARNING yellow, ERROR red,
|
||||
FATAL magenta/pink.
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`UP`** / **`DOWN`** | Scroll one line. |
|
||||
| **`PAGE UP`** / **`PAGE DOWN`** | Scroll 10 lines. |
|
||||
| **`L`** or **`F2`** or **`RIGHT`** | Cycle the filter level forward: ALL → DEBUG → INFO → WARNING → ERROR → FATAL. |
|
||||
| **`LEFT`** | Cycle the filter level backward. |
|
||||
| **`S`** or **`F3`** | Toggle sort order: Newest First ↔ Oldest First. |
|
||||
| **`C`** | Clear all log history. |
|
||||
| **`ESC`** | Back to Settings. |
|
||||
| **`TAB`** | Back (same as ESC). |
|
||||
|
||||
- Footer: `[UP/DOWN] Scroll [L/F2] Filter Level [S/F3] Sort Order [C] Clear Logs [ESC/TAB] Back`.
|
||||
- The log list auto-refreshes every 0.25 s while the screen is open.
|
||||
|
||||
---
|
||||
|
||||
## 12. License Blocked Screen
|
||||
|
||||
**Reached from:** Play or Settings → Proclamations when the license cannot be
|
||||
verified.
|
||||
|
||||
**Screen contents:** centered message "License could not be verified",
|
||||
instruction text ("Please check that you are connected to the internet, and
|
||||
double check your license key and email address."), and "Press ESC to return."
|
||||
|
||||
**Keybinds:**
|
||||
|
||||
| Key | Action |
|
||||
| :--- | :--- |
|
||||
| **`ESC`** | Return to Home (pops every page and pushes a fresh Home). |
|
||||
|
||||
---
|
||||
|
||||
## 13. Home Status Footer (legend)
|
||||
|
||||
The bottom-right corner of Home shows a two-column readout:
|
||||
|
||||
| Field | Meaning / values |
|
||||
| :--- | :--- |
|
||||
| **License:** | `OK` (green) · `Invalid` (red, bold) · `Checking...` · `Unknown` |
|
||||
| **Key:** | saved license key, or `Not set` |
|
||||
| **Email:** | saved email, or `Not set` |
|
||||
| **Subscription:** | subscription level name from the license, or `Not set` |
|
||||
| **WiFi:** | current SSID, or `Not connected` |
|
||||
| **Internet:** | `Connected` / `Offline` |
|
||||
| **Audio:** | audio-downloader status string, or `Idle` |
|
||||
| **Date:** | formatted per the selected date format |
|
||||
| **Time:** | `HH:MM:SS` (24-hour) |
|
||||
|
||||
Internet status refreshes every 5 s while Home is shown; the license check
|
||||
re-runs in the background each time Home appears.
|
||||
|
||||
---
|
||||
|
||||
## 14. Data & Configuration (background)
|
||||
|
||||
- **`~/.local/radiantwave/config.yaml`** — settings (audio volume, output
|
||||
device, current track, dynamic audio, timezone, proclamation font size).
|
||||
Saved automatically. **Hot-reloaded live**: editing it while the app runs
|
||||
applies immediately without a restart.
|
||||
- **`~/.local/radiantwave/radiantwave.db`** (SQLite, WAL) — email, license key,
|
||||
subscription level, license last-verified timestamp, proclamation/category
|
||||
data, audio file records, system log history.
|
||||
- **Audio assets** (`.wav` files) are downloaded in the background on first
|
||||
connect and stored under `~/.local/radiantwave/audio/`; they are not part of
|
||||
the app install.
|
||||
- License checks run online; a known-good license stays valid for a **7-day
|
||||
offline grace window**.
|
||||
|
||||
---
|
||||
|
||||
## 15. Implementation Notes / Caveats (for the manual author)
|
||||
|
||||
These are behaviors visible in the source that differ from the "intended"
|
||||
controls, so you can decide how to document or fix them:
|
||||
|
||||
1. **TAB (Home) is registered once at startup and is removed whenever any page
|
||||
pauses** (every page calls `keybinds.unbindAll()` in `onPause`, and Home
|
||||
only re-binds UP/DOWN in `onResume`). In practice **TAB returns Home
|
||||
reliably only on the Home screen, and only until you first push a page on
|
||||
top of it — popping back to Home does not restore it**. Screens that handle
|
||||
TAB locally (Settings, WiFi, Audio, Email, License, Date Format, Log
|
||||
Viewer) keep working; the Scroller, Proclamations, and License Blocked do
|
||||
not respond to TAB.
|
||||
2. **Home's UP and DOWN both move the selection the same direction** — both
|
||||
call `(x+1)%2`. There is no down-only arrow behavior.
|
||||
3. **Proclamation page and Scroller have no TAB handler** — only ESC returns
|
||||
from the Proclamation page / Scroller.
|
||||
4. **TAB on the Time Zone page behaves differently per step**: in the
|
||||
country list it exits to Settings; in the timezone list it returns to the
|
||||
country list.
|
||||
5. The walkthrough's WiFi page auto-advances as soon as internet is reachable
|
||||
(≈1.5 s), and the Email/License pages auto-advance ≈1 s after a successful
|
||||
save — the walkthrough can never be completed by pressing Enter alone on a
|
||||
connected device.
|
||||
Reference in New Issue
Block a user