SUMO - Simulation of Urban MObility
GUITrafficLightLogicWrapper.cpp
Go to the documentation of this file.
00001 /****************************************************************************/
00010 // A wrapper for tl-logics to allow their visualisation and interaction
00011 /****************************************************************************/
00012 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00013 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
00014 /****************************************************************************/
00015 //
00016 //   This file is part of SUMO.
00017 //   SUMO is free software: you can redistribute it and/or modify
00018 //   it under the terms of the GNU General Public License as published by
00019 //   the Free Software Foundation, either version 3 of the License, or
00020 //   (at your option) any later version.
00021 //
00022 /****************************************************************************/
00023 
00024 
00025 // ===========================================================================
00026 // included modules
00027 // ===========================================================================
00028 #ifdef _MSC_VER
00029 #include <windows_config.h>
00030 #else
00031 #include <config.h>
00032 #endif
00033 
00034 #ifdef WIN32
00035 #include <windows.h>
00036 #endif
00037 
00038 #include <GL/gl.h>
00039 
00040 #include <cassert>
00041 #include <utils/gui/globjects/GUIGlObject.h>
00042 #include <utils/gui/div/GLObjectValuePassConnector.h>
00043 #include <utils/gui/windows/GUIAppEnum.h>
00044 #include <utils/gui/images/GUIIconSubSys.h>
00045 #include <utils/gui/div/GLHelper.h>
00046 #include <utils/gui/globjects/GUIGLObjectPopupMenu.h>
00047 #include <utils/gui/div/GUIGlobalSelection.h>
00048 #include <microsim/MSLane.h>
00049 #include <microsim/traffic_lights/MSTrafficLightLogic.h>
00050 #include <microsim/traffic_lights/MSTLLogicControl.h>
00051 #include <microsim/logging/FunctionBinding.h>
00052 #include <microsim/logging/FuncBinding_StringParam.h>
00053 #include <gui/GUIApplicationWindow.h>
00054 #include <gui/GUITLLogicPhasesTrackerWindow.h>
00055 #include <gui/GUIGlobals.h>
00056 #include "GUITrafficLightLogicWrapper.h"
00057 #include "GUINet.h"
00058 
00059 #ifdef CHECK_MEMORY_LEAKS
00060 #include <foreign/nvwa/debug_new.h>
00061 #endif // CHECK_MEMORY_LEAKS
00062 
00063 
00064 // ===========================================================================
00065 // FOX callback mapping
00066 // ===========================================================================
00067 FXDEFMAP(GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu)
00068 GUITrafficLightLogicWrapperPopupMenuMap[] = {
00069     FXMAPFUNC(SEL_COMMAND,  MID_SHOWPHASES,             GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdShowPhases),
00070     FXMAPFUNC(SEL_COMMAND,  MID_TRACKPHASES,            GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdBegin2TrackPhases),
00071     FXMAPFUNC(SEL_COMMAND,  MID_SWITCH_OFF,             GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdSwitchTLS2Off),
00072     FXMAPFUNCS(SEL_COMMAND, MID_SWITCH, MID_SWITCH + 20, GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdSwitchTLSLogic),
00073 };
00074 
00075 // Object implementation
00076 FXIMPLEMENT(GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu, GUIGLObjectPopupMenu, GUITrafficLightLogicWrapperPopupMenuMap, ARRAYNUMBER(GUITrafficLightLogicWrapperPopupMenuMap))
00077 
00078 
00079 // ===========================================================================
00080 // method definitions
00081 // ===========================================================================
00082 /* -------------------------------------------------------------------------
00083  * GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu - methods
00084  * ----------------------------------------------------------------------- */
00085 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::GUITrafficLightLogicWrapperPopupMenu(
00086     GUIMainWindow& app, GUISUMOAbstractView& parent,
00087     GUIGlObject& o)
00088     : GUIGLObjectPopupMenu(app, parent, o) {}
00089 
00090 
00091 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::~GUITrafficLightLogicWrapperPopupMenu() {}
00092 
00093 
00094 
00095 long
00096 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdBegin2TrackPhases(
00097     FXObject*, FXSelector, void*) {
00098     assert(myObject->getType() == GLO_TLLOGIC);
00099     static_cast<GUITrafficLightLogicWrapper*>(myObject)->begin2TrackPhases();
00100     return 1;
00101 }
00102 
00103 
00104 long
00105 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdShowPhases(
00106     FXObject*, FXSelector, void*) {
00107     assert(myObject->getType() == GLO_TLLOGIC);
00108     static_cast<GUITrafficLightLogicWrapper*>(myObject)->showPhases();
00109     return 1;
00110 }
00111 
00112 
00113 long
00114 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdSwitchTLS2Off(
00115     FXObject*, FXSelector /*sel*/, void*) {
00116     assert(myObject->getType() == GLO_TLLOGIC);
00117     static_cast<GUITrafficLightLogicWrapper*>(myObject)->switchTLSLogic(-1);
00118     return 1;
00119 }
00120 
00121 
00122 long
00123 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapperPopupMenu::onCmdSwitchTLSLogic(
00124     FXObject*, FXSelector sel, void*) {
00125     assert(myObject->getType() == GLO_TLLOGIC);
00126     static_cast<GUITrafficLightLogicWrapper*>(myObject)->switchTLSLogic(FXSELID(sel) - MID_SWITCH);
00127     return 1;
00128 }
00129 
00130 
00131 
00132 /* -------------------------------------------------------------------------
00133  * GUITrafficLightLogicWrapper - methods
00134  * ----------------------------------------------------------------------- */
00135 GUITrafficLightLogicWrapper::GUITrafficLightLogicWrapper(
00136     MSTLLogicControl& control, MSTrafficLightLogic& tll) :
00137     GUIGlObject(GLO_TLLOGIC, tll.getID()),
00138     myTLLogicControl(control), myTLLogic(tll) {}
00139 
00140 
00141 GUITrafficLightLogicWrapper::~GUITrafficLightLogicWrapper() {}
00142 
00143 
00144 GUIGLObjectPopupMenu*
00145 GUITrafficLightLogicWrapper::getPopUpMenu(GUIMainWindow& app,
00146         GUISUMOAbstractView& parent) {
00147     myApp = &app;
00148     GUIGLObjectPopupMenu* ret = new GUITrafficLightLogicWrapperPopupMenu(app, parent, *this);
00149     buildPopupHeader(ret, app);
00150     buildCenterPopupEntry(ret);
00151     //
00152     const MSTLLogicControl::TLSLogicVariants& vars = myTLLogicControl.get(myTLLogic.getID());
00153     std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
00154     if (logics.size() > 1) {
00155         std::vector<MSTrafficLightLogic*>::const_iterator i;
00156         size_t index = 0;
00157         for (i = logics.begin(); i != logics.end(); ++i, ++index) {
00158             if (!vars.isActive(*i)) {
00159                 new FXMenuCommand(ret, ("Switch to '" + (*i)->getProgramID() + "'").c_str(),
00160                                   GUIIconSubSys::getIcon(ICON_FLAG_MINUS), ret, (FXSelector)(MID_SWITCH + index));
00161             }
00162         }
00163         new FXMenuSeparator(ret);
00164     }
00165     new FXMenuCommand(ret, "Switch off", GUIIconSubSys::getIcon(ICON_FLAG_MINUS), ret, MID_SWITCH_OFF);
00166     new FXMenuCommand(ret, "Track Phases", 0, ret, MID_TRACKPHASES);
00167     new FXMenuCommand(ret, "Show Phases", 0, ret, MID_SHOWPHASES);
00168     new FXMenuSeparator(ret);
00169     //
00170     buildNameCopyPopupEntry(ret);
00171     buildSelectionPopupEntry(ret);
00172     buildPositionCopyEntry(ret, false);
00173     return ret;
00174 }
00175 
00176 
00177 void
00178 GUITrafficLightLogicWrapper::begin2TrackPhases() {
00179     GUITLLogicPhasesTrackerWindow* window =
00180         new GUITLLogicPhasesTrackerWindow(*myApp, myTLLogic, *this,
00181                                           new FuncBinding_StringParam<MSTLLogicControl, std::pair<SUMOTime, MSPhaseDefinition> >
00182                                           (&MSNet::getInstance()->getTLSControl(), &MSTLLogicControl::getPhaseDef, myTLLogic.getID()));
00183     window->create();
00184     window->show();
00185 }
00186 
00187 
00188 void
00189 GUITrafficLightLogicWrapper::showPhases() {
00190     GUITLLogicPhasesTrackerWindow* window =
00191         new GUITLLogicPhasesTrackerWindow(*myApp, myTLLogic, *this,
00192                                           static_cast<MSSimpleTrafficLightLogic&>(myTLLogic).getPhases());
00193     window->setBeginTime(0);
00194     window->create();
00195     window->show();
00196 }
00197 
00198 
00199 GUIParameterTableWindow*
00200 GUITrafficLightLogicWrapper::getParameterWindow(GUIMainWindow&,
00201         GUISUMOAbstractView&) {
00202     return 0;
00203 }
00204 
00205 
00206 Boundary
00207 GUITrafficLightLogicWrapper::getCenteringBoundary() const {
00208     Boundary ret;
00209     const MSTrafficLightLogic::LaneVectorVector& lanes = myTLLogic.getLanes();
00210     for (MSTrafficLightLogic::LaneVectorVector::const_iterator i = lanes.begin(); i != lanes.end(); ++i) {
00211         const MSTrafficLightLogic::LaneVector& lanes2 = (*i);
00212         for (MSTrafficLightLogic::LaneVector::const_iterator j = lanes2.begin(); j != lanes2.end(); ++j) {
00213             ret.add((*j)->getShape()[-1]);
00214         }
00215     }
00216     ret.grow(20);
00217     return ret;
00218 }
00219 
00220 
00221 void
00222 GUITrafficLightLogicWrapper::switchTLSLogic(int to) {
00223     if (to == -1) {
00224         myTLLogicControl.switchTo(myTLLogic.getID(), "off");
00225         MSTrafficLightLogic* tll = myTLLogicControl.getActive(myTLLogic.getID());
00226         GUINet::getGUIInstance()->createTLWrapper(tll);
00227     } else {
00228         const MSTLLogicControl::TLSLogicVariants& vars = myTLLogicControl.get(myTLLogic.getID());
00229         std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics();
00230         myTLLogicControl.switchTo(myTLLogic.getID(), logics[to]->getProgramID());
00231     }
00232 }
00233 
00234 
00235 int
00236 GUITrafficLightLogicWrapper::getLinkIndex(const MSLink* const link) const {
00237     return myTLLogic.getLinkIndex(link);
00238 }
00239 
00240 
00241 void
00242 GUITrafficLightLogicWrapper::drawGL(const GUIVisualizationSettings& s) const {
00243     if (s.gaming) {
00244         if (!MSNet::getInstance()->getTLSControl().isActive(&myTLLogic)) {
00245             return;
00246         };
00247         const std::string& curState = myTLLogic.getCurrentPhaseDef().getState();
00248         if (curState.find_first_of("gG") == std::string::npos) {
00249             // no link is 'green' at the moment. find those that turn green next
00250             const MSTrafficLightLogic::Phases& phases = myTLLogic.getPhases();
00251             unsigned int curPhaseIdx = myTLLogic.getCurrentPhaseIndex();
00252             unsigned int phaseIdx = (curPhaseIdx + 1) % phases.size();
00253             std::vector<unsigned int> nextGreen;
00254             while (phaseIdx != curPhaseIdx) {
00255                 const std::string& state = phases[phaseIdx]->getState();
00256                 for (unsigned int linkIdx = 0; linkIdx < state.size(); linkIdx++) {
00257                     if ((LinkState)state[linkIdx] == LINKSTATE_TL_GREEN_MINOR ||
00258                             (LinkState)state[linkIdx] == LINKSTATE_TL_GREEN_MAJOR) {
00259                         nextGreen.push_back(linkIdx);
00260                     }
00261                 }
00262                 if (nextGreen.size() > 0) {
00263                     break;
00264                 }
00265                 phaseIdx = (phaseIdx + 1) % phases.size();
00266             }
00267             // highlight nextGreen links
00268             for (std::vector<unsigned int>::iterator it_idx = nextGreen.begin(); it_idx != nextGreen.end(); it_idx++) {
00269                 const MSTrafficLightLogic::LaneVector& lanes = myTLLogic.getLanesAt(*it_idx);
00270                 for (MSTrafficLightLogic::LaneVector::const_iterator it_lane = lanes.begin(); it_lane != lanes.end(); it_lane++) {
00271                     glPushMatrix();
00272                     glColor3d(0, 1, 0);
00273                     Position pos = (*it_lane)->getShape().getEnd();
00274                     glTranslated(pos.x(), pos.y(), GLO_MAX);
00275                     GLHelper::drawFilledCircle((*it_lane)->getWidth() / 2.);
00276                     glPopMatrix();
00277                 }
00278             }
00279         }
00280     }
00281 }
00282 
00283 
00284 /****************************************************************************/
00285 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines