Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSTrafficLightLogic.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/****************************************************************************/
20// The parent class for traffic light logics
21/****************************************************************************/
22#include <config.h>
23
24#include <cassert>
25#include <string>
26#include <iostream>
27#include <map>
28#include <microsim/MSLink.h>
29#include <microsim/MSLane.h>
32#include <microsim/MSNet.h>
33#include <microsim/MSEdge.h>
34#include <microsim/MSGlobals.h>
35#include <mesosim/MESegment.h>
36#include "MSTLLogicControl.h"
37#include "MSTrafficLightLogic.h"
38
39
40// ===========================================================================
41// static value definitions
42// ===========================================================================
44
45
46// ===========================================================================
47// member method definitions
48// ===========================================================================
49/* -------------------------------------------------------------------------
50 * member method definitions
51 * ----------------------------------------------------------------------- */
53 MSTrafficLightLogic* tlLogic, SUMOTime nextSwitch) :
54 myTLControl(tlcontrol), myTLLogic(tlLogic),
55 myAssumedNextSwitch(nextSwitch), myAmValid(true) {
56 // higher than default command priority of 0
57 priority = 1;
58}
59
60
62
63
64
67 // check whether this command has been descheduled
68 if (!myAmValid) {
69 return 0;
70 }
71 int step1 = myTLLogic->getCurrentPhaseIndex();
72 SUMOTime next = myTLLogic->trySwitch();
73 while (next == 0) {
74 // skip phase and switch again
75 next = myTLLogic->trySwitch();
76 }
77 int step2 = myTLLogic->getCurrentPhaseIndex();
78 if (step1 != step2) {
79 if (myTLLogic->isActive()) {
80 // execute any action connected to this tls
81 const MSTLLogicControl::TLSLogicVariants& vars = myTLControl.get(myTLLogic->getID());
82 // set link priorities
83 myTLLogic->setTrafficLightSignals(t);
84 // execute switch actions
86 }
87 }
88 myAssumedNextSwitch += next;
89 return next;
90}
91
92
93void
95 if (tlLogic == myTLLogic) {
96 myAmValid = false;
97 myAssumedNextSwitch = -1;
98 }
99}
100
101
104 if (myTLLogic->getDefaultCycleTime() == DELTA_T) {
105 // MSRailSignal
106 return newTime;
107 } else {
108 UNUSED_PARAMETER(currentTime);
109 UNUSED_PARAMETER(execTime);
110 // XXX changeStepAndDuration (computed as in NLJunctionControlBuilder::closeTrafficLightLogic
111 return newTime;
112 }
113}
114
115/* -------------------------------------------------------------------------
116 * member method definitions
117 * ----------------------------------------------------------------------- */
119 const std::string& programID, const SUMOTime offset, const TrafficLightType logicType, const SUMOTime delay,
120 const Parameterised::Map& parameters) :
121 Named(id), Parameterised(parameters),
122 myProgramID(programID),
123 myOffset(offset),
124 myLogicType(logicType),
127 myAmActive(true) {
128 mySwitchCommand = new SwitchCommand(tlcontrol, this, delay);
130}
131
132
133void
135 const Phases& phases = getPhases();
136 if (phases.size() > 0 && (MSGlobals::gUseMesoSim || MSGlobals::gTLSPenalty > 0)) {
138 }
139 if (phases.size() > 1) {
140 bool haveWarnedAboutUnusedStates = false;
141 std::vector<bool> foundGreen(phases.front()->getState().size(), false);
142 for (int i = 0; i < (int)phases.size(); ++i) {
143 // warn about unused states
144 std::vector<int> nextPhases;
145 nextPhases.push_back((i + 1) % phases.size());
146 bool iNextDefault = true;
147 if (phases[i]->nextPhases.size() > 0) {
148 nextPhases = phases[i]->nextPhases;
149 iNextDefault = false;
150 }
151 for (int iNext : nextPhases) {
152 if (iNext < 0 || iNext >= (int)phases.size()) {
153 throw ProcessError("Invalid nextPhase " + toString(iNext) + " in tlLogic '" + getID()
154 + "', program '" + getProgramID() + "' with " + toString(phases.size()) + " phases");
155 }
156 const std::string optionalFrom = iNextDefault ? "" : " from phase " + toString(i);
157 const std::string& state1 = phases[i]->getState();
158 const std::string& state2 = phases[iNext]->getState();
159 if (state1.size() != state2.size()) {
160 throw ProcessError("Mismatching phase state length in tlLogic '" + getID()
161 + "', program '" + getProgramID() + "' in phases " + toString(i) + " and " + toString(iNext));
162 }
163 if (!haveWarnedAboutUnusedStates && state1.size() > myLanes.size() + myIgnoredIndices.size()) {
164 WRITE_WARNINGF(TL("Unused states in tlLogic '%', program '%' in phase % after tl-index %"),
165 getID(), getProgramID(), i, (int)myLanes.size() - 1);
166 haveWarnedAboutUnusedStates = true;
167 }
168 // detect illegal states
169 const std::string::size_type illegal = state1.find_first_not_of(SUMOXMLDefinitions::ALLOWED_TLS_LINKSTATES);
170 if (std::string::npos != illegal) {
171 throw ProcessError("Illegal character '" + toString(state1[illegal]) + "' in tlLogic '" + getID()
172 + "', program '" + getProgramID() + "' in phase " + toString(i));
173 }
174 // warn about transitions from green to red without intermediate yellow
175 bool haveWarned = false;
176 for (int j = 0; j < (int)MIN3(state1.size(), state2.size(), myLanes.size()) && !haveWarned; ++j) {
177 if ((LinkState)state2[j] == LINKSTATE_TL_RED
178 && ((LinkState)state1[j] == LINKSTATE_TL_GREEN_MAJOR
179 || (LinkState)state1[j] == LINKSTATE_TL_GREEN_MINOR)) {
180 for (LaneVector::const_iterator it = myLanes[j].begin(); it != myLanes[j].end(); ++it) {
181 if ((*it)->getPermissions() != SVC_PEDESTRIAN) {
183 WRITE_WARNINGF(TL("Missing yellow phase in tlLogic '%', program '%' for tl-index % when switching% to phase %."),
184 getID(), getProgramID(), j, optionalFrom, iNext);
185 // one warning per program is enough
186 haveWarned = true;
187 }
188 break;
189 }
190 }
191 }
192 }
193 // warn about links that never get the green light
194 for (int j = 0; j < (int)state1.size(); ++j) {
195 LinkState ls = (LinkState)state1[j];
197 foundGreen[j] = true;
198 }
199 }
200 }
201 }
202 for (int j = 0; j < (int)foundGreen.size(); ++j) {
203 if (!foundGreen[j]) {
204 WRITE_WARNINGF(TL("Missing green phase in tlLogic '%', program '%' for tl-index %."), getID(), getProgramID(), j);
205 break;
206 }
207 }
208 }
209 // check incompatible junction logic
210 // this can happen if the network was built with a very different signal
211 // plan from the one currently being used.
212 // Connections that never had a common green phase during network building may
213 // have a symmetric response relation to avoid certain kinds of jam but this
214 // can lead to deadlock if a different program gives minor green to both
215 // connections at the same time
216 // Note: mutual conflict between 'g' and 'G' is expected for traffic_light_right_on_red
217
218 const bool mustCheck = MSNet::getInstance()->hasInternalLinks();
219 // The checks only runs for definitions from additional file and this is sufficient.
220 // The distinction is implicit because original logics are loaded earlier and at that time hasInternalLinks is always false
221 // Also, when the network has no internal links, mutual conflicts are not built by netconvert
222 //std::cout << "init tlLogic=" << getID() << " prog=" << getProgramID() << " links=" << myLinks.size() << " internal=" << MSNet::getInstance()->hasInternalLinks() << "\n";
223 if (mustCheck && phases.size() > 0) {
224 // see NBNode::tlsConflict
225 std::set<const MSJunction*> controlledJunctions;
226 const int numLinks = (int)myLinks.size();
227 for (int j = 0; j < numLinks; ++j) {
228 for (int k = 0; k < (int)myLinks[j].size(); ++k) {
229 MSLink* link = myLinks[j][k];
230 assert(link->getJunction() != nullptr);
231 controlledJunctions.insert(link->getJunction());
232 }
233 }
234 const std::string minor = "gos";
235 for (const MSJunction* junction : controlledJunctions) {
236 const MSJunctionLogic* logic = junction->getLogic();
237 if (logic != nullptr) {
238 // find symmetrical response
239 const int logicSize = logic->getLogicSize();
240 bool foundProblem = false;
241 std::vector<int> tlIndex;
242 for (int u = 0; u < logicSize && !foundProblem; u++) {
243 const MSLogicJunction::LinkBits& response = logic->getResponseFor(u);
244 for (int v = 0; v < logicSize && !foundProblem; v++) {
245 if (response.test(v)) {
246 if (logic->getResponseFor(v).test(u)) {
247 // get tls link index for links u and v
248 if (tlIndex.size() == 0) {
249 // init tlindex for all links once
250 tlIndex.resize(logicSize, -1);
251 for (int j = 0; j < numLinks; ++j) {
252 for (int k = 0; k < (int)myLinks[j].size(); ++k) {
253 MSLink* link = myLinks[j][k];
254 if (link->getJunction() == junction) {
255 tlIndex[link->getIndex()] = link->getTLIndex();
256 }
257 }
258 }
259 }
260 const int tlu = tlIndex[u];
261 const int tlv = tlIndex[v];
262 if (tlu >= 0 && tlv >= 0) {
263 int phaseIndex = 0;
264 for (MSPhaseDefinition* p : phases) {
265 if (minor.find(p->getState()[tlu]) != std::string::npos
266 && minor.find(p->getState()[tlv]) != std::string::npos) {
267 WRITE_WARNING(TLF("Program '%' at tlLogic '%' is incompatible with logic at junction '%' (mutual conflict between link indices %,% tl indices %,% phase %).\n"
268 " To avoid deadlock/collisions, either: rebuild the signal plan with a newer version of netconvert/netedit\n"
269 " or rebuild the network with option '--tls.ignore-internal-junction-jam' or include the program when building.",
270 getProgramID(), getID(), junction->getID(), u, v, tlu, tlv, phaseIndex));
271 // only one warning per program
272 foundProblem = true;
273 break;
274 }
275 phaseIndex++;
276 }
277 }
278 }
279 }
280 }
281 }
282 }
283 }
284 }
285 myNumLinks = (int)myLinks.size();
286}
287
288
290 // no need to do something about mySwitchCommand here,
291 // it is handled by the event control
292}
293
294
295// ----------- Handling of controlled links
296void
298 // !!! should be done within the loader (checking necessary)
299 myLinks.reserve(pos + 1);
300 while ((int)myLinks.size() <= pos) {
301 myLinks.push_back(LinkVector());
302 }
303 myLinks[pos].push_back(link);
304 //
305 myLanes.reserve(pos + 1);
306 while ((int)myLanes.size() <= pos) {
307 myLanes.push_back(LaneVector());
308 }
309 myLanes[pos].push_back(lane);
310 link->setTLState((LinkState) getCurrentPhaseDef().getState()[pos], MSNet::getInstance()->getCurrentTimeStep());
311}
312
313
314void
320
321
322std::map<MSLink*, LinkState>
324 std::map<MSLink*, LinkState> ret;
325 for (LinkVectorVector::const_iterator i1 = myLinks.begin(); i1 != myLinks.end(); ++i1) {
326 const LinkVector& l = (*i1);
327 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
328 ret[*i2] = (*i2)->getState();
329 }
330 }
331 return ret;
332}
333
334
335bool
337 // get the current traffic light signal combination
338 const std::string& state = getCurrentPhaseDef().getState();
339 // go through the links
340 for (int i = 0; i < (int)myLinks.size(); i++) {
341 const LinkVector& currGroup = myLinks[i];
342 LinkState ls = (LinkState) state[i];
343 for (LinkVector::const_iterator j = currGroup.begin(); j != currGroup.end(); j++) {
344 (*j)->setTLState(ls, t);
345 }
346 }
347 return true;
348}
349
350
351void
352MSTrafficLightLogic::resetLinkStates(const std::map<MSLink*, LinkState>& vals) const {
353 for (LinkVectorVector::const_iterator i1 = myLinks.begin(); i1 != myLinks.end(); ++i1) {
354 const LinkVector& l = (*i1);
355 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
356 assert(vals.find(*i2) != vals.end());
357 (*i2)->setTLState(vals.find(*i2)->second, MSNet::getInstance()->getCurrentTimeStep());
358 }
359 }
360}
361
362
363// ----------- Static Information Retrieval
364int
366 int index = 0;
367 for (LinkVectorVector::const_iterator i1 = myLinks.begin(); i1 != myLinks.end(); ++i1, ++index) {
368 const LinkVector& l = (*i1);
369 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
370 if ((*i2) == link) {
371 return index;
372 }
373 }
374 }
375 return -1;
376}
377
378
379
380// ----------- Dynamic Information Retrieval
385
386
389 if (simStep == -1) {
390 simStep = SIMSTEP;
391 }
392 return simStep - getCurrentPhaseDef().myLastSwitch;
393}
394
395
396// ----------- Changing phases and phase durations
397void
401
402
403void
407
408
410 // set mesoscopic time penalties
411 const Phases& phases = getPhases();
412 const int numLinks = (int)myLinks.size();
413 // warning already given if not all states are used
414 assert(numLinks <= (int)phases.front()->getState().size());
415 SUMOTime duration = 0;
416 std::vector<double> firstRedDuration(numLinks, 0);
417 std::vector<double> redDuration(numLinks, 0);
418 std::vector<double> totalRedDuration(numLinks, 0);
419 std::vector<double> penalty(numLinks, 0);
420 for (int i = 0; i < (int)phases.size(); ++i) {
421 const std::string& state = phases[i]->getState();
422 duration += phases[i]->duration;
423 // warn about transitions from green to red without intermediate yellow
424 for (int j = 0; j < numLinks; ++j) {
425 double& red = redDuration[j];
426 if ((LinkState)state[j] == LINKSTATE_TL_RED
427 || (LinkState)state[j] == LINKSTATE_TL_REDYELLOW) {
428 red += STEPS2TIME(phases[i]->duration);
429 totalRedDuration[j] += STEPS2TIME(phases[i]->duration);
430 } else if (red > 0) {
431 if (firstRedDuration[j] == 0) {
432 // store for handling wrap-around
433 firstRedDuration[j] = red;
434 } else {
435 // vehicle may arive in any second or the red duration
436 // compute the sum over [0,red]
437 penalty[j] += 0.5 * (red * red + red);
438 }
439 red = 0;
440 }
441 }
442 }
443 // final phase and wrap-around to first phase
444 for (int j = 0; j < numLinks; ++j) {
445 double red = redDuration[j] + firstRedDuration[j];
446 if (red) {
447 penalty[j] += 0.5 * (red * red + red);
448 }
449 }
450 double tlsPenalty = MSGlobals::gTLSPenalty;
451 const double durationSeconds = STEPS2TIME(duration);
452 std::set<const MSJunction*> controlledJunctions;
453 for (int j = 0; j < numLinks; ++j) {
454 for (int k = 0; k < (int)myLinks[j].size(); ++k) {
455 MSLink* link = myLinks[j][k];
456 MSEdge& edge = link->getLaneBefore()->getEdge();
459 tlsPenalty = edgeType.tlsPenalty;
460 double greenFraction = (durationSeconds - totalRedDuration[j]) / durationSeconds;
461 if (edgeType.tlsFlowPenalty == 0) {
462 greenFraction = 1;
463 } else {
464 greenFraction = MAX2(MIN2(greenFraction / edgeType.tlsFlowPenalty, 1.0), 0.01);
465 }
466 if (greenFraction == 0.01) {
467 WRITE_WARNINGF(TL("Green fraction is only 1% for link % in tlLogic '%', program '%'."), "%", j, getID(), getProgramID());
468 }
469 link->setGreenFraction(greenFraction);
470 }
471 link->setMesoTLSPenalty(TIME2STEPS(tlsPenalty * penalty[j] / durationSeconds));
472 controlledJunctions.insert(link->getLane()->getEdge().getFromJunction()); // MSLink::myJunction is not yet initialized
473 //std::cout << " tls=" << getID() << " i=" << j << " link=" << link->getDescription() << " p=" << penalty[j] << " fr=" << firstRedDuration[j] << " r=" << redDuration[j] << " tr=" << totalRedDuration[j] << " durSecs=" << durationSeconds << " tlsPen=" << STEPS2TIME(link->getMesoTLSPenalty()) << " gF=" << myLinks[j][k]->getGreenFraction() << "\n";
474 }
475 }
476 // initialize empty-net travel times
477 // XXX refactor after merging sharps (links know their incoming edge)
478 for (std::set<const MSJunction*>::iterator it = controlledJunctions.begin(); it != controlledJunctions.end(); ++it) {
479 const ConstMSEdgeVector incoming = (*it)->getIncoming();
480 for (ConstMSEdgeVector::const_iterator it_e = incoming.begin(); it_e != incoming.end(); ++it_e) {
481 const_cast<MSEdge*>(*it_e)->recalcCache();
482 }
483 }
484
485}
486
487
488void
492
497
498
503
504
505bool
509
510
511void
513 myAmActive = true;
514 // updated the traffic light logic stored in the link
515 for (const LinkVector& currGroup : myLinks) {
516 for (MSLink* link : currGroup) {
517 link->setTLLogic(this);
518 }
519 }
520}
521
522
523void
527
528bool
530 if (linkIndex >= 0 && linkIndex < getNumLinks()) {
531 for (const MSPhaseDefinition* p : getPhases()) {
532 const std::string& s = p->getState();
533 assert(linkIndex < (int)s.size());
534 if (s[linkIndex] == LINKSTATE_TL_GREEN_MAJOR) {
535 return true;
536 }
537 }
538 }
539 return false;
540
541}
542
543
546 const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
547 return p.minDuration;
548}
549
552 const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
553 return p.maxDuration;
554}
555
558 const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
559 return p.earliestEnd;
560}
561
564 const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
565 return p.latestEnd;
566}
567
568
569void
570MSTrafficLightLogic::loadState(MSTLLogicControl& tlcontrol, SUMOTime t, int step, SUMOTime spentDuration) {
571 const SUMOTime remaining = getPhase(step).duration - spentDuration;
572 changeStepAndDuration(tlcontrol, t, step, remaining);
573 setTrafficLightSignals(t - spentDuration);
574}
575
576
579 SUMOTime result = 0;
580 for (const MSPhaseDefinition* p : phases) {
581 result += p->duration;
582 }
583 return result;
584}
585
586
587
588/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:296
#define WRITE_WARNING(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:315
#define TLF(string,...)
Definition MsgHandler.h:317
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SIMSTEP
Definition SUMOTime.h:61
#define TIME2STEPS(x)
Definition SUMOTime.h:57
@ SVC_PEDESTRIAN
pedestrian
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_TL_REDYELLOW
The link has red light (must brake) but indicates upcoming green.
@ LINKSTATE_STOP
This is an uncontrolled, minor link, has to stop.
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_TL_OFF_BLINKING
The link is controlled by a tls which is off and blinks, has to brake.
@ LINKSTATE_TL_RED
The link has red light (must brake)
@ LINKSTATE_TL_GREEN_MINOR
The link has green light, has to brake.
@ LINKSTATE_TL_OFF_NOSIGNAL
The link is controlled by a tls which is off, not blinking, may pass.
#define UNUSED_PARAMETER(x)
Definition StdDefs.h:30
T MIN3(T a, T b, T c)
Definition StdDefs.h:89
T MIN2(T a, T b)
Definition StdDefs.h:76
T MAX2(T a, T b)
Definition StdDefs.h:82
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
int priority
Definition Command.h:87
A road/street connecting two junctions.
Definition MSEdge.h:77
void recalcCache()
Recalculates the cached values.
Definition MSEdge.cpp:119
const MSJunction * getFromJunction() const
Definition MSEdge.h:414
const std::string & getEdgeType() const
Returns the type of the edge.
Definition MSEdge.h:319
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static bool gUseMesoSim
Definition MSGlobals.h:106
static double gTLSPenalty
scaled (minimum) time penalty for passing a tls link when routing
Definition MSGlobals.h:157
The base class for an intersection.
Definition MSJunction.h:58
virtual const MSLogicJunction::LinkBits & getResponseFor(int linkIndex) const
Returns the response for the given link.
int getLogicSize() const
Representation of a lane in the micro simulation.
Definition MSLane.h:84
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:764
std::bitset< SUMO_MAX_CONNECTIONS > LinkBits
Container for link response and foes.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:186
virtual bool isSelected(const MSTrafficLightLogic *) const
return wheter the given logic (or rather its wrapper) is selected in the GUI
Definition MSNet.h:592
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition MSNet.h:471
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:320
const MESegment::MesoEdgeType & getMesoType(const std::string &typeID)
Returns edge type specific meso parameters if no type specific parameters have been loaded,...
Definition MSNet.cpp:367
bool hasInternalLinks() const
return whether the network contains internal links
Definition MSNet.h:780
The definition of a single phase of a tls logic.
SUMOTime maxDuration
The maximum duration of the phase.
SUMOTime latestEnd
The maximum time within the cycle for switching (for coordinated actuation)
SUMOTime minDuration
The minimum duration of the phase.
SUMOTime myLastSwitch
Stores the timestep of the last on-switched of the phase.
const std::string & getState() const
Returns the state within this phase.
SUMOTime duration
The duration of the phase.
SUMOTime earliestEnd
The minimum time within the cycle for switching (for coordinated actuation)
Storage for all programs of a single tls.
A class that stores and controls tls and switching of their programs.
Class realising the switch between the traffic light phases.
void deschedule(MSTrafficLightLogic *tlLogic)
Marks this swicth as invalid (if the phase duration has changed, f.e.)
SUMOTime shiftTime(SUMOTime currentTime, SUMOTime execTime, SUMOTime newTime)
Reschedule or deschedule the command when quick-loading state.
SwitchCommand(MSTLLogicControl &tlcontrol, MSTrafficLightLogic *tlLogic, SUMOTime nextSwitch)
Constructor.
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
SUMOTime execute(SUMOTime currentTime)
Executes the regarded junction's "trySwitch"- method.
The parent class for traffic light logics.
virtual void adaptLinkInformationFrom(const MSTrafficLightLogic &logic)
Applies information about controlled links and lanes from the given logic.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
SUMOTime myOffset
the offset parameter of the current program
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link.
virtual SUMOTime mapTimeInCycle(SUMOTime t) const
map the given time into the current cycle
void setCurrentDurationIncrement(SUMOTime delay)
Delays current phase by the given delay.
SUMOTime computeCycleTime(const Phases &phases)
std::map< MSLink *, LinkState > collectLinkStates() const
Returns the (uncontrolled) states of the controlled links.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
virtual ~MSTrafficLightLogic()
Destructor.
virtual SUMOTime getLatestEnd(int step=-1) const
MSTrafficLightLogic(MSTLLogicControl &tlcontrol, const std::string &id, const std::string &programID, const SUMOTime offset, const TrafficLightType logicType, const SUMOTime delay, const Parameterised::Map &parameters)
Constructor.
std::vector< SUMOTime > myOverridingTimes
A list of duration overrides.
virtual SUMOTime getMinDur(int step=-1) const
void ignoreLinkIndex(int pos)
ignore pedestrian crossing index in mesosim
virtual void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration)=0
Changes the current phase and her duration.
static const LaneVector myEmptyLaneVector
An empty lane vector.
const TrafficLightType myLogicType
The type of the logic.
bool isSelected() const
whether this logic is selected in the GUI
virtual const MSPhaseDefinition & getPhase(int givenstep) const =0
Returns the definition of the phase from the given position within the plan.
SUMOTime myDefaultCycleTime
The cycle time (without changes)
SUMOTime getTimeInCycle() const
return time within the current cycle
const std::string & getProgramID() const
Returns this tl-logic's id.
const std::string myProgramID
The id of the logic.
TrafficLightType getLogicType() const
Returns the type of the logic.
virtual SUMOTime getEarliestEnd(int step=-1) const
LaneVectorVector myLanes
The list of LaneVectors; each vector contains the incoming lanes that belong to the same link index.
SwitchCommand * mySwitchCommand
The current switch command.
int myNumLinks
number of controlled links
int getNumLinks() const
return the number of controlled link indices
virtual const Phases & getPhases() const =0
Returns the phases of this tls program.
SUMOTime myCurrentDurationIncrement
A value for enlarge the current duration.
virtual SUMOTime getMaxDur(int step=-1) const
virtual bool getsMajorGreen(int linkIndex) const
whether the given link index ever turns 'G'
void resetLinkStates(const std::map< MSLink *, LinkState > &vals) const
Resets the states of controlled links.
virtual void loadState(MSTLLogicControl &tlcontrol, SUMOTime t, int step, SUMOTime spentDuration)
restores the tls state
virtual void activateProgram()
called when switching programs
void addOverridingDuration(SUMOTime duration)
Changes the duration of the next phase.
bool myAmActive
whether the current program is active
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
std::set< int > myIgnoredIndices
list of indices that are ignored in mesoscopic simulatino
SUMOTime getSpentDuration(SUMOTime simStep=-1) const
Returns the duration spent in the current phase.
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
virtual void addLink(MSLink *link, MSLane *lane, int pos)
Adds a link on building.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
std::vector< MSLink * > LinkVector
Definition of the list of links that are subjected to this tls.
LinkVectorVector myLinks
The list of LinkVectors; each vector contains the links that belong to the same link index.
void initMesoTLSPenalties()
initialize optional meso penalties
virtual void init(NLDetectorBuilder &nb)
Initialises the tls with information about incoming lanes.
Builds detectors for microsim.
Base class for objects which have an id.
Definition Named.h:54
const std::string & getID() const
Returns the id.
Definition Named.h:74
An upper class for objects with additional parameters.
std::map< std::string, std::string > Map
parameters map
static const std::string ALLOWED_TLS_LINKSTATES
all allowed characters for phase state
edge type specific meso parameters
Definition MESegment.h:55