import java.io.*;
import josx.platform.rcx.*;
import josx.rcxcomm.*;
import josx.robotics.*;

/**
 * RCX Remote Control Server.
 * Listens for commands from the PC via the IR tower.
 *
 * @author David (www.uk-dave.com)
 * @version 1.0, 22/03/2004
 */
public class RCXServer
{
	////////////////////////////////////////////////////
	// CONSTANTS AND CLASS VARIABLES
	////////////////////////////////////////////////////

	private static RCXPort rcxPort;
	private static DataInputStream in;
	private static DataOutputStream out;






	////////////////////////////////////////////////////
	// MAIN
	////////////////////////////////////////////////////

	/**
	 *
	 * @param args
	 */
	public static void main(String[] args) throws Exception
	{
		// Set up IR port
		LLC.setRangeLong();
		rcxPort = new RCXPort();
		in = new DataInputStream(rcxPort.getInputStream());
		out = new DataOutputStream(rcxPort.getOutputStream());

		// Loop for ever processing received commands
		int dur=0, code=0, power=0;
		for(;;)
		{
			int op = in.readByte();

			if (op == 0x00) 					// Stop
			{
				Motor.A.stop();
				Motor.C.stop();
			}
			else if (op == 0x01) 				// Forward
			{
				Motor.A.forward();
				Motor.C.forward();
			}
			else if (op == 0x11) 				// Forward then stop
			{
				dur = (in.readByte() & 0xFF)*100;
				Motor.A.forward();
				Motor.C.forward();
				try { Thread.sleep(dur); }
				catch (InterruptedException e) {}
				Motor.A.stop();
				Motor.C.stop();
			}
			else if (op == 0x02) 				// Backward
			{
				Motor.A.backward();
				Motor.C.backward();
			}
			else if (op == 0x12) 				// Backward then stop
			{
				dur = (in.readByte() & 0xFF)*100;
				Motor.A.backward();
				Motor.C.backward();
				try { Thread.sleep(dur); }
				catch (InterruptedException e) {}
				Motor.A.stop();
				Motor.C.stop();
			}
			else if (op == 0x03) 				// Rotate Left
			{
				Motor.A.forward();
				Motor.C.backward();
			}
			else if (op == 0x13) 				// Rotate Left then stop
			{
				dur = (in.readByte() & 0xFF)*100;
				Motor.A.forward();
				Motor.C.backward();
				try { Thread.sleep(dur); }
				catch (InterruptedException e) {}
				Motor.A.stop();
				Motor.C.stop();
			}
			else if (op == 0x04) 				// Rotate Right
			{
				Motor.A.backward();
				Motor.C.forward();
			}
			else if (op == 0x14) 				// Rotate Right then stop
			{
				dur = (in.readByte() & 0xFF)*100;
				Motor.A.backward();
				Motor.C.forward();
				try { Thread.sleep(dur); }
				catch (InterruptedException e) {}
				Motor.A.stop();
				Motor.C.stop();
			}
			else if (op == 0x05) 				// Set Power
			{
				power = in.readByte();
				Motor.A.setPower(power);
				Motor.C.setPower(power);
			}
			else if (op == 0x10) 				// Play a system sound
			{
				code = in.readByte();
				Sound.systemSound(true, code);
			}
		}
	}
}

