59std::vector<std::string>
60TrafficLight::getIDList() {
66TrafficLight::getIDCount() {
67 return (
int)getIDList().size();
72TrafficLight::getRedYellowGreenState(
const std::string& tlsID) {
77std::vector<TraCILogic>
78TrafficLight::getAllProgramLogics(
const std::string& tlsID) {
79 std::vector<TraCILogic> result;
82 TraCILogic l(logic->getProgramID(), (
int)logic->getLogicType(), logic->getCurrentPhaseIndex());
83 l.subParameter = logic->getParametersMap();
85 l.phases.emplace_back(
new TraCIPhase(
STEPS2TIME(phase->duration), phase->getState(),
87 phase->getNextPhases(), phase->getName()));
89 result.emplace_back(l);
95std::vector<std::string>
96TrafficLight::getControlledJunctions(
const std::string& tlsID) {
97 std::set<std::string> junctionIDs;
100 for (
const MSLink* l : llinks) {
101 junctionIDs.insert(l->getJunction()->getID());
104 return std::vector<std::string>(junctionIDs.begin(), junctionIDs.end());
108std::vector<std::string>
109TrafficLight::getControlledLanes(
const std::string& tlsID) {
110 std::vector<std::string> laneIDs;
113 for (
const MSLane* l : llanes) {
114 laneIDs.push_back(l->getID());
121std::vector<std::vector<TraCILink> >
122TrafficLight::getControlledLinks(
const std::string& tlsID) {
123 std::vector<std::vector<TraCILink> > result;
126 for (
int i = 0; i < (int)lanes.size(); ++i) {
127 std::vector<TraCILink> subList;
131 for (
int j = 0; j < (int)llanes.size(); ++j) {
137 subList.emplace_back(TraCILink(llanes[j]->getID(), via, to));
139 result.emplace_back(subList);
146TrafficLight::getProgram(
const std::string& tlsID) {
152TrafficLight::getPhase(
const std::string& tlsID) {
158TrafficLight::getPhaseName(
const std::string& tlsID) {
164TrafficLight::getPhaseDuration(
const std::string& tlsID) {
170TrafficLight::getNextSwitch(
const std::string& tlsID) {
175TrafficLight::getServedPersonCount(
const std::string& tlsID,
int index) {
177 if (index < 0 || active->getPhaseNumber() <= index) {
178 throw TraCIException(
"The phase index " +
toString(index) +
" is not in the allowed range [0,"
184 const std::string& state = active->
getPhases()[index]->getState();
185 for (
int i = 0; i < (int)state.size(); i++) {
187 if (link->getLane()->getEdge().isCrossing()) {
201 }
else if (link->getLaneBefore()->getEdge().isCrossing()) {
204 if (
static_cast<MSPerson*
>(person)->
getNextEdge() == link->getLaneBefore()->getEdge().getID()) {
214std::vector<std::string>
215TrafficLight::getBlockingVehicles(
const std::string& tlsID,
int linkIndex) {
216 std::vector<std::string> result;
219 if (linkIndex < 0 || linkIndex >= active->
getNumLinks()) {
220 throw TraCIException(
"The link index " +
toString(linkIndex) +
" is not in the allowed range [0,"
224 result.push_back(veh->getID());
229std::vector<std::string>
230TrafficLight::getRivalVehicles(
const std::string& tlsID,
int linkIndex) {
231 std::vector<std::string> result;
233 if (linkIndex < 0 || linkIndex >= active->
getNumLinks()) {
234 throw TraCIException(
"The link index " +
toString(linkIndex) +
" is not in the allowed range [0,"
238 result.push_back(veh->getID());
243std::vector<std::string>
244TrafficLight::getPriorityVehicles(
const std::string& tlsID,
int linkIndex) {
245 std::vector<std::string> result;
247 if (linkIndex < 0 || linkIndex >= active->
getNumLinks()) {
248 throw TraCIException(
"The link index " +
toString(linkIndex) +
" is not in the allowed range [0,"
252 result.push_back(veh->getID());
257std::vector<TraCISignalConstraint>
258TrafficLight::getConstraints(
const std::string& tlsID,
const std::string& tripId) {
259 std::vector<TraCISignalConstraint> result;
263 throw TraCIException(
"'" + tlsID +
"' is not a rail signal");
266 if (tripId !=
"" && tripId != item.first) {
270 result.push_back(buildConstraint(tlsID, item.first, c));
276std::vector<TraCISignalConstraint>
277TrafficLight::getConstraintsByFoe(
const std::string& foeSignal,
const std::string& foeId) {
280 std::vector<TraCISignalConstraint> result;
281 for (
const std::string& tlsID : getIDList()) {
289 && (foeId ==
"" || pc->
myTripId == foeId)) {
290 result.push_back(buildConstraint(s->
getID(), item.first, pc));
299std::vector<TraCISignalConstraint>
300TrafficLight::swapConstraints(
const std::string& tlsID,
const std::string& tripId,
const std::string& foeSignal,
const std::string& foeId) {
301#ifdef DEBUG_CONSTRAINT_DEADLOCK
302 std::cout <<
"swapConstraints tlsId=" << tlsID <<
" tripId=" << tripId <<
" foeSignal=" << foeSignal <<
" foeId=" << foeId <<
"\n";
309 throw TraCIException(
"'" + tlsID +
"' is not a rail signal");
312 throw TraCIException(
"'" + foeSignal +
"' is not a rail signal");
316 if (tripId == item.first) {
333 return findConstraintsDeadLocks(foeId, tripId, foeSignal, tlsID);
335 throw TraCIException(
"Rail signal '" + tlsID +
"' does not have a constraint for tripId '" + tripId +
"' with foeSignal '" + foeSignal +
"' and foeId '" + foeId +
"'");
340TrafficLight::removeConstraints(
const std::string& tlsID,
const std::string& tripId,
const std::string& foeSignal,
const std::string& foeId) {
343 for (
const std::string& tlsCand : getIDList()) {
344 if (tlsID ==
"" || tlsCand == tlsID) {
349 if (tripId ==
"" || item.first == tripId) {
353 && (foeId ==
"" || pc->
myTripId == foeId)
367TrafficLight::updateConstraints(
const std::string& vehID, std::string tripId) {
374 tripId = tripId ==
"" ? curTripId : tripId;
377 std::map<const MSRailSignal*, std::set<std::string> > onRoute;
381 for (
auto it = routeIt; it < stop.edge; it++) {
384 if (it + 1 != route.end()) {
385 const MSEdge* next = *(it + 1);
387 if (link !=
nullptr && link->
getTLLogic() !=
nullptr) {
389 onRoute[s].insert(curTripId);
394 if (stop.pars.tripId !=
"") {
395 curTripId = stop.pars.tripId;
399 for (
auto it = routeIt; it < route.end(); it++) {
402 if (it + 1 != route.end()) {
403 const MSEdge* next = *(it + 1);
405 if (link !=
nullptr && link->
getTLLogic() !=
nullptr) {
407 onRoute[s].insert(curTripId);
420 std::vector<MSRailSignalConstraint*> onVeh;
421 std::vector<std::pair<std::string, MSRailSignalConstraint*> > byVeh;
423 for (
auto item : s->getConstraints()) {
427 if (item.first == tripId) {
428 if (onRoute[s].count(tripId) == 0) {
430 onVeh.push_back(cand);
432 }
else if (pc->
myTripId == tripId) {
435 byVeh.push_back(std::make_pair(item.first, cand));
442 s->removeConstraint(tripId, c);
444 for (
auto item : byVeh) {
445 s->removeConstraint(item.first, item.second);
451std::vector<TraCISignalConstraint>
452TrafficLight::findConstraintsDeadLocks(
const std::string& foeId,
const std::string& tripId,
const std::string& foeSignal,
const std::string& tlsID) {
453 std::vector<TraCISignalConstraint> result;
459 std::map<std::string, TraCISignalConstraint> constraintsOnTripId;
460 std::map<std::string, TraCISignalConstraint> constrainedByFoeId;
461 std::set<std::string> foeId2Cands1;
462 std::set<std::string> foeId2Cands2;
464 for (
auto item : s->getConstraints()) {
468 if (item.first == tripId) {
472 constraintsOnTripId[pc->
myTripId] = tsc;
474 for (std::string& futureFoe2Id : getFutureTripIds(pc->
myTripId)) {
475 foeId2Cands1.insert(futureFoe2Id);
477 constraintsOnTripId[futureFoe2Id] = tsc;
482 constrainedByFoeId[item.first] = tsc;
483 foeId2Cands2.insert(item.first);
484 for (std::string& futureTripId : getFutureTripIds(item.first)) {
485 foeId2Cands2.insert(futureTripId);
487 constrainedByFoeId[futureTripId] = tsc;
494#ifdef DEBUG_CONSTRAINT_DEADLOCK
495 std::cout <<
"findConstraintsDeadLocks foeId=" << foeId <<
" tripId=" << tripId <<
" foeSignal=" << foeSignal <<
" tlsID=" << tlsID <<
"\n";
496 std::cout <<
" foeId2Cands1=" <<
toString(foeId2Cands1) <<
"\n";
497 std::cout <<
" foeId2Cands2=" <<
toString(foeId2Cands2) <<
"\n";
499 if (foeId2Cands1.size() > 0) {
507 if (foe !=
nullptr) {
510 for (
const std::string& foeId2 : foeId2Cands1) {
513 if (foe2 !=
nullptr) {
515 const TraCISignalConstraint& c = constraintsOnTripId[foeId2];
516 bool foeAhead =
false;
518 const MSEdge* e = foe2Route[i];
527#ifdef DEBUG_CONSTRAINT_DEADLOCK
528 std::cout <<
"findConstraintsDeadLocks foeId=" << foeId <<
" tripId=" << tripId <<
" foeSignal=" << foeSignal <<
"\n";
532 <<
" " << constraintsOnTripId[foeId2].getString() <<
"\n";
543 TraCISignalConstraint nc;
546 nc.signalId = c.foeSignal;
547 nc.foeSignal = c.signalId;
552 result.push_back(nc);
554 std::vector<TraCISignalConstraint> result2 = swapConstraints(c.signalId, c.tripId, c.foeSignal, c.foeId);
555 result.insert(result.end(), result2.begin(), result2.end());
558 const std::vector<TraCISignalConstraint>& result4 = findConstraintsDeadLocks(foeId, tripId, foeSignal, tlsID);
559 result.insert(result.end(), result4.begin(), result4.end());
567 if (foeId2Cands2.size() > 0) {
574 std::set<const MSEdge*> egoToSignal;
578 const MSEdge* e = egoRoute[i];
579 egoToSignal.insert(e);
585 for (
const std::string& foeId2 : foeId2Cands2) {
589 if (foe2 !=
nullptr) {
590 if (egoToSignal.count(foe2->
getEdge()) != 0
592 const TraCISignalConstraint& c = constrainedByFoeId[foeId2];
593#ifdef DEBUG_CONSTRAINT_DEADLOCK
594 std::cout <<
"findConstraintsDeadLocks foeId=" << foeId <<
" tripId=" << tripId <<
" foeSignal=" << foeSignal <<
"\n";
596 <<
" " << c.getString() <<
"\n";
599 TraCISignalConstraint nc;
602 nc.signalId = c.foeSignal;
603 nc.foeSignal = c.signalId;
608 result.push_back(nc);
610 std::vector<TraCISignalConstraint> result2 = swapConstraints(c.signalId, c.tripId, c.foeSignal, c.foeId);
611 result.insert(result.end(), result2.begin(), result2.end());
614 const std::vector<TraCISignalConstraint>& result4 = findConstraintsDeadLocks(foeId, tripId, foeSignal, tlsID);
615 result.insert(result.end(), result4.begin(), result4.end());
620 }
else if (ego !=
nullptr) {
621 WRITE_WARNING(
"Cannot check for all deadlocks on swapConstraints because the route for vehicle '" + ego->
getID() +
"' is not computed yet");
626 std::vector<std::string> foeIds2;
627 std::set_intersection(
628 foeId2Cands1.begin(), foeId2Cands1.end(),
629 foeId2Cands2.begin(), foeId2Cands2.end(),
630 std::back_inserter(foeIds2));
631#ifdef DEBUG_CONSTRAINT_DEADLOCK
632 std::cout <<
"findConstraintsDeadLocks foeId=" << foeId <<
" tripId=" << tripId <<
" foeSignal=" << foeSignal <<
"\n";
633 for (
const std::string& foeId2 : foeIds2) {
634 std::cout <<
" deadlockId=" << foeId2 <<
" " << constraintsOnTripId[foeId2].getString() <<
" " << constrainedByFoeId[foeId2].getString() <<
"\n";
637 if (foeIds2.size() > 0) {
638 TraCISignalConstraint c = constrainedByFoeId[foeIds2.front()];
639 if (c.type == MSRailSignalConstraint::ConstraintType::INSERTION_PREDECESSOR) {
641 c = constraintsOnTripId[foeIds2.front()];
643 TraCISignalConstraint nc;
646 nc.signalId = c.foeSignal;
647 nc.foeSignal = c.signalId;
652 result.push_back(nc);
654 const std::vector<TraCISignalConstraint>& result2 = swapConstraints(c.signalId, c.tripId, c.foeSignal, c.foeId);
655 result.insert(result.end(), result2.begin(), result2.end());
656 if (foeIds2.size() > 1) {
658 const std::vector<TraCISignalConstraint>& result3 = findConstraintsDeadLocks(foeId, tripId, foeSignal, tlsID);
659 result.insert(result.end(), result3.begin(), result3.end());
667TrafficLight::getVehicleByTripId(
const std::string tripOrVehID) {
679std::vector<std::string>
680TrafficLight::getFutureTripIds(
const std::string vehID) {
681 std::vector<std::string> result;
686 result.push_back(tripId);
689 if (stop.pars.tripId !=
"") {
690 result.push_back(stop.pars.tripId);
699TrafficLight::getParameter(
const std::string& tlsID,
const std::string& paramName) {
702 throw TraCIException(
"'" + tlsID +
"' is not a NEMA controller");
712TrafficLight::setRedYellowGreenState(
const std::string& tlsID,
const std::string& state) {
718TrafficLight::setPhase(
const std::string& tlsID,
const int index) {
720 if (index < 0 || active->getPhaseNumber() <= index) {
721 throw TraCIException(
"The phase index " +
toString(index) +
" is not in the allowed range [0,"
730TrafficLight::setPhaseName(
const std::string& tlsID,
const std::string& name) {
737TrafficLight::setProgram(
const std::string& tlsID,
const std::string& programID) {
741 throw TraCIException(e.what());
747TrafficLight::setPhaseDuration(
const std::string& tlsID,
const double phaseDuration) {
755TrafficLight::setProgramLogic(
const std::string& tlsID,
const TraCILogic& logic) {
758 if (logic.currentPhaseIndex >= (
int)logic.phases.size()) {
759 throw TraCIException(
"set program: parameter index must be less than parameter phase number.");
761 std::vector<MSPhaseDefinition*> phases;
762 for (
const std::shared_ptr<libsumo::TraCIPhase>& phase : logic.phases) {
767 phases.push_back(sumoPhase);
769 if (vars.
getLogic(logic.programID) ==
nullptr) {
771 int step = logic.currentPhaseIndex;
772 const std::string basePath =
"";
778 tlsID, logic.programID, 0,
779 phases, step, nextSwitch,
780 logic.subParameter, basePath);
784 tlsID, logic.programID, 0,
785 phases, step, nextSwitch,
786 logic.subParameter, basePath);
790 tlsID, logic.programID, 0,
791 phases, step, nextSwitch,
792 logic.subParameter, basePath);
797 phases, step, nextSwitch,
801 throw TraCIException(
"Unsupported traffic light type '" +
toString(logic.type) +
"'");
803 vars.
addLogic(logic.programID, tlLogic,
true,
true);
815TrafficLight::setParameter(
const std::string& tlsID,
const std::string& paramName,
const std::string& value) {
818 throw TraCIException(
"'" + tlsID +
"' is not a NEMA controller");
826TrafficLight::setNemaSplits(
const std::string& tlsID,
const std::vector<double>& splits) {
827 setParameter(tlsID,
"NEMA.splits",
toString(splits));
831TrafficLight::setNemaMaxGreens(
const std::string& tlsID,
const std::vector<double>& maxGreens) {
832 setParameter(tlsID,
"NEMA.maxGreens",
toString(maxGreens));
836TrafficLight::setNemaCycleLength(
const std::string& tlsID,
double cycleLength) {
837 setParameter(tlsID,
"NEMA.cycleLength",
toString(cycleLength));
841TrafficLight::setNemaOffset(
const std::string& tlsID,
double offset) {
842 setParameter(tlsID,
"NEMA.offset",
toString(offset));
848 TraCISignalConstraint c;
868std::shared_ptr<VariableWrapper>
869TrafficLight::makeWrapper() {
870 return std::make_shared<Helper::SubscriptionWrapper>(handleVariable, mySubscriptionResults, myContextSubscriptionResults);
875TrafficLight::handleVariable(
const std::string& objID,
const int variable, VariableWrapper* wrapper,
tcpip::Storage* paramData) {
878 return wrapper->wrapStringList(objID, variable, getIDList());
880 return wrapper->wrapInt(objID, variable, getIDCount());
882 return wrapper->wrapString(objID, variable, getRedYellowGreenState(objID));
884 return wrapper->wrapStringList(objID, variable, getControlledLanes(objID));
886 return wrapper->wrapInt(objID, variable, getPhase(objID));
888 return wrapper->wrapString(objID, variable, getPhaseName(objID));
890 return wrapper->wrapString(objID, variable, getProgram(objID));
892 return wrapper->wrapDouble(objID, variable, getPhaseDuration(objID));
894 return wrapper->wrapDouble(objID, variable, getNextSwitch(objID));
896 return wrapper->wrapStringList(objID, variable, getControlledJunctions(objID));
899 return wrapper->wrapString(objID, variable, getParameter(objID, paramData->
readString()));
902 return wrapper->wrapStringPair(objID, variable, getParameterWithKey(objID, paramData->
readString()));
std::vector< const MSEdge * > ConstMSEdgeVector
#define WRITE_WARNING(msg)
const int VEHPARS_FORCE_REROUTE
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
#define LIBSUMO_SUBSCRIPTION_IMPLEMENTATION(CLASS, DOM)
#define LIBSUMO_GET_PARAMETER_WITH_KEY_IMPLEMENTATION(CLASS)
An actuated (adaptive) traffic light logic.
The base class for microscopic and mesoscopic vehicles.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
const MSRouteIterator & getCurrentRouteEdge() const
Returns an iterator pointing to the current edge in this vehicles route.
const std::list< MSStop > & getStops() const
const MSRoute & getRoute() const
Returns the current route.
An actuated traffic light logic based on time delay of approaching vehicles.
A road/street connecting two junctions.
const std::set< MSTransportable *, ComparatorNumericalIdLess > & getPersons() const
Returns this edge's persons set.
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
const MSJunction * getToJunction() const
SumoXMLNodeType getType() const
return the type of this Junction
Representation of a lane in the micro simulation.
MSEdge & getEdge() const
Returns the lane's edge.
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
MSLane * getLane() const
Returns the connected lane.
MSLane * getViaLane() const
Returns the following inner lane.
const MSTrafficLightLogic * getTLLogic() const
Returns the TLS index.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
virtual void createTLWrapper(MSTrafficLightLogic *)
creates a wrapper for the given logic (see GUINet)
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
const std::string & getNextEdge() const
return the list of internal edges if this person is walking and the pedestrian model allows it
The definition of a single phase of a tls logic.
SUMOTime maxDuration
The maximum duration of the phase.
SUMOTime minDuration
The minimum duration of the phase.
const std::string & getName() const
const std::string & getState() const
Returns the state within this phase.
SUMOTime duration
The duration of the phase.
std::vector< int > nextPhases
The index of the phase that suceeds this one (or -1)
const MSRailSignal * myFoeSignal
store the foe signal (for TraCI access)
bool cleared() const
whether the constraint has been met
const std::string myTripId
id of the predecessor that must already have passed
const int myLimit
the number of passed vehicles within which tripId must have occured
A base class for constraints.
virtual void setActive(bool active)=0
ConstraintType getType() const
ConstraintType getSwappedType() const
static MSRailSignalControl & getInstance()
const std::vector< MSRailSignal * > & getSignals() const
void addConstraint(const std::string &tripId, MSRailSignalConstraint *constraint)
register contraint for signal switching
const std::map< std::string, std::vector< MSRailSignalConstraint * > > & getConstraints() const
bool removeConstraint(const std::string &tripId, MSRailSignalConstraint *constraint)
remove contraint for signal switching
const ConstMSEdgeVector & getEdges() const
A fixed traffic light logic.
Storage for all programs of a single tls.
void switchTo(MSTLLogicControl &tlc, const std::string &programID)
void setStateInstantiatingOnline(MSTLLogicControl &tlc, const std::string &state)
std::vector< MSTrafficLightLogic * > getAllLogics() const
MSTrafficLightLogic * getLogic(const std::string &programID) const
bool addLogic(const std::string &programID, MSTrafficLightLogic *logic, bool netWasLoaded, bool isNewDefault=true)
Adds a logic (program)
MSTrafficLightLogic * getActive() const
MSTrafficLightLogic * getDefault() const
return the default program (that last used program except TRACI_PROGRAM)
A class that stores and controls tls and switching of their programs.
std::vector< std::string > getAllTLIds() const
The parent class for traffic light logics.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
std::vector< LaneVector > LaneVectorVector
Definition of a list that holds lists of lanes that do have the same attribute.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
virtual int getPhaseNumber() const =0
Returns the number of phases.
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
virtual VehicleVector getPriorityVehicles(int linkIndex)
return vehicles that approach the intersection/rail signal and have priority over vehicles that wish ...
virtual void changeStepAndDuration(MSTLLogicControl &tlcontrol, SUMOTime simStep, int step, SUMOTime stepDuration)=0
Changes the current phase and her duration.
virtual VehicleVector getBlockingVehicles(int linkIndex)
return vehicles that block the intersection/rail signal for vehicles that wish to pass the given link...
virtual const MSPhaseDefinition & getPhase(int givenstep) const =0
Returns the definition of the phase from the given position within the plan.
virtual VehicleVector getRivalVehicles(int linkIndex)
return vehicles that approach the intersection/rail signal and are in conflict with vehicles that wis...
const std::string & getProgramID() const
Returns this tl-logic's id.
TrafficLightType getLogicType() const
Returns the type of the logic.
int getNumLinks() const
return the number of controlled link indices
virtual const Phases & getPhases() const =0
Returns the phases of this tls program.
const LaneVectorVector & getLaneVectors() const
Returns the list of lists of all lanes controlled by this tls.
const LinkVector & getLinksAt(int i) const
Returns the list of links that are controlled by the signals at the given position.
std::vector< LinkVector > LinkVectorVector
Definition of a list that holds lists of links that do have the same attribute.
std::vector< MSLink * > LinkVector
Definition of the list of links that are subjected to this tls.
virtual void init(NLDetectorBuilder &nb)
Initialises the tls with information about incoming lanes.
const MSLane * getLane() const
Returns the current lane (may be nullptr)
const MSEdge * getEdge() const
Returns the current edge.
The class responsible for building and deletion of vehicles.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
A NEMA (adaptive) traffic light logic based on E2Detector.
Builds detectors for microsim.
const std::string & getID() const
Returns the id.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
virtual NumericalID getNumericalID() const =0
return the numerical ID which is only for internal usage
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
virtual const MSEdge * getEdge() const =0
Returns the edge the object is currently at.
virtual double getPositionOnLane() const =0
Get the object's position along the lane.
Representation of a vehicle.
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
virtual const MSRoute & getRoute() const =0
Returns the current route.
bool wasSet(int what) const
Returns whether the given parameter was set.
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
C++ TraCI client API implementation.
static MSBaseVehicle * getVehicle(const std::string &id)
static MSTLLogicControl::TLSLogicVariants & getTLS(const std::string &id)
virtual std::string readString()
virtual int readUnsignedByte()
TRACI_CONST int TRACI_ID_LIST
std::map< std::string, libsumo::SubscriptionResults > ContextSubscriptionResults
TRACI_CONST int TL_CONTROLLED_LANES
TRACI_CONST int TL_CONTROLLED_JUNCTIONS
std::map< std::string, libsumo::TraCIResults > SubscriptionResults
{object->{variable->value}}
TRACI_CONST int VAR_PARAMETER
TRACI_CONST int TL_NEXT_SWITCH
TRACI_CONST int VAR_PARAMETER_WITH_KEY
TRACI_CONST int TL_PHASE_DURATION
TRACI_CONST int TL_CURRENT_PHASE
TRACI_CONST int TL_RED_YELLOW_GREEN_STATE
TRACI_CONST int TL_CURRENT_PROGRAM
std::string tripId
the tripId or vehicle id of the train that is constrained