Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/microsim/MSEventControl.cpp
185785 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file MSEventControl.cpp
15
/// @author Christian Roessel
16
/// @author Daniel Krajzewicz
17
/// @author Jakob Erdmann
18
/// @author Michael Behrisch
19
/// @author Matthias Heppner
20
/// @date Mon, 12 Mar 2001
21
///
22
// Stores time-dependant events and executes them at the proper time
23
/****************************************************************************/
24
#include <config.h>
25
26
#include <cassert>
27
#include "MSEventControl.h"
28
#include <utils/common/MsgHandler.h>
29
#include <utils/common/Command.h>
30
#include "MSNet.h"
31
32
33
// ===========================================================================
34
// member definitions
35
// ===========================================================================
36
MSEventControl::MSEventControl() :
37
myEvents() {}
38
39
40
MSEventControl::~MSEventControl() {
41
// delete the events
42
for (const Event& e : myEvents) {
43
delete e.first;
44
}
45
}
46
47
48
void
49
MSEventControl::addEvent(Command* operation, SUMOTime execTimeStep) {
50
myEvents.emplace_back(Event(operation, execTimeStep));
51
std::push_heap(myEvents.begin(), myEvents.end(), MSEventControl::eventCompare);
52
}
53
54
55
void
56
MSEventControl::execute(SUMOTime execTime) {
57
// Execute all events that are scheduled for execTime.
58
while (!myEvents.empty()) {
59
Event currEvent = myEvents.front();
60
if (currEvent.second < 0) {
61
currEvent.second = execTime;
62
}
63
if (currEvent.second < execTime + DELTA_T) {
64
Command* command = currEvent.first;
65
std::pop_heap(myEvents.begin(), myEvents.end(), eventCompare);
66
myEvents.pop_back();
67
SUMOTime time = 0;
68
try {
69
time = command->execute(execTime);
70
} catch (...) {
71
delete command;
72
throw;
73
}
74
75
// Delete nonrecurring events, reinsert recurring ones
76
// with new execution time = execTime + returned offset.
77
if (time <= 0) {
78
if (time < 0) {
79
WRITE_WARNING("Command returned negative repeat number; will be deleted.");
80
}
81
delete currEvent.first;
82
} else {
83
addEvent(currEvent.first, currEvent.second + time);
84
}
85
} else {
86
break;
87
}
88
}
89
}
90
91
92
bool
93
MSEventControl::isEmpty() {
94
return myEvents.empty();
95
}
96
97
bool
98
MSEventControl::eventCompare(const Event& e1, const Event& e2) {
99
return e1.second == e2.second ? e1.first->priority < e2.first->priority : e1.second > e2.second;
100
}
101
102
void
103
MSEventControl::clearState(SUMOTime currentTime, SUMOTime newTime) {
104
for (auto eventIt = myEvents.begin(); eventIt != myEvents.end();) {
105
eventIt->second = eventIt->first->shiftTime(currentTime, eventIt->second, newTime);
106
if (eventIt->second >= 0) {
107
++eventIt;
108
} else {
109
delete eventIt->first;
110
eventIt = myEvents.erase(eventIt);
111
}
112
}
113
std::make_heap(myEvents.begin(), myEvents.end(), eventCompare);
114
}
115
116
117
/****************************************************************************/
118
119