Eclipse SUMO - Simulation of Urban MObility
GUITrafficLightLogicWrapper.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 /****************************************************************************/
21 // A wrapper for tl-logics to allow their visualisation and interaction
22 /****************************************************************************/
23 #include <config.h>
24 
25 #include <cassert>
27 #include <utils/geom/GeomHelper.h>
32 #include <utils/gui/div/GLHelper.h>
36 #include <microsim/MSLane.h>
48 #include <gui/GUIGlobals.h>
51 
53 #include "GUINet.h"
54 
55 // ===========================================================================
56 // FOX callback mapping
57 // ===========================================================================
65 };
66 
67 // Object implementation
69 
70 
71 // ===========================================================================
72 // method definitions
73 // ===========================================================================
74 /* -------------------------------------------------------------------------
75  * GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu - methods
76  * ----------------------------------------------------------------------- */
78  GUIMainWindow& app, GUISUMOAbstractView& parent,
79  GUIGlObject& o)
80  : GUIGLObjectPopupMenu(app, parent, o) {}
81 
82 
84 
85 
86 
87 long
89  FXObject*, FXSelector, void*) {
90  assert(myObject->getType() == GLO_TLLOGIC);
91  static_cast<GUITrafficLightLogicWrapper*>(myObject)->begin2TrackPhases();
92  return 1;
93 }
94 
95 
96 long
98  FXObject*, FXSelector, void*) {
99  assert(myObject->getType() == GLO_TLLOGIC);
100  static_cast<GUITrafficLightLogicWrapper*>(myObject)->showPhases();
101  return 1;
102 }
103 
104 long
106  FXObject*, FXSelector, void*) {
107  assert(myObject->getType() == GLO_TLLOGIC);
108  GUITrafficLightLogicWrapper* w = static_cast<GUITrafficLightLogicWrapper*>(myObject);
110  if (act != nullptr) {
111  act->setShowDetectors(!act->showDetectors());
112  } else {
114  if (db != nullptr) {
115  db->setShowDetectors(!db->showDetectors());
116  } else {
117  NEMALogic* nema = dynamic_cast<NEMALogic*>(&w->getTLLogic());
118  if (nema != nullptr) {
119  nema->setShowDetectors(!nema->showDetectors());
120  }
121  }
122  }
123  myParent->update();
124  return 1;
125 }
126 
127 long
129  FXObject*, FXSelector /*sel*/, void*) {
130  assert(myObject->getType() == GLO_TLLOGIC);
131  static_cast<GUITrafficLightLogicWrapper*>(myObject)->switchTLSLogic(-1);
132  myParent->update();
133  return 1;
134 }
135 
136 
137 long
139  FXObject*, FXSelector sel, void*) {
140  assert(myObject->getType() == GLO_TLLOGIC);
141  static_cast<GUITrafficLightLogicWrapper*>(myObject)->switchTLSLogic(FXSELID(sel) - MID_SWITCH);
142  myParent->update();
143  return 1;
144 }
145 
146 
147 
148 /* -------------------------------------------------------------------------
149  * GUITrafficLightLogicWrapper - methods
150  * ----------------------------------------------------------------------- */
152  GUIGlObject(GLO_TLLOGIC, tll.getID(), GUIIconSubSys::getIcon(GUIIcon::LOCATETLS)),
153  myTLLogicControl(control), myTLLogic(tll) {
154 }
155 
156 
158 
159 
162  GUISUMOAbstractView& parent) {
163  myApp = &app;
164  GUIGLObjectPopupMenu* ret = new GUITrafficLightLogicWrapperPopupMenu(app, parent, *this);
165  buildPopupHeader(ret, app);
168  std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
169  if (logics.size() > 1) {
170  std::vector<MSTrafficLightLogic*>::const_iterator i;
171  int index = 0;
172  for (i = logics.begin(); i != logics.end(); ++i, ++index) {
173  if (!vars.isActive(*i) && dynamic_cast<MSOffTrafficLightLogic*>(*i) == nullptr) {
174  GUIDesigns::buildFXMenuCommand(ret, TLF("Switch to '%'", (*i)->getProgramID()),
175  GUIIconSubSys::getIcon(GUIIcon::FLAG_MINUS), ret, (FXSelector)(MID_SWITCH + index));
176  }
177  }
178  new FXMenuSeparator(ret);
179  }
180  MSOffTrafficLightLogic* offLogic = dynamic_cast<MSOffTrafficLightLogic*>(vars.getActive());
181  if (offLogic == nullptr) {
183  }
184  GUIDesigns::buildFXMenuCommand(ret, TL("Track Phases"), nullptr, ret, MID_TRACKPHASES);
185  GUIDesigns::buildFXMenuCommand(ret, TL("Show Phases"), nullptr, ret, MID_SHOWPHASES);
187  if (act != nullptr) {
188  GUIDesigns::buildFXMenuCommand(ret, act->showDetectors() ? TL("Hide Detectors") : TL("Show Detectors"), nullptr, ret, MID_SHOW_DETECTORS);
189  }
191  if (db != nullptr) {
192  GUIDesigns::buildFXMenuCommand(ret, db->showDetectors() ? TL("Hide Detectors") : TL("Show Detectors"), nullptr, ret, MID_SHOW_DETECTORS);
193  }
194  NEMALogic* nema = dynamic_cast<NEMALogic*>(&myTLLogic);
195  if (nema != nullptr) {
196  GUIDesigns::buildFXMenuCommand(ret, nema->showDetectors() ? TL("Hide Detectors") : TL("Show Detectors"), nullptr, ret, MID_SHOW_DETECTORS);
197  }
198  new FXMenuSeparator(ret);
202  GUIDesigns::buildFXMenuCommand(ret, TLF("Phase: %", toString(tll->getCurrentPhaseIndex())), nullptr, nullptr, 0);
203  const std::string& name = tll->getCurrentPhaseDef().getName();
204  if (name != "") {
205  GUIDesigns::buildFXMenuCommand(ret, TLF("Phase name: %", name), nullptr, nullptr, 0);
206  }
207  new FXMenuSeparator(ret);
208  buildShowParamsPopupEntry(ret, false);
209  buildPositionCopyEntry(ret, app);
210  return ret;
211 }
212 
213 
214 void
218  new FuncBinding_StringParam<MSTLLogicControl, std::pair<SUMOTime, MSPhaseDefinition> >
220  window->create();
221  window->show();
222 }
223 
224 
225 void
229  static_cast<MSSimpleTrafficLightLogic&>(myTLLogic).getPhases());
230  window->setBeginTime(0);
231  window->create();
232  window->show();
233 }
234 
235 
239  GUIParameterTableWindow* ret = new GUIParameterTableWindow(app, *this);
240  ret->mkItem(TL("tlLogic [id]"), false, myTLLogic.getID());
241  ret->mkItem(TL("type"), false, toString(myTLLogic.getLogicType()));
242  ret->mkItem(TL("program"), false, myTLLogic.getProgramID());
253  MSRailSignal* rs = dynamic_cast<MSRailSignal*>(&myTLLogic);
254  if (rs != nullptr) {
259  }
260  // close building
261  ret->closeBuilding(&myTLLogic);
262  return ret;
263 }
264 
265 
266 Boundary
268  Boundary ret;
270  for (MSTrafficLightLogic::LaneVectorVector::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
271  const MSTrafficLightLogic::LaneVector& lanes2 = (*i);
272  for (MSTrafficLightLogic::LaneVector::const_iterator j = lanes2.begin(); j != lanes2.end(); ++j) {
273  ret.add((*j)->getShape()[-1]);
274  }
275  }
276  ret.grow(20);
277  return ret;
278 }
279 
280 const std::string
282  return myTLLogic.getParameter("name", "");
283 }
284 
285 
286 void
288  if (to == -1) {
291  } else {
293  std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
294  myTLLogicControl.switchTo(myTLLogic.getID(), logics[to]->getProgramID());
295  }
296 }
297 
298 
299 int
301  return myTLLogic.getLinkIndex(link);
302 }
303 
304 
305 void
307  if (s.gaming) {
308  if (!MSNet::getInstance()->getTLSControl().isActive(&myTLLogic) || myTLLogic.getPhases().size() == 0) {
309  return;
310  }
311  const std::string& curState = myTLLogic.getCurrentPhaseDef().getState();
312  if (curState.find_first_of("gG") == std::string::npos) {
313  // no link is 'green' at the moment. find those that turn green next
315  int curPhaseIdx = myTLLogic.getCurrentPhaseIndex();
316  int phaseIdx = (curPhaseIdx + 1) % phases.size();
317  std::vector<int> nextGreen;
318  while (phaseIdx != curPhaseIdx) {
319  const std::string& state = phases[phaseIdx]->getState();
320  for (int linkIdx = 0; linkIdx < (int)state.size(); linkIdx++) {
321  if ((LinkState)state[linkIdx] == LINKSTATE_TL_GREEN_MINOR ||
322  (LinkState)state[linkIdx] == LINKSTATE_TL_GREEN_MAJOR) {
323  nextGreen.push_back(linkIdx);
324  }
325  }
326  if (nextGreen.size() > 0) {
327  break;
328  }
329  phaseIdx = (phaseIdx + 1) % phases.size();
330  }
331  // highlight nextGreen links
332  for (const int idx : nextGreen) {
333  for (const MSLane* const lane : myTLLogic.getLanesAt(idx)) {
335  // split circle in red and yellow
336  const Position& pos = lane->getShape().back();
337  glTranslated(pos.x(), pos.y(), GLO_MAX);
338  double rot = RAD2DEG(lane->getShape().angleAt2D((int)lane->getShape().size() - 2)) - 90;
339  glRotated(rot, 0, 0, 1);
341  GLHelper::drawFilledCircle(lane->getWidth() / 2., 8, -90, 90);
343  GLHelper::drawFilledCircle(lane->getWidth() / 2., 8, 90, 270);
345  }
346  }
347  }
348  }
349 }
350 
354 }
355 
356 int
359 }
360 
361 std::string
364 }
365 
366 int
368  return (int)STEPS2TIME(getActiveTLLogic()->getCurrentPhaseDef().duration);
369 }
370 
371 int
373  return (int)STEPS2TIME(getActiveTLLogic()->getMinDur());
374 }
375 
376 int
378  return (int)STEPS2TIME(getActiveTLLogic()->getMaxDur());
379 }
380 
381 int
383  const SUMOTime earliestEnd = getActiveTLLogic()->getEarliestEnd();
384  return earliestEnd == MSPhaseDefinition::UNSPECIFIED_DURATION ? -1 : (int)STEPS2TIME(earliestEnd);
385 }
386 
387 int
389  const SUMOTime latestEnd = getActiveTLLogic()->getLatestEnd();
390  return latestEnd == MSPhaseDefinition::UNSPECIFIED_DURATION ? -1 : (int)STEPS2TIME(latestEnd);
391 }
392 
393 int
395  return (int)STEPS2TIME(getActiveTLLogic()->getDefaultCycleTime());
396 }
397 
398 int
400  return (int)STEPS2TIME(getActiveTLLogic()->getTimeInCycle());
401 }
402 
403 int
405  return (int)STEPS2TIME(getActiveTLLogic()->getSpentDuration());
406 }
407 
408 
409 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
@ MID_SWITCH_OFF
Show TLS phases - popup entry.
Definition: GUIAppEnum.h:473
@ MID_SHOWPHASES
Definition: GUIAppEnum.h:475
@ MID_TRACKPHASES
Begin to track phases - menu entry.
Definition: GUIAppEnum.h:477
@ MID_SHOW_DETECTORS
show/hide actuation detectors
Definition: GUIAppEnum.h:479
@ MID_SWITCH
Definition: GUIAppEnum.h:474
FXDEFMAP(GUIDialog_AppSettings) GUIDialog_AppSettingsMap[]
@ GLO_MAX
empty max
@ GLO_TLLOGIC
a tl-logic
GUIIcon
An enumeration of icons used by the gui applications.
Definition: GUIIcons.h:33
GUITrafficLightLogicWrapperPopupMenuMap[]
#define RAD2DEG(x)
Definition: GeomHelper.h:36
#define TL(string)
Definition: MsgHandler.h:315
#define TLF(string,...)
Definition: MsgHandler.h:317
#define STEPS2TIME(x)
Definition: SUMOTime.h:55
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_TL_YELLOW_MAJOR
The link has yellow light, may pass.
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_TL_RED
The link has red light (must brake)
@ 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
A class that stores a 2D geometrical boundary.
Definition: Boundary.h:39
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
Definition: Boundary.cpp:78
Boundary & grow(double by)
extends the boundary by the given amount
Definition: Boundary.cpp:319
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition: GLHelper.cpp:654
static void drawFilledCircle(const double widradiusth, const int steps=8)
Draws a filled circle around (0,0)
Definition: GLHelper.cpp:569
static void popMatrix()
pop matrix
Definition: GLHelper.cpp:130
static void pushMatrix()
push matrix
Definition: GLHelper.cpp:117
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
Definition: GUIDesigns.cpp:42
The popup menu of a globject.
void buildShowParamsPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to open the parameter window.
void buildCenterPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to center to the object.
void buildNameCopyPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds entries which allow to copy the name / typed name into the clipboard.
void buildPopupHeader(GUIGLObjectPopupMenu *ret, GUIMainWindow &app, bool addSeparator=true)
Builds the header.
void buildSelectionPopupEntry(GUIGLObjectPopupMenu *ret, bool addSeparator=true)
Builds an entry which allows to (de)select the object.
void buildPositionCopyEntry(GUIGLObjectPopupMenu *ret, const GUIMainWindow &app) const
Builds an entry which allows to copy the cursor position if geo projection is used,...
static FXIcon * getIcon(const GUIIcon which)
returns a icon previously defined in the enum GUIIcon
void createTLWrapper(MSTrafficLightLogic *tll) override
creates a wrapper for the given logic
Definition: GUINet.cpp:157
static GUINet * getGUIInstance()
Returns the pointer to the unique instance of GUINet (singleton).
Definition: GUINet.cpp:572
A window containing a gl-object's parameter.
void mkItem(const char *name, bool dynamic, ValueSource< T > *src)
Adds a row which obtains its value from a ValueSource.
void closeBuilding(const Parameterised *p=0)
Closes the building of the table.
This window displays a phase diagram for a chosen tl-logic.
void setBeginTime(SUMOTime time)
Sets the time the display shall be shown as beginning at.
void create()
Creates the window (FOX-Toolkit)
long onCmdBegin2TrackPhases(FXObject *, FXSelector, void *)
Called if the phases shall be begun to track.
long onCmdShowPhases(FXObject *, FXSelector, void *)
Called if the phases shall be shown.
MSTLLogicControl & myTLLogicControl
Reference to the according tls.
MSTrafficLightLogic & getTLLogic() const
MSTrafficLightLogic & myTLLogic
The wrapped tl-logic.
GUIMainWindow * myApp
The main application.
void begin2TrackPhases()
Builds a GUITLLogicPhasesTrackerWindow which will receive new phases.
GUIParameterTableWindow * getParameterWindow(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own parameter window.
GUIGLObjectPopupMenu * getPopUpMenu(GUIMainWindow &app, GUISUMOAbstractView &parent)
Returns an own popup-menu.
GUITrafficLightLogicWrapper(MSTLLogicControl &control, MSTrafficLightLogic &tll)
Constructor.
void drawGL(const GUIVisualizationSettings &s) const
Draws the object.
const std::string getOptionalName() const
Returns the value for generic parameter 'name' or ''.
Boundary getCenteringBoundary() const
Returns the boundary to which the view shall be centered in order to show the object.
MSTrafficLightLogic * getActiveTLLogic() const
void switchTLSLogic(int to)
Builds a GUITLLogicPhasesTrackerWindow which displays the phase diagram.
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link within the according tls.
void showPhases()
Builds a GUITLLogicPhasesTrackerWindow which displays the phase diagram.
Stores the information about how to visualize structures.
bool gaming
whether the application is in gaming mode or not
static const RGBColor & getLinkColor(const LinkState &ls, bool realistic=false)
map from LinkState to color constants
An actuated (adaptive) traffic light logic.
An actuated traffic light logic based on time delay of approaching vehicles.
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:182
A traffic lights logic which represents a tls in an off-mode.
const std::string & getState() const
Returns the state within this phase.
static const SUMOTime UNSPECIFIED_DURATION
const std::string & getName() const
A signal for rails.
Definition: MSRailSignal.h:46
std::string getBlockingVehicleIDs() const
std::string getPriorityVehicleIDs() const
std::string getConstraintInfo() const
std::string getRivalVehicleIDs() const
A fixed traffic light logic.
Storage for all programs of a single tls.
std::vector< MSTrafficLightLogic * > getAllLogics() const
MSTrafficLightLogic * getActive() const
bool isActive(const MSTrafficLightLogic *tl) const
A class that stores and controls tls and switching of their programs.
std::pair< SUMOTime, MSPhaseDefinition > getPhaseDef(const std::string &tlid) const
return the complete phase definition for a named traffic lights logic
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.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
The parent class for traffic light logics.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
std::vector< LaneVector > LaneVectorVector
Definition of a list that holds lists of lanes that do have the same attribute.
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link.
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
virtual SUMOTime getLatestEnd(int step=-1) const
const LaneVectorVector & getLaneVectors() const
Returns the list of lists of all lanes controlled by this tls.
TrafficLightType getLogicType() const
Returns the type of the logic.
virtual SUMOTime getEarliestEnd(int step=-1) const
const LaneVector & getLanesAt(int i) const
Returns the list of lanes that are controlled by the signals at the given position.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
virtual const Phases & getPhases() const =0
Returns the phases of this tls program.
const std::string & getProgramID() const
Returns this tl-logic's id.
A NEMA (adaptive) traffic light logic based on E2Detector.
bool showDetectors() const
void setShowDetectors(bool show)
const std::string & getID() const
Returns the id.
Definition: Named.h:74
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
double x() const
Returns the x-position.
Definition: Position.h:55
double y() const
Returns the y-position.
Definition: Position.h:60