SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MSTrafficLightLogic.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // The parent class for traffic light logics
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
12 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <cassert>
34 #include <string>
35 #include <iostream>
36 #include <map>
37 #include <microsim/MSLink.h>
38 #include <microsim/MSLane.h>
39 #include "MSTrafficLightLogic.h"
41 #include "MSTLLogicControl.h"
43 
44 #ifdef CHECK_MEMORY_LEAKS
45 #include <foreign/nvwa/debug_new.h>
46 #endif // CHECK_MEMORY_LEAKS
47 
48 
49 // ===========================================================================
50 // member method definitions
51 // ===========================================================================
52 /* -------------------------------------------------------------------------
53  * member method definitions
54  * ----------------------------------------------------------------------- */
56  MSTrafficLightLogic* tlLogic, SUMOTime nextSwitch)
57  : myTLControl(tlcontrol), myTLLogic(tlLogic),
58  myAssumedNextSwitch(nextSwitch), myAmValid(true) {}
59 
60 
62 
63 
64 
67  // check whether this command has been descheduled
68  if (!myAmValid) {
69  return 0;
70  }
71  //
72  bool isActive = myTLControl.isActive(myTLLogic);
73  size_t step1 = myTLLogic->getCurrentPhaseIndex();
74  SUMOTime next = myTLLogic->trySwitch(isActive);
75  size_t step2 = myTLLogic->getCurrentPhaseIndex();
76  if (step1 != step2) {
77  if (isActive) {
78  // execute any action connected to this tls
79  const MSTLLogicControl::TLSLogicVariants& vars = myTLControl.get(myTLLogic->getID());
80  // set link priorities
81  myTLLogic->setTrafficLightSignals(t);
82  // execute switch actions
84  }
85  }
86  myAssumedNextSwitch += next;
87  return next;
88 }
89 
90 
91 void
93  if (tlLogic == myTLLogic) {
94  myAmValid = false;
95  myAssumedNextSwitch = -1;
96  }
97 }
98 
99 
100 /* -------------------------------------------------------------------------
101  * member method definitions
102  * ----------------------------------------------------------------------- */
104  const std::string& programID, SUMOTime delay, const std::map<std::string, std::string>& parameters) :
105  Named(id), Parameterised(parameters),
106  myProgramID(programID),
108  myDefaultCycleTime(0) {
109  mySwitchCommand = new SwitchCommand(tlcontrol, this, delay);
112 }
113 
114 
115 void
117 }
118 
119 
121  // no need to do something about mySwitchCommand here,
122  // it is handled by the event control
123 }
124 
125 
126 // ----------- Handling of controlled links
127 void
128 MSTrafficLightLogic::addLink(MSLink* link, MSLane* lane, unsigned int pos) {
129  // !!! should be done within the loader (checking necessary)
130  myLinks.reserve(pos + 1);
131  while (myLinks.size() <= pos) {
132  myLinks.push_back(LinkVector());
133  }
134  myLinks[pos].push_back(link);
135  //
136  myLanes.reserve(pos + 1);
137  while (myLanes.size() <= pos) {
138  myLanes.push_back(LaneVector());
139  }
140  myLanes[pos].push_back(lane);
141  link->setTLState((LinkState) getCurrentPhaseDef().getState()[pos], MSNet::getInstance()->getCurrentTimeStep());
142 }
143 
144 
145 void
147  myLinks = logic.myLinks;
148  myLanes = logic.myLanes;
149 }
150 
151 
152 std::map<MSLink*, LinkState>
154  std::map<MSLink*, LinkState> ret;
155  for (LinkVectorVector::const_iterator i1 = myLinks.begin(); i1 != myLinks.end(); ++i1) {
156  const LinkVector& l = (*i1);
157  for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
158  ret[*i2] = (*i2)->getState();
159  }
160  }
161  return ret;
162 }
163 
164 
165 bool
167  // get the current traffic light signal combination
168  const std::string& state = getCurrentPhaseDef().getState();
169  // go through the links
170  for (size_t i = 0; i < myLinks.size(); i++) {
171  const LinkVector& currGroup = myLinks[i];
172  LinkState ls = (LinkState) state[i];
173  for (LinkVector::const_iterator j = currGroup.begin(); j != currGroup.end(); j++) {
174  (*j)->setTLState(ls, t);
175  }
176  }
177  return true;
178 }
179 
180 
181 void
182 MSTrafficLightLogic::resetLinkStates(const std::map<MSLink*, LinkState>& vals) const {
183  for (LinkVectorVector::const_iterator i1 = myLinks.begin(); i1 != myLinks.end(); ++i1) {
184  const LinkVector& l = (*i1);
185  for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
186  assert(vals.find(*i2) != vals.end());
187  (*i2)->setTLState(vals.find(*i2)->second, MSNet::getInstance()->getCurrentTimeStep());
188  }
189  }
190 }
191 
192 
193 // ----------- Static Information Retrieval
194 int
195 MSTrafficLightLogic::getLinkIndex(const MSLink* const link) const {
196  int index = 0;
197  for (LinkVectorVector::const_iterator i1 = myLinks.begin(); i1 != myLinks.end(); ++i1, ++index) {
198  const LinkVector& l = (*i1);
199  for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
200  if ((*i2) == link) {
201  return index;
202  }
203  }
204  }
205  return -1;
206 }
207 
208 
209 
210 // ----------- Dynamic Information Retrieval
211 SUMOTime
213  return mySwitchCommand != 0 ? mySwitchCommand->getNextSwitchTime() : -1;
214 }
215 
216 
217 // ----------- Changing phases and phase durations
218 void
220  myOverridingTimes.push_back(duration);
221 }
222 
223 
224 void
227 }
228 
229 
230 /****************************************************************************/
231 
SUMOTime myCurrentDurationIncrement
A value for enlarge the current duration.
void resetLinkStates(const std::map< MSLink *, LinkState > &vals) const
Resets the states of controlled links.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
Builds detectors for microsim.
const std::string & getState() const
Returns the state within this phase.
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
Storage for all programs of a single tls.
std::vector< SUMOTime > myOverridingTimes
A list of duration overrides.
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link.
SwitchCommand(MSTLLogicControl &tlcontrol, MSTrafficLightLogic *tlLogic, SUMOTime nextSwitch)
Constructor.
std::string myProgramID
The id of the logic.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:150
MSTrafficLightLogic(MSTLLogicControl &tlcontrol, const std::string &id, const std::string &programID, SUMOTime delay, const std::map< std::string, std::string > &parameters)
Constructor.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step (in s)
Definition: MSNet.cpp:500
LaneVectorVector myLanes
The list of links which do participate in this traffic light.
virtual ~MSTrafficLightLogic()
Destructor.
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
A class that stores and controls tls and switching of their programs.
void deschedule(MSTrafficLightLogic *tlLogic)
Marks this swicth as invalid (if the phase duration has changed, f.e.)
Class realising the switch between the traffic light phases.
SUMOTime myDefaultCycleTime
The cycle time (without changes)
virtual void init(NLDetectorBuilder &nb)
Initialises the tls with information about incoming lanes.
virtual void adaptLinkInformationFrom(const MSTrafficLightLogic &logic)
Applies information about controlled links and lanes from the given logic.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
An upper class for objects with additional parameters.
Definition: Parameterised.h:46
virtual SUMOTime addEvent(Command *operation, SUMOTime execTimeStep, AdaptType type)
Adds an Event.
void setCurrentDurationIncrement(SUMOTime delay)
Delays current phase by the given delay.
Base class for objects which have an id.
Definition: Named.h:45
std::vector< MSLink * > LinkVector
Definition of the list of links that participate in this tl-light.
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
void addOverridingDuration(SUMOTime duration)
Changes the duration of the next phase.
LinkVectorVector myLinks
The list of links which do participate in this traffic light.
std::vector< MSLane * > LaneVector
Definition of the list of links that participate in this tl-light.
int SUMOTime
Definition: SUMOTime.h:43
SwitchCommand * mySwitchCommand
The current switch command.
The parent class for traffic light logics.
void addLink(MSLink *link, MSLane *lane, unsigned int pos)
Adds a link on building.
MSEventControl & getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition: MSNet.h:319
Representation of a lane in the micro simulation.
Definition: MSLane.h:73
std::map< MSLink *, LinkState > collectLinkStates() const
Returns the (uncontrolled) states of the controlled links.
SUMOTime execute(SUMOTime currentTime)
Executes the regarded junction&#39;s &quot;trySwitch&quot;- method.