From f65f24b6c5ce4ac379c2cc6e617d3370d1e79d3a Mon Sep 17 00:00:00 2001 From: Miguel Angel Astor Romero Date: Mon, 23 May 2016 12:39:23 -0430 Subject: [PATCH] Added victory behavior. Refactored some names. --- .../ucv/ciens/cicore/icaro/ryabi/RyABI.java | 14 +++--- .../icaro/ryabi/behaviors/BaseBehavior.java | 6 +-- .../behaviors/SensorCalibrationBehavior.java | 2 +- .../ryabi/behaviors/VictoryBehavior.java | 44 +++++++++++++++++++ .../icaro/ryabi/behaviors/WanderBehavior.java | 4 +- .../ryabi/utils/RobotStateSingleton.java | 4 +- 6 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/VictoryBehavior.java diff --git a/src/ve/ucv/ciens/cicore/icaro/ryabi/RyABI.java b/src/ve/ucv/ciens/cicore/icaro/ryabi/RyABI.java index b6dedda..9ca0333 100644 --- a/src/ve/ucv/ciens/cicore/icaro/ryabi/RyABI.java +++ b/src/ve/ucv/ciens/cicore/icaro/ryabi/RyABI.java @@ -18,11 +18,12 @@ import ve.ucv.ciens.cicore.icaro.ryabi.behaviors.WanderBehavior; import ve.ucv.ciens.cicore.icaro.ryabi.sensors.FeatureDetectionListener; import ve.ucv.ciens.cicore.icaro.ryabi.sensors.LightFeatureDetector; import ve.ucv.ciens.cicore.icaro.ryabi.behaviors.SensorCalibrationBehavior; +import ve.ucv.ciens.cicore.icaro.ryabi.behaviors.VictoryBehavior; import ve.ucv.ciens.cicore.icaro.ryabi.utils.QuitButtonListener; @SuppressWarnings("deprecation") public class RyABI { - private static final float WHEEL_RADIUS = 56.0f; + private static final float WHEEL_DIAMETER = 56.0f; private static final float TRACK_WIDTH = 155.0f; private static ArcRotateMoveController pilot; @@ -45,7 +46,7 @@ public class RyABI { light = new LightSensor(SensorPort.S4); /* Create the pilot. */ - pilot = new CompassPilot(compass, WHEEL_RADIUS, TRACK_WIDTH, Motor.A, Motor.C); + pilot = new CompassPilot(compass, WHEEL_DIAMETER, TRACK_WIDTH, Motor.A, Motor.C); /* Create the feature detectors and their listener. */ rangeDetector = new RangeFeatureDetector(sonar, 20, 200); @@ -65,10 +66,11 @@ public class RyABI { Button.ESCAPE.addButtonListener(new QuitButtonListener()); /* Create the behaviors. */ - behaviors = new Behavior[3]; - behaviors[0] = new WanderBehavior(pilot, sonar, touch, light, compass, WHEEL_RADIUS, TRACK_WIDTH); - behaviors[1] = new SensorCalibrationBehavior(sonar, touch, light, compass, WHEEL_RADIUS, TRACK_WIDTH); - behaviors[2] = new AvoidObstaclesBehavior(pilot, sonar, touch, light, compass, WHEEL_RADIUS, TRACK_WIDTH); + behaviors = new Behavior[4]; + behaviors[0] = new WanderBehavior(pilot, sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH); + behaviors[1] = new SensorCalibrationBehavior(sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH); + behaviors[2] = new AvoidObstaclesBehavior(pilot, sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH); + behaviors[3] = new VictoryBehavior(pilot, sonar, touch, light, compass, WHEEL_DIAMETER, TRACK_WIDTH); /* Start the program. */ arbitrator = new Arbitrator(behaviors, true); diff --git a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/BaseBehavior.java b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/BaseBehavior.java index 14950c1..3dec5ff 100644 --- a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/BaseBehavior.java +++ b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/BaseBehavior.java @@ -13,16 +13,16 @@ public abstract class BaseBehavior implements Behavior { protected TouchSensor touch; protected CompassHTSensor compass; protected LightSensor light; - protected float wheelRadius; + protected float wheelDiameter; protected float trackWidth; - public BaseBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelRadius, float trackWidth) { + public BaseBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelDiameter, float trackWidth) { this.pilot = pilot; this.sonar = sonar; this.touch = touch; this.compass = compass; this.light = light; - this.wheelRadius = wheelRadius; + this.wheelDiameter = wheelDiameter; this.trackWidth = trackWidth; } diff --git a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/SensorCalibrationBehavior.java b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/SensorCalibrationBehavior.java index 601632c..a3ac395 100644 --- a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/SensorCalibrationBehavior.java +++ b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/SensorCalibrationBehavior.java @@ -24,7 +24,7 @@ public class SensorCalibrationBehavior extends BaseBehavior { @Override public void action() { System.out.println("Calib. compass"); - DifferentialPilot p = new DifferentialPilot(wheelRadius, trackWidth, Motor.A, Motor.C); + DifferentialPilot p = new DifferentialPilot(wheelDiameter, trackWidth, Motor.A, Motor.C); p.setRotateSpeed(25); compass.startCalibration(); p.rotate(720, false); diff --git a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/VictoryBehavior.java b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/VictoryBehavior.java new file mode 100644 index 0000000..36da29b --- /dev/null +++ b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/VictoryBehavior.java @@ -0,0 +1,44 @@ +package ve.ucv.ciens.cicore.icaro.ryabi.behaviors; + +import java.io.File; + +import lejos.nxt.LightSensor; +import lejos.nxt.Sound; +import lejos.nxt.TouchSensor; +import lejos.nxt.UltrasonicSensor; +import lejos.nxt.addon.CompassHTSensor; +import lejos.robotics.navigation.ArcRotateMoveController; +import ve.ucv.ciens.cicore.icaro.ryabi.utils.RobotStateSingleton; + +public class VictoryBehavior extends BaseBehavior { + private RobotStateSingleton state; + private File musicSample; + + public VictoryBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, + CompassHTSensor compass, float wheelDiameter, float trackWidth) { + super(pilot, sonar, touch, light, compass, wheelDiameter, trackWidth); + + state = RobotStateSingleton.getInstance(); + musicSample = new File("victory.wav"); + if(!musicSample.exists()) + musicSample = null; + } + + @Override + public boolean takeControl() { + return state.getState() == RobotStateSingleton.States.VICTORY; + } + + @Override + public void action() { + if(musicSample != null) { + int milis = Sound.playSample(musicSample); + try { Thread.sleep(milis); } catch(InterruptedException ie) { } + } + state.setState(RobotStateSingleton.States.DONE); + } + + @Override + public void suppress() { } + +} diff --git a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/WanderBehavior.java b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/WanderBehavior.java index 1fa2203..d23d224 100644 --- a/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/WanderBehavior.java +++ b/src/ve/ucv/ciens/cicore/icaro/ryabi/behaviors/WanderBehavior.java @@ -13,8 +13,8 @@ import ve.ucv.ciens.cicore.icaro.ryabi.utils.RobotStateSingleton; public class WanderBehavior extends BaseBehavior { private RobotStateSingleton state; - public WanderBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelRadius, float trackWidth) { - super(pilot, sonar, touch, light, compass, wheelRadius, trackWidth); + public WanderBehavior(ArcRotateMoveController pilot, UltrasonicSensor sonar, TouchSensor touch, LightSensor light, CompassHTSensor compass, float wheelDiameter, float trackWidth) { + super(pilot, sonar, touch, light, compass, wheelDiameter, trackWidth); state = RobotStateSingleton.getInstance(); diff --git a/src/ve/ucv/ciens/cicore/icaro/ryabi/utils/RobotStateSingleton.java b/src/ve/ucv/ciens/cicore/icaro/ryabi/utils/RobotStateSingleton.java index e418801..3337721 100644 --- a/src/ve/ucv/ciens/cicore/icaro/ryabi/utils/RobotStateSingleton.java +++ b/src/ve/ucv/ciens/cicore/icaro/ryabi/utils/RobotStateSingleton.java @@ -15,7 +15,7 @@ public final class RobotStateSingleton { return SingletonHolder.INSTANCE; } - public void setState(States state) { + public synchronized void setState(States state) { this.state = state; } @@ -24,6 +24,6 @@ public final class RobotStateSingleton { } public enum States { - WANDER, SEARCH_BALL, BALL_FOUND, VICTORY; + WANDER, SEARCH_BALL, BALL_FOUND, VICTORY, DONE; } }