-
Elisa Giglio authoredElisa Giglio authored
Esecutore.java 2.72 KiB
import java.io.IOException;
import java.time.Duration;
import java.time.LocalDateTime;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class Esecutore extends Thread {
private MyQueue<Integer> codaVal; // coda in cui vengono mantenuti i valori da sommare alla variabile valore
private int valore; // variabile numerica cumulativa inizialmente impostata a 0
public final int SOGLIA = 100;
private Publisher publisher;
private Automa automa;
private String outputSuono; // nome logico dell'interruttore che fa scattare il suono dell'allarme
private LocalDateTime tempoAllarme; //valorizzato solo quando l'allarme sta suonando. Contiene l'ora in cui l'allarme ha iniziato a suonare
public Esecutore(Publisher publisher, MyQueue<Integer> codaVal, Automa automa, String outputSuono) throws JSONException, IOException {
this.codaVal = codaVal;
this.automa = automa;
this.publisher = publisher;
this.outputSuono = outputSuono;
JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
this.valore = statoJson.getInt("valore");
if(statoJson.getInt("stato")==2)
this.tempoAllarme = LocalDateTime.parse(statoJson.getString("tempoAllarme"));
}
public void run() {
final long DURATA_SUONO = 5; // l'allarme dura 5 minuti e poi smette di suonare
int delta;
while(true) {
while(automa.antifurtoAttivo()) { System.out.println("VALORE = "+ valore);
delta = codaVal.receive();
valore = valore + delta;
try {
Helper.modificaFileStato(codaVal, false, delta, valore, Automa.FILE_STATO);
if(valore >= SOGLIA && (!automa.allarme()) ) {
publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+outputSuono, "{cmd:1}");
tempoAllarme = LocalDateTime.now();
JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
Helper.scriviFile(statoJson.put("tempoAllarme",tempoAllarme.toString()), Automa.FILE_STATO);
}
else {
if(automa.allarme()) {
LocalDateTime tempoAttuale = LocalDateTime.now();
long durata = Math.abs(Duration.between(tempoAllarme, tempoAttuale).toMinutes());
if(valore < SOGLIA || durata >= DURATA_SUONO || !automa.antifurtoAttivo() ) {
publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+outputSuono, "{cmd:0}"); // l'allarme viene disattivato
}
}
}
}
catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(!automa.antifurtoAttivo()) {
reset();
}
}
}
public void aggiungiVal(int n) {
Helper.modificaFileStato(true, n, Automa.FILE_STATO);
codaVal.send(n);
}
public void reset() {
valore = 0;
codaVal.removeAll();
}
}