SUMO - Simulation of Urban MObility
|
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