Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
NBTrafficLightLogicCont.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-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/****************************************************************************/
20// A container for traffic light definitions and built programs
21/****************************************************************************/
22#include <config.h>
23#include <map>
24#include <string>
25#include <algorithm>
31#include "NBTrafficLightLogic.h"
33#include "NBOwnTLDef.h"
34#include "NBLoadedSUMOTLDef.h"
35#include "NBEdgeCont.h"
36#include "NBNodeCont.h"
37
38
39// ===========================================================================
40// static members
41// ===========================================================================
43
44// ===========================================================================
45// method definitions
46// ===========================================================================
48
49
53
54
55void
57 // check whether any offsets shall be manipulated by setting
58 // them to half of the duration
59 if (oc.isSet("tls.half-offset")) {
60 std::vector<std::string> ids = oc.getStringVector("tls.half-offset");
61 myHalfOffsetTLS.insert(ids.begin(), ids.end());
62 }
63 // check whether any offsets shall be manipulated by setting
64 // them to a quarter of the duration
65 if (oc.isSet("tls.quarter-offset")) {
66 std::vector<std::string> ids = oc.getStringVector("tls.quarter-offset");
67 myQuarterOffsetTLS.insert(ids.begin(), ids.end());
68 }
69}
70
71
72std::string
73NBTrafficLightLogicCont::getNextProgramID(const std::string& id) const {
74 IDSupplier idS("", 0);
75 if (myDefinitions.count(id)) {
76 const Program2Def& programs = myDefinitions.find(id)->second;
77 for (auto item : programs) {
78 idS.avoid(item.first);
79 }
80 }
81 return idS.getNext();
82}
83
84
85bool
87 myExtracted.erase(logic);
88 if (myDefinitions.count(logic->getID())) {
89 if (myDefinitions[logic->getID()].count(logic->getProgramID())) {
90 if (forceInsert) {
91 logic->setProgramID(getNextProgramID(logic->getID()));
92 } else {
93 return false;
94 }
95 }
96 } else {
97 myDefinitions[logic->getID()] = Program2Def();
98 }
99 myDefinitions[logic->getID()][logic->getProgramID()] = logic;
100 return true;
101}
102
103
104bool
106 if (myDefinitions.count(id)) {
107 // delete all programs
108 for (Program2Def::iterator i = myDefinitions[id].begin(); i != myDefinitions[id].end(); i++) {
109 delete i->second;
110 }
111 myDefinitions.erase(id);
112 // also delete any logics that were already computed
113 if (myComputed.count(id)) {
114 for (Program2Logic::iterator i = myComputed[id].begin(); i != myComputed[id].end(); i++) {
115 delete i->second;
116 }
117 myComputed.erase(id);
118 }
119 return true;
120 } else {
121 return false;
122 }
123}
124
125
126bool
127NBTrafficLightLogicCont::removeProgram(const std::string id, const std::string programID, bool del) {
128 if (myDefinitions.count(id) && myDefinitions[id].count(programID)) {
129 if (del) {
130 delete myDefinitions[id][programID];
131 }
132 myDefinitions[id].erase(programID);
133 return true;
134 } else {
135 return false;
136 }
137}
138
139
140void
142 myExtracted.insert(definition);
143 removeProgram(definition->getID(), definition->getProgramID(), false);
144}
145
146
147bool
148NBTrafficLightLogicCont::exist(const std::string& newID, bool requireComputed) const {
149 const auto itD = myDefinitions.find(newID);
150 const auto itC = myComputed.find(newID);
151 if ((itD != myDefinitions.end()) && (itC != myComputed.end() || !requireComputed)) {
152 return true;
153 } else {
154 return false;
155 }
156}
157
158
159std::pair<int, int>
161 // clean previous logics
162 Logics logics = getComputed();
163 for (Logics::iterator it = logics.begin(); it != logics.end(); it++) {
164 delete *it;
165 }
166 myComputed.clear();
167 if (oc.getBool("tls.rebuild")) {
169 NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(def);
170 if (lDef != nullptr) {
171 TrafficLightType type = def->getType();
172 if (!oc.isDefault("tls.default-type")) {
173 type = SUMOXMLDefinitions::TrafficLightTypes.get(oc.getString("tls.default-type"));
174 }
175 NBOwnTLDef* oDef = new NBOwnTLDef(def->getID(), def->getNodes(), def->getOffset(), type);
176 oDef->setProgramID(def->getProgramID());
178 for (NBEdge* e : oDef->getIncomingEdges()) {
179 e->clearControllingTLInformation();
180 }
182 for (NBNode* node : oDef->getNodes()) {
183 node->removeTrafficLight(def);
184 for (auto c : node->getCrossings()) {
185 c->customTLIndex = -1;
186 c->customTLIndex2 = -1;
187 c->tlLinkIndex2 = -1;
188 }
189 }
190 removeProgram(def->getID(), def->getProgramID());
191 insert(oDef);
192 }
193 }
194 }
195 if (oc.getBool("tls.group-signals")) {
196 // replace NBOwnTLDef tld with NBLoadedSUMOTLDef
198 NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(def);
199 if (lDef == nullptr) {
200 NBTrafficLightLogic* logic = def->compute(oc);
201 if (logic != nullptr) {
202 lDef = new NBLoadedSUMOTLDef(*def, *logic);
204 for (NBNode* node : lDef->getNodes()) {
205 node->removeTrafficLight(def);
206 node->addTrafficLight(lDef);
207 }
208 removeProgram(def->getID(), def->getProgramID());
209 insert(lDef);
210 delete logic;
211 }
212 }
213 if (lDef != nullptr) {
214 lDef->groupSignals();
215 }
216 }
217 } else if (oc.getBool("tls.ungroup-signals")) {
219 NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(def);
220 // NBOwnTLDef are always ungrouped
221 if (lDef != nullptr) {
222 if (lDef->usingSignalGroups()) {
223 lDef->ungroupSignals();
224 }
225 }
226 }
227 }
228 int numPrograms = 0;
230 if (computeSingleLogic(oc, def)) {
231 numPrograms++;
232 }
233 }
234 return std::pair<int, int>((int)myComputed.size(), numPrograms);
235}
236
237
238bool
240 if (def->getNodes().size() == 0) {
241 return false;
242 }
243 const std::string& id = def->getID();
244 const std::string& programID = def->getProgramID();
245 // build program
246 NBTrafficLightLogic* built = def->compute(oc);
247 if (built == nullptr) {
248 WRITE_WARNINGF(TL("Could not build program '%' for traffic light '%'"), programID, id);
249 return false;
250 }
251 // compute offset
252 SUMOTime T = built->getDuration();
253 if (myHalfOffsetTLS.count(id)) {
254 built->setOffset(TIME2STEPS(floor(STEPS2TIME(T / 2))));
255 }
256 if (myQuarterOffsetTLS.count(id)) {
257 built->setOffset(TIME2STEPS(floor(STEPS2TIME(T / 4))));
258 }
259 // and insert the result after computation
260 // make sure we don't leak memory if computeSingleLogic is called externally
261 if (myComputed[id][programID] != nullptr) {
262 delete myComputed[id][programID];
263 }
264 myComputed[id][programID] = built;
265 return true;
266}
267
268
269void
271 Definitions definitions = getDefinitions();
272 for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
273 delete *it;
274 }
275 myDefinitions.clear();
276 Logics logics = getComputed();
277 for (Logics::iterator it = logics.begin(); it != logics.end(); it++) {
278 delete *it;
279 }
280 myComputed.clear();
281 for (std::set<NBTrafficLightDefinition*>::iterator it = myExtracted.begin(); it != myExtracted.end(); it++) {
282 delete *it;
283 }
284 myExtracted.clear();
285}
286
287
288void
290 const EdgeVector& outgoing) {
291 Definitions definitions = getDefinitions();
292 for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
293 (*it)->remapRemoved(removed, incoming, outgoing);
294 }
295}
296
297
298void
300 NBEdge* by, int byLane, bool incoming) {
301 Definitions definitions = getDefinitions();
302 for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
303 (*it)->replaceRemoved(removed, removedLane, by, byLane, incoming);
304 }
305}
306
307
309NBTrafficLightLogicCont::getDefinition(const std::string& id, const std::string& programID) const {
310 Id2Defs::const_iterator i = myDefinitions.find(id);
311 if (i != myDefinitions.end()) {
312 Program2Def programs = i->second;
313 Program2Def::const_iterator i2 = programs.find(programID);
314 if (i2 != programs.end()) {
315 return i2->second;
316 }
317 }
318 return nullptr;
319}
320
322NBTrafficLightLogicCont::getPrograms(const std::string& id) const {
323 Id2Defs::const_iterator it = myDefinitions.find(id);
324 if (it != myDefinitions.end()) {
325 return it->second;
326 } else {
327 return EmptyDefinitions;
328 }
329}
330
331
333NBTrafficLightLogicCont::getLogic(const std::string& id, const std::string& programID) const {
334 Id2Logics::const_iterator i = myComputed.find(id);
335 if (i != myComputed.end()) {
336 Program2Logic programs = i->second;
337 Program2Logic::const_iterator i2 = programs.find(programID);
338 if (i2 != programs.end()) {
339 return i2->second;
340 }
341 }
342 return nullptr;
343}
344
345
346void
348 Definitions definitions = getDefinitions();
349 // set the information about all participants, first
350 for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
351 (*it)->setParticipantsInformation();
352 }
353 // clear previous information because tlDefs may have been removed in netedit
355 // insert the information about the tl-controlling
356 for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
357 (*it)->setTLControllingInformation();
358 }
359 // handle rail signals which are not instantiated as normal definitions
360 for (std::map<std::string, NBNode*>::const_iterator it = nc.begin(); it != nc.end(); it ++) {
361 NBNode* n = it->second;
363 NBOwnTLDef dummy(n->getID(), n, 0, TrafficLightType::STATIC);
366 n->setCrossingTLIndices(dummy.getID(), (int)dummy.getControlledLinks().size());
367 n->removeTrafficLight(&dummy);
368 }
369 }
370}
371
372
373void
375 Definitions definitions = getDefinitions();
377 std::map<NBEdge*, std::string> defaultSignalIDs;
378 for (const NBConnection& con : def->getControlledLinks()) {
379 const NBEdge::Connection& c = con.getFrom()->getConnection(con.getFromLane(), con.getTo(), con.getToLane());
380 if (c.hasParameter("signalID")) {
381 defaultSignalIDs[con.getFrom()] = c.getParameter("signalID");
382 def->setParameter("linkSignalID:" + toString(con.getTLIndex()), c.getParameter("signalID"));
383 }
384 }
385 // oftentimes, signals are placed on connecting road but are meant to apply to all connections from the incoming edge
386 for (const NBConnection& con : def->getControlledLinks()) {
387 const NBEdge::Connection& c = con.getFrom()->getConnection(con.getFromLane(), con.getTo(), con.getToLane());
388 if (!c.hasParameter("signalID") && defaultSignalIDs.count(con.getFrom()) != 0) {
389 WRITE_WARNINGF(TL("Guessing signalID for link index % at traffic light '%'."), con.getTLIndex(), def->getID());
390 def->setParameter("linkSignalID:" + toString(con.getTLIndex()), defaultSignalIDs[con.getFrom()]);
391 }
392 }
393 }
394}
395
396
397void
399 // collect connections with controllerID which can be controlled together
400 Definitions definitions = getDefinitions();
401 std::map<std::string, NBTrafficLightDefinition*> defsToGroup;
402 std::map<std::string, std::map<std::string, std::set<int>>> controllerID2tlIndex;
403 for (NBTrafficLightDefinition* def : definitions) {
404 bool makeGroups = false;
405 NBConnectionVector& connections = def->getControlledLinks();
406 std::string defID = def->getID();
407
408 for (NBConnection conn : connections) {
409 std::string controllerID = conn.getFrom()->getConnection(conn.getFromLane(), conn.getTo(), conn.getToLane()).getParameter("controllerID");
410 if (controllerID != "") {
411 if (controllerID2tlIndex.find(defID) == controllerID2tlIndex.end()) {
412 controllerID2tlIndex[defID][controllerID] = std::set<int>({ conn.getTLIndex() });
413 } else if (controllerID2tlIndex[defID].find(controllerID) != controllerID2tlIndex[defID].end()) {
414 controllerID2tlIndex[defID][controllerID].insert(conn.getTLIndex());
415 } else {
416 controllerID2tlIndex[defID][controllerID] = std::set<int>({ conn.getTLIndex() });
417 }
418 makeGroups = controllerID2tlIndex[defID][controllerID].size() > 1 || makeGroups;
419 }
420 }
421 if (makeGroups) {
422 defsToGroup[def->getID()] = def;
423 }
424 }
425 bool same = true;
426 for (NBTrafficLightLogic* computed : getComputed()) {
427 const std::string computedID = computed->getID();
428 if (defsToGroup.find(computedID) != defsToGroup.end()) {
429 // remember corresponding tl indices and check if they can be joined
430 // execute tl index joins if possible
431 const std::vector<NBTrafficLightLogic::PhaseDefinition> phases = computed->getPhases();
432 std::vector<int> major2minor;
433 for (const auto& indexSet : controllerID2tlIndex[computedID]) {
434 if (indexSet.second.size() < 2) {
435 continue;
436 }
437 bool toMinor = false;
438 for (NBTrafficLightLogic::PhaseDefinition phase : phases) {
439 std::set<int>::iterator it = indexSet.second.begin();
440 char firstChar = phase.state[*it];
441 if (firstChar == LINKSTATE_TL_GREEN_MAJOR) {
442 firstChar = LINKSTATE_TL_GREEN_MINOR;
443 }
444 it++;
445 for (; it != indexSet.second.end(); it++) {
446 const char compareChar = (phase.state[*it] != LINKSTATE_TL_GREEN_MAJOR) ? phase.state[*it] : (char)LINKSTATE_TL_GREEN_MINOR;
447 if (compareChar != firstChar) {
448 same = false;
449 break;
450 } else if (phase.state[*it] == LINKSTATE_TL_GREEN_MINOR) {
451 toMinor = true;
452 }
453 }
454 if (!same) {
455 break;
456 }
457 }
458 if (toMinor) {
459 major2minor.push_back(*indexSet.second.begin());
460 }
461 }
462 if (same) {
463 NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(defsToGroup[computedID]);
464 if (lDef == nullptr) {
465 lDef = new NBLoadedSUMOTLDef(*defsToGroup[computedID], *computed);
467 for (int index : major2minor) { // update the signal states (G -> g where needed)
468 for (int i = 0; i < (int)phases.size(); i++) {
469 if (phases[i].state[index] == LINKSTATE_TL_GREEN_MAJOR) {
471 }
472 }
473 }
474 // join signal groups, update the connections
475 std::vector<int> indexToRemove;
476 for (const auto& indexSet : controllerID2tlIndex[computedID]) {
477 int minIndex = *indexSet.second.begin();
478 for (int index : indexSet.second) {
479 if (index != minIndex) {
480 lDef->replaceIndex(index, minIndex);
481 indexToRemove.push_back(index);
482 }
483 }
484 }
485 // remove unused indices from signal programs
486 lDef->cleanupStates();
487 for (NBNode* node : lDef->getNodes()) {
488 node->removeTrafficLight(defsToGroup[computedID]);
489 node->addTrafficLight(lDef);
490 }
491 removeProgram(defsToGroup[computedID]->getID(), defsToGroup[computedID]->getProgramID());
492 insert(lDef);
493 computeSingleLogic(oc, lDef);
494 }
495 } else { // TODO: try other strategy to build signal groups
496 WRITE_WARNINGF(TL("Was not able to apply the OpenDRIVE signal group information onto the signal program of traffic light % generated by SUMO."), computed->getID());
497 }
498 break;
499 }
500 }
501}
502
503
506 Logics result;
507 for (Id2Logics::const_iterator it_id = myComputed.begin(); it_id != myComputed.end(); it_id++) {
508 const Program2Logic& programs = it_id->second;
509 for (Program2Logic::const_iterator it_prog = programs.begin(); it_prog != programs.end(); it_prog++) {
510 result.push_back(it_prog->second);
511 }
512 }
513 return result;
514}
515
516
519 Definitions result;
520 for (Id2Defs::const_iterator it_id = myDefinitions.begin(); it_id != myDefinitions.end(); it_id++) {
521 const Program2Def& programs = it_id->second;
522 for (Program2Def::const_iterator it_prog = programs.begin(); it_prog != programs.end(); it_prog++) {
523 result.push_back(it_prog->second);
524 }
525 }
526 return result;
527}
528
529
530void
532 auto it = myDefinitions.find(tlDef->getID());
533 if (it != myDefinitions.end()) {
534 for (auto item : it->second) {
535 item.second->setID(newID);
536 }
537 myDefinitions[newID] = it->second;
538 myDefinitions.erase(it);
539 }
540 auto it2 = myComputed.find(tlDef->getID());
541 if (it2 != myComputed.end()) {
542 for (auto item : it2->second) {
543 item.second->setID(newID);
544 }
545 myComputed[newID] = it2->second;
546 myComputed.erase(it2);
547 }
548}
549
550
551int
553 return (int)myExtracted.size();
554}
555
556/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:288
#define TL(string)
Definition MsgHandler.h:305
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition NBCont.h:42
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define TIME2STEPS(x)
Definition SUMOTime.h:57
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_TL_GREEN_MINOR
The link has green light, has to brake.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
std::string getNext()
Returns the next id.
void avoid(const std::string &id)
make sure that the given id is never supplied
Storage for edges, including some functionality operating on multiple edges.
Definition NBEdgeCont.h:59
void clearControllingTLInformation() const
Clears information about controlling traffic lights for all connenections of all edges.
The representation of a single edge during network building.
Definition NBEdge.h:92
A loaded (complete) traffic light logic.
bool usingSignalGroups() const
whether this definition uses signal group (multiple connections with the same link index)
void ungroupSignals()
let all connections use a distinct link index
NBTrafficLightLogic * getLogic()
Returns the internal logic.
void groupSignals()
let connections with the same state use the same link index
void replaceIndex(int oldIndex, int newIndex)
replace the given link index in all connections
Container for nodes during the netbuilding process.
Definition NBNodeCont.h:57
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
Definition NBNodeCont.h:113
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
Definition NBNodeCont.h:118
Represents a single node (junction) during network building.
Definition NBNode.h:66
SumoXMLNodeType getType() const
Returns the type of this node.
Definition NBNode.h:285
void removeTrafficLight(NBTrafficLightDefinition *tlDef)
Removes the given traffic light from this node.
Definition NBNode.cpp:428
bool setCrossingTLIndices(const std::string &tlID, int startIndex, bool ignoreCustom=false)
Definition NBNode.cpp:4163
A traffic light logics which must be computed (only nodes/edges are given)
Definition NBOwnTLDef.h:44
void setTLControllingInformation() const
Informs edges about being controlled by a tls.
The base class for traffic light logic definitions.
const std::vector< NBNode * > & getNodes() const
Returns the list of controlled nodes.
const std::string & getProgramID() const
Returns the ProgramID.
const EdgeVector & getIncomingEdges() const
Returns the list of incoming edges (must be build first)
TrafficLightType getType() const
get the algorithm type (static etc..)
virtual void setProgramID(const std::string &programID)
Sets the programID.
NBTrafficLightLogic * compute(const OptionsCont &oc)
Computes the traffic light logic.
const NBConnectionVector & getControlledLinks() const
returns the controlled links (depends on previous call to collectLinks)
virtual void setParticipantsInformation()
Builds the list of participating nodes/edges/links.
The definition of a single phase of the logic.
bool exist(const std::string &newID, bool requireComputed=true) const
check if exists a definition with the given ID
void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane, bool incoming)
Replaces occurrences of the removed edge/lane in all definitions by the given edge.
void applyOptions(OptionsCont &oc)
Initialises the storage by applying given options.
void setOpenDriveSignalParameters()
set OpenDRIVE signal reference parameters after all link indices are known
std::vector< NBTrafficLightLogic * > getComputed() const
Returns a list of all computed logics.
void rename(NBTrafficLightDefinition *tlDef, const std::string &newID)
rename traffic light
std::map< std::string, NBTrafficLightDefinition * > Program2Def
std::set< std::string > myHalfOffsetTLS
List of tls which shall have an offset of T/2.
static const Program2Def EmptyDefinitions
empty definition
std::vector< NBTrafficLightLogic * > Logics
std::vector< NBTrafficLightDefinition * > Definitions
Returns a list of all definitions (convenience for easier iteration)
bool removeProgram(const std::string id, const std::string programID, bool del=true)
Removes a program of a logic definition from the dictionary.
bool computeSingleLogic(OptionsCont &oc, NBTrafficLightDefinition *def)
Computes a specific traffic light logic (using by netedit)
int getNumExtracted() const
return the number of extracted traffic light definitions
void clear()
Destroys all stored definitions and logics.
const std::map< std::string, NBTrafficLightDefinition * > & getPrograms(const std::string &id) const
Returns all programs for the given tl-id.
void remapRemoved(NBEdge *removed, const EdgeVector &incoming, const EdgeVector &outgoing)
Replaces occurrences of the removed edge in incoming/outgoing edges of all definitions.
std::set< std::string > myQuarterOffsetTLS
List of tls which shall have an offset of T/2.
Id2Logics myComputed
The container for previously computed tl-logics.
NBTrafficLightLogic * getLogic(const std::string &id, const std::string &programID) const
Returns the computed logic for the given name.
void applyOpenDriveControllers(OptionsCont &oc)
post processing of signal programs to group tl indices according to OpenDrive controllers (signal gro...
Id2Defs myDefinitions
The container for tl-ids to their definitions.
std::pair< int, int > computeLogics(OptionsCont &oc)
Computes the traffic light logics using the stored definitions and stores the results.
bool removeFully(const std::string id)
Removes a logic definition (and all programs) from the dictionary.
std::map< std::string, NBTrafficLightLogic * > Program2Logic
Definition of internal the container types.
std::string getNextProgramID(const std::string &id) const
Returns a new (unused) programID for the given traffic light.
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
NBTrafficLightDefinition * getDefinition(const std::string &id, const std::string &programID) const
Returns the named definition.
void extract(NBTrafficLightDefinition *definition)
Extracts a traffic light definition from myDefinitions but keeps it in myExtracted for eventual * del...
void setTLControllingInformation(const NBEdgeCont &ec, const NBNodeCont &nc)
Informs the edges about being controlled by a tls.
std::set< NBTrafficLightDefinition * > myExtracted
The container for extracted definitions.
A SUMO-compliant built logic for a traffic light.
SUMOTime getDuration() const
Returns the duration of the complete cycle.
void setPhaseState(int phaseIndex, int tlIndex, LinkState linkState)
Modifies the state for an existing phase (used by netedit)
void setOffset(SUMOTime offset)
Sets the offset of this tls.
const std::string & getID() const
Returns the id.
Definition Named.h:74
A storage for options typed value containers)
Definition OptionsCont.h:89
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
T get(const std::string &str) const
get key
A structure which describes a connection between edges or lanes.
Definition NBEdge.h:201