//global simulation clock
var globalSimClock = 0.0; //starts at zero, units to be specified
var globalSimUnits = "minutes";
var globalInsertTime = 0.0;
//events queue item
function futureEventItem(time,type,entityID,previousState,nextState) {
this.activationTime = 0.0;
if (type == "advance") {
this.activationTime = globalSimClock + time; //activate 'time' from now
} else if (type == "absolute") {
if (time > globalSimClock) {
this.activationTime = time; //activate at specified absolute time, if in future
} else {
alert("Invalid time past time supplied. Entity ID: "+entityID+" Current Time: "+globalSimClock+" Speficied Time: "+time); //alert on invalid time
}
}
this.entityID = entityID;
this.previousState = previousState;
this.nextState = nextState;
this.getActivationTime = function() {
return this.activationTime;
};
this.update = function(time,type,previousState,nextState) {
if (type == "advance") {
this.activationTime = globalSimClock + time; //activate 'time' from now
} else if (type == "absolute") {
if (time > globalSimClock) {
this.activationTime = time; //activate at specified absolute time, if in future
} else {
alert("Invalid time past time supplied. Entity ID: "+this.entityID+" Current Time: "+globalSimClock+" Speficied Time: "+time); //alert on invalid time
}
}
this.previousState = previousState;
this.nextState = nextState;
};
this.reportItem = function() {
console.log("Time: "+this.activationTime+" ID: "+this.entityID+" Prev: "+this.previousState+" Next: "+this.nextState);
};
}; //futureEventItem
function futureEventsQueue() {
this.feq = new Array();
this.feqSize = 0;
this.insertTime = 0.0;
this.findLaterTime = function(item) {
globalSimClock = 10.0;
var a = item.getActivationTime();
var b = globalInsertTime; //this.insertTime; why is the scope of "this" messed up here? window and not queue
var result = a > b;
return result;
};
this.insertItem = function(time,type,entityID,previousState,nextState) {
//create futureEventItem
var feqItem = new futureEventItem(time,type,entityID,previousState,nextState);
this.insertTime = feqItem.getActivationTime();
globalInsertTime = this.insertTime;
if (this.feqSize == 0) {
this.feq[0] = feqItem;
this.feqSize++;
console.log("Array size: "+this.feq.length);
} else {
//find index of feq item to insert before
var insertIndex = this.feq.findIndex(this.findLaterTime);
//var insertIndex = this.feq.findIndex(this.findLaterTime1);
//insert the element
if (insertIndex < 0) {
insertIndex = this.feq.length;
}
this.feq.splice(insertIndex,0,feqItem);
this.feqSize++;
console.log("Array size: "+this.feq.length);
}
};
this.getFirstItem = function() {
globalSimClock = this.feq[0].getActivationTime();
var feqItem = this.feq.splice(0,1);
if (feqItem) {
this.feqSize--;
return feqItem;
} else {
console.log("no items in FEQ to retrieve "+this.feqSize)
}
};
this.insertExistingItem = function(feqItem) {
this.insertTime = feqItem.getActivationTime();
globalInsertTime = this.insertTime;
if (this.feqSize == 0) {
this.feq[0] = feqItem;
this.feqSize++;
console.log("Array size: "+this.feq.length);
} else {
//find index of feq item to insert before
var insertIndex = this.feq.findIndex(this.findLaterTime);
//var insertIndex = this.feq.findIndex(this.findLaterTime1);
//insert the element
if (insertIndex < 0) {
insertIndex = this.feq.length;
}
this.feq.splice(insertIndex,0,feqItem);
this.feqSize++;
console.log("Array size: "+this.feq.length);
}
};
this.reportSize = function() {
console.log("Number of events in queue: "+this.feqSize);
};
}; //futureEventsQueue
function reportItemInfo(element, index, arr) {
//globalSimClock = 10.0;
console.log("reportItemInfo: element: "+element+" index: "+index+" arr: "+arr);
element.reportItem();
}
function findLaterTime1(item) {
globalSimClock = 10.0;
return item.getActivationTime() > globalInsertTime;
};
//initialize future events queue
feq = new futureEventsQueue();
feq.reportSize(); //should be zero;
feq.insertItem(40.0,"absolute",333,"prev1","next1");
feq.feq.forEach(reportItemInfo);
feq.reportSize(); //should be 1
globalSimClock = 10.0;
feq.insertItem(20.0,"advance",444,"prev2","next2");
feq.feq.forEach(reportItemInfo);
feq.reportSize(); //should be 2
feq.insertItem(50.0,"absolute",555,"prev3","next3");
feq.feq.forEach(reportItemInfo);
feq.reportSize(); //should be 3
//get the first item to process
var item = feq.getFirstItem();
feq.feq.forEach(reportItemInfo);
feq.reportSize(); //should be 2
//do something to it
item[0].update(25.0,"advance","prev1a","next1a");
//put it back in the queue
feq.insertExistingItem(item[0]);
feq.feq.forEach(reportItemInfo);
feq.reportSize(); //should be 3