Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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>
36#include <microsim/MSLane.h>
48#include <gui/GUIGlobals.h>
51
53#include "GUINet.h"
54
55// ===========================================================================
56// FOX callback mapping
57// ===========================================================================
66
67// Object implementation
69
70
71// ===========================================================================
72// method definitions
73// ===========================================================================
74/* -------------------------------------------------------------------------
75 * GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu - methods
76 * ----------------------------------------------------------------------- */
81
82
84
85
86
87long
89 FXObject*, FXSelector, void*) {
90 assert(myObject->getType() == GLO_TLLOGIC);
91 static_cast<GUITrafficLightLogicWrapper*>(myObject)->begin2TrackPhases();
92 return 1;
93}
94
95
96long
98 FXObject*, FXSelector, void*) {
99 assert(myObject->getType() == GLO_TLLOGIC);
100 static_cast<GUITrafficLightLogicWrapper*>(myObject)->showPhases();
101 return 1;
102}
103
104long
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) {
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
127long
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
137long
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 * ----------------------------------------------------------------------- */
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
214void
218 new FuncBinding_StringParam<MSTLLogicControl, std::pair<SUMOTime, MSPhaseDefinition> >
220 window->create();
221 window->show();
222}
223
224
225void
229 static_cast<MSSimpleTrafficLightLogic&>(myTLLogic).getPhases());
230 window->setBeginTime(0);
231 window->create();
232 window->show();
233}
234
235
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) {
257 ret->mkItem(TL("blocking driveways"), true, new FunctionBindingString<MSRailSignal>(rs, &MSRailSignal::getBlockingDriveWayIDs));
261 }
262 // close building
264 return ret;
265}
266
267
270 Boundary ret;
272 for (MSTrafficLightLogic::LaneVectorVector::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
273 const MSTrafficLightLogic::LaneVector& lanes2 = (*i);
274 for (MSTrafficLightLogic::LaneVector::const_iterator j = lanes2.begin(); j != lanes2.end(); ++j) {
275 ret.add((*j)->getShape()[-1]);
276 }
277 }
278 ret.grow(20);
279 return ret;
280}
281
282const std::string
286
287
288void
290 if (to == -1) {
293 } else {
295 std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
296 myTLLogicControl.switchTo(myTLLogic.getID(), logics[to]->getProgramID());
297 }
298}
299
300
301int
303 return myTLLogic.getLinkIndex(link);
304}
305
306
307void
309 if (s.gaming) {
310 if (!MSNet::getInstance()->getTLSControl().isActive(&myTLLogic) || myTLLogic.getPhases().size() == 0) {
311 return;
312 }
313 const std::string& curState = myTLLogic.getCurrentPhaseDef().getState();
314 if (curState.find_first_of("gG") == std::string::npos) {
315 // no link is 'green' at the moment. find those that turn green next
317 int curPhaseIdx = myTLLogic.getCurrentPhaseIndex();
318 int phaseIdx = (curPhaseIdx + 1) % phases.size();
319 std::vector<int> nextGreen;
320 while (phaseIdx != curPhaseIdx) {
321 const std::string& state = phases[phaseIdx]->getState();
322 for (int linkIdx = 0; linkIdx < (int)state.size(); linkIdx++) {
323 if ((LinkState)state[linkIdx] == LINKSTATE_TL_GREEN_MINOR ||
324 (LinkState)state[linkIdx] == LINKSTATE_TL_GREEN_MAJOR) {
325 nextGreen.push_back(linkIdx);
326 }
327 }
328 if (nextGreen.size() > 0) {
329 break;
330 }
331 phaseIdx = (phaseIdx + 1) % phases.size();
332 }
333 // highlight nextGreen links
334 for (const int idx : nextGreen) {
335 for (const MSLane* const lane : myTLLogic.getLanesAt(idx)) {
337 // split circle in red and yellow
338 const Position& pos = lane->getShape().back();
339 glTranslated(pos.x(), pos.y(), GLO_MAX);
340 double rot = RAD2DEG(lane->getShape().angleAt2D((int)lane->getShape().size() - 2)) - 90;
341 glRotated(rot, 0, 0, 1);
343 GLHelper::drawFilledCircle(lane->getWidth() / 2., 8, -90, 90);
345 GLHelper::drawFilledCircle(lane->getWidth() / 2., 8, 90, 270);
347 }
348 }
349 }
350 }
351}
352
357
358int
362
363std::string
367
368int
370 return (int)STEPS2TIME(getActiveTLLogic()->getCurrentPhaseDef().duration);
371}
372
373int
377
378int
382
383int
385 const SUMOTime earliestEnd = getActiveTLLogic()->getEarliestEnd();
386 return earliestEnd == MSPhaseDefinition::UNSPECIFIED_DURATION ? -1 : (int)STEPS2TIME(earliestEnd);
387}
388
389int
391 const SUMOTime latestEnd = getActiveTLLogic()->getLatestEnd();
392 return latestEnd == MSPhaseDefinition::UNSPECIFIED_DURATION ? -1 : (int)STEPS2TIME(latestEnd);
393}
394
395int
397 return (int)STEPS2TIME(getActiveTLLogic()->getDefaultCycleTime());
398}
399
400int
404
405int
407 return (int)STEPS2TIME(getActiveTLLogic()->getSpentDuration());
408}
409
410
411/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ MID_SWITCH_OFF
Show TLS phases - popup entry.
Definition GUIAppEnum.h:477
@ MID_SHOWPHASES
Definition GUIAppEnum.h:479
@ MID_TRACKPHASES
Begin to track phases - menu entry.
Definition GUIAppEnum.h:481
@ MID_SHOW_DETECTORS
show/hide actuation detectors
Definition GUIAppEnum.h:483
@ MID_SWITCH
Definition GUIAppEnum.h:478
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:343
static void setColor(const RGBColor &c)
Sets the gl-color to this value.
Definition GLHelper.cpp:649
static void drawFilledCircle(const double widradiusth, const int steps=8)
Draws a filled circle around (0,0)
Definition GLHelper.cpp:564
static void popMatrix()
pop matrix
Definition GLHelper.cpp:131
static void pushMatrix()
push matrix
Definition GLHelper.cpp:118
static FXMenuCommand * buildFXMenuCommand(FXComposite *p, const std::string &text, FXIcon *icon, FXObject *tgt, FXSelector sel, const bool disable=false)
build menu command
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 & myTLLogic
The wrapped tl-logic.
MSTrafficLightLogic & getTLLogic() const
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:186
A traffic lights logic which represents a tls in an off-mode.
static const SUMOTime UNSPECIFIED_DURATION
const std::string & getName() const
const std::string & getState() const
Returns the state within this phase.
A signal for rails.
std::string getBlockingVehicleIDs() const
std::string getRequestedDriveWay() const
std::string getPriorityVehicleIDs() const
std::string getBlockingDriveWayIDs() 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.
std::vector< LaneVector > LaneVectorVector
Definition of a list that holds lists of lanes that do have the same attribute.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
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.
const LaneVector & getLanesAt(int i) const
Returns the list of lanes that are controlled by the signals at the given position.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
virtual SUMOTime getLatestEnd(int step=-1) const
const std::string & getProgramID() const
Returns this tl-logic's id.
TrafficLightType getLogicType() const
Returns the type of the logic.
virtual SUMOTime getEarliestEnd(int step=-1) const
virtual const Phases & getPhases() const =0
Returns the phases of this tls program.
const LaneVectorVector & getLaneVectors() const
Returns the list of lists of all lanes controlled by this tls.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
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