diff --git a/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java b/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java index 810652978dacb9f786ca0584617cd194d687d53e..d6bfb4e70161d51a4956d19333322e74617cbdec 100644 --- a/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java +++ b/MV3302ClassCode/src/mv3302/SimpleConstantRateMediator.java @@ -6,20 +6,63 @@ import simkit.random.RandomVariate; import simkit.smd.Mover; /** - * - * @author dansl + * The SimpleConstantRateMediator class represents a mediator that manages the + * interactions between a Mover object and a SimpleConstantRateSensor object. It + * extends the SimEntityBase class, which provides basic simulation entity + * functionality. */ -public class SimpleConstantRateMediator extends SimEntityBase { +public final class SimpleConstantRateMediator extends SimEntityBase { - public RandomVariate exponentialGenerator; + /** + * Constructs a SimpleConstantRateMediator object with the specified + * exponential generator. + * + * @param exponentialGenerator the exponential generator to be used by the + * mediator + */ + public SimpleConstantRateMediator(RandomVariate exponentialGenerator1) { + setExponentialGenerator(exponentialGenerator1); + } + + protected RandomVariate exponentialGenerator; - public void doEnterRange(Mover target, SimpleConstantRateSensor sensor) { + /** + * Constructs a SimpleConstantRateMediator object with the specified + * exponential generator. + * + * @param exponentialGenerator the exponential generator to be used by the + * mediator + */ + public void SimpleConstantRateMediator(RandomVariate exponentialGenerator) { + setExponentialGenerator(exponentialGenerator); + } + + /** + * Performs the necessary actions when a Mover object enters the range of a + * SimpleConstantRateSensor object. If the target is not already detected by + * the sensor, it waits for a detection delay generated by the exponential + * generator. + * + * @param target the Mover object that entered the sensor's range + * @param sensor the SimpleConstantRateSensor object that detected the + * target + */ + public void doEnterRange(Mover target, SimpleConstantRateSensor sensor) { if (!sensor.getContacts().contains(target)) { sensor.waitDelay("Detection", exponentialGenerator.generate(), target); } - } + /** + * Performs the necessary actions when a Mover object exits the range of a + * SimpleConstantRateSensor object. If the target is not already undetected + * by the sensor, it waits for an undetection delay generated by the + * exponential generator. + * + * @param target the Mover object that exited the sensor's range + * @param sensor the SimpleConstantRateSensor object that lost contact with + * the target + */ public void doExitRange(Mover target, SimpleConstantRateSensor sensor) { if (!sensor.getContacts().contains(target)) { sensor.waitDelay("Undetection", exponentialGenerator.generate(), target); @@ -27,14 +70,18 @@ public class SimpleConstantRateMediator extends SimEntityBase { } /** - * @return the exponentialGenerator + * Retrieves the exponential generator used by the mediator. + * + * @return the exponential generator used by the mediator */ public RandomVariate getExponentialGenerator() { return exponentialGenerator; } /** - * @param exponentialGenerator the exponentialGenerator to set + * Sets the exponential generator for the mediator. + * + * @param exponentialGenerator the exponential generator to be set */ public void setExponentialGenerator(RandomVariate exponentialGenerator) { this.exponentialGenerator = exponentialGenerator; diff --git a/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java b/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java index 8f1789c99302967ea5fc901e91b9311776ccbbbb..cfae58f305d0522f53e8d4f0dd4d157da3dcfb30 100644 --- a/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java +++ b/MV3302ClassCode/src/mv3302/SimpleConstantTimeMediator.java @@ -1,7 +1,3 @@ -/* - * 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; @@ -9,22 +5,37 @@ import simkit.SimEntityBase; import simkit.smd.Mover; /** - * - * @author dansl + * The SimpleConstantTimeMediator class represents a mediator between a target + * Mover object and a SimpleConstantTimeSensor object. It extends the + * SimEntityBase class, which provides basic simulation entity functionality. */ public class SimpleConstantTimeMediator extends SimEntityBase { + /** + * Performs the necessary actions when the target Mover enters the range of + * the sensor. + * + * @param target The Mover object that entered the range of the sensor. + * @param sensor The SimpleConstantTimeSensor object responsible for + * detecting the target. + */ public void doEnterRange(Mover target, SimpleConstantTimeSensor sensor) { if (!sensor.getContacts().contains(target)) { sensor.waitDelay("Detection", sensor.getTimeToDetect(), target); } - } + /** + * Performs the necessary actions when the target Mover exits the range of + * the sensor. + * + * @param target The Mover object that exited the range of the sensor. + * @param sensor The SimpleConstantTimeSensor object responsible for + * detecting the 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 index 831f3e7764bee063d2a07adcc33847262b10e15c..eb04557f60df5a46e886077c666cd1fd150fbf42 100644 --- a/MV3302ClassCode/src/mv3302/SimpleCookieCutterMediator.java +++ b/MV3302ClassCode/src/mv3302/SimpleCookieCutterMediator.java @@ -5,18 +5,36 @@ import simkit.SimEntityBase; import simkit.smd.Mover; /** - * - * @author dansl + * The SimpleCookieCutterMediator class represents a mediator that interacts + * with a SimpleCookieCutterSensor to handle the detection and undetection of a + * Mover object. It extends the SimEntityBase class, which is a base class for + * simulation entities in SimKit. */ public class SimpleCookieCutterMediator extends SimEntityBase { + /** + * Handles the event when a Mover enters the range of the + * SimpleCookieCutterSensor. If the Mover is not already in the sensor's + * contacts, it waits for a "Detection" event to occur. + * + * @param target The Mover object that entered the sensor's range. + * @param sensor The SimpleCookieCutterSensor responsible for detection. + */ public void doEnterRange(Mover target, SimpleCookieCutterSensor sensor) { if (!sensor.getContacts().contains(target)) { sensor.waitDelay("Detection", 0.0, target); } - } + /** + * Handles the event when a Mover exits the range of the + * SimpleCookieCutterSensor. If the Mover is not already in the sensor's + * contacts, it waits for an "Undetection" event to occur. If the Mover is + * still not detected, it interrupts the ongoing "Detection" event. + * + * @param target The Mover object that exited the sensor's range. + * @param sensor The SimpleCookieCutterSensor responsible for detection. + */ public void doExitRange(Mover target, SimpleCookieCutterSensor sensor) { if (!sensor.getContacts().contains(target)) { sensor.waitDelay("Undetection", 0.0, target); diff --git a/MV3302ClassCode/src/mv3302/SimplePatrolMoverManager.java b/MV3302ClassCode/src/mv3302/SimplePatrolMoverManager.java index 0773257d7b43d078e917b776f66a82af0f78f9a6..51a2b3ca5e90ef7388a1728ffd23464c996fec90 100644 --- a/MV3302ClassCode/src/mv3302/SimplePatrolMoverManager.java +++ b/MV3302ClassCode/src/mv3302/SimplePatrolMoverManager.java @@ -8,7 +8,7 @@ import simkit.smd.Mover; * Instead of stopping at the end, return to the first and cycle through again * until stopped by an external component. * - * @author ahbuss + * @author dansl */ public class SimplePatrolMoverManager extends SimplePathMoverManager { diff --git a/MV3302ClassCode/src/mv3302/SimpleReferee.java b/MV3302ClassCode/src/mv3302/SimpleReferee.java index bbb60c27b49044c8a9147056d64d8921965a99ec..fc5ee20125c9de09a19fe80366feb6eb933e7f26 100644 --- a/MV3302ClassCode/src/mv3302/SimpleReferee.java +++ b/MV3302ClassCode/src/mv3302/SimpleReferee.java @@ -8,31 +8,51 @@ import simkit.SimEntityBase; import static simkit.smd.Math2D.ZERO; import simkit.smd.Mover; import simkit.smd.Sensor; - /** - * - * @author dsloan - */ +The SimpleReferee class represents a referee in a simulation. It extends the SimEntityBase class, +which provides basic functionality for simulation entities. +*/ public final class SimpleReferee extends SimEntityBase { private List<Sensor> sensors; private List<Mover> targets; + /** +Constructs a SimpleReferee object with an empty list of sensors and targets. +*/ + public SimpleReferee() { } + /** +Constructs a SimpleReferee object with the specified lists of sensors and targets. +@param sensors the list of sensors to set +@param targets the list of targets to set +*/ + public SimpleReferee(List<Sensor> sensors, List<Mover> targets) { setSensors(sensors); setTargets(targets); } + /** +Performs the run logic for the referee. If there are sensors present, it waits for the "InitSensor" +event with zero delay. +*/ + public void doRun() { if (!sensors.isEmpty()) { waitDelay("InitSensor", 0.0, 0); } } + /** +Initializes a sensor at the specified index. Adds the sensor as a simulation event listener. +If there are more sensors to initialize, it waits for the "InitSensor" event for the next index. +@param i the index of the sensor to initialize +*/ + public void doInitSensor(int i) { sensors.get(i).addSimEventListener(this); @@ -43,6 +63,14 @@ public final class SimpleReferee extends SimEntityBase { waitDelay("InitTarget", 0.0, i, 0); } + /** +Initializes a target at the specified indices. Adds the target as a simulation event listener. +If there are more targets to initialize, it waits for the "InitTarget" event for the next indices. +Checks if the target is within range of the sensor and waits for the "EnterRange" event if necessary. +@param i the index of the sensor +@param j the index of the target +*/ + public void doInitTarget(int i, int j) { targets.get(j).addSimEventListener(this); if (j < targets.size() - 1) { @@ -55,6 +83,14 @@ public final class SimpleReferee extends SimEntityBase { } } } + + /** +Updates a sensor with a target. Checks if the sensor and target are different and calculates +the enter and exit times. Handles different cases based on the number of times calculated. +If there are more sensors to update, it waits for the "UpdateSensor" event for the next index. +@param i the index of the sensor +@param target the target to update the sensor with +*/ public void doUpdateSensor(int i, Mover target) { Sensor sensor = sensors.get(i); @@ -77,16 +113,39 @@ public final class SimpleReferee extends SimEntityBase { if (i < sensors.size() - 1) { waitDelay("UpdateSensor", 0.0, i + 1, target); } - } + + /** + * Notifies the referee that a target is starting to move. Initiates the "UpdateSensor" event + * with zero delay for the specified target. + * + * @param target the target that is starting to move + */ + public void doStartMove(Mover target) { waitDelay("UpdateSensor", 0.0, 0, target); } + /** + * Notifies the referee that a target has stopped. Initiates the "UpdateSensor" event + * with zero delay for the specified target. + * + * @param target the target that has stopped + */ + public void doStop(Mover target) { waitDelay("UpdateSensor", 0.0, 0, target); } + /** + * Updates a target with a sensor. Checks if the target and sensor are different and calculates + * the enter and exit times. Handles different cases based on the number of times calculated. + * If there are more targets to update, it waits for the "UpdateTarget" event for the next index. + * + * @param i the index of the target + * @param sensor the sensor to update the target with + */ + public void doUpdateTarget(int i, Sensor sensor) { Mover target = targets.get(i); double[] times = getEnterExitTimes(target, sensor); @@ -108,13 +167,35 @@ public final class SimpleReferee extends SimEntityBase { } } + /** + * Notifies the referee that a sensor is starting to move. Initiates the "UpdateTarget" event + * with zero delay for the specified sensor. + * + * @param sensor the sensor that is starting to move + */ + public void doStartMove(Sensor sensor) { waitDelay("UpdateTarget", 0.0, 0, sensor); } + /** + * Notifies the referee that a sensor has stopped. Initiates the "UpdateTarget" event + * with zero delay for the specified sensor. + * + * @param sensor the sensor that has stopped + */ + public void doStop(Sensor sensor) { waitDelay("UpdateTarget", 0.0, 0, sensor); } + + /** + * Performs the actions when a target enters the range of a sensor. Calculates the enter and exit times + * and waits for the "ExitRange" event if necessary. + * + * @param target the target that entered the range + * @param sensor the sensor that detected the target + */ public void doEnterRange(Mover target, Sensor sensor) { double[] times = getEnterExitTimes(target, sensor); @@ -125,9 +206,25 @@ public final class SimpleReferee extends SimEntityBase { } } + /** + * Performs the actions when a target exits the range of a sensor. + * + * @param target the target that exited the range + * @param sensor the sensor that lost track of the target + */ + public void doExitRange(Mover target, Sensor sensor) { } + /** + * Calculates the enter and exit times for a target and a sensor based on their relative locations + * and velocities. Returns an array of the calculated times. + * + * @param target the target to calculate times for + * @param sensor the sensor to calculate times for + * @return an array of the enter and exit times, or an empty array if no times were calculated + */ + private double[] getEnterExitTimes(Mover target, Sensor sensor) { double[] times; @@ -166,32 +263,38 @@ public final class SimpleReferee extends SimEntityBase { return times; } - /** - * @return the sensors - */ +/** + * Returns a new list containing the sensors in the simulation. + * @return a list of sensors + */ public List<Sensor> getSensors() { return new ArrayList<>(sensors); } - /** - * @param sensors the sensors to set - */ +/** + * Sets the list of sensors for the simulation. + * + * @param sensors the list of sensors to set + */ public void setSensors(List<Sensor> sensors) { this.sensors = new ArrayList<>(sensors); } - /** - * @return the targets - */ +/** + * Returns a new list containing the targets in the simulation. + * + * @return a list of targets + */ public List<Mover> getTargets() { return new ArrayList<>(targets); } - /** - * @param targets the targets to set - */ +/** + * Sets the list of targets for the simulation. + * + * @param targets the list of 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/Assignment7ConstantRate1Mover.java b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantRate1Mover.java new file mode 100644 index 0000000000000000000000000000000000000000..d719930c31136b655a9e6aa67e8ac2da852680c3 --- /dev/null +++ b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantRate1Mover.java @@ -0,0 +1,68 @@ + +package mv3302.run; + +import java.awt.geom.Point2D; +import java.util.Arrays; +import mv3302.SimpleConstantRateMediator; +import mv3302.SimpleMover; +import mv3302.SimplePathMoverManager; +import mv3302.SimpleReferee; +import mv3302.sensor.SimpleConstantRateSensor; +import simkit.Schedule; +import simkit.random.RandomVariate; +import simkit.random.RandomVariateFactory; +import simkit.smd.Mover; +import simkit.smd.Sensor; +import simkit.util.SimplePropertyDumper; + +/** + * + * @author dansl + */ +public class Assignment7ConstantRate1Mover { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + RandomVariate exponentialGenerator = RandomVariateFactory.getInstance("Exponential", .7); + Mover[] targets = new Mover[]{ + new SimpleMover(new Point2D.Double(30.0, 40.0), 20.0), + new SimpleMover(new Point2D.Double(0, 0), 20.0) + }; + + 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) + }; + + Sensor[] sensors = new Sensor[targets.length]; + double meanTimeToDetect = 5.0; + sensors[0] = new SimpleConstantRateSensor(targets[0], 30, meanTimeToDetect); + sensors[1] = new SimpleConstantRateSensor(targets[1], 40, meanTimeToDetect); + + 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]); + } + + SimpleReferee simpleReferee = new SimpleReferee(Arrays.asList(sensors), + Arrays.asList(targets)); + System.out.println(simpleReferee); + + SimpleConstantRateMediator simpleConstantRateMediator = new SimpleConstantRateMediator(exponentialGenerator); + simpleReferee.addSimEventListener(simpleConstantRateMediator); + + Schedule.setVerbose(true); + Schedule.reset(); + Schedule.startSimulation(); + } + +} diff --git a/MV3302ClassCode/src/mv3302/run/Assignment7ConstantRate2Movers.java b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantRate2Movers.java new file mode 100644 index 0000000000000000000000000000000000000000..bb42759d542ca47ed18d63b57659d09eed521a77 --- /dev/null +++ b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantRate2Movers.java @@ -0,0 +1,88 @@ + +package mv3302.run; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; +import mv3302.SimpleConstantRateMediator; +import mv3302.SimpleMover; +import mv3302.SimplePathMoverManager; +import mv3302.SimpleReferee; +import mv3302.sensor.AbstractSimpleSensor; +import mv3302.sensor.SimpleConstantRateSensor; +import simkit.Schedule; +import simkit.random.RandomVariate; +import simkit.random.RandomVariateFactory; +import simkit.smd.Mover; +import simkit.smd.Sensor; +import simkit.util.SimplePropertyDumper; + +/** + * + * @author dansl + */ +public class Assignment7ConstantRate2Movers { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + RandomVariate exponentialGenerator = RandomVariateFactory.getInstance("Exponential", .7); + SimpleMover mover1 = new SimpleMover(new Point2D.Double(-20.0, 0.0), 30.0); + AbstractSimpleSensor sensor1 = new SimpleConstantRateSensor(mover1, 20.0, 5.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 SimpleConstantRateSensor(mover2, 30.0, 5.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); + + SimpleConstantRateMediator mediator1 = new SimpleConstantRateMediator(exponentialGenerator); + 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/Assignment7ConstantTime1Mover.java b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantTime1Mover.java new file mode 100644 index 0000000000000000000000000000000000000000..8b9e12a506e41ad31d8d9289a62c3889b2d79173 --- /dev/null +++ b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantTime1Mover.java @@ -0,0 +1,65 @@ + +package mv3302.run; + +import java.awt.geom.Point2D; +import java.util.Arrays; +import mv3302.SimpleConstantTimeMediator; +import mv3302.SimpleMover; +import mv3302.SimplePathMoverManager; +import mv3302.SimpleReferee; +import mv3302.sensor.SimpleConstantTimeSensor; +import simkit.Schedule; +import simkit.smd.Mover; +import simkit.smd.Sensor; +import simkit.util.SimplePropertyDumper; + +/** + * + * @author dansl + */ +public class Assignment7ConstantTime1Mover { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + Mover[] targets = new Mover[]{ + new SimpleMover(new Point2D.Double(30.0, 40.0), 20.0), + new SimpleMover(new Point2D.Double(0, 0), 20.0) + }; + + 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) + }; + + Sensor[] sensors = new Sensor[targets.length]; + double timeToDetect = 5.0; + sensors[0] = new SimpleConstantTimeSensor(targets[0], 30, timeToDetect); + sensors[1] = new SimpleConstantTimeSensor(targets[1], 40, timeToDetect); + + 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]); + } + + SimpleReferee simpleReferee = new SimpleReferee(Arrays.asList(sensors), + Arrays.asList(targets)); + System.out.println(simpleReferee); + + SimpleConstantTimeMediator simpleConstantTimeMediator = new SimpleConstantTimeMediator(); + simpleReferee.addSimEventListener(simpleConstantTimeMediator); + + Schedule.setVerbose(true); + Schedule.reset(); + Schedule.startSimulation(); + } + +} diff --git a/MV3302ClassCode/src/mv3302/run/Assignment7ConstantTime2Movers.java b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantTime2Movers.java new file mode 100644 index 0000000000000000000000000000000000000000..31a8d854d972323c42803b9480991fe8b11f03b8 --- /dev/null +++ b/MV3302ClassCode/src/mv3302/run/Assignment7ConstantTime2Movers.java @@ -0,0 +1,87 @@ + +package mv3302.run; +import java.awt.geom.Point2D; +import java.util.ArrayList; +import java.util.List; +import mv3302.SimpleConstantTimeMediator; +import mv3302.SimpleMover; +import mv3302.SimplePathMoverManager; +import mv3302.SimpleReferee; +import mv3302.sensor.AbstractSimpleSensor; +import mv3302.sensor.SimpleConstantTimeSensor; +import simkit.Schedule; +import simkit.smd.Mover; +import simkit.smd.Sensor; +import simkit.util.SimplePropertyDumper; + +/** + * + * @author dansl + */ +public class Assignment7ConstantTime2Movers { + + /** + * @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 SimpleConstantTimeSensor(mover1, 20.0, 5.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 SimpleConstantTimeSensor(mover2, 30.0, 5.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); + + SimpleConstantTimeMediator mediator1 = new SimpleConstantTimeMediator(); + 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/Assignment7.java b/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor1Mover.java similarity index 90% rename from MV3302ClassCode/src/mv3302/run/Assignment7.java rename to MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor1Mover.java index ca0f41ed2fb478afcba096d4124dd248c2a1c877..c8def5be9582dd1022fd10fa0918d863949e02ef 100644 --- a/MV3302ClassCode/src/mv3302/run/Assignment7.java +++ b/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor1Mover.java @@ -1,7 +1,4 @@ -/* - * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license - * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template - */ + package mv3302.run; import java.awt.geom.Point2D; @@ -20,7 +17,7 @@ import simkit.util.SimplePropertyDumper; * * @author dansl */ -public class Assignment7 { +public class Assignment7CookieSensor1Mover { /** * @param args the command line arguments diff --git a/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java b/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java index 630dfa055f767e4fd0c1a133d6fa714c74bbe537..2745cdf90e06a050a36c8ff5f3069e139065b68e 100644 --- a/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java +++ b/MV3302ClassCode/src/mv3302/run/Assignment7CookieSensor2Movers.java @@ -16,7 +16,7 @@ import simkit.util.SimplePropertyDumper; /** * - * @author ahbuss + * @author dansl */ public class Assignment7CookieSensor2Movers { diff --git a/MV3302ClassCode/src/mv3302/run/TestAnimations.java b/MV3302ClassCode/src/mv3302/run/TestAnimations.java index ca548c6d861eb07147fec3534d049b1f3a02b4b4..46e18218344ef81193f1cdc63532d8944de75312 100644 --- a/MV3302ClassCode/src/mv3302/run/TestAnimations.java +++ b/MV3302ClassCode/src/mv3302/run/TestAnimations.java @@ -1,3 +1,5 @@ +package mv3302.run; + import java.awt.Color; import java.awt.geom.Point2D; import java.util.ArrayList; diff --git a/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java b/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java index b4669591385c862be130e7f5b4777cb3510c5b63..f2b133abfcb90dce5aafef7a009474552f5cbcb1 100644 --- a/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/AbstractSimpleSensor.java @@ -5,12 +5,15 @@ import java.util.HashSet; import java.util.Set; import simkit.SimEntityBase; import simkit.smd.Mover; - import simkit.smd.Sensor; /** + * An abstract class representing a simple sensor. It extends the SimEntityBase + * class and implements the Sensor interface. Provides common functionality for + * sensors that detect and track movers. Subclasses need to implement specific + * detection algorithms. * - * @author ahbuss + * @author dansl */ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sensor { @@ -20,26 +23,48 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens protected Set<Mover> contacts; + /** + * Constructs a new AbstractSimpleSensor with an empty contacts set. + */ public AbstractSimpleSensor() { contacts = new HashSet<>(); } + /** + * Constructs a new AbstractSimpleSensor with the specified mover and + * maximum range. The contacts set is initialized as an empty set. + * + * @param mover the mover associated with the sensor + * @param maxRange the maximum range of the sensor + */ public AbstractSimpleSensor(Mover mover, double maxRange) { this(); setMover(mover); setMaxRange(maxRange); } + /** + * Resets the sensor to its initial state. Clears the contacts set. + */ @Override public void reset() { super.reset(); contacts.clear(); } + /** + * Runs the sensor and fires a property change event for the contacts set. + */ public void doRun() { firePropertyChange("contacts", getContacts()); } + /** + * Performs detection of a target mover. Adds the target mover to the + * contacts set and fires property change events for contacts and detection. + * + * @param target the mover to be detected + */ public void doDetection(Mover target) { Set<Mover> oldContacts = getContacts(); contacts.add(target); @@ -48,6 +73,12 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens firePropertyChange("detection", target); } + /** + * Removes a target mover from the contacts set. Fires property change + * events for contacts and undetection. + * + * @param target the mover to be undetected + */ public void doUndetection(Mover target) { Set<Mover> oldContacts = getContacts(); contacts.remove(target); @@ -56,16 +87,31 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens firePropertyChange("undetection", target); } + /** + * Initiates the start move action for the specified mover. Delays the + * action for the current simulation time. + * + * @param mover the mover to start moving + */ public void doStartMove(Mover mover) { waitDelay("StartMove", 0.0, this); } + /** + * Initiates the stop action for the specified mover. Delays the action for + * the current simulation time. + * + * @param mover the mover to stop + */ public void doStop(Mover mover) { waitDelay("Stop", 0.0, this); } /** - * @param mover the mover to set + * Initiates the stop action for the specified mover. Delays the action for + * the current simulation time. + * + * @param mover the mover to stop */ public void setMover(Mover mover) { this.mover = mover; @@ -73,6 +119,8 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens } /** + * Returns the maximum range of the sensor. + * * @return the maxRange */ @Override @@ -81,6 +129,8 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens } /** + * Sets the maximum range of the sensor. + * * @param maxRange the maxRange to set */ public void setMaxRange(double maxRange) { @@ -91,6 +141,8 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens } /** + * Sets the contacts of the sensor. + * * @return the contacts */ @Override @@ -98,33 +150,68 @@ public abstract class AbstractSimpleSensor extends SimEntityBase implements Sens return new HashSet<>(contacts); } + /** + * Returns the mover associated with the sensor. + * + * @return the mover + */ @Override public Mover getMover() { return mover; } + /** + * Returns current location the mover associated with the sensor. + * + * @return the mover.currentLocation + */ @Override public Point2D getCurrentLocation() { return mover.getCurrentLocation(); } + /** + * Returns velocity of the mover associated with the sensor. + * + * @return the movers velocity + */ @Override public Point2D getVelocity() { return mover.getVelocity(); } + /** + * empty method for implementation + */ @Override public void doStartMove(Sensor sensor) { } + /** + * empty method for implementation + */ @Override public void doStop(Sensor sensor) { } - + + /** + * Returns a string representation of the AbstractSimpleSensor object. This + * method is overridden from the superclass to provide a customized string + * representation. + * + * @return a string representation of the AbstractSimpleSensor object + */ public String paramString() { return super.toString(); } - + + /** + * Returns a string representation of the AbstractSimpleSensor object. The + * string format includes the name, current location, velocity, and maximum + * range of the sensor. + * + * @return a string representation of the AbstractSimpleSensor object + */ @Override public String toString() { return String.format("%s %s %s %,.4f", getName(), mover.getCurrentLocation(), mover.getVelocity(), diff --git a/MV3302ClassCode/src/mv3302/sensor/Sensor.java b/MV3302ClassCode/src/mv3302/sensor/Sensor.java index 4b3c217bdaa0c0ca8e9c7bbd874cee1370f5b330..8e6b57b163a90d248c4181cf4b4c5947c7516139 100644 --- a/MV3302ClassCode/src/mv3302/sensor/Sensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/Sensor.java @@ -6,7 +6,9 @@ import simkit.SimEntity; import simkit.smd.Mover; /** - * + *The Sensor interface represents a sensor entity in a simulation. It extends the SimEntity interface. +A sensor can provide information about its current location, velocity, and maximum range. +It can also start and stop moving, retrieve the mover associated with it, and get a set of contacts. * @author dansl */ interface Sensor extends SimEntity { diff --git a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java index 8f13494f739e0c9ff864bd97844c951cc39965c8..c0ca9377f557f1014edcacd46cf3855fd1150409 100644 --- a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantRateSensor.java @@ -1,29 +1,55 @@ - package mv3302.sensor; import simkit.smd.Mover; /** - * - * @author dansl + * A simple constant rate sensor that detects objects within a maximum range + * based on a mean time to detect. Inherits from AbstractSimpleSensor. */ -public class SimpleConstantRateSensor extends AbstractSimpleSensor { +public final class SimpleConstantRateSensor extends AbstractSimpleSensor { private double meanTimeToDetect; + /** + * Constructs a SimpleConstantRateSensor object with default values. + */ public SimpleConstantRateSensor() { super(); } + /** + * + * Constructs a SimpleConstantRateSensor object with the specified mover, + * maximum range, and mean time to detect. + * + * @param mover the mover associated with the sensor + * @param maxRange the maximum range of the sensor + * @param meanTimeToDetect the mean time taken by the sensor to detect an + * object + */ public SimpleConstantRateSensor(Mover mover, double maxRange, double meanTimeToDetect) { super(mover, maxRange); setMeanTimeToDetect(meanTimeToDetect); } + /** + * + * Returns the mean time to detect an object. + * + * @return the mean time to detect an object + */ public double getMeanTimeToDetect() { return meanTimeToDetect; } + /** + * + * Sets the mean time to detect an object. + * + * @param meanTimeToDetect the mean time to detect an object + * @throws IllegalArgumentException if the meanTimeToDetect value is less + * than 0.0 + */ public void setMeanTimeToDetect(double meanTimeToDetect) { if (meanTimeToDetect < 0.0) { throw new IllegalArgumentException("meanTimeToDetect must be >= 0.0: " + meanTimeToDetect); diff --git a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java index ee004a827bddc6e395d188bce98a2763e7c1e2f0..363ed14c0a436a4b5b8292111c61c81d5094a414 100644 --- a/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/SimpleConstantTimeSensor.java @@ -1,30 +1,53 @@ - package mv3302.sensor; -import java.util.HashSet; import simkit.smd.Mover; /** - * - * @author dansl + * A simple constant time sensor that detects objects in a given time frame. It + * extends the AbstractSimpleSensor class. */ -public class SimpleConstantTimeSensor extends AbstractSimpleSensor { +public final class SimpleConstantTimeSensor extends AbstractSimpleSensor { - private double timeToDetect; + protected double timeToDetect; + /** + * Creates a new instance of SimpleConstantTimeSensor with default values. + */ public SimpleConstantTimeSensor() { - super(); + super(); } + /** + * Creates a new instance of SimpleConstantTimeSensor with the specified + * parameters. + * + * @param mover the mover object associated with the sensor + * @param maxRange the maximum range of the sensor + * @param timeToDetect the time taken by the sensor to detect an object + */ public SimpleConstantTimeSensor(Mover mover, double maxRange, double timeToDetect) { super(mover, maxRange); setTimeToDetect(timeToDetect); } + /** + * + * Returns the time taken by the sensor to detect an object. + * + * @return the time to detect an object + */ public double getTimeToDetect() { return timeToDetect; } + /** + * + * Sets the time taken by the sensor to detect an object. + * + * @param timeToDetect the time to detect an object (must be >= 0.0) + * @throws IllegalArgumentException if the provided timeToDetect is less + * than 0.0 + */ public void setTimeToDetect(double timeToDetect) { if (timeToDetect < 0.0) { throw new IllegalArgumentException("timeToDetect must be >= 0.0: " + timeToDetect); diff --git a/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java b/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java index 94dd4759c12b53a7795f203fd8ba713e194c13d0..2ff1765f07d1695eff31345305828a1d49c911c5 100644 --- a/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java +++ b/MV3302ClassCode/src/mv3302/sensor/SimpleCookieCutterSensor.java @@ -1,18 +1,29 @@ - package mv3302.sensor; import simkit.smd.Mover; /** * - * @author ahbuss + * A simple implementation of a cookie cutter sensor for detecting objects using + * a mover and a maximum range. Extends the AbstractSimpleSensor class. */ public class SimpleCookieCutterSensor extends AbstractSimpleSensor { - + + /** + * Constructs a new instance of SimpleCookieCutterSensor with default + * values. + */ public SimpleCookieCutterSensor() { super(); } - + + /** + * Constructs a new instance of SimpleCookieCutterSensor with the specified + * mover and maximum range. + * + * @param mover the mover object associated with the sensor + * @param maxRange the maximum range at which the sensor can detect objects + */ public SimpleCookieCutterSensor(Mover mover, double maxRange) { super(mover, maxRange); }