Enable CI gate: fix Doxygen and add workflow.

Clear doc-block warnings so doxygen exits 0, add GitHub Actions
for host tests, Doxygen, and manual sync, and document CI in the manual.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 23:41:30 +02:00
co-authored by Cursor
parent 8cd962ee25
commit 9f76ab9e74
12 changed files with 143 additions and 39 deletions
@@ -21,8 +21,8 @@ namespace core {
*
* @dname AudioEnhancements
* @return n/a (type)
* @pubstate Mapped to PEQ bands at runtime (Chapter~\ref{ch:sigmastudio}).
* No dedicated SigmaStudio blocks; see \texttt{applyEnhancementsToEq}.
* @pubstate Mapped to PEQ bands at runtime (manual chapter sigmastudio).
* No dedicated SigmaStudio blocks; see \c applyEnhancementsToEq.
*
* @author Michele Bigi
* @date 2026-07-06
@@ -55,7 +55,7 @@ namespace core {
* @brief serializeAudioSavedJson — success response after profile apply.
*
* @dname serializeAudioSavedJson
* @return JSON object \texttt{\{"status":"saved"\}}.
* @return JSON object with \c status set to \c saved.
* @pubstate none
*
* @author Michele Bigi
@@ -77,7 +77,7 @@ namespace core {
[[nodiscard]] std::string serializeAudioErrorJson(std::string_view reason);
/**
* @brief parseEnhanceLevelJson — parse POST body \texttt{\{"level":0..100\}}.
* @brief parseEnhanceLevelJson — parse POST body with level 0..100.
*
* @dname parseEnhanceLevelJson
* @param json Untrusted request body.
@@ -85,7 +85,7 @@ inline constexpr std::size_t kBt1035BootInitCommandCount = 2U;
*
* @dname buildBt1035AtLine
* @param command Typed AT command.
* @return Full line including \r\n suffix.
* @return Full line including CRLF suffix.
* @pubstate none
*
* @author Michele Bigi
@@ -59,12 +59,67 @@ public:
std::optional<FrequencyKHz> fmFrequency,
std::optional<PresetSlot> presetSlot);
/**
* @brief name — read the preset display label.
*
* @dname name
* @return Station name value.
* @pubstate reads name_.
*/
[[nodiscard]] const StationName& name() const noexcept;
/**
* @brief band — read the target RF band.
*
* @dname band
* @return Dab or Fm band selector.
* @pubstate reads band_.
*/
[[nodiscard]] TunerBand band() const noexcept;
/**
* @brief dabFreqIndex — read the Band III ensemble index.
*
* @dname dabFreqIndex
* @return Ensemble index 037.
* @pubstate reads dabFreqIndex_.
*/
[[nodiscard]] std::uint8_t dabFreqIndex() const noexcept;
/**
* @brief dabServiceId — read optional DAB service id for play().
*
* @dname dabServiceId
* @return Service id when stored, otherwise empty.
* @pubstate reads dabServiceId_.
*/
[[nodiscard]] std::optional<std::uint32_t> dabServiceId() const noexcept;
/**
* @brief dabComponentId — read optional DAB component id for play().
*
* @dname dabComponentId
* @return Component id when stored, otherwise empty.
* @pubstate reads dabComponentId_.
*/
[[nodiscard]] std::optional<std::uint32_t> dabComponentId() const noexcept;
/**
* @brief fmFrequency — read FM centre frequency when band is Fm.
*
* @dname fmFrequency
* @return Frequency when stored, otherwise empty.
* @pubstate reads fmFrequency_.
*/
[[nodiscard]] std::optional<FrequencyKHz> fmFrequency() const noexcept;
/**
* @brief presetSlot — read optional hardware preset button slot.
*
* @dname presetSlot
* @return Preset slot when assigned, otherwise empty.
* @pubstate reads presetSlot_.
*/
[[nodiscard]] std::optional<PresetSlot> presetSlot() const noexcept;
/**