package tmcsim.client.cadclientgui.data;
import java.io.Serializable;
import java.util.Vector;
import tmcsim.cadmodels.IncidentInquiryModel_obj;
import tmcsim.common.CCTVInfo;
import tmcsim.common.XMLIncident;
/**
* IncidentEvent class contains data for an event that occurs during a
* simulation. Incident event information includes the following:
*
* - Second after Incident begins Event is schedule to occur.
* - Simulation time Event occurs.
* - IncidentInquiry model data.
* - Audio file name and duration.
* - XMLIncident Objects
* - CCTVInfo Objects
* - Current Event status.
*
*
*
* The EVENT_STATUS is used to keep track of what state this event is in. An
* event is WAITING until its time to occur is reached in the simulation. The
* event will then enter the TRIGGERED state if it has a wave file length
* greater than 0, otherwise it will enter the COMPLETED state. When an
* audio file is completed, the wavePlayed() method is called, and the Event
* enters the COMPLETED state. The finalizeEvent method finalizes the Event by
* timestamping the model data and setting the number of seconds the event
* occured in the simulation. The EVENT_STATUS is then set to FINALIZED.
*
* @author Matthew Cechini (mcechini@calpoly.edu)
* @version $Date: 2006/06/06 20:46:40 $ $Revision: 1.4 $
*/
@SuppressWarnings("serial")
public class IncidentEvent implements Comparable, Serializable {
/**
* Enumeration
* @author Matthew Cechini
*/
public static enum EVENT_STATUS {
/** Waiting to be triggered. */
WAITING,
/** Event has been triggered. */
TRIGGERED,
/** Completed audio playing, if necessary. */
COMPLETED,
/**
* Incident has been triggered, audio file has been played,
* and model data timestamped.
*/
FINALIZED
};
/** Number of seconds after the incident begins that this event will trigger. */
public long secondsToOccurInIncident;
/** Number of seconds after the simulation started that this event occured. */
public long secondsOccuredInSimulation;
/** Model object containing the data that will be added to the incident when this event occurs. */
public IncidentInquiryModel_obj eventInfo = null;
/** Audio wav file associated with this event. */
public String waveFile;
/** Duration(in seconds) of the waveFile. */
public int waveLength;
/** Vector of XMLIncident objects which are associated with this incident event. */
public Vector XMLIncidents;
/** Vector of CCTV objects which are associated with this incident event. */
public Vector cctvInfos;
/** Current Incident Event status. */
public EVENT_STATUS eventStatus;
/**
* Constructor.
*
* @param timeToOccur Time (in seconds) in simulation for this incident event to occur.
*/
public IncidentEvent(long timeToOccur) {
eventInfo = new IncidentInquiryModel_obj();
waveFile = "";
waveLength = 0;
eventStatus = EVENT_STATUS.WAITING;
XMLIncidents = new Vector();
cctvInfos = new Vector();
secondsToOccurInIncident = timeToOccur;
secondsOccuredInSimulation = 0;
}
/**
* Constructor.
*
* @param timeToOccur Time (in seconds) in simulation for this incident event to occur.
* @param info IncidentInquiry model data.
* @param newWaveFile Filename of audio wav file to be played with this event.
* @param newWaveLength Duration (in seconds) of audio wav file
* @param newXMLIncidents List of XMLIncidents for this event.
* @param newCCTVInfos List of CCTVInfos for this event.
*/
public IncidentEvent(long timeToOccur,
IncidentInquiryModel_obj info,
String newWaveFile,
int newWaveLength,
Vector newXMLIncidents,
Vector newCCTVInfos){
eventInfo = info;
eventStatus = EVENT_STATUS.WAITING;
waveFile = newWaveFile;
waveLength = newWaveLength;
XMLIncidents = new Vector();
XMLIncidents.addAll(newXMLIncidents);
cctvInfos = new Vector();
cctvInfos.addAll(newCCTVInfos);
secondsToOccurInIncident = timeToOccur;
secondsOccuredInSimulation = 0;
}
/**
* Copy Constructor.
*
* @param timeToOccur Time (in seconds) in simulation for this incident event to occur.
* @param info IncidentInquiry model data.
* @param newWaveFile Filename of audio wav file to be played with this event.
* @param newWaveLength Duration (in seconds) of audio wav file
* @param newXMLIncidents List of XMLIncidents for this event.
* @param newCCTVInfos List of CCTVInfos for this event.
*/
public IncidentEvent(final IncidentEvent copyEvent){
eventInfo = copyEvent.eventInfo;
eventStatus = copyEvent.eventStatus;
waveFile = copyEvent.waveFile;
waveLength = copyEvent.waveLength;
XMLIncidents = new Vector();
XMLIncidents.addAll(copyEvent.XMLIncidents);
cctvInfos = new Vector();
cctvInfos.addAll(copyEvent.cctvInfos);
secondsToOccurInIncident = copyEvent.secondsToOccurInIncident;
secondsOccuredInSimulation = copyEvent.secondsOccuredInSimulation;
}
/** Compare objects according o comparison of secondsToOccurInIncident member data. */
public int compareTo(IncidentEvent o) {
if(secondsToOccurInIncident < o.secondsToOccurInIncident)
return -1;
else if(secondsToOccurInIncident > o.secondsToOccurInIncident)
return 1;
else
return 0;
}
/**
* Method determines if the Event is ready to be triggered. This is
* determined by assessing the current Event status and simulation
* time. The Event will be triggered if the Event is WAITING and the
* Event's time to start has been reached. The Event's relative start
* time is added to the Incident start time parameter and compared
* against the current simulation time parameter. If the audio file
* duration is greater than zero seconds, then the Event status is set to
* TRIGGERED, and true is returned. If the audio file is zero, the status
* is set to COMPLETED and false is returned.
*
* @param incidentStartTime Simulation time that Event's Incident began (in seconds).
* @param simulationTime Current simulation time (in seconds).
* @return true if incident enters the TRIGGERED state, false if it is not
* ready to be triggered or has entered the COMPLETED state.
*/
public boolean triggerEvent(long incidentStartTime, long simulationTime) {
boolean retVal = false;
if(eventStatus == EVENT_STATUS.WAITING &&
simulationTime > (incidentStartTime + secondsToOccurInIncident) )
{
if(waveLength == 0) {
eventStatus = EVENT_STATUS.COMPLETED;
}
else {
retVal = true;
eventStatus = EVENT_STATUS.TRIGGERED;
}
}
return retVal;
}
/**
* Method is called when the Event's audio file completes. The Event
* status is set to COMPLETED.
*/
public void wavePlayed() {
eventStatus = EVENT_STATUS.COMPLETED;
}
/**
* Method is called to finalize and Event. The Event info
* is timestamped with the parameter and the secondsInSimulationOccured
* member is set to the current time in the simulation. The Event
* status is set to FINALIZED.
*
* @param occured Current simulation time (in seconds).
* @param timestamp CAD time stamp for model data.
*/
public void finalizeEvent(long occured, String timestamp) {
//set time stamp
eventInfo.timeStamp(timestamp);
secondsOccuredInSimulation = occured;
eventStatus = EVENT_STATUS.FINALIZED;
}
/**
* Called to reset the simulation. The Event status is set to WAITING and
* the secondsOccuredinSimulation is reset to 0.
*/
public void resetSimulation() {
eventStatus = EVENT_STATUS.WAITING;
secondsOccuredInSimulation = 0;
}
}