//eventHandler for DepartureEndStationEvent public override void handleEvent() { int estimatedTravelTime = Simulation.getTravelTime(departureStation, tram.direction); TimeSpan etaNextStation = TimeSpan.FromSeconds(eventTime.TotalSeconds + estimatedTravelTime); //set track A last departure time if (tram.direction == Direction.Uithof) { departureStation.lastDepartureTrackA = eventTime; //Check if not faster than last tram if (etaNextStation < departureStation.lastEtaTrackA) { etaNextStation = TimeSpan.FromSeconds(departureStation.lastEtaTrackA.TotalSeconds + 1); } departureStation.lastEtaTrackA = etaNextStation; } //set Track B last departure time if (tram.direction == Direction.UtrechtCentraal) { departureStation.lastDepartureTrackB = eventTime; //Check if not faster than last tram if (etaNextStation < departureStation.lastEtaTrackB) { etaNextStation = TimeSpan.FromSeconds(departureStation.lastEtaTrackB.TotalSeconds + 1); } departureStation.lastEtaTrackB = etaNextStation; } // Push new event to queue. checks if end or sub Station if (departureStation.getNextStation(tram.direction) is SubStation) { // subStation event // gen. eta event & enqueue to eventQueue. expectedArrivalSubtStation etaEvent = new expectedArrivalSubtStation(etaNextStation, (SubStation)departureStation.getNextStation(tram.direction), tram); Simulation.priorityQueue.Enqueue(etaEvent); } else if (departureStation.getNextStation(tram.direction) is EndStation) { // endStation event // gen. eta event & enqueue to eventQueue. expectedArrivalEndStation etaEvent = new expectedArrivalEndStation(etaNextStation, (EndStation)departureStation.getNextStation(tram.direction), tram); Simulation.priorityQueue.Enqueue(etaEvent); } }
public expectedArrivalEndStation initTram(int i, int j, string[][] rates) { if (String.IsNullOrWhiteSpace(rates[i][j])) { return(initTram(i, (j + 1), rates)); } else { Tram t = new Tram(i); //get all departures for (int k = j; k < rates[0].Length; k++) { if (String.IsNullOrWhiteSpace(rates[i][k])) { //nothing.. } else { string str = rates[i][k]; int h = int.Parse(str.Substring(0, 2)); int m = int.Parse(str.Substring(3, 2)); int s = int.Parse(str.Substring(6, 2)); TimeSpan tmpTimespan = (new TimeSpan(0, h, m, s, 0)); if (rates[0][k] == "Vertrektijd CS") { t.departures.Enqueue(new DepartureEndStation(tmpTimespan, d.centraal, t)); } else if (rates[0][k] == "Vertrektijd P&R") { t.departures.Enqueue(new DepartureEndStation(tmpTimespan, d.uithof, t)); } } } //return event TimeSpan desiredArrival = TimeSpan.FromMinutes(t.departures.Peek().eventTime.TotalMinutes - 3); expectedArrivalEndStation a = new expectedArrivalEndStation(desiredArrival, t.departures.Peek().departureStation, t); return(a); } }
public override void handleEvent() { TimeSpan arrivalTime; if (tram.departures.Count() != 0) { //remove from track if next departure is in more than 30 mins if (tram.departures.Peek().eventTime.TotalMinutes > eventTime.TotalMinutes + 30) { expectedArrivalEndStation resumeWork = new expectedArrivalEndStation(TimeSpan.FromMinutes(tram.departures.Peek().eventTime.TotalMinutes - 3), arrivalStation, tram); Simulation.priorityQueue.Enqueue(resumeWork); } else { if (arrivalStation.numberOfTrams >= 2) { arrivalTime = TimeSpan.FromSeconds(arrivalStation.nextDeparture.TotalSeconds + SAFETY_MEASURE); } else { arrivalTime = TimeSpan.FromSeconds(Math.Max(arrivalStation.lastDeparture.TotalSeconds + SAFETY_MEASURE, eventTime.TotalSeconds)); } //generate doorblock if (Simulation.doorBlockEnabled) { int rand = Simulation.random.Next(0, 100); if (100 - Simulation.probabilityX < rand) { arrivalTime = TimeSpan.FromSeconds(arrivalTime.TotalSeconds + 60); } } arrivalEndStation arrival = new arrivalEndStation(arrivalTime, arrivalStation, tram); Simulation.priorityQueue.Enqueue(arrival); } } }