Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSRailSignal.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-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#include <config.h>
23
24#include <cassert>
25#include <utility>
26#include <vector>
27#include <bitset>
28#ifdef HAVE_FOX
30#endif
33#include <microsim/MSNet.h>
34#include <microsim/MSEdge.h>
36#include <microsim/MSLane.h>
37#include <microsim/MSLink.h>
38#include <microsim/MSVehicle.h>
41#include <microsim/MSLane.h>
42
43#include "MSTLLogicControl.h"
44#include "MSTrafficLightLogic.h"
45#include "MSPhaseDefinition.h"
46#include "MSTLLogicControl.h"
48#include "MSRailSignalControl.h"
49#include "MSDriveWay.h"
50#include "MSRailSignal.h"
51
52//#define DEBUG_SELECT_DRIVEWAY
53//#define DEBUG_DRIVEWAY_UPDATE
54//#define DEBUG_SIGNALSTATE
55//#define DEBUG_REROUTE
56
57#define DEBUG_COND DEBUG_HELPER(this)
58#define DEBUG_COND_LINKINFO DEBUG_HELPER(myLink->getTLLogic())
59#define DEBUG_HELPER(obj) ((obj)->isSelected())
60//#define DEBUG_HELPER(obj) ((obj)->getID() == "")
61//#define DEBUG_HELPER(obj) (true)
62
63// ===========================================================================
64// static value definitions
65// ===========================================================================
66
73std::vector<const MSDriveWay*> MSRailSignal::myBlockingDriveWays;
75
76// ===========================================================================
77// method definitions
78// ===========================================================================
80 const std::string& id, const std::string& programID, SUMOTime delay,
81 const Parameterised::Map& parameters) :
82 MSTrafficLightLogic(tlcontrol, id, programID, 0, TrafficLightType::RAIL_SIGNAL, delay, parameters),
83 myNumericalID(myRSIndex++),
84 myCurrentPhase(DELTA_T, std::string(SUMO_MAX_CONNECTIONS, 'X')), // dummy phase
85 myPhaseIndex(0),
86 myDriveWayIndex(0) {
88 myMovingBlock = OptionsCont::getOptions().getBool("railsignal-moving-block");
91}
92
93void
95 if (myLanes.size() == 0) {
96 WRITE_WARNINGF(TL("Rail signal at junction '%' does not control any links"), getID());
97 }
98 for (LinkVector& links : myLinks) { //for every link index
99 if (links.size() != 1) {
100 throw ProcessError("At railSignal '" + getID() + "' found " + toString(links.size())
101 + " links controlled by index " + toString(links[0]->getTLIndex()));
102 }
103 myLinkInfos.push_back(LinkInfo(links[0]));
104 }
106 setTrafficLightSignals(MSNet::getInstance()->getCurrentTimeStep());
107 myNumLinks = (int)myLinks.size();
108}
109
110
114
115
116// ----------- Handling of controlled links
117void
122
123
124// ------------ Switching and setting current rows
127 // deschedule regular traffic light event,
128 // updateCurrentPhase is instead called from MSRailSignalControl::updateSignals
129 return SUMOTime_MAX;
130}
131
132
133
134bool
136#ifdef DEBUG_SIGNALSTATE
138#endif
139 bool keepActive = false;
140 // green by default so vehicles can be inserted at the borders of the network
141 std::string state(myLinks.size(), 'G');
142 for (LinkInfo& li : myLinkInfos) {
143 if (li.myLink->getApproaching().size() > 0) {
144 keepActive = true;
145 Approaching closest = li.myLink->getClosest();
146 MSDriveWay& driveway = li.getDriveWay(closest.first);
147 //std::cout << SIMTIME << " signal=" << getTLLinkID(li.myLink) << " veh=" << closest.first->getID() << " dw:\n";
148 //driveway.writeBlocks(*OutputDevice_COUT::getDevice());
149 const bool mustWait = !constraintsAllow(closest.first, true);
150 MSEdgeVector occupied;
151 if (mustWait || !driveway.reserve(closest, occupied)) {
152 state[li.myLink->getTLIndex()] = 'r';
153 if (occupied.size() > 0) {
154 li.reroute(const_cast<SUMOVehicle*>(closest.first), occupied);
155 }
156#ifdef DEBUG_SIGNALSTATE
157 if (gDebugFlag4) {
158 std::cout << SIMTIME << " rsl=" << li.getID() << " veh=" << closest.first->getID() << " notReserved\n";
159 }
160#endif
161 } else {
162 state[li.myLink->getTLIndex()] = 'G';
163#ifdef DEBUG_SIGNALSTATE
164 if (gDebugFlag4) {
165 std::cout << SIMTIME << " rsl=" << li.getID() << " veh=" << closest.first->getID() << " reserved\n";
166 }
167#endif
168 }
169 } else {
170 if (li.myDriveways.empty()) {
171#ifdef DEBUG_SIGNALSTATE
172 if (gDebugFlag4) {
173 std::cout << SIMTIME << " rsl=" << li.getID() << " red for unitialized signal (no driveways yet)\n";
174 }
175#endif
176 state[li.myLink->getTLIndex()] = 'r';
177 } else {
178 const MSDriveWay& driveway = *li.myDriveways.front();
179 MSEdgeVector occupied;
180 if (driveway.foeDriveWayOccupied(true, nullptr, occupied) || driveway.foeDriveWayApproached()) {
181 keepActive = true;
182#ifdef DEBUG_SIGNALSTATE
183 if (gDebugFlag4) {
184 std::cout << SIMTIME << " rsl=" << li.getID() << " red for default driveway " << driveway.getID() << "\n";
185 }
186#endif
187 state[li.myLink->getTLIndex()] = 'r';
188 } else {
189#ifdef DEBUG_SIGNALSTATE
190 if (gDebugFlag4) {
191 std::cout << SIMTIME << " rsl=" << li.getID() << " green for default driveway " << driveway.getID() << "\n";
192 }
193#endif
194 }
195 }
196 }
197 }
198 if (myCurrentPhase.getState() != state) {
201 // set link priorities
203 // execute switch actions (3D-gui)
204 //const MSTLLogicControl::TLSLogicVariants& vars = myTLControl.get(myTLLogic->getID());
205 //vars.executeOnSwitchActions();
206 }
207#ifdef DEBUG_SIGNALSTATE
208 gDebugFlag4 = false;
209#endif
210 return keepActive;
211}
212
213
214bool
215MSRailSignal::constraintsAllow(const SUMOVehicle* veh, bool storeWaitRelation) const {
216 if (myConstraints.size() == 0) {
217 return true;
218 } else {
219 const std::string tripID = veh->getParameter().getParameter("tripId", veh->getID());
220 auto it = myConstraints.find(tripID);
221 if (it != myConstraints.end()) {
222 for (MSRailSignalConstraint* c : it->second) {
223 // ignore insertion constraints here
224 if (!c->isInsertionConstraint() && !c->cleared()) {
225#ifdef DEBUG_SIGNALSTATE
226 if (gDebugFlag4) {
227 std::cout << " constraint '" << c->getDescription() << "' not cleared\n";
228 }
229#endif
230 if (storeWaitRelation && MSGlobals::gTimeToTeleportRSDeadlock > 0
232 const SUMOVehicle* foe = c->getFoe();
233 if (foe != nullptr) {
235 }
236 }
237 if (myStoreVehicles) {
238 myConstraintInfo = c->getDescription();
239 }
240 return false;
241 }
242 }
243 }
244 return true;
245 }
246}
247
248
249void
250MSRailSignal::addConstraint(const std::string& tripId, MSRailSignalConstraint* constraint) {
251 myConstraints[tripId].push_back(constraint);
252}
253
254
255bool
256MSRailSignal::removeConstraint(const std::string& tripId, MSRailSignalConstraint* constraint) {
257 if (myConstraints.count(tripId) != 0) {
258 auto& constraints = myConstraints[tripId];
259 auto it = std::find(constraints.begin(), constraints.end(), constraint);
260 if (it != constraints.end()) {
261 delete *it;
262 constraints.erase(it);
263 return true;
264 }
265 }
266 return false;
267}
268
269void
271 for (auto item : myConstraints) {
272 for (MSRailSignalConstraint* c : item.second) {
273 delete c;
274 }
275 }
276 myConstraints.clear();
277}
278
279
280// ------------ Static Information Retrieval
281int
283 return 0;
284}
285
288 return myPhases;
289}
290
293 return myCurrentPhase;
294}
295
296// ------------ Dynamic Information Retrieval
297int
301
306
307// ------------ Conversion between time and phase
310 return 0;
311}
312
315 return 0;
316}
317
318int
320 return 0;
321}
322
323
324void
325MSRailSignal::addLink(MSLink* link, MSLane* lane, int pos) {
326 if (pos >= 0) {
327 MSTrafficLightLogic::addLink(link, lane, pos);
328 } // ignore uncontrolled link
329}
330
331
332std::string
333MSRailSignal::describeLinks(std::vector<MSLink*> links) {
334 std::string result;
335 for (MSLink* link : links) {
336 result += link->getDescription() + " ";
337 }
338 return result;
339}
340
341
342void
343MSRailSignal::writeBlocks(OutputDevice& od, bool writeVehicles) const {
344 od.openTag("railSignal");
346 for (const LinkInfo& li : myLinkInfos) {
347 MSLink* link = li.myLink;
348 od.openTag("link");
352 for (const MSDriveWay* dw : li.myDriveways) {
353 if (writeVehicles) {
354 dw->writeBlockVehicles(od);
355 } else {
356 dw->writeBlocks(od);
357 }
358 }
359 od.closeTag(); // link
360 }
361 od.closeTag(); // railSignal
362}
363
364
365void
367 const ConstMSEdgeVector& edges = ego->getRoute().getEdges();
368 int endIndex = ego->getParameter().arrivalEdge;
369 if (endIndex < 0) {
370 endIndex = (int)edges.size() - 1;
371 }
372 const int departIndex = ego->getParameter().departEdge;
373 MSDriveWay* prev = const_cast<MSDriveWay*>(MSDriveWay::getDepartureDriveway(ego));
374 for (int i = departIndex; i <= endIndex - 1; i++) {
375 const MSEdge* e = edges[i];
377 const MSEdge* e2 = edges[i + 1];
378 for (MSLane* lane : e->getLanes()) {
379 for (MSLink* link : lane->getLinkCont()) {
380 if (&link->getLane()->getEdge() == e2) {
381 MSRailSignal* rs = const_cast<MSRailSignal*>(dynamic_cast<const MSRailSignal*>(link->getTLLogic()));
382 if (rs != nullptr) {
383 LinkInfo& li = rs->myLinkInfos[link->getTLIndex()];
384 // init driveway
385 MSDriveWay* dw = &li.getDriveWay(ego);
389 prev = dw;
390 if (update && rs->isActive()) {
391 // vehicle may have rerouted its intial trip
392 // after the states have been set
393 // @note: This is a hack because it could lead to invalid tls-output
394 // (it's still an improvement over switching based on default driveways)
395 rs->updateCurrentPhase();
397 }
398 }
399 }
400 }
401 }
402 }
403 }
405}
406
407
408bool
409MSRailSignal::hasInsertionConstraint(MSLink* link, const MSVehicle* veh, std::string& info, bool& isInsertionOrder) {
410 if (link->getJunction() != nullptr && link->getJunction()->getType() == SumoXMLNodeType::RAIL_SIGNAL) {
411 const MSRailSignal* rs = dynamic_cast<const MSRailSignal*>(link->getTLLogic());
412 if (rs != nullptr && rs->myConstraints.size() > 0) {
413 const std::string tripID = veh->getParameter().getParameter("tripId", veh->getID());
414 auto it = rs->myConstraints.find(tripID);
415 if (it != rs->myConstraints.end()) {
416 for (MSRailSignalConstraint* c : it->second) {
417 if (c->isInsertionConstraint() && !c->cleared()) {
418#ifdef DEBUG_SIGNALSTATE
419 if (DEBUG_HELPER(rs)) {
420 std::cout << SIMTIME << " rsl=" << rs->getID() << " insertion constraint '" << c->getDescription() << "' for vehicle '" << veh->getID() << "' not cleared\n";
421 }
422#endif
423 info = c->getDescription();
424 isInsertionOrder = c->getType() == MSRailSignalConstraint::ConstraintType::INSERTION_ORDER;
426 const SUMOVehicle* foe = c->getFoe();
427 if (foe != nullptr) {
429 }
430 }
431 return true;
432 }
433 }
434 }
435 }
436 }
437 return false;
438}
439
440// ===========================================================================
441// LinkInfo method definitions
442// ===========================================================================
443
445 myLink(link) {
446 reset();
447}
448
450 for (MSDriveWay* dw : myDriveways) {
451 delete dw;
452 }
453 myDriveways.clear();
454}
455
456void
458 myLastRerouteTime = -1;
459 myLastRerouteVehicle = nullptr;
460 myDriveways.clear();
461}
462
463
464std::string
466 return myLink->getTLLogic()->getID() + "_" + toString(myLink->getTLIndex());
467}
468
469
472 MSEdge* first = &myLink->getLane()->getEdge();
473 MSRouteIterator firstIt = std::find(veh->getCurrentRouteEdge(), veh->getRoute().end(), first);
474 if (firstIt == veh->getRoute().end()) {
475 // possibly the vehicle has already gone past the first edge (i.e.
476 // because first is short or the step-length is high)
477 // lets look backward along the route
478 // give some slack because the vehicle might have been braking from a higher speed and using ballistic integration
479 double lookBack = SPEED2DIST(veh->getSpeed() + 10);
480 int routeIndex = veh->getRoutePosition() - 1;
481 while (lookBack > 0 && routeIndex > 0) {
482 const MSEdge* prevEdge = veh->getRoute().getEdges()[routeIndex];
483 if (prevEdge == first) {
484 firstIt = veh->getRoute().begin() + routeIndex;
485 break;
486 }
487 lookBack -= prevEdge->getLength();
488 routeIndex--;
489 }
490 }
491 MSRailSignal* rs = const_cast<MSRailSignal*>(dynamic_cast<const MSRailSignal*>(myLink->getTLLogic()));
492 if (firstIt == veh->getRoute().end()) {
493 WRITE_WARNING("Invalid approach information to rail signal '" + MSDriveWay::getClickableTLLinkID(myLink) + "' after rerouting for vehicle '" + veh->getID()
494 + "' first driveway edge '" + first->getID() + "' time=" + time2string(MSNet::getInstance()->getCurrentTimeStep()) + ".");
495 if (myDriveways.empty()) {
496 ConstMSEdgeVector dummyRoute;
497 dummyRoute.push_back(&myLink->getLane()->getEdge());
498 MSDriveWay* dw = MSDriveWay::buildDriveWay(rs->getNewDrivewayID(), myLink, dummyRoute.begin(), dummyRoute.end());
499 myDriveways.push_back(dw);
500 }
501 return *myDriveways.front();
502 }
503 //std::cout << SIMTIME << " veh=" << veh->getID() << " rsl=" << getID() << " dws=" << myDriveways.size() << "\n";
504 return getDriveWay(firstIt, veh->getRoute().end(), veh->getID());
505}
506
507
510 for (MSDriveWay* dw : myDriveways) {
511 if (dw->match(firstIt, endIt)) {
512 return *dw;
513 }
514#ifdef DEBUG_SELECT_DRIVEWAY
515 std::cout << SIMTIME << " rs=" << getID() << " veh=" << info << " other dwSignal=" << dw->foundSignal() << " dwRoute=" << toString(dw->getRoute()) << "\n";
516#else
517 UNUSED_PARAMETER(info);
518#endif
519 }
520 MSRailSignal* rs = const_cast<MSRailSignal*>(dynamic_cast<const MSRailSignal*>(myLink->getTLLogic()));
521 MSDriveWay* dw = MSDriveWay::buildDriveWay(rs->getNewDrivewayID(), myLink, firstIt, endIt);
522 dw->setVehicle(info);
523#ifdef DEBUG_SELECT_DRIVEWAY
524 std::cout << SIMTIME << " rs=" << getID() << " veh=" << info << " new dwSignal=" << dw->foundSignal() << " dwRoute=" << toString(dw->getRoute()) << "\n";
525#endif
526 myDriveways.push_back(dw);
527 return *myDriveways.back();
528}
529
530
531void
533 MSDevice_Routing* rDev = static_cast<MSDevice_Routing*>(veh->getDevice(typeid(MSDevice_Routing)));
535 if (rDev != nullptr
536 && rDev->mayRerouteRailSignal()
537 && (myLastRerouteVehicle != veh
538 // reroute each vehicle only once if no periodic routing is allowed,
539 // otherwise with the specified period
540 || (rDev->getPeriod() > 0 && myLastRerouteTime + rDev->getPeriod() <= now))) {
541 myLastRerouteVehicle = veh;
542 myLastRerouteTime = now;
543
544#ifdef DEBUG_REROUTE
545 ConstMSEdgeVector oldRoute = veh->getRoute().getEdges();
547 std::cout << SIMTIME << " reroute veh=" << veh->getID() << " rs=" << getID() << " occupied=" << toString(occupied) << "\n";
548 }
549#endif
550 MSRoutingEngine::reroute(*veh, now, "railSignal:" + getID(), false, true, occupied);
551#ifdef DEBUG_REROUTE
552 // attention this works only if we are not parallel!
554 if (veh->getRoute().getEdges() != oldRoute) {
555 std::cout << " rerouting successful\n";
556 }
557 }
558#endif
559 }
560}
561
562
563void
565 myBlockingVehicles.clear();
566 myRivalVehicles.clear();
567 myPriorityVehicles.clear();
568 myConstraintInfo = "";
569 myBlockingDriveWays.clear();
571 myStoreVehicles = true;
572 LinkInfo& li = myLinkInfos[linkIndex];
573 if (li.myLink->getApproaching().size() > 0) {
574 Approaching closest = li.myLink->getClosest();
575 MSDriveWay& driveway = li.getDriveWay(closest.first);
576 MSEdgeVector occupied;
577 myRequestedDriveWay = driveway.getID();
578 // call for side effects
579 driveway.reserve(closest, occupied);
580 constraintsAllow(closest.first);
581 } else if (li.myDriveways.size() > 0) {
582 li.myDriveways.front()->conflictLaneOccupied();
583 li.myDriveways.front()->foeDriveWayApproached();
584 }
585 myStoreVehicles = false;
586}
587
590 storeTraCIVehicles(linkIndex);
591 return myBlockingVehicles;
592}
593
596 storeTraCIVehicles(linkIndex);
597 return myRivalVehicles;
598}
599
602 storeTraCIVehicles(linkIndex);
603 return myPriorityVehicles;
604}
605
606std::string
608 storeTraCIVehicles(linkIndex);
609 return myConstraintInfo;
610}
611
612
613std::string
615 storeTraCIVehicles(linkIndex);
616 return myRequestedDriveWay;
617}
618
619
620std::vector<const MSDriveWay*>
622 storeTraCIVehicles(linkIndex);
623 return myBlockingDriveWays;
624}
625
626const MSDriveWay&
627MSRailSignal::retrieveDriveWay(int numericalID) const {
628 for (const LinkInfo& li : myLinkInfos) {
629 for (const MSDriveWay* dw : li.myDriveways) {
630 if (dw->getNumericalID() == numericalID) {
631 return *dw;
632 }
633 }
634 }
635 throw ProcessError("Invalid driveway id " + toString(numericalID) + " at railSignal '" + getID() + "'");
636}
637
638const MSDriveWay&
640 return myLinkInfos[tlIndex].getDriveWay(veh);
641}
642
643const MSDriveWay&
645 return myLinkInfos[tlIndex].getDriveWay(first, end);
646}
647
648
649const std::vector<MSDriveWay*>
651 return myLinkInfos[tlIndex].myDriveways;
652}
653
654
655std::string
657 MSRailSignal* rs = const_cast<MSRailSignal*>(this);
658 if (myLinkInfos.size() == 1) {
659 return toString(rs->getBlockingVehicles(0));
660 } else {
661 std::string result;
662 for (int i = 0; i < (int)myLinkInfos.size(); i++) {
663 result += toString(i) + ": " + toString(rs->getBlockingVehicles(i)) + ";";
664 }
665 return result;
666 }
667}
668std::string
670 MSRailSignal* rs = const_cast<MSRailSignal*>(this);
671 if (myLinkInfos.size() == 1) {
672 return toString(rs->getRivalVehicles(0));
673 } else {
674 std::string result;
675 for (int i = 0; i < (int)myLinkInfos.size(); i++) {
676 result += toString(i) + ": " + toString(rs->getRivalVehicles(i)) + ";";
677 }
678 return result;
679 }
680}
681std::string
683 MSRailSignal* rs = const_cast<MSRailSignal*>(this);
684 if (myLinkInfos.size() == 1) {
685 return toString(rs->getPriorityVehicles(0));
686 } else {
687 std::string result;
688 for (int i = 0; i < (int)myLinkInfos.size(); i++) {
689 result += toString(i) + ": " + toString(rs->getPriorityVehicles(i)) + ";";
690 }
691 return result;
692 }
693}
694std::string
696 MSRailSignal* rs = const_cast<MSRailSignal*>(this);
697 if (myLinkInfos.size() == 1) {
698 return rs->getConstraintInfo(0);
699 } else {
700 std::string result;
701 for (int i = 0; i < (int)myLinkInfos.size(); i++) {
702 result += toString(i) + ": " + rs->getConstraintInfo(i);
703 }
704 return result;
705 }
706}
707std::string
709 MSRailSignal* rs = const_cast<MSRailSignal*>(this);
710 if (myLinkInfos.size() == 1) {
711 return toString(rs->getRequestedDriveWay(0));
712 } else {
713 std::string result;
714 for (int i = 0; i < (int)myLinkInfos.size(); i++) {
715 result += toString(i) + ": " + toString(rs->getRequestedDriveWay(i)) + ";";
716 }
717 return result;
718 }
719}
720std::string
722 MSRailSignal* rs = const_cast<MSRailSignal*>(this);
723 if (myLinkInfos.size() == 1) {
724 return toString(rs->getBlockingDriveWays(0));
725 } else {
726 std::string result;
727 for (int i = 0; i < (int)myLinkInfos.size(); i++) {
728 result += toString(i) + ": " + toString(rs->getBlockingDriveWays(i)) + ";";
729 }
730 return result;
731 }
732}
733
734void
735MSRailSignal::setParameter(const std::string& key, const std::string& value) {
736 // some pre-defined parameters can be updated at runtime
737 if (key == "moving-block") {
738 bool movingBlock = StringUtils::toBool(value);
739 if (movingBlock != myMovingBlock) {
740 // recompute driveways
741 myMovingBlock = movingBlock;
742 for (LinkInfo& li : myLinkInfos) {
743 li.reset();
744 }
746 setTrafficLightSignals(MSNet::getInstance()->getCurrentTimeStep());
747 }
748 }
749 Parameterised::setParameter(key, value);
750}
751
752
753std::string
757/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define DEBUG_HELPER(obj)
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
std::vector< MSEdge * > MSEdgeVector
Definition MSEdge.h:73
#define DEBUG_COND_LINKINFO
ConstMSEdgeVector::const_iterator MSRouteIterator
Definition MSRoute.h:57
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:296
#define WRITE_WARNING(msg)
Definition MsgHandler.h:295
#define TL(string)
Definition MsgHandler.h:315
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:69
#define SPEED2DIST(x)
Definition SUMOTime.h:45
#define SIMSTEP
Definition SUMOTime.h:61
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:62
@ SUMO_ATTR_TO
@ SUMO_ATTR_FROM
@ SUMO_ATTR_ID
@ SUMO_ATTR_TLLINKINDEX
link: the index of the link within the traffic light
bool gDebugFlag4
Definition StdDefs.cpp:40
#define UNUSED_PARAMETER(x)
Definition StdDefs.h:30
#define SUMO_MAX_CONNECTIONS
the maximum number of connections across an intersection
Definition StdDefs.h:41
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
SUMOTime getStartupDelay() const
Get the vehicle type's startupDelay.
Definition MSCFModel.h:287
A device that performs vehicle rerouting based on current edge speeds.
SUMOTime getPeriod() const
bool mayRerouteRailSignal() const
return whether the equipped vehicle may receive dispatch information at a rail signal
static std::string getClickableTLLinkID(const MSLink *link)
return logicID_linkIndex in a way that allows clicking in sumo-gui
void setVehicle(const std::string &vehID)
Definition MSDriveWay.h:139
static const MSDriveWay * getDepartureDriveway(const SUMOVehicle *veh)
const std::vector< const MSEdge * > & getRoute() const
Definition MSDriveWay.h:111
static MSDriveWay * buildDriveWay(const std::string &id, const MSLink *link, MSRouteIterator first, MSRouteIterator end)
construct a new driveway by searching along the given route until all block structures are found
bool foeDriveWayApproached() const
whether any of my Foes is being approached
bool reserve(const Approaching &closest, MSEdgeVector &occupied)
attempt reserve this driveway for the given vehicle
bool foeDriveWayOccupied(bool store, const SUMOVehicle *ego, MSEdgeVector &occupied) const
whether any of myFoes is occupied (vehicles that are the target of a join must be ignored)
A road/street connecting two junctions.
Definition MSEdge.h:77
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
bool isNormal() const
return whether this edge is an internal edge
Definition MSEdge.h:263
const MSJunction * getToJunction() const
Definition MSEdge.h:418
double getLength() const
return the length of the edge
Definition MSEdge.h:685
static SUMOTime gTimeToTeleportRSDeadlock
Definition MSGlobals.h:72
SumoXMLNodeType getType() const
return the type of this Junction
Definition MSJunction.h:133
Representation of a lane in the micro simulation.
Definition MSLane.h:84
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:185
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:320
The definition of a single phase of a tls logic.
const std::string & getState() const
Returns the state within this phase.
void setState(const std::string &_state)
A base class for constraints.
void notifyApproach(const MSLink *link)
switch rail signal to active
void addSignal(MSRailSignal *signal)
void addDrivewayFollower(const MSDriveWay *dw, const MSDriveWay *dw2)
void addWaitRelation(const SUMOVehicle *waits, const MSRailSignal *rs, const SUMOVehicle *reason, MSRailSignalConstraint *constraint=nullptr)
void addDWDeadlockChecks(const MSRailSignal *rs, MSDriveWay *dw)
check whether the given signal and driveway are part of a deadlock circle
static MSRailSignalControl & getInstance()
A signal for rails.
static VehicleVector myRivalVehicles
std::string getBlockingVehicleIDs() const
Phases myPhases
The list of phases this logic uses.
std::string getConstraintInfo(int linkIndex)
return information regarding active rail signal constraints for the closest approaching vehicle
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
MSRailSignal(MSTLLogicControl &tlcontrol, const std::string &id, const std::string &programID, SUMOTime delay, const Parameterised::Map &parameters)
Constructor.
static std::string myRequestedDriveWay
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
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
~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 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.
SUMOTime trySwitch() override
Switches to the next phase.
std::string getBlockingDriveWayIDs() const
const std::vector< MSDriveWay * > retrieveDriveWays(int tlIndex) const
const MSDriveWay & retrieveDriveWay(int numericalID) const
static bool myStoreVehicles
std::string getRequestedDriveWay(int linkIndex) override
return vehicles that approach the intersection/rail signal and have priority over vehicles that wish ...
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
const Phases & getPhases() const override
Returns the phases of this tls program.
const MSPhaseDefinition & getCurrentPhaseDef() const override
Returns the definition of the current phase.
std::string getConstraintInfo() const
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.
const ConstMSEdgeVector & getEdges() const
Definition MSRoute.h:125
MSRouteIterator end() const
Returns the end of the list of edges to pass.
Definition MSRoute.cpp:79
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
Definition MSRoute.cpp:73
static void reroute(SUMOVehicle &vehicle, const SUMOTime currentTime, const std::string &info, const bool onInit=false, const bool silent=false, const MSEdgeVector &prohibited=MSEdgeVector())
initiate the rerouting, create router / thread pool on first use
A class that stores and controls tls and switching of their programs.
void deschedule(MSTrafficLightLogic *tlLogic)
Marks this swicth as invalid (if the phase duration has changed, f.e.)
The parent class for traffic light logics.
virtual void adaptLinkInformationFrom(const MSTrafficLightLogic &logic)
Applies information about controlled links and lanes from the given logic.
std::vector< const SUMOVehicle * > VehicleVector
list of vehicles
SUMOTime myDefaultCycleTime
The cycle time (without changes)
LaneVectorVector myLanes
The list of LaneVectors; each vector contains the incoming lanes that belong to the same link index.
SwitchCommand * mySwitchCommand
The current switch command.
int myNumLinks
number of controlled links
bool isActive() const
whether this logic is the active program
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
virtual void addLink(MSLink *link, MSLane *lane, int pos)
Adds a link on building.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
std::vector< MSLink * > LinkVector
Definition of the list of links that are subjected to this tls.
LinkVectorVector myLinks
The list of LinkVectors; each vector contains the links that belong to the same link index.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
Builds detectors for microsim.
const std::string & getID() const
Returns the id.
Definition Named.h:74
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
std::map< std::string, std::string > Map
parameters map
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual MSDevice * getDevice(const std::type_info &type) const =0
Returns a device of the given type if it exists or nullptr if not.
virtual double getSpeed() const =0
Returns the object's current speed.
virtual SUMOTime getWaitingTime(const bool accumulated=false) const =0
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual int getRoutePosition() const =0
return index of edge within route
Representation of a vehicle.
Definition SUMOVehicle.h:62
virtual const ConstMSEdgeVector::const_iterator & getCurrentRouteEdge() const =0
Returns an iterator pointing to the current edge in this vehicles route.
virtual const MSRoute & getRoute() const =0
Returns the current route.
int departEdge
(optional) The initial edge within the route of the vehicle
int arrivalEdge
(optional) The final edge within the route of the vehicle
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
#define DEBUG_COND
Definition json.hpp:4471