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.