Skip to content
Snippets Groups Projects
Esecutore.java 4.27 KiB
Newer Older
  • Learn to ignore specific revisions
  • Elisa Giglio's avatar
    Elisa Giglio committed
    package code;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    import java.io.IOException;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    import java.time.Duration;
    import java.time.LocalDateTime;
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    import org.json.JSONException;
    import org.json.JSONObject;
    
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    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
    
    	private static  int soglia;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	private Publisher publisher;
    	private Automa automa;
    
    	private Antifurto antifurto;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	private LocalDateTime tempoAllarme; //valorizzato solo quando l'allarme sta suonando. Contiene l'ora in cui l'allarme ha iniziato a suonare 
    
    	private static boolean changedSoglia = false;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	
    
    	public Esecutore(Publisher publisher, MyQueue<Integer> codaVal, Automa automa, Antifurto antifurto) throws JSONException, IOException {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		this.codaVal = codaVal;
    		this.automa = automa;
    		this.publisher = publisher;
    
    		this.antifurto = antifurto;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		
    		JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
    		this.valore = statoJson.getInt("valore");
    
    		setSoglia(statoJson.getInt("soglia"));
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		if(statoJson.getInt("stato")==2)
    			this.tempoAllarme = LocalDateTime.parse(statoJson.getString("tempoAllarme"));
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		
    		publisher.aggiungiComando("to/gruppo2/luci/gpio", "{request:status}");
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	}
    	
    
    	private int getSogliaMax() {
    		return Math.round(soglia+soglia*0.2f);  // il valore non puo' andare oltre il 20 % sopra la soglia 
    	}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	
    	public void run() {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		final long DURATA_SUONO = 1; // l'allarme dura 1 minuti e poi smette di suonare. 
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		int delta;
    
    		int valoreToSend = valore; // ogni volta che aumento / diminuisco il valore di 5, notifico la web app pubblicando un messaggio 
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		while(true) {
    			while(automa.antifurtoAttivo()) { System.out.println("VALORE = "+ valore);
    				delta = codaVal.receive();
    				valore = valore + delta;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				if(valore < 0) 
    
    					valore = 0;
    				if(valore > getSogliaMax())
    					valore = getSogliaMax();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				try {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    					if(Math.abs(valore-valoreToSend) >= 5 || (valore==0 && valoreToSend!=0) || valore==getSogliaMax()) {
    
    						JSONObject msgJson = new JSONObject();
    						msgJson.put("event", valore);
    						publisher.aggiungiComando("from/"+Antifurto.getMqttTree()+"/antifurto/valore", msgJson.toString());
    						valoreToSend = valore;
    					}
    					
    					JSONObject statoJson = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
    					statoJson.put("valore", valore);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    					if(valore >= soglia && (!automa.allarme()) && (delta>0 || changedSoglia)) { 	
    
    						publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+antifurto.getNomeOutputSuono(), "{cmd:1}");
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    						tempoAllarme = LocalDateTime.now();
    
    						statoJson.put("tempoAllarme",tempoAllarme.toString());
    
    						changedSoglia = false;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    					}
    					else {
    						if(automa.allarme()) {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    							LocalDateTime tempoAttuale = LocalDateTime.now();
    							Long durata = null;
    							if(tempoAllarme != null) durata = Math.abs(Duration.between(tempoAllarme, tempoAttuale).toMinutes());
    							if(valore < soglia || (durata != null && durata >= DURATA_SUONO) || !automa.antifurtoAttivo() ) {
    
    								publisher.aggiungiComando("to/"+Antifurto.getMqttTree()+"/gpio/"+antifurto.getNomeOutputSuono(), "{cmd:0}"); // l'allarme viene disattivato
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    							}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    						}
    					}
    
    					statoJson.put("soglia", soglia);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    					statoJson.put("stato", automa.getStatoAutoma());
    
    					Helper.scriviFile(statoJson, Automa.FILE_STATO); 
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				catch (JSONException e) {
    					e.printStackTrace();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				
    			}
    			if(!automa.antifurtoAttivo()) {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				try {
    					reset();
    				} catch (JSONException | IOException e) {
    					e.printStackTrace();
    				}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    			}
    		}
    	}
    
    	
    	public void aggiungiVal(int n) {
    		codaVal.send(n);
    	}
    	
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	public void reset() throws JSONException, IOException {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		valore = 0;
    		codaVal.removeAll();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		JSONObject js = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
    		js.put("valore", valore);
    		Helper.scriviFile(js, Automa.FILE_STATO);
    
    	public static int getSoglia() {
    		return soglia;
    	}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	
    
    	public int getValore() {
    		return valore;
    	}
    	
    	
    	public static void setSoglia(int newValue) throws JSONException, IOException {
    		JSONObject js = new JSONObject(Helper.leggiFile(Automa.FILE_STATO));
    		js.put("soglia", newValue);
    		Helper.scriviFile(js, Automa.FILE_STATO);
    		soglia = newValue;
    
    		changedSoglia = true;
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    	
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    }