Telemetria#
Il sottosistema telemetry (main/telemetry.c) raccoglie canali analogici e
digitali dal registro sensors_local e trasmette come beacon un report di dati
di telemetria APRS standard (T#nnn) in RF e/o APRS-IS, insieme ai messaggi di
metadati PARM/UNIT/EQNS/BITS che etichettano quei canali per le stazioni
riceventi. Rispecchia lo schema usato dal sottosistema meteo, ma per la
telemetria.
Archiviazione separata#
A differenza della maggior parte delle impostazioni, la configurazione di
telemetria deliberatamente non vive in g_config. Persiste
nel suo piccolo file LittleFS, /storage/telemetry.json, allo stesso modo in
cui bollettini e oggetti/item mantengono i propri file. Al primo avvio, o quando
il file manca, viene creato un insieme vuoto predefinito così che
/storage/telemetry.json esista sempre una volta che il sottosistema è
avviato. Lo schema completo è telemetry_config_t
(main/include/telemetry.h).
Canali#
Secondo il capitolo 13 di APRS101, un report di telemetria porta:
5 canali analogici
A1–A5(TLM_CH = 5).8 bit digitali
B1–B8(TLM_BIT_NUM = 8).
Ogni canale analogico ha un flag di abilitazione, un indice di canale di sensore
di origine (tlm_ana_channel[], 0xFF = nessuno), una calibrazione
quadratica (valore = a·x² + b·x + c), un intervallo di ingresso grezzo
atteso che limita il valore trasmesso, e un numero di decimali. Ogni bit digitale ha un flag di abilitazione, un
canale di origine, un senso (Normale / Invertito), instradamento RF/INET per bit,
e un’etichetta orientata all’operatore usata nel messaggio BITS.
Cosa va in onda#
build_tlm_data_packet() (in telemetry.c) risolve ogni canale mappato dal
registro (via sensors_local_save_one()) una volta al secondo e codifica il
report di dati periodico:
T#sss,a1,a2,a3,a4,a5,bbbbbbbb
I campi analogici portano la lettura grezza del sensore, limitata
all’intervallo grezzo dichiarato del canale e scritta con la larghezza di campo
e i decimali per canale; gli otto caratteri b sono i bit digitali. La
calibrazione non viene applicata qui: APRS101 separa il report dai metadati,
quindi il messaggio EQNS. porta i coefficienti a/b/c e ogni stazione
ricevente ricava da sé il valore ingegneristico. Il report non porta mai
nomi di canale — secondo la specifica APRS, nomi, unità ed equazioni viaggiano
separatamente.
L’intervallo grezzo dichiarato vale per impostazione predefinita 0–1023, una campata di ADC a 10 bit, e si applica a entrambe le larghezze di campo. Un canale la cui sorgente legge fuori da quella campata ha bisogno che l’intervallo venga allargato, altrimenti il valore trasmesso resta fissato al bordo della campata dichiarata. Un intervallo invertito o vuoto non dichiara nulla e viene ignorato, lasciando solo il limite imposto dalla larghezza di campo scelta (000–999 per la forma a tre cifre, nessuno per la forma decimale libera).
I messaggi di metadati#
A una cadenza più lenta (info_interval), il modulo emette i messaggi di
definizione come messaggi APRS diretti alla propria stazione:
:MYCALL :PARM.<nomi analogici>,<nomi dei bit>
:MYCALL :UNIT.<unità analogiche>,<etichette di stato-attivo dei bit>
:MYCALL :EQNS.<a,b,c per canale analogico>
:MYCALL :BITS.<mappa di bit di senso>,<titolo del progetto>
La generazione di ciascuno è commutabile individualmente (gen_parm,
gen_unit, gen_eqns, gen_bits).
Una riga che non entra — più lunga di APRS_TNC2_MAX_LEN, il testo più lungo
che il modem può codificare in una trama AX.25 — viene rifiutata invece che
troncata, e nessuna delle due tratte la trasmette. Questo conta soprattutto per
i messaggi di definizione: un coefficiente tagliato a metà numero lascia una
riga EQNS. che ogni ricevitore continua a leggere come ben formata, e
ciascuno di essi applica allora una calibrazione diversa alle letture grezze di
questa stazione finché quella definizione resta in piedi. L’avviso nel log
nomina il campo da accorciare.
Parametri del report#
La configurazione porta anche opzioni di incapsulamento del capitolo 13 di
APRS101: un percorso di digipeater a testo libero (report_path), TOCALL di
destinazione (tocall), numero di sequenza auto-incrementante (auto_seq),
larghezza del campo analogico (field_width), un’opzione per omettere i canali
finali non usati (omit_trailing), un commento a testo libero in coda
(trail_comment), e il numero di canali analogici/digitali effettivamente
inviati (analog_count / digital_count).
report_path si applica solo alla trasmissione radio. La trasmissione via
APRS-IS di un rapporto di telemetria — dati e definizioni allo stesso modo —
porta TCPIP* come percorso completo, come la guida alla connessione di
aprs-is.net richiede al traffico
proprio di un client, quindi ogni tratta abilitata è costruita come una riga a
sé. I Messaggi di definizione escono in aria senza percorso di digipeater,
diretti, come sempre.
Impostare field_width a 3 riempie con zeri ogni valore analogico a tre
cifre, 000-999 - l’intervallo che APRS 1.2 consente per questo campo, esteso
rispetto alla finestra originale 000-255 di APRS101. Un canale la cui
stazione ricevente si aspetti ancora il vecchio intervallo 0-255 può essere
mantenuto al suo interno impostando di conseguenza ana_raw_min/
ana_raw_max di quel canale.
Telemetria nel commento (APRS 1.2 base-91)#
Accanto al report T#nnn, l’opzione Comment Telemetry
(comment_telemetry / cmtTlm) fa sì che
telemetry_build_comment_tlm() aggiunga una seconda codifica, compatta,
dello stesso campione al commento di posizione di una stazione:
|ss1122|
Il gruppo si apre e si chiude con |. La prima coppia base-91 è il numero
di sequenza; ogni coppia successiva è un canale analogico, in ordine (A1
per primo). Una coppia finale può portare l’intero banco digitale a 8 bit come
un unico numero, con il bit meno significativo pari a B1 e l’ottavo bit
pari a B8.
Non è una baliza a sé stante. Viaggia dentro il commento di posizione della baliza attualmente in trasmissione - Tracker, IGate o Digipeater - con il nominativo/SSID configurato nella pagina Telemetry; una baliza di posizione trasmessa con un nominativo/SSID diverso non riceve mai il gruppo, perché una stazione ricevente lo leggerebbe come la telemetria di quell’altra stazione. I report di stato, gli oggetti e gli item non lo portano mai: solo un report di posizione identifica un’unica stazione segnalante in modo abbastanza univoco perché il gruppo abbia senso.
Il numero di sequenza è lo stesso contatore usato dal report T#nnn, preso
dallo stesso istante di lettura dei canali, così i due non sono mai in
disaccordo su quale campione descrivono. La codifica base-91 dà a quel
contatore una finestra di 0-8280 (91×91 valori), che si azzera in modo
indipendente dal campo decimale 0-999 proprio del report.
Ogni coppia analogica viene emessa solo per un canale abilitato e attualmente risolto dal registro sensori, e solo finché lo sono anche tutti i canali precedenti nell’ordine A1-A5: il gruppo non ha un identificatore di canale per coppia, quindi una stazione ricevente ricava il canale di ogni valore solo dalla sua posizione nella sequenza. Il codificatore si ferma al primo vuoto invece di saltarlo, mantenendo il gruppo come un prefisso ininterrotto A1, A2, … An.
APRS 1.2 richiede che l’estensione porti il contatore di sequenza e almeno un
canale, quindi una stazione senza alcun canale analogico abilitato e risolto non
emette alcun gruppo invece di un |ss| vuoto. Un gruppo vuoto è una forma che
un parser rigoroso ha il diritto di rifiutare, e spenderebbe quattro byte del
budget del commento a ogni baliza senza portare nulla.
La coppia digitale è legale solo dopo tutte e cinque le coppie analogiche - con un gruppo più corto davanti, un ricevitore la leggerebbe come il canale analogico successivo - quindi viene emessa solo quando tutti i canali analogici sono risolti e il banco digitale è instradato con almeno un canale configurato. Il gruppo è una singola stringa aggiunta a un rapporto di posizione che esce sulle tratte usate da quella baliza, quindi non ha una forma propria per tratta: un canale digitale viaggia ogni volta che il banco e il canale sono instradati verso una delle due. Un canale che deve restare del tutto fuori onda va disabilitato nella pagina Telemetry anziché non instradato.
Un gruppo che non entra nel buffer di uscita proprio di
telemetry_build_comment_tlm() viene scartato invece che troncato - una
coppia base-91 troncata si decodifica come un valore sbagliato, non come uno
assente. Una volta risolto, i byte del gruppo (e quelli dell’estensione
!DAO! finale, se abilitata) vengono riservati prima del testo del
commento dell’operatore, cosicché un rapporto di posizione il cui commento
ecceda il campo tronca il commento, mai il gruppo di telemetria né
l’estensione DAO che lo segue.
All’interno del campo di testo del rapporto di posizione l’ordine di
emissione è fisso: blocco di frequenza (se presente), commento
dell’operatore, gruppo di telemetria nel commento e infine !DAO! (se
abilitato) - in accordo con il capitolo 13 di APRS101 e con la regola di
posizionamento propria dell’estensione DAO (aprs12/datum.txt). Questo
ordine vale sia per il formato non compresso sia per il Mic-E.
Selettori della pagina web#
La pagina Telemetry (page_tlm.c) riempie un menu a tendina Source per
ogni canale analogico e un menu a tendina Channel per ogni bit digitale dal
registro sensors_local in tempo reale, filtrato per i canali di telemetria
annunciati di ogni driver. I valori per canale in tempo reale sono mostrati
tramite /tlm/values. Vedi Il framework dei sensori.