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