Skip to content
Snippets Groups Projects
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();
	}
	
	
	
}