Bollettini, Oggetti e Item#
Due sottosistemi permettono alla stazione di trasmettere annunci permanenti e
punti mappa con nome propri. Entrambi mantengono il proprio stato in file
LittleFS dedicati invece che in g_config, per mantenere piccola la
configurazione residente, ed entrambi sono azionati dal pianificatore di beacon
condiviso.
Bollettini#
main/bulletins.c trasmette fino a cinque bollettini APRS. Ogni bollettino
ha:
il proprio testo,
un identificatore e un nome di gruppo del destinatario,
un’abilitazione RF e/o APRS-IS,
un intervallo iniziale di trasmissione, con una rampa di decadimento opzionale: una cadenza lenta e il rapporto per cui viene moltiplicato l’intervallo dopo ogni trasmissione,
una finestra opzionale di «scadi dopo N ore».
Identificatore e gruppo insieme selezionano quale delle tre forme di destinatario definite dal capitolo 14 di APRS101 va in onda:
Forma |
Destinatario |
Quando |
|---|---|---|
Bollettino generale |
|
Identificatore |
Bollettino di gruppo |
|
Identificatore |
Annuncio |
|
Identificatore |
bulletins_build_addressee() normalizza mentre costruisce, così nulla che il
campo destinatario di 9 caratteri non possa portare arriva in onda: un
identificatore fuori da 0–9/A–Z ricade sulla cifra dello slot
stesso, il nome del gruppo viene reso maiuscolo e privato di tutto ciò che non è
A–Z/0–9, e un identificatore di annuncio sopprime del tutto il
gruppo.
Il capitolo 14 descrive un bollettino come ripetuto spesso nella sua prima ora e poi via via meno nelle ore successive, e un annuncio come ripetuto molto più lentamente ancora. Ogni slot porta quel diradamento come una rampa di decadimento sopra il proprio intervallo iniziale: dopo ogni trasmissione l’intervallo vivo viene moltiplicato per il rapporto di decadimento dello slot finché non raggiunge la sua cadenza lenta, dove si mantiene. Un bollettino inviato ogni dieci minuti con un rapporto di 2.0 e una cadenza lenta di due ore esce così tre volte nella prima ora e si assesta sulle due ore, il che raggiunge lo stesso pubblico con una frazione del tempo d’antenna su un canale condiviso.
Lasciare la cadenza lenta a 0, o il rapporto sotto 1.0, mantiene l’intervallo piatto, che è anche come si comporta un bollettino memorizzato che non porta nessuno dei due campi. La rampa è stato di esecuzione e non configurazione: non viene persistita, e un riavvio o qualsiasi modifica allo slot la fa ripartire dall’intervallo iniziale, così un bollettino riscritto o ritemporizzato torna a farsi sentire subito invece che alla spaziatura a cui era decaduto il testo precedente.
La scadenza e la rampa sono complementari. La rampa dirada le ripetizioni
mentre il bollettino è attuale; la scadenza decide quando smette di esserlo. Un
bollettino scaduto pulisce automaticamente il suo flag di abilitazione ed esce
dall’onda. I bollettini persistono nel proprio /storage/bulletins.json. La
pagina è condizionata dall’interruttore di compilazione ENABLE_BULLETINS.
Anche un bollettino che questa stazione trasmette viene consegnato al bot Telegram, alle stesse condizioni di uno sentito da un’altra stazione, così gli operatori che leggono il bot vedono gli annunci della stazione accanto a quelli di tutti gli altri. Lo governa l’interruttore «Inoltra bollettini» della pagina Telegram; vedi Bot Telegram.
Nota
I radiogrammi NTS, descritti anch’essi nel capitolo 14, sono un formato di messaggio per il traffico e non una forma di destinatario di bollettino, e non vengono prodotti qui.
Oggetti e Item#
main/objects_items.c trasmette fino a cinque Oggetti/Item APRS, ciascuno con:
un nome, posizione e simbolo,
rotta/velocità e commento opzionali,
un’abilitazione RF e/o APRS-IS,
un intervallo di ripetizione con decadimento dell’intervallo opzionale,
un controllo di Tipo: Oggetto (con timestamp,
;) oppure Item (senza timestamp,)).
Uccidere un oggetto lo trasmette qualche volta in più (così che gli
ascoltatori lo rimuovano dalle loro mappe), poi lo disabilita automaticamente.
Gli oggetti/item persistono nel proprio /storage/objitems.json. La pagina è
condizionata dall’interruttore di compilazione ENABLE_OBJECTS_ITEMS.
Oggetti di area#
Un elemento il cui simbolo è il simbolo di area (\\l, la lettera L
minuscola della tabella alternativa) disegna una figura sulla mappa ricevente
invece di un punto. Lo slot di estensione dati da 7 byte porta allora il
descrittore Tyy/Cxx del capitolo 11 di APRS101 anziché rotta/velocità:
forma — una delle dieci cifre: cerchio, linea giù/destra, ellisse, triangolo, riquadro, e poi il cerchio pieno, la linea giù/sinistra, l’ellisse piena, il triangolo pieno e il riquadro pieno,
colore — da 0 a 15. I valori da dieci in su sostituiscono la barra con un
1e scrivono la cifra delle unità, così il campo misura sempre sette byte fissi,offset di latitudine e longitudine — la distanza in gradi dalla posizione riportata, che è l’angolo superiore sinistro della figura, fino al suo angolo inferiore destro (o al centro, nel caso di un cerchio).
Ogni offset viene trasmesso come codice di due cifre, la radice quadrata
dell’offset espresso in 1500-esimi di grado; il ricevitore lo recupera come
codice × codice ÷ 1500. La specifica usava in origine un fattore 100 ed è
stata corretta a 1500 da aprs.org/aprs11/areaobjects.txt, che è la scala
con cui decodificano le applicazioni attuali. Due cifre raggiungono quindi
6,534 gradi per asse, ed entrambi i campi di offset vengono limitati a quel
valore al salvataggio, così che il valore memorizzato e la figura trasmessa
descrivano sempre la stessa area.
Le due forme a linea possono inoltre dichiarare un corridoio: una fascia
della larghezza indicata in miglia su ciascun lato della linea, trasmessa come
token {www} in testa al testo del commento, esattamente dove la colloca
l’esempio della specifica stessa. Una larghezza pari a zero omette il token, e
il campo viene ignorato per le otto forme chiuse.
Oggetti permanenti#
Un Oggetto puo anche essere marcato come permanente. Un Oggetto permanente
viene trasmesso con il timestamp fittizio fisso 111111z definito da
freqspec.txt, invece dell’ora corrente DDHHMMz. Questa e la convenzione
raccomandata per gli oggetti di frequenza dei ripetitori voce e per annunci
ricorrenti simili di proprieta della stazione: una stazione ricevente
interpreta il timestamp 111111z come indicazione che l’Oggetto non deve
essere sostituito da un Oggetto omonimo di un’altra stazione, e che solo la
stazione di origine puo aggiornarlo o spostarlo.
La casella Permanente si applica solo a un Oggetto; non ha alcun effetto su un Item, che non porta mai un timestamp di alcun tipo.
Perché file JSON separati#
Entrambi i sottosistemi, come la telemetria, mantengono stato specifico della
pagina che ingrandirebbe significativamente l”app_config_t residente (e
quindi ogni salvataggio di configurazione, che gira contro un heap piccolo e
frammentato). Mantenerli nei propri file significa che la configurazione
residente resta leggera e che il salvataggio di ogni sottosistema tocca solo i
propri dati. Ogni file è scritto con lo stesso scrittore JSON a flusso, byte per
byte, usato dalla configurazione principale, sotto il proprio mutex, con un
setvbuf() esplicito così che newlib non allochi pigramente un grande buffer
stdio a metà scrittura su un heap frammentato.