import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.BufferedReader;
import gnu.io.SerialPort;
import gnu.io.CommPortIdentifier;
import gnu.io.CommPort;
import java.util.NoSuchElementException;
import java.util.Vector;
import java.io.Serializable;
import java.util.Vector;


//%%IMPORTS%%

public final class Controler implements Serializable {

	private transient Agent myAgent = null;
	private QuasiBehavior myBehavior;

	private LifeCycleCtI myLifeCycleCt;
	private LifeCycleCtI myNextLifeCycleCt;

	private Vector myMailQueue = new Vector();

	private MailBoxCtI myMailBoxCt;
	private MailBoxCtI myNextMailBoxCt;
	private ReceiveLocalCt myReceiveLocalCt;
	private GPSCtI myGPSCt;
	private GPSCtI myNextGPSCt;
//%%ATTRIBUTES%%

	protected Controler(QuasiBehavior beh) {
		init(beh);
	}

//%%CONSTRUCTORS

	private void init(QuasiBehavior beh) {
		myBehavior=beh;


		myLifeCycleCt = new ActorLifeCycleCt();
		myMailBoxCt = new MailBoxCt();
		myReceiveLocalCt = new ReceiveLocalCt();
		myGPSCt = new NMEASerialCt();
//%%CPTNEWC%%

		setMyLifeCycleCt(myLifeCycleCt);
		setMyMailBoxCt(myMailBoxCt);
		myReceiveLocalCt.setMyControler(this);
		setMyGPSCt(myGPSCt);
//%%CPTSETCTRL%%

	myAgent=myReceiveLocalCt;
//%%INIT%%

		beh.setMyControler(this);


	if (myBehavior !=null)
		myLifeCycleCt.start();

//%%POSTINIT%%
	}

	protected Agent getMyAgent() {
		return myAgent;
	}

	protected QuasiBehavior getMyBehavior() {
		return myBehavior;
	}

	protected void setMyBehavior(QuasiBehavior beh) {
		myBehavior=beh;
		if (myBehavior != null) myBehavior.setMyControler(this);
	}

	protected static void print_r(Object[] array) {
		System.out.print("[");
		for (int i=0; i<array.length; i++)
			System.out.print(array[i].toString()+", ");
		System.out.println("]");
	}


	//------------------------------------------------------------------------------

	public void setMyLifeCycleCt(LifeCycleCtI cpt) {
		if (myLifeCycleCt != null && myLifeCycleCt != cpt) myLifeCycleCt.terminate();
		myLifeCycleCt = cpt;
		if (myLifeCycleCt != null) myLifeCycleCt.setMyControler(this);
		myNextLifeCycleCt = myLifeCycleCt;
	}
	public LifeCycleCtI getMyLifeCycleCt() { return myLifeCycleCt; }
	public void setMyNextLifeCycleCt(LifeCycleCtI nextCpt) {
		 myNextLifeCycleCt = nextCpt;
	}
	public LifeCycleCtI getMyNextLifeCycleCt() { return myNextLifeCycleCt; }
	public void start() { myLifeCycleCt.start(); }

	protected Vector getMyMailQueue() {
		return myMailQueue;
	}

	public synchronized Message getMessage() {
		while (myMailBoxCt.isEmpty())
			try { wait(); } catch (Exception e) {}
		return myMailBoxCt.getMessage();
	}

	public synchronized void putMessage(Message m) {
			myMailBoxCt.putMessage(m);
			notify();
	}


	public synchronized void setMyMailBoxCt(MailBoxCtI mail) {
		if (myMailBoxCt != null && myMailBoxCt != mail)
			myMailBoxCt.terminate();
		myMailBoxCt = mail;
		if (myMailBoxCt != null) {
			myMailBoxCt.setMyControler(this);
			notify();
		}
		myNextMailBoxCt = myMailBoxCt;
	}

		public MailBoxCtI getMyMailBoxCt() { return myMailBoxCt; }
	public void setMyNextMailBoxCt(MailBoxCtI nextCpt) {
		 myNextMailBoxCt = nextCpt;
	}
	public MailBoxCtI getMyNextMailBoxCt() { return myNextMailBoxCt; }
			public boolean isEmpty() { return myMailBoxCt.isEmpty(); }
	public void setMyGPSCt(GPSCtI cpt) {
		if (myGPSCt != null && myGPSCt != cpt) myGPSCt.terminate();
		myGPSCt = cpt;
		if (myGPSCt != null) myGPSCt.setMyControler(this);
		myNextGPSCt = myGPSCt;
	}
	public GPSCtI getMyGPSCt() { return myGPSCt; }
	public void setMyNextGPSCt(GPSCtI nextCpt) {
		 myNextGPSCt = nextCpt;
	}
	public GPSCtI getMyNextGPSCt() { return myNextGPSCt; }
	public float getHeading() { return myGPSCt.getHeading(); }
	public java.lang.String getLatitude() { return myGPSCt.getLatitude(); }
	public java.lang.String getLongitude() { return myGPSCt.getLongitude(); }
	public float getSpeed() { return myGPSCt.getSpeed(); }
	public boolean connect(java.lang.String _p0) { return myGPSCt.connect(_p0); }
	public float getHeight() { return myGPSCt.getHeight(); }
	public boolean isConnected() { return myGPSCt.isConnected(); }
	public void disconnect() { myGPSCt.disconnect(); }
//%%METHODS%%


}

