Skip to content
Snippets Groups Projects
ArrivalProcessOpenDis7.java 4.35 KiB
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");
    }
}