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();
}
}