Skip to content

Commit

Permalink
fix #14589
Browse files Browse the repository at this point in the history
  • Loading branch information
namdre committed Mar 24, 2024
1 parent 609e5b1 commit 47a8a65
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 29 deletions.
6 changes: 1 addition & 5 deletions src/libsumo/Lane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,11 +393,7 @@ Lane::setChangePermissions(const std::string& laneID, std::vector<std::string> a

void
Lane::setMaxSpeed(const std::string& laneID, double speed) {
if (MSGlobals::gUseMesoSim) {
getLane(laneID)->getEdge().setMaxSpeed(speed);
} else {
getLane(laneID)->setMaxSpeed(speed, false, true);
}
getLane(laneID)->setMaxSpeed(speed, false, true);
}


Expand Down
12 changes: 8 additions & 4 deletions src/mesosim/MESegment.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -616,9 +616,9 @@ MESegment::receive(MEVehicle* veh, const int qIdx, SUMOTime time, const bool isD
}
assert(veh->getEdge() == &getEdge());
// route continues
const double maxSpeedOnEdge = veh->getEdge()->getVehicleMaxSpeed(veh);
const double uspeed = MAX2(maxSpeedOnEdge, MESO_MIN_SPEED);
Queue& q = myQueues[qIdx];
const double maxSpeedOnEdge = veh->getEdge()->getLanes()[qIdx]->getVehicleMaxSpeed(veh);
const double uspeed = MAX2(maxSpeedOnEdge, MESO_MIN_SPEED);
std::vector<MEVehicle*>& cars = q.getModifiableVehicles();
MEVehicle* newLeader = nullptr; // first vehicle in the current queue
const SUMOTime stopTime = veh->checkStop(time);
Expand Down Expand Up @@ -724,13 +724,17 @@ MESegment::newArrival(const MEVehicle* const v, double newSpeed, SUMOTime curren


void
MESegment::setSpeed(double newSpeed, SUMOTime currentTime, double jamThresh) {
MESegment::setSpeed(double newSpeed, SUMOTime currentTime, double jamThresh, int qIdx) {
recomputeJamThreshold(jamThresh);
//myTau_length = MAX2(MESO_MIN_SPEED, newSpeed) * myEdge.getLanes().size() / TIME2STEPS(1);
int i = 0;
for (const Queue& q : myQueues) {
if (q.size() != 0) {
setSpeedForQueue(newSpeed, currentTime, q.getBlockTime(), q.getVehicles());
if (qIdx == -1 || qIdx == i) {
setSpeedForQueue(newSpeed, currentTime, q.getBlockTime(), q.getVehicles());
}
}
i++;
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/mesosim/MESegment.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ class MESegment : public Named {
* all vehicles in it. Also set/recompute myJamThreshold
* @param[in] jamThresh follows the semantic of option meso-jam-threshold
*/
void setSpeed(double newSpeed, SUMOTime currentTime, double jamThresh = DO_NOT_PATCH_JAM_THRESHOLD);
void setSpeed(double newSpeed, SUMOTime currentTime, double jamThresh = DO_NOT_PATCH_JAM_THRESHOLD, int qIdx = -1);

/** @brief Returns the (planned) time at which the next vehicle leaves this segment
* @return The time the vehicle thinks it leaves
Expand Down
9 changes: 1 addition & 8 deletions src/microsim/MSEdge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1080,14 +1080,7 @@ MSEdge::setMaxSpeed(double val, double jamThreshold) {
assert(val >= 0);
if (myLanes != nullptr) {
for (std::vector<MSLane*>::const_iterator i = myLanes->begin(); i != myLanes->end(); ++i) {
(*i)->setMaxSpeed(val);
}
}
if (MSGlobals::gUseMesoSim) {
MESegment* first = MSGlobals::gMesoNet->getSegmentForEdge(*this);
while (first != nullptr) {
first->setSpeed(val, SIMSTEP, jamThreshold);
first = first->getNextSegment();
(*i)->setMaxSpeed(val, false, false, jamThreshold);
}
}
}
Expand Down
10 changes: 9 additions & 1 deletion src/microsim/MSLane.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
#include <microsim/transportables/MSTransportableControl.h>
#include <microsim/traffic_lights/MSRailSignal.h>
#include <microsim/lcmodels/MSAbstractLaneChangeModel.h>
#include <mesosim/MELoop.h>
#include "MSNet.h"
#include "MSVehicleType.h"
#include "MSEdge.h"
Expand Down Expand Up @@ -2635,11 +2636,18 @@ MSLane::getEntryLink() const {


void
MSLane::setMaxSpeed(double val, bool byVSS, bool byTraCI) {
MSLane::setMaxSpeed(double val, bool byVSS, bool byTraCI, double jamThreshold) {
myMaxSpeed = val;
mySpeedByVSS = byVSS;
mySpeedByTraCI = byTraCI;
myEdge->recalcCache();
if (MSGlobals::gUseMesoSim) {
MESegment* first = MSGlobals::gMesoNet->getSegmentForEdge(*myEdge);
while (first != nullptr) {
first->setSpeed(val, SIMSTEP, jamThreshold, myIndex);
first = first->getNextSegment();
}
}
}


Expand Down
2 changes: 1 addition & 1 deletion src/microsim/MSLane.h
Original file line number Diff line number Diff line change
Expand Up @@ -733,7 +733,7 @@ class MSLane : public Named, public Parameterised {
* @param[in] whether a variable speed sign (VSS) imposes the speed limit
* @param[in] whether TraCI imposes the speed limit
*/
void setMaxSpeed(double val, bool byVSS = false, bool byTraCI = false);
void setMaxSpeed(double val, bool byVSS = false, bool byTraCI = false, double jamThreshold = -1);

/** @brief Sets a new friction coefficient for the lane [*to be later (used by TraCI and MSCalibrator)*]
* @param[in] val the new friction coefficient [0..1]
Expand Down
12 changes: 3 additions & 9 deletions src/microsim/trigger/MSLaneSpeedTrigger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,15 +115,9 @@ MSLaneSpeedTrigger::executeSpeedChange(SUMOTime currentTime) {
SUMOTime
MSLaneSpeedTrigger::processCommand(bool move2next, SUMOTime currentTime) {
const double speed = getCurrentSpeed();
if (MSGlobals::gUseMesoSim) {
if (myDestLanes.size() > 0 && myDestLanes.front()->getSpeedLimit() != speed) {
myDestLanes.front()->getEdge().setMaxSpeed(speed);
}
} else {
const bool altered = speed != myDefaultSpeed;
for (MSLane* const lane : myDestLanes) {
lane->setMaxSpeed(speed, altered);
}
const bool altered = speed != myDefaultSpeed;
for (MSLane* const lane : myDestLanes) {
lane->setMaxSpeed(speed, altered);
}
if (!move2next) {
// changed from the gui
Expand Down

0 comments on commit 47a8a65

Please sign in to comment.