Add integration startup service and fix Doxygen (fw 0.8.1).
Replace the services stub with IntegrationService for boot preset recall and tune orchestration, persist last preset in NVS, and remove invalid @return tags that broke CI on T4 metadata headers. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+8
-14
@@ -12,15 +12,15 @@ errors, no plaintext secrets.
|
||||
|
||||
Working directory for all commands is `Software/`.
|
||||
|
||||
**Current firmware:** `0.8.0` — broadcast metadata (RDS PS/RT, DAB DLS),
|
||||
preset reorder, CI gate (Doxygen + host tests + manual sync).
|
||||
**Current firmware:** `0.8.1` — integration service (preset recall +
|
||||
audio profile), RDS/DLS metadata, CI gate.
|
||||
|
||||
---
|
||||
|
||||
## Completed (fw 0.7.0–0.7.2)
|
||||
|
||||
- **Broadcast metadata (T4)** — RDS PS/RT and DAB DLS in
|
||||
`/api/tuner/status`, core parsers, Si4684 driver hook, UI lines.
|
||||
- **Integration service (T5)** — preset recall with audio profile re-apply,
|
||||
last-preset NVS, \texttt{app\_main} orchestration.
|
||||
- **BT1035 pairing** — `AT+PAIR`, `AT+A2DPSTAT`, `AT+A2DPDISC`,
|
||||
`BluetoothService`, REST + UI (not numbered below; landed with Slice 7).
|
||||
|
||||
@@ -50,16 +50,10 @@ status and preset save, UI Up/Dn, host tests. **Remaining:** device HIL
|
||||
`BroadcastLabel`, RDS accumulator, DAB DLS accumulator, driver
|
||||
`readDabServiceData`, status JSON fields, UI now-playing lines, host tests.
|
||||
|
||||
### T5. Remove the services stub — integration service
|
||||
**Why:** `components/services/src/component_stub.cpp` is a Slice-7
|
||||
placeholder. Tuner and Audio services exist separately but nothing
|
||||
orchestrates them together.
|
||||
**What:** implement the integration layer that binds `TunerService`,
|
||||
`AudioService`, the station list, and the network layer into the
|
||||
application flow (e.g. "select a preset → tune → apply the stored audio
|
||||
profile"). Replace the stub file.
|
||||
**Done when:** `app_main` drives a real end-to-end flow through this
|
||||
service; the stub is gone; a manual section documents the new class.
|
||||
### T5. Remove the services stub — integration service — **DONE (fw 0.8.1)**
|
||||
`integration::IntegrationService` orchestrates startup, preset recall,
|
||||
audio profile re-apply, and last-preset NVS. Stub removed; `app_main` and
|
||||
`POST /api/stations/tune` delegate here.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ Returns a health-check DTO serialised by
|
||||
|
||||
\begin{drnote}[Response schema]
|
||||
\begin{drcode}[JSON]
|
||||
{"status":"ok","fw":"0.8.0",
|
||||
{"status":"ok","fw":"0.8.1",
|
||||
"chips":{"si4684":true,"adau1701":true,"bt1035":true}}
|
||||
\end{drcode}
|
||||
\begin{itemize}
|
||||
@@ -320,13 +320,16 @@ Reorders presets using \texttt{StationList::move()}. Body:
|
||||
\subsection{\texttt{POST /api/stations/tune}}
|
||||
\label{sec:api-stations-tune}
|
||||
|
||||
Recalls a preset via \texttt{station::StationService::tuneToIndex()}.
|
||||
Recalls a preset via \texttt{integration::IntegrationService::recallPreset()}
|
||||
(tune, re-apply saved audio profile, persist last index).
|
||||
|
||||
\section{Boot and network state machine}
|
||||
\label{sec:api-boot-flow}
|
||||
|
||||
At boot, \texttt{net::NetBootstrap::start(store, tuner, audio, bluetooth,
|
||||
stations)} consults \texttt{ISecureStore::hasWifiCredentials()}:
|
||||
At boot, \texttt{integration::IntegrationService::startup()} loads presets
|
||||
and best-effort recalls the last station. Then
|
||||
\texttt{net::NetBootstrap::start(store, tuner, audio, bluetooth, stations,
|
||||
integration)} consults \texttt{ISecureStore::hasWifiCredentials()}:
|
||||
|
||||
\begin{enumerate}
|
||||
\item \textbf{Credentials present} --- create STA netif, connect via
|
||||
@@ -346,7 +349,8 @@ Wi-Fi credentials are stored in NVS namespace \texttt{digiradio}, keys
|
||||
\texttt{wifi\_ssid} and \texttt{wifi\_pwd}. Audio profiles (non-secret) use
|
||||
the same namespace, key \texttt{audio\_profile\_json}, via
|
||||
\texttt{secure\_store::NvsAudioProfileStore}. Station presets use key
|
||||
\texttt{station\_list} (JSON blob). Passwords are wrapped in
|
||||
\texttt{station\_list} (JSON blob). The last recalled preset index is stored
|
||||
as \texttt{last\_preset} (u8). Passwords are wrapped in
|
||||
\texttt{core::Secret} in RAM and are never logged or returned by the API.
|
||||
|
||||
\begin{drcaution}[Encryption at rest]
|
||||
|
||||
@@ -261,6 +261,12 @@ Application service loading/saving presets from NVS and recalling them via
|
||||
\texttt{TunerService}. Exposed on \texttt{/api/stations/*} and the Presets
|
||||
web UI section.
|
||||
|
||||
\section{IntegrationService}\label{cls:IntegrationService}
|
||||
End-to-end orchestration at boot and on preset recall: loads the station
|
||||
list, reapplies the saved \texttt{AudioProfile} after tune, and persists
|
||||
the last preset index (NVS key \texttt{last\_preset}). Used by
|
||||
\texttt{app\_main} and \texttt{POST /api/stations/tune}.
|
||||
|
||||
\section{BluetoothService}\label{cls:BluetoothService}
|
||||
Application service for BT1035 pairing and A2DP status
|
||||
(Chapter~\ref{ch:bt1035}). Delegates to \texttt{Bt1035Driver}; tracks
|
||||
|
||||
Reference in New Issue
Block a user