import lejos.robotics.subsumption.*;
import lejos.nxt.*;
/**
* Demonstration of the Behavior subsumption classes.
*
* Requires a wheeled vehicle with two independently controlled
* motors connected to motor ports A and C, and
* a touchmsensor connected to sensor port 1 and
* an ultrasonic sensor connected to port 3;
*
* @author Brian Bagnall and Lawrie Griffiths, modified by Roger Glassey
*
*/
public class BumperCar
{
public static void main(String[] args)
{
Motor.A.setSpeed(400);
Motor.C.setSpeed(400);
Behavior b1 = new DriveForward();
Behavior b2 = new DetectWall();
Behavior[] behaviorList =
{
b1, b2
};
Arbitrator arbitrator = new Arbitrator(behaviorList);
LCD.drawString("Bumper Car",0,1);
Button.waitForPress();
arbitrator.start();
}
}
class DriveForward implements Behavior
{
private boolean _suppressed = false;
public boolean takeControl()
{
return true; // this behavior always wants control.
}
public void suppress()
{
_suppressed = true;// standard practice for suppress methods
}
public void action()
{
_suppressed = false;
Motor.A.forward();
Motor.C.forward();
while (!_suppressed)
{
Thread.yield(); //don't exit till suppressed
}
Motor.A.stop(); // not strictly necessary, but good probramming practice
Motor.C.stop();
}
}
class DetectWall implements Behavior
{
public DetectWall()
{
touch = new TouchSensor(SensorPort.S1);
sonar = new UltrasonicSensor(SensorPort.S3);
}
public boolean takeControl()
{
sonar.ping();
Sound.pause(20);
return touch.isPressed() || sonar.getDistance() < 25;
}
public void suppress()
{
//Since this is highest priority behavior, suppress will never be called.
}
public void action()
{
Motor.A.rotate(-180, true);// start Motor.A rotating backward
Motor.C.rotate(-360); // rotate C farther to make the turn
}
private TouchSensor touch;
private UltrasonicSensor sonar;
}