From e7982401eec6b62b9b181ed7196fd2b3ac270685 Mon Sep 17 00:00:00 2001 From: Michele Bigi Date: Mon, 6 Jul 2026 15:16:02 +0000 Subject: [PATCH] Update on Overleaf. --- .../core/include/core/CompanionChipStatus.hpp | 33 +++++++++++++++++++ .../net/include/net/NetBootstrap.hpp | 4 ++- Software/components/net/src/NetBootstrap.cpp | 19 +++++++---- .../components/net/src/SetupWebServer.cpp | 30 ++++++++++++----- 4 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 Software/components/core/include/core/CompanionChipStatus.hpp diff --git a/Software/components/core/include/core/CompanionChipStatus.hpp b/Software/components/core/include/core/CompanionChipStatus.hpp new file mode 100644 index 0000000..7dc760f --- /dev/null +++ b/Software/components/core/include/core/CompanionChipStatus.hpp @@ -0,0 +1,33 @@ +/** + * @file CompanionChipStatus.hpp + * @brief Boot-ready flags for Si4684, ADAU1701, and FSC-BT1035. + * + * DigiRadio firmware — https://github.com/manvalan/DigiRadio + * + * Copyright 2026 Michele Bigi + * SPDX-License-Identifier: Apache-2.0 + * + * @author Michele Bigi + * @date 2026-07-06 + */ +#pragma once + +namespace core { + +/** + * @brief CompanionChipStatus — companion-chip boot snapshot for /api/health. + * + * @dname CompanionChipStatus + * @return n/a (type) + * @pubstate Immutable aggregate; all true after successful HardwareBootstrap. + * + * @author Michele Bigi + * @date 2026-07-06 + */ +struct CompanionChipStatus { + bool si4684Ready; ///< Si4684 HOST_LOAD completed. + bool adau1701Ready; ///< ADAU1701 SigmaStudio download completed. + bool bt1035Ready; ///< BT1035 Line-In init (AT+AUXCFG=1) completed. +}; + +} // namespace core diff --git a/Software/components/net/include/net/NetBootstrap.hpp b/Software/components/net/include/net/NetBootstrap.hpp index ad19e24..1cf473e 100644 --- a/Software/components/net/include/net/NetBootstrap.hpp +++ b/Software/components/net/include/net/NetBootstrap.hpp @@ -17,6 +17,7 @@ */ #pragma once +#include "core/CompanionChipStatus.hpp" #include "core/ISecureStore.hpp" #include "net/NetError.hpp" #include "net/NetState.hpp" @@ -65,7 +66,8 @@ public: */ [[nodiscard]] static std::expected start(core::ISecureStore& store, tuner::TunerService& tuner, - audio::AudioService& audio); + audio::AudioService& audio, + core::CompanionChipStatus companionChips); NetBootstrap(const NetBootstrap&) = delete; NetBootstrap& operator=(const NetBootstrap&) = delete; diff --git a/Software/components/net/src/NetBootstrap.cpp b/Software/components/net/src/NetBootstrap.cpp index f240f35..dda0bf5 100644 --- a/Software/components/net/src/NetBootstrap.cpp +++ b/Software/components/net/src/NetBootstrap.cpp @@ -100,7 +100,8 @@ constexpr char kTag[] = "NetBootstrap"; */ [[nodiscard]] std::expected startSetupMode(core::ISecureStore& store, tuner::TunerService& tuner, - audio::AudioService& audio) + audio::AudioService& audio, + core::CompanionChipStatus companionChips) { esp_netif_create_default_wifi_ap(); @@ -111,7 +112,8 @@ startSetupMode(core::ISecureStore& store, tuner::TunerService& tuner, SetupWebServer webServer; if (auto webResult = - webServer.start(store, NetState::SoftApSetup, tuner, audio); + webServer.start(store, NetState::SoftApSetup, tuner, audio, + companionChips); !webResult) { return std::unexpected(webResult.error()); } @@ -134,7 +136,8 @@ startSetupMode(core::ISecureStore& store, tuner::TunerService& tuner, */ [[nodiscard]] std::expected startStaMode(core::ISecureStore& store, tuner::TunerService& tuner, - audio::AudioService& audio) + audio::AudioService& audio, + core::CompanionChipStatus companionChips) { auto credsResult = store.loadWifiCredentials(); if (!credsResult) { @@ -151,7 +154,8 @@ startStaMode(core::ISecureStore& store, tuner::TunerService& tuner, SetupWebServer webServer; if (auto webResult = - webServer.start(store, NetState::StaConnected, tuner, audio); + webServer.start(store, NetState::StaConnected, tuner, audio, + companionChips); !webResult) { return std::unexpected(webResult.error()); } @@ -165,7 +169,8 @@ startStaMode(core::ISecureStore& store, tuner::TunerService& tuner, std::expected NetBootstrap::start(core::ISecureStore& store, tuner::TunerService& tuner, - audio::AudioService& audio) + audio::AudioService& audio, + core::CompanionChipStatus companionChips) { if (auto platform = initPlatform(); !platform) { return std::unexpected(platform.error()); @@ -176,14 +181,14 @@ NetBootstrap::start(core::ISecureStore& store, tuner::TunerService& tuner, } if (store.hasWifiCredentials()) { - auto staResult = startStaMode(store, tuner, audio); + auto staResult = startStaMode(store, tuner, audio, companionChips); if (staResult) { return staResult; } ESP_LOGW(kTag, "STA join failed — falling back to setup SoftAP"); } - return startSetupMode(store, tuner, audio); + return startSetupMode(store, tuner, audio, companionChips); } NetBootstrap::NetBootstrap(std::optional softAp, diff --git a/Software/components/net/src/SetupWebServer.cpp b/Software/components/net/src/SetupWebServer.cpp index 7cbb1ec..2cdbbca 100644 --- a/Software/components/net/src/SetupWebServer.cpp +++ b/Software/components/net/src/SetupWebServer.cpp @@ -20,6 +20,7 @@ #include "core/AudioProfile.hpp" #include "core/AudioProfileJson.hpp" +#include "core/CompanionChipStatus.hpp" #include "core/FirmwareVersion.hpp" #include "core/HealthStatus.hpp" #include "core/HealthStatusJson.hpp" @@ -44,7 +45,7 @@ namespace net { namespace { constexpr char kTag[] = "SetupWebServer"; -constexpr char kFirmwareVersion[] = "0.5.0"; +constexpr char kFirmwareVersion[] = "0.6.0"; constexpr unsigned kRebootDelaySec = 3; extern const uint8_t www_index_html_gz_start[] asm( @@ -165,8 +166,17 @@ template */ esp_err_t healthGetHandler(httpd_req_t* req) { - const core::HealthStatus status = - core::HealthStatus::ok(core::FirmwareVersion(kFirmwareVersion)); + auto* ctx = routeContextFrom(req); + const core::CompanionChipStatus chips = + ctx != nullptr + ? ctx->companionChips + : core::CompanionChipStatus{ + .si4684Ready = false, + .adau1701Ready = false, + .bt1035Ready = false, + }; + const core::HealthStatus status = core::HealthStatus::ok( + core::FirmwareVersion(kFirmwareVersion), chips); const std::string json = core::serializeHealthStatusJson(status); httpd_resp_set_type(req, "application/json"); return httpd_resp_send(req, json.c_str(), json.size()); @@ -622,7 +632,7 @@ SetupWebServer::SetupWebServer() , netState_(NetState::Uninitialized) , tuner_(nullptr) , audio_(nullptr) - , routeContext_{nullptr, nullptr, nullptr} + , routeContext_{nullptr, nullptr, nullptr, {}} { } @@ -639,7 +649,7 @@ SetupWebServer::SetupWebServer(SetupWebServer&& other) noexcept other.netState_ = NetState::Uninitialized; other.tuner_ = nullptr; other.audio_ = nullptr; - other.routeContext_ = {nullptr, nullptr, nullptr}; + other.routeContext_ = {nullptr, nullptr, nullptr, {}}; } SetupWebServer& SetupWebServer::operator=(SetupWebServer&& other) noexcept @@ -659,7 +669,7 @@ SetupWebServer& SetupWebServer::operator=(SetupWebServer&& other) noexcept other.netState_ = NetState::Uninitialized; other.tuner_ = nullptr; other.audio_ = nullptr; - other.routeContext_ = {nullptr, nullptr, nullptr}; + other.routeContext_ = {nullptr, nullptr, nullptr, {}}; } return *this; } @@ -670,14 +680,15 @@ SetupWebServer::~SetupWebServer() httpd_stop(server_); server_ = nullptr; } - routeContext_ = {nullptr, nullptr, nullptr}; + routeContext_ = {nullptr, nullptr, nullptr, {}}; } std::expected SetupWebServer::start( core::ISecureStore& store, NetState netState, tuner::TunerService& tuner, - audio::AudioService& audio) + audio::AudioService& audio, + core::CompanionChipStatus companionChips) { if (server_ != nullptr) { return {}; @@ -690,6 +701,7 @@ std::expected SetupWebServer::start( routeContext_.store = &store; routeContext_.tuner = &tuner; routeContext_.audio = &audio; + routeContext_.companionChips = companionChips; httpd_config_t config = HTTPD_DEFAULT_CONFIG(); config.server_port = 80; @@ -697,7 +709,7 @@ std::expected SetupWebServer::start( if (httpd_start(&server_, &config) != ESP_OK) { ESP_LOGE(kTag, "httpd_start failed"); - routeContext_ = {nullptr, nullptr, nullptr}; + routeContext_ = {nullptr, nullptr, nullptr, {}}; return std::unexpected(NetError::HttpServerStartFailed); }