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