Eclipse SUMO - Simulation of Urban MObility
NLDiscreteEventBuilder.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 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 /****************************************************************************/
21 // }
22 /****************************************************************************/
23 #include <config.h>
24 
26 #include <microsim/MSNet.h>
37 #include "NLDiscreteEventBuilder.h"
38 
39 
40 // ===========================================================================
41 // method definitions
42 // ===========================================================================
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 
53 
54 
55 void
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;
78  buildSaveTLSwitchStatesCommand(attrs, basePath);
79  break;
80  case EV_SAVETLSPROGRAM:
81  buildSaveTLSProgramCommand(attrs, basePath);
82  break;
83  }
84 }
85 
86 
87 void
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) {
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
114  saveDetectors, saveConditions);
115  }
116 }
117 
118 
119 void
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) {
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
143  }
144 }
145 
146 
147 void
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) {
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
171  }
172 }
173 
174 
175 void
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) {
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
199  }
200 }
201 
202 
203 /****************************************************************************/
@ SUMO_ATTR_SOURCE
@ SUMO_ATTR_SAVE_DETECTORS
@ SUMO_ATTR_DEST
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_SAVE_CONDITIONS
Writes the switch times of a tls into a file when the tls switches.
Writes the state of the tls to a file (in each second)
Writes the switch times of a tls into a file when the tls switches.
Writes information about the green durations of a tls.
static std::string checkForRelativity(const std::string &filename, const std::string &basePath)
Returns the path from a configuration so that it is accessable from the current working directory.
The simulated network and simulation perfomer.
Definition: MSNet.h:89
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:451
Storage for all programs of a single tls.
std::vector< std::string > getAllTLIds() const
bool knows(const std::string &id) const
Returns the information whether the named tls is stored.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
NLDiscreteEventBuilder(MSNet &net)
Constructor.
void buildSaveTLSwitchesCommand(const SUMOSAXAttributes &attrs, const std::string &basePath)
Builds an action which saves the switch times of links into a file.
void addAction(const SUMOSAXAttributes &attrs, const std::string &basePath)
Builds an action and saves it for further use.
void buildSaveTLSProgramCommand(const SUMOSAXAttributes &attrs, const std::string &basePath)
Builds an action which saves the tls states as a loadable program into a file.
KnownActions myActions
Build actions that shall be executed during the simulation.
void buildSaveTLStateCommand(const SUMOSAXAttributes &attrs, const std::string &basePath)
Builds an action which saves the state of a certain tls into a file.
void buildSaveTLSwitchStatesCommand(const SUMOSAXAttributes &attrs, const std::string &basePath)
Builds an action which saves the switch times and states of tls into a file.
@ EV_SAVETLSWITCHSTATES
"SaveTLSSwitchStates"
@ EV_SAVETLSWITCHES
"SaveTLSSwitchTimes"
@ EV_SAVETLSPROGRAM
"SaveTLSProgram"
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
Encapsulated SAX-Attributes.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.