import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import lejos.nxt.*;
import lejos.nxt.comm.BTConnection;
import lejos.nxt.comm.Bluetooth;
import lejos.robotics.navigation.*;
/**
*Example of a navigating robot operating under remote control
* uses Command enum to decode incoming messages
* @author Roger Glassey
*/
public class RCNavigator
{
public RCNavigator(SimpleNavigator aNavigator)
{
navigator = aNavigator;
}
/**
* wheel diameter and track width in cm.
* @param args
*/
public static void main(String[] args)
{
Pilot p = new TachoPilot(5.6f, 14.3f, Motor.A, Motor.C);
SimpleNavigator nav = new SimpleNavigator(p);
new RCNavigator(nav).go();
}
/**
* decode incoming messages and issue commands to the SimpleNavigator
*/
private void readData()
{
int code;
try
{
code = dataIn.readInt();
LCD.clear();
LCD.drawInt(code,0,1);
Sound.playTone(800 + 100 * code, 200);
if (code == Command.GOTO.ordinal())// convert enum to int for comparison
{
float x = dataIn.readFloat();
float y = dataIn.readFloat();
navigator.goTo(x, y);
} else if (code == Command.TRAVEL.ordinal())
{
float distance = dataIn.readFloat();
LCD.drawString("D "+Math.round(distance),0 ,2);
navigator.travel(distance);
} else if (code == Command.ROTATE.ordinal())
{
float angle = dataIn.readFloat();
LCD.drawString("A "+ Math.round(angle),0,2);
navigator.rotate(angle);
}
report();
Sound.pause(100);
} catch (IOException e)
{
}
}
/**
* report x,y and heading to mission control
*/
public void report()
{
try
{
dataOut.writeFloat(navigator.getX());
dataOut.writeFloat(navigator.getY());
dataOut.writeFloat(navigator.getAngle());
dataOut.flush();
LCD.drawInt(Math.round(navigator.getX()), 4,0,1);
LCD.drawInt(Math.round(navigator.getY()), 4,5,1);
LCD.drawInt(Math.round(navigator.getAngle()), 4,10,1);
} catch (IOException e)
{
}
}
/**
* Estabish bluetooth connection to mission control
*/
public void connect()
{
LCD.clear();
LCD.drawString("Waiting", 0, 0);
connection = Bluetooth.waitForConnection(); // this method is very patient.
LCD.clear();
LCD.drawString("Connected", 0, 0);
dataIn = connection.openDataInputStream();
dataOut = connection.openDataOutputStream();
Sound.beepSequence();
}
/**
* connect and wait for orders
*/
private void go()
{
connect();
while (true)readData();
}
SimpleNavigator navigator;
BTConnection connection;
DataInputStream dataIn;
DataOutputStream dataOut;
enum Command // copied from GridNavControl project
{
GOTO,TRAVEL,ROTATE;
}
}