Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2026 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 41234 : NLDiscreteEventBuilder::NLDiscreteEventBuilder(MSNet& net)
44 41234 : : myNet(net) {
45 41234 : myActions["SaveTLSStates"] = EV_SAVETLSTATE;
46 41234 : myActions["SaveTLSSwitchTimes"] = EV_SAVETLSWITCHES;
47 41234 : myActions["SaveTLSSwitchStates"] = EV_SAVETLSWITCHSTATES;
48 41234 : myActions["SaveTLSProgram"] = EV_SAVETLSPROGRAM;
49 41234 : }
50 :
51 :
52 41234 : NLDiscreteEventBuilder::~NLDiscreteEventBuilder() {}
53 :
54 :
55 : void
56 1292 : NLDiscreteEventBuilder::addAction(const SUMOSAXAttributes& attrs,
57 : const std::string& basePath) {
58 1292 : bool ok = true;
59 1292 : const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "");
60 : // check whether the type was given
61 1292 : if (type == "" || !ok) {
62 0 : throw InvalidArgument("An action's type is not given.");
63 : }
64 : // get the numerical representation
65 : KnownActions::iterator i = myActions.find(type);
66 1292 : if (i == myActions.end()) {
67 0 : throw InvalidArgument("The action type '" + type + "' is not known.");
68 : }
69 : // build the action
70 1292 : switch ((*i).second) {
71 401 : case EV_SAVETLSTATE:
72 401 : buildSaveTLStateCommand(attrs, basePath);
73 : break;
74 140 : case EV_SAVETLSWITCHES:
75 140 : buildSaveTLSwitchesCommand(attrs, basePath);
76 : break;
77 709 : case EV_SAVETLSWITCHSTATES:
78 709 : buildSaveTLSwitchStatesCommand(attrs, basePath);
79 : break;
80 42 : case EV_SAVETLSPROGRAM:
81 42 : buildSaveTLSProgramCommand(attrs, basePath);
82 : break;
83 : }
84 1292 : }
85 :
86 :
87 : void
88 401 : NLDiscreteEventBuilder::buildSaveTLStateCommand(const SUMOSAXAttributes& attrs,
89 : const std::string& basePath) {
90 401 : bool ok = true;
91 401 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
92 401 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
93 401 : const bool saveDetectors = attrs.getOpt<bool>(SUMO_ATTR_SAVE_DETECTORS, nullptr, ok, false);
94 401 : const bool saveConditions = attrs.getOpt<bool>(SUMO_ATTR_SAVE_CONDITIONS, nullptr, ok, false);
95 : // check the parameter
96 401 : if (dest == "" || !ok) {
97 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSState'-action occurred.");
98 : }
99 401 : if (source == "") {
100 0 : const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
101 0 : for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
102 0 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
103 0 : new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
104 0 : saveDetectors, saveConditions);
105 : }
106 0 : } else {
107 : // get the logic
108 401 : if (!myNet.getTLSControl().knows(source)) {
109 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
110 : }
111 401 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
112 : // build the action
113 401 : new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
114 401 : saveDetectors, saveConditions);
115 : }
116 401 : }
117 :
118 :
119 : void
120 140 : NLDiscreteEventBuilder::buildSaveTLSwitchesCommand(const SUMOSAXAttributes& attrs,
121 : const std::string& basePath) {
122 140 : bool ok = true;
123 140 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
124 140 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
125 : // check the parameter
126 140 : if (dest == "" || !ok) {
127 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchTimes'-action occurred.");
128 : }
129 140 : if (source == "") {
130 0 : const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
131 0 : for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
132 0 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
133 0 : new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
134 : }
135 0 : } else {
136 : // get the logic
137 140 : if (!myNet.getTLSControl().knows(source)) {
138 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
139 : }
140 140 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
141 : // build the action
142 280 : new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
143 : }
144 140 : }
145 :
146 :
147 : void
148 709 : NLDiscreteEventBuilder::buildSaveTLSwitchStatesCommand(const SUMOSAXAttributes& attrs,
149 : const std::string& basePath) {
150 709 : bool ok = true;
151 709 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
152 709 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
153 : // check the parameter
154 709 : if (dest == "" || !ok) {
155 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchStates'-action occurred.");
156 : }
157 709 : if (source == "") {
158 23 : const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
159 57 : for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
160 34 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
161 68 : new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
162 : }
163 23 : } else {
164 : // get the logic
165 686 : if (!myNet.getTLSControl().knows(source)) {
166 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
167 : }
168 686 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
169 : // build the action
170 1372 : new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
171 : }
172 709 : }
173 :
174 :
175 : void
176 42 : NLDiscreteEventBuilder::buildSaveTLSProgramCommand(const SUMOSAXAttributes& attrs,
177 : const std::string& basePath) {
178 42 : bool ok = true;
179 42 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
180 42 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
181 : // check the parameter
182 42 : if (dest == "" || !ok) {
183 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSProgram'-action occurred.");
184 : }
185 42 : if (source == "") {
186 0 : const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
187 0 : for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
188 0 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
189 0 : new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
190 : }
191 0 : } else {
192 : // get the logic
193 42 : if (!myNet.getTLSControl().knows(source)) {
194 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
195 : }
196 42 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
197 : // build the action
198 84 : new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
199 : }
200 42 : }
201 :
202 :
203 : /****************************************************************************/
|