From c122f3e93b9e80b4a065199e92d646fa4d46e884 Mon Sep 17 00:00:00 2001 From: Jakob Erdmann Date: Fri, 21 Feb 2025 12:21:00 +0100 Subject: [PATCH] fix #16208 --- src/microsim/MSLane.cpp | 3 ++- src/microsim/traffic_lights/MSRailSignal.cpp | 2 +- src/microsim/traffic_lights/MSRailSignalControl.cpp | 6 ++++++ src/microsim/traffic_lights/MSRailSignalControl.h | 8 ++++++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/microsim/MSLane.cpp b/src/microsim/MSLane.cpp index 6dbe875ff3cb..e709b254c091 100644 --- a/src/microsim/MSLane.cpp +++ b/src/microsim/MSLane.cpp @@ -864,7 +864,8 @@ MSLane::isInsertionSuccess(MSVehicle* aVehicle, double dist = cfModel.brakeGap(speed) + aVehicle->getVehicleType().getMinGap(); const bool isRail = aVehicle->isRail(); if (isRail && insertionChecks != (int)InsertionCheck::NONE - && aVehicle->getParameter().departProcedure != DepartDefinition::SPLIT) { + && aVehicle->getParameter().departProcedure != DepartDefinition::SPLIT + && MSRailSignalControl::isSignalized(aVehicle->getVClass())) { const MSDriveWay* dw = MSDriveWay::getDepartureDriveway(aVehicle); MSEdgeVector occupied; if (dw->foeDriveWayOccupied(false, aVehicle, occupied)) { diff --git a/src/microsim/traffic_lights/MSRailSignal.cpp b/src/microsim/traffic_lights/MSRailSignal.cpp index eeeefd1f3976..c235e9787ccd 100644 --- a/src/microsim/traffic_lights/MSRailSignal.cpp +++ b/src/microsim/traffic_lights/MSRailSignal.cpp @@ -86,7 +86,6 @@ MSRailSignal::MSRailSignal(MSTLLogicControl& tlcontrol, myDriveWayIndex(0) { myDefaultCycleTime = DELTA_T; myMovingBlock = OptionsCont::getOptions().getBool("railsignal-moving-block"); - MSRailSignalControl::getInstance().addSignal(this); mySwitchCommand->deschedule(this); } @@ -105,6 +104,7 @@ MSRailSignal::init(NLDetectorBuilder&) { updateCurrentPhase(); setTrafficLightSignals(MSNet::getInstance()->getCurrentTimeStep()); myNumLinks = (int)myLinks.size(); + MSRailSignalControl::getInstance().addSignal(this); } diff --git a/src/microsim/traffic_lights/MSRailSignalControl.cpp b/src/microsim/traffic_lights/MSRailSignalControl.cpp index 509179e1cc38..56d90045d95c 100644 --- a/src/microsim/traffic_lights/MSRailSignalControl.cpp +++ b/src/microsim/traffic_lights/MSRailSignalControl.cpp @@ -39,6 +39,7 @@ // static value definitions // =========================================================================== MSRailSignalControl* MSRailSignalControl::myInstance(nullptr); +SVCPermissions MSRailSignalControl::mySignalizedClasses(SVC_RAIL | SVC_RAIL_FAST | SVC_RAIL_ELECTRIC | SVC_RAIL_URBAN); // =========================================================================== // method definitions @@ -95,6 +96,11 @@ MSRailSignalControl::vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet void MSRailSignalControl::addSignal(MSRailSignal* signal) { mySignals.push_back(signal); + for (const auto& links : signal->getLinks()) { + for (const MSLink* link : links) { + mySignalizedClasses |= link->getPermissions(); + } + } } diff --git a/src/microsim/traffic_lights/MSRailSignalControl.h b/src/microsim/traffic_lights/MSRailSignalControl.h index 36c4065e25c6..1ef2f2c648f0 100644 --- a/src/microsim/traffic_lights/MSRailSignalControl.h +++ b/src/microsim/traffic_lights/MSRailSignalControl.h @@ -93,6 +93,11 @@ class MSRailSignalControl : public MSNet::VehicleStateListener { void updateSignals(SUMOTime t); + static bool isSignalized(SUMOVehicleClass svc) { + return (mySignalizedClasses & svc) == svc; + } + + protected: void findDeadlockFoes(const MSDriveWay* dw, const std::vector& others, std::vector deadlockFoes); @@ -132,6 +137,9 @@ class MSRailSignalControl : public MSNet::VehicleStateListener { std::map, bool> myDriveWayCompatibility; std::set myActiveSignals; + /// @brief signalized classes + static SVCPermissions mySignalizedClasses; + static MSRailSignalControl* myInstance;