Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netload/NLDiscreteEventBuilder.cpp
169665 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 NLDiscreteEventBuilder.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Sascha Krieg
18
/// @author Michael Behrisch
19
/// @date Sep, 2003
20
///
21
// }
22
/****************************************************************************/
23
#include <config.h>
24
25
#include <utils/xml/SUMOXMLDefinitions.h>
26
#include <microsim/MSNet.h>
27
#include <microsim/actions/Command_SaveTLSState.h>
28
#include <microsim/actions/Command_SaveTLSSwitches.h>
29
#include <microsim/actions/Command_SaveTLSSwitchStates.h>
30
#include <microsim/actions/Command_SaveTLSProgram.h>
31
#include <microsim/MSEventControl.h>
32
#include <microsim/traffic_lights/MSTLLogicControl.h>
33
#include <microsim/traffic_lights/MSTrafficLightLogic.h>
34
#include <utils/common/FileHelpers.h>
35
#include <utils/common/UtilExceptions.h>
36
#include <utils/iodevices/OutputDevice.h>
37
#include "NLDiscreteEventBuilder.h"
38
39
40
// ===========================================================================
41
// method definitions
42
// ===========================================================================
43
NLDiscreteEventBuilder::NLDiscreteEventBuilder(MSNet& net)
44
: myNet(net) {
45
myActions["SaveTLSStates"] = EV_SAVETLSTATE;
46
myActions["SaveTLSSwitchTimes"] = EV_SAVETLSWITCHES;
47
myActions["SaveTLSSwitchStates"] = EV_SAVETLSWITCHSTATES;
48
myActions["SaveTLSProgram"] = EV_SAVETLSPROGRAM;
49
}
50
51
52
NLDiscreteEventBuilder::~NLDiscreteEventBuilder() {}
53
54
55
void
56
NLDiscreteEventBuilder::addAction(const SUMOSAXAttributes& attrs,
57
const std::string& basePath) {
58
bool ok = true;
59
const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "");
60
// check whether the type was given
61
if (type == "" || !ok) {
62
throw InvalidArgument("An action's type is not given.");
63
}
64
// get the numerical representation
65
KnownActions::iterator i = myActions.find(type);
66
if (i == myActions.end()) {
67
throw InvalidArgument("The action type '" + type + "' is not known.");
68
}
69
// build the action
70
switch ((*i).second) {
71
case EV_SAVETLSTATE:
72
buildSaveTLStateCommand(attrs, basePath);
73
break;
74
case EV_SAVETLSWITCHES:
75
buildSaveTLSwitchesCommand(attrs, basePath);
76
break;
77
case EV_SAVETLSWITCHSTATES:
78
buildSaveTLSwitchStatesCommand(attrs, basePath);
79
break;
80
case EV_SAVETLSPROGRAM:
81
buildSaveTLSProgramCommand(attrs, basePath);
82
break;
83
}
84
}
85
86
87
void
88
NLDiscreteEventBuilder::buildSaveTLStateCommand(const SUMOSAXAttributes& attrs,
89
const std::string& basePath) {
90
bool ok = true;
91
const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
92
const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
93
const bool saveDetectors = attrs.getOpt<bool>(SUMO_ATTR_SAVE_DETECTORS, nullptr, ok, false);
94
const bool saveConditions = attrs.getOpt<bool>(SUMO_ATTR_SAVE_CONDITIONS, nullptr, ok, false);
95
// check the parameter
96
if (dest == "" || !ok) {
97
throw InvalidArgument("Incomplete description of an 'SaveTLSState'-action occurred.");
98
}
99
if (source == "") {
100
const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
101
for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
102
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
103
new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
104
saveDetectors, saveConditions);
105
}
106
} else {
107
// get the logic
108
if (!myNet.getTLSControl().knows(source)) {
109
throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
110
}
111
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
112
// build the action
113
new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
114
saveDetectors, saveConditions);
115
}
116
}
117
118
119
void
120
NLDiscreteEventBuilder::buildSaveTLSwitchesCommand(const SUMOSAXAttributes& attrs,
121
const std::string& basePath) {
122
bool ok = true;
123
const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
124
const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
125
// check the parameter
126
if (dest == "" || !ok) {
127
throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchTimes'-action occurred.");
128
}
129
if (source == "") {
130
const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
131
for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
132
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
133
new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
134
}
135
} else {
136
// get the logic
137
if (!myNet.getTLSControl().knows(source)) {
138
throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
139
}
140
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
141
// build the action
142
new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
143
}
144
}
145
146
147
void
148
NLDiscreteEventBuilder::buildSaveTLSwitchStatesCommand(const SUMOSAXAttributes& attrs,
149
const std::string& basePath) {
150
bool ok = true;
151
const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
152
const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
153
// check the parameter
154
if (dest == "" || !ok) {
155
throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchStates'-action occurred.");
156
}
157
if (source == "") {
158
const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
159
for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
160
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
161
new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
162
}
163
} else {
164
// get the logic
165
if (!myNet.getTLSControl().knows(source)) {
166
throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
167
}
168
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
169
// build the action
170
new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
171
}
172
}
173
174
175
void
176
NLDiscreteEventBuilder::buildSaveTLSProgramCommand(const SUMOSAXAttributes& attrs,
177
const std::string& basePath) {
178
bool ok = true;
179
const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
180
const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
181
// check the parameter
182
if (dest == "" || !ok) {
183
throw InvalidArgument("Incomplete description of an 'SaveTLSProgram'-action occurred.");
184
}
185
if (source == "") {
186
const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
187
for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
188
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
189
new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
190
}
191
} else {
192
// get the logic
193
if (!myNet.getTLSControl().knows(source)) {
194
throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
195
}
196
const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
197
// build the action
198
new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
199
}
200
}
201
202
203
/****************************************************************************/
204
205