Command Line Interface
La modalità CLI permette di avviare la simulazione senza interfaccia grafica, interagendo esclusivamente tramite la console. Tutti i parametri necessari per l’esecuzione della simulazione possono essere forniti da linea di comando o inseriti interattivamente dall’utente.
In fase di avvio, il launcher selezionato determina le componenti della simulazione in base alla modalità scelta.
Utilizzando il flag --headless
, il launcher seleziona i componenti appropriati: in modalità CLI vengono utilizzati
ConfigurationCLI
, per la lettura dei parametri iniziali e la validazione dei parametri di configurazione, e
CLIComponent
, che gestisce la vista testuale della simulazione.
Questa distinzione mantiene invariata la logica della simulazione rispetto alla modalità GUI, differenziando solo i
meccanismi di input/output e di rendering dello stato.
ArgParser e AppArgs
ArgParser
gestisce l’analisi degli argomenti passati da linea di comando all'avvio dell’applicazione.
Viene utilizzata la libreria scopt per definire le opzioni disponibili.
Scopt fornisce un DSL dichiarativo che permette di definire con semplicità:
- opzioni obbligatorie o facoltative, con relativi tipi;
- valori di default;
- messaggi di aiuto e documentazione;
- versioning e validazione degli argomenti.
In questa applicazione, le principali opzioni supportate sono:
--headless
: avvia la simulazione in modalità CLI senza interfaccia grafica;--path <file>
: specifica il percorso del file di configurazione YAML;--duration <milliseconds>
: imposta la durata totale della simulazione;--seed <number>
: definisce il seme casuale per garantire riproducibilità;--help
: mostra le istruzioni disponibili.
Il risultato del parsing è la struttura AppArgs
che raccoglie in modo tipizzato tutti i parametri forniti dall’utente.
Se la lettura degli argomenti fallisce, il metodo parse(args: Seq[String])
restituisce None
, stampando un messaggio
di errore.
Esempio di avvio del simulatore in modalità CLI con parametri specifici:
java -jar PPS-22-srs.jar --headless --path config.yaml --duration 60000 --seed 42
ConfigurationCLI
ConfigurationCLI
implementa ConfigurationView
per la modalità CLI.
Il suo compito principale è leggere e validare la configurazione iniziale della simulazione, fornendo un oggetto
SimulationConfig[ValidEnvironment]
pronto per il modello.
I valori mancanti, come durata della simulazione o il seed, vengono richiesti interattivamente all’utente tramite
console (tramite le funzioni askSimulationTime
e askSeed
).
La lettura del file YAML di configurazione è affidata a YamlConfigManager
, con gestione degli errori per file
inesistenti o non validi.
Anche la validazione dell’ambiente avviene prima dell’avvio della simulazione, generando un’eccezione in caso di errori.
Per ulteriori informazioni sulla gestione della configurazione si rimanda alla sezione Configuration.
CLIComponent
Il trait CLIComponent[S]
estende ViewModule.Component[S]
e costituisce la vista testuale della simulazione
nell’architettura MVC. È definito in modo generico rispetto al tipo di stato S
, che deve estendere ModelModule.State
,
così da poter essere riutilizzato con diversi modelli di simulazione.
L’implementazione concreta della view è affidata alla classe interna CLIViewImpl
, che definisce i principali metodi
dell’interfaccia View
:
init(queue: Queue[IO, Event])
: stampa un messaggio di benvenuto;render(state: S)
: richiamato a ogni aggiornamento dello stato, ma lasciato volutamente vuoto per evitare output continuo in console;close()
: stampa un messaggio di chiusura al termine della simulazione;timeElapsed(state: S)
: mostra il risultato finale stampando lo stato della simulazione e l’ambiente in formato tabellare, tramiteprettyPrint
.
In questo modo, CLIComponent
fornisce un’interfaccia minimale ma sufficiente per monitorare la simulazione,
concentrandosi sui messaggi chiave e sull’output finale, senza appesantire l’esecuzione con rendering continui.
La simulazione mostra le entità presenti in una griglia testuale.
Ogni simbolo rappresenta un tipo di entità:
- robot, sulla base della
Policy
associata:R
(RandomWalk),A
(AlwaysForward),O
(ObstacleAvoidance),P
(PhotoTaxis),M
(Prioritized); - ostacolo:
X
; - luce:
**
; - cella vuota:
--
.
-- | -- | -- | -- | -- | -- | -- | X | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | X | -- | -- ||
-- | A | ** | -- | -- | -- | -- | X | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | X | -- | -- ||
-- | -- | -- | X | X | X | -- | X | -- | -- ||
-- | -- | -- | A | -- | -- | -- | X | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | X | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | -- | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | -- | ** | -- ||
-- | -- | -- | -- | -- | -- | -- | -- | -- | --
Per ulteriori dettagli sull'implementazione del DSL per la creazione di ambienti grid-based, si rimanda alla sezione dedicata nella documentazione DSL ambiente grid-based.