GUITLLogicPhasesTrackerWindow::GUITLLogicPhasesTrackerWindow( GUIMainWindow& app, MSTrafficLightLogic& logic, GUITrafficLightLogicWrapper& /*wrapper*/, const MSSimpleTrafficLightLogic::Phases& /*phases*/) : FXMainWindow(app.getApp(), "TLS-Tracker", NULL, NULL, DECOR_ALL, 20, 20, 300, 200), myApplication(&app), myTLLogic(&logic), myAmInTrackingMode(false), myToolBarDrag(0), myBeginOffset(0) { myConnector = 0; FXint height = (FXint)(myTLLogic->getLinks().size() * 20 + 30 + 8); setTitle("TLS-Tracker"); app.addChild(this, true); for (size_t i = 0; i < myTLLogic->getLinks().size(); ++i) { myLinkNames.push_back(toString<size_t>(i)); } FXVerticalFrame* glcanvasFrame = new FXVerticalFrame(this, FRAME_SUNKEN | LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0); myPanel = new GUITLLogicPhasesTrackerPanel(glcanvasFrame, *myApplication, *this); setTitle((logic.getID() + " - " + logic.getProgramID() + " - tracker").c_str()); setIcon(GUIIconSubSys::getIcon(ICON_APP_TLSTRACKER)); setHeight(height); }
/* ------------------------------------------------------------------------- * GUITLLogicPhasesTrackerWindow-methods * ----------------------------------------------------------------------- */ GUITLLogicPhasesTrackerWindow::GUITLLogicPhasesTrackerWindow( GUIMainWindow& app, MSTrafficLightLogic& logic, GUITrafficLightLogicWrapper& wrapper, ValueSource<std::pair<SUMOTime, MSPhaseDefinition> >* src) : FXMainWindow(app.getApp(), "TLS-Tracker", NULL, NULL, DECOR_ALL, 20, 20, 300, 200), myApplication(&app), myTLLogic(&logic), myAmInTrackingMode(true) { // build the toolbar myToolBarDrag = new FXToolBarShell(this, FRAME_NORMAL); myToolBar = new FXToolBar(this, myToolBarDrag, LAYOUT_SIDE_TOP | LAYOUT_FILL_X | FRAME_RAISED); new FXToolBarGrip(myToolBar, myToolBar, FXToolBar::ID_TOOLBARGRIP, TOOLBARGRIP_DOUBLE); // interval manipulation myBeginOffset = new FXRealSpinDial(myToolBar, 10, this, MID_SIMSTEP, LAYOUT_TOP | FRAME_SUNKEN | FRAME_THICK); myBeginOffset->setFormatString("%.0f"); myBeginOffset->setIncrements(1, 10, 100); myBeginOffset->setRange(60, 3600); myBeginOffset->setValue(240); new FXLabel(myToolBar, "(s)", 0, LAYOUT_CENTER_Y); // myConnector = new GLObjectValuePassConnector<std::pair<SUMOTime, MSPhaseDefinition> >(wrapper, src, this); FXint height = (FXint)(myTLLogic->getLinks().size() * 20 + 30 + 8 + 30); app.addChild(this, true); for (size_t i = 0; i < myTLLogic->getLinks().size(); ++i) { myLinkNames.push_back(toString<size_t>(i)); } FXVerticalFrame* glcanvasFrame = new FXVerticalFrame(this, FRAME_SUNKEN | LAYOUT_SIDE_TOP | LAYOUT_FILL_X | LAYOUT_FILL_Y, 0, 0, 0, 0, 0, 0, 0, 0); myPanel = new GUITLLogicPhasesTrackerPanel(glcanvasFrame, *myApplication, *this); setTitle((logic.getID() + " - " + logic.getProgramID() + " - tracker").c_str()); setIcon(GUIIconSubSys::getIcon(ICON_APP_TLSTRACKER)); setHeight(height); }
void GUIViewTraffic::onGamingClick(Position pos) { MSTLLogicControl& tlsControl = MSNet::getInstance()->getTLSControl(); const std::vector<MSTrafficLightLogic*>& logics = tlsControl.getAllLogics(); MSTrafficLightLogic* minTll = 0; SUMOReal minDist = std::numeric_limits<SUMOReal>::infinity(); for (std::vector<MSTrafficLightLogic*>::const_iterator i = logics.begin(); i != logics.end(); ++i) { // get the logic MSTrafficLightLogic* tll = (*i); if (tlsControl.isActive(tll)) { // get the links const MSTrafficLightLogic::LaneVector& lanes = tll->getLanesAt(0); if (lanes.size() > 0) { const Position& endPos = lanes[0]->getShape().back(); if (endPos.distanceTo(pos) < minDist) { minDist = endPos.distanceTo(pos); minTll = tll; } } } } if (minTll != 0) { const MSTLLogicControl::TLSLogicVariants& vars = tlsControl.get(minTll->getID()); const std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics(); if (logics.size() > 1) { MSSimpleTrafficLightLogic* l = (MSSimpleTrafficLightLogic*) logics[0]; for (unsigned int i = 0; i < logics.size() - 1; ++i) { if (minTll->getProgramID() == logics[i]->getProgramID()) { l = (MSSimpleTrafficLightLogic*) logics[i + 1]; tlsControl.switchTo(minTll->getID(), l->getProgramID()); } } if (l == logics[0]) { tlsControl.switchTo(minTll->getID(), l->getProgramID()); } l->changeStepAndDuration(tlsControl, MSNet::getInstance()->getCurrentTimeStep(), 0, l->getPhase(0).duration); update(); } } }
SUMOTime Command_SaveTLSSwitches::execute(SUMOTime currentTime) { MSTrafficLightLogic* light = myLogics.getActive(); const MSTrafficLightLogic::LinkVectorVector& links = light->getLinks(); const std::string& state = light->getCurrentPhaseDef().getState(); for (unsigned int i = 0; i < (unsigned int) links.size(); i++) { if (state[i] == LINKSTATE_TL_GREEN_MAJOR || state[i] == LINKSTATE_TL_GREEN_MINOR) { if (myPreviousLinkStates.find(i) == myPreviousLinkStates.end()) { // was not saved before myPreviousLinkStates[i] = currentTime; continue; } } else { if (myPreviousLinkStates.find(i) == myPreviousLinkStates.end()) { // was not yet green continue; } const MSTrafficLightLogic::LinkVector& currLinks = links[i]; const MSTrafficLightLogic::LaneVector& currLanes = light->getLanesAt(i); SUMOTime lastOn = myPreviousLinkStates[i]; for (int j = 0; j < (int) currLinks.size(); j++) { MSLink* link = currLinks[j]; myOutputDevice << " <tlsSwitch id=\"" << light->getID() << "\" programID=\"" << light->getProgramID() << "\" fromLane=\"" << currLanes[j]->getID() << "\" toLane=\"" << link->getLane()->getID() << "\" begin=\"" << time2string(lastOn) << "\" end=\"" << time2string(currentTime) << "\" duration=\"" << time2string(currentTime - lastOn) << "\"/>\n"; } myPreviousLinkStates.erase(myPreviousLinkStates.find(i)); } } return DELTA_T; }
// =========================================================================== // method definitions // =========================================================================== bool TraCIServerAPI_TLS::processGet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { // variable & id int variable = inputStorage.readUnsignedByte(); std::string id = inputStorage.readString(); // check variable if (variable != ID_LIST && variable != TL_RED_YELLOW_GREEN_STATE && variable != TL_COMPLETE_DEFINITION_RYG && variable != TL_CONTROLLED_LANES && variable != TL_CONTROLLED_LINKS && variable != TL_CURRENT_PHASE && variable != TL_CURRENT_PROGRAM && variable != TL_NEXT_SWITCH && variable != TL_PHASE_DURATION && variable != ID_COUNT) { server.writeStatusCmd(CMD_GET_TL_VARIABLE, RTYPE_ERR, "Get TLS Variable: unsupported variable specified", outputStorage); return false; } // begin response building tcpip::Storage tempMsg; // response-code, variableID, objectID tempMsg.writeUnsignedByte(RESPONSE_GET_TL_VARIABLE); tempMsg.writeUnsignedByte(variable); tempMsg.writeString(id); if (variable == ID_LIST) { std::vector<std::string> ids = MSNet::getInstance()->getTLSControl().getAllTLIds(); tempMsg.writeUnsignedByte(TYPE_STRINGLIST); tempMsg.writeStringList(ids); } else if (variable == ID_COUNT) { std::vector<std::string> ids = MSNet::getInstance()->getTLSControl().getAllTLIds(); tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt((int) ids.size()); } else { if (!MSNet::getInstance()->getTLSControl().knows(id)) { server.writeStatusCmd(CMD_GET_TL_VARIABLE, RTYPE_ERR, "Traffic light '" + id + "' is not known", outputStorage); return false; } MSTLLogicControl::TLSLogicVariants& vars = MSNet::getInstance()->getTLSControl().get(id); switch (variable) { case ID_LIST: break; case TL_RED_YELLOW_GREEN_STATE: { tempMsg.writeUnsignedByte(TYPE_STRING); std::string state = vars.getActive()->getCurrentPhaseDef().getState(); tempMsg.writeString(state); } break; case TL_COMPLETE_DEFINITION_RYG: { std::vector<MSTrafficLightLogic*> logics = vars.getAllLogics(); tempMsg.writeUnsignedByte(TYPE_COMPOUND); tcpip::Storage tempContent; unsigned int cnt = 0; tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt((int) logics.size()); ++cnt; for (unsigned int i = 0; i < logics.size(); ++i) { MSTrafficLightLogic* logic = logics[i]; tempContent.writeUnsignedByte(TYPE_STRING); tempContent.writeString(logic->getProgramID()); ++cnt; // type (always 0 by now) tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt(0); ++cnt; // subparameter (always 0 by now) tempContent.writeUnsignedByte(TYPE_COMPOUND); tempContent.writeInt(0); ++cnt; // (current) phase index tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt((int) logic->getCurrentPhaseIndex()); ++cnt; // phase number unsigned int phaseNo = logic->getPhaseNumber(); tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt((int) phaseNo); ++cnt; for (unsigned int j = 0; j < phaseNo; ++j) { MSPhaseDefinition phase = logic->getPhase(j); tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt(phase.duration); ++cnt; tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt(phase.minDuration); ++cnt; // not implemented tempContent.writeUnsignedByte(TYPE_INTEGER); tempContent.writeInt(phase.maxDuration); ++cnt; // not implemented const std::string& state = phase.getState(); //unsigned int linkNo = (unsigned int)(vars.getActive()->getLinks().size()); tempContent.writeUnsignedByte(TYPE_STRING); tempContent.writeString(state); ++cnt; } } tempMsg.writeInt((int) cnt); tempMsg.writeStorage(tempContent); } break; case TL_CONTROLLED_LANES: { const MSTrafficLightLogic::LaneVectorVector& lanes = vars.getActive()->getLanes(); tempMsg.writeUnsignedByte(TYPE_STRINGLIST); std::vector<std::string> laneIDs; for (MSTrafficLightLogic::LaneVectorVector::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { const MSTrafficLightLogic::LaneVector& llanes = (*i); for (MSTrafficLightLogic::LaneVector::const_iterator j = llanes.begin(); j != llanes.end(); ++j) { laneIDs.push_back((*j)->getID()); } } tempMsg.writeStringList(laneIDs); } break; case TL_CONTROLLED_LINKS: { const MSTrafficLightLogic::LaneVectorVector& lanes = vars.getActive()->getLanes(); const MSTrafficLightLogic::LinkVectorVector& links = vars.getActive()->getLinks(); // tempMsg.writeUnsignedByte(TYPE_COMPOUND); tcpip::Storage tempContent; unsigned int cnt = 0; tempContent.writeUnsignedByte(TYPE_INTEGER); unsigned int no = (unsigned int) lanes.size(); tempContent.writeInt((int) no); for (unsigned int i = 0; i < no; ++i) { const MSTrafficLightLogic::LaneVector& llanes = lanes[i]; const MSTrafficLightLogic::LinkVector& llinks = links[i]; // number of links controlled by this signal (signal i) tempContent.writeUnsignedByte(TYPE_INTEGER); unsigned int no2 = (unsigned int) llanes.size(); tempContent.writeInt((int) no2); ++cnt; for (unsigned int j = 0; j < no2; ++j) { MSLink* link = llinks[j]; std::vector<std::string> def; // incoming lane def.push_back(llanes[j]->getID()); // approached non-internal lane (if any) def.push_back(link->getLane() != 0 ? link->getLane()->getID() : ""); // approached "via", internal lane (if any) #ifdef HAVE_INTERNAL_LANES def.push_back(link->getViaLane() != 0 ? link->getViaLane()->getID() : ""); #else def.push_back(""); #endif tempContent.writeUnsignedByte(TYPE_STRINGLIST); tempContent.writeStringList(def); ++cnt; } } tempMsg.writeInt((int) cnt); tempMsg.writeStorage(tempContent); } break; case TL_CURRENT_PHASE: tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt((int) vars.getActive()->getCurrentPhaseIndex()); break; case TL_CURRENT_PROGRAM: tempMsg.writeUnsignedByte(TYPE_STRING); tempMsg.writeString(vars.getActive()->getProgramID()); break; case TL_PHASE_DURATION: tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt((int) vars.getActive()->getCurrentPhaseDef().duration); break; case TL_NEXT_SWITCH: tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt((int) vars.getActive()->getNextSwitchTime()); break; case TL_CONTROLLED_JUNCTIONS: { } break; default: break; } } server.writeStatusCmd(CMD_GET_TL_VARIABLE, RTYPE_OK, "", outputStorage); server.writeResponseWithLength(outputStorage, tempMsg); return true; }