Skip to content
Snippets Groups Projects
Automa.java 5.28 KiB
package scenari;

import java.io.IOException;
import java.util.Iterator;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import utility.Helper;

public class Automa {
//	0: learn = off, antifurto = off
//	1: learn = on, antifurto = off
//	2: learn = off, antifurto = on => scenari = on

	private Integer stato = null;
	private final JSONObject jsonObject;
	private boolean learn;
	private boolean antifurto;
	private final String DATABASE_PATH = Scenari.RES_FOLDER+"scenari.json";
	public boolean unreadStatus = false;
	public Integer ultimoStato = null;

	public Automa() throws JSONException, IOException {
		this.jsonObject = new JSONObject(Helper.leggiFile(DATABASE_PATH));
		setCollaterals(this.jsonObject.getInt("stato-attuale"));
	}

	public synchronized Boolean setStato(String command) throws JSONException, IOException {
		return setStato(command,false);
	}
	/**
	 * permette di cambiare lo stato dell'automa
	 * @param command JSONObject del tipo {"learn":"on","antifurto":"on"} o {"learn":"off","antifurto":"off"}
	 * @param fromDatabase se è vero, significa che il comando è stato ricevuto dalla database
	 * @return true se l'automa è passato dallo stato neutrale 0, false altrimenti
	 * @throws JSONException
	 * @throws IOException
	 */
	public synchronized Boolean setStato(String command,boolean fromDatabase) throws JSONException, IOException {
		if (command == null || !Helper.checkJSON(command)
				|| (!command.contains("\"learn\":") && !command.contains("\"antifurto\":"))
				|| (!command.contains(":\"on\"") && !command.contains(":\"off\"")))
			return null;
		final String[] cmd = command.split(":");
		final String cosa = cmd[0].split("\"", 3)[1];
		final String come = cmd[1].split("\"", 3)[1];


		if (Helper.compareText(cosa, "learn")) {
			if (Helper.compareText(come, "on") && this.stato != 1) {
				setCollaterals(1,!fromDatabase);
				return this.ultimoStato == 0;
			} else if (Helper.compareText(come, "off") && this.stato != 0) {
				setCollaterals(0,!fromDatabase);
				return true;
			}
		}
		if (Helper.compareText(cosa, "antifurto")) {
			if (Helper.compareText(come, "on") && this.stato != 2) {
				setCollaterals(2,!fromDatabase);
				return this.ultimoStato == 0;
			} else if (Helper.compareText(come, "off") && this.stato != 0) {
				setCollaterals(0,!fromDatabase);
				return true;
			}
		}
		return null;
	}
	/**
	 * in base allo stato dell'automa e al parametro passato, restituisce quale sia il comando piu' probabile che si vuole eseguire in base allo stato dell'automa ed ai suoi possibili comandi
	 * @param which "learn" o "antifurto"
	 * @return "on" o "off"
	 * @throws JSONException
	 */
	public String findPossibleCommand(String which) throws JSONException{
		Boolean learn = null;
		if(!(learn=Helper.compareText(which, "learn")) && !Helper.compareText(which, "antifurto"))
			return null;
//		devo cercare nel jsonObject lo stato attuale e trovare la stringa corrispondente al which, poi discriminare in base a cio' che mi permette di cambiare stato
		@SuppressWarnings("unchecked")
		Iterator<String> keys = jsonObject.keys();
		while(keys.hasNext()) {
			String key = keys.next();
			try {
				JSONArray array = jsonObject.getJSONArray(key);
				for(int i =0; i<array.length(); i++) {
					JSONObject a = array.getJSONObject(i);
					int stato = a.getInt("stato");
					if(stato != this.stato)
						continue;
					if(learn) {
						int learnOff = a.getInt("learn-off");
						if(learnOff != stato)
							return "off";
						int learnOn = a.getInt("learn-on");
						if(learnOn != stato)
							return "on";
					} else {
						int antifurtoOff = a.getInt("antifurto-off");
						if(antifurtoOff != stato)
							return "off";
						int antifurtoOn = a.getInt("antifurto-on");
						if(antifurtoOn != stato)
							return "on";
					}
				}
			} catch (JSONException e) {
				if(!e.getMessage().contains("stato-attuale"))
					System.out.println(e.getMessage());
			}
//			if(riga.getInt("stato")==statoAttuale) {
//				this.statoAttuale = riga.getInt("cmd"+newStatoInterruttore);
//				aggiornaInterruttoreESuono();
//			}
		}
		return null;
	}

	public synchronized void setAntifurtoStatus(boolean status) throws JSONException, IOException {
		if(status == this.antifurto)
			return;
		if(status)
			setCollaterals(2,true);
		else
			setCollaterals(0,true);
	}

	private synchronized void setCollaterals(int stato) throws JSONException, IOException {
		setCollaterals(stato,false);
	}

	private synchronized void setCollaterals(int stato,boolean write) throws JSONException, IOException {
		this.ultimoStato = this.stato != null ? this.stato : null;
		switch (stato) {
			case 0: {
				this.stato = 0;
				this.learn = false;
				this.antifurto = false;
				break;
			}
			case 1: {
				this.stato = 1;
				this.learn = true;
				this.antifurto = false;
				break;
			}
			case 2: {
				this.stato = 2;
				this.learn = false;
				this.antifurto = true;
				break;
			}
		}
		unreadStatus = true;

		if(write) {
			this.jsonObject.put("stato-attuale", this.stato);
			Helper.scriviFile(jsonObject,DATABASE_PATH);
		}
	}

	public synchronized int getStato() {
		unreadStatus = false;
		return this.stato;
	}

	public synchronized boolean getLearn() {
		unreadStatus = false;
		return this.learn;
	}

	public synchronized boolean getAntifurto() {
		unreadStatus = false;
		return this.antifurto;
	}

}