Passa al contenuto principale

Strumenti — CLI e viewer

Oltre alla libreria, il reactor Java include due applicazioni autonome: osf-cli — una riga di comando scriptabile per ispezionare, esportare e convertire file OSF — e osf-viewer — un viewer JavaFX che traccia molti canali contemporaneamente. Entrambi si basano esclusivamente sull'API pubblica della libreria (vedere Lettura e Scrittura) e ne sono al tempo stesso esempi completi.

Baseline: Java 21, reactor Maven. La build complessiva (mvn -f implementations/java/pom.xml package) genera entrambi gli strumenti in un unico passaggio; i dettagli sul reactor si trovano in Build.

osf-cli​

osf-cli è un'applicazione picocli con quattro sottocomandi. La classe di ingresso OsfCli registra info, channels, dump e convert; ogni comando dispone di -h/--help e -V/--version (da mixinStandardHelpOptions).

Build come JAR eseguibile​

Il modulo osf-cli viene riunito tramite il maven-shade-plugin in un JAR eseguibile autosufficiente (classe principale com.optimeas.osf.cli.OsfCli, finalName osf-cli):

mvn -f implementations/java/pom.xml -pl osf-cli -am package
java -jar implementations/java/osf-cli/target/osf-cli.jar --help

Lo shade JAR contiene la libreria OSF e picocli e funziona quindi senza ulteriore classpath. Per brevità, di seguito osf sta per java -jar …/osf-cli.jar.

info — metadati e panoramica dei canali​

osf info messung.osf

Carica il file (OSF4, OSF5 o OSFZ in modo trasparente) e visualizza formato, metadati del file, stato di compressione e una riga per ogni canale:

format: OSF5
creator: optiMEAS
created_utc: 2026-01-15T09:30:00Z
compressed: false
channels: 3
[0] temperature type=double mode=equidistant samples=10000 unit=°C
[1] status type=string mode=variable samples=42 unit=
[2] position type=gps_location mode=timestamped samples=500 unit=

La riga format: è OSF4 oppure OSF5; i metadati provengono invariati dal metablock (creator, created_utc, location, …); per gli input compressi compare compressed: true (gzip).

channels — tabella dei canali​

osf channels messung.osf --sort NAME

Visualizza una tabella allineata (colonne index, name, datatype, mode, samples, unit). --sort accetta INDEX (predefinito) oppure NAME:

index name datatype mode samples unit
------------------------------------------------------------------------------------------
0 temperature double equidistant 10000 °C
2 position gps_location timestamped 500
1 status string variable 42

dump — dati dei canali in CSV​

dump scrive i valori dei canali come CSV — per impostazione predefinita tutti i canali tracciabili (numerici + bool; i canali string/binary/gps vengono saltati).

OpzioneEffetto
--channel <name|index>Seleziona il canale per nome oppure per indice intero; ripetibile. Se omessa: tutti i canali tracciabili
--format <csv|unified-csv>csv (predefinito): un blocco per canale; unified-csv: un'unica tabella larga
--timestamp-format <…>DATETIME (predefinito), SECONDS, ISO8601, NANOSECONDS
--out <datei>Output su file anziché su stdout

Formati dei timestamp: DATETIME = uuuu-MM-dd HH:mm:ss.SSS (UTC, ms), SECONDS = secondi decimali con 9 cifre decimali, ISO8601 = uuuu-MM-dd'T'HH:mm:ss'Z', NANOSECONDS = numero intero grezzo di nanosecondi. I valori double interi vengono resi senza punto decimale (1 anziché 1.0).

CSV per canale (predefinito) — ogni blocco con intestazione # channel: e righe timestamp,value:

osf dump messung.osf --channel temperature --timestamp-format SECONDS
# channel: temperature
timestamp,value
0.000000000,21.5
0.001000000,21.6

CSV unificato — un'unica tabella larga con una riga per ogni timestamp univoco; celle vuote dove un canale non ha alcun campione in quell'istante:

osf dump messung.osf --format unified-csv --channel 0 --channel 3 --out werte.csv
timestamp,temperature,humidity
1970-01-01 00:00:00.000,21.5,48
1970-01-01 00:00:00.001,21.6,

I nomi dei canali contenenti virgola, virgolette o ritorno a capo vengono racchiusi tra virgolette in conformità al formato CSV.

convert — verso OSF5 (opzionalmente compresso)​

convert legge un input qualsiasi (OSF4/OSF5, eventualmente compresso) e lo scrive come OSF5:

osf convert alt-osf4.osf neu.osf # OSF4 → OSF5
osf convert messung.osf messung.osfz --compress # OSF5 → gzip (OSFZ)
OpzioneEffetto
--compressComprime l'output in gzip (genera un file OSFZ)
--writer <BLOCK|STREAMING>Backend del writer; BLOCK (predefinito) bufferizza in memoria e scrive in un unico passaggio, STREAMING riproduce campione per campione tramite un FileChannel

STREAMING non supporta --compress; con questa combinazione il comando ripiega su BLOCK con un avviso. In caso di successo convert riporta wrote <datei> (N channels). Il comando è quindi anche il più semplice convertitore OSF4→OSF5.

Codice sorgente completo: osf-cli/src/main/java/com/optimeas/osf/cli/.

osf-viewer​

osf-viewer è un'applicazione JavaFX che visualizza contemporaneamente molti canali di un file OSF. L'idea centrale è una decimazione min/max per pixel: indipendentemente da quanti milioni di campioni cadano su una colonna dello schermo, nessun valore anomalo viene mai inghiottito.

Avvio​

Il modo più semplice per eseguire il viewer è il plugin Maven JavaFX (classe principale com.optimeas.osf.viewer.ViewerApp):

mvn -pl osf-viewer -f implementations/java/pom.xml javafx:run

Facoltativamente è possibile aprire un file direttamente all'avvio — il primo argomento di avvio viene interpretato come percorso:

mvn -pl osf-viewer -f implementations/java/pom.xml javafx:run \
-Djavafx.args="messung.osf"

Si apre una finestra 1000×700 «OSF Viewer» con barra degli strumenti, elenco dei canali, area di tracciamento e barra di stato.

Interfaccia utente​

  • Barra degli strumenti — Open… apre una finestra di dialogo dei file (filtro *.osf, *.osfz); Zoom Reset riporta l'area visibile all'intera estensione temporale di tutti i canali tracciabili.
  • Elenco dei canali (a sinistra) — una tabella con le colonne Plot, Name, DataType, Mode, Samples, Unit. La casella di controllo Plot inserisce un canale nel disegno; per i canali non tracciabili (String, Binary, GPS) è disattivata e riporta il tooltip «not plotted in v1».
  • Area di tracciamento (al centro) — la vera e propria visualizzazione delle curve; occupa lo spazio restante e viene ridisegnata a ogni modifica delle dimensioni.
  • Barra di stato (in basso) — stato di caricamento e informazioni di lettura del cursore.

Il caricamento avviene sempre in background (Task JavaFX), in modo che l'interfaccia resti reattiva durante la lettura di file di grandi dimensioni.

Decimazione — min/max per pixel​

Per ogni colonna di pixel il Decimator determina il minimo E il massimo di tutti i campioni che cadono in quella finestra temporale e disegna un tratto verticale da minY a maxY. In questo modo, anche con una compressione estrema, ogni picco resta visibile — a differenza del semplice scarto dei punti intermedi. L'assegnazione dei campioni utilizza una ricerca binaria (lowerBound) sui timestamp crescenti ed è quindi veloce anche con milioni di campioni. Ogni canale selezionato scala autonomamente il proprio asse Y (autoscale sull'intervallo di valori memorizzato nella cache); i colori ruotano attraverso una tavolozza di sei tonalità ben distinguibili.

Interazione​

  • Spostamento (pan) — trascinando in orizzontale con il pulsante del mouse premuto si sposta la finestra temporale.
  • Zoom — rotellina del mouse; scorrendo verso l'alto si ingrandisce (fattore 0,8), verso il basso si riduce (fattore 1,25), sempre attorno alla posizione del cursore, in modo che l'istante sotto il cursore resti fermo.
  • Lettura del cursore — al movimento del mouse la barra di stato mostra l'istante del cursore e, per ogni canale selezionato, il valore del campione più vicino.

La mappatura delle coordinate (tempo↔X, valore↔Y con asse Y invertito) è incapsulata in AxisTransform, la logica di lettura e di disegno in PlotCanvas; entrambe sono deliberatamente separate dal puro livello del modello (ViewerModel, Decimator, AxisTransform — senza import JavaFX) e quindi testabili senza un ambiente JavaFX in esecuzione. I dettagli su questa suddivisione si trovano in Architettura e Interni.

Codice sorgente completo: osf-viewer/src/main/java/com/optimeas/osf/viewer/.

Proseguire​

Questo documento è distribuito con licenza CC BY 4.0. Attribuzione: optiMEAS GmbH e optiMEAS Switzerland GmbH.