RemoteNXTTest

import lejos.nxt.*;
import lejos.nxt.comm.*;
import lejos.nxt.remote.*;
import lejos.util.TextMenu;
 
import java.io.*;
/**
 * This program demonstrates the use of the RemoteNXT class to allow one NXT
 * to control another. It should be used in conjunction either with the standard
 * leJOS menu (for Bluetooth only), or with the NXTLCPRespond test program (for
 * Bluetooth and RS485). The two NXTs may be connected either via Bluetooth or
 * by RS485. The program retrieves a number of data items from the remote NXT,
 * and allows the motors on the remote device to be controlled using the keypad.
 * A light sensor should be plugged into port 1 of the remote NXT. If using
 * RS485 communications the two NXTs should be linked using a standard Lego
 * connector between port 4 on both devices.
 * NOTE: Be sure to change the name of the target brick below from "NXT" to 
 * the proper name. Also, as stated above, if using RS-485 make sure NXTLCPRespond 
 * is running on the target brick (port 4 to port 4) before running this program. 
 */
public class RemoteNXTTest {
    public static void main(String[] args) throws Exception {
        RemoteNXT nxt = null;   
        int power = 0;
        int mode = 1;
        int motor = 0;
        String motorString = "Motor:";
        String modeString = "Mode:";
        String powerString = "Power:";
        String batteryString = "Battery:";
        String lightString = "Light:";
        String tachoString = "Tacho:";
 
        // Get the type of communications to be used
        String[] connectionStrings = new String[]{"Bluetooth", "RS485"};
        TextMenu connectionMenu = new TextMenu(connectionStrings, 0, "Connection");
        NXTCommConnector[] connectors = {Bluetooth.getConnector(), RS485.getConnector()};
 
        int connectionType = connectionMenu.select();
 
        // Now connect
        try {
            LCD.clear();
            LCD.drawString("Connecting...",0,0);
            nxt = new RemoteNXT("NXT", connectors[connectionType]);
            LCD.clear();
            LCD.drawString("Type: " + connectionStrings[connectionType], 0, 0);
            LCD.drawString("Connected",0,1);
            Thread.sleep(2000);
        } catch (IOException ioe) {
            LCD.clear();
            LCD.drawString("Conn Failed",0,0);
            Thread.sleep(2000);
            System.exit(1);
        }
 
        LCD.clear();
        RemoteMotor[] motors = {nxt.A, nxt.B, nxt.C};
        LightSensor light = new LightSensor(nxt.S2);
        while (true) {
            // Get data from the remote NXT and display it
            LCD.drawString(motorString,0,0);
            LCD.drawInt(motor, 3, 10, 0);
            LCD.drawString(powerString,0,1);
            LCD.drawInt(power, 3, 10, 1);
            LCD.drawString(modeString,0,2);
            LCD.drawInt(mode, 3, 10, 2);
            LCD.drawString(tachoString,0,3);
            LCD.drawInt(motors[motor].getTachoCount(), 6,  7, 3);
            LCD.drawString(batteryString,0,4);
            LCD.drawInt(nxt.Battery.getVoltageMilliVolt(), 6,  7, 4);
            LCD.drawString(lightString,0,5);
            LCD.drawInt(light.readValue(), 6,  7, 5);
            LCD.drawString(nxt.getBrickName(), 0, 6);
            LCD.drawString(nxt.getFirmwareVersion(), 0, 7);
            LCD.drawString(nxt.getProtocolVersion(), 4, 7);
            LCD.drawInt(nxt.getFlashMemory(), 6, 8, 7);
 
            // Do we have a button press?
            int key = Button.readButtons();
            if (key != 0)
            {
                // New command, work out what to do.
                if (key == 1) { // ENTER
                    power += 20;
                    if (power > 100) power = 0;
                } else if (key == 2) { // LEFT
                    mode++;
                    if (mode > 4) mode = 1;
                } else if (key == 4) { // RIGHT
                    motor++;
                    if (motor > 2) motor = 0;
                } else if (key == 8) { // ESCAPE
                    LCD.clear();
                    LCD.drawString("Closing...", 0, 0);
                    for(int i = 0; i < motors.length; i++)
                        motors[i].flt();
                    nxt.close();
                    Thread.sleep(2000);
                    System.exit(0);
                }
 
                LCD.clear();
                LCD.drawString("Setting power",0,0);
                motors[motor].setPower(power);
                LCD.drawString("Moving motor",0,1);
                if (mode == 1) motors[motor].forward();
                else if (mode == 2) motors[motor].backward();
                else if (mode == 3) motors[motor].flt();
                else if (mode == 4) motors[motor].stop();
                // Wait for the button to be released...
                while (Button.readButtons() != 0)
                    Thread.yield();
                LCD.clear();
            }
        }
    }
}