josx.rcxcomm is a package for communication between a PC and the RCX.

It is based on original code created by the LEGO3 Team at DTU-IAU.

It uses standard Java IO Streams to send primitive Java data types from the 
PC to the RCX, or from the RCX to the PC. Either end can initiate communication,
and data can be sent in both directions.

A simple program to send a byte is:

import josx.rcxcomm.*;
import java.io.*;

public class TestRCXComm {

  public static void main(String [] args) {

    try {
      RCXPort port = new RCXPort();

      OutputStream os = port.getOutputStream();

      os.write(123);
      os.flush();
    }
    catch (IOException ioe) {
     ...
    } 
}

To read a byte back you would add:

      InputStream is = port.getInputStream();
   
      is.read();

To send other Java primitive types, such as int, you add:

   DataOutputStream dos = new DataOutputStream(os);

      dos.writeInt(123456);
      dos.flush();

Not all data types are available in the RCX implementation of 
DataInputStream and DataOutputStream. Object streams and 
serialization are not yet supported.

Both serial and USB towers are supported on Windows. Currently
only serial towers are supported for Linux and Mac OSX.

To compile the RCX program, you use lejosc. An extra jar 
(rcxrcxcomm.jar) is used automatically.

On the PC or Mac you compile with javac and add pcrcxcomm.jar 
from the lejos lib directory to your CLASSPATH.

The serial or USB tower is accessed by a dynamically linked library 
using the Java Native Interface (JNI). On Windows this is irtower.dll
and needs to be on you path. As it is in the lejos bin directory, it
will normally already be on your PATH. On Linux or Mac OSX, it is a
shared library, libirtower.so, which needs to be on your shared library 
path. This can be achieved by adding the lejos bin directory to 
LD_LIBRARY_PATH.

The port used for the IR Tower can be set in two ways:

  - You can set RCXTTY and call RCXPort with no parameter
  - You can pass the port name on the RCXPort constructor.

For USB the port name is "USB", for a serial tower it is "COM1", "COM2" etc.

There is an extra class available for the PC and Mac - RCXBean. This 
provides a Java Bean interface for sending and receiving data from the RCX.
It is useful for creating Web sites using Java Server Pages (JSPs) that 
access the RCX to read sensors, perform actions, etc.

For serial towers on the PC or Mac, there is an extra method: setListen.
This is used to keep the serial tower alive for receiving data. Use 
setListen(true) when you want to receive date and setListen(false) to conserve 
the serial tower batteries. You don't need to call setListen for USB towers.
setListen is called automatically by the PC version of getInputStream(). You
can call setListen(false) if you dont need to listen immediately and you want to 
conserve batteries.

With lejos 2.0. low level comms that does not rely on the Lego firmware protocol 
and opcodes has been added, and RCXPort has been re-implemented using this. This
makes it faster and reliable. It will continue to try to send data until it gets 
through, and ensure hat no data is duplicated. Future versions will be faster 
still by adding buffering and using larger packet sizes.

With lejos 2.0 there are alternative versions of RCXPort. These are:

RCXF7Port - which uses the Lego F7 opcode in the same way as the lejos 1.0.5 
            version of RCXPort
RCXLNPPort - which uses the LegOS Netwrorking Protocol Integrity layer
RCXLNPAddrPort - which uses the LegOS Netwrorking Protocol Addressing layer

You can also write your own protocol stacks and RCX Ports - see 
ProtocolStacks.Readme.

There are several example programs that use RCXPort in the rcxcomm/examples directory.
See the browser example for how to browse the Internet from the RCX using a socket 
proxy on the PC, and servlet for how to turn he RCX into a Web Server using an Http
Proxy on the PC.

