Eclipse SUMO - Simulation of Urban MObility
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 
93 void
95  if (tlLogic == myTLLogic) {
96  myAmValid = false;
97  myAssumedNextSwitch = -1;
98  }
99 }
100 
101 
102 SUMOTime
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 
133 void
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
296 void
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 
314 void
316  myLinks = logic.myLinks;
317  myLanes = logic.myLanes;
319 }
320 
321 
322 std::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 
335 bool
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 
351 void
352 MSTrafficLightLogic::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
364 int
365 MSTrafficLightLogic::getLinkIndex(const MSLink* const link) const {
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
381 SUMOTime
383  return mySwitchCommand != nullptr ? mySwitchCommand->getNextSwitchTime() : -1;
384 }
385 
386 
387 SUMOTime
389  if (simStep == -1) {
390  simStep = SIMSTEP;
391  }
392  return simStep - getCurrentPhaseDef().myLastSwitch;
393 }
394 
395 
396 // ----------- Changing phases and phase durations
397 void
399  myOverridingTimes.push_back(duration);
400 }
401 
402 
403 void
406 }
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 
488 void
490  myIgnoredIndices.insert(pos);
491 }
492 
493 SUMOTime
495  return mapTimeInCycle(SIMSTEP);
496 }
497 
498 
499 SUMOTime
501  return (t - myOffset) % myDefaultCycleTime;
502 }
503 
504 
505 bool
507  return MSNet::getInstance()->isSelected(this);
508 }
509 
510 
511 void
513  myAmActive = true;
514 }
515 
516 
517 void
519  myAmActive = false;
520 }
521 
522 bool
524  if (linkIndex >= 0 && linkIndex < getNumLinks()) {
525  for (const MSPhaseDefinition* p : getPhases()) {
526  const std::string& s = p->getState();
527  assert(linkIndex < (int)s.size());
528  if (s[linkIndex] == LINKSTATE_TL_GREEN_MAJOR) {
529  return true;
530  }
531  }
532  }
533  return false;
534 
535 }
536 
537 
538 SUMOTime
540  const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
541  return p.minDuration;
542 }
543 
544 SUMOTime
546  const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
547  return p.maxDuration;
548 }
549 
550 SUMOTime
552  const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
553  return p.earliestEnd;
554 }
555 
556 SUMOTime
558  const MSPhaseDefinition& p = step < 0 ? getCurrentPhaseDef() : getPhase(step);
559  return p.latestEnd;
560 }
561 
562 
563 void
564 MSTrafficLightLogic::loadState(MSTLLogicControl& tlcontrol, SUMOTime t, int step, SUMOTime spentDuration) {
565  const SUMOTime remaining = getPhase(step).duration - spentDuration;
566  changeStepAndDuration(tlcontrol, t, step, remaining);
567  setTrafficLightSignals(t - spentDuration);
568 }
569 
570 
571 SUMOTime
573  SUMOTime result = 0;
574  for (const MSPhaseDefinition* p : phases) {
575  result += p->duration;
576  }
577  return result;
578 }
579 
580 
581 
582 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
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
TrafficLightType
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:411
const std::string & getEdgeType() const
Returns the type of the edge.
Definition: MSEdge.h:316
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static bool gUseMesoSim
Definition: MSGlobals.h:103
static double gTLSPenalty
scaled (minimum) time penalty for passing a tls link when routing
Definition: MSGlobals.h:154
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:756
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:182
virtual bool isSelected(const MSTrafficLightLogic *) const
return wheter the given logic (or rather its wrapper) is selected in the GUI
Definition: MSNet.h:586
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition: MSNet.h:471
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:365
bool hasInternalLinks() const
return whether the network contains internal links
Definition: MSNet.h:774
The definition of a single phase of a tls logic.
const std::string & getState() const
Returns the state within this phase.
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.
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 const MSPhaseDefinition & getPhase(int givenstep) const =0
Returns the definition of the phase from the given position within the plan.
virtual SUMOTime getLatestEnd(int step=-1) const
virtual void deactivateProgram()
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
SUMOTime myDefaultCycleTime
The cycle time (without changes)
SUMOTime getTimeInCycle() const
return time within the current cycle
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
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 const Phases & getPhases() const =0
Returns the phases of this tls program.
virtual void init(NLDetectorBuilder &nb)
Initialises the tls with information about incoming lanes.
const std::string & getProgramID() const
Returns this tl-logic's id.
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.
Definition: Parameterised.h:41
std::map< std::string, std::string > Map
parameters map
Definition: Parameterised.h:45
static const std::string ALLOWED_TLS_LINKSTATES
all allowed characters for phase state
edge type specific meso parameters
Definition: MESegment.h:55