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();