Enable DAB_EVENT_INTERRUPT_SOURCE (0xB300) so SVRLISTINT can ever fire
Retesting DAB service-list retrieval later the same night (after the service-list body-parsing fix and antenna calibration work) found it far less reliable than the earlier confirmation: locked with excellent FIC quality (97-100) but GET /api/tuner/services kept returning service_list_empty for 30-65+ seconds. readDabEventStatus()'s SVRLISTINT bit is gated by AN649 Property 0xB300 DAB_EVENT_INTERRUPT_SOURCE, bit0=SRVLIST_INTEN, default 0x0000 (disabled) at power-on — never written anywhere in this driver. configureAfterBoot()'s DAB branch already writes a similarly-named DIGITAL_SERVICE_INT_SOURCE (property 0x8100), but AN649's own text for 0x8100 is internally inconsistent between its prose and its bit table (VHFCAPS/VHFSW, a front-end switch field) — almost certainly a pdftotext -raw extraction artifact merging two adjacent property tables, the same failure mode already logged this session for AN649/adau1701.pdf extraction. Only 0xB300's own section reads internally consistent with its own prose, so it — not 0x8100 — is the one that actually gates SVRLISTINT. Verified live: the service list came back complete and correct (22 real station labels) on the next test after reflashing. Not proven conclusively faster than before given DAB acquisition timing is inherently variable and this was only tested once post-fix, but the property write is unambiguously correct per its own AN649 section regardless. Also logged, NOT fixed: intermittent multi-second HTTP unresponsiveness (connection timeouts even on /api/health) observed independent of this change, both before and after — heartbeat kept logging on schedule throughout so the system didn't crash, only the HTTP server (or something it was blocking on, most likely a Si4684 SPI/CTS wait) stalled and recovered on its own. Root cause not yet found; details and next-session candidates in docs/si4684-rf-investigation-report.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178rASQ6ZETPMUamvpoR2KR
This commit is contained in:
@@ -85,6 +85,7 @@ constexpr std::uint16_t kPropDabTuneFeCfg = 0x1712U;
|
||||
constexpr std::uint16_t kPropFmTuneFeCfg = 0x1712U;
|
||||
constexpr std::uint16_t kPropDabXpadEnable = 0xB400U;
|
||||
constexpr std::uint16_t kPropDigitalServiceIntSource = 0x8100U;
|
||||
constexpr std::uint16_t kPropDabEventIntSource = 0xB300U;
|
||||
/** AN649 INT_CTL_ENABLE / INT_CTL_REPEAT — route STC to INTB until STCACK. */
|
||||
constexpr std::uint16_t kPropIntCtlEnable = 0x0000U;
|
||||
constexpr std::uint16_t kPropIntCtlRepeat = 0x0001U;
|
||||
@@ -504,6 +505,15 @@ std::expected<void, Si4684Error> Si4684Driver::configureAfterBoot(
|
||||
ESP_LOGW(kTag, "DIGITAL_SERVICE_INT_SOURCE (0x8100) failed");
|
||||
return dsrv;
|
||||
}
|
||||
// AN649 Property 0xB300 DAB_EVENT_INTERRUPT_SOURCE, bit0=SRVLIST_INTEN
|
||||
// (default 0x0000 = disabled at power-on). Without this, nothing in
|
||||
// this driver ever enables the service-list-ready event, so
|
||||
// fetchDabServiceList() can stay gated behind an eternally-false
|
||||
// serviceListReady even on a clean, well-locked ensemble.
|
||||
if (auto evt = setProperty(kPropDabEventIntSource, 0x0001U); !evt) {
|
||||
ESP_LOGW(kTag, "DAB_EVENT_INTERRUPT_SOURCE (0xB300) failed");
|
||||
return evt;
|
||||
}
|
||||
} else {
|
||||
// FM varactor cal per hitech95/uGreen DTS (not DAB PE5PVB values).
|
||||
static constexpr std::uint16_t kFmFeProps[][2] = {
|
||||
|
||||
Reference in New Issue
Block a user