Skip to main content

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

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.

info

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, tramite prettyPrint.

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.

Esempio di ambiente testuale

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 | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | -- | -- | -- ||
-- | -- | -- | -- | -- | -- | -- | -- | ** | -- ||
-- | -- | -- | -- | -- | -- | -- | -- | -- | --
info

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.