Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSRailSignalControl.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2002-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// Centralized services for rail signal control (Singleton)
19// - monitors track usage for long-range deadlock prevention
20/****************************************************************************/
21#pragma once
22#include <config.h>
23#include <microsim/MSNet.h>
24
25// ===========================================================================
26// class declarations
27// ===========================================================================
28class MSRailSignal;
30class MSEdge;
31class MSDriveWay;
32
33// ===========================================================================
34// class definitions
35// ===========================================================================
41public:
42
44
46
47 static bool hasInstance() {
48 return myInstance != nullptr;
49 }
50
51 static void cleanup();
52
54 static void clearState();
55
58 myWaitRelations.clear();
59 myWrittenDeadlocks.clear();
60 }
61
62 void addWaitRelation(const SUMOVehicle* waits, const MSRailSignal* rs, const SUMOVehicle* reason, MSRailSignalConstraint* constraint = nullptr);
63
64 void addDrivewayFollower(const MSDriveWay* dw, const MSDriveWay* dw2);
65
67 void addDWDeadlockChecks(const MSRailSignal* rs, MSDriveWay* dw);
68
70 bool haveDeadlock(const SUMOVehicle* veh) const;
71
72 void loadDeadlockCheck(std::vector<const MSRailSignal*> signals);
73 void loadDeadlockRoute(const ConstMSEdgeVector& edges);
74
80 void vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet::VehicleState to, const std::string& info = "");
81
82 void addSignal(MSRailSignal* signal);
83
84 const std::vector<MSRailSignal*>& getSignals() const {
85 return mySignals;
86 }
87
89 void notifyApproach(const MSLink* link);
90
92 void updateSignals(SUMOTime t);
93
94
95 static bool isSignalized(SUMOVehicleClass svc) {
96 return (mySignalizedClasses & svc) == svc;
97 }
98
99 static bool isMovingBlock(SVCPermissions svc) {
100 return (myMBClasses & svc & SVC_RAIL_CLASSES) == (svc & SVC_RAIL_CLASSES);
101 }
102
104 return ((mySignalizedClasses | myMBClasses) & svc) == svc;
105 }
106
109 myMBClasses = mbSvc;
110 }
111
113 struct Deadlock {
114 std::vector<const MSRailSignal*> signals;
115 std::vector<ConstMSEdgeVector> edges;
117 };
118
119protected:
120
121 void findDeadlockFoes(const MSDriveWay* dw, const Deadlock& dl, int signalIndex, std::vector<const MSDriveWay*> deadlockFoes);
122 void findDeadlockFoesFromRoutes(const MSDriveWay* dw, const Deadlock& dl, int signalIndex, std::vector<const MSDriveWay*> deadlockFoes);
123
124
125private:
128
130 void updateDriveways(const MSEdge* used);
131
133 std::set<const MSEdge*> myUsedEdges;
134
136 WaitRelation(const MSRailSignal* _railSignal = nullptr, const SUMOVehicle* _foe = nullptr, MSRailSignalConstraint* _constraint = nullptr) :
137 railSignal(_railSignal), foe(_foe), constraint(_constraint) {}
138 // indices along route
142 };
143 std::map<const SUMOVehicle*, WaitRelation> myWaitRelations;
144
145 mutable std::set<std::set<const SUMOVehicle*> > myWrittenDeadlocks;
146
147 std::vector<Deadlock> myLoadedDeadlocks;
148 // @brief index in list of loaded deadlocks, index of signal in list of signals
149 std::map<const MSRailSignal*, std::vector<std::pair<int, int> > > mySignalDeadlocks;
150
151 std::map<const MSDriveWay*, std::set<const MSDriveWay*, ComparatorNumericalIdLess>> myDriveWaySucc;
152 std::map<const MSDriveWay*, std::set<const MSDriveWay*>> myDriveWayPred;
153
155 std::vector<MSRailSignal*> mySignals;
156
158 std::vector<std::pair<MSLink*, int> > mySwitchedGreenFlanks;
159 std::map<std::pair<int, int>, bool> myDriveWayCompatibility;
160 std::set<MSRailSignal*, ComparatorNumericalIdLess> myActiveSignals;
162
166
168
169
170};
long long int SUMOTime
Definition GUI.h:36
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:75
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_RAIL_CLASSES
classes which drive on tracks
A road/street connecting two junctions.
Definition MSEdge.h:78
Interface for objects listening to vehicle state changes.
Definition MSNet.h:669
VehicleState
Definition of a vehicle state.
Definition MSNet.h:636
A base class for constraints.
A signal for rails.
void loadDeadlockRoute(const ConstMSEdgeVector &edges)
static bool isSignalized(SUMOVehicleClass svc)
void notifyApproach(const MSLink *link)
switch rail signal to active
void addSignal(MSRailSignal *signal)
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
std::vector< Deadlock > myLoadedDeadlocks
void addDrivewayFollower(const MSDriveWay *dw, const MSDriveWay *dw2)
std::vector< MSRailSignal * > mySignals
list of all rail signals
void findDeadlockFoesFromRoutes(const MSDriveWay *dw, const Deadlock &dl, int signalIndex, std::vector< const MSDriveWay * > deadlockFoes)
MSRailSignalControl()
Constructor.
void loadDeadlockCheck(std::vector< const MSRailSignal * > signals)
std::set< const MSEdge * > myUsedEdges
all rail edges that are part of a known route
void addWaitRelation(const SUMOVehicle *waits, const MSRailSignal *rs, const SUMOVehicle *reason, MSRailSignalConstraint *constraint=nullptr)
static MSRailSignalControl * myInstance
std::map< const SUMOVehicle *, WaitRelation > myWaitRelations
void addDWDeadlockChecks(const MSRailSignal *rs, MSDriveWay *dw)
check whether the given signal and driveway are part of a deadlock circle
static MSRailSignalControl & getInstance()
std::map< const MSDriveWay *, std::set< const MSDriveWay * > > myDriveWayPred
static bool isUsingDriveWays(SVCPermissions svc)
void updateDriveways(const MSEdge *used)
compute additioanl deadlock-check requirements for registered driveways
static SVCPermissions mySignalizedClasses
signalized classes
bool haveDeadlock(const SUMOVehicle *veh) const
whether there is a circle in the waiting-for relationships that contains the given vehicle
const std::vector< MSRailSignal * > & getSignals() const
static bool isMovingBlock(SVCPermissions svc)
std::set< std::set< const SUMOVehicle * > > myWrittenDeadlocks
void updateSignals(SUMOTime t)
update active rail signals
std::set< MSRailSignal *, ComparatorNumericalIdLess > myActiveSignals
std::map< std::pair< int, int >, bool > myDriveWayCompatibility
static void clearState()
Perform resets events when quick-loading state.
static SVCPermissions myMBClasses
static void initSignalized(SVCPermissions svc, SVCPermissions mbSvc)
std::map< const MSDriveWay *, std::set< const MSDriveWay *, ComparatorNumericalIdLess > > myDriveWaySucc
std::map< const MSRailSignal *, std::vector< std::pair< int, int > > > mySignalDeadlocks
void resetWaitRelations()
reset all waiting-for relationships at the start of the simulation step
void findDeadlockFoes(const MSDriveWay *dw, const Deadlock &dl, int signalIndex, std::vector< const MSDriveWay * > deadlockFoes)
std::vector< std::pair< MSLink *, int > > mySwitchedGreenFlanks
list of signals that switched green along with driveway index
A signal for rails.
Representation of a vehicle.
Definition SUMOVehicle.h:63
storage for loaded deadlocks
std::vector< const MSRailSignal * > signals
std::vector< ConstMSEdgeVector > edges
WaitRelation(const MSRailSignal *_railSignal=nullptr, const SUMOVehicle *_foe=nullptr, MSRailSignalConstraint *_constraint=nullptr)