Line data Source code
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 44136 : NLDiscreteEventBuilder::NLDiscreteEventBuilder(MSNet& net)
44 44136 : : myNet(net) {
45 44136 : myActions["SaveTLSStates"] = EV_SAVETLSTATE;
46 44136 : myActions["SaveTLSSwitchTimes"] = EV_SAVETLSWITCHES;
47 44136 : myActions["SaveTLSSwitchStates"] = EV_SAVETLSWITCHSTATES;
48 44136 : myActions["SaveTLSProgram"] = EV_SAVETLSPROGRAM;
49 44136 : }
50 :
51 :
52 44136 : NLDiscreteEventBuilder::~NLDiscreteEventBuilder() {}
53 :
54 :
55 : void
56 965 : NLDiscreteEventBuilder::addAction(const SUMOSAXAttributes& attrs,
57 : const std::string& basePath) {
58 965 : bool ok = true;
59 965 : const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "");
60 : // check whether the type was given
61 965 : 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 965 : if (i == myActions.end()) {
67 0 : throw InvalidArgument("The action type '" + type + "' is not known.");
68 : }
69 : // build the action
70 965 : switch ((*i).second) {
71 378 : case EV_SAVETLSTATE:
72 378 : buildSaveTLStateCommand(attrs, basePath);
73 : break;
74 137 : case EV_SAVETLSWITCHES:
75 137 : buildSaveTLSwitchesCommand(attrs, basePath);
76 : break;
77 423 : case EV_SAVETLSWITCHSTATES:
78 423 : buildSaveTLSwitchStatesCommand(attrs, basePath);
79 : break;
80 27 : case EV_SAVETLSPROGRAM:
81 27 : buildSaveTLSProgramCommand(attrs, basePath);
82 : break;
83 : }
84 965 : }
85 :
86 :
87 : void
88 378 : NLDiscreteEventBuilder::buildSaveTLStateCommand(const SUMOSAXAttributes& attrs,
89 : const std::string& basePath) {
90 378 : bool ok = true;
91 378 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
92 378 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
93 378 : const bool saveDetectors = attrs.getOpt<bool>(SUMO_ATTR_SAVE_DETECTORS, nullptr, ok, false);
94 378 : const bool saveConditions = attrs.getOpt<bool>(SUMO_ATTR_SAVE_CONDITIONS, nullptr, ok, false);
95 : // check the parameter
96 378 : if (dest == "" || !ok) {
97 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSState'-action occurred.");
98 : }
99 378 : 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 378 : if (!myNet.getTLSControl().knows(source)) {
109 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
110 : }
111 378 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
112 : // build the action
113 378 : new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
114 378 : saveDetectors, saveConditions);
115 : }
116 378 : }
117 :
118 :
119 : void
120 137 : NLDiscreteEventBuilder::buildSaveTLSwitchesCommand(const SUMOSAXAttributes& attrs,
121 : const std::string& basePath) {
122 137 : bool ok = true;
123 137 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
124 137 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
125 : // check the parameter
126 137 : if (dest == "" || !ok) {
127 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchTimes'-action occurred.");
128 : }
129 137 : 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 137 : if (!myNet.getTLSControl().knows(source)) {
138 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
139 : }
140 137 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
141 : // build the action
142 274 : new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
143 : }
144 137 : }
145 :
146 :
147 : void
148 423 : NLDiscreteEventBuilder::buildSaveTLSwitchStatesCommand(const SUMOSAXAttributes& attrs,
149 : const std::string& basePath) {
150 423 : bool ok = true;
151 423 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
152 423 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
153 : // check the parameter
154 423 : if (dest == "" || !ok) {
155 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchStates'-action occurred.");
156 : }
157 423 : if (source == "") {
158 16 : const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
159 43 : for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
160 27 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
161 54 : new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
162 : }
163 16 : } else {
164 : // get the logic
165 407 : if (!myNet.getTLSControl().knows(source)) {
166 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
167 : }
168 407 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
169 : // build the action
170 814 : new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
171 : }
172 423 : }
173 :
174 :
175 : void
176 27 : NLDiscreteEventBuilder::buildSaveTLSProgramCommand(const SUMOSAXAttributes& attrs,
177 : const std::string& basePath) {
178 27 : bool ok = true;
179 27 : const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
180 27 : const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
181 : // check the parameter
182 27 : if (dest == "" || !ok) {
183 0 : throw InvalidArgument("Incomplete description of an 'SaveTLSProgram'-action occurred.");
184 : }
185 27 : 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 27 : if (!myNet.getTLSControl().knows(source)) {
194 0 : throw InvalidArgument("The traffic light logic to save (" + source + ") is not known.");
195 : }
196 27 : const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
197 : // build the action
198 54 : new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
199 : }
200 27 : }
201 :
202 :
203 : /****************************************************************************/
|