From dabef55e82441bbe279952912e9824333b39952b Mon Sep 17 00:00:00 2001
From: ethanjwilliams <ethanjwilliams@localhost>
Date: Tue, 27 Aug 2024 13:34:19 -0700
Subject: [PATCH] Williams - Homework 3

---
 .../Williams/ExampleSimulationProgram.java    | 105 ++++--------------
 .../homework3/Williams/README.md              |  12 +-
 2 files changed, 23 insertions(+), 94 deletions(-)

diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/ExampleSimulationProgram.java b/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/ExampleSimulationProgram.java
index a428dd2d01..66628a8cc3 100644
--- a/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/ExampleSimulationProgram.java
+++ b/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/ExampleSimulationProgram.java
@@ -8,7 +8,6 @@
  */
 package MV3500Cohort2024JulySeptember.homework3.Williams;
 
-
 import edu.nps.moves.dis7.entities.swe.platform.surface._001Poseidon;
 import edu.nps.moves.dis7.entities.swe.platform.surface._002Triton;
 import edu.nps.moves.dis7.enumerations.*;
@@ -25,9 +24,9 @@ import java.util.logging.Logger;
  * tasks of interest, and then reporting activity via PDUs to the network.
  * Default program initialization includes PDU recording turned on by default.
  * 
- * Homework 3 Networking choices:
+ * Homework 3 networking choices:
  * This simulation uses UDP multicast for efficient distribution of PDUs to 
- * multiple participants, which is suitable for large-scale simulations where 
+ * multiple participants, which is great for large-scale simulations where 
  * state updates need to reach all networked participants. UDP is chosen over 
  * TCP due to its lower latency, which is essential for real-time simulations.
  *
@@ -39,65 +38,38 @@ import java.util.logging.Logger;
  */
 public class ExampleSimulationProgram
 {
-    /* **************************** infrastructure code, modification is seldom needed ************************* */
-                 
     private   String     descriptor = this.getClass().getSimpleName();
-    /** DIS channel defined by network address/port combination includes multiple utility capabilities */
     protected DisChannel disChannel;
-    /** Factory object used to create new PDU instances */
     protected PduFactory pduFactory;
     
-    /** seconds per loop for real-time or simulation execution */
-    private double  simulationTimeStepDuration  =  1.0; // seconds TODO encapsulate
-    /** initial simulation time in seconds */
+    private double  simulationTimeStepDuration  =  1.0; 
     double  simulationTimeInitial = 0.0;
-    /** current simulation time in seconds */
     double  simulationTimeSeconds = simulationTimeInitial;
-    /** Maximum number of simulation loops */
     int MAX_LOOP_COUNT = 4;
     
     String narrativeMessage1 = new String();
     String narrativeMessage2 = new String();
     String narrativeMessage3 = new String();
     
-    /** EntityID settings for entity 1 */
     protected EntityID           entityID_1          = new EntityID();
-    /** EntityID settings for entity 2 */
     protected EntityID           entityID_2          = new EntityID();
-    /** ESPDU for entity 1 */
     protected EntityStatePdu     entityStatePdu_1;
-    /** ESPDU for entity 2 */
     protected EntityStatePdu     entityStatePdu_2;
-    /** FirePdu for entity 1 first  weapon (if any) */
     protected FirePdu            firePdu_1a;
-    /** FirePdu for entity 1 second weapon (if any) */
     protected FirePdu            firePdu_1b;
-    /** MunitionDescriptor for these weapons */
     protected MunitionDescriptor munitionDescriptor1;
     
-    /**
-     * Constructor to create an instance of this class.
-     * Design goal: additional built-in initialization conveniences can go here
-     * to keep your efforts focused on the runSimulation() method.
-     */
     public ExampleSimulationProgram()
     {
         initialize();
     }
-    /**
-     * Constructor to create an instance of this class.
-     * @param newDescriptor describes this program, useful for logging and debugging
-     */
+
     public ExampleSimulationProgram(String newDescriptor)
     {
         descriptor = newDescriptor;
         initialize();
     }
-    /**
-     * Utility Constructor that allows your example simulation program to override default network address and port
-     * @param address network address to use
-     * @param port corresponding network port to use
-     */
+
     public ExampleSimulationProgram(String address, int port)
     {
         disChannel.setNetworkAddress(address);
@@ -108,9 +80,6 @@ public class ExampleSimulationProgram
         initialize();
     }
     
-    /** Initialize channel setup for OpenDis7 and report a test PDU
-     * @see initializeDisChannel
-     * @see initializeSimulationEntities */
     private void initialize()
     {
         initializeDisChannel();
@@ -122,7 +91,6 @@ public class ExampleSimulationProgram
         disChannel.sendCommentPdu(simulationTimeSeconds, DisChannel.COMMENTPDU_SIMULATION_TIMESTEP, timeStepMessage);
     }
     
-    /** Initialize channel setup for OpenDis7 and report a test PDU */
     private void initializeDisChannel()
     {
         if (disChannel == null)
@@ -143,8 +111,6 @@ public class ExampleSimulationProgram
         disChannel.getPduRecorder().setVerbose(true);
     }
     
-    /** Initialize simulation entities.
-     */
     public void initializeSimulationEntities()
     {        
         if (pduFactory == null)
@@ -155,30 +121,31 @@ public class ExampleSimulationProgram
         firePdu_1b          = pduFactory.makeFirePdu();
         munitionDescriptor1 = new MunitionDescriptor();
         
-        // Define participants
-        entityID_1.setSiteID(1).setApplicationID(2).setEntityID(3);
+        entityID_1.setSiteID((int)(Math.random() * 100))
+                  .setApplicationID((int)(Math.random() * 100))
+                  .setEntityID((int)(Math.random() * 100));
         disChannel.addEntity(entityID_1);
         
-        entityID_2.setSiteID(1).setApplicationID(2).setEntityID(4);
+        entityID_2.setSiteID((int)(Math.random() * 100))
+                  .setApplicationID((int)(Math.random() * 100))
+                  .setEntityID((int)(Math.random() * 100));
         disChannel.addEntity(entityID_2);
 
         entityStatePdu_1.setEntityID(entityID_1);
         entityStatePdu_1.setForceId(ForceID.FRIENDLY);
         entityStatePdu_1.setEntityType(new _001Poseidon());
-        entityStatePdu_1.setMarking("Entity #53");
+        entityStatePdu_1.setMarking("Ethan's Poseidon #1");
 
         entityStatePdu_2.setEntityID(entityID_2);
         entityStatePdu_2.setForceId(ForceID.OPPOSING);
         entityStatePdu_2.setEntityType(new _002Triton());
-        entityStatePdu_2.setMarking("Entity #2");
+        entityStatePdu_2.setMarking("Ethan's Triton #2");
 
         munitionDescriptor1.setQuantity(1);
         firePdu_1a.setDescriptor(munitionDescriptor1).setRange(1000.0f);
+
     }
                  
-    /**
-     * This runSimulationLoops() method is customizable for running new simulations.
-     */
     @SuppressWarnings("SleepWhileInLoop")
     public void runSimulationLoops ()
     {
@@ -195,13 +162,14 @@ public class ExampleSimulationProgram
         {
             simulationLoopCount++;
             
-            entityStatePdu_1.getEntityLocation().setX(entityStatePdu_1.getEntityLocation().getX() + 1.0);
-            
+            entityStatePdu_1.getEntityLocation().setX(entityStatePdu_1.getEntityLocation().getX() + (Math.random() * 2));
+
             System.out.println ("... My simulation just did something...");
             System.out.flush();
             
-            narrativeMessage1 = "MV3500 ExampleSimulationProgram";
-            narrativeMessage2 = "runSimulation() loop " + simulationLoopCount;
+            narrativeMessage1 = "Ethan's Custom Simulation Program";
+            narrativeMessage2 = "Loop " + simulationLoopCount + " - MV3500 Custom Version";
+            narrativeMessage3 = "Simulation developed by Ethan Williams";
 
             if (simulationLoopCount > MAX_LOOP_COUNT) 
             {
@@ -242,14 +210,6 @@ public class ExampleSimulationProgram
       }
     }
 
-    /**
-     * Send EntityState, Fire, Comment PDUs for this loop.
-     * @param simTimeSeconds simulation time in seconds
-     * @param entityStatePdu the ESPDU to send
-     * @param firePdu the FirePDU to send
-     * @param commentType enumeration value describing purpose of the narrative comment PDU
-     * @param comments String array of narrative comments
-     */
     public void sendAllPdusForLoopTimestep(double simTimeSeconds,
                                    EntityStatePdu entityStatePdu,
                                           FirePdu firePdu,
@@ -265,10 +225,6 @@ public class ExampleSimulationProgram
         disChannel.sendCommentPdu(simTimeSeconds, commentType, comments);
     }
     
-    /**
-     * Initial execution via main() method: handle args array of command-line initialization (CLI) arguments here
-     * @param args command-line parameters: network address and port
-     */
     protected void handleArguments (String[] args)
     {
         if (args.length == 2) 
@@ -285,47 +241,26 @@ public class ExampleSimulationProgram
         }
     }
 
-    /**
-     * Get simple descriptor for this network interface, used in trace statements
-     * @return simple descriptor name
-     */
     public String getDescriptor() {
         return descriptor;
     }
 
-    /**
-     * Set new simple descriptor for this network interface, used in trace statements
-     * @param newDescriptor simple descriptor name for this interface
-     */
     public void setDescriptor(String newDescriptor) {
         if (newDescriptor == null)
             newDescriptor = "";
         this.descriptor = newDescriptor;
     }
 
-    /**
-     * parameter accessor method
-     * @return the simulationTimeStepDuration in seconds
-     */
     public double getSimulationTimeStepDuration() {
         return simulationTimeStepDuration;
     }
 
-    /**
-     * parameter accessor method
-     * @param timeStepDurationSeconds the simulationTimeStepDuration in seconds to set
-     */
     public void setSimulationTimeStepDuration(double timeStepDurationSeconds) {
         this.simulationTimeStepDuration = timeStepDurationSeconds;
     }
     
-    /** Locally instantiable copy of program, can be subclassed. */
     protected static ExampleSimulationProgram thisProgram;
   
-    /**
-     * Main method is first executed when a program instance is loaded.
-     * @param args command-line parameters: network address and port.
-     */
     public static void main(String[] args)
     {
         thisProgram = new ExampleSimulationProgram("test constructor");
@@ -342,4 +277,4 @@ public class ExampleSimulationProgram
         
         System.exit(0);
     }
-}
\ No newline at end of file
+}
diff --git a/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/README.md b/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/README.md
index a1c26dac94..e5281d6ca4 100644
--- a/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/README.md
+++ b/assignments/src/MV3500Cohort2024JulySeptember/homework3/Williams/README.md
@@ -1,9 +1,3 @@
-For Homework 3, I modified the OpenDIS ExampleSimulationProgram to enhance its functionality
-by experimenting with entity enumeration values and adjusting the network communication setup.
-On the networking side, I configured the program to use UDP multicast for distribution of the PDUs across
-multiple participants in the simulation. I did this to attempt to create the
-low-latency communication needed in large-scale simulations, where UDP's minimal overhead is
-advantageous, and multicast ensures that updates reach all clients at the same time. I also
-enabled verbose logging to facilitate debugging. Additionally, I adjusted
-the simulation loop to increment Entity 1’s position in each iteration, simulating movement, and set
-the loop to run for a maximum of 10 iterations.
\ No newline at end of file
+For Homework 3, I customized the Example Simulation Program by randomizing the entity IDs
+and I also introduced randomized movement patterns for the entities during the simulation loop.
+These changes make the simulation more realistic and ensuring variability in each run.
\ No newline at end of file
-- 
GitLab