diff --git a/data/xsd/state_file.xsd b/data/xsd/state_file.xsd index 29f5714..7ba2dca 100644 --- a/data/xsd/state_file.xsd +++ b/data/xsd/state_file.xsd @@ -192,7 +192,7 @@ - + diff --git a/src/mesosim/MEVehicle.cpp b/src/mesosim/MEVehicle.cpp index 169757c..5fc14fd 100644 --- a/src/mesosim/MEVehicle.cpp +++ b/src/mesosim/MEVehicle.cpp @@ -183,7 +183,7 @@ MEVehicle::setApproaching(MSLink* link) { const double speed = getSpeed(); link->setApproaching(this, getEventTime() + (link->getState() == LINKSTATE_ALLWAY_STOP ? (SUMOTime)RandHelper::rand((int)2) : 0), // tie braker - speed, speed, true, + speed, speed, MSLink::REQUEST, speed, getWaitingTime(), // @note: dist is not used by meso (getZipperSpeed is never called) getSegment()->getLength(), 0); diff --git a/src/microsim/MSLane.cpp b/src/microsim/MSLane.cpp index 27696ce..0c3773c 100644 --- a/src/microsim/MSLane.cpp +++ b/src/microsim/MSLane.cpp @@ -3489,7 +3489,7 @@ MSLane::saveState(OutputDevice& out) { out.writeAttr(SUMO_ATTR_ARRIVALTIME, item.second.arrivalTime); out.writeAttr(SUMO_ATTR_ARRIVALSPEED, item.second.arrivalSpeed); out.writeAttr(SUMO_ATTR_DEPARTSPEED, item.second.leaveSpeed); - out.writeAttr(SUMO_ATTR_REQUEST, item.second.willPass); + out.writeAttr(SUMO_ATTR_REQUEST, (int)item.second.willPass); out.writeAttr(SUMO_ATTR_ARRIVALSPEEDBRAKING, item.second.arrivalSpeedBraking); out.writeAttr(SUMO_ATTR_WAITINGTIME, item.second.waitingTime); out.writeAttr(SUMO_ATTR_DISTANCE, item.second.dist); diff --git a/src/microsim/MSLink.cpp b/src/microsim/MSLink.cpp index e823cea..54d18fa 100644 --- a/src/microsim/MSLink.cpp +++ b/src/microsim/MSLink.cpp @@ -652,7 +652,7 @@ MSLink::contIntersect(const MSLane* lane, const MSLane* foe) { void MSLink::setApproaching(const SUMOVehicle* approaching, const SUMOTime arrivalTime, const double arrivalSpeed, const double leaveSpeed, - const bool setRequest, const double arrivalSpeedBraking, const SUMOTime waitingTime, double dist, double latOffset) { + const ApproachFlag setRequest, const double arrivalSpeedBraking, const SUMOTime waitingTime, double dist, double latOffset) { const SUMOTime leaveTime = getLeaveTime(arrivalTime, arrivalSpeed, leaveSpeed, approaching->getVehicleType().getLength()); #ifdef DEBUG_APPROACHING if (DEBUG_COND2(approaching)) { @@ -723,7 +723,7 @@ MSLink::getApproaching(const SUMOVehicle* veh) const { if (i != myApproachingVehicles.end()) { return i->second; } else { - return ApproachingVehicleInformation(INVALID_TIME, INVALID_TIME, 0, 0, false, 0, 0, 0, 0, 0); + return ApproachingVehicleInformation(INVALID_TIME, INVALID_TIME, 0, 0, NO_REQUEST, 0, 0, 0, 0, 0); } } diff --git a/src/microsim/MSLink.h b/src/microsim/MSLink.h index 5d865f4..fe9f7e6 100644 --- a/src/microsim/MSLink.h +++ b/src/microsim/MSLink.h @@ -111,6 +111,18 @@ public: typedef std::vector LinkLeaders; + /** @enum ApproachFlag + * @brief additional information for approach information + */ + enum ApproachFlag { + /// @brief vehicle does not plan to pass the link + NO_REQUEST = 0, + /// @brief vehicle plans to pass the link + REQUEST = 1, + /// @brief vehicle plans to pass the a minor link and can no longer brake safely + COMMITTED = 2 + }; + /** @struct ApproachingVehicleInformation * @brief A structure holding the information about vehicles approaching a link */ @@ -122,7 +134,7 @@ public: **/ ApproachingVehicleInformation(const SUMOTime _arrivalTime, const SUMOTime _leavingTime, const double _arrivalSpeed, const double _leaveSpeed, - const bool _willPass, + const ApproachFlag _willPass, const double _arrivalSpeedBraking, const SUMOTime _waitingTime, const double _dist, @@ -148,7 +160,7 @@ public: /// @brief The estimated speed with which the vehicle leaves the link (for headway computation) const double leaveSpeed; /// @brief Whether the vehicle wants to pass the link (@todo: check semantics) - const bool willPass; + const ApproachFlag willPass; /// @brief The estimated speed with which the vehicle arrives at the link if it starts braking(for headway computation) const double arrivalSpeedBraking; /// @brief The waiting duration at the current link @@ -265,7 +277,7 @@ public: * The information is stored in myApproachingVehicles. */ void setApproaching(const SUMOVehicle* approaching, const SUMOTime arrivalTime, - const double arrivalSpeed, const double leaveSpeed, const bool setRequest, + const double arrivalSpeed, const double leaveSpeed, const ApproachFlag setRequest, const double arrivalSpeedBraking, const SUMOTime waitingTime, double dist, double latOffset); diff --git a/src/microsim/MSStateHandler.cpp b/src/microsim/MSStateHandler.cpp index 2fefc0c..dd49eb2 100644 --- a/src/microsim/MSStateHandler.cpp +++ b/src/microsim/MSStateHandler.cpp @@ -317,13 +317,13 @@ MSStateHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { const SUMOTime arrivalTime = attrs.get(SUMO_ATTR_ARRIVALTIME, nullptr, ok); const double arrivalSpeed = attrs.get(SUMO_ATTR_ARRIVALSPEED, nullptr, ok); const double leaveSpeed = attrs.get(SUMO_ATTR_DEPARTSPEED, nullptr, ok); - const bool setRequest = attrs.get(SUMO_ATTR_REQUEST, nullptr, ok); + const int setRequest = attrs.get(SUMO_ATTR_REQUEST, nullptr, ok); const double arrivalSpeedBraking = attrs.get(SUMO_ATTR_ARRIVALSPEEDBRAKING, nullptr, ok); const SUMOTime waitingTime = attrs.get(SUMO_ATTR_WAITINGTIME, nullptr, ok); const double dist = attrs.get(SUMO_ATTR_DISTANCE, nullptr, ok); const double latOffset = attrs.getOpt(SUMO_ATTR_POSITION_LAT, nullptr, ok, 0); SUMOVehicle* veh = vc.getVehicle(vehID); - myCurrentLink->setApproaching(veh, arrivalTime, arrivalSpeed, leaveSpeed, setRequest, arrivalSpeedBraking, waitingTime, dist, latOffset); + myCurrentLink->setApproaching(veh, arrivalTime, arrivalSpeed, leaveSpeed, (MSLink::ApproachFlag)setRequest, arrivalSpeedBraking, waitingTime, dist, latOffset); if (!MSGlobals::gUseMesoSim) { MSVehicle* microVeh = dynamic_cast(veh); microVeh->loadPreviousApproaching(myCurrentLink, setRequest, arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed); diff --git a/src/microsim/MSVehicle.cpp b/src/microsim/MSVehicle.cpp index 9d01096..f7f25a2 100644 --- a/src/microsim/MSVehicle.cpp +++ b/src/microsim/MSVehicle.cpp @@ -2738,8 +2738,7 @@ MSVehicle::planMoveInternal(const SUMOTime t, MSLeaderInfo ahead, DriveItemVecto // arrivalSpeed / arrivalTime when braking for red light is only relevent for rail signal switching const SUMOTime arrivalTime = getArrivalTime(t, seen, v, vLinkPass); // the vehicle is able to brake in front of a yellow/red traffic light - lfLinks.push_back(DriveProcessItem(*link, v, vLinkWait, false, arrivalTime, vLinkWait, 0, seen, -1)); - //lfLinks.push_back(DriveProcessItem(0, vLinkWait, vLinkWait, false, 0, 0, stopDist)); + lfLinks.push_back(DriveProcessItem(*link, v, vLinkWait, 0, arrivalTime, vLinkWait, 0, seen, -1)); break; } @@ -5118,7 +5117,8 @@ MSVehicle::setApproachingForAllLinks(const SUMOTime t) { dpi.myArrivalTime += (SUMOTime)RandHelper::rand((int)2, getRNG()); // tie braker } dpi.myLink->setApproaching(this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(), - dpi.mySetRequest, dpi.myArrivalSpeedBraking, getWaitingTime(), dpi.myDistance, getLateralPositionOnLane()); + (MSLink::ApproachFlag)dpi.mySetRequest, + dpi.myArrivalSpeedBraking, getWaitingTime(), dpi.myDistance, getLateralPositionOnLane()); } } if (myLaneChangeModel->getShadowLane() != nullptr) { @@ -5133,7 +5133,8 @@ MSVehicle::setApproachingForAllLinks(const SUMOTime t) { if (parallelLink != nullptr) { const double latOffset = getLane()->getRightSideOnEdge() - myLaneChangeModel->getShadowLane()->getRightSideOnEdge(); parallelLink->setApproaching(this, dpi.myArrivalTime, dpi.myArrivalSpeed, dpi.getLeaveSpeed(), - dpi.mySetRequest, dpi.myArrivalSpeedBraking, getWaitingTime(), dpi.myDistance, + (MSLink::ApproachFlag)dpi.mySetRequest, + dpi.myArrivalSpeedBraking, getWaitingTime(), dpi.myDistance, latOffset); myLaneChangeModel->setShadowApproachingInformation(parallelLink); } @@ -5164,7 +5165,7 @@ MSVehicle::registerInsertionApproach(MSLink* link, double dist) { DriveProcessItem dpi(0, dist); dpi.myLink = link; const double arrivalSpeedBraking = getCarFollowModel().getMinimalArrivalSpeedEuler(dist, getSpeed()); - link->setApproaching(this, SUMOTime_MAX, 0, 0, false, arrivalSpeedBraking, 0, dpi.myDistance, 0); + link->setApproaching(this, SUMOTime_MAX, 0, 0, MSLink::NO_REQUEST, arrivalSpeedBraking, 0, dpi.myDistance, 0); // ensure cleanup in the next step myLFLinkLanes.push_back(dpi); } @@ -7342,7 +7343,7 @@ MSVehicle::loadState(const SUMOSAXAttributes& attrs, const SUMOTime offset) { } void -MSVehicle::loadPreviousApproaching(MSLink* link, bool setRequest, +MSVehicle::loadPreviousApproaching(MSLink* link, int setRequest, SUMOTime arrivalTime, double arrivalSpeed, double arrivalSpeedBraking, double dist, double leaveSpeed) { diff --git a/src/microsim/MSVehicle.h b/src/microsim/MSVehicle.h index b864999..6152d2c 100644 --- a/src/microsim/MSVehicle.h +++ b/src/microsim/MSVehicle.h @@ -1729,7 +1729,7 @@ public: */ void loadState(const SUMOSAXAttributes& attrs, const SUMOTime offset); - void loadPreviousApproaching(MSLink* link, bool setRequest, + void loadPreviousApproaching(MSLink* link, int setRequest, SUMOTime arrivalTime, double arrivalSpeed, double arrivalSpeedBraking, double dist, double leaveSpeed); @@ -1955,7 +1955,7 @@ protected: MSLink* myLink; double myVLinkPass; double myVLinkWait; - bool mySetRequest; + int mySetRequest; SUMOTime myArrivalTime; double myArrivalSpeed; double myArrivalSpeedBraking; @@ -1964,7 +1964,7 @@ protected: bool hadStoppedVehicle; double availableSpace; - DriveProcessItem(MSLink* link, double vPass, double vWait, bool setRequest, + DriveProcessItem(MSLink* link, double vPass, double vWait, int setRequest, SUMOTime arrivalTime, double arrivalSpeed, double arrivalSpeedBraking, double distance, @@ -1981,7 +1981,7 @@ protected: /// @brief constructor if the link shall not be passed DriveProcessItem(double vWait, double distance, double _availableSpace = 0) : - myLink(0), myVLinkPass(vWait), myVLinkWait(vWait), mySetRequest(false), + myLink(0), myVLinkPass(vWait), myVLinkWait(vWait), mySetRequest(0), myArrivalTime(0), myArrivalSpeed(0), myArrivalSpeedBraking(0), myDistance(distance), diff --git a/src/microsim/traffic_lights/MSRailSignal.cpp b/src/microsim/traffic_lights/MSRailSignal.cpp index 132a680..d79dc9d 100644 --- a/src/microsim/traffic_lights/MSRailSignal.cpp +++ b/src/microsim/traffic_lights/MSRailSignal.cpp @@ -503,7 +503,7 @@ MSRailSignal::hasOncomingRailTraffic(MSLink* link, const MSVehicle* ego, bool& b #endif // yield to all foeLinks beyond switch Approaching approaching(ego, - MSLink::ApproachingVehicleInformation(SIMSTEP, 0, 0, 0, false, 0, 0, std::numeric_limits::max(), 0, 0)); + MSLink::ApproachingVehicleInformation(SIMSTEP, 0, 0, 0, MSLink::NO_REQUEST, 0, 0, std::numeric_limits::max(), 0, 0)); for (MSLink* const switchLink : dw.myProtectingSwitchesBidi) { myBlockingVehicles.clear(); myRivalVehicles.clear();