'use strict';
|
|
|
|
function AgentGenerator(id) {
|
|
// execute super constructor
|
|
eve.Agent.call(this, id);
|
|
this.rpc = this.loadModule('rpc', this.rpcFunctions);
|
|
var me = this;
|
|
this.amountOfEvents = 0;
|
|
this.eventNumber = 0;
|
|
this.eventsToFire = 0;
|
|
this.lastEndOfDayTime = null;
|
|
this.events = [];
|
|
|
|
conn = this.connect(eve.system.transports.getAll());
|
|
|
|
// connect to websocket if not online only
|
|
if (conn[0].connect !== undefined) {
|
|
conn[0].connect(EVENTS_AGENT_ADDRESS)
|
|
.then(function () {
|
|
console.log('Connected to ', EVENTS_AGENT_ADDRESS);
|
|
me.rpc.request(EVENTS_AGENT_ADDRESS, {
|
|
method: "loadEvents",
|
|
params: {filename: "events.csv", actuallySend: true}
|
|
}).done(function (reply) {
|
|
me.amountOfEvents = reply;
|
|
me.getEvents(AMOUNT_OF_INITIAL_EVENTS);
|
|
});
|
|
})
|
|
.catch(function (err) {
|
|
console.log('Error: Failed to connect to the conductor agent');
|
|
console.log(err);
|
|
|
|
// keep trying until the conductor agent is online
|
|
setTimeout(connect, RECONNECT_DELAY);
|
|
});
|
|
}
|
|
//use local connection
|
|
else {
|
|
EVENTS_AGENT_ADDRESS = 'eventGenerator';
|
|
setTimeout(function() {
|
|
me.rpc.request(EVENTS_AGENT_ADDRESS, {
|
|
method: "loadEvents",
|
|
params: {filename: "events.csv", actuallySend: true}
|
|
}).done(function (reply) {
|
|
me.amountOfEvents = reply;
|
|
me.getEvents(AMOUNT_OF_INITIAL_EVENTS);
|
|
});
|
|
},40);
|
|
}
|
|
}
|
|
|
|
// extend the eve.Agent prototype
|
|
AgentGenerator.prototype = Object.create(eve.Agent.prototype);
|
|
AgentGenerator.prototype.constructor = AgentGenerator;
|
|
|
|
// define RPC functions, preferably in a separated object to clearly distinct
|
|
// exposed functions from local functions.
|
|
AgentGenerator.prototype.rpcFunctions = {};
|
|
|
|
AgentGenerator.prototype.rpcFunctions.receiveEvent = function(params) {
|
|
// setup timeline
|
|
this.events.push(JSON.stringify(params));
|
|
|
|
if (params.performedBy == "global") {
|
|
this.imposeWorkingHours(params);
|
|
}
|
|
else {
|
|
if (agentList[params.performedBy] === undefined) {
|
|
agentList[params.performedBy] = new GenericAgent(params.performedBy, params.type);
|
|
}
|
|
this.rpc.request(params.performedBy, {method: "newEvent", params: params});
|
|
}
|
|
|
|
// check if we need to get another event, its done here to avoid raceconditions
|
|
if (this.eventsToFire != 0) {
|
|
var me = this;
|
|
setTimeout(function() {
|
|
me.eventNumber += 1;
|
|
eventCounter.innerHTML = me.eventNumber +""; // make string so it works
|
|
me.rpc.request(EVENTS_AGENT_ADDRESS, {method:'nextEvent', params:{}}).done();
|
|
me.eventsToFire -= 1;
|
|
},EVENT_DELAY);
|
|
if (INCREASE_SPEED == true) {
|
|
EVENT_DELAY = Math.max(0, 1000 - (1000 * (me.eventNumber / 205)));
|
|
}
|
|
}
|
|
};
|
|
|
|
AgentGenerator.prototype.getEvents = function (count) {
|
|
if (this.eventNumber + count > this.amountOfEvents) {
|
|
count = this.amountOfEvents - this.eventNumber;
|
|
}
|
|
if (count != 0) {
|
|
this.eventsToFire = count - 1;
|
|
this.rpc.request(EVENTS_AGENT_ADDRESS, {method: 'nextEvent', params: {}}).done();
|
|
this.eventNumber += 1;
|
|
eventCounter.innerHTML = this.eventNumber + ""; // make string so it works
|
|
}
|
|
};
|
|
|
|
AgentGenerator.prototype.rpcFunctions.updateOpenJobs = function(params) {
|
|
var skipJob = params.jobId;
|
|
var time = params.time;
|
|
this.moveTimeline(params);
|
|
for (var agentId in agentList) {
|
|
if (agentList.hasOwnProperty(agentId)) {
|
|
agentList[agentId].jobs.updateJobs(time, skipJob);
|
|
}
|
|
}
|
|
};
|
|
|
|
AgentGenerator.prototype.moveTimeline = function(params) {
|
|
timeline.setCustomTime(params.time);
|
|
var range = timeline.getWindow();
|
|
var duration = range.end - range.start;
|
|
var hiddenDates = timeline.body.hiddenDates;
|
|
var DateUtil = vis.timeline.DateUtil;
|
|
var hiddenDuration = DateUtil.getHiddenDurationBetween(hiddenDates, range.start, range.end);
|
|
var visibleDuration = duration - hiddenDuration;
|
|
|
|
|
|
var fraction = 0.15;
|
|
var requiredStartDuration = (1-fraction) * visibleDuration;
|
|
var requiredEndDuration = fraction * visibleDuration;
|
|
var convertedTime = new Date(params.time).getTime();
|
|
var newStart;
|
|
var newEnd;
|
|
|
|
var elapsedDuration = 0;
|
|
var previousPoint = convertedTime;
|
|
for (var i = hiddenDates.length-1; i > 0; i--) {
|
|
var startDate = hiddenDates[i].start;
|
|
var endDate = hiddenDates[i].end;
|
|
// if time after the cutout, and the
|
|
if (endDate <= convertedTime) {
|
|
elapsedDuration += previousPoint - endDate;
|
|
previousPoint = startDate;
|
|
if (elapsedDuration >= requiredStartDuration) {
|
|
newStart = endDate + (elapsedDuration - requiredStartDuration);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (newStart === undefined) {
|
|
newStart = endDate - (requiredStartDuration - elapsedDuration);
|
|
}
|
|
|
|
elapsedDuration = 0;
|
|
previousPoint = convertedTime;
|
|
for (var i = 0; i < hiddenDates.length; i++) {
|
|
var startDate = hiddenDates[i].start;
|
|
var endDate = hiddenDates[i].end;
|
|
// if time after the cutout, and the
|
|
if (startDate >= convertedTime) {
|
|
elapsedDuration += startDate - previousPoint;
|
|
previousPoint = endDate;
|
|
if (elapsedDuration >= requiredEndDuration) {
|
|
newEnd = startDate - (elapsedDuration - requiredEndDuration);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (newEnd === undefined) {
|
|
newEnd = endDate + (requiredEndDuration - elapsedDuration);
|
|
}
|
|
|
|
timeline.setWindow(newStart, newEnd, {animate:Math.min(100,EVENT_DELAY)});
|
|
};
|
|
|
|
AgentGenerator.prototype.imposeWorkingHours = function(params) {
|
|
var time = params.time;
|
|
var operation = params.operation;
|
|
|
|
for (var agentId in agentList) {
|
|
if (agentList.hasOwnProperty(agentId)) {
|
|
var agent = agentList[agentId];
|
|
for (var jobId in agent.jobs.openJobs) {
|
|
if (agent.jobs.openJobs.hasOwnProperty(jobId)) {
|
|
var job = agent.jobs.openJobs[jobId];
|
|
agent.updateAssignment(jobId, job.type, time, operation);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (operation == 'endOfDay') {
|
|
this.lastEndOfDayTime = time;
|
|
}
|
|
else {
|
|
if (this.lastEndOfDayTime !== null) {
|
|
timelineItems.update({
|
|
id: 'night' + uuid(),
|
|
start: this.lastEndOfDayTime,
|
|
end: time,
|
|
type: 'background',
|
|
className: 'night'
|
|
});
|
|
this.lastEndOfDayTime = null;
|
|
}
|
|
}
|
|
|
|
|
|
};
|
|
|
|
AgentGenerator.prototype.printEvents = function() {
|
|
var str = "";
|
|
str += "[";
|
|
for (var i = 0; i < this.events.length; i++) {
|
|
str += this.events[i];
|
|
if (i < this.events.length - 1) {
|
|
str += ","
|
|
}
|
|
}
|
|
str += "]";
|
|
console.log(str);
|
|
}
|