package SimkitOpenDis7Examples; import edu.nps.moves.dis7.enumerations.VariableRecordType; import edu.nps.moves.dis7.utilities.DisChannel; import simkit.SimEntityBase; import simkit.random.RandomVariate; /** * ArrivalProcess event graph with openDis7 output PDU messages added. * One of the simplest non-trivial Event Graph models. A series of Arrival * events is scheduled based on an inter arrival time random variate. The state * variable, simply counts the number of these arrivals. * * @see SimkitOpenDis7Examples.SimpleServer * @see SimkitOpenDis7Examples.run.RunSimpleServerOpenDis7 * @see <a href="https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/-/raw/master/examples/src/SimkitOpenDis7Examples/ArrivalProcessOpenDis7EventGraph.png" target="_blank">ArrivalProcessDisPdu.png</a> * @see <a href="https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/-/raw/master/examples/src/SimkitOpenDis7Examples/SimpleServerComponentEventGraph.png" target="_blank">SimpleServerComponentEventGraph.png</a> * @author abuss@nps.edu * @author brutzman@nps.edu */ public class ArrivalProcessOpenDis7 extends SimEntityBase { /** Not a sim parameter */ private final DisChannel disChannel; /** * Generates interarrival times */ private RandomVariate interarrivalTimeGenerator; /** * State variable that counts the number of Arrival events */ protected int numberArrivals; /** * Instantiate an ArrivalProcess with the given interarrivalTimeGenerator * * @param interarrivalTimeGenerator Given RandomVariate for interarrival * times */ public ArrivalProcessOpenDis7(RandomVariate interarrivalTimeGenerator) { this(); this.interarrivalTimeGenerator = interarrivalTimeGenerator; } /** * If the ArrivalProcess is instantiated using the zero-argument * constructor, be sure the set the interarrivalTimeGenerator with an * explicit call to its setter method. */ public ArrivalProcessOpenDis7() { disChannel = new DisChannel(); } /** * Initialize numberArrivals to 0 */ @Override public void reset() { super.reset(); numberArrivals = 0; initializeDisChannel(); } /** * Schedule the first Arrival event with delay generated by * interarrivalTimeGenerator */ public void doRun() { firePropertyChange("numberArrivals", getNumberArrivals()); // TODO send simulation management PDUs via DIS channel, announce commencement waitDelay("Arrival", interarrivalTimeGenerator); } /** * Increment numberArrivals<br> * Schedule next Arrival event with delay generated by * interarrivalTimeGenerator */ public void doArrival() { int oldNumberArrivals = getNumberArrivals(); numberArrivals += 1; firePropertyChange("numberArrivals", oldNumberArrivals, getNumberArrivals()); // TODO announce selected arrivals via DIS channel waitDelay("Arrival", interarrivalTimeGenerator); } /** * accessor method to get a state variable * @return the interarrivalTimeGenerator */ public RandomVariate getInterarrivalTimeGenerator() { return interarrivalTimeGenerator; } /** * accessor method to set a state variable * @param interarrivalTimeGenerator the interarrivalTimeGenerator to set */ public void setInterarrivalTimeGenerator(RandomVariate interarrivalTimeGenerator) { this.interarrivalTimeGenerator = interarrivalTimeGenerator; } /** * accessor method to get a state variable * @return the numberArrivals */ public int getNumberArrivals() { return numberArrivals; } /** * accessor method to get current DIS channel object * @return the disChannel */ public DisChannel getDisChannel() { return disChannel; } /** Initialize channel setup for OpenDis7 and report a test PDU */ private void initializeDisChannel() { disChannel.setUpNetworkInterface(); disChannel.printlnTRACE ("disChannel.getNetworkAddress()=" + disChannel.getNetworkAddress() + ", getNetworkPort()=" + disChannel.getNetworkPort()); disChannel.sendCommentPdu(VariableRecordType.OTHER, getClass().getName() + " initialized"); } }