Gestione sensori

Sviluppare un programma per la gestione di un sistema di sensori che risponda ai seguenti requisiti.
Le classi ed interfacce devono essere contenute nel package: sensors.
Si utilizzi il progetto di partenza: Eclipse.

R1: Concentratore

La classe concentratore ha lo scopo di raccogliere le segnalazioni dei diversi sensori.
Il concentratore scrive su un file di testo il log delle segnalazioni provenienti dai sensori.
Il contentratore è rappresentato dalla classe Concentrator.
Il costruttore di Concentrator riceve come parametro il path del file di log su cui scrivere.
Ogni 5 secondi il concentratore stampa sul file un time stamp con la data di sistema nella forma: "Concentrator: Up: Sun Mar 06 18:48:48 CET 2005".
La classe Concentrator offre il metodo signal() che riceve come parametro un oggetto che implementa l'interfaccia Sensor (la sorgente del segnale) e una stringa (il segnale). Quando viene invocato questo metodo deve scrivere sul file di log il messaggio nella forma: "NomeSensore :
data : Segnale", dove il nome del sensore (NomeSensore) si ottiene con il metodo getName() dell'interfaccia Sensor, il segnale (Segnale) è il secondo parametro del metodo e la data è quella di sistema ed ha lo stesso formato del messaggio precedente..

Suggerimenti:

R2: Sensori

I sensori possono essere di vario tipo e implementano l'interfaccia Sensor. L'interfaccia definisce il metodo getName() che restituisce il nome del sensore.
Il metodo connect()  riceve come parametro un Concentrator, l'implementazione del metodo deve registrare il riferimento e richiamare il metodo registerSensor() del Concentrator che riceve come parametro il sensore stesso.
Inoltre definisce il metodo sendSignal() che riceve come parametro una stringa. L'implementazione di tale metodo deve inviare il segnale al Concentrato presso cui è registrato, richiamando il metodo signal(); tale metodo deve restituire subito il controllo, quindi è necessario richiamare il metodo signal() in un thread diverso dal chiamante.
La classe BasicSensor implementa l'interfaccia Sensor in base alle indicazioni precedenti. Essa definisce un costruttore che riceve come parametro il nome del sensore.

R3: Sensori attivi

I sensori possono essere attivati e deattivati tramite il metodo setActive() che riceve come parametro un valore boolean.
E' possibile conoscere lo stato di attivazione di un sensore tramite il metodo isActive().
Quando un sensore è inactive, ogni chiamata al metodo sendSignal() viene scartate ed il segnale viene perso.
Il concentratore con un periodo di 5 secondi deve effettuare il polling dei sensori registrati presso di lui per verificare se qualcuno è disattivato, nel caso trovi dei sensori non attivi deve segnalarlo con un messaggio del tipo "Concentrator: sensore NomeSrc INACTIVE".

R4: Simulazione

Per effettuare la simulazione del sistema viene definita la class HwSensorSimulator che simula un sensore HW ed il suo driver.
Il costruttore del simulatore riceve come parametro un sensore a cui segnalare gli eventi.
Per effettuare la simulazione occorre prima definire la simulazione e poi avviarla.
Il metodo setScript() riceve come perametro un file con la descrizione della simulazione permette di definire la simulazione
Il formato del file è il seguente:
Il metodo startSimulation() permette di avviare la simulazione. Questo metodo deve restituire il controllo subito.

Es.
File descrizione
Evoluzione della simulazione
100; porta aperta
3000; porta chiusa
Dopo 100 ms dall'inizio della simulazione viene inviato il segnale di "porta aperta"
Dopo altri 3 secondi (ovvero 3100 ms dopo l'inizio della simulazione) viene inviato il segnale di "porta chiusa"