diff --git a/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java b/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java new file mode 100644 index 0000000000000000000000000000000000000000..810652978dacb9f786ca0584617cd194d687d53e --- /dev/null +++ b/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java @@ -0,0 +1,43 @@ +package mv3302; + +import mv3302.sensor.SimpleConstantRateSensor; +import simkit.SimEntityBase; +import simkit.random.RandomVariate; +import simkit.smd.Mover; + +/** + * + * @author dansl + */ +public class SimpleConstantRateMediator extends SimEntityBase { + + public RandomVariate exponentialGenerator; + + public void doEnterRange(Mover target, SimpleConstantRateSensor sensor) { + if (!sensor.getContacts().contains(target)) { + sensor.waitDelay("Detection", exponentialGenerator.generate(), target); + } + + } + + public void doExitRange(Mover target, SimpleConstantRateSensor sensor) { + if (!sensor.getContacts().contains(target)) { + sensor.waitDelay("Undetection", exponentialGenerator.generate(), target); + } + } + + /** + * @return the exponentialGenerator + */ + public RandomVariate getExponentialGenerator() { + return exponentialGenerator; + } + + /** + * @param exponentialGenerator the exponentialGenerator to set + */ + public void setExponentialGenerator(RandomVariate exponentialGenerator) { + this.exponentialGenerator = exponentialGenerator; + } + +} diff --git a/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java b/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java new file mode 100644 index 0000000000000000000000000000000000000000..8f1789c99302967ea5fc901e91b9311776ccbbbb --- /dev/null +++ b/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java @@ -0,0 +1,30 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package mv3302; + +import mv3302.sensor.SimpleConstantTimeSensor; +import simkit.SimEntityBase; +import simkit.smd.Mover; + +/** + * + * @author dansl + */ +public class SimpleConstantTimeMediator extends SimEntityBase { + + public void doEnterRange(Mover target, SimpleConstantTimeSensor sensor) { + if (!sensor.getContacts().contains(target)) { + sensor.waitDelay("Detection", sensor.getTimeToDetect(), target); + } + + } + + public void doExitRange(Mover target, SimpleConstantTimeSensor sensor) { + if (!sensor.getContacts().contains(target)) { + sensor.waitDelay("Undetection", 0.0, target); + } + } + +} diff --git a/MV3302ClassCode/src/mv3302/SimpleCookieCutterMediator.java b/MV3302ClassCode/src/mv3302/SimpleCookieCutterMediator.java new file mode 100644 index 0000000000000000000000000000000000000000..831f3e7764bee063d2a07adcc33847262b10e15c --- /dev/null +++ b/MV3302ClassCode/src/mv3302/SimpleCookieCutterMediator.java @@ -0,0 +1,28 @@ +package mv3302; + +import mv3302.sensor.SimpleCookieCutterSensor; +import simkit.SimEntityBase; +import simkit.smd.Mover; + +/** + * + * @author dansl + */ +public class SimpleCookieCutterMediator extends SimEntityBase { + + public void doEnterRange(Mover target, SimpleCookieCutterSensor sensor) { + if (!sensor.getContacts().contains(target)) { + sensor.waitDelay("Detection", 0.0, target); + } + + } + + public void doExitRange(Mover target, SimpleCookieCutterSensor sensor) { + if (!sensor.getContacts().contains(target)) { + sensor.waitDelay("Undetection", 0.0, target); + } + if (!sensor.getContacts().contains(target)) { + interrupt("Detection", 0.0, target); + } + } +} diff --git a/MV3302ClassCode/src/mv3302/SimpleMover.java b/MV3302ClassCode/src/mv3302/SimpleMover.java index a28e919049ebf27842408d74851267f8327cd67a..29010a428ef8b6b0bdb9f6fba85d646aaa113bda 100644 --- a/MV3302ClassCode/src/mv3302/SimpleMover.java +++ b/MV3302ClassCode/src/mv3302/SimpleMover.java @@ -222,7 +222,7 @@ public class SimpleMover extends SimEntityBase implements Mover { * @return copy of the initialLocation */ public Point2D getInitialLocation() { - return (Point2D) initialLocation.clone(); + return (Point2D) initialLocation; } /** @@ -247,7 +247,7 @@ public class SimpleMover extends SimEntityBase implements Mover { * @return copy of the lastStopLocation */ public Point2D getLastStopLocation() { - return (Point2D) lastStopLocation.clone(); + return (Point2D) lastStopLocation; } /** diff --git a/MV3302ClassCode/src/mv3302/SimpleReferee.java b/MV3302ClassCode/src/mv3302/SimpleReferee.java new file mode 100644 index 0000000000000000000000000000000000000000..bbb60c27b49044c8a9147056d64d8921965a99ec --- /dev/null +++ b/MV3302ClassCode/src/mv3302/SimpleReferee.java @@ -0,0 +1,197 @@ +package mv3302; + +import java.awt.geom.Point2D; +import static java.lang.Math.sqrt; +import java.util.ArrayList; +import java.util.List; +import simkit.SimEntityBase; +import static simkit.smd.Math2D.ZERO; +import simkit.smd.Mover; +import simkit.smd.Sensor; + +/** + * + * @author dsloan + */ +public final class SimpleReferee extends SimEntityBase { + + private List<Sensor> sensors; + + private List<Mover> targets; + + public SimpleReferee() { + } + + public SimpleReferee(List<Sensor> sensors, List<Mover> targets) { + setSensors(sensors); + setTargets(targets); + } + + public void doRun() { + if (!sensors.isEmpty()) { + waitDelay("InitSensor", 0.0, 0); + } + } + + public void doInitSensor(int i) { + sensors.get(i).addSimEventListener(this); + + if (i < sensors.size() - 1) { + waitDelay("InitSensor", 0.0, i + 1); + } + + waitDelay("InitTarget", 0.0, i, 0); + } + + public void doInitTarget(int i, int j) { + targets.get(j).addSimEventListener(this); + if (j < targets.size() - 1) { + waitDelay("InitTarget", 0.0, i, j + 1); + } + + if (targets.get(j).getCurrentLocation().distance(sensors.get(i).getCurrentLocation()) < sensors.get(i).getMaxRange()) { + if (!targets.get(j).equals(sensors.get(i).getMover())) { + waitDelay("EnterRange", 0.0, targets.get(j), sensors.get(i)); + } + } + } + + public void doUpdateSensor(int i, Mover target) { + Sensor sensor = sensors.get(i); + if (!sensor.equals(target)) { + double[] times = getEnterExitTimes(target, sensor); + switch (times.length) { + case 0 -> { + } + case 1 -> { + interrupt("ExitRange", target, sensor); + waitDelay("ExitRange", times[0], target, sensor); + } + case 2 -> { + interrupt("EnterRange", target, sensor); + waitDelay("EnterRange", times[0], target, sensor); + } + } + } + + if (i < sensors.size() - 1) { + waitDelay("UpdateSensor", 0.0, i + 1, target); + } + + } + public void doStartMove(Mover target) { + waitDelay("UpdateSensor", 0.0, 0, target); + } + + public void doStop(Mover target) { + waitDelay("UpdateSensor", 0.0, 0, target); + } + + public void doUpdateTarget(int i, Sensor sensor) { + Mover target = targets.get(i); + double[] times = getEnterExitTimes(target, sensor); + switch (times.length) { + case 0 -> { + } + case 1 -> { + interrupt("ExitRange", target, sensor); + waitDelay("ExitRange", times[0], target, sensor); + } + case 2 -> { + interrupt("EnterRange", target, sensor); + waitDelay("EnterRange", times[0], target, sensor); + } + } + + if (i < targets.size() - 1) { + waitDelay("UpdateTarget", i + 1, sensor); + } + } + + public void doStartMove(Sensor sensor) { + waitDelay("UpdateTarget", 0.0, 0, sensor); + } + + public void doStop(Sensor sensor) { + waitDelay("UpdateTarget", 0.0, 0, sensor); + } + + public void doEnterRange(Mover target, Sensor sensor) { + double[] times = getEnterExitTimes(target, sensor); + if (times.length == 1) { + waitDelay("ExitRange", times[0], target, sensor); + } else if (times.length == 2) { + waitDelay("ExitRange", times[1], target, sensor); + } + } + + public void doExitRange(Mover target, Sensor sensor) { + } + + private double[] getEnterExitTimes(Mover target, Sensor sensor) { + double[] times; + + Point2D relativeLocation = new Point2D.Double( + target.getCurrentLocation().getX() - sensor.getCurrentLocation().getX(), + target.getCurrentLocation().getY() - sensor.getCurrentLocation().getY() + ); + Point2D relativeVelocity = new Point2D.Double( + target.getVelocity().getX() - sensor.getVelocity().getX(), + target.getVelocity().getY() - sensor.getVelocity().getY() + ); + + double velocitySquared = relativeVelocity.distanceSq(ZERO); + double distanceSqured = relativeLocation.distanceSq(ZERO); + + double innerProduct = relativeLocation.getX() * relativeVelocity.getX() + + relativeLocation.getY() * relativeVelocity.getY(); + + double determinant = velocitySquared * (sensor.getMaxRange() * sensor.getMaxRange() + - distanceSqured) + innerProduct * innerProduct; + if (determinant < 0.0) { + times = new double[0]; + } else { + double first = -innerProduct / velocitySquared; + double smallerRoot = first - sqrt(determinant) / velocitySquared; + double biggerRoot = first + sqrt(determinant) / velocitySquared; + if (smallerRoot > 0.0) { + times = new double[]{smallerRoot, biggerRoot}; + } else if (biggerRoot > 0) { + times = new double[]{biggerRoot}; + } else { + times = new double[0]; + } + } + + return times; + } + + /** + * @return the sensors + */ + public List<Sensor> getSensors() { + return new ArrayList<>(sensors); + } + + /** + * @param sensors the sensors to set + */ + public void setSensors(List<Sensor> sensors) { + this.sensors = new ArrayList<>(sensors); + } + + /** + * @return the targets + */ + public List<Mover> getTargets() { + return new ArrayList<>(targets); + } + + /** + * @param targets the targets to set + */ + public void setTargets(List<Mover> targets) { + this.targets = new ArrayList<>(targets); + } + +} \ No newline at end of file diff --git a/MV3302ClassCode/src/mv3302/run/Assignment7.java b/MV3302ClassCode/src/mv3302/run/Assignment7.java index 241d6c5094be559537b9b628d05e693e76a6107a..ca0f41ed2fb478afcba096d4124dd248c2a1c877 100644 --- a/MV3302ClassCode/src/mv3302/run/Assignment7.java +++ b/MV3302ClassCode/src/mv3302/run/Assignment7.java @@ -5,12 +5,15 @@ package mv3302.run; import java.awt.geom.Point2D; +import java.util.Arrays; +import mv3302.SimpleCookieCutterMediator; import mv3302.SimpleMover; import mv3302.SimplePathMoverManager; -import mv3302.sensor.SimpleConstantRateSensor; -import mv3302.sensor.SimpleConstantTimeSensor; +import mv3302.SimpleReferee; import mv3302.sensor.SimpleCookieCutterSensor; import simkit.Schedule; +import simkit.smd.Mover; +import simkit.smd.Sensor; import simkit.util.SimplePropertyDumper; /** @@ -23,49 +26,41 @@ public class Assignment7 { * @param args the command line arguments */ public static void main(String[] args) { - SimpleCookieCutterSensor cookieCutterSensor = new SimpleCookieCutterSensor(); - cookieCutterSensor.setSimpleMover(new SimpleMover()); - cookieCutterSensor.setMaxRange(10.0); - System.out.println(cookieCutterSensor); - SimpleConstantTimeSensor constantTimeSensor = new SimpleConstantTimeSensor(); - constantTimeSensor.setSimpleMover(new SimpleMover()); - constantTimeSensor.setMaxRange(10); - constantTimeSensor.setTimeToDetect(5.0); - System.out.println(constantTimeSensor); + Mover[] targets = new Mover[]{ + new SimpleMover(new Point2D.Double(30.0, 40.0), 20.0), + new SimpleMover(new Point2D.Double(0, 0), 20.0) + }; - SimpleConstantRateSensor constantRateSensor = new SimpleConstantRateSensor(); - constantRateSensor.setSimpleMover(new SimpleMover()); - constantRateSensor.setMaxRange(10.0); - constantRateSensor.setMeanTimeToDetect(3.0); - System.out.println(constantRateSensor); + Point2D[] targetPath = new Point2D[]{new Point2D.Double(-30.0, -40.0), new Point2D.Double(60.0, 80.0)}; + Point2D[] sensorPath = new Point2D[]{new Point2D.Double(30.0, 40.0)}; + SimplePathMoverManager[] targetMoverManager = new SimplePathMoverManager[]{ + new SimplePathMoverManager(targetPath, true), + new SimplePathMoverManager(sensorPath, true) + }; - Point2D sensorLocation = new Point2D.Double(0.0, 0.0); - SimpleMover simpleSensorMover = new SimpleMover(); - double maxRange = 20.0; - double timeToDetect = 5.0; - SimpleConstantTimeSensor simpleConstantTimeSensor = new SimpleConstantTimeSensor(simpleSensorMover, maxRange, timeToDetect); - System.out.println(simpleSensorMover.paramString()); + Sensor[] sensors = new Sensor[targets.length]; + sensors[0] = new SimpleCookieCutterSensor(targets[0], 30); + sensors[1] = new SimpleCookieCutterSensor(targets[1], 40); - Point2D targetLocation = new Point2D.Double(0.0, 10.0); - double targetMaxSpeed = 40; - SimpleMover simpleMover = new SimpleMover(targetLocation, targetMaxSpeed); - System.out.println(simpleMover.paramString()); - - Point2D[] path = new Point2D[]{new Point2D.Double(50.0, -20.0)}; - SimplePathMoverManager simplePathMoverManager = new SimplePathMoverManager(path, true); - System.out.println(simplePathMoverManager); + SimplePropertyDumper simplePropertyDumper = new SimplePropertyDumper(true); + for (Sensor sensor: sensors) { + sensor.addPropertyChangeListener(simplePropertyDumper); + } + + for (int i = 0; i < targets.length; ++i) { + targets[i].addSimEventListener(targetMoverManager[i]); + targetMoverManager[i].addSimEventListener(targets[i]); + } - simplePathMoverManager.addSimEventListener(simpleMover); - simpleMover.addSimEventListener(simplePathMoverManager); + SimpleReferee simpleReferee = new SimpleReferee(Arrays.asList(sensors), + Arrays.asList(targets)); + System.out.println(simpleReferee); + + SimpleCookieCutterMediator simpleCookieCutterMediator = new SimpleCookieCutterMediator(); + simpleReferee.addSimEventListener(simpleCookieCutterMediator); - SimplePropertyDumper simplePropertyDumper = new SimplePropertyDumper(true); - simpleConstantTimeSensor.addPropertyChangeListener(simplePropertyDumper); - simpleMover.addPropertyChangeListener(simplePropertyDumper); - simplePathMoverManager.addPropertyChangeListener(simplePropertyDumper); - Schedule.setVerbose(true); - Schedule.reset(); Schedule.startSimulation(); } diff --git a/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java b/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java new file mode 100644 index 0000000000000000000000000000000000000000..630dfa055f767e4fd0c1a133d6fa714c74bbe537 --- /dev/null +++ b/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java @@ -0,0 +1,86 @@ +package mv3302.run; + +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; +import mv3302.SimpleCookieCutterMediator; +import mv3302.SimpleMover; +import mv3302.SimplePathMoverManager; +import mv3302.SimpleReferee; +import mv3302.sensor.AbstractSimpleSensor; +import mv3302.sensor.SimpleCookieCutterSensor; +import simkit.Schedule; +import simkit.smd.Mover; +import simkit.smd.Sensor; +import simkit.util.SimplePropertyDumper; + +/** + * + * @author ahbuss + */ +public class Assignment7CookieSensor2Movers { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + + SimpleMover mover1 = new SimpleMover(new Point2D.Double(-20.0, 0.0), 30.0); + AbstractSimpleSensor sensor1 = new SimpleCookieCutterSensor(mover1, 20.0); + Point2D[] moverPath1 = new Point2D[]{ + new Point2D.Double(100.0, 0.0) + }; + SimplePathMoverManager moverManager1 = new SimplePathMoverManager(moverPath1, true); + + mover1.addSimEventListener(moverManager1); + moverManager1.addSimEventListener(mover1); + + SimpleMover mover2 = new SimpleMover(new Point2D.Double(50.0, 0.0), 40.0); + AbstractSimpleSensor sensor2 = new SimpleCookieCutterSensor(mover2, 30.0); + Point2D[] moverPath2 = new Point2D[] { + new Point2D.Double(-100.0, 0.0) + }; + SimplePathMoverManager moverManager2 = new SimplePathMoverManager(moverPath2, true); + mover2.addSimEventListener(moverManager2); + moverManager2.addSimEventListener(mover2); + + SimplePropertyDumper simplePropertyDumper = new SimplePropertyDumper(true); + mover1.addPropertyChangeListener(simplePropertyDumper); + moverManager1.addPropertyChangeListener(simplePropertyDumper); + sensor1.addPropertyChangeListener(simplePropertyDumper); + + mover2.addPropertyChangeListener(simplePropertyDumper); + moverManager2.addPropertyChangeListener(simplePropertyDumper); + sensor2.addPropertyChangeListener(simplePropertyDumper); + + List<Mover> targets = new ArrayList<>(); + targets.add(mover1); + targets.add(mover2); + + List<Sensor> sensors = new ArrayList<>(); + sensors.add(sensor1); + sensors.add(sensor2); + + SimpleReferee referee = new SimpleReferee(sensors, targets); + + SimpleCookieCutterMediator mediator1 = new SimpleCookieCutterMediator(); + referee.addSimEventListener(mediator1); + + System.out.println(mover1.paramString()); + System.out.println(moverManager1); + System.out.println(sensor1.paramString()); + + System.out.println(mover2.paramString()); + System.out.println(moverManager2); + System.out.println(sensor2.paramString()); + + System.out.println(referee); + + Schedule.setVerbose(true); + + Schedule.reset(); + Schedule.startSimulation(); + + } + +} diff --git a/MV3302ClassCode/src/mv3302/run/TestAnimations.java b/MV3302ClassCode/src/mv3302/run/TestAnimations.java new file mode 100644 index 0000000000000000000000000000000000000000..ca548c6d861eb07147fec3534d049b1f3a02b4b4 --- /dev/null +++ b/MV3302ClassCode/src/mv3302/run/TestAnimations.java @@ -0,0 +1,110 @@ +import java.awt.Color; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; +import mv3302.SimpleCookieCutterMediator; +import mv3302.SimpleMover; +import mv3302.SimplePatrolMoverManager; +import mv3302.SimpleReferee; +import mv3302.sensor.AbstractSimpleSensor; +import mv3302.sensor.SimpleCookieCutterSensor; +import simkit.Schedule; +import simkit.animate.SandboxFrame; +import simkit.smd.Mover; +import simkit.smd.Sensor; +import simkit.util.PropertyChangeFrame; + +/** + * + * @author ahbuss + */ +public class TestAnimations { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + + SimpleMover mover1 = new SimpleMover(new Point2D.Double(-20.0, 0.0), 30.0); + AbstractSimpleSensor sensor1 = new SimpleCookieCutterSensor(mover1, 20.0); + Point2D[] moverPath1 = new Point2D[]{ + new Point2D.Double(100.0, 0.0), + mover1.getInitialLocation() + }; + SimplePatrolMoverManager moverManager1 = new SimplePatrolMoverManager(moverPath1, true); + + mover1.addSimEventListener(moverManager1); + moverManager1.addSimEventListener(mover1); + + SimpleMover mover2 = new SimpleMover(new Point2D.Double(50.0, 0.0), 40.0); + AbstractSimpleSensor sensor2 = new SimpleCookieCutterSensor(mover2, 30.0); + Point2D[] moverPath2 = new Point2D[] { + new Point2D.Double(-100.0, 0.0), + mover2.getInitialLocation() + }; + SimplePatrolMoverManager moverManager2 = new SimplePatrolMoverManager(moverPath2, true); + mover2.addSimEventListener(moverManager2); + moverManager2.addSimEventListener(mover2); + +// PropertyChangeListener propertyChangeFrame = new SimplePropertyDumper(true); + PropertyChangeFrame propertyChangeFrame = new PropertyChangeFrame(); +// mover1.addPropertyChangeListener(propertyChangeFrame); +// moverManager1.addPropertyChangeListener(propertyChangeFrame); + sensor1.addPropertyChangeListener("detection", propertyChangeFrame); + sensor1.addPropertyChangeListener("undetection", propertyChangeFrame); + +// mover2.addPropertyChangeListener(propertyChangeFrame); +// moverManager2.addPropertyChangeListener(propertyChangeFrame); + sensor2.addPropertyChangeListener("detection", propertyChangeFrame); + sensor2.addPropertyChangeListener("undetection", propertyChangeFrame); +// + List<Mover> targets = new ArrayList<>(); + targets.add(mover1); + targets.add(mover2); + + List<Sensor> sensors = new ArrayList<>(); + sensors.add(sensor1); + sensors.add(sensor2); + + SimpleReferee referee = new SimpleReferee(sensors, targets); + + SimpleCookieCutterMediator mediator1 = new SimpleCookieCutterMediator(); + referee.addSimEventListener(mediator1); + + System.out.println(mover1.paramString()); + System.out.println(moverManager1); + System.out.println(sensor1.paramString()); + + System.out.println(mover2.paramString()); + System.out.println(moverManager2); + System.out.println(sensor2.paramString()); + + System.out.println(referee); + + Schedule.setVerbose(false); + +// Schedule.stopOnEvent(5, "Detection", SimpleMover.class); + + + SandboxFrame sandboxFrame = new SandboxFrame("Simple Referee"); + sandboxFrame.getSandbox().setOrigin(new Point2D.Double(200, 200)); + sandboxFrame.getSandbox().setDrawAxes(true); + + sandboxFrame.addMover(mover1, Color.BLUE); + sandboxFrame.addSensor(sensor1, Color.RED); + sandboxFrame.addMover(mover2, Color.GREEN); + sandboxFrame.addSensor(sensor2, Color.ORANGE); + + sandboxFrame.setVisible(true); + + propertyChangeFrame.setLocation(sandboxFrame.getX() + sandboxFrame.getWidth(), sandboxFrame.getY()); + propertyChangeFrame.setVisible(true); + Schedule.reset(); + + Schedule.addIgnoreOnDump("Ping"); + +// Schedule.startSimulation(); + + } + +} diff --git a/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java b/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java index 09568c82ebd9a3751613ae2b3da326c5ecf58c7f..b4669591385c862be130e7f5b4777cb3510c5b63 100644 --- a/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java @@ -1,109 +1,134 @@ - package mv3302.sensor; import java.awt.geom.Point2D; import java.util.HashSet; import java.util.Set; -import mv3302.SimpleMover; import simkit.SimEntityBase; +import simkit.smd.Mover; + +import simkit.smd.Sensor; /** * - * @author dansl + * @author ahbuss */ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sensor { - public double maxRange; - public SimpleMover simpleMover; - public Set<SimpleMover> contacts; + private Mover mover; + + private double maxRange; + + protected Set<Mover> contacts; public AbstractSimpleSensor() { contacts = new HashSet<>(); } - public AbstractSimpleSensor(SimpleMover simpleMover, double maxRange) { + public AbstractSimpleSensor(Mover mover, double maxRange) { this(); - setSimpleMover(simpleMover); + setMover(mover); setMaxRange(maxRange); } - public void doRun() { + @Override + public void reset() { + super.reset(); contacts.clear(); } - public void doDetection(SimpleMover simpleMover) { - Set<SimpleMover> oldContacts = getContacts(); - contacts.add(simpleMover); + public void doRun() { + firePropertyChange("contacts", getContacts()); + } + + public void doDetection(Mover target) { + Set<Mover> oldContacts = getContacts(); + contacts.add(target); firePropertyChange("contacts", oldContacts, getContacts()); - firePropertyChange("detection", simpleMover); + firePropertyChange("detection", target); } - public void doUndetection(SimpleMover simpleMover) { - Set<SimpleMover> oldContacts = getContacts(); - contacts.remove(simpleMover); + public void doUndetection(Mover target) { + Set<Mover> oldContacts = getContacts(); + contacts.remove(target); firePropertyChange("contacts", oldContacts, getContacts()); - firePropertyChange("undetection", simpleMover); + firePropertyChange("undetection", target); } - public void doStartMove(SimpleMover simpleMover) { + public void doStartMove(Mover mover) { waitDelay("StartMove", 0.0, this); } - public void doStartMove(Sensor sensor) { - } - - public void doStop(SimpleMover simpleMover) { + public void doStop(Mover mover) { waitDelay("Stop", 0.0, this); } - public void doStop(Sensor sensor) { - + /** + * @param mover the mover to set + */ + public void setMover(Mover mover) { + this.mover = mover; + this.mover.addSimEventListener(this); } + /** + * @return the maxRange + */ @Override - public Point2D getCurrentLocation() { - return simpleMover.getCurrentLocation(); - } - - public Point2D getVelocity() { - return simpleMover.getVelocity(); - } - - public void setSimpleMover(SimpleMover simpleMover) { - this.simpleMover = simpleMover; + public double getMaxRange() { + return maxRange; } + /** + * @param maxRange the maxRange to set + */ public void setMaxRange(double maxRange) { - if (maxRange <= 0.0) { - throw new IllegalArgumentException("maxRange must be > 0.0: " + maxRange); + if (maxRange < 0.0) { + throw new IllegalArgumentException("maxRange must be ≥ 0.0: " + maxRange); } this.maxRange = maxRange; } - public Set<SimpleMover> getContacts() { + /** + * @return the contacts + */ + @Override + public Set<Mover> getContacts() { return new HashSet<>(contacts); } @Override - public String toString() { - return String.format("%s %s", getSimpleMover(), getMaxRange()); + public Mover getMover() { + return mover; } - /** - * @return the maxRange - */ @Override - public double getMaxRange() { - return maxRange; + public Point2D getCurrentLocation() { + return mover.getCurrentLocation(); } - /** - * @return the simpleMover - */ @Override - public SimpleMover getSimpleMover() { - return simpleMover; + public Point2D getVelocity() { + return mover.getVelocity(); } + + @Override + public void doStartMove(Sensor sensor) { + } + + @Override + public void doStop(Sensor sensor) { + } + + public String paramString() { + return super.toString(); + } + + @Override + public String toString() { + return String.format("%s %s %s %,.4f", getName(), mover.getCurrentLocation(), mover.getVelocity(), + getMaxRange()); + } + } diff --git a/MV3302ClassCode/src/mv3302/sensor/Sensor.java b/MV3302ClassCode/src/mv3302/sensor/Sensor.java index 7c2c05bd81558e534bc9f21be360080f822d6f4b..4b3c217bdaa0c0ca8e9c7bbd874cee1370f5b330 100644 --- a/MV3302ClassCode/src/mv3302/sensor/Sensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/Sensor.java @@ -2,8 +2,8 @@ package mv3302.sensor; import java.awt.geom.Point2D; import java.util.Set; -import mv3302.SimpleMover; import simkit.SimEntity; +import simkit.smd.Mover; /** * @@ -14,9 +14,9 @@ interface Sensor extends SimEntity { public Point2D getCurrentLocation(); public Point2D getVelocity(); public double getMaxRange(); - public void doStartMove(SimpleMover simpleMover); - public void doStop(SimpleMover simpleMover); - public SimpleMover getSimpleMover(); - public Set<SimpleMover> getContacts(); + public void doStartMove(Mover mover); + public void doStop(Mover mover); + public Mover getMover(); + public Set<Mover> getContacts(); } diff --git a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java index ba79c9b4884364f0ba510e33877fcd260ccc81fa..8f13494f739e0c9ff864bd97844c951cc39965c8 100644 --- a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java @@ -1,8 +1,7 @@ package mv3302.sensor; -import java.util.HashSet; -import mv3302.SimpleMover; +import simkit.smd.Mover; /** * @@ -13,13 +12,11 @@ public class SimpleConstantRateSensor extends AbstractSimpleSensor { private double meanTimeToDetect; public SimpleConstantRateSensor() { - contacts = new HashSet<>(); + super(); } - public SimpleConstantRateSensor(SimpleMover simpleMover, double maxRange, double meanTimeToDetect) { - this(); - setSimpleMover(simpleMover); - setMaxRange(maxRange); + public SimpleConstantRateSensor(Mover mover, double maxRange, double meanTimeToDetect) { + super(mover, maxRange); setMeanTimeToDetect(meanTimeToDetect); } diff --git a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java index da862ca78440a0fe7629004d82c6e0a69c79d553..ee004a827bddc6e395d188bce98a2763e7c1e2f0 100644 --- a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java @@ -2,7 +2,7 @@ package mv3302.sensor; import java.util.HashSet; -import mv3302.SimpleMover; +import simkit.smd.Mover; /** * @@ -13,17 +13,15 @@ public class SimpleConstantTimeSensor extends AbstractSimpleSensor { private double timeToDetect; public SimpleConstantTimeSensor() { - contacts = new HashSet<>(); + super(); } - public SimpleConstantTimeSensor(SimpleMover simpleMover, double maxRange, double timeToDetect) { - this(); - setSimpleMover(simpleMover); - setMaxRange(maxRange); + public SimpleConstantTimeSensor(Mover mover, double maxRange, double timeToDetect) { + super(mover, maxRange); setTimeToDetect(timeToDetect); } - double getTimeToDetect() { + public double getTimeToDetect() { return timeToDetect; } diff --git a/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java b/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java index b1d3fdc10fa4bb13a711bf3329f1508cebe61050..94dd4759c12b53a7795f203fd8ba713e194c13d0 100644 --- a/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java @@ -1,23 +1,19 @@ package mv3302.sensor; -import java.util.HashSet; -import mv3302.SimpleMover; +import simkit.smd.Mover; /** * - * @author dansl + * @author ahbuss */ public class SimpleCookieCutterSensor extends AbstractSimpleSensor { - + public SimpleCookieCutterSensor() { - contacts = new HashSet<>(); + super(); } - - public SimpleCookieCutterSensor(SimpleMover simpleMover, double maxRange) { - this(); - setSimpleMover(simpleMover); - setMaxRange(maxRange); + + public SimpleCookieCutterSensor(Mover mover, double maxRange) { + super(mover, maxRange); } - }