#include <TraCIServer.h>

Definition at line 69 of file TraCIServer.h.
Public Member Functions | |
| void | vehicleStateChanged (const MSVehicle *const vehicle, MSNet::VehicleState to) throw () |
| Called if a vehicle changes its state. | |
Static Public Member Functions | |
| static void | close () |
| static void | processCommandsUntilSimStep (SUMOTime step) throw (ProcessError) |
| static bool | wasClosed () |
Private Member Functions | |
| bool | addSubscription (int commandId) throw (TraCIException) |
| bool | commandAddVehicle () throw (TraCIException) |
| bool | commandChangeLane () throw (TraCIException, std::invalid_argument) |
| bool | commandChangeRoute () throw (TraCIException, std::invalid_argument) |
| bool | commandChangeTarget () throw (TraCIException, std::invalid_argument) |
| bool | commandCloseConnection () throw (TraCIException) |
| bool | commandDistanceRequest () throw (TraCIException) |
| bool | commandGetAllTLIds () throw (TraCIException) |
| bool | commandGetTLStatus () throw (TraCIException) |
| bool | commandPositionConversion () throw (TraCIException) |
| bool | commandScenario () throw (TraCIException) |
| bool | commandSetMaximumSpeed () throw (TraCIException, std::invalid_argument) |
| bool | commandSimulationParameter () throw (TraCIException) |
| bool | commandSlowDown () throw (TraCIException) |
| bool | commandStopNode () throw (TraCIException, std::invalid_argument) |
| bool | commandSubscribeDomain () throw (TraCIException) |
| bool | commandSubscribeLifecycles () throw (TraCIException) |
| bool | commandUnsubscribeDomain () throw (TraCIException) |
| bool | commandUnsubscribeLifecycles () throw (TraCIException) |
| bool | commandUpdateCalibrator () throw (TraCIException) |
| TraCIServer::RoadMapPos | convertCartesianToRoadMap (Position2D pos) |
| void | convertExt2IntId (int extId, std::string &intId) |
| Position2D | convertRoadMapToCartesian (TraCIServer::RoadMapPos pos) throw (TraCIException) |
| int | dispatchCommand () throw (TraCIException, std::invalid_argument) |
| const Boundary & | getNetBoundary () |
| PointOfInterest * | getPoiByExtId (int extId) |
| Polygon2D * | getPolygonByExtId (int extId) |
| MSTrafficLightLogic * | getTLLogicByExtId (int extId) |
| MSVehicle * | getVehicleByExtId (int extId) |
| void | handleDomainSubscriptions (const SUMOTime ¤tTime, const std::map< int, const MSVehicle * > &activeEquippedVehicles) throw (TraCIException) |
| void | handleLifecycleSubscriptions () throw (TraCIException) |
| std::string | handlePoiDomain (bool isWriteCommand, tcpip::Storage &response) throw (TraCIException) |
| std::string | handlePolygonDomain (bool isWriteCommand, tcpip::Storage &response) throw (TraCIException) |
| std::string | handleRoadMapDomain (bool isWriteCommand, tcpip::Storage &response) throw (TraCIException) |
| std::string | handleTrafficLightDomain (bool isWriteCommand, tcpip::Storage &response) throw (TraCIException) |
| std::string | handleVehicleDomain (bool isWriteCommand, tcpip::Storage &response) throw (TraCIException) |
| void | postProcessSimulationStep () throw (TraCIException, std::invalid_argument) |
| void | postProcessSimulationStep2 () throw (TraCIException, std::invalid_argument) |
| bool | processSingleSubscription (const TraCIServer::Subscription &s, tcpip::Storage &writeInto, std::string &errors) throw (TraCIException) |
| TraCIServer () | |
| void | writeStatusCmd (int commandId, int status, std::string description) |
| virtual | ~TraCIServer (void) throw () |
Private Attributes | |
| std::map< std::string, int > | equippedVehicles_ |
| std::map< int, std::string > | ext2intId |
| bool | isMapChanged_ |
| std::set< int > | myCreatedVehicles |
| std::set< int > | myDestroyedVehicles |
| bool | myDoingSimStep |
| std::map< int, std::list < std::pair< int, int > > > | myDomainSubscriptions |
| tcpip::Storage | myInputStorage |
| std::set< int > | myLifecycleSubscriptions |
| std::set< int > | myLivingVehicles |
| tcpip::Storage | myOutputStorage |
| std::vector< Subscription > | mySubscriptions |
| std::map< MSNet::VehicleState, std::vector< std::string > > | myVehicleStateChanges |
| std::set< MSVehicle * > | myVehiclesToReroute |
| Boundary * | netBoundary_ |
| int | numEquippedVehicles_ |
| float | penetration_ |
| std::map< int, std::string > | poiExt2IntId |
| std::map< std::string, int > | poiInt2ExtId |
| std::map< int, std::string > | polygonExt2IntId |
| std::map< std::string, int > | polygonInt2ExtId |
| std::string | routeFile_ |
| int | simStepCommand |
| tcpip::Socket * | socket_ |
| SUMOTime | targetTime_ |
| int | totalNumVehicles_ |
| std::map< int, std::string > | trafficLightsExt2IntId |
| std::map< std::string, int > | trafficLightsInt2ExtId |
Static Private Attributes | |
| static bool | closeConnection_ = false |
| static TraCIServer * | instance_ = 0 |
Data Structures | |
| struct | RoadMapPos |
| class | Subscription |
| TraCIServer::TraCIServer | ( | ) | [private] |
Definition at line 110 of file TraCIServer.cpp.
References MSNet::addVehicleStateListener(), MSTLLogicControl::getAllTLIds(), MsgHandler::getErrorInstance(), OptionsCont::getFloat(), MSNet::getInstance(), OptionsCont::getInt(), ShapeContainer::getMaxLayer(), MsgHandler::getMessageInstance(), ShapeContainer::getMinLayer(), OptionsCont::getOptions(), ShapeContainer::getPOICont(), ShapeContainer::getPolygonCont(), XMLSubSys::getSAXReader(), MSNet::getShapeContainer(), OptionsCont::getString(), OptionsCont::getStringVector(), MSNet::getTLSControl(), traci::TraCIHandler::getTotalVehicleCount(), MsgHandler::getWarningInstance(), MSGlobals::gUsingInternalLanes, MsgHandler::inform(), OptionsCont::isSet(), OptionsCont::isUsableFileList(), traci::TraCIHandler::resetTotalVehicleCount(), GenericSAXHandler::setFileName(), toString(), MSNet::VEHICLE_STATE_ARRIVED, MSNet::VEHICLE_STATE_BUILT, MSNet::VEHICLE_STATE_DEPARTED, MSNet::VEHICLE_STATE_ENDING_TELEPORT, MSNet::VEHICLE_STATE_STARTING_TELEPORT, MsgHandler::wasInformed(), and tcpip::SocketException::what().
00110 { 00111 myVehicleStateChanges[MSNet::VEHICLE_STATE_BUILT] = std::vector<std::string>(); 00112 myVehicleStateChanges[MSNet::VEHICLE_STATE_DEPARTED] = std::vector<std::string>(); 00113 myVehicleStateChanges[MSNet::VEHICLE_STATE_STARTING_TELEPORT] = std::vector<std::string>(); 00114 myVehicleStateChanges[MSNet::VEHICLE_STATE_ENDING_TELEPORT] = std::vector<std::string>(); 00115 myVehicleStateChanges[MSNet::VEHICLE_STATE_ARRIVED] = std::vector<std::string>(); 00116 MSNet::getInstance()->addVehicleStateListener(this); 00117 00118 OptionsCont &oc = OptionsCont::getOptions(); 00119 targetTime_ = 0; 00120 penetration_ = oc.getFloat("penetration"); 00121 routeFile_ = oc.getString("route-files"); 00122 isMapChanged_ = true; 00123 numEquippedVehicles_ = 0; 00124 totalNumVehicles_ = 0; 00125 closeConnection_ = false; 00126 netBoundary_ = NULL; 00127 myDoingSimStep = false; 00128 00129 // display warning if internal lanes are not used 00130 if (!MSGlobals::gUsingInternalLanes) { 00131 MsgHandler::getWarningInstance()->inform("Starting TraCI without using internal lanes!"); 00132 MsgHandler::getWarningInstance()->inform("Vehicles will jump over junctions.", false); 00133 MsgHandler::getWarningInstance()->inform("Use without option --no-internal-links to avoid unexpected behavior", false); 00134 } 00135 00136 // map the internal id of all traffic lights, polygons and poi to external id and vice versa 00137 trafficLightsInt2ExtId.clear(); 00138 trafficLightsExt2IntId.clear(); 00139 poiExt2IntId.clear(); 00140 poiInt2ExtId.clear(); 00141 polygonExt2IntId.clear(); 00142 polygonInt2ExtId.clear(); 00143 int extId = 0; 00144 std::vector<std::string> tllIds = MSNet::getInstance()->getTLSControl().getAllTLIds(); 00145 for (std::vector<std::string>::iterator it=tllIds.begin(); it != tllIds.end(); it++) { 00146 trafficLightsInt2ExtId[(*it)] = extId; 00147 trafficLightsExt2IntId[extId] = (*it); 00148 // cerr << "TL int=" << *it << " --> ext=" << extId << endl; 00149 extId++; 00150 } 00151 int poiId = 0; 00152 int polyId = 0; 00153 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 00154 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); i++) { 00155 std::vector<PointOfInterest*> poiList = shapeCont.getPOICont(i).getTempVector(); 00156 for (std::vector<PointOfInterest*>::iterator it=poiList.begin(); it != poiList.end(); it++) { 00157 poiInt2ExtId[(*it)->getID()] = poiId; 00158 poiExt2IntId[poiId] = (*it)->getID(); 00159 poiId++; 00160 } 00161 std::vector<Polygon2D*> polyList = shapeCont.getPolygonCont(i).getTempVector(); 00162 for (std::vector<Polygon2D*>::iterator it=polyList.begin(); it != polyList.end(); it++) { 00163 polygonInt2ExtId[(*it)->getID()] = polyId; 00164 polygonExt2IntId[polyId] = (*it)->getID(); 00165 polyId++; 00166 } 00167 } 00168 00169 // determine the maximum number of vehicles by searching route and additional input files for "vehicle" tags 00170 TraCIHandler xmlHandler; 00171 SAX2XMLReader* xmlParser = XMLSubSys::getSAXReader(xmlHandler); 00172 00173 // parse route files 00174 if (oc.isSet("route-files")) { 00175 std::vector<std::string> fileList = oc.getStringVector("route-files"); 00176 for (std::vector<std::string>::iterator file=fileList.begin(); file != fileList.end(); file++) { 00177 if (oc.isUsableFileList("route-files")) { 00178 xmlHandler.setFileName((*file)); 00179 xmlHandler.resetTotalVehicleCount(); 00180 xmlParser->parse(file->c_str()); 00181 00182 if (!MsgHandler::getErrorInstance()->wasInformed()) { 00183 totalNumVehicles_ += xmlHandler.getTotalVehicleCount(); 00184 } 00185 } 00186 } 00187 } 00188 00189 // parse additional files 00190 if (oc.isSet("additional-files")) { 00191 std::vector<std::string> fileList = oc.getStringVector("additional-files"); 00192 for (std::vector<std::string>::iterator file = fileList.begin(); file != fileList.end(); file++) { 00193 if (oc.isUsableFileList("additional-files")) { 00194 xmlHandler.setFileName((*file)); 00195 xmlHandler.resetTotalVehicleCount(); 00196 xmlParser->parse(file->c_str()); 00197 00198 if (!MsgHandler::getErrorInstance()->wasInformed()) { 00199 totalNumVehicles_ += xmlHandler.getTotalVehicleCount(); 00200 } 00201 } 00202 } 00203 } 00204 00205 delete xmlParser; 00206 00207 try { 00208 int port = oc.getInt("remote-port"); 00209 // Opens listening socket 00210 MsgHandler::getMessageInstance()->inform("***Starting server on port " + toString(port) + " ***"); 00211 socket_ = new Socket(port); 00212 socket_->accept(); 00213 // When got here, a client has connected 00214 } catch (SocketException &e) { 00215 throw ProcessError(e.what()); 00216 } 00217 00218 }
| TraCIServer::~TraCIServer | ( | void | ) | throw () [private, virtual] |
Definition at line 222 of file TraCIServer.cpp.
References MSNet::getInstance(), and MSNet::removeVehicleStateListener().
00222 { 00223 MSNet::getInstance()->removeVehicleStateListener(this); 00224 if (socket_ != NULL) { 00225 socket_->close(); 00226 delete socket_; 00227 } 00228 if (netBoundary_ != NULL) delete netBoundary_; 00229 }
| bool TraCIServer::addSubscription | ( | int | commandId | ) | throw (TraCIException) [private] |
Definition at line 3069 of file TraCIServer.cpp.
References traci::TraCIServer::Subscription::commandId, traci::TraCIServer::Subscription::endTime, MSNet::getCurrentTimeStep(), MSNet::getInstance(), RTYPE_ERR, and RTYPE_OK.
03069 { 03070 SUMOTime beginTime = myInputStorage.readInt(); 03071 SUMOTime endTime = myInputStorage.readInt(); 03072 std::string id = myInputStorage.readString(); 03073 int no = myInputStorage.readUnsignedByte(); 03074 std::vector<int> variables; 03075 for (int i=0; i<no; ++i) { 03076 variables.push_back(myInputStorage.readUnsignedByte()); 03077 } 03078 // check subscribe/unsubscribe 03079 bool ok = true; 03080 if (variables.size()==0) { 03081 // try unsubscribe 03082 bool found = false; 03083 for (std::vector<Subscription>::iterator j=mySubscriptions.begin(); j!=mySubscriptions.end();) { 03084 if ((*j).id==id&&(*j).commandId==commandId) { 03085 j = mySubscriptions.erase(j); 03086 found = true; 03087 continue; 03088 } 03089 ++j; 03090 } 03091 if (found) { 03092 writeStatusCmd(commandId, RTYPE_OK, ""); 03093 } else { 03094 writeStatusCmd(commandId, RTYPE_OK, "The subscription to remove was not found."); 03095 } 03096 } else { 03097 // process subscription 03098 Subscription s(commandId, id, variables, beginTime, endTime); 03099 tcpip::Storage writeInto; 03100 std::string errors; 03101 if (s.endTime<MSNet::getInstance()->getCurrentTimeStep()) { 03102 processSingleSubscription(s, writeInto, errors); 03103 writeStatusCmd(s.commandId, RTYPE_ERR, "Subscription has ended."); 03104 } else { 03105 if (processSingleSubscription(s, writeInto, errors)) { 03106 mySubscriptions.push_back(s); 03107 writeStatusCmd(s.commandId, RTYPE_OK, ""); 03108 } else { 03109 writeStatusCmd(s.commandId, RTYPE_ERR, "Could not add subscription (" + errors + ")."); 03110 } 03111 } 03112 myOutputStorage.writeStorage(writeInto); 03113 } 03114 return ok; 03115 }
| void TraCIServer::close | ( | ) | [static] |
Definition at line 234 of file TraCIServer.cpp.
Referenced by MSNet::closeSimulation().
00234 { 00235 if (instance_!=0) { 00236 delete instance_; 00237 instance_ = 0; 00238 closeConnection_ = true; 00239 } 00240 }
| bool TraCIServer::commandAddVehicle | ( | ) | throw (TraCIException) [private] |
Definition at line 1420 of file TraCIServer.cpp.
References MSVehicleControl::addVehicle(), MSVehicleControl::buildVehicle(), CMD_ADDVEHICLE, CMD_STOP, MSVehicleControl::deleteVehicle(), SUMOVehicleParameter::depart, MSLane::dictionary(), MSRoute::dictionary(), MSNet::getCurrentTimeStep(), MSRoute::getEdges(), MSVehicle::getID(), MSNet::getInstance(), MSVehicle::getMaxSpeed(), MSLane::getMaxSpeed(), MSNet::getVehicleControl(), MSVehicleControl::getVType(), SUMOVehicleParameter::id, MSLane::isEmissionSuccess(), MIN2(), MIN3(), MSVehicle::onDepart(), RTYPE_ERR, RTYPE_OK, and SUMOReal.
01420 { 01421 01422 // read parameters 01423 std::string vehicleId = myInputStorage.readString(); 01424 std::string vehicleTypeId = myInputStorage.readString(); 01425 std::string routeId = myInputStorage.readString(); 01426 std::string laneId = myInputStorage.readString(); 01427 SUMOReal emitPosition = myInputStorage.readFloat(); 01428 SUMOReal emitSpeed = myInputStorage.readFloat(); 01429 01430 // find vehicleType 01431 MSVehicleType *vehicleType = MSNet::getInstance()->getVehicleControl().getVType(vehicleTypeId); 01432 if (!vehicleType) { 01433 writeStatusCmd(CMD_ADDVEHICLE, RTYPE_ERR, "Invalid vehicleTypeId: '"+vehicleTypeId+"'"); 01434 return false; 01435 } 01436 01437 // find route 01438 const MSRoute *route = MSRoute::dictionary(routeId); 01439 if (!route) { 01440 writeStatusCmd(CMD_ADDVEHICLE, RTYPE_ERR, "Invalid routeId: '"+routeId+"'"); 01441 return false; 01442 } 01443 01444 // find lane 01445 MSLane *lane; 01446 if (laneId != "") { 01447 lane = MSLane::dictionary(laneId); 01448 if (!lane) { 01449 writeStatusCmd(CMD_ADDVEHICLE, RTYPE_ERR, "Invalid laneId: '"+laneId+"'"); 01450 return false; 01451 } 01452 } else { 01453 lane = route->getEdges()[0]->getLanes()[0]; 01454 if (!lane) { 01455 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Could not find first lane of first edge in routeId '"+routeId+"'"); 01456 return false; 01457 } 01458 } 01459 01460 // build vehicle 01461 SUMOVehicleParameter* vehicleParams = new SUMOVehicleParameter(); 01462 vehicleParams->id = vehicleId; 01463 vehicleParams->depart = MSNet::getInstance()->getCurrentTimeStep()+1; 01464 MSVehicle *vehicle = MSNet::getInstance()->getVehicleControl().buildVehicle(vehicleParams, route, vehicleType); 01465 if (vehicle == NULL) { 01466 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Could not build vehicle"); 01467 return false; 01468 } 01469 01470 // calculate speed 01471 float clippedEmitSpeed; 01472 if (emitSpeed<0) { 01473 clippedEmitSpeed = MIN2(lane->getMaxSpeed(), vehicle->getMaxSpeed()); 01474 } else { 01475 clippedEmitSpeed = MIN3(lane->getMaxSpeed(), vehicle->getMaxSpeed(), emitSpeed); 01476 } 01477 01478 // insert vehicle into the dictionary 01479 if (!MSNet::getInstance()->getVehicleControl().addVehicle(vehicle->getID(), vehicle)) { 01480 writeStatusCmd(CMD_ADDVEHICLE, RTYPE_ERR, "Could not add vehicle to VehicleControl"); 01481 return false; 01482 } 01483 01484 // try to emit 01485 if (!lane->isEmissionSuccess(vehicle, clippedEmitSpeed, emitPosition, true)) { 01486 MSNet::getInstance()->getVehicleControl().deleteVehicle(vehicle); 01487 writeStatusCmd(CMD_ADDVEHICLE, RTYPE_ERR, "Could not emit vehicle"); 01488 return false; 01489 } 01490 01491 // exec callback 01492 vehicle->onDepart(); 01493 01494 // create a reply message 01495 writeStatusCmd(CMD_ADDVEHICLE, RTYPE_OK, ""); 01496 01497 return true; 01498 }
| bool TraCIServer::commandChangeLane | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 823 of file TraCIServer.cpp.
References CMD_CHANGELANE, MSVehicle::getEdge(), MSEdge::getLanes(), RTYPE_ERR, RTYPE_OK, and MSVehicle::startLaneChange().
00823 { 00824 // NodeId 00825 MSVehicle* veh = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 00826 // Lane ID 00827 char laneIndex = myInputStorage.readByte(); 00828 // stickyTime 00829 SUMOTime stickyTime = myInputStorage.readInt(); 00830 00831 if (veh == NULL) { 00832 writeStatusCmd(CMD_CHANGELANE, RTYPE_ERR, "Can not retrieve node with given ID"); 00833 return false; 00834 } 00835 00836 /*const MSEdge* const road = veh->getEdge(); 00837 const std::vector<MSLane*> &allLanes = road->getLanes();*/ 00838 if ((laneIndex < 0) || (laneIndex >= veh->getEdge()->getLanes().size())) { 00839 writeStatusCmd(CMD_CHANGELANE, RTYPE_ERR, "No lane existing with given id on the current road"); 00840 return false; 00841 } 00842 00843 // Forward command to vehicle 00844 veh->startLaneChange(static_cast<unsigned>(laneIndex), static_cast<SUMOTime>(stickyTime)); 00845 00846 // create a reply message 00847 writeStatusCmd(CMD_CHANGELANE, RTYPE_OK, ""); 00848 00849 return true; 00850 }
| bool TraCIServer::commandChangeRoute | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 854 of file TraCIServer.cpp.
References MSEdgeWeightsStorage::addTravelTime(), CMD_CHANGEROUTE, MSEdge::dictionary(), MSNet::getCurrentTimeStep(), MSNet::getInstance(), OptionsCont::getOptions(), MSNet::getWeightsStorage(), MSVehicle::getWeightsStorage(), MSEdgeWeightsStorage::knowsTravelTime(), MSEdgeWeightsStorage::removeTravelTime(), RTYPE_ERR, RTYPE_OK, string2time(), SUMOReal, SUMOTime_MAX, toString(), and MSVehicle::willPass().
00854 { 00855 // NodeId 00856 int vehId = myInputStorage.readInt(); 00857 MSVehicle* veh = getVehicleByExtId(vehId); // external node id (equipped vehicle number) 00858 // edgeID 00859 std::string edgeId = myInputStorage.readString(); 00860 MSEdge* edge = MSEdge::dictionary(edgeId); 00861 // travelTime 00862 double travelTime = myInputStorage.readDouble(); 00863 if (veh == NULL) { 00864 writeStatusCmd(CMD_CHANGEROUTE, RTYPE_ERR, "Can not retrieve node with ID " + toString(vehId)); 00865 return false; 00866 } 00867 if (edge == NULL) { 00868 writeStatusCmd(CMD_CHANGEROUTE, RTYPE_ERR, "Can not retrieve edge with ID " + edgeId); 00869 return false; 00870 } 00871 // 00872 SUMOTime currentTime = MSNet::getInstance()->getCurrentTimeStep() / 1000.; 00873 MSNet::EdgeWeightsProxi proxi(veh->getWeightsStorage(), MSNet::getInstance()->getWeightsStorage()); 00874 SUMOReal effortBefore = proxi.getTravelTime(edge, veh, currentTime); 00875 bool hadError = false; 00876 if (travelTime < 0) { 00877 if (!veh->getWeightsStorage().knowsTravelTime(edge)) { 00878 hadError = true; 00879 } 00880 veh->getWeightsStorage().removeTravelTime(edge); 00881 } else { 00882 SUMOTime end = string2time(OptionsCont::getOptions().getString("end")); 00883 if(end<0) { 00884 end = SUMOTime_MAX; 00885 } 00886 veh->getWeightsStorage().addTravelTime(edge, currentTime, (SUMOReal) end / 1000., travelTime); 00887 } 00888 SUMOReal effortAfter = proxi.getTravelTime(edge, veh, currentTime); 00889 if (myVehiclesToReroute.find(veh)==myVehiclesToReroute.end() && (effortBefore != effortAfter)) { 00890 // there is only a need to reroute if either the weight decreases or the edge is on our current route 00891 if ((effortBefore > effortAfter) ^ veh->willPass(edge)) { 00892 myVehiclesToReroute.insert(veh); 00893 } 00894 } 00895 if (!hadError) { 00896 writeStatusCmd(CMD_CHANGEROUTE, RTYPE_OK, ""); 00897 return true; 00898 } else { 00899 writeStatusCmd(CMD_CHANGEROUTE, RTYPE_ERR, "Could not (re-)set travel time properly"); 00900 return false; 00901 } 00902 }
| bool TraCIServer::commandChangeTarget | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 906 of file TraCIServer.cpp.
References CMD_CHANGETARGET, MSEdge::dictionary(), MSEdge::dictSize(), MSNet::getCurrentTimeStep(), MSVehicle::getEdge(), MSVehicle::getID(), MSNet::getInstance(), MSNet::EdgeWeightsProxi::getTravelTime(), MSNet::getWeightsStorage(), MSVehicle::getWeightsStorage(), MSVehicle::replaceRoute(), RTYPE_ERR, and RTYPE_OK.
00906 { 00907 // NodeId 00908 MSVehicle* veh = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 00909 // EdgeId 00910 std::string edgeID = myInputStorage.readString(); 00911 00912 // destination edge 00913 const MSEdge* destEdge = MSEdge::dictionary(edgeID); 00914 00915 if (veh == NULL) { 00916 writeStatusCmd(CMD_CHANGETARGET, RTYPE_ERR, "Can not retrieve node with given ID"); 00917 return false; 00918 } 00919 00920 if (destEdge == NULL) { 00921 writeStatusCmd(CMD_CHANGETARGET, RTYPE_ERR, "Can not retrieve road with ID " + edgeID); 00922 return false; 00923 } 00924 00925 // build a new route between the vehicle's current edge and destination edge 00926 MSEdgeVector newRoute; 00927 const MSEdge* currentEdge = veh->getEdge(); 00928 MSNet::EdgeWeightsProxi proxi(veh->getWeightsStorage(), MSNet::getInstance()->getWeightsStorage()); 00929 DijkstraRouterTT_ByProxi<MSEdge, SUMOVehicle, prohibited_withRestrictions<MSEdge, SUMOVehicle>, MSNet::EdgeWeightsProxi> router(MSEdge::dictSize(), true, &proxi, &MSNet::EdgeWeightsProxi::getTravelTime); 00930 router.compute(currentEdge, destEdge, (const MSVehicle* const) veh, 00931 MSNet::getInstance()->getCurrentTimeStep(), newRoute); 00932 // replace the vehicle's route by the new one 00933 if (veh->replaceRoute(newRoute, MSNet::getInstance()->getCurrentTimeStep())) { 00934 writeStatusCmd(CMD_CHANGETARGET, RTYPE_OK, ""); 00935 return true; 00936 } else { 00937 writeStatusCmd(CMD_CHANGETARGET, RTYPE_ERR, "Route replacement failed for " + veh->getID()); 00938 return false; 00939 } 00940 }
| bool TraCIServer::commandCloseConnection | ( | ) | throw (TraCIException) [private] |
Definition at line 1144 of file TraCIServer.cpp.
References CMD_CLOSE, and RTYPE_OK.
01144 { 01145 closeConnection_ = true; 01146 // write answer 01147 writeStatusCmd(CMD_CLOSE, RTYPE_OK, "Goodbye"); 01148 return true; 01149 }
| bool TraCIServer::commandDistanceRequest | ( | ) | throw (TraCIException) [private] |
Definition at line 1503 of file TraCIServer.cpp.
References CMD_DISTANCEREQUEST, TraCIDijkstraRouter< E >::compute(), RGBColor::DEFAULT_COLOR, MSEdge::dictionary(), MSEdge::dictSize(), Position2D::distanceTo(), MSNet::getCurrentTimeStep(), MSRoute::getDistanceBetween(), MSNet::getInstance(), traci::TraCIServer::RoadMapPos::laneId, traci::TraCIServer::RoadMapPos::pos, POSITION_2_5D, POSITION_2D, POSITION_3D, POSITION_ROADMAP, REQUEST_AIRDIST, REQUEST_DRIVINGDIST, traci::TraCIServer::RoadMapPos::roadId, RTYPE_ERR, RTYPE_OK, Position2D::set(), and traci::TraCIException::what().
01503 { 01504 Position2D pos1; 01505 Position2D pos2; 01506 RoadMapPos roadPos1; 01507 RoadMapPos roadPos2; 01508 const std::vector<MSLane*>* lanes; 01509 01510 // read position 1 01511 int posType = myInputStorage.readUnsignedByte(); 01512 switch (posType) { 01513 case POSITION_ROADMAP: 01514 roadPos1.roadId = myInputStorage.readString(); 01515 roadPos1.pos = myInputStorage.readFloat(); 01516 roadPos1.laneId = myInputStorage.readUnsignedByte(); 01517 try { 01518 pos1 = convertRoadMapToCartesian(roadPos1); 01519 } catch (TraCIException &e) { 01520 writeStatusCmd(CMD_DISTANCEREQUEST, RTYPE_ERR, e.what()); 01521 return false; 01522 } 01523 break; 01524 case POSITION_2D: 01525 case POSITION_2_5D: 01526 case POSITION_3D: { 01527 float p1x = myInputStorage.readFloat(); 01528 float p1y = myInputStorage.readFloat(); 01529 pos1.set(p1x, p1y); 01530 } 01531 if ((posType == POSITION_2_5D) || (posType == POSITION_3D)) { 01532 myInputStorage.readFloat(); // z value is ignored 01533 } 01534 roadPos1 = convertCartesianToRoadMap(pos1); 01535 break; 01536 default: 01537 writeStatusCmd(CMD_DISTANCEREQUEST, RTYPE_ERR, "Unknown position format used for distance request"); 01538 return false; 01539 } 01540 01541 // read position 2 01542 posType = myInputStorage.readUnsignedByte(); 01543 switch (posType) { 01544 case POSITION_ROADMAP: 01545 roadPos2.roadId = myInputStorage.readString(); 01546 roadPos2.pos = myInputStorage.readFloat(); 01547 roadPos2.laneId = myInputStorage.readUnsignedByte(); 01548 try { 01549 pos2 = convertRoadMapToCartesian(roadPos2); 01550 } catch (TraCIException &e) { 01551 writeStatusCmd(CMD_DISTANCEREQUEST, RTYPE_ERR, e.what()); 01552 return false; 01553 } 01554 break; 01555 case POSITION_2D: 01556 case POSITION_2_5D: 01557 case POSITION_3D: { 01558 float p2x = myInputStorage.readFloat(); 01559 float p2y = myInputStorage.readFloat(); 01560 pos2.set(p2x, p2y); 01561 } 01562 if ((posType == POSITION_2_5D) || (posType == POSITION_3D)) { 01563 myInputStorage.readFloat(); // z value is ignored 01564 } 01565 roadPos2 = convertCartesianToRoadMap(pos2); 01566 break; 01567 default: 01568 writeStatusCmd(CMD_DISTANCEREQUEST, RTYPE_ERR, "Unknown position format used for distance request"); 01569 return false; 01570 } 01571 01572 // read distance type 01573 int distType = myInputStorage.readUnsignedByte(); 01574 01575 float distance = 0.0; 01576 if (distType == REQUEST_DRIVINGDIST) { 01577 // compute driving distance 01578 std::vector<const MSEdge*> edges; 01579 TraCIDijkstraRouter<MSEdge> router(MSEdge::dictSize()); 01580 01581 if ((roadPos1.roadId.compare(roadPos2.roadId) == 0) 01582 && (roadPos1.pos <= roadPos2.pos)) { 01583 distance = roadPos2.pos - roadPos1.pos; 01584 } else { 01585 router.compute(MSEdge::dictionary(roadPos1.roadId), MSEdge::dictionary(roadPos2.roadId), NULL, 01586 MSNet::getInstance()->getCurrentTimeStep(), edges); 01587 MSRoute route("", edges, false, RGBColor::DEFAULT_COLOR, std::vector<SUMOVehicleParameter::Stop>()); 01588 distance = static_cast<float>(route.getDistanceBetween(roadPos1.pos, roadPos2.pos, 01589 MSEdge::dictionary(roadPos1.roadId), MSEdge::dictionary(roadPos2.roadId))); 01590 } 01591 } else { 01592 // compute air distance (default) 01593 // correct the distance type in case it was not valid 01594 distType = REQUEST_AIRDIST; 01595 distance = static_cast<float>(pos1.distanceTo(pos2)); 01596 } 01597 01598 // acknowledge distance request 01599 writeStatusCmd(CMD_DISTANCEREQUEST, RTYPE_OK, ""); 01600 // write response command 01601 myOutputStorage.writeUnsignedByte(1 + 1 + 1 + 4); // length 01602 myOutputStorage.writeUnsignedByte(CMD_DISTANCEREQUEST); // command type 01603 myOutputStorage.writeUnsignedByte(distType); // distance type 01604 myOutputStorage.writeFloat(distance); // distance; 01605 return true; 01606 }
| bool TraCIServer::commandGetAllTLIds | ( | ) | throw (TraCIException) [private] |
Definition at line 944 of file TraCIServer.cpp.
References CMD_GETALLTLIDS, CMD_TLIDLIST, MSTLLogicControl::getAllTLIds(), MSNet::getInstance(), MSNet::getTLSControl(), RTYPE_ERR, and RTYPE_OK.
00944 { 00945 tcpip::Storage tempMsg; 00946 00947 // get the TLLogicControl 00948 MSTLLogicControl &tlsControl = MSNet::getInstance()->getTLSControl(); 00949 // get the ids 00950 std::vector<std::string> idList = tlsControl.getAllTLIds(); 00951 00952 if (idList.size() == 0) { 00953 // create negative response message 00954 writeStatusCmd(CMD_GETALLTLIDS, RTYPE_ERR, "Could not retrieve any traffic light id"); 00955 return false; 00956 } 00957 00958 // create positive response message 00959 writeStatusCmd(CMD_GETALLTLIDS, RTYPE_OK, ""); 00960 00961 // create a response command for each std::string id 00962 for (std::vector<std::string>::iterator iter = idList.begin(); iter != idList.end(); iter++) { 00963 // command length 00964 myOutputStorage.writeByte(2 + (4 + (*iter).size())); 00965 // command type 00966 myOutputStorage.writeByte(CMD_TLIDLIST); 00967 // id string 00968 myOutputStorage.writeString((*iter)); 00969 } 00970 return true; 00971 }
| bool TraCIServer::commandGetTLStatus | ( | ) | throw (TraCIException) [private] |
Definition at line 975 of file TraCIServer.cpp.
References CMD_GETTLSTATUS, CMD_TLSWITCH, DELTA_T, MSTrafficLightLogic::getCurrentPhaseDef(), MSTrafficLightLogic::getCurrentPhaseIndex(), MSEdge::getID(), MSTrafficLightLogic::getIndexFromOffset(), MSTrafficLightLogic::getLanesAt(), MSTrafficLightLogic::getLinks(), MSTrafficLightLogic::getPhase(), MSTrafficLightLogic::getPhaseIndexAtTime(), MSPhaseDefinition::getSignalState(), MSLink::LINKSTATE_TL_GREEN_MAJOR, MSLink::LINKSTATE_TL_GREEN_MINOR, MSLink::LINKSTATE_TL_OFF_BLINKING, MSLink::LINKSTATE_TL_OFF_NOSIGNAL, MSLink::LINKSTATE_TL_RED, MSLink::LINKSTATE_TL_YELLOW_MAJOR, MSLink::LINKSTATE_TL_YELLOW_MINOR, tcpip::Storage::reset(), RTYPE_ERR, RTYPE_OK, tcpip::Storage::size(), TLPHASE_BLINKING, TLPHASE_GREEN, TLPHASE_NOSIGNAL, TLPHASE_RED, tcpip::Storage::writeFloat(), tcpip::Storage::writeInt(), tcpip::Storage::writeString(), and tcpip::Storage::writeUnsignedByte().
00975 { 00976 SUMOTime lookback = 60*1000.; // Time to look in history for recognizing yellowTimes 00977 00978 tcpip::Storage tempMsg; 00979 00980 // trafic light id 00981 int extId = myInputStorage.readInt(); 00982 // start of time interval 00983 SUMOTime timeFrom = myInputStorage.readInt(); 00984 // end of time interval 00985 SUMOTime timeTo = myInputStorage.readInt(); 00986 00987 // get the running programm of the traffic light 00988 MSTrafficLightLogic* const tlLogic = getTLLogicByExtId(extId); 00989 00990 // error checking 00991 if (tlLogic == NULL) { 00992 writeStatusCmd(CMD_GETTLSTATUS, RTYPE_ERR, "Could not retrieve traffic light with given id"); 00993 return false; 00994 } 00995 if ((timeTo < timeFrom) || (timeTo < 0) || (timeFrom < 0)) { 00996 writeStatusCmd(CMD_GETTLSTATUS, RTYPE_ERR, "The given time interval is not valid"); 00997 return false; 00998 } 00999 01000 // acknowledge the request 01001 writeStatusCmd(CMD_GETTLSTATUS, RTYPE_OK, ""); 01002 std::vector<MSLink::LinkState> linkStates; 01003 std::vector<double> yellowTimes; 01004 size_t lastStep = tlLogic->getCurrentPhaseIndex(); 01005 MSPhaseDefinition phase = tlLogic->getCurrentPhaseDef(); 01006 MSTrafficLightLogic::LinkVectorVector affectedLinks = tlLogic->getLinks(); 01007 01008 // save the current link states 01009 for (int i = 0; i < affectedLinks.size(); i++) { 01010 linkStates.push_back(phase.getSignalState(i)); 01011 yellowTimes.push_back(-1); 01012 } 01013 01014 // check every second of the given time interval for a switch in the traffic light's phases 01015 for (SUMOTime time = timeFrom - lookback; time <= timeTo; time+=DELTA_T) { 01016 if (time < 0) time = 0; 01017 size_t position = tlLogic->getPhaseIndexAtTime(time); 01018 size_t currentStep = tlLogic->getIndexFromOffset(position); 01019 01020 if (currentStep != lastStep) { 01021 lastStep = currentStep; 01022 phase = tlLogic->getPhase(currentStep); 01023 01024 // for every link of the tl's junction, compare the actual and the last red/green state 01025 // for each link with new red/green status, write a TLSWITCH command 01026 std::map<const MSEdge*, pair<const MSEdge*, int> > writtenEdgePairs; 01027 for (int i = 0; i < linkStates.size(); i++) { 01028 MSLink::LinkState nextLinkState = phase.getSignalState(i); 01029 01030 if (nextLinkState == MSLink::LINKSTATE_TL_YELLOW_MAJOR || nextLinkState == MSLink::LINKSTATE_TL_YELLOW_MINOR) { 01031 if (yellowTimes[i] < 0) yellowTimes[i] = time; 01032 } else { 01033 if (nextLinkState != linkStates[i] && time >= timeFrom) { 01034 linkStates[i] = nextLinkState; 01035 01036 // get the group of links that is affected by the changed light status 01037 MSTrafficLightLogic::LinkVector linkGroup = affectedLinks[i]; 01038 // get the group of preceding lanes of the link group 01039 MSTrafficLightLogic::LaneVector laneGroup = tlLogic->getLanesAt(i); 01040 01041 for (int j = 0; j < linkGroup.size(); j++) { 01042 MSEdge &precEdge = laneGroup[j]->getEdge(); 01043 MSEdge &succEdge = linkGroup[j]->getLane()->getEdge(); 01044 01045 // for each pair of edges and every different tl state, write only one tl switch command 01046 std::map<const MSEdge*, pair<const MSEdge*, int> >::iterator itPair = writtenEdgePairs.find(&precEdge); 01047 if (itPair != writtenEdgePairs.end()) { 01048 if (itPair->second.first == &succEdge && itPair->second.second == nextLinkState) { 01049 continue; 01050 } 01051 } 01052 // remember the current edge pair and tl status 01053 writtenEdgePairs[&precEdge] = std::make_pair(&succEdge, nextLinkState); 01054 01055 // time of the switch 01056 tempMsg.writeInt(time); 01057 // preceeding edge id 01058 tempMsg.writeString(precEdge.getID()); 01059 // traffic light's position on preceeding edge 01060 tempMsg.writeFloat(laneGroup[j]->getShape().length()); 01061 // succeeding edge id 01062 tempMsg.writeString(succEdge.getID()); 01063 // new status 01064 switch (nextLinkState) { 01065 case MSLink::LINKSTATE_TL_GREEN_MAJOR: 01066 case MSLink::LINKSTATE_TL_GREEN_MINOR: 01067 tempMsg.writeUnsignedByte(TLPHASE_GREEN); 01068 break; 01069 case MSLink::LINKSTATE_TL_RED: 01070 tempMsg.writeUnsignedByte(TLPHASE_RED); 01071 break; 01072 case MSLink::LINKSTATE_TL_OFF_BLINKING: 01073 tempMsg.writeUnsignedByte(TLPHASE_BLINKING); 01074 break; 01075 case MSLink::LINKSTATE_TL_OFF_NOSIGNAL: 01076 tempMsg.writeUnsignedByte(TLPHASE_NOSIGNAL); 01077 break; 01078 default: 01079 tempMsg.writeUnsignedByte(TLPHASE_NOSIGNAL); 01080 } 01081 //yellow time 01082 tempMsg.writeInt(yellowTimes[i]<0 ? 0 : time - yellowTimes[i]); 01083 01084 if (tempMsg.size() <= 253) { 01085 // command length 01086 myOutputStorage.writeUnsignedByte(1 + 1 + tempMsg.size()); 01087 } else { 01088 // command length extended 01089 myOutputStorage.writeUnsignedByte(0); 01090 myOutputStorage.writeInt(1 + 4 + 1 + tempMsg.size()); 01091 } 01092 // command type 01093 myOutputStorage.writeUnsignedByte(CMD_TLSWITCH); 01094 // command content 01095 myOutputStorage.writeStorage(tempMsg); 01096 tempMsg.reset(); 01097 } 01098 } 01099 yellowTimes[i] = -1; 01100 } 01101 } 01102 } 01103 } 01104 return true; 01105 }
| bool TraCIServer::commandPositionConversion | ( | ) | throw (TraCIException) [private] |
Definition at line 1259 of file TraCIServer.cpp.
References CMD_POSITIONCONVERSION, traci::TraCIServer::RoadMapPos::laneId, traci::TraCIServer::RoadMapPos::pos, POSITION_2_5D, POSITION_2D, POSITION_3D, POSITION_ROADMAP, traci::TraCIServer::RoadMapPos::roadId, RTYPE_ERR, RTYPE_OK, tcpip::Storage::size(), traci::TraCIException::what(), tcpip::Storage::writeFloat(), tcpip::Storage::writeString(), tcpip::Storage::writeUnsignedByte(), Position2D::x(), and Position2D::y().
01259 { 01260 tcpip::Storage tmpResult; 01261 RoadMapPos roadPos; 01262 Position2D cartesianPos; 01263 float x = 0; 01264 float y = 0; 01265 float z = 0; 01266 unsigned char destPosType; 01267 01268 // actual position type that will be converted 01269 unsigned char srcPosType = myInputStorage.readUnsignedByte(); 01270 01271 switch (srcPosType) { 01272 case POSITION_2D: 01273 case POSITION_2_5D: 01274 case POSITION_3D: 01275 x = myInputStorage.readFloat(); 01276 y = myInputStorage.readFloat(); 01277 if (srcPosType != POSITION_2D) { 01278 z = myInputStorage.readFloat(); 01279 } 01280 // destination position type 01281 destPosType = myInputStorage.readUnsignedByte(); 01282 01283 switch (destPosType) { 01284 case POSITION_ROADMAP: 01285 // convert road map to 3D position 01286 roadPos = convertCartesianToRoadMap(Position2D(x, y)); 01287 01288 // write result that is added to response msg 01289 tmpResult.writeUnsignedByte(POSITION_ROADMAP); 01290 tmpResult.writeString(roadPos.roadId); 01291 tmpResult.writeFloat(roadPos.pos); 01292 tmpResult.writeUnsignedByte(roadPos.laneId); 01293 break; 01294 case POSITION_3D: 01295 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_ERR, 01296 "Destination position type is same as source position type"); 01297 return false; 01298 default: 01299 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_ERR, 01300 "Destination position type not supported"); 01301 return false; 01302 } 01303 break; 01304 case POSITION_ROADMAP: 01305 roadPos.roadId = myInputStorage.readString(); 01306 roadPos.pos = myInputStorage.readFloat(); 01307 roadPos.laneId = myInputStorage.readUnsignedByte(); 01308 01309 // destination position type 01310 destPosType = myInputStorage.readUnsignedByte(); 01311 01312 switch (destPosType) { 01313 case POSITION_2D: 01314 case POSITION_2_5D: 01315 case POSITION_3D: 01316 //convert 3D to road map position 01317 try { 01318 Position2D result = convertRoadMapToCartesian(roadPos); 01319 x = result.x(); 01320 y = result.y(); 01321 } catch (TraCIException &e) { 01322 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_ERR, e.what()); 01323 return false; 01324 } 01325 01326 // write result that is added to response msg 01327 tmpResult.writeUnsignedByte(destPosType); 01328 tmpResult.writeFloat(x); 01329 tmpResult.writeFloat(y); 01330 if (destPosType != POSITION_2D) { 01331 tmpResult.writeFloat(z); 01332 } 01333 break; 01334 case POSITION_ROADMAP: 01335 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_ERR, 01336 "Destination position type is same as source position type"); 01337 return false; 01338 default: 01339 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_ERR, 01340 "Destination position type not supported"); 01341 return false; 01342 } 01343 break; 01344 default: 01345 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_ERR, 01346 "Source position type not supported"); 01347 return false; 01348 } 01349 01350 // write response message 01351 writeStatusCmd(CMD_POSITIONCONVERSION, RTYPE_OK, ""); 01352 // add converted Position to response 01353 myOutputStorage.writeUnsignedByte(1 + 1 + tmpResult.size() + 1); // length 01354 myOutputStorage.writeUnsignedByte(CMD_POSITIONCONVERSION); // command id 01355 myOutputStorage.writeStorage(tmpResult); // position dependant part 01356 myOutputStorage.writeUnsignedByte(destPosType); // destination type 01357 return true; 01358 }
| bool TraCIServer::commandScenario | ( | ) | throw (TraCIException) [private] |
Definition at line 1363 of file TraCIServer.cpp.
References CMD_SCENARIO, DOM_POI, DOM_POLYGON, DOM_ROADMAP, DOM_TRAFFICLIGHTS, DOM_VEHICLE, RTYPE_ERR, RTYPE_OK, tcpip::Storage::size(), and traci::TraCIException::what().
01363 { 01364 Storage tmpResult; 01365 std::string warning = ""; // additional description for response 01366 01367 // read/write flag 01368 bool isWriteCommand = myInputStorage.readUnsignedByte(); 01369 01370 // domain 01371 int domain = myInputStorage.readUnsignedByte(); 01372 01373 try { 01374 switch (domain) { 01375 case DOM_ROADMAP: 01376 warning = handleRoadMapDomain(isWriteCommand, tmpResult); 01377 break; 01378 case DOM_VEHICLE: 01379 warning = handleVehicleDomain(isWriteCommand, tmpResult); 01380 break; 01381 case DOM_TRAFFICLIGHTS: 01382 warning = handleTrafficLightDomain(isWriteCommand, tmpResult); 01383 break; 01384 case DOM_POI: 01385 warning = handlePoiDomain(isWriteCommand, tmpResult); 01386 break; 01387 case DOM_POLYGON: 01388 warning = handlePolygonDomain(isWriteCommand, tmpResult); 01389 break; 01390 default: 01391 writeStatusCmd(CMD_SCENARIO, RTYPE_ERR, "Unknown domain specified"); 01392 return false; 01393 } 01394 } catch (TraCIException &e) { 01395 writeStatusCmd(CMD_SCENARIO, RTYPE_ERR, e.what()); 01396 return false; 01397 } 01398 01399 // write response message 01400 writeStatusCmd(CMD_SCENARIO, RTYPE_OK, warning); 01401 // if necessary, add Scenario command containing the read value 01402 if (!isWriteCommand) { 01403 if (tmpResult.size() <= 253) { 01404 myOutputStorage.writeUnsignedByte(1 + 1 + tmpResult.size()); // command length 01405 myOutputStorage.writeUnsignedByte(CMD_SCENARIO); // command id 01406 myOutputStorage.writeStorage(tmpResult); // variable dependant part 01407 } else { 01408 myOutputStorage.writeUnsignedByte(0); // command length -> extended 01409 myOutputStorage.writeInt(1 + 4 + 1 + tmpResult.size()); 01410 myOutputStorage.writeUnsignedByte(CMD_SCENARIO); // command id 01411 myOutputStorage.writeStorage(tmpResult); // variable dependant part 01412 } 01413 } 01414 return true; 01415 }
| bool TraCIServer::commandSetMaximumSpeed | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 508 of file TraCIServer.cpp.
References CMD_SETMAXSPEED, RTYPE_ERR, RTYPE_OK, MSVehicle::setIndividualMaxSpeed(), and MSVehicle::unsetIndividualMaxSpeed().
00508 { 00509 MSVehicle* veh = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 00510 float maxspeed = myInputStorage.readFloat(); 00511 00512 if (veh == NULL) { 00513 writeStatusCmd(CMD_SETMAXSPEED, RTYPE_ERR, "Can not retrieve node with given ID"); 00514 return false; 00515 } 00516 00517 if (maxspeed>=0.0) { 00518 veh->setIndividualMaxSpeed(maxspeed); 00519 } else { 00520 veh->unsetIndividualMaxSpeed(); 00521 } 00522 00523 // create a reply message 00524 writeStatusCmd(CMD_SETMAXSPEED, RTYPE_OK, ""); 00525 00526 return true; 00527 }
| bool TraCIServer::commandSimulationParameter | ( | ) | throw (TraCIException) [private] |
Definition at line 1154 of file TraCIServer.cpp.
References CMD_SIMPARAMETER, MSVehicle::getPosition(), RTYPE_ERR, RTYPE_NOTIMPLEMENTED, RTYPE_OK, tcpip::Storage::size(), tcpip::Storage::writeFloat(), Position2D::x(), and Position2D::y().
01154 { 01155 bool setParameter = (myInputStorage.readByte() != 0); 01156 std::string parameter = myInputStorage.readString(); 01157 01158 // Prepare response 01159 tcpip::Storage answerTmp; 01160 01161 if (parameter.compare("maxX")) { 01162 if (setParameter) { 01163 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "maxX is a read only parameter"); 01164 return false; 01165 } else { 01166 answerTmp.writeFloat(getNetBoundary().getWidth()); 01167 } 01168 } else if (parameter.compare("maxY")) { 01169 if (setParameter) { 01170 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "maxY is a read only parameter"); 01171 return false; 01172 } else { 01173 answerTmp.writeFloat(getNetBoundary().getHeight()); 01174 } 01175 } else if (parameter.compare("numberOfNodes")) { 01176 if (setParameter) { 01177 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "numberOfNodes is a read only parameter"); 01178 return false; 01179 } else { 01180 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_NOTIMPLEMENTED, "numberOfNodes not implemented yet"); 01181 return false; 01182 //answerTmp.writeInt( --- Don't know where to get that information ---); 01183 } 01184 } else if (parameter.compare("airDistance")) { 01185 MSVehicle* veh1 = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 01186 MSVehicle* veh2 = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 01187 01188 if (veh1 != NULL && veh2 != NULL) { 01189 if (setParameter) { 01190 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "airDistance is a read only parameter"); 01191 return false; 01192 } else { 01193 float dx = veh1->getPosition().x() - veh2->getPosition().x(); 01194 float dy = veh1->getPosition().y() - veh2->getPosition().y(); 01195 answerTmp.writeFloat(sqrt(dx * dx + dy * dy)); 01196 } 01197 } else { 01198 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "Can not retrieve node with given ID"); 01199 return false; 01200 } 01201 } else if (parameter.compare("drivingDistance")) { 01202 MSVehicle* veh1 = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 01203 MSVehicle* veh2 = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 01204 01205 if (veh1 != NULL && veh2 != NULL) { 01206 if (setParameter) { 01207 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "airDistance is a read only parameter"); 01208 return false; 01209 } else { 01210 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_NOTIMPLEMENTED, "drivingDistance not implemented yet"); 01211 return false; 01212 //float dx = veh1->getPosition().x() - veh2->getPosition().x(); 01213 //float dy = veh1->getPosition().y() - veh2->getPosition().y(); 01214 //float distance = sqrt( dx * dx + dy * dy ); 01215 // answerTmp.writeFloat( distance ); 01216 } 01217 } else { 01218 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_ERR, "Can not retrieve node with given ID"); 01219 return false; 01220 } 01221 } 01222 01223 // When we get here, the response is stored in answerTmp -> put into myOutputStorage 01224 writeStatusCmd(CMD_SIMPARAMETER, RTYPE_OK, ""); 01225 01226 // command length 01227 myOutputStorage.writeUnsignedByte(1 + 1 + 1 + 4 + static_cast<int>(parameter.length()) + answerTmp.size()); 01228 // command type 01229 myOutputStorage.writeUnsignedByte(CMD_SIMPARAMETER); 01230 // answer only to getParameter commands as setParameter 01231 myOutputStorage.writeUnsignedByte(1); 01232 // Parameter 01233 myOutputStorage.writeString(parameter); 01234 // and the parameter dependant part 01235 myOutputStorage.writeStorage(answerTmp); 01236 return true; 01237 }
| bool TraCIServer::commandSlowDown | ( | ) | throw (TraCIException) [private] |
Definition at line 1110 of file TraCIServer.cpp.
References CMD_SLOWDOWN, MSNet::getCurrentTimeStep(), MSNet::getInstance(), MAX2(), RTYPE_ERR, RTYPE_OK, and MSVehicle::startSpeedAdaption().
01110 { 01111 // NodeId 01112 MSVehicle* veh = getVehicleByExtId(myInputStorage.readInt()); // external node id (equipped vehicle number) 01113 // speed 01114 float newSpeed = MAX2(myInputStorage.readFloat(), 0.0f); 01115 // time interval 01116 SUMOTime duration = myInputStorage.readInt(); 01117 01118 if (veh == NULL) { 01119 writeStatusCmd(CMD_SLOWDOWN, RTYPE_ERR, "Can not retrieve node with given ID"); 01120 return false; 01121 } 01122 /*if (newSpeed < 0) { 01123 writeStatusCmd(CMD_SLOWDOWN, RTYPE_ERR, "Negative speed value"); 01124 return false; 01125 }*/ 01126 if (duration <= 0) { 01127 writeStatusCmd(CMD_SLOWDOWN, RTYPE_ERR, "Invalid time interval"); 01128 return false; 01129 } 01130 01131 if (!veh->startSpeedAdaption(newSpeed, duration, MSNet::getInstance()->getCurrentTimeStep())) { 01132 writeStatusCmd(CMD_SLOWDOWN, RTYPE_ERR, "Could not slow down"); 01133 return false; 01134 } 01135 01136 // create positive response message 01137 writeStatusCmd(CMD_SLOWDOWN, RTYPE_OK, ""); 01138 return true; 01139 }
| bool TraCIServer::commandStopNode | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 716 of file TraCIServer.cpp.
References MSVehicle::addTraciStop(), CMD_STOP, MSEdge::dictionary(), MSLane::getID(), MSEdge::getLanes(), traci::TraCIServer::RoadMapPos::laneId, MSEdge::leftLane(), traci::TraCIServer::RoadMapPos::pos, POSITION_2D, POSITION_3D, POSITION_ROADMAP, MSEdge::rightLane(), traci::TraCIServer::RoadMapPos::roadId, RTYPE_ERR, and RTYPE_OK.
00716 { 00717 //std::string roadID; 00718 //float lanePos; 00719 //unsigned char laneIndex; 00720 RoadMapPos roadPos; 00721 MSLane* actLane; 00722 00723 // NodeId 00724 int nodeId = myInputStorage.readInt(); 00725 MSVehicle* veh = getVehicleByExtId(nodeId); // external node id (equipped vehicle number) 00726 00727 if (veh == NULL) { 00728 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Can not retrieve node with given ID"); 00729 return false; 00730 } 00731 00732 // StopPosition 00733 unsigned char posType = myInputStorage.readUnsignedByte(); // position type 00734 switch (posType) { 00735 case POSITION_ROADMAP: 00736 // read road map position 00737 roadPos.roadId = myInputStorage.readString(); 00738 roadPos.pos = myInputStorage.readFloat(); 00739 roadPos.laneId = myInputStorage.readUnsignedByte(); 00740 break; 00741 case POSITION_2D: 00742 case POSITION_3D: 00743 // convert other position type to road map position 00744 { 00745 float x = myInputStorage.readFloat(); 00746 float y = myInputStorage.readFloat(); 00747 roadPos = convertCartesianToRoadMap(Position2D(x,y)); 00748 } 00749 if (posType == POSITION_3D) { 00750 myInputStorage.readFloat(); // z value is ignored 00751 } 00752 break; 00753 default: 00754 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Not supported or unknown Position Format"); 00755 return false; 00756 } 00757 00758 // Radius 00759 float radius = myInputStorage.readFloat(); 00760 // waitTime 00761 SUMOTime waitTime = myInputStorage.readInt(); 00762 00763 if (roadPos.pos < 0) { 00764 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Position on lane must not be negative"); 00765 return false; 00766 } 00767 00768 // get the actual lane that is referenced by laneIndex 00769 MSEdge* road = MSEdge::dictionary(roadPos.roadId); 00770 if (road == NULL) { 00771 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Unable to retrieve road with given id"); 00772 return false; 00773 } 00774 00775 const std::vector<MSLane*> &allLanes = road->getLanes(); 00776 if (roadPos.laneId >= allLanes.size()) { 00777 writeStatusCmd(CMD_STOP, RTYPE_ERR, "No lane existing with such id on the given road"); 00778 return false; 00779 } 00780 00781 actLane = allLanes[0]; 00782 int index = 0; 00783 while (road->rightLane(actLane) != NULL) { 00784 actLane = road->rightLane(actLane); 00785 index++; 00786 } 00787 actLane = allLanes[0]; 00788 if (index < roadPos.laneId) { 00789 for (int i=0; i < (roadPos.laneId - index); i++) { 00790 actLane = road->leftLane(actLane); 00791 } 00792 } else { 00793 for (int i=0; i < (index - roadPos.laneId); i++) { 00794 actLane = road->rightLane(actLane); 00795 } 00796 } 00797 00798 // Forward command to vehicle 00799 if (!veh->addTraciStop(actLane, roadPos.pos, radius, waitTime)) { 00800 writeStatusCmd(CMD_STOP, RTYPE_ERR, "Vehicle is too close or behind the stop on " + actLane->getID()); 00801 return false; 00802 } 00803 00804 // create a reply message 00805 writeStatusCmd(CMD_STOP, RTYPE_OK, ""); 00806 // add a stopnode command containging the actually used road map position to the reply 00807 int length = 1 + 1 + 4 + 1 + (4+roadPos.roadId.length()) + 4 + 1 + 4 + 4; 00808 myOutputStorage.writeUnsignedByte(length); // lenght 00809 myOutputStorage.writeUnsignedByte(CMD_STOP); // command id 00810 myOutputStorage.writeInt(nodeId); // node id 00811 myOutputStorage.writeUnsignedByte(POSITION_ROADMAP); // pos format 00812 myOutputStorage.writeString(roadPos.roadId); // road id 00813 myOutputStorage.writeFloat(roadPos.pos); // pos 00814 myOutputStorage.writeUnsignedByte(roadPos.laneId); // lane id 00815 myOutputStorage.writeFloat(radius); // radius 00816 myOutputStorage.writeInt(waitTime); // wait time 00817 00818 return true; 00819 }
| bool TraCIServer::commandSubscribeDomain | ( | ) | throw (TraCIException) [private] |
Definition at line 1661 of file TraCIServer.cpp.
References CMD_SUBSCRIBEDOMAIN, DOM_VEHICLE, DOMVAR_ALLOWED_SPEED, DOMVAR_ANGLE, DOMVAR_CO2EMISSION, DOMVAR_COEMISSION, DOMVAR_FUELCONSUMPTION, DOMVAR_HCEMISSION, DOMVAR_NOXEMISSION, DOMVAR_PMXEMISSION, DOMVAR_POSITION, DOMVAR_SIMTIME, DOMVAR_SPEED, POSITION_2D, POSITION_ROADMAP, RTYPE_NOTIMPLEMENTED, RTYPE_OK, TYPE_DOUBLE, and TYPE_FLOAT.
01661 { 01662 // domain 01663 int domainId = myInputStorage.readUnsignedByte(); 01664 01665 if (domainId != DOM_VEHICLE) { 01666 // send negative command response 01667 writeStatusCmd(CMD_SUBSCRIBEDOMAIN, RTYPE_NOTIMPLEMENTED, "Can only subscribe to DOM_VEHICLE at this time"); 01668 return false; 01669 } 01670 01671 // variable count 01672 int variableCount = myInputStorage.readUnsignedByte(); 01673 01674 // list of variable ids and types 01675 std::list<std::pair<int, int> > subscribedVariables; 01676 for (int i = 0; i < variableCount; i++) { 01677 // variable id 01678 int variableId = myInputStorage.readUnsignedByte(); 01679 01680 // value data type 01681 int dataType = myInputStorage.readUnsignedByte(); 01682 01683 if (!( 01684 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_SIMTIME) && (dataType == TYPE_DOUBLE)) 01685 || 01686 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_SPEED) && (dataType == TYPE_FLOAT)) 01687 || 01688 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_ALLOWED_SPEED) && (dataType == TYPE_FLOAT)) 01689 || 01690 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_POSITION) && (dataType == POSITION_2D)) 01691 || 01692 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_POSITION) && (dataType == POSITION_ROADMAP)) 01693 || 01694 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_ANGLE) && (dataType == TYPE_FLOAT)) 01695 || 01696 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_CO2EMISSION) && (dataType == TYPE_FLOAT)) 01697 || 01698 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_COEMISSION) && (dataType == TYPE_FLOAT)) 01699 || 01700 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_HCEMISSION) && (dataType == TYPE_FLOAT)) 01701 || 01702 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_PMXEMISSION) && (dataType == TYPE_FLOAT)) 01703 || 01704 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_NOXEMISSION) && (dataType == TYPE_FLOAT)) 01705 || 01706 ((domainId == DOM_VEHICLE) && (variableId == DOMVAR_FUELCONSUMPTION) && (dataType == TYPE_FLOAT)) 01707 )) { 01708 // send negative command response 01709 writeStatusCmd(CMD_SUBSCRIBEDOMAIN, RTYPE_NOTIMPLEMENTED, "Can not subscribe to this domain/variable/type combination"); 01710 return false; 01711 } 01712 01713 subscribedVariables.push_back(std::pair<int, int>(variableId, dataType)); 01714 } 01715 01716 // store subscription 01717 myDomainSubscriptions[domainId] = subscribedVariables; 01718 01719 // send positive command response 01720 writeStatusCmd(CMD_SUBSCRIBEDOMAIN, RTYPE_OK, ""); 01721 return true; 01722 }
| bool TraCIServer::commandSubscribeLifecycles | ( | ) | throw (TraCIException) [private] |
Definition at line 1611 of file TraCIServer.cpp.
References CMD_SUBSCRIBELIFECYCLES, DOM_VEHICLE, RTYPE_NOTIMPLEMENTED, and RTYPE_OK.
01611 { 01612 // domain 01613 int domain = myInputStorage.readUnsignedByte(); 01614 01615 if (domain != DOM_VEHICLE) { 01616 // send negative command response 01617 writeStatusCmd(CMD_SUBSCRIBELIFECYCLES, RTYPE_NOTIMPLEMENTED, "Can only subscribe to lifecycle of DOM_VEHICLE at this time"); 01618 return false; 01619 } 01620 01621 myLifecycleSubscriptions.insert(domain); 01622 01623 if (domain == DOM_VEHICLE) { 01624 myCreatedVehicles.clear(); 01625 myDestroyedVehicles.clear(); 01626 } 01627 01628 // send positive command response 01629 writeStatusCmd(CMD_SUBSCRIBELIFECYCLES, RTYPE_OK, ""); 01630 return true; 01631 }
| bool TraCIServer::commandUnsubscribeDomain | ( | ) | throw (TraCIException) [private] |
Definition at line 1727 of file TraCIServer.cpp.
References CMD_UNSUBSCRIBEDOMAIN, DOM_VEHICLE, RTYPE_NOTIMPLEMENTED, and RTYPE_OK.
01727 { 01728 // domain 01729 int domain = myInputStorage.readUnsignedByte(); 01730 01731 if (domain != DOM_VEHICLE) { 01732 // send negative command response 01733 writeStatusCmd(CMD_UNSUBSCRIBEDOMAIN, RTYPE_NOTIMPLEMENTED, "Can only subscribe to lifecycle of DOM_VEHICLE at this time"); 01734 return false; 01735 } 01736 01737 myDomainSubscriptions.erase(domain); 01738 01739 // send positive command response 01740 writeStatusCmd(CMD_UNSUBSCRIBEDOMAIN, RTYPE_OK, ""); 01741 return true; 01742 }
| bool TraCIServer::commandUnsubscribeLifecycles | ( | ) | throw (TraCIException) [private] |
Definition at line 1636 of file TraCIServer.cpp.
References CMD_UNSUBSCRIBELIFECYCLES, DOM_VEHICLE, RTYPE_NOTIMPLEMENTED, and RTYPE_OK.
01636 { 01637 // domain 01638 int domain = myInputStorage.readUnsignedByte(); 01639 01640 if (domain != DOM_VEHICLE) { 01641 // send negative command response 01642 writeStatusCmd(CMD_UNSUBSCRIBELIFECYCLES, RTYPE_NOTIMPLEMENTED, "Can only subscribe to lifecycle of DOM_VEHICLE at this time"); 01643 return false; 01644 } 01645 01646 myLifecycleSubscriptions.erase(domain); 01647 01648 if (domain == DOM_VEHICLE) { 01649 myCreatedVehicles.clear(); 01650 myDestroyedVehicles.clear(); 01651 } 01652 01653 // send positive command response 01654 writeStatusCmd(CMD_UNSUBSCRIBELIFECYCLES, RTYPE_OK, ""); 01655 return true; 01656 }
| bool TraCIServer::commandUpdateCalibrator | ( | ) | throw (TraCIException) [private] |
Definition at line 1242 of file TraCIServer.cpp.
References MSCalibrator::updateCalibrator().
01242 { 01243 myOutputStorage.reset(); 01244 01245 int countTime = myInputStorage.readInt(); 01246 int vehicleCount = myInputStorage.readInt(); 01247 std::string calibratorId = myInputStorage.readString(); 01248 01249 MSCalibrator::updateCalibrator(calibratorId, countTime, vehicleCount); 01250 01251 //@TODO write response according to result of updateCalibrator 01252 01253 return true; 01254 }
| TraCIServer::RoadMapPos TraCIServer::convertCartesianToRoadMap | ( | Position2D | pos | ) | [private] |
Converts a cartesian position to the closest road map position
| pos | cartesian position that is to be converted |
Definition at line 1889 of file TraCIServer.cpp.
References GeomHelper::closestDistancePointLine(), MSEdge::dictionary(), Position2D::distanceTo(), MSNet::getEdgeControl(), MSEdgeControl::getEdgeNames(), MSNet::getInstance(), MSEdge::getLanes(), MSLane::getRightLane(), traci::TraCIServer::RoadMapPos::laneId, traci::TraCIServer::RoadMapPos::pos, traci::TraCIServer::RoadMapPos::roadId, Position2DVector::size(), SUMOReal, Position2D::x(), and Position2D::y().
01889 { 01890 RoadMapPos result; 01891 std::vector<std::string> allEdgeIds; 01892 MSEdge* edge; 01893 Position2D lineStart; 01894 Position2D lineEnd; 01895 double minDistance = HUGE_VAL; 01896 SUMOReal newDistance; 01897 Position2D intersection; 01898 MSLane* tmpLane; 01899 01900 01901 allEdgeIds = MSNet::getInstance()->getEdgeControl().getEdgeNames(); 01902 01903 // iterate through all known edges 01904 for (std::vector<std::string>::iterator itId = allEdgeIds.begin(); itId != allEdgeIds.end(); itId++) { 01905 edge = MSEdge::dictionary((*itId)); 01906 const std::vector<MSLane*> &allLanes = edge->getLanes(); 01907 01908 // cerr << "--------" << endl << "Checking edge " << edge->getID() << endl << "--------" << endl; 01909 01910 // iterate through all lanes of this edge 01911 for (std::vector<MSLane*>::const_iterator itLane = allLanes.begin(); itLane != allLanes.end(); itLane++) { 01912 Position2DVector shape = (*itLane)->getShape(); 01913 01914 // cerr << "### Lane: " << (*itLane)->getID() << endl; 01915 01916 // iterate through all segments of this lane's shape 01917 for (int i = 0; i < shape.size()-1; i++) { 01918 lineStart = shape[i]; 01919 lineEnd = shape[i+1]; 01920 01921 // cerr << "-Segment " << i << "(" << shape[i] << " - " << shape[i+1] << "): "; 01922 01923 // if this line is no candidate for lying closer to the cartesian position 01924 // than the line determined so far, skip it 01925 if ((lineStart.y() > (pos.y()+minDistance) && lineEnd.y() > (pos.y()+minDistance)) 01926 || (lineStart.y() < (pos.y()-minDistance) && lineEnd.y() < (pos.y()-minDistance)) 01927 || (lineStart.x() > (pos.x()+minDistance) && lineEnd.x() > (pos.x()+minDistance)) 01928 || (lineStart.x() < (pos.x()-minDistance) && lineEnd.x() < (pos.x()-minDistance))) { 01929 01930 // cerr << "skipping (minDistance = " << minDistance << ")" << endl; 01931 01932 continue; 01933 } else { 01934 // else compute the distance and check it 01935 newDistance = GeomHelper::closestDistancePointLine(pos, lineStart, lineEnd, intersection); 01936 01937 // cerr << "not skipping. "; 01938 01939 if (newDistance < minDistance && newDistance != -1.0) { 01940 // new distance is shorter: save the found road map position 01941 minDistance = newDistance; 01942 result.roadId = (*itId); 01943 result.laneId = 0; 01944 tmpLane = (*itLane); 01945 while ((tmpLane =tmpLane->getRightLane()) != NULL) { 01946 result.laneId++; 01947 } 01948 result.pos = lineStart.distanceTo(intersection); 01949 for (int j = 0; j < i; j++) { 01950 result.pos += shape[j].distanceTo(shape[j+1]); 01951 } 01952 01953 // cerr << "Saved new pos: " << result.pos << ", intersec at (" << intersection.x() << "," << intersection.y() 01954 // << "), minDistance = " << minDistance; 01955 } 01956 01957 // cerr << endl; 01958 } 01959 } 01960 } 01961 } 01962 01963 return result; 01964 }
| void TraCIServer::convertExt2IntId | ( | int | extId, | |
| std::string & | intId | |||
| ) | [private] |
Definition at line 1771 of file TraCIServer.cpp.
01771 { 01772 if (isMapChanged_) { 01773 isMapChanged_ = false; 01774 ext2intId.clear(); 01775 for (map<std::string, int>::const_iterator iter = equippedVehicles_.begin(); iter != equippedVehicles_.end(); ++iter) { 01776 if (iter->second > -1) { 01777 ext2intId[iter->second] = iter->first; 01778 } 01779 } 01780 } 01781 01782 // Search for external-Id-int and return internal-Id-string 01783 map<int, std::string>::const_iterator it = ext2intId.find(extId); 01784 if (it != ext2intId.end()) intId = it->second; 01785 else intId = ""; 01786 }
| Position2D TraCIServer::convertRoadMapToCartesian | ( | TraCIServer::RoadMapPos | pos | ) | throw (TraCIException) [private] |
Converts a road map position to a cartesian position
| pos | road map position that is to be convertes |
Definition at line 1969 of file TraCIServer.cpp.
References MSEdge::dictionary(), MSEdge::getLanes(), and Position2DVector::positionAtLengthPosition().
01970 { 01971 if (roadPos.pos < 0) { 01972 throw TraCIException("Position on lane must not be negative"); 01973 } 01974 01975 // get the edge and lane of this road map position 01976 MSEdge* road = MSEdge::dictionary(roadPos.roadId); 01977 if (road == NULL) { 01978 throw TraCIException("Unable to retrieve road with given id"); 01979 } 01980 01981 const std::vector<MSLane*> &allLanes = road->getLanes(); 01982 if ((roadPos.laneId >= allLanes.size()) || (allLanes.size() == 0)) { 01983 throw TraCIException("No lane existing with such id on the given road"); 01984 } 01985 01986 // get corresponding x and y coordinates 01987 Position2DVector shape = allLanes[roadPos.laneId]->getShape(); 01988 return shape.positionAtLengthPosition(roadPos.pos); 01989 }
| int TraCIServer::dispatchCommand | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 339 of file TraCIServer.cpp.
References CMD_ADDVEHICLE, CMD_CHANGELANE, CMD_CHANGEROUTE, CMD_CHANGETARGET, CMD_CLOSE, CMD_DISTANCEREQUEST, CMD_GET_EDGE_VARIABLE, CMD_GET_INDUCTIONLOOP_VARIABLE, CMD_GET_JUNCTION_VARIABLE, CMD_GET_LANE_VARIABLE, CMD_GET_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE, CMD_GET_POI_VARIABLE, CMD_GET_POLYGON_VARIABLE, CMD_GET_ROUTE_VARIABLE, CMD_GET_SIM_VARIABLE, CMD_GET_TL_VARIABLE, CMD_GET_VEHICLE_VARIABLE, CMD_GET_VEHICLETYPE_VARIABLE, CMD_GETALLTLIDS, CMD_GETTLSTATUS, CMD_POSITIONCONVERSION, CMD_SCENARIO, CMD_SET_EDGE_VARIABLE, CMD_SET_LANE_VARIABLE, CMD_SET_POI_VARIABLE, CMD_SET_POLYGON_VARIABLE, CMD_SET_TL_VARIABLE, CMD_SET_VEHICLE_VARIABLE, CMD_SETMAXSPEED, CMD_SIMSTEP, CMD_SIMSTEP2, CMD_SLOWDOWN, CMD_STOP, CMD_SUBSCRIBE_EDGE_VARIABLE, CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE, CMD_SUBSCRIBE_JUNCTION_VARIABLE, CMD_SUBSCRIBE_LANE_VARIABLE, CMD_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE, CMD_SUBSCRIBE_POI_VARIABLE, CMD_SUBSCRIBE_POLYGON_VARIABLE, CMD_SUBSCRIBE_ROUTE_VARIABLE, CMD_SUBSCRIBE_SIM_VARIABLE, CMD_SUBSCRIBE_TL_VARIABLE, CMD_SUBSCRIBE_VEHICLE_VARIABLE, CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE, CMD_SUBSCRIBEDOMAIN, CMD_SUBSCRIBELIFECYCLES, CMD_UNSUBSCRIBEDOMAIN, CMD_UNSUBSCRIBELIFECYCLES, CMD_UPDATECALIBRATOR, DELTA_T, TraCIServerAPI_Simulation::processGet(), TraCIServerAPI_Edge::processGet(), TraCIServerAPI_Junction::processGet(), TraCIServerAPI_Polygon::processGet(), TraCIServerAPI_POI::processGet(), TraCIServerAPI_Route::processGet(), TraCIServerAPI_VehicleType::processGet(), TraCIServerAPI_Vehicle::processGet(), TraCIServerAPI_Lane::processGet(), TraCIServerAPI_TLS::processGet(), TraCIServerAPI_MeMeDetector::processGet(), TraCIServerAPI_InductionLoop::processGet(), TraCIServerAPI_Edge::processSet(), TraCIServerAPI_Polygon::processSet(), TraCIServerAPI_POI::processSet(), TraCIServerAPI_Vehicle::processSet(), TraCIServerAPI_Lane::processSet(), TraCIServerAPI_TLS::processSet(), RTYPE_ERR, RTYPE_NOTIMPLEMENTED, and SUMOReal.
00340 { 00341 int commandStart = myInputStorage.position(); 00342 int commandLength = myInputStorage.readUnsignedByte(); 00343 if (commandLength==0) { 00344 commandLength = myInputStorage.readInt(); 00345 } 00346 00347 int commandId = myInputStorage.readUnsignedByte(); 00348 bool success = false; 00349 // dispatch commands 00350 switch (commandId) { 00351 case CMD_SETMAXSPEED: 00352 success = commandSetMaximumSpeed(); 00353 break; 00354 case CMD_SIMSTEP: 00355 success = targetTime_ = static_cast<SUMOTime>(myInputStorage.readInt()); 00356 return commandId; 00357 case CMD_SIMSTEP2: { 00358 SUMOTime nextT = myInputStorage.readInt(); 00359 success = true; 00360 if (nextT!=0) { 00361 targetTime_ = (SUMOReal) nextT; 00362 } else { 00363 targetTime_ += DELTA_T; 00364 } 00365 return commandId; 00366 } 00367 case CMD_STOP: 00368 success = commandStopNode(); 00369 break; 00370 case CMD_CHANGELANE: 00371 success = commandChangeLane(); 00372 break; 00373 case CMD_CHANGEROUTE: 00374 success = commandChangeRoute(); 00375 break; 00376 case CMD_CHANGETARGET: 00377 success = commandChangeTarget(); 00378 break; 00379 case CMD_GETALLTLIDS: 00380 success = commandGetAllTLIds(); 00381 break; 00382 case CMD_GETTLSTATUS: 00383 success = commandGetTLStatus(); 00384 break; 00385 case CMD_CLOSE: 00386 success = commandCloseConnection(); 00387 break; 00388 case CMD_UPDATECALIBRATOR: 00389 success = commandUpdateCalibrator(); 00390 break; 00391 case CMD_POSITIONCONVERSION: 00392 success = commandPositionConversion(); 00393 break; 00394 case CMD_SLOWDOWN: 00395 success = commandSlowDown(); 00396 break; 00397 case CMD_SCENARIO: 00398 success = commandScenario(); 00399 break; 00400 case CMD_ADDVEHICLE: 00401 success = commandAddVehicle(); 00402 break; 00403 case CMD_DISTANCEREQUEST: 00404 success = commandDistanceRequest(); 00405 break; 00406 case CMD_SUBSCRIBELIFECYCLES: 00407 success = commandSubscribeLifecycles(); 00408 break; 00409 case CMD_UNSUBSCRIBELIFECYCLES: 00410 success = commandUnsubscribeLifecycles(); 00411 break; 00412 case CMD_SUBSCRIBEDOMAIN: 00413 success = commandSubscribeDomain(); 00414 break; 00415 case CMD_UNSUBSCRIBEDOMAIN: 00416 success = commandUnsubscribeDomain(); 00417 break; 00418 case CMD_GET_INDUCTIONLOOP_VARIABLE: 00419 success = TraCIServerAPI_InductionLoop::processGet(myInputStorage, myOutputStorage); 00420 break; 00421 case CMD_GET_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE: 00422 success = TraCIServerAPI_MeMeDetector::processGet(myInputStorage, myOutputStorage); 00423 break; 00424 case CMD_GET_TL_VARIABLE: 00425 success = TraCIServerAPI_TLS::processGet(myInputStorage, myOutputStorage); 00426 break; 00427 case CMD_SET_TL_VARIABLE: 00428 success = TraCIServerAPI_TLS::processSet(myInputStorage, myOutputStorage); 00429 break; 00430 case CMD_GET_LANE_VARIABLE: 00431 success = TraCIServerAPI_Lane::processGet(myInputStorage, myOutputStorage); 00432 break; 00433 case CMD_SET_LANE_VARIABLE: 00434 success = TraCIServerAPI_Lane::processSet(myInputStorage, myOutputStorage); 00435 break; 00436 case CMD_GET_VEHICLE_VARIABLE: 00437 success = TraCIServerAPI_Vehicle::processGet(myInputStorage, myOutputStorage); 00438 break; 00439 case CMD_SET_VEHICLE_VARIABLE: 00440 success = TraCIServerAPI_Vehicle::processSet(myInputStorage, myOutputStorage); 00441 break; 00442 case CMD_GET_VEHICLETYPE_VARIABLE: 00443 success = TraCIServerAPI_VehicleType::processGet(myInputStorage, myOutputStorage); 00444 break; 00445 case CMD_GET_ROUTE_VARIABLE: 00446 success = TraCIServerAPI_Route::processGet(myInputStorage, myOutputStorage); 00447 break; 00448 case CMD_GET_POI_VARIABLE: 00449 success = TraCIServerAPI_POI::processGet(myInputStorage, myOutputStorage); 00450 break; 00451 case CMD_SET_POI_VARIABLE: 00452 success = TraCIServerAPI_POI::processSet(myInputStorage, myOutputStorage); 00453 break; 00454 case CMD_GET_POLYGON_VARIABLE: 00455 success = TraCIServerAPI_Polygon::processGet(myInputStorage, myOutputStorage); 00456 break; 00457 case CMD_SET_POLYGON_VARIABLE: 00458 success = TraCIServerAPI_Polygon::processSet(myInputStorage, myOutputStorage); 00459 break; 00460 case CMD_GET_JUNCTION_VARIABLE: 00461 success = TraCIServerAPI_Junction::processGet(myInputStorage, myOutputStorage); 00462 break; 00463 case CMD_GET_EDGE_VARIABLE: 00464 success = TraCIServerAPI_Edge::processGet(myInputStorage, myOutputStorage); 00465 break; 00466 case CMD_SET_EDGE_VARIABLE: 00467 success = TraCIServerAPI_Edge::processSet(myInputStorage, myOutputStorage); 00468 break; 00469 case CMD_GET_SIM_VARIABLE: 00470 success = TraCIServerAPI_Simulation::processGet(myInputStorage, myOutputStorage, myVehicleStateChanges); 00471 break; 00472 case CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE: 00473 case CMD_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE: 00474 case CMD_SUBSCRIBE_TL_VARIABLE: 00475 case CMD_SUBSCRIBE_LANE_VARIABLE: 00476 case CMD_SUBSCRIBE_VEHICLE_VARIABLE: 00477 case CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE: 00478 case CMD_SUBSCRIBE_ROUTE_VARIABLE: 00479 case CMD_SUBSCRIBE_POI_VARIABLE: 00480 case CMD_SUBSCRIBE_POLYGON_VARIABLE: 00481 case CMD_SUBSCRIBE_JUNCTION_VARIABLE: 00482 case CMD_SUBSCRIBE_EDGE_VARIABLE: 00483 case CMD_SUBSCRIBE_SIM_VARIABLE: 00484 success = addSubscription(commandId); 00485 break; 00486 default: 00487 writeStatusCmd(commandId, RTYPE_NOTIMPLEMENTED, "Command not implemented in sumo"); 00488 } 00489 if (!success) { 00490 while (myInputStorage.valid_pos() && myInputStorage.position() < commandStart + commandLength) { 00491 myInputStorage.readChar(); 00492 } 00493 } 00494 if (myInputStorage.position() != commandStart + commandLength) { 00495 ostringstream msg; 00496 msg << "Wrong position in requestMessage after dispatching command."; 00497 msg << " Expected command length was " << commandLength; 00498 msg << " but " << myInputStorage.position() - commandStart << " Bytes were read."; 00499 writeStatusCmd(commandId, RTYPE_ERR, msg.str()); 00500 closeConnection_ = true; 00501 } 00502 return commandId; 00503 }
| const Boundary & TraCIServer::getNetBoundary | ( | ) | [private] |
Definition at line 1855 of file TraCIServer.cpp.
References MSNet::getEdgeControl(), MSEdgeControl::getEdges(), and MSNet::getInstance().
01855 { 01856 // If already calculated, just return the boundary 01857 if (netBoundary_ != NULL) return *netBoundary_; 01858 01859 // Otherwise calculate it first 01860 netBoundary_ = new Boundary(); 01861 /* 01862 { 01863 // use the junctions to compute the boundaries 01864 for (size_t index=0; index<myNet.myJunctionWrapper.size(); index++) { 01865 if (myNet.myJunctionWrapper[index]->getShape().size()>0) { 01866 ret.add(myNet.myJunctionWrapper[index]->getBoundary()); 01867 } else { 01868 ret.add(myNet.myJunctionWrapper[index]->getJunction().getPosition()); 01869 } 01870 } 01871 } 01872 */ 01873 // Get all edges 01874 const std::vector<MSEdge*> &edges = MSNet::getInstance()->getEdgeControl().getEdges(); 01875 01876 // Get Boundary of Single ... 01877 for (std::vector<MSEdge*>::const_iterator e = edges.begin(); e != edges.end(); ++e) { 01878 const std::vector<MSLane*> &lanes = (*e)->getLanes(); 01879 for (std::vector<MSLane*>::const_iterator laneIt = lanes.begin(); laneIt != lanes.end(); ++laneIt) { 01880 netBoundary_->add((*laneIt)->getShape().getBoxBoundary()); 01881 } 01882 } 01883 return *netBoundary_; 01884 }
| PointOfInterest * TraCIServer::getPoiByExtId | ( | int | extId | ) | [private] |
Definition at line 1813 of file TraCIServer.cpp.
References MSNet::getInstance(), ShapeContainer::getMaxLayer(), ShapeContainer::getMinLayer(), ShapeContainer::getPOICont(), and MSNet::getShapeContainer().
01813 { 01814 std::string intId = ""; 01815 std::map<int, std::string>::iterator iter = poiExt2IntId.find(extId); 01816 if (iter != poiExt2IntId.end()) { 01817 intId = iter->second; 01818 } 01819 01820 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 01821 PointOfInterest* poi = 0; 01822 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); i++) { 01823 if (poi == 0) { 01824 poi = shapeCont.getPOICont(i).get(intId); 01825 } 01826 } 01827 01828 return poi; 01829 }
| Polygon2D * TraCIServer::getPolygonByExtId | ( | int | extId | ) | [private] |
Definition at line 1834 of file TraCIServer.cpp.
References MSNet::getInstance(), ShapeContainer::getMaxLayer(), ShapeContainer::getMinLayer(), ShapeContainer::getPolygonCont(), and MSNet::getShapeContainer().
01834 { 01835 std::string intId = ""; 01836 map<int, std::string>::const_iterator it = ext2intId.find(extId); 01837 if (it != ext2intId.end()) { 01838 intId = it->second; 01839 } 01840 01841 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 01842 Polygon2D* polygon = NULL; 01843 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); i++) { 01844 if (polygon == NULL) { 01845 polygon = shapeCont.getPolygonCont(i).get(intId); 01846 } 01847 } 01848 01849 return polygon; 01850 }
| MSTrafficLightLogic * TraCIServer::getTLLogicByExtId | ( | int | extId | ) | [private] |
Definition at line 1800 of file TraCIServer.cpp.
References MSTLLogicControl::getActive(), MSNet::getInstance(), and MSNet::getTLSControl().
01800 { 01801 std::string intId = ""; 01802 std::map<int, std::string>::iterator iter = trafficLightsExt2IntId.find(extId); 01803 if (iter != trafficLightsExt2IntId.end()) { 01804 intId = iter->second; 01805 } 01806 01807 return MSNet::getInstance()->getTLSControl().getActive(intId); 01808 }
| MSVehicle * TraCIServer::getVehicleByExtId | ( | int | extId | ) | [private] |
Definition at line 1791 of file TraCIServer.cpp.
References MSNet::getInstance(), MSVehicleControl::getVehicle(), and MSNet::getVehicleControl().
01791 { 01792 std::string intId; 01793 convertExt2IntId(extId, intId); 01794 return MSNet::getInstance()->getVehicleControl().getVehicle(intId); 01795 }
| void traci::TraCIServer::handleDomainSubscriptions | ( | const SUMOTime & | currentTime, | |
| const std::map< int, const MSVehicle * > & | activeEquippedVehicles | |||
| ) | throw (TraCIException) [private] |
Notifies client of all domain object update events it is subscribed to
| void TraCIServer::handleLifecycleSubscriptions | ( | ) | throw (TraCIException) [private] |
Notifies client of all lifecycle events it is subscribed to
Definition at line 2980 of file TraCIServer.cpp.
References CMD_OBJECTCREATION, CMD_OBJECTDESTRUCTION, and DOM_VEHICLE.
02981 { 02982 02983 if (myLifecycleSubscriptions.count(DOM_VEHICLE) != 0) { 02984 02985 for (std::set<int>::const_iterator i = myDestroyedVehicles.begin(); i != myDestroyedVehicles.end(); i++) { 02986 int extId = *i; 02987 02988 myOutputStorage.writeUnsignedByte(1+1+1+4); 02989 myOutputStorage.writeUnsignedByte(CMD_OBJECTDESTRUCTION); 02990 myOutputStorage.writeUnsignedByte(DOM_VEHICLE); 02991 myOutputStorage.writeInt(extId); 02992 } 02993 myDestroyedVehicles.clear(); 02994 02995 for (std::set<int>::const_iterator i = myCreatedVehicles.begin(); i != myCreatedVehicles.end(); i++) { 02996 int extId = *i; 02997 02998 myOutputStorage.writeUnsignedByte(1+1+1+4); 02999 myOutputStorage.writeUnsignedByte(CMD_OBJECTCREATION); 03000 myOutputStorage.writeUnsignedByte(DOM_VEHICLE); 03001 myOutputStorage.writeInt(extId); 03002 } 03003 myCreatedVehicles.clear(); 03004 03005 } 03006 }
| std::string TraCIServer::handlePoiDomain | ( | bool | isWriteCommand, | |
| tcpip::Storage & | response | |||
| ) | throw (TraCIException) [private] |
Handles the request of a Scenario Command for obtaining information on the point of interest domain.
Definition at line 2713 of file TraCIServer.cpp.
References DOM_POI, DOMVAR_COUNT, DOMVAR_EXTID, DOMVAR_LAYER, DOMVAR_NAME, DOMVAR_POSITION, DOMVAR_TYPE, Named::getID(), MSNet::getInstance(), traci::DataTypeContainer::getLastValueRead(), ShapeContainer::getMaxLayer(), ShapeContainer::getMinLayer(), ShapeContainer::getPOICont(), MSNet::getShapeContainer(), traci::DataTypeContainer::getString(), PointOfInterest::getType(), POSITION_3D, traci::DataTypeContainer::readValue(), TYPE_INTEGER, TYPE_STRING, Position2D::x(), and Position2D::y().
02714 { 02715 std::string name; 02716 std::string warning = ""; // additional description for response 02717 DataTypeContainer dataCont; 02718 02719 // domain object 02720 int objectId = myInputStorage.readInt(); 02721 PointOfInterest* poi = getPoiByExtId(objectId); 02722 02723 // variable id 02724 int variableId = myInputStorage.readUnsignedByte(); 02725 02726 // value data type 02727 int dataType = myInputStorage.readUnsignedByte(); 02728 02729 // if end of message is not yet reached, the value parameter has to be read 02730 if (myInputStorage.valid_pos()) { 02731 dataCont.readValue(dataType, myInputStorage); 02732 } 02733 02734 if (isWriteCommand) { 02735 throw TraCIException("Point of interest domain does not contain writable variables"); 02736 } 02737 02738 // write beginning of the answer message 02739 response.writeUnsignedByte((isWriteCommand ? 0x01 : 0x00)); // get/set flag 02740 response.writeUnsignedByte(DOM_POI); // domain 02741 response.writeInt(objectId); // domain object id 02742 response.writeUnsignedByte(variableId); // variable 02743 02744 // get list of shapes and determine total number of poi 02745 int count = 0; 02746 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 02747 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); i++) { 02748 count += shapeCont.getPOICont(i).size(); 02749 } 02750 02751 switch (variableId) { 02752 // name std::string of the object 02753 case DOMVAR_NAME: 02754 if (poi != NULL) { 02755 name = poi->getID(); 02756 response.writeUnsignedByte(TYPE_STRING); 02757 response.writeString(name); 02758 // add a warning to the response if the requested data type was not correct 02759 if (dataType != TYPE_STRING) { 02760 warning = "Warning: requested data type could not be used; using string instead!"; 02761 } 02762 } else { 02763 throw TraCIException("Unable to retrieve point of interest with given id"); 02764 } 02765 break; 02766 02767 // external id of the object 02768 case DOMVAR_EXTID: 02769 // if (dataType != TYPE_STRING) { 02770 if (dataCont.getLastValueRead() != TYPE_STRING) { 02771 throw TraCIException("Internal id must be given as string value"); 02772 } 02773 // name = myInputStorage.readString(); 02774 name = dataCont.getString(); 02775 if (poiInt2ExtId.find(name) != poiInt2ExtId.end()) { 02776 response.writeUnsignedByte(TYPE_INTEGER); 02777 response.writeInt(poiInt2ExtId[name]); 02778 } else { 02779 std::stringstream msg; 02780 msg << "Point of interest with internal id " << name << " not existing"; 02781 throw TraCIException(msg.str()); 02782 } 02783 break; 02784 02785 // number of poi 02786 case DOMVAR_COUNT: 02787 response.writeUnsignedByte(TYPE_INTEGER); 02788 response.writeInt(count); 02789 // add a warning to the response if the requested data type was not correct 02790 if (dataType != TYPE_INTEGER) { 02791 warning = "Warning: requested data type could not be used; using integer instead!"; 02792 } 02793 break; 02794 02795 // position of a poi 02796 case DOMVAR_POSITION: 02797 if (poi == NULL) { 02798 throw TraCIException("Unable to retrieve point of interest with given id"); 02799 } else { 02800 response.writeUnsignedByte(POSITION_3D); 02801 response.writeFloat(poi->x()); 02802 response.writeFloat(poi->y()); 02803 response.writeFloat(0); 02804 } 02805 // add a warning to the response if the requested data type was not correct 02806 if (dataType != POSITION_3D) { 02807 warning = "Warning: requested data type could not be used; using 3D position instead!"; 02808 } 02809 break; 02810 02811 // type of a poi 02812 case DOMVAR_TYPE: 02813 if (poi == NULL) { 02814 throw TraCIException("Unable to retrieve point of interest with given id"); 02815 } else { 02816 response.writeUnsignedByte(TYPE_STRING); 02817 response.writeString(poi->getType()); 02818 } 02819 // add a warning to the response if the requested data type was not correct 02820 if (dataType != TYPE_STRING) { 02821 warning = "Warning: requested data type could not be used; using string instead!"; 02822 } 02823 break; 02824 02825 // layer of a poi 02826 case DOMVAR_LAYER: 02827 // unknown variable 02828 default: 02829 throw TraCIException("Unknown domain variable specified"); 02830 } 02831 02832 return warning; 02833 }
| std::string TraCIServer::handlePolygonDomain | ( | bool | isWriteCommand, | |
| tcpip::Storage & | response | |||
| ) | throw (TraCIException) [private] |
Handles the request of a Scenario Command for obtaining information on the polygon domain.
Definition at line 2838 of file TraCIServer.cpp.
References DOM_POLYGON, DOMVAR_COUNT, DOMVAR_EXTID, DOMVAR_LAYER, DOMVAR_NAME, DOMVAR_POSITION, DOMVAR_SHAPE, DOMVAR_TYPE, Polygon2D::getID(), MSNet::getInstance(), traci::DataTypeContainer::getLastValueRead(), ShapeContainer::getMaxLayer(), ShapeContainer::getMinLayer(), Position2DVector::getPolygonCenter(), ShapeContainer::getPolygonCont(), Polygon2D::getShape(), MSNet::getShapeContainer(), traci::DataTypeContainer::getString(), Polygon2D::getType(), MIN2(), POSITION_3D, traci::DataTypeContainer::readValue(), Position2DVector::size(), TYPE_INTEGER, TYPE_POLYGON, TYPE_STRING, Position2D::x(), and Position2D::y().
02839 { 02840 std::string name; 02841 std::string warning = ""; // additional description for response 02842 DataTypeContainer dataCont; 02843 02844 // domain object 02845 int objectId = myInputStorage.readInt(); 02846 Polygon2D* poly = getPolygonByExtId(objectId); 02847 02848 // variable id 02849 int variableId = myInputStorage.readUnsignedByte(); 02850 02851 // value data type 02852 int dataType = myInputStorage.readUnsignedByte(); 02853 02854 // if end of message is not yet reached, the value parameter has to be read 02855 if (myInputStorage.valid_pos()) { 02856 dataCont.readValue(dataType, myInputStorage); 02857 } 02858 02859 if (isWriteCommand) { 02860 throw TraCIException("Polygon domain does not contain writable variables"); 02861 } 02862 02863 // write beginning of the answer message 02864 response.writeUnsignedByte((isWriteCommand ? 0x01 : 0x00)); // get/set flag 02865 response.writeUnsignedByte(DOM_POLYGON); // domain 02866 response.writeInt(objectId); // domain object id 02867 response.writeUnsignedByte(variableId); // variable 02868 02869 // get list of shapes and determine total number of polygons 02870 int count = 0; 02871 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 02872 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); i++) { 02873 count += shapeCont.getPolygonCont(i).size(); 02874 } 02875 02876 switch (variableId) { 02877 // name std::string of the object 02878 case DOMVAR_NAME: 02879 if (poly != NULL) { 02880 name = poly->getID(); 02881 response.writeUnsignedByte(TYPE_STRING); 02882 response.writeString(name); 02883 if (dataType != TYPE_STRING) { 02884 warning = "Warning: requested data type could not be used; using string instead!"; 02885 } 02886 } else { 02887 throw TraCIException("Unable to retrieve polygon with given id"); 02888 } 02889 break; 02890 02891 // external id of the object 02892 case DOMVAR_EXTID: 02893 // if (dataType != TYPE_STRING) { 02894 if (dataCont.getLastValueRead() != TYPE_STRING) { 02895 throw TraCIException("Internal id must be given as string value"); 02896 } 02897 // name = myInputStorage.readString(); 02898 name = dataCont.getString(); 02899 if (polygonInt2ExtId.find(name) != polygonInt2ExtId.end()) { 02900 response.writeUnsignedByte(TYPE_INTEGER); 02901 response.writeInt(polygonInt2ExtId[name]); 02902 } else { 02903 std::stringstream msg; 02904 msg << "Polygon with internal id " << name << " not existing"; 02905 throw TraCIException(msg.str()); 02906 } 02907 break; 02908 02909 // number of polygons 02910 case DOMVAR_COUNT: 02911 response.writeUnsignedByte(TYPE_INTEGER); 02912 response.writeInt(count); 02913 // add a warning to the response if the requested data type was not correct 02914 if (dataType != TYPE_INTEGER) { 02915 warning = "Warning: requested data type could not be used; using integer instead!"; 02916 } 02917 break; 02918 02919 // position of a polygon 02920 case DOMVAR_POSITION: 02921 if (poly == NULL) { 02922 throw TraCIException("Unable to retrieve polygon with given id"); 02923 } else { 02924 response.writeUnsignedByte(POSITION_3D); 02925 response.writeFloat(poly->getShape().getPolygonCenter().x()); 02926 response.writeFloat(poly->getShape().getPolygonCenter().y()); 02927 response.writeFloat(0); 02928 } 02929 // add a warning to the response if the requested data type was not correct 02930 if (dataType != POSITION_3D) { 02931 warning = "Warning: requested data type could not be used; using 3D position instead!"; 02932 } 02933 break; 02934 02935 // type of a polygon 02936 case DOMVAR_TYPE: 02937 if (poly == NULL) { 02938 throw TraCIException("Unable to retrieve polygon with given id"); 02939 } else { 02940 response.writeUnsignedByte(TYPE_STRING); 02941 response.writeString(poly->getType()); 02942 } 02943 // add a warning to the response if the requested data type was not correct 02944 if (dataType != TYPE_STRING) { 02945 warning = "Warning: requested data type could not be used; using string instead!"; 02946 } 02947 break; 02948 02949 // shape of a polygon 02950 case DOMVAR_SHAPE: 02951 if (poly == NULL) { 02952 throw TraCIException("Unable to retrieve polygon with given id"); 02953 } else { 02954 response.writeUnsignedByte(TYPE_POLYGON); 02955 response.writeUnsignedByte(MIN2(static_cast<size_t>(255),poly->getShape().size())); 02956 for (int i=0; i < MIN2(static_cast<size_t>(255),poly->getShape().size()); i++) { 02957 response.writeFloat(poly->getShape()[i].x()); 02958 response.writeFloat(poly->getShape()[i].y()); 02959 } 02960 } 02961 // add a warning to the response if the requested data type was not correct 02962 if (dataType != TYPE_POLYGON) { 02963 warning = "Warning: requested data type could not be used; using polygon type instead!"; 02964 } 02965 break; 02966 02967 // layer of a polygon 02968 case DOMVAR_LAYER: 02969 // unknown variable 02970 default: 02971 throw TraCIException("Unknown domain variable specified"); 02972 } 02973 02974 return warning; 02975 }
| std::string TraCIServer::handleRoadMapDomain | ( | bool | isWriteCommand, | |
| tcpip::Storage & | response | |||
| ) | throw (TraCIException) [private] |
Handles the request of a Scenario Command for obtaining information on the road map domain.
| requestMsg | original Scenario command message, the fields flag and domain have already been read | |
| response | storage object that will contain the variable dependant part of the response on this request | |
| isWriteCommand | true, if the command wants to write a value |
Definition at line 1994 of file TraCIServer.cpp.
References MSEdge::dictionary(), MSEdge::dictSize(), DOM_ROADMAP, DOMVAR_BOUNDINGBOX, DOMVAR_COUNT, DOMVAR_EXTID, DOMVAR_NAME, DOMVAR_SHAPE, MSEdge::getID(), MSNet::getInstance(), MSEdge::getLanes(), traci::DataTypeContainer::getLastValueRead(), MSEdge::getNumericalID(), traci::DataTypeContainer::getString(), MIN2(), traci::DataTypeContainer::readValue(), Position2DVector::size(), size, TYPE_BOUNDINGBOX, TYPE_INTEGER, TYPE_POLYGON, and TYPE_STRING.
01995 { 01996 std::string name = ""; 01997 std::string warning = ""; // additional description for response 01998 DataTypeContainer dataCont; 01999 02000 // domain object 02001 int objectId = myInputStorage.readInt(); 02002 // check for valid object id 02003 if (objectId < 0 || objectId >= MSEdge::dictSize()) { 02004 throw TraCIException("Invalid object id specified"); 02005 } 02006 MSEdge* edge = MSEdge::dictionary(objectId); 02007 02008 // variable id 02009 int variableId = myInputStorage.readUnsignedByte(); 02010 02011 // value data type 02012 int dataType = myInputStorage.readUnsignedByte(); 02013 02014 // if end of message is not yet reached, the value parameter has to be read 02015 if (myInputStorage.valid_pos()) { 02016 dataCont.readValue(dataType, myInputStorage); 02017 } 02018 02019 if (isWriteCommand) { 02020 throw TraCIException("Road map domain does not contain writable variables"); 02021 } 02022 02023 // write beginning of the answer message 02024 response.writeUnsignedByte((isWriteCommand ? 0x01 : 0x00)); // get/set flag 02025 response.writeUnsignedByte(DOM_ROADMAP); // domain 02026 response.writeInt(objectId); // domain object id 02027 response.writeUnsignedByte(variableId); // variable 02028 02029 switch (variableId) { 02030 // name std::string of the object 02031 case DOMVAR_NAME: 02032 if (edge != NULL) { 02033 name = edge->getID(); 02034 response.writeUnsignedByte(TYPE_STRING); 02035 response.writeString(name); 02036 if (dataType != TYPE_STRING) { 02037 warning = "Warning: requested data type could not be used; using string instead!"; 02038 } 02039 } else { 02040 throw TraCIException("Unable to retrieve road with given id"); 02041 } 02042 break; 02043 02044 // numerical id of an edge 02045 case DOMVAR_EXTID: 02046 //if (dataType != TYPE_STRING) { 02047 if (dataCont.getLastValueRead() != TYPE_STRING) { 02048 throw TraCIException("Internal id must be given as string value"); 02049 } 02050 //name = myInputStorage.readString(); 02051 name = dataCont.getString(); 02052 edge = MSEdge::dictionary(name); 02053 if (edge != NULL) { 02054 response.writeUnsignedByte(TYPE_INTEGER); 02055 response.writeInt(edge->getNumericalID()); 02056 } else { 02057 std::stringstream msg; 02058 msg << "Edge with internal id " << name << " not existing"; 02059 throw TraCIException(msg.str()); 02060 } 02061 break; 02062 02063 // net boundaries 02064 case DOMVAR_BOUNDINGBOX: 02065 response.writeUnsignedByte(TYPE_BOUNDINGBOX); 02066 response.writeFloat(getNetBoundary().xmin()); 02067 response.writeFloat(getNetBoundary().ymin()); 02068 response.writeFloat(getNetBoundary().xmax()); 02069 response.writeFloat(getNetBoundary().ymax()); 02070 // add a warning to the response if the requested data type was not correct 02071 if (dataType != TYPE_BOUNDINGBOX) { 02072 warning = "Warning: requested data type could not be used; using boundary box type instead!"; 02073 } 02074 break; 02075 02076 // number of roads 02077 case DOMVAR_COUNT: 02078 response.writeUnsignedByte(TYPE_INTEGER); 02079 response.writeInt(MSNet::getInstance()->getEdgeControl().getEdgeNames().size()); 02080 if (dataType != TYPE_INTEGER) { 02081 warning = "Warning: requested data type could not be used; using integer instead!"; 02082 } 02083 break; 02084 02085 // shape of a road 02086 case DOMVAR_SHAPE: 02087 if (edge != NULL) { 02088 const std::vector<MSLane*> &lanes = edge->getLanes(); 02089 const Position2DVector shape = lanes[lanes.size()/2]->getShape(); 02090 response.writeUnsignedByte(TYPE_POLYGON); 02091 response.writeUnsignedByte(MIN2(static_cast<size_t>(255),shape.size())); 02092 for (int iPoint=0; iPoint < MIN2(static_cast<size_t>(255),shape.size()); iPoint++) { 02093 response.writeFloat(shape[iPoint].x()); 02094 response.writeFloat(shape[iPoint].y()); 02095 } 02096 if (dataType != TYPE_POLYGON) { 02097 warning = "Warning: requested data type could not be used; using polygon type instead!"; 02098 } 02099 } else { 02100 throw TraCIException("Unable to retrieve road with given id"); 02101 } 02102 break; 02103 02104 // unknown variable 02105 default: 02106 throw TraCIException("Unknown domain variable specified"); 02107 } 02108 02109 return warning; 02110 }
| std::string TraCIServer::handleTrafficLightDomain | ( | bool | isWriteCommand, | |
| tcpip::Storage & | response | |||
| ) | throw (TraCIException) [private] |
Handles the request of a Scenario Command for obtaining information on the traffic light domain.
Definition at line 2491 of file TraCIServer.cpp.
References DOM_TRAFFICLIGHTS, DOMVAR_COUNT, DOMVAR_CURTLPHASE, DOMVAR_EXTID, DOMVAR_NAME, DOMVAR_NEXTTLPHASE, DOMVAR_POSITION, NamedObjectCont< T >::get(), MSTLLogicControl::getAllTLIds(), MSTrafficLightLogic::getCurrentPhaseIndex(), MSEdge::getID(), MSTrafficLightLogic::getID(), MSTrafficLightLogic::getIndexFromOffset(), MSNet::getInstance(), MSNet::getJunctionControl(), MSTrafficLightLogic::getLanesAt(), traci::DataTypeContainer::getLastValueRead(), MSTrafficLightLogic::getLinks(), MSTrafficLightLogic::getPhase(), MSTrafficLightLogic::getPhaseIndexAtTime(), MSJunction::getPosition(), MSPhaseDefinition::getSignalState(), traci::DataTypeContainer::getString(), MSNet::getTLSControl(), MSLink::LINKSTATE_TL_GREEN_MAJOR, MSLink::LINKSTATE_TL_GREEN_MINOR, MSLink::LINKSTATE_TL_OFF_BLINKING, MSLink::LINKSTATE_TL_OFF_NOSIGNAL, MSLink::LINKSTATE_TL_RED, MSLink::LINKSTATE_TL_YELLOW_MAJOR, MSLink::LINKSTATE_TL_YELLOW_MINOR, POSITION_3D, traci::DataTypeContainer::readValue(), TLPHASE_BLINKING, TLPHASE_GREEN, TLPHASE_NOSIGNAL, TLPHASE_RED, TLPHASE_YELLOW, TYPE_INTEGER, TYPE_STRING, TYPE_TLPHASELIST, tcpip::Storage::writeString(), tcpip::Storage::writeUnsignedByte(), Position2D::x(), and Position2D::y().
02492 { 02493 int count = 0; 02494 std::string name; 02495 std::string warning = ""; // additional description for response 02496 DataTypeContainer dataCont; 02497 02498 // domain object 02499 int objectId = myInputStorage.readInt(); 02500 MSTrafficLightLogic* tlLogic = getTLLogicByExtId(objectId); 02501 02502 // variable id 02503 int variableId = myInputStorage.readUnsignedByte(); 02504 02505 // value data type 02506 int dataType = myInputStorage.readUnsignedByte(); 02507 02508 // if end of message is not yet reached, the value parameter has to be read 02509 if (myInputStorage.valid_pos()) { 02510 dataCont.readValue(dataType, myInputStorage); 02511 } 02512 02513 if (isWriteCommand) { 02514 throw TraCIException("Traffic Light domain does not contain writable variables"); 02515 } 02516 02517 // write beginning of the answer message 02518 response.writeUnsignedByte((isWriteCommand ? 0x01 : 0x00)); // get/set flag 02519 response.writeUnsignedByte(DOM_TRAFFICLIGHTS); // domain 02520 response.writeInt(objectId); // domain object id 02521 response.writeUnsignedByte(variableId); // variable 02522 02523 switch (variableId) { 02524 // name std::string of the object 02525 case DOMVAR_NAME: 02526 if (tlLogic != NULL) { 02527 name = tlLogic->getID(); 02528 response.writeUnsignedByte(TYPE_STRING); 02529 response.writeString(name); 02530 // add a warning to the response if the requested data type was not correct 02531 if (dataType != TYPE_STRING) { 02532 warning = "Warning: requested data type could not be used; using string instead!"; 02533 } 02534 } else { 02535 throw TraCIException("Unable to retrieve traffic light with given id"); 02536 } 02537 break; 02538 02539 // external id of the object 02540 case DOMVAR_EXTID: 02541 // if (dataType != TYPE_STRING) { 02542 if (dataCont.getLastValueRead() != TYPE_STRING) { 02543 throw TraCIException("Internal id must be given as string value"); 02544 } 02545 // name = myInputStorage.readString(); 02546 name = dataCont.getString(); 02547 if (trafficLightsInt2ExtId.find(name) != trafficLightsInt2ExtId.end()) { 02548 response.writeUnsignedByte(TYPE_INTEGER); 02549 response.writeInt(trafficLightsInt2ExtId[name]); 02550 } else { 02551 std::stringstream msg; 02552 msg << "Traffic Light with internal id " << name << " not existing"; 02553 throw TraCIException(msg.str()); 02554 } 02555 break; 02556 02557 // count of traffic lights 02558 case DOMVAR_COUNT: 02559 count = MSNet::getInstance()->getTLSControl().getAllTLIds().size(); 02560 response.writeUnsignedByte(TYPE_INTEGER); 02561 response.writeInt(count); 02562 // add a warning to the response if the requested data type was not correct 02563 if (dataType != TYPE_INTEGER) { 02564 warning = "Warning: requested data type could not be used; using integer instead!"; 02565 } 02566 break; 02567 02568 // position of a traffic light 02569 case DOMVAR_POSITION: 02570 if (tlLogic != NULL) { 02571 MSJunction* junc = MSNet::getInstance()->getJunctionControl().get(tlLogic->getID()); 02572 response.writeUnsignedByte(POSITION_3D); 02573 response.writeFloat(junc->getPosition().x()); 02574 response.writeFloat(junc->getPosition().y()); 02575 response.writeFloat(0); 02576 // add a warning to the response if the requested data type was not correct 02577 if (dataType != POSITION_3D) { 02578 warning = "Warning: requested data type could not be used; using position 3d instead!"; 02579 } 02580 } else { 02581 throw TraCIException("Unable to retrieve traffic light with given id"); 02582 } 02583 break; 02584 02585 // current or next traffic light phase 02586 case DOMVAR_CURTLPHASE: 02587 case DOMVAR_NEXTTLPHASE: 02588 if (tlLogic != NULL) { 02589 // get the required phase of the tl logic 02590 size_t step = tlLogic->getCurrentPhaseIndex(); 02591 if (variableId == DOMVAR_NEXTTLPHASE) { 02592 size_t curStep = tlLogic->getCurrentPhaseIndex(); 02593 size_t pos = tlLogic->getPhaseIndexAtTime(MSNet::getInstance()->getCurrentTimeStep()); 02594 do { 02595 pos++; 02596 } while ((step=tlLogic->getIndexFromOffset(pos)) == curStep); 02597 } 02598 MSPhaseDefinition phase = tlLogic->getPhase(step); 02599 02600 // get the list of link vectors affected by that tl logic 02601 MSTrafficLightLogic::LinkVectorVector affectedLinks = tlLogic->getLinks(); 02602 02603 // for each affected link of that tl logic, write the phase state 02604 // to the answer message along with preceding and succeeding edge 02605 Storage phaseList; 02606 int listLength = 0; 02607 // std::map<MSLane*, std::set<const MSEdge*> > connectLane2Edge; 02608 std::map<const MSEdge*, pair<const MSEdge*, int> > writtenEdgePairs; 02609 for (int i=0; i<affectedLinks.size(); i++) { 02610 // get the list of links controlled by that light 02611 MSTrafficLightLogic::LinkVector linkGroup = affectedLinks[i]; 02612 // get the list of preceding lanes to that links 02613 MSTrafficLightLogic::LaneVector laneGroup = tlLogic->getLanesAt(i); 02614 // get status of the traffic light 02615 MSLink::LinkState tlState = phase.getSignalState(i); 02616 02617 // const MSEdge* precEdge = NULL; 02618 // const MSEdge* succEdge = NULL; 02619 for (int linkNo=0; linkNo<linkGroup.size(); linkNo++) { 02620 // if multiple lanes of different edges lead to the same lane on another edge, 02621 // only write such pair of edges once 02622 /* if ((precEdge == laneGroup[linkNo]->getEdge()) 02623 && (succEdge == linkGroup[linkNo]->getLane()->getEdge())) { 02624 continue; 02625 } 02626 // remember preceding and succeeding edge 02627 precEdge = laneGroup[linkNo]->getEdge(); 02628 succEdge = linkGroup[linkNo]->getLane()->getEdge(); 02629 02630 // if the current ingoing lane was part of a connection before... 02631 std::map<MSLane*, std::set<const MSEdge*> >::iterator itMap = connectLane2Edge.find(laneGroup[linkNo]); 02632 if (itMap != connectLane2Edge.end()) { 02633 // ...and the succeding edge of this connection is the same as before... 02634 std::set<const MSEdge*>::iterator itEdge = itMap->second.find(succEdge); 02635 if (itEdge != itMap->second.end()) { 02636 // ...then the connection's phase doesn't need to be reported again 02637 continue; 02638 } 02639 } 02640 // remember the edge that this lane leads to 02641 connectLane2Edge[laneGroup[linkNo]].insert(succEdge); 02642 */ 02643 MSEdge &precEdge = laneGroup[linkNo]->getEdge(); 02644 MSEdge &succEdge = linkGroup[linkNo]->getLane()->getEdge(); 02645 02646 // for each pair of edges and every different tl state, write only one tl switch command 02647 std::map<const MSEdge*, pair<const MSEdge*, int> >::iterator itPair = writtenEdgePairs.find(&precEdge); 02648 if (itPair != writtenEdgePairs.end()) { 02649 if (itPair->second.first == &succEdge && itPair->second.second == tlState) { 02650 continue; 02651 } 02652 } 02653 // remember the current edge pair and tl status 02654 writtenEdgePairs[&precEdge] = std::make_pair(&succEdge, tlState); 02655 02656 // write preceding edge 02657 phaseList.writeString(precEdge.getID()); 02658 // write succeeding edge 02659 phaseList.writeString(succEdge.getID()); 02660 // write status of the traffic light 02661 switch (tlState) { 02662 case MSLink::LINKSTATE_TL_GREEN_MAJOR: 02663 case MSLink::LINKSTATE_TL_GREEN_MINOR: 02664 phaseList.writeUnsignedByte(TLPHASE_GREEN); 02665 break; 02666 case MSLink::LINKSTATE_TL_YELLOW_MAJOR: 02667 case MSLink::LINKSTATE_TL_YELLOW_MINOR: 02668 phaseList.writeUnsignedByte(TLPHASE_YELLOW); 02669 break; 02670 case MSLink::LINKSTATE_TL_RED: 02671 phaseList.writeUnsignedByte(TLPHASE_RED); 02672 break; 02673 case MSLink::LINKSTATE_TL_OFF_BLINKING: 02674 phaseList.writeUnsignedByte(TLPHASE_BLINKING); 02675 break; 02676 case MSLink::LINKSTATE_TL_OFF_NOSIGNAL: 02677 phaseList.writeUnsignedByte(TLPHASE_NOSIGNAL); 02678 break; 02679 default: 02680 phaseList.writeUnsignedByte(TLPHASE_NOSIGNAL); 02681 } 02682 // increase length of the phase list 02683 listLength++; 02684 } 02685 } 02686 //write data type to answer message 02687 response.writeUnsignedByte(TYPE_TLPHASELIST); 02688 // write length of the phase list to answer message 02689 response.writeUnsignedByte(listLength); 02690 // write list of phases to answer message 02691 response.writeStorage(phaseList); 02692 02693 // add a warning to the response if the requested data type was not correct 02694 if (dataType != TYPE_TLPHASELIST) { 02695 warning = "Warning: requested data type could not be used; using type traffic light phase list instead!"; 02696 } 02697 } else { 02698 throw TraCIException("Unable to retrieve traffic light with given id"); 02699 } 02700 break; 02701 02702 // unknown variable 02703 default: 02704 throw TraCIException("Unknown domain variable specified"); 02705 } 02706 02707 return warning; 02708 }
| std::string TraCIServer::handleVehicleDomain | ( | bool | isWriteCommand, | |
| tcpip::Storage & | response | |||
| ) | throw (TraCIException) [private] |
Handles the request of a Scenario Command for obtaining information on the vehicle domain.
Definition at line 2115 of file TraCIServer.cpp.
References MSRoute::begin(), HelpersHBEFA::computeCO(), HelpersHBEFA::computeCO2(), HelpersHBEFA::computeFuel(), HelpersHBEFA::computeHC(), HelpersHarmonoise::computeNoise(), HelpersHBEFA::computeNOx(), HelpersHBEFA::computePMx(), MSEdge::dictionary(), Position2D::distanceTo(), DOM_VEHICLE, DOMVAR_AIRDISTANCE, DOMVAR_ALLOWED_SPEED, DOMVAR_CO2EMISSION, DOMVAR_COEMISSION, DOMVAR_COUNT, DOMVAR_DRIVINGDISTANCE, DOMVAR_EQUIPPEDCOUNT, DOMVAR_EQUIPPEDCOUNTMAX, DOMVAR_EXTID, DOMVAR_FUELCONSUMPTION, DOMVAR_HCEMISSION, DOMVAR_MAXCOUNT, DOMVAR_NAME, DOMVAR_NOISEEMISSION, DOMVAR_NOXEMISSION, DOMVAR_PMXEMISSION, DOMVAR_POSITION, DOMVAR_ROUTE, DOMVAR_SPEED, MSRoute::end(), traci::DataTypeContainer::getAnyPosition(), MSVehicle::getDistanceToPosition(), MSVehicle::getEdge(), MSVehicleType::getEmissionClass(), MSEdge::getID(), MSVehicle::getID(), MSNet::getInstance(), MSVehicle::getLane(), traci::DataTypeContainer::getLastValueRead(), MSLane::getMaxSpeed(), MSVehicle::getPosition(), MSVehicle::getPositionOnLane(), MSVehicle::getPreDawdleAcceleration(), MSLane::getRightLane(), traci::DataTypeContainer::getRoadMapPosition(), MSVehicle::getRoute(), MSVehicle::getSpeed(), traci::DataTypeContainer::getString(), MSVehicleControl::getVehicle(), MSNet::getVehicleControl(), MSVehicle::getVehicleType(), MSVehicle::isOnRoad(), MSVehicleControl::loadedVehBegin(), MSVehicleControl::loadedVehEnd(), traci::TraCIServer::RoadMapPos::pos, POSITION_2_5D, POSITION_2D, POSITION_3D, POSITION_ROADMAP, traci::DataTypeContainer::readValue(), traci::TraCIServer::RoadMapPos::roadId, TYPE_FLOAT, TYPE_INTEGER, TYPE_STRING, Position2D::x(), and Position2D::y().
02116 { 02117 std::string name; 02118 int count = 0; 02119 MSVehicleControl* vehControl = NULL; 02120 std::string warning = ""; // additional description for response 02121 DataTypeContainer dataCont; 02122 02123 // domain object 02124 int objectId = myInputStorage.readInt(); 02125 MSVehicle* veh = getVehicleByExtId(objectId); //get node by id 02126 02127 // variable id 02128 int variableId = myInputStorage.readUnsignedByte(); 02129 02130 // value data type 02131 int dataType = myInputStorage.readUnsignedByte(); 02132 02133 // if end of message is not yet reached, the value parameter has to be read 02134 if (myInputStorage.valid_pos()) { 02135 dataCont.readValue(dataType, myInputStorage); 02136 } 02137 02138 if (isWriteCommand) { 02139 throw TraCIException("Vehicle domain does not contain writable variables"); 02140 } 02141 02142 // write beginning of the answer message 02143 response.writeUnsignedByte((isWriteCommand ? 0x01 : 0x00)); // get/set flag 02144 response.writeUnsignedByte(DOM_VEHICLE); // domain 02145 response.writeInt(objectId); // domain object id 02146 response.writeUnsignedByte(variableId); // variable 02147 02148 switch (variableId) { 02149 // name std::string of the object 02150 case DOMVAR_NAME: 02151 if (veh != NULL) { 02152 name = veh->getID(); 02153 response.writeUnsignedByte(TYPE_STRING); 02154 response.writeString(name); 02155 // add a warning to the response if the requested data type was not correct 02156 if (dataType != TYPE_STRING) { 02157 warning = "Warning: requested data type could not be used; using string instead!"; 02158 } 02159 } else { 02160 throw TraCIException("Unable to retrieve node with given ID"); 02161 } 02162 break; 02163 02164 // external id of the object 02165 case DOMVAR_EXTID: 02166 // if (dataType != TYPE_STRING) { 02167 if (dataCont.getLastValueRead() != TYPE_STRING) { 02168 throw TraCIException("Internal id must be given as string value"); 02169 } 02170 // name = myInputStorage.readString(); 02171 name = dataCont.getString(); 02172 if (equippedVehicles_.find(name) != equippedVehicles_.end()) { 02173 response.writeUnsignedByte(TYPE_INTEGER); 02174 response.writeInt(equippedVehicles_[name]); 02175 } else { 02176 std::stringstream msg; 02177 msg << "Vehicle with internal id " << name << " not existing or not accessible via TraCI"; 02178 throw TraCIException(msg.str()); 02179 } 02180 break; 02181 02182 // number of active nodes 02183 case DOMVAR_COUNT: 02184 vehControl = &MSNet::getInstance()->getVehicleControl(); 02185 for (MSVehicleControl::constVehIt vehIt = vehControl->loadedVehBegin(); vehIt != vehControl->loadedVehEnd(); vehIt++) { 02186 if (vehIt->second->isOnRoad()) { 02187 count++; 02188 } 02189 } 02190 response.writeUnsignedByte(TYPE_INTEGER); 02191 response.writeInt(count); 02192 if (dataType != TYPE_INTEGER) { 02193 warning = "Warning: requested data type could not be used; using integer instead!"; 02194 } 02195 break; 02196 02197 // upper bound for number of nodes 02198 case DOMVAR_MAXCOUNT: 02199 response.writeUnsignedByte(TYPE_INTEGER); 02200 response.writeInt(totalNumVehicles_); 02201 if (dataType != TYPE_INTEGER) { 02202 warning = "Warning: requested data type could not be used; using integer instead!"; 02203 } 02204 break; 02205 02206 // number of active nodes accesible via traci 02207 case DOMVAR_EQUIPPEDCOUNT: 02208 for (std::map<std::string, int>::iterator it=equippedVehicles_.begin(); it != equippedVehicles_.end(); it++) { 02209 MSVehicle* veh = MSNet::getInstance()->getVehicleControl().getVehicle(it->first); 02210 if (veh->isOnRoad()) { 02211 count++; 02212 } 02213 } 02214 response.writeUnsignedByte(TYPE_INTEGER); 02215 response.writeInt(count); 02216 if (dataType != TYPE_INTEGER) { 02217 warning = "Warning: requested data type could not be used; using integer instead!"; 02218 } 02219 break; 02220 02221 // upper bound for number of nodes accesible via traci 02222 case DOMVAR_EQUIPPEDCOUNTMAX: 02223 response.writeUnsignedByte(TYPE_INTEGER); 02224 response.writeInt(static_cast<int>(0.5 + totalNumVehicles_ * penetration_)); 02225 if (dataType != TYPE_INTEGER) { 02226 warning = "Warning: requested data type could not be used; using integer instead!"; 02227 } 02228 break; 02229 02230 // node position 02231 case DOMVAR_POSITION: 02232 if (veh != NULL) { 02233 switch (dataType) { 02234 case POSITION_3D: 02235 response.writeUnsignedByte(POSITION_3D); 02236 response.writeFloat(veh->getPosition().x()); 02237 response.writeFloat(veh->getPosition().y()); 02238 response.writeFloat(0); 02239 break; 02240 default: 02241 response.writeByte(POSITION_ROADMAP); 02242 response.writeString(veh->getEdge()->getID()); 02243 response.writeFloat(veh->getPositionOnLane()); 02244 int laneId = 0; 02245 MSLane* lane = veh->getLane().getRightLane(); 02246 while (lane != NULL) { 02247 laneId++; 02248 lane =lane->getRightLane(); 02249 } 02250 response.writeUnsignedByte(laneId); 02251 // add a warning to the response if the requested data type was not correct 02252 if (dataType != POSITION_ROADMAP) { 02253 warning = "Warning: requested data type could not be used; using road map position instead!"; 02254 } 02255 } 02256 } else { 02257 throw TraCIException("Unable to retrieve node with given ID"); 02258 } 02259 break; 02260 02261 // node speed 02262 case DOMVAR_SPEED: 02263 if (veh != NULL) { 02264 response.writeUnsignedByte(TYPE_FLOAT); 02265 response.writeFloat(veh->getSpeed()); 02266 // add a warning to the response if the requested data type was not correct 02267 if (dataType != TYPE_FLOAT) { 02268 warning = "Warning: requested data type could not be used; using float instead!"; 02269 } 02270 } else { 02271 throw TraCIException("Unable to retrieve node with given ID"); 02272 } 02273 break; 02274 02275 // node maximum allowed speed 02276 case DOMVAR_ALLOWED_SPEED: 02277 if (veh != NULL) { 02278 response.writeUnsignedByte(TYPE_FLOAT); 02279 response.writeFloat(veh->getLane().getMaxSpeed()); 02280 // add a warning to the response if the requested data type was not correct 02281 if (dataType != TYPE_FLOAT) { 02282 warning = "Warning: requested data type could not be used; using float instead!"; 02283 } 02284 } else { 02285 throw TraCIException("Unable to retrieve node with given ID"); 02286 } 02287 break; 02288 02289 // node route 02290 case DOMVAR_ROUTE: 02291 if (veh != NULL) { 02292 response.writeUnsignedByte(TYPE_STRING); 02293 MSRoute r = veh->getRoute(); 02294 std::string strRoute = ""; 02295 for (MSRouteIterator it = r.begin(); it != r.end(); ++it) { 02296 if (strRoute.length()) strRoute.append(" "); 02297 strRoute.append((*it)->getID()); 02298 } 02299 response.writeString(strRoute); 02300 // add a warning to the response if the requested data type was not correct 02301 if (dataType != TYPE_STRING) { 02302 warning = "Warning: requested data type could not be used; using string instead!"; 02303 } 02304 } else { 02305 throw TraCIException("Unable to retrieve node with given ID"); 02306 } 02307 break; 02308 02309 // air distance from vehicle to a point 02310 case DOMVAR_AIRDISTANCE: 02311 // driving distance from vehicle to a point 02312 case DOMVAR_DRIVINGDISTANCE: 02313 if (veh != NULL) { 02314 Position2D destPos; 02315 RoadMapPos destRoadPos; 02316 float distance = 0.0; 02317 02318 // read destinatin position 02319 float x,y; 02320 switch (dataCont.getLastValueRead()) { 02321 case POSITION_ROADMAP: 02322 destRoadPos = dataCont.getRoadMapPosition(); 02323 destPos = convertRoadMapToCartesian(destRoadPos); 02324 if (MSEdge::dictionary(destRoadPos.roadId) == NULL) throw TraCIException("Unable to retrieve edge with given id"); 02325 break; 02326 case POSITION_3D: 02327 case POSITION_2_5D: 02328 case POSITION_2D: 02329 destPos = dataCont.getAnyPosition(); 02330 destRoadPos = convertCartesianToRoadMap(destPos); 02331 break; 02332 default: 02333 throw TraCIException("Distance request to unknown destination"); 02334 } 02335 02336 // switch (dataType) 02337 // { 02338 // case POSITION_ROADMAP: 02339 // { 02340 // destEdge = myInputStorage.readString(); 02341 // destPos = myInputStorage.readFloat(); 02342 // destLane = myInputStorage.readUnsignedByte(); 02344 // edge = MSEdge::dictionary( destEdge ); 02345 // if (edge == NULL ) throw TraCIException("Unable to retrieve edge with given id"); 02346 // 02347 // const std::vector<MSLane*>& lanes = edge->getLanes(); 02348 // if (destLane > lanes.size()-1) throw TraCIException("No lane existing with specified id on this edge"); 02349 // pos = lanes[destLane]->getShape().positionAtLengthPosition(destPos); 02350 // } 02351 // break; 02352 // case POSITION_2D: 02353 // case POSITION_2_5D: 02354 // case POSITION_3D: 02355 // { 02356 // float destX = myInputStorage.readFloat(); 02357 // float destY = myInputStorage.readFloat(); 02358 // if ((dataType == POSITION_3D) || (dataType == POSITION_2_5D)) { 02359 // myInputStorage.readFloat(); // z value is ignored 02360 // } 02361 // pos.set(destX, destY); 02362 // 02363 // RoadMapPos roadPos = convertCartesianToRoadMap(pos); 02364 // destEdge = roadPos.roadId; 02365 // destPos = roadPos.pos; 02366 // destLane = roadPos.laneId; 02367 // edge = MSEdge::dictionary( destEdge ); 02368 // } 02369 // break; 02370 // default: 02371 // throw TraCIException("Distance request to unknown destination"); 02372 // } 02373 02374 // compute the distance to destination position 02375 if (variableId == DOMVAR_AIRDISTANCE) { 02376 distance = static_cast<float>(veh->getPosition().distanceTo(destPos)); 02377 } else { 02378 distance = static_cast<float>(veh->getDistanceToPosition(destRoadPos.pos, MSEdge::dictionary(destRoadPos.roadId))); 02379 } 02380 // write response 02381 response.writeUnsignedByte(TYPE_FLOAT); 02382 response.writeFloat(distance); 02383 } else { 02384 throw TraCIException("Unable to retrieve node with given ID"); 02385 } 02386 break; 02387 02388 // CO2 emission 02389 case DOMVAR_CO2EMISSION: 02390 if (veh != NULL) { 02391 response.writeUnsignedByte(TYPE_FLOAT); 02392 response.writeFloat(HelpersHBEFA::computeCO2(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02393 // add a warning to the response if the requested data type was not correct 02394 if (dataType != TYPE_FLOAT) { 02395 warning = "Warning: requested data type could not be used; using float instead!"; 02396 } 02397 } else { 02398 throw TraCIException("Unable to retrieve node with given ID"); 02399 } 02400 break; 02401 // CO emission 02402 case DOMVAR_COEMISSION: 02403 if (veh != NULL) { 02404 response.writeUnsignedByte(TYPE_FLOAT); 02405 response.writeFloat(HelpersHBEFA::computeCO(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02406 // add a warning to the response if the requested data type was not correct 02407 if (dataType != TYPE_FLOAT) { 02408 warning = "Warning: requested data type could not be used; using float instead!"; 02409 } 02410 } else { 02411 throw TraCIException("Unable to retrieve node with given ID"); 02412 } 02413 break; 02414 // HC emission 02415 case DOMVAR_HCEMISSION: 02416 if (veh != NULL) { 02417 response.writeUnsignedByte(TYPE_FLOAT); 02418 response.writeFloat(HelpersHBEFA::computeHC(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02419 // add a warning to the response if the requested data type was not correct 02420 if (dataType != TYPE_FLOAT) { 02421 warning = "Warning: requested data type could not be used; using float instead!"; 02422 } 02423 } else { 02424 throw TraCIException("Unable to retrieve node with given ID"); 02425 } 02426 break; 02427 // PMx emission 02428 case DOMVAR_PMXEMISSION: 02429 if (veh != NULL) { 02430 response.writeUnsignedByte(TYPE_FLOAT); 02431 response.writeFloat(HelpersHBEFA::computePMx(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02432 // add a warning to the response if the requested data type was not correct 02433 if (dataType != TYPE_FLOAT) { 02434 warning = "Warning: requested data type could not be used; using float instead!"; 02435 } 02436 } else { 02437 throw TraCIException("Unable to retrieve node with given ID"); 02438 } 02439 break; 02440 // NOx emission 02441 case DOMVAR_NOXEMISSION: 02442 if (veh != NULL) { 02443 response.writeUnsignedByte(TYPE_FLOAT); 02444 response.writeFloat(HelpersHBEFA::computeNOx(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02445 // add a warning to the response if the requested data type was not correct 02446 if (dataType != TYPE_FLOAT) { 02447 warning = "Warning: requested data type could not be used; using float instead!"; 02448 } 02449 } else { 02450 throw TraCIException("Unable to retrieve node with given ID"); 02451 } 02452 break; 02453 // CO2 emission 02454 case DOMVAR_FUELCONSUMPTION: 02455 if (veh != NULL) { 02456 response.writeUnsignedByte(TYPE_FLOAT); 02457 response.writeFloat(HelpersHBEFA::computeFuel(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02458 // add a warning to the response if the requested data type was not correct 02459 if (dataType != TYPE_FLOAT) { 02460 warning = "Warning: requested data type could not be used; using float instead!"; 02461 } 02462 } else { 02463 throw TraCIException("Unable to retrieve node with given ID"); 02464 } 02465 break; 02466 // noise emission 02467 case DOMVAR_NOISEEMISSION: 02468 if (veh != NULL) { 02469 response.writeUnsignedByte(TYPE_FLOAT); 02470 response.writeFloat(HelpersHarmonoise::computeNoise(veh->getVehicleType().getEmissionClass(), veh->getSpeed(), veh->getPreDawdleAcceleration())); 02471 // add a warning to the response if the requested data type was not correct 02472 if (dataType != TYPE_FLOAT) { 02473 warning = "Warning: requested data type could not be used; using float instead!"; 02474 } 02475 } else { 02476 throw TraCIException("Unable to retrieve node with given ID"); 02477 } 02478 break; 02479 02480 // unknown variable 02481 default: 02482 throw TraCIException("Unknown domain variable specified"); 02483 } 02484 02485 return warning; 02486 }
| void TraCIServer::postProcessSimulationStep | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 532 of file TraCIServer.cpp.
References CMD_MOVENODE, CMD_SIMSTEP, MSEdge::dictSize(), DOM_VEHICLE, MSEdge::EDGEFUNCTION_INTERNAL, MSVehicle::getEdge(), MSLane::getEdge(), MSEdge::getID(), MSNet::getInstance(), MSVehicle::getLane(), MSVehicle::getPosition(), MSVehicle::getPositionOnLane(), MSEdge::getPurpose(), MSLane::getRightLane(), MSNet::EdgeWeightsProxi::getTravelTime(), MSVehicleControl::getVehicle(), MSNet::getVehicleControl(), MSNet::getWeightsStorage(), MSVehicle::getWeightsStorage(), MSVehicle::hasStops(), MSVehicle::isOnRoad(), MSVehicleControl::loadedVehBegin(), MSVehicleControl::loadedVehEnd(), POSITION_2_5D, POSITION_2D, POSITION_3D, POSITION_NONE, POSITION_ROADMAP, MSVehicle::processTraCICommands(), RandHelper::rand(), MSVehicle::reroute(), RTYPE_ERR, RTYPE_OK, tcpip::Storage::size(), tcpip::Storage::writeFloat(), tcpip::Storage::writeInt(), tcpip::Storage::writeString(), tcpip::Storage::writeUnsignedByte(), Position2D::x(), and Position2D::y().
00532 { 00533 // Position representation 00534 int resType = myInputStorage.readUnsignedByte(); 00535 if (resType != POSITION_NONE && resType != POSITION_2D && resType != POSITION_ROADMAP 00536 && resType != POSITION_2_5D && resType != POSITION_3D) { 00537 writeStatusCmd(CMD_SIMSTEP, RTYPE_ERR, "Error: unsupported return format requested."); 00538 return; 00539 } 00540 isMapChanged_ = true; 00541 // Everything is fine 00542 writeStatusCmd(CMD_SIMSTEP, RTYPE_OK, ""); 00543 00544 // prepare output 00545 try { 00546 MSNet *net = MSNet::getInstance(); 00547 // map containing all active equipped vehicles. maps external id to MSVehicle* 00548 map<int, const MSVehicle*> activeEquippedVehicles; 00549 // get access to all vehicles in simulation 00550 MSVehicleControl &vehControl = net->getVehicleControl(); 00551 // iterate over all vehicles in simulation 00552 for (map<string, MSVehicle*>::const_iterator iter = vehControl.loadedVehBegin(); 00553 iter != vehControl.loadedVehEnd(); ++iter) { 00554 // selected vehicle 00555 const std::string vehicleId = (*iter).first; 00556 const MSVehicle *vehicle = (*iter).second; 00557 // insert into equippedVehicleId if not contained 00558 std::map<std::string, int>::const_iterator equippedVeh = equippedVehicles_.find(vehicleId); 00559 if (equippedVeh == equippedVehicles_.end()) { 00560 // determine if vehicle is equipped 00561 if (penetration_ >= 1. || RandHelper::rand() <= penetration_) { 00562 // vehicle is equipped 00563 equippedVehicles_[vehicleId] = numEquippedVehicles_; 00564 // put into active list? 00565 if (vehicle->isOnRoad()) { 00566 if ((myLifecycleSubscriptions.count(DOM_VEHICLE) != 0) && 00567 (myLivingVehicles.count(numEquippedVehicles_) == 0)) { 00568 myCreatedVehicles.insert(numEquippedVehicles_); 00569 myLivingVehicles.insert(numEquippedVehicles_); 00570 } 00571 activeEquippedVehicles[numEquippedVehicles_] = vehicle; 00572 } 00573 numEquippedVehicles_++; 00574 } else { 00575 // vehicle is not equipped 00576 equippedVehicles_[vehicleId] = -1; 00577 } 00578 } else if (equippedVeh->second >= 0 && vehicle->isOnRoad()) { 00579 int extId = equippedVeh->second; 00580 if ((myLifecycleSubscriptions.count(DOM_VEHICLE) != 0) && 00581 (myLivingVehicles.count(extId) == 0)) { 00582 myCreatedVehicles.insert(extId); 00583 myLivingVehicles.insert(extId); 00584 } 00585 activeEquippedVehicles[extId] = vehicle; 00586 // vehicle is equipped 00587 } 00588 } 00589 if (myLifecycleSubscriptions.count(DOM_VEHICLE) != 0) { 00590 // iterate over all vehicles that are supposed to live 00591 for (std::set<int>::iterator i = myLivingVehicles.begin(); 00592 i != myLivingVehicles.end();) { 00593 int extId = *i; 00594 if (activeEquippedVehicles.find(extId) == activeEquippedVehicles.end()) { 00595 myDestroyedVehicles.insert(extId); 00596 myLivingVehicles.erase(i++); 00597 } else { 00598 i++; 00599 } 00600 } 00601 } 00602 00603 handleLifecycleSubscriptions(); 00604 00605 // for each vehicle process any active traci command 00606 for (std::map<std::string, int>::iterator iter = equippedVehicles_.begin(); 00607 iter != equippedVehicles_.end(); ++iter) { 00608 if ((*iter).second != -1) { // Look only at equipped vehicles 00609 MSVehicle* veh = net->getVehicleControl().getVehicle((*iter).first); 00610 if (myVehiclesToReroute.find(veh)!=myVehiclesToReroute.end()) { 00611 // check rerouting 00612 if (!veh->hasStops() && veh->isOnRoad() && veh->getLane().getEdge().getPurpose()!=MSEdge::EDGEFUNCTION_INTERNAL) { 00613 MSNet::EdgeWeightsProxi proxi(veh->getWeightsStorage(), MSNet::getInstance()->getWeightsStorage()); 00614 DijkstraRouterTT_ByProxi<MSEdge, SUMOVehicle, prohibited_withRestrictions<MSEdge, SUMOVehicle>, MSNet::EdgeWeightsProxi> router(MSEdge::dictSize(), true, &proxi, &MSNet::EdgeWeightsProxi::getTravelTime); 00615 veh->reroute(MSNet::getInstance()->getCurrentTimeStep(), router); 00616 } 00617 myVehiclesToReroute.erase(veh); 00618 } 00619 if (veh != NULL) { 00620 veh->processTraCICommands(targetTime_); 00621 } 00622 } 00623 } 00624 00625 handleDomainSubscriptions(targetTime_, activeEquippedVehicles); 00626 00627 //out.writeChar( static_cast<unsigned char>(rtype) ); 00628 //out.writeInt(numEquippedVehicles_); 00629 // iterate over all active equipped vehicles 00630 // and generate a Move Node command for each vehicle 00631 if (resType != POSITION_NONE) { 00632 for (map<int, const MSVehicle*>::iterator iter = activeEquippedVehicles.begin(); 00633 iter != activeEquippedVehicles.end(); ++iter) { 00634 int extId = (*iter).first; 00635 const MSVehicle* vehicle = (*iter).second; 00636 Storage tempMsg; 00637 00638 // command type 00639 tempMsg.writeUnsignedByte(CMD_MOVENODE); 00640 // node id 00641 tempMsg.writeInt(extId); 00642 // end time 00643 tempMsg.writeInt(targetTime_); 00644 00645 if (resType == POSITION_ROADMAP) { 00646 // return type 00647 tempMsg.writeUnsignedByte(POSITION_ROADMAP); 00648 00649 tempMsg.writeString(vehicle->getEdge()->getID()); 00650 tempMsg.writeFloat(vehicle->getPositionOnLane()); 00651 00652 // determine index of the lane the vehicle is on 00653 int laneId = 0; 00654 const MSLane* lane = &vehicle->getLane(); 00655 while ((lane = lane->getRightLane()) != NULL) { 00656 laneId++; 00657 } 00658 tempMsg.writeUnsignedByte(laneId); 00659 } else if (resType == POSITION_2D || resType == POSITION_3D || resType == POSITION_2_5D) { 00660 tempMsg.writeUnsignedByte(resType); 00661 Position2D pos = vehicle->getPosition(); 00662 tempMsg.writeFloat(pos.x()); 00663 tempMsg.writeFloat(pos.y()); 00664 if (resType != POSITION_2D) { 00665 // z pos: ignored 00666 tempMsg.writeFloat(0); 00667 } 00668 } 00669 00670 // command length 00671 myOutputStorage.writeUnsignedByte(tempMsg.size()+1); 00672 // content 00673 myOutputStorage.writeStorage(tempMsg); 00674 } 00675 } 00676 } catch (...) { 00677 writeStatusCmd(CMD_SIMSTEP, RTYPE_ERR, "some error happen in command: simulation step. Sumo shuts down."); 00678 closeConnection_ = true; 00679 } 00680 }
| void TraCIServer::postProcessSimulationStep2 | ( | ) | throw (TraCIException, std::invalid_argument) [private] |
Definition at line 684 of file TraCIServer.cpp.
References traci::TraCIServer::Subscription::beginTime, CMD_SIMSTEP2, traci::TraCIServer::Subscription::endTime, MSNet::getCurrentTimeStep(), MSNet::getInstance(), and RTYPE_OK.
00684 { 00685 SUMOTime t = MSNet::getInstance()->getCurrentTimeStep(); 00686 writeStatusCmd(CMD_SIMSTEP2, RTYPE_OK, ""); 00687 int noActive = 0; 00688 for (std::vector<Subscription>::iterator i=mySubscriptions.begin(); i!=mySubscriptions.end();) { 00689 const Subscription &s = *i; 00690 if (s.endTime<t) { 00691 i = mySubscriptions.erase(i); 00692 continue; 00693 } 00694 ++i; 00695 if (s.beginTime>t) { 00696 continue; 00697 } 00698 ++noActive; 00699 } 00700 myOutputStorage.writeInt(noActive); 00701 for (std::vector<Subscription>::iterator i=mySubscriptions.begin(); i!=mySubscriptions.end(); ++i) { 00702 const Subscription &s = *i; 00703 if (s.beginTime>t) { 00704 continue; 00705 } 00706 tcpip::Storage into; 00707 std::string errors; 00708 processSingleSubscription(s, into, errors); 00709 myOutputStorage.writeStorage(into); 00710 } 00711 }
| void TraCIServer::processCommandsUntilSimStep | ( | SUMOTime | step | ) | throw (ProcessError) [static] |
Definition at line 259 of file TraCIServer.cpp.
References CMD_SIMSTEP, CMD_SIMSTEP2, OptionsCont::getOptions(), tcpip::SocketException::what(), and traci::TraCIException::what().
Referenced by MSNet::simulationStep().
00259 { 00260 try { 00261 if (instance_ == 0) { 00262 if (!closeConnection_ && OptionsCont::getOptions().getInt("remote-port") != 0) { 00263 instance_ = new traci::TraCIServer(); 00264 } else { 00265 return; 00266 } 00267 } 00268 if (step < instance_->targetTime_) { 00269 return; 00270 } 00271 // Simulation should run until 00272 // 1. end time reached or 00273 // 2. got CMD_CLOSE or 00274 // 3. Client closes socket connection 00275 if (instance_->myDoingSimStep) { 00276 switch (instance_->simStepCommand) { 00277 case CMD_SIMSTEP: 00278 instance_->postProcessSimulationStep(); 00279 break; 00280 case CMD_SIMSTEP2: 00281 instance_->postProcessSimulationStep2(); 00282 break; 00283 } 00284 instance_->myDoingSimStep = false; 00285 } 00286 while (!closeConnection_) { 00287 if (!instance_->myInputStorage.valid_pos()) { 00288 if (instance_->myOutputStorage.size() > 0) { 00289 // send out all answers as one storage 00290 instance_->socket_->sendExact(instance_->myOutputStorage); 00291 } 00292 instance_->myInputStorage.reset(); 00293 instance_->myOutputStorage.reset(); 00294 // Read a message 00295 instance_->socket_->receiveExact(instance_->myInputStorage); 00296 } 00297 while (instance_->myInputStorage.valid_pos() && !closeConnection_) { 00298 // dispatch each command 00299 int cmd = instance_->dispatchCommand(); 00300 if (cmd == CMD_SIMSTEP || cmd==CMD_SIMSTEP2) { 00301 instance_->simStepCommand = cmd; 00302 instance_->myDoingSimStep = true; 00303 for (std::map<MSNet::VehicleState, std::vector<std::string> >::iterator i=instance_->myVehicleStateChanges.begin(); i!=instance_->myVehicleStateChanges.end(); ++i) { 00304 (*i).second.clear(); 00305 } 00306 return; 00307 } 00308 } 00309 } 00310 if (closeConnection_ && instance_->myOutputStorage.size() > 0) { 00311 // send out all answers as one storage 00312 instance_->socket_->sendExact(instance_->myOutputStorage); 00313 } 00314 for (std::map<MSNet::VehicleState, std::vector<std::string> >::iterator i=instance_->myVehicleStateChanges.begin(); i!=instance_->myVehicleStateChanges.end(); ++i) { 00315 (*i).second.clear(); 00316 } 00317 } catch (std::invalid_argument &e) { 00318 throw ProcessError(e.what()); 00319 } catch (TraCIException &e) { 00320 throw ProcessError(e.what()); 00321 } catch (SocketException &e) { 00322 throw ProcessError(e.what()); 00323 } 00324 if (instance_ != NULL) { 00325 delete instance_; 00326 instance_ = 0; 00327 closeConnection_ = true; 00328 } 00329 }
| bool TraCIServer::processSingleSubscription | ( | const TraCIServer::Subscription & | s, | |
| tcpip::Storage & | writeInto, | |||
| std::string & | errors | |||
| ) | throw (TraCIException) [private] |
Definition at line 3119 of file TraCIServer.cpp.
References CMD_SUBSCRIBE_EDGE_VARIABLE, CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE, CMD_SUBSCRIBE_JUNCTION_VARIABLE, CMD_SUBSCRIBE_LANE_VARIABLE, CMD_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE, CMD_SUBSCRIBE_POI_VARIABLE, CMD_SUBSCRIBE_POLYGON_VARIABLE, CMD_SUBSCRIBE_ROUTE_VARIABLE, CMD_SUBSCRIBE_SIM_VARIABLE, CMD_SUBSCRIBE_TL_VARIABLE, CMD_SUBSCRIBE_VEHICLE_VARIABLE, CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE, TraCIServerAPI_Simulation::processGet(), TraCIServerAPI_Edge::processGet(), TraCIServerAPI_Junction::processGet(), TraCIServerAPI_Polygon::processGet(), TraCIServerAPI_POI::processGet(), TraCIServerAPI_Route::processGet(), TraCIServerAPI_VehicleType::processGet(), TraCIServerAPI_Vehicle::processGet(), TraCIServerAPI_Lane::processGet(), TraCIServerAPI_TLS::processGet(), TraCIServerAPI_MeMeDetector::processGet(), TraCIServerAPI_InductionLoop::processGet(), tcpip::Storage::readInt(), tcpip::Storage::readString(), tcpip::Storage::readUnsignedByte(), RTYPE_ERR, RTYPE_NOTIMPLEMENTED, RTYPE_OK, tcpip::Storage::size(), TYPE_STRING, TraCIServerAPIHelper::writeStatusCmd(), tcpip::Storage::writeString(), and tcpip::Storage::writeUnsignedByte().
03120 { 03121 bool ok = true; 03122 tcpip::Storage outputStorage; 03123 size_t wholeSize = 0; 03124 for (std::vector<int>::const_iterator i=s.variables.begin(); i!=s.variables.end(); ++i) { 03125 tcpip::Storage message; 03126 message.writeUnsignedByte(*i); 03127 message.writeString(s.id); 03128 tcpip::Storage tmpOutput; 03129 switch (s.commandId) { 03130 // generate response 03131 case CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE: 03132 ok &= TraCIServerAPI_InductionLoop::processGet(message, tmpOutput, false); 03133 break; 03134 case CMD_SUBSCRIBE_MULTI_ENTRY_EXIT_DETECTOR_VARIABLE: 03135 ok &= TraCIServerAPI_MeMeDetector::processGet(message, tmpOutput, false); 03136 break; 03137 case CMD_SUBSCRIBE_TL_VARIABLE: 03138 ok &= TraCIServerAPI_TLS::processGet(message, tmpOutput, false); 03139 break; 03140 case CMD_SUBSCRIBE_LANE_VARIABLE: 03141 ok &= TraCIServerAPI_Lane::processGet(message, tmpOutput, false); 03142 break; 03143 case CMD_SUBSCRIBE_VEHICLE_VARIABLE: 03144 ok &= TraCIServerAPI_Vehicle::processGet(message, tmpOutput, false); 03145 break; 03146 case CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE: 03147 ok &= TraCIServerAPI_VehicleType::processGet(message, tmpOutput, false); 03148 break; 03149 case CMD_SUBSCRIBE_ROUTE_VARIABLE: 03150 ok &= TraCIServerAPI_Route::processGet(message, tmpOutput, false); 03151 break; 03152 case CMD_SUBSCRIBE_POI_VARIABLE: 03153 ok &= TraCIServerAPI_POI::processGet(message, tmpOutput, false); 03154 break; 03155 case CMD_SUBSCRIBE_POLYGON_VARIABLE: 03156 ok &= TraCIServerAPI_Polygon::processGet(message, tmpOutput, false); 03157 break; 03158 case CMD_SUBSCRIBE_JUNCTION_VARIABLE: 03159 ok &= TraCIServerAPI_Junction::processGet(message, tmpOutput, false); 03160 break; 03161 case CMD_SUBSCRIBE_EDGE_VARIABLE: 03162 ok &= TraCIServerAPI_Edge::processGet(message, tmpOutput, false); 03163 break; 03164 case CMD_SUBSCRIBE_SIM_VARIABLE: 03165 ok &= TraCIServerAPI_Simulation::processGet(message, tmpOutput, myVehicleStateChanges, false); 03166 break; 03167 default: 03168 TraCIServerAPIHelper::writeStatusCmd(s.commandId, RTYPE_NOTIMPLEMENTED, "Unsupported command specified", tmpOutput); 03169 ok = false; 03170 break; 03171 } 03172 // copy response part 03173 if (ok) { 03174 int length = tmpOutput.readUnsignedByte(); 03175 length = tmpOutput.readInt(); 03176 int responseType = tmpOutput.readUnsignedByte(); 03177 int variable = tmpOutput.readUnsignedByte(); 03178 std::string id = tmpOutput.readString(); 03179 size_t p = 1 + 4 + 1 + 1 + 4 + id.length(); // cmd, var, id, type, value 03180 wholeSize += (length - p); 03181 outputStorage.writeUnsignedByte(variable); 03182 outputStorage.writeUnsignedByte(RTYPE_OK); 03183 while (p++<tmpOutput.size()) { 03184 outputStorage.writeUnsignedByte(tmpOutput.readUnsignedByte()); 03185 } 03186 } else { 03187 int length = tmpOutput.readUnsignedByte(); 03188 int cmd = tmpOutput.readUnsignedByte(); 03189 int status = tmpOutput.readUnsignedByte(); 03190 std::string msg = tmpOutput.readString(); 03191 outputStorage.writeUnsignedByte(*i); 03192 outputStorage.writeUnsignedByte(RTYPE_ERR); 03193 outputStorage.writeUnsignedByte(TYPE_STRING); 03194 outputStorage.writeString(msg); 03195 errors = errors + msg; 03196 } 03197 } 03198 //writeStatusCmd(s.commandId, RTYPE_OK, ""); 03199 writeInto.writeUnsignedByte(0); // command length -> extended 03200 writeInto.writeInt(1 + 4 + s.id.length() + 1 + outputStorage.size()); // extended length, length, cmd, id, varsize, return (x*1+size) 03201 writeInto.writeUnsignedByte(s.commandId + 0x10); 03202 writeInto.writeString(s.id); 03203 writeInto.writeUnsignedByte(s.variables.size()); 03204 writeInto.writeStorage(outputStorage); 03205 return ok; 03206 }
| void TraCIServer::vehicleStateChanged | ( | const MSVehicle *const | vehicle, | |
| MSNet::VehicleState | to | |||
| ) | throw () [virtual] |
Called if a vehicle changes its state.
| [in] | vehicle | The vehicle which changed its state |
| [in] | to | The state the vehicle has changed to |
Implements MSNet::VehicleStateListener.
Definition at line 245 of file TraCIServer.cpp.
References OptionsCont::getOptions().
00245 { 00246 if (closeConnection_ || OptionsCont::getOptions().getInt("remote-port") == 0) { 00247 return; 00248 } 00249 /* 00250 if(myVehicleStateChanges.find(to)==myVehicleStateChanges.end()) { 00251 myVehicleStateChanges[to] = std::vector<std::string>(); 00252 } 00253 */ 00254 myVehicleStateChanges[to].push_back(vehicle->getID()); 00255 }
| bool TraCIServer::wasClosed | ( | ) | [static] |
Definition at line 332 of file TraCIServer.cpp.
Referenced by GUIRunThread::makeStep(), MSNet::simulate(), and MSNet::simulationState().
00332 { 00333 return closeConnection_; 00334 }
| void TraCIServer::writeStatusCmd | ( | int | commandId, | |
| int | status, | |||
| std::string | description | |||
| ) | [private] |
Definition at line 1747 of file TraCIServer.cpp.
References MsgHandler::getErrorInstance(), MsgHandler::inform(), RTYPE_ERR, RTYPE_NOTIMPLEMENTED, and toString().
01747 { 01748 if (status == RTYPE_ERR) { 01749 MsgHandler::getErrorInstance()->inform("Answered with error to command " + toString(commandId) + 01750 ": " + description); 01751 } else if (status == RTYPE_NOTIMPLEMENTED) { 01752 MsgHandler::getErrorInstance()->inform("Requested command not implemented (" + toString(commandId) + 01753 "): " + description); 01754 } 01755 01756 // command length 01757 myOutputStorage.writeUnsignedByte(1 + 1 + 1 + 4 + static_cast<int>(description.length())); 01758 // command type 01759 myOutputStorage.writeUnsignedByte(commandId); 01760 // status 01761 myOutputStorage.writeUnsignedByte(status); 01762 // description 01763 myOutputStorage.writeString(description); 01764 01765 return; 01766 }
bool TraCIServer::closeConnection_ = false [static, private] |
Definition at line 310 of file TraCIServer.h.
std::map<std::string, int> traci::TraCIServer::equippedVehicles_ [private] |
Definition at line 254 of file TraCIServer.h.
std::map<int, std::string> traci::TraCIServer::ext2intId [private] |
Definition at line 258 of file TraCIServer.h.
TraCIServer * TraCIServer::instance_ = 0 [static, private] |
Definition at line 238 of file TraCIServer.h.
bool traci::TraCIServer::isMapChanged_ [private] |
Definition at line 259 of file TraCIServer.h.
std::set<int> traci::TraCIServer::myCreatedVehicles [private] |
Definition at line 305 of file TraCIServer.h.
std::set<int> traci::TraCIServer::myDestroyedVehicles [private] |
Definition at line 308 of file TraCIServer.h.
bool traci::TraCIServer::myDoingSimStep [private] |
Definition at line 317 of file TraCIServer.h.
std::map<int, std::list<std::pair<int, int> > > traci::TraCIServer::myDomainSubscriptions [private] |
Definition at line 299 of file TraCIServer.h.
Definition at line 315 of file TraCIServer.h.
std::set<int> traci::TraCIServer::myLifecycleSubscriptions [private] |
Definition at line 296 of file TraCIServer.h.
std::set<int> traci::TraCIServer::myLivingVehicles [private] |
Definition at line 302 of file TraCIServer.h.
Definition at line 316 of file TraCIServer.h.
std::vector<Subscription> traci::TraCIServer::mySubscriptions [private] |
Definition at line 335 of file TraCIServer.h.
std::map<MSNet::VehicleState, std::vector<std::string> > traci::TraCIServer::myVehicleStateChanges [private] |
Definition at line 340 of file TraCIServer.h.
std::set<MSVehicle*> traci::TraCIServer::myVehiclesToReroute [private] |
Definition at line 320 of file TraCIServer.h.
Boundary* traci::TraCIServer::netBoundary_ [private] |
Definition at line 312 of file TraCIServer.h.
int traci::TraCIServer::numEquippedVehicles_ [private] |
Definition at line 290 of file TraCIServer.h.
float traci::TraCIServer::penetration_ [private] |
Definition at line 247 of file TraCIServer.h.
std::map<int, std::string> traci::TraCIServer::poiExt2IntId [private] |
Definition at line 268 of file TraCIServer.h.
std::map<std::string, int> traci::TraCIServer::poiInt2ExtId [private] |
Definition at line 270 of file TraCIServer.h.
std::map<int, std::string> traci::TraCIServer::polygonExt2IntId [private] |
Definition at line 273 of file TraCIServer.h.
std::map<std::string, int> traci::TraCIServer::polygonInt2ExtId [private] |
Definition at line 275 of file TraCIServer.h.
std::string traci::TraCIServer::routeFile_ [private] |
Definition at line 250 of file TraCIServer.h.
int traci::TraCIServer::simStepCommand [private] |
Definition at line 318 of file TraCIServer.h.
tcpip::Socket* traci::TraCIServer::socket_ [private] |
Definition at line 241 of file TraCIServer.h.
SUMOTime traci::TraCIServer::targetTime_ [private] |
Definition at line 244 of file TraCIServer.h.
int traci::TraCIServer::totalNumVehicles_ [private] |
Definition at line 293 of file TraCIServer.h.
std::map<int, std::string> traci::TraCIServer::trafficLightsExt2IntId [private] |
Definition at line 263 of file TraCIServer.h.
std::map<std::string, int> traci::TraCIServer::trafficLightsInt2ExtId [private] |
Definition at line 265 of file TraCIServer.h.
1.5.6