Stato di partenza prima dei fix. Il repo git era inizializzato a meta' (config.lock + objects/ mancante, zero commit): riparato. my_config.h (UID reale, tutti e 3 i sottoprogetti) escluso via .gitignore; aggiunto my_config.h.example. .pio/ escluso. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.3 KiB
Backpack Emulator — bench Tier 3 per 02_telemetry_bridge
ESP32-S3 che spedisce via ESP-NOW pacchetti sintetici identici (per
formato) a quelli del TX Backpack ELRS reale, verso l'UID del ricevitore
sotto test. Permette di validare 02_telemetry_bridge (o 01_telemetry_reader)
senza aereo, GPS o radio ELRS: bastano le due board collegate via USB sullo
stesso banco.
Perché esiste
I Tier 0–2 della suite di test (pio check, unit test nativi su lib/Ltm,
unit test on-device su lib/EspNowCrsf e sul path di decodifica CRSF)
verificano la logica in isolamento. Il Tier 3 chiude il cerchio: due board
reali, ESP-NOW vero, stesso firmware di produzione sul ricevitore.
Formato del pacchetto
Identico a quello del backpack reale (vedi lib/EspNowCrsf/EspNowCrsf.cpp sul
ricevitore):
[0..7] header 8 byte (contenuto ignorato dal parser del ricevitore)
[8..] frame CRSF grezzo: sync(0xC8) len type payload... crc
Il CRC è calcolato con lo stesso CRC8 (poly 0xD5) usato da terseCRSF, quindi
i frame sono validi byte-per-byte, non solo "abbastanza buoni da passare il
parser".
Cosa manda
Cicla ogni 250 ms tra 5 frame CRSF, con payload identici ai vettori già
verificati in 02_telemetry_bridge/test/test_embedded_crsf_decode/test_decode.cpp:
| Tipo | ID | Valori attesi sul ricevitore (modo HUMAN) |
|---|---|---|
| GPS | 0x02 | lat 45.46421, lon 9.19, alt 152 m, sat 11 |
| BATTERY | 0x08 | 16.4 V, 1.2 A, 78% |
| ATTITUDE | 0x1E | pitch 9.998°, roll -5.002°, yaw 330° |
| LINK | 0x14 | RSSI -52dBm ant1, LQ 100%, SNR -9dB |
| FLIGHTMODE | 0x21 | "ACRO" |
Ogni 8 invii (~2s) manda anche un keep-alive (header + 2 byte a zero), per
esercitare il filtro anti-keep-alive su hardware reale e non solo nel test
unitario (regressione del bug off-by-one corretto in EspNowCrsf.cpp).
Confrontando i valori stampati dal ricevitore con la tabella sopra si valida in un colpo il path completo: ESP-NOW → ring buffer → filtro keep-alive → decode CRSF → dashboard.
Setup
src/my_config.h→TARGET_UIDdeve essere lo stesso UID configurato in02_telemetry_bridge/src/my_config.h(o01_telemetry_reader) sulla board ricevitrice sotto test. Non serve la bind phrase reale: è solo l'indirizzo a cui spedire.- Collega l'ESP32-S3 (qui: COM7) e l'ESP32 ricevitore (qui: COM4) allo stesso PC, due porte separate.
- Flasha il ricevitore in modo HUMAN (così vedi i valori decodificati) o CRSF_DUMP (per vedere i frame grezzi).
- Build → Upload → Monitor su questa cartella (115200).
- Confronta l'output del ricevitore con la tabella sopra.
Struttura del codice
platformio.ini
src/
main.cpp # init ESP-NOW + invio ciclico GPS/BATTERY/ATTITUDE/LINK/FLIGHTMODE + keep-alive
my_config.h # TARGET_UID -- DA COMPILARE (stesso UID del ricevitore)
Limiti
Emula solo il formato del pacchetto, non l'intero stack ELRS (niente link
budget, niente vera bind phrase, niente canale/RF reale oltre a ESP-NOW su
canale 1). Per la validazione con catena RF completa serve comunque la radio
ELRS configurata con Telemetry = ESPNOW e l'UID reale dalla bind phrase.