import java.util.*;

public class Brick implements RCXCommands, MessageListener {

	private IRProtocol ir;
	private Vector listeners;

	public Brick() {
	
		listeners = new Vector();
      ir = new IRProtocol();
		
		// Add Message Listener to receive message availability
		ir.addMessageListener(this);
		
	}

	public void sendMessage(byte msg) {
		try { ir.send(new byte[] {SET_MESSAGE, msg}); }
		catch (Exception e) { e.printStackTrace(); }
	}

	public void sendMessage(byte[] msg) {
		try { ir.send(msg); }
		catch (Exception e) { e.printStackTrace(); }
	}

	public void sendRawMessage(byte[] msg) {
		try { ir.sendRaw(msg); }
		catch (Exception e) { e.printStackTrace(); }
	}

	public void receiveMessage(byte[] msg) {
		try { ir.receive(msg); } 
		catch (Exception e) { e.printStackTrace(); }
	}

	public void receiveRawMessage(byte[] msg) {
		try {ir.receiveRaw(msg);}
		catch (Exception e) {e.printStackTrace();}
	}
    

	public void wait(int n) {
		byte low = (byte)(n & 0xff);
		byte high = (byte)((n >> 8) & 0xff);

		try {ir.send(new byte[] {WAIT, low, high});}
		catch (Exception e) {e.printStackTrace();}
	}

	//	MessageListener methods
	
	public void messageReceived(byte[] msg){
                Vector v = (Vector)listeners.clone();
		DataReceiver dr = null;
		
		for (int i = 0; i < v.size(); i++) {
			dr = (DataReceiver)v.elementAt(i);
                        // Notify all DataReceiver listeners that msg is available
			if (msg[0] == SET_MESSAGE && msg.length >= 2) {
				dr.dataAvailable(msg[1]);
			}
		}
	}
	
	// Source of DataReceived
	
	public void addDataReceiver(DataReceiver l) {
		listeners.addElement(l);
	}
	
	public void removeDataReceiver(DataReceiver l) {
		listeners.removeElement(l);
	}
	
	// Debugging routines
	
	public static String toHex(byte x) {
		return ((x & 0xff) < 16 ? "0" : "") + Integer.toHexString(x & 0xff).toUpperCase();
	}

	public void printMessage(String prefix, byte[] msg) {
	        System.out.print(prefix);
	        for (int i = 0; i < msg.length; i++) {
			System.out.print(" " + toHex(msg[i]));
		}
	        System.out.println();
	}

	
}