Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSRailSignal.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-2024 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/****************************************************************************/
20// A rail signal logic
21/****************************************************************************/
22#pragma once
23#include <config.h>
24
25#include <vector>
26#include <microsim/MSRoute.h>
29
30
31// ===========================================================================
32// class declarations
33// ===========================================================================
34class MSLink;
37class MSDriveWay;
38
39
40// ===========================================================================
41// class definitions
42// ===========================================================================
48public:
57 const std::string& id, const std::string& programID, SUMOTime delay,
58 const Parameterised::Map& parameters);
59
60
65 void init(NLDetectorBuilder& nb) override;
66
67
70
71 inline int getNumericalID() const {
72 return myNumericalID;
73 }
74
76 void setParameter(const std::string& key, const std::string& value) override;
77
83 void addLink(MSLink* link, MSLane* lane, int pos) override;
84
87
92 void adaptLinkInformationFrom(const MSTrafficLightLogic& logic) override;
94
95
98
99
109 bool updateCurrentPhase();
110
115 SUMOTime trySwitch() override;
116
118
119
122
127 int getPhaseNumber() const override;
128
133 const Phases& getPhases() const override;
134
143 const MSPhaseDefinition& getPhase(int givenstep) const override;
144
146 bool getsMajorGreen(int /*linkIndex*/) const override {
147 return true;
148 }
150
151
154
159 int getCurrentPhaseIndex() const override;
160
164 const MSPhaseDefinition& getCurrentPhaseDef() const override;
166
167
170
175 SUMOTime getPhaseIndexAtTime(SUMOTime simStep) const override;
176
182 SUMOTime getOffsetFromIndex(int index) const override;
183
189 int getIndexFromOffset(SUMOTime offset) const override;
191
192
195
203 void changeStepAndDuration(MSTLLogicControl& tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration) override {
204 UNUSED_PARAMETER(tlcontrol);
205 UNUSED_PARAMETER(simStep);
206 UNUSED_PARAMETER(step);
207 UNUSED_PARAMETER(stepDuration);
208 }
210
212 VehicleVector getBlockingVehicles(int linkIndex) override;
213 std::string getBlockingVehicleIDs() const;
214
216 VehicleVector getRivalVehicles(int linkIndex) override;
217 std::string getRivalVehicleIDs() const;
218
220 VehicleVector getPriorityVehicles(int linkIndex) override;
221 std::string getPriorityVehicleIDs() const;
222
224 std::string getConstraintInfo(int linkIndex);
225 std::string getConstraintInfo() const;
226
227 std::vector<const MSDriveWay*> getBlockingDriveWays(int linkIndex) override;
228 std::string getBlockingDriveWayIDs() const;
229
230 std::string getRequestedDriveWay(int linkIndex) override;
231 std::string getRequestedDriveWay() const;
232
234 void writeBlocks(OutputDevice& od, bool writeVehicles) const;
235
237 void addConstraint(const std::string& tripId, MSRailSignalConstraint* constraint);
238
241 const std::map<std::string, std::vector<MSRailSignalConstraint*> >& getConstraints() const {
242 return myConstraints;
243 }
244
246 bool removeConstraint(const std::string& tripId, MSRailSignalConstraint* constraint);
247 void removeConstraints();
249
251 void updateDriveway(int numericalID);
252
253 /* @brief return whether vehicle insertion must be delayed for an oncoming train
254 * @param[in] link The rail signal link before which the vehicle is being inserted
255 * @param[in] veh The vehicle being inserted
256 * @param[in] brakeBeforeSignal Whether the vehicle may brake before the signal,
257 * Returns true if the vehicle has to brake before the signal
258 */
259 static bool hasInsertionConstraint(MSLink* link, const MSVehicle* veh, std::string& info, bool& isInsertionOrder);
260
261 static void initDriveWays(const SUMOVehicle* ego, bool update);
262
263 typedef std::pair<const SUMOVehicle* const, const MSLink::ApproachingVehicleInformation> Approaching;
264 typedef std::map<const MSLane*, int, ComparatorNumericalIdLess> LaneVisitedMap;
265
266 /* @brief retrieve driveway with the given numerical id
267 * @note: throws exception if the driveway does not exist at this rail signal */
268 const MSDriveWay& retrieveDriveWay(int numericalID) const;
269
270 const MSDriveWay& retrieveDriveWayForVeh(int tlIndex, const SUMOVehicle* veh);
272
273 const std::vector<MSDriveWay*> retrieveDriveWays(int tlIndex) const;
274
276 bool constraintsAllow(const SUMOVehicle* veh, bool storeWaitRelation = false) const;
277
278 bool isMovingBlock() const {
279 return myMovingBlock;
280 }
281
282 static bool storeVehicles() {
283 return myStoreVehicles;
284 }
285
287 return myBlockingVehicles;
288 }
289
290 static std::vector<const MSDriveWay*>& blockingDriveWays() {
291 return myBlockingDriveWays;
292 }
293
295 return myRivalVehicles;
296 }
297
299 return myPriorityVehicles;
300 }
301
303 static std::string describeLinks(std::vector<MSLink*> links);
304
305protected:
306
307 const int myNumericalID;
308
309 std::string getNewDrivewayID();
310
311 /* The driveways for each link
312 */
313 struct LinkInfo {
315 LinkInfo(MSLink* link);
316
318 ~LinkInfo();
319
321
323 std::vector<MSDriveWay*> myDriveways;
324
326 std::string getID() const;
327
330 MSDriveWay& getDriveWay(MSRouteIterator firstIt, MSRouteIterator endIt, const std::string& info = "");
331
333 void reroute(SUMOVehicle* veh, const MSEdgeVector& occupied);
334
336 void reset();
337
340 };
341
343 std::vector<LinkInfo> myLinkInfos;
344
345protected:
346
352
355
358
361
363 std::map<std::string, std::vector<MSRailSignalConstraint*> > myConstraints;
364
367
368 static int myRSIndex;
369
370protected:
372 void storeTraCIVehicles(int linkIndex);
373
375
376 static bool myStoreVehicles;
380 static std::string myConstraintInfo;
381 static std::vector<const MSDriveWay*> myBlockingDriveWays;
382 static std::string myRequestedDriveWay;
384
385
386};
long long int SUMOTime
Definition GUI.h:36
std::vector< MSEdge * > MSEdgeVector
Definition MSEdge.h:73
ConstMSEdgeVector::const_iterator MSRouteIterator
Definition MSRoute.h:57
#define UNUSED_PARAMETER(x)
Definition StdDefs.h:30
Representation of a lane in the micro simulation.
Definition MSLane.h:84
The definition of a single phase of a tls logic.
A base class for constraints.
A signal for rails.
bool isMovingBlock() const
static VehicleVector myRivalVehicles
std::string getBlockingVehicleIDs() const
Phases myPhases
The list of phases this logic uses.
static VehicleVector myPriorityVehicles
std::string getRequestedDriveWay() const
int myPhaseIndex
MSTrafficLightLogic requires that the phase index changes whenever signals change their state.
SUMOTime getOffsetFromIndex(int index) const override
Returns the position (start of a phase during a cycle) from of a given step.
void setParameter(const std::string &key, const std::string &value) override
Sets a parameter and updates internal constants.
static std::string myConstraintInfo
MSPhaseDefinition myCurrentPhase
The current phase.
void addConstraint(const std::string &tripId, MSRailSignalConstraint *constraint)
register constraint for signal switching
std::vector< LinkInfo > myLinkInfos
data storage for every link at this node (more than one when directly guarding a switch)
const MSDriveWay & retrieveDriveWayForVeh(int tlIndex, const SUMOVehicle *veh)
SUMOTime getPhaseIndexAtTime(SUMOTime simStep) const override
Returns the index of the logic at the given simulation step.
std::string getPriorityVehicleIDs() const
static std::string myRequestedDriveWay
const std::map< std::string, std::vector< MSRailSignalConstraint * > > & getConstraints() const
VehicleVector getBlockingVehicles(int linkIndex) override
return vehicles that block the intersection/rail signal for vehicles that wish to pass the given link...
void writeBlocks(OutputDevice &od, bool writeVehicles) const
write rail signal block output for all links and driveways
void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration) override
Changes the current phase and her duration.
VehicleVector getRivalVehicles(int linkIndex) override
return vehicles that approach the intersection/rail signal and are in conflict with vehicles that wis...
int myDriveWayIndex
running number of driveways created for this signal
static std::string describeLinks(std::vector< MSLink * > links)
print link descriptions
bool getsMajorGreen(int) const override
whether the given link index ever turns 'G'
~MSRailSignal()
Destructor.
void adaptLinkInformationFrom(const MSTrafficLightLogic &logic) override
Applies information about controlled links and lanes from the given logic.
static int myRSIndex
static VehicleVector myBlockingVehicles
bool constraintsAllow(const SUMOVehicle *veh, bool storeWaitRelation=false) const
whether the given vehicle is free to drive
void removeConstraints()
void storeTraCIVehicles(int linkIndex)
update vehicle lists for traci calls
int getIndexFromOffset(SUMOTime offset) const override
Returns the step (the phasenumber) of a given position of the cycle.
void init(NLDetectorBuilder &nb) override
Initialises the rail signal with information about adjacent rail signals.
std::map< std::string, std::vector< MSRailSignalConstraint * > > myConstraints
map from tripId to constraint list
std::pair< const SUMOVehicle *const, const MSLink::ApproachingVehicleInformation > Approaching
int getNumericalID() const
int getPhaseNumber() const override
Returns the number of phases.
const MSPhaseDefinition & getPhase(int givenstep) const override
Returns the definition of the phase from the given position within the plan.
static VehicleVector & rivalVehicles()
static bool storeVehicles()
SUMOTime trySwitch() override
Switches to the next phase.
std::string getBlockingDriveWayIDs() const
const std::vector< MSDriveWay * > retrieveDriveWays(int tlIndex) const
const int myNumericalID
const MSDriveWay & retrieveDriveWay(int numericalID) const
static bool myStoreVehicles
std::map< const MSLane *, int, ComparatorNumericalIdLess > LaneVisitedMap
bool myMovingBlock
whether the signal is in moving block mode (only protects from oncoming and flanking trains)
bool removeConstraint(const std::string &tripId, MSRailSignalConstraint *constraint)
remove constraint for signal switching
static std::vector< const MSDriveWay * > myBlockingDriveWays
bool updateCurrentPhase()
returns the state of the signal that actually required
static VehicleVector & priorityVehicles()
const Phases & getPhases() const override
Returns the phases of this tls program.
const MSPhaseDefinition & getCurrentPhaseDef() const override
Returns the definition of the current phase.
void updateDriveway(int numericalID)
update driveway for extended deadlock protection
std::string getConstraintInfo() const
static std::vector< const MSDriveWay * > & blockingDriveWays()
static VehicleVector & blockingVehicles()
std::string getNewDrivewayID()
static void initDriveWays(const SUMOVehicle *ego, bool update)
void addLink(MSLink *link, MSLane *lane, int pos) override
Adds a link on building.
const MSDriveWay & retrieveDriveWayForRoute(int tlIndex, MSRouteIterator first, MSRouteIterator end)
std::string getRivalVehicleIDs() const
static bool hasInsertionConstraint(MSLink *link, const MSVehicle *veh, std::string &info, bool &isInsertionOrder)
VehicleVector getPriorityVehicles(int linkIndex) override
return vehicles that approach the intersection/rail signal and have priority over vehicles that wish ...
std::vector< const MSDriveWay * > getBlockingDriveWays(int linkIndex) override
return vehicles that approach the intersection/rail signal and have priority over vehicles that wish ...
int getCurrentPhaseIndex() const override
Returns the current index within the program.
A class that stores and controls tls and switching of their programs.
The parent class for traffic light logics.
std::vector< const SUMOVehicle * > VehicleVector
list of vehicles
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
Builds detectors for microsim.
Static storage of an output device and its base (abstract) implementation.
std::map< std::string, std::string > Map
parameters map
Representation of a vehicle.
Definition SUMOVehicle.h:62