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(); } }