Add internet radio streaming with runtime API, modernize web UI, remove auto-tune/beep at boot

Streaming (main feature this session):
- New WebRadioConfig/WebRadioJson core types, ISecureStore-backed persistence
- New webradio::WebRadioService (thread-safe live config) + GET/POST /api/streaming
- web_radio_stream task now runtime-toggleable (no reboot), no hardcoded URL
- Content-Type diagnostic: warns clearly when a URL is a webpage, not an audio stream

Boot cleanup:
- Removed boot-time auto FM/DAB tune, auto-beep, and the (now-concluded) Si4684
  crystal IBIAS/CTUN empirical sweep from main.cpp — tuning/beep are on-demand
  via the existing REST API only

Web UI:
- Modernized styling (cards, gradients, toggle switches, light/dark theme)
- New Stream tab wired to /api/streaming

Fixes found via real idf.py build (not just clangd):
- Restored wrongly-removed si4684/Si4684Tuner.hpp include in main.cpp
- Fixed MP3Decode() argument types in web_radio_stream.cpp (unsigned char**/int*)

Quality-gate fixes:
- Host-test stub headers (esp_log.h, freertos/*) so TunerService.cpp's
  scanForStation logging/pacing compiles for station_service_test /
  integration_service_test instead of running stale binaries
- Added WifiScanner and WebRadioService manual sections; filled in missing
  Doxygen docs on BluetoothService, i2s_sdata_probe, test_firmware, Bt1035At
- Ignore clangd's .cache/ index directory

Also includes prior uncommitted work carried in the tree: Wi-Fi/Bluetooth
device scan REST API and UI (WifiScanner, BT scan), SigmaStudio TCP bridge,
and the current ADAU1701 SigmaStudio DSP program export.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 21:15:22 +02:00
co-authored by Claude Sonnet 5
parent 8a8523515d
commit 6f7b6dd12c
131 changed files with 20309 additions and 1702 deletions
@@ -0,0 +1,10 @@
# Documentazione Integrazione FSC-BT1035 - Sistema DigiRadio
## 1. Introduzione
Il modulo FSC-BT1035 (basato su chipset Qualcomm QCC3056) è un modulo Bluetooth Dual-Mode. Nell'ecosistema DigiRadio, agisce come bridge wireless per l'audio e i dati seriali (SPP/GATT).
## 2. Architettura di Sistema
Il modulo si collega al controller principale DigiRadio tramite:
- **UART (Baudrate 115200 8N1)**: Comando e controllo tramite AT Commands.
- **Audio Interface**: Uscita differenziale (SPK_P/N) per il sistema di amplificazione o I2S per processori DSP esterni (come l'ADAU1701 presente nel vostro sistema).
- **Controllo Hardware**: Pin `SYS_CTRL` per il Power-On e `RESET` per il riavvio hardware.
@@ -0,0 +1,16 @@
# Configurazione e Setup del Modulo
## 1. Parametri di Default
- **Nome BR/EDR**: FSC-BT1035
- **Nome LE**: FSC-BT1035-LE
- **Baudrate**: 115200
## 2. Inizializzazione via UART
Al boot, inviare i comandi per impostare l'ambiente:
1. `AT+RESTORE`: (Opzionale) Ripristina impostazioni di fabbrica.
2. `AT+PROFILE=BITMASK`: Selezionare i profili necessari (Somma i valori binari: SPP=1, GATT_S=2, A2DP_S=32). Esempio: `AT+PROFILE=33` (SPP+A2DP).
3. `AT+NAME=DigiRadio_V1,0`: Imposta nome dispositivo senza suffisso MAC.
4. `AT+REBOOT`: Applicare i cambiamenti.
## 3. Verifica stato
Monitorare il pin `LEDO` (Pin 17) che indica lo stato di pairing (onda quadra durante scanning, alto a connessione stabilita).
@@ -0,0 +1,16 @@
# Riferimento Rapido Comandi AT
## Comandi Generali
- `AT+VER`: Query versione firmware (es: `+VER=BT1035,V2.6.1...`).
- `AT+ADDR`: Lettura MAC Address (necessario per pairing forzato).
- `AT+STAT`: Query globale stati profili (DEV, SPP, GATT, HFP, A2DP, AVRCP).
## Audio e Connessione
- `AT+A2DPCONN=[MAC]`: Connessione a specifica sorgente.
- `AT+A2DPAUDIO=1`: Apre flusso audio.
- `AT+SPPSEND=[LEN],[DATA]`: Invio dati via SPP (max payload 236 byte).
## Eventi Asincroni
Il modulo risponde con eventi preceduti da `+`. Esempi:
- `+SPPDATA=[LEN],[PAYLOAD]`: Ricezione dati seriali.
- `+A2DPSTAT=4`: Streaming A2DP attivo.
@@ -0,0 +1,10 @@
# Note Hardware per DigiRadio
## 1. Gestione Alimentazione
- **VCHG/VBAT**: Il modulo supporta ingressi da 3.0V a 4.2V.
- **SYS_CTRL**: Richiede un impulso di >20ms per avviare il power-up da stato DORMANT/OFF.
## 2. Integrazione ADAU1701 (DSP)
Se il DigiRadio utilizza l'ADAU1701 come processore audio:
- Collegare le uscite `SPK_P/N` del modulo agli ingressi analogici dell'ADAU1701 (tramite filtro passivo come descritto nel datasheet ADAU1701).
- In alternativa, utilizzare l'interfaccia I2S (Pin 4-7 del BT1035) per un collegamento digitale diretto, garantendo che i clock (BCLK, LRCLK) siano configurati in modalità coerente (BT1035 come Master/Slave a seconda del setup dell'ADAU).
@@ -0,0 +1,6 @@
# Diagnostica e Risoluzione Problemi
1. **Modulo non risponde**: Verificare i livelli logici RX/TX. Il modulo BT1035 richiede TX e RX stabili. Controllare se il Pin `SYS_CTRL` è alto.
2. **Audio distorto**: Verificare che l'impedenza di carico sui pin `SPK_P/N` sia conforme e che il volume digitale (`AT+SPKVOL`) non sia in clipping.
3. **Mancato Pairing**: Verificare `AT+PAIR=1`. Assicurarsi che il modulo non sia già connesso a un altro dispositivo.
4. **Terminazione Comandi**: Ogni comando deve terminare con `0x0D` (CR) e `0x0A` (LF).
@@ -0,0 +1,13 @@
# Manuale di Integrazione Hardware FSC-BT1035
## 1. Architettura di Connessione
Il modulo FSC-BT1035 deve essere integrato seguendo rigorosamente le indicazioni di Feasycom per evitare degrado del segnale RF:
- **Pin 34 (SYS_CTRL)**: Richiede un segnale di accensione (>20ms). È consigliato un circuito di controllo tramite il controller DigiRadio.
- **Pin 16 (BT_RTS/PIO2)**: Utilizzato nativamente per il MUTE degli stadi di potenza. Integrare questa funzione nel sistema di amplificazione del DigiRadio.
- **Audio I/O**: Le uscite `SPK_P/N` sono differenziali. Per il collegamento al DSP ADAU1701:
- Utilizzare uno stadio di ingresso con op-amp (es. AD8608 come da datasheet ADAU1701) per convertire il segnale differenziale in singolo (o mantenere il bilanciamento se l'ingresso DSP lo permette).
- Impedenza: Assicurarsi di rispettare i filtri RC per il passaggio basso (corner 50kHz) per eliminare il noise del codec Bluetooth.
## 2. Note di Layout (Critiche)
- **Clearance Antenna**: Rispettare rigorosamente l'area di "Keep Out" (5mm clearance) attorno all'antenna PCB integrata, come indicato nel documento `FSC-BT1035 Datasheet` (sezione 9).
- **Grounding**: Utilizzare una via stitching densa attorno al modulo per connettere i piani di massa e prevenire leakage RF nel PCB del DigiRadio.
@@ -0,0 +1,12 @@
# Guida alla Configurazione Firmware
## 1. Analisi file DigiRadio.params
Il file `DigiRadio.params` analizzato suggerisce parametri di inizializzazione specifici per l'interfacciamento del modulo. Durante il boot, il controller DigiRadio deve:
1. Inviare `AT+VER` per identificare la versione del modulo (es. V2.6.1).
2. Caricare i profili: `AT+PROFILE=341` (combinazione SPP, GATT Server, GATT Client, A2DP Source, ecc.).
3. Configurare la modalità I2S se il flusso audio è digitale (`AT+I2SCFG`):
- Impostare `Param=67` per I2S Slave, 48kHz, 32-bit (o come richiesto dall'ADAU1701).
## 2. Gestione Profili
Il modulo supporta le topologie miste. È possibile mantenere simultaneamente una connessione A2DP (Audio Source) e una GATT (Data).
- Nota: Per il passaggio tra le modalità, interrogare sempre lo stato tramite `AT+STAT` prima di tentare nuove connessioni.
@@ -0,0 +1,13 @@
# Deep Dive Comandi AT e Gestione Eventi
## 1. Protocollo Comunicazione
Il modulo risponde in formato ASCII. Ogni stringa inizia con `
` (0x0D 0x0A).
- Esempio Parsing:
Se il controller riceve `+SPPDATA=10,ABCDEFGHIJ`, il parser deve estrarre il valore `10` come lunghezza e gestire il buffer dei successivi 10 caratteri.
## 2. Throughput Mode (TPMODE)
Per applicazioni ad alto volume dati (es. aggiornamento firmware del DigiRadio via Bluetooth):
1. Inviare `AT+TPMODE=1`.
2. A questo punto, il modulo cessa di interpretare i comandi AT e inoltra ogni byte ricevuto sulla UART direttamente nel link radio (SPP/GATT).
3. Per tornare in modalità comando, è necessario inviare una sequenza di escape definita nel firmware o resettare il modulo.
@@ -0,0 +1,11 @@
# Integrazione DSP ADAU1701
Il collegamento BT1035 -> ADAU1701 può avvenire in due modi:
1. **Digitale (I2S)**:
- BT1035 (Master/Slave) -> SDATA_IN0 (ADAU1701).
- Configurazione ADAU: Impostare `MP4/MP5` come ingressi I2S (LRCLK/BCLK).
- Assicurarsi che il sample rate del modulo Bluetooth (`AT+I2SCFG`) corrisponda al clock configurato nell'ADAU tramite il software SigmaStudio.
2. **Analogico**:
- Uscite differenziali BT1035 (`SPK_P/N`) -> ingressi ADC `ADC0/1`.
- Utilizzare il filtro passivo di ricostruzione consigliato dal datasheet dell'ADAU1701 (50kHz corner) per evitare aliasing dovuto al campionamento del DAC interno del Bluetooth.
@@ -0,0 +1,8 @@
# Mapping Risorse DigiRadio
Analisi dei file del progetto DigiRadio:
- `DigiRadio_IC_1.h`: Mappatura dei registri del controller per il modulo IC.
- `DigiRadio_IC_1_REG.h`: Definizione dei registri di configurazione (probabilmente relativi alla configurazione I2C del modulo Bluetooth).
- `DigiRadio.xml`: Descriptor di sistema utilizzato dal software di configurazione/test del progetto DigiRadio.
Il modulo BT1035 deve essere mappato nell'indirizzo di registro 0x68 (default I2C) se il controller agisce come master I2C sul bus del modulo. Verificare che il pin `ADDRO` sia configurato correttamente in base alla netlist fornita.