Eclipse SUMO - Simulation of Urban MObility
MSTLLogicControl.h
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 /****************************************************************************/
22 // A class that stores and controls tls and switching of their programs
23 /****************************************************************************/
24 #pragma once
25 #include <config.h>
26 
27 #include <vector>
28 #include <map>
29 #include <utils/common/Command.h>
30 #include <utils/common/StdDefs.h>
32 
33 
34 // ===========================================================================
35 // class declarations
36 // ===========================================================================
38 class MSLink;
39 class MSLane;
40 class MSPhaseDefinition;
41 class OutputDevice;
42 
43 
44 // ===========================================================================
45 // class definitions
46 // ===========================================================================
60 public:
66  public:
68  virtual ~OnSwitchAction() {};
69 
70 
73  virtual void execute() = 0;
74 
75  };
76 
77 
78 
86  public:
89 
92 
99  bool checkOriginalTLS() const;
100 
108  bool addLogic(const std::string& programID, MSTrafficLightLogic* logic, bool netWasLoaded,
109  bool isNewDefault = true);
110 
111  MSTrafficLightLogic* getLogic(const std::string& programID) const;
113  std::vector<MSTrafficLightLogic*> getAllLogics() const;
114  void saveInitialStates();
115  void saveState(OutputDevice& out);
116  bool isActive(const MSTrafficLightLogic* tl) const;
118 
121 
122  void switchTo(MSTLLogicControl& tlc, const std::string& programID);
123 
124  /* @brief get logic by programID. For the special case "off"
125  * instantiate an MSOffTrafficLightLogic */
127  const std::string& programID);
128 
129  /* @brief sets the state to the given string get for the special program "online"
130  * this program is instantiated only once */
132  const std::string& state);
133 
134 
135  void executeOnSwitchActions() const;
136  void addLink(MSLink* link, MSLane* lane, int pos);
137  void ignoreLinkIndex(int pos);
138 
139  private:
142 
145 
147  std::map<std::string, MSTrafficLightLogic*> myVariants;
148 
150  std::map<MSLink*, LinkState> myOriginalLinkStates;
151 
153  std::vector<OnSwitchAction*> mySwitchActions;
154 
155  private:
158 
161 
162 
163  };
164 
165 
168 
171 
189  bool closeNetworkReading();
190 
197  void setTrafficLightSignals(SUMOTime t) const;
198 
204  std::vector<MSTrafficLightLogic*> getAllLogics() const;
205 
212  TLSLogicVariants& get(const std::string& id) const;
213 
220  MSTrafficLightLogic* get(const std::string& id, const std::string& programID) const;
221 
227  MSTrafficLightLogic* getActive(const std::string& id) const;
228 
234  std::vector<std::string> getAllTLIds() const;
235 
257  bool add(const std::string& id, const std::string& programID,
258  MSTrafficLightLogic* logic, bool newDefault = true);
259 
264  bool knows(const std::string& id) const;
265 
270  bool isActive(const MSTrafficLightLogic* tl) const;
271 
280  void switchTo(const std::string& id, const std::string& programID);
281 
284 
294  void addWAUT(SUMOTime refTime, const std::string& id,
295  const std::string& startProg, SUMOTime period);
296 
297 
306  void addWAUTSwitch(const std::string& wautid, SUMOTime when,
307  const std::string& to);
308 
309 
321  void addWAUTJunction(const std::string& wautid, const std::string& tls,
322  const std::string& proc, bool synchron);
323 
324 
335  void closeWAUT(const std::string& wautid);
337 
338 
339 
344  void check2Switch(SUMOTime step);
345 
346 
354  std::pair<SUMOTime, MSPhaseDefinition> getPhaseDef(const std::string& tlid) const;
355 
357  void switchOffAll();
358 
361  void saveState(OutputDevice& out);
362 
364  void clearState(SUMOTime time, bool quickReload = false);
365 
366 
367 
368 protected:
376  class SwitchInitCommand : public Command {
377  public:
383  SwitchInitCommand(MSTLLogicControl& p, const std::string& wautid, int index)
384  : myParent(p), myWAUTID(wautid), myIndex(index) { }
385 
386 
389 
390 
391 
394 
410  return myParent.initWautSwitch(*this);
411  }
413 
414 
415 
419  const std::string& getWAUTID() const {
420  return myWAUTID;
421  }
422 
423 
427  int& getIndex() {
428  return myIndex;
429  }
430 
431 
432  protected:
435 
437  std::string myWAUTID;
438 
440  int myIndex;
441 
442 
443  private:
446 
449 
450  };
451 
452 
453 
454 public:
462 
463 
464 protected:
468  struct WAUTSwitch {
472  std::string to;
473  };
474 
475 
479  struct WAUTJunction {
481  std::string junction;
483  std::string procedure;
485  bool synchron;
486  };
487 
488 
492  struct WAUT {
494  std::string id;
496  std::string startProg;
502  std::vector<WAUTSwitch> switches;
504  std::vector<WAUTJunction> junctions;
505  };
506 
507 
512  public:
522  bool synchron)
523  : myFrom(from), myTo(to), mySwitchSynchron(synchron), myWAUT(waut), myControl(control) { }
524 
525 
527  virtual ~WAUTSwitchProcedure() { }
528 
529 
534  virtual bool trySwitch(SUMOTime step);
535 
536 
537  protected:
548  bool isPosAtGSP(SUMOTime currentTime, const MSTrafficLightLogic& logic);
549 
556 
562  void switchToPos(SUMOTime simStep, MSTrafficLightLogic& logic, SUMOTime toTime);
563 
571  SUMOTime getGSPTime(const MSTrafficLightLogic& logic) const;
572 
578  virtual void adaptLogic(SUMOTime step) {
579  UNUSED_PARAMETER(step);
580  }
581 
582  protected:
585 
588 
591 
594 
597 
598 
599  private:
602 
605 
606  };
607 
608 
614  public:
624  bool synchron);
625 
628 
633  bool trySwitch(SUMOTime step);
634 
635  };
636 
637 
638 
644  public:
654  bool synchron);
655 
658 
659  protected:
662  void adaptLogic(SUMOTime step);
663 
664  };
665 
666 
672  public:
682  bool synchron);
683 
686 
687  protected:
693  void adaptLogic(SUMOTime step);
694 
700  void stretchLogic(SUMOTime step, SUMOTime startPos, SUMOTime allStretchTime);
701 
707  void cutLogic(SUMOTime step, SUMOTime startPos, SUMOTime allCutTime);
708 
709  protected:
713  struct StretchRange {
719  double fac;
720  };
721 
722  protected:
724  std::vector<StretchRange> myStretchRanges;
725  };
726 
727 
734  std::string junction;
741  };
742 
743 
745  std::map<std::string, WAUT*> myWAUTs;
746 
748  std::vector<WAUTSwitchProcess> myCurrentlySwitched;
749 
751  std::map<std::string, TLSLogicVariants*> myLogics;
752 
755 
756 
757 private:
760 
763 
764 };
long long int SUMOTime
Definition: GUI.h:35
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:30
Base (microsim) event class.
Definition: Command.h:50
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
The definition of a single phase of a tls logic.
Base class for things to execute if a tls switches to a new phase.
virtual void execute()=0
Executes the action.
virtual ~OnSwitchAction()
Destructor.
This event-class is used to initialise a WAUT switch at a certain time.
const std::string & getWAUTID() const
Returns the WAUT-id.
MSTLLogicControl & myParent
The control to call.
int & getIndex()
Returns a reference to the index.
int myIndex
The current index within the WAUT switch table.
SwitchInitCommand & operator=(const SwitchInitCommand &)
Invalidated assignment operator.
SwitchInitCommand(MSTLLogicControl &p, const std::string &wautid, int index)
Constructor.
SwitchInitCommand(const SwitchInitCommand &)
Invalidated copy constructor.
SUMOTime execute(SUMOTime)
Begins a WAUT switch by executing the command.
std::string myWAUTID
The id of the WAUT that shall switch.
Storage for all programs of a single tls.
void addLink(MSLink *link, MSLane *lane, int pos)
void switchTo(MSTLLogicControl &tlc, const std::string &programID)
void addSwitchCommand(OnSwitchAction *c)
void setStateInstantiatingOnline(MSTLLogicControl &tlc, const std::string &state)
bool checkOriginalTLS() const
Verifies traffic lights loaded from the network.
std::vector< OnSwitchAction * > mySwitchActions
The list of actions/commands to execute on switch.
std::map< MSLink *, LinkState > myOriginalLinkStates
Originally loaded link states.
TLSLogicVariants(const TLSLogicVariants &)
Invalidated copy constructor.
std::vector< MSTrafficLightLogic * > getAllLogics() const
MSTrafficLightLogic * getLogic(const std::string &programID) const
std::map< std::string, MSTrafficLightLogic * > myVariants
A map of subkeys to programs.
MSTrafficLightLogic * myDefaultProgram
The program that would be used in the absence of TraCI.
bool addLogic(const std::string &programID, MSTrafficLightLogic *logic, bool netWasLoaded, bool isNewDefault=true)
Adds a logic (program). In case of an error the logic gets deleted.
MSTrafficLightLogic * myCurrentProgram
The currently used program.
TLSLogicVariants & operator=(const TLSLogicVariants &)
Invalidated assignment operator.
MSTrafficLightLogic * getActive() const
MSTrafficLightLogic * getDefault() const
return the default program (that last used program except TRACI_PROGRAM)
MSTrafficLightLogic * getLogicInstantiatingOff(MSTLLogicControl &tlc, const std::string &programID)
bool isActive(const MSTrafficLightLogic *tl) const
This class switches using the GSP algorithm.
WAUTSwitchProcedure_GSP(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
void adaptLogic(SUMOTime step)
Stretches the destination program's phase to which the tls was switched.
This class simply switches to the next program.
bool trySwitch(SUMOTime step)
Determines whether a switch is possible.
WAUTSwitchProcedure_JustSwitch(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
This class switches using the Stretch algorithm.
void adaptLogic(SUMOTime step)
Determines the destination program's changes and applies them.
std::vector< StretchRange > myStretchRanges
the given Stretch-areas for the "to" program, this is 0-based indexed, while the input is 1-based
WAUTSwitchProcedure_Stretch(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
void cutLogic(SUMOTime step, SUMOTime startPos, SUMOTime allCutTime)
Cuts the logic to synchronize.
void stretchLogic(SUMOTime step, SUMOTime startPos, SUMOTime allStretchTime)
Stretches the logic to synchronize.
This is the abstract base class for switching from one tls program to another.
WAUTSwitchProcedure & operator=(const WAUTSwitchProcedure &)
Invalidated assignment operator.
virtual bool trySwitch(SUMOTime step)
Determines whether a switch is possible.
MSTrafficLightLogic * myTo
The program to switch the tls to.
WAUTSwitchProcedure(const WAUTSwitchProcedure &)
Invalidated copy constructor.
bool isPosAtGSP(SUMOTime currentTime, const MSTrafficLightLogic &logic)
Checks, whether the position of a signal programm is at the GSP ("Good Switching Point")
bool mySwitchSynchron
Information whether to switch synchron (?)
WAUTSwitchProcedure(MSTLLogicControl &control, WAUT &waut, MSTrafficLightLogic *from, MSTrafficLightLogic *to, bool synchron)
Constructor.
MSTLLogicControl & myControl
The control the logic belongs to.
MSTrafficLightLogic * myFrom
The current program of the tls to switch.
SUMOTime getGSPTime(const MSTrafficLightLogic &logic) const
Returns the GSP-value.
SUMOTime getDiffToStartOfPhase(MSTrafficLightLogic &logic, SUMOTime toTime)
Returns the difference between a given time and the start of the phase.
virtual void adaptLogic(SUMOTime step)
Changes the destination program's phase to which the tls was switched.
void switchToPos(SUMOTime simStep, MSTrafficLightLogic &logic, SUMOTime toTime)
switches the given logic directly to the given position
WAUT & myWAUT
The WAUT responsible for switching.
A class that stores and controls tls and switching of their programs.
void addWAUTJunction(const std::string &wautid, const std::string &tls, const std::string &proc, bool synchron)
Adds a tls to the list of tls to be switched by the named WAUT.
void clearState(SUMOTime time, bool quickReload=false)
Clear all tls states before quick-loading state.
std::vector< MSTrafficLightLogic * > getAllLogics() const
Returns a vector which contains all logics.
std::vector< WAUTSwitchProcess > myCurrentlySwitched
A list of currently running switching procedures.
std::pair< SUMOTime, MSPhaseDefinition > getPhaseDef(const std::string &tlid) const
return the complete phase definition for a named traffic lights logic
std::map< std::string, TLSLogicVariants * > myLogics
A map from ids to the corresponding variants.
void addWAUT(SUMOTime refTime, const std::string &id, const std::string &startProg, SUMOTime period)
Adds a WAUT definition.
std::vector< std::string > getAllTLIds() const
void switchTo(const std::string &id, const std::string &programID)
Switches the named (id) tls to the named (programID) program.
MSTrafficLightLogic * getActive(const std::string &id) const
Returns the active program of a named tls.
bool closeNetworkReading()
Lets MSTLLogicControl know that the network has been loaded.
MSTLLogicControl & operator=(const MSTLLogicControl &)
Invalidated assignment operator.
void setTrafficLightSignals(SUMOTime t) const
Lets all running (current) tls programs apply their current signal states to links they control.
bool knows(const std::string &id) const
Returns the information whether the named tls is stored.
MSTLLogicControl(const MSTLLogicControl &)
Invalidated copy constructor.
void saveState(OutputDevice &out)
Saves the current tls states into the given stream.
bool myNetWasLoaded
Information whether the net was completely loaded.
void switchOffAll()
switch all logic variants to 'off'
void addWAUTSwitch(const std::string &wautid, SUMOTime when, const std::string &to)
Adds a WAUT switch step to a previously built WAUT.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
MSTLLogicControl()
Constructor.
SUMOTime initWautSwitch(SwitchInitCommand &cmd)
Initialises switching a WAUT.
~MSTLLogicControl()
Destructor.
void check2Switch(SUMOTime step)
Checks whether any WAUT is trying to switch a tls into another program.
std::map< std::string, WAUT * > myWAUTs
A map of ids to corresponding WAUTs.
bool isActive(const MSTrafficLightLogic *tl) const
Returns whether the given tls program is the currently active for his tls.
bool add(const std::string &id, const std::string &programID, MSTrafficLightLogic *logic, bool newDefault=true)
Adds a tls program to the container.
void closeWAUT(const std::string &wautid)
Closes loading of a WAUT.
The parent class for traffic light logics.
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
A WAUT definition.
std::string startProg
The name of the start program.
std::vector< WAUTSwitch > switches
The list of switches to be done by the WAUT.
std::vector< WAUTJunction > junctions
The list of switches assigned to the WAUT.
SUMOTime period
The period with which to repeat switches.
std::string id
The id of the WAUT.
SUMOTime refTime
The reference time (offset to the switch times)
Storage for a junction assigned to a WAUT.
std::string procedure
The procedure to switch the junction with.
bool synchron
Information whether this junction shall be switched synchron.
std::string junction
The junction name.
Storage for a WAUTs switch point.
SUMOTime when
The time the WAUT shall switch the TLS.
std::string to
The program name the WAUT shall switch the TLS to.
double fac
The weight factor of a stretch/cut area.
An initialised switch process.
MSTrafficLightLogic * to
The program to switch the tls to.
std::string junction
The id of the junction to switch.
MSTrafficLightLogic * from
The current program of the tls.
WAUTSwitchProcedure * proc
The used procedure.