Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSTransportable.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-2025 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// The common superclass for modelling transportable objects like persons and containers
21/****************************************************************************/
22#include <config.h>
23
30#include <microsim/MSEdge.h>
31#include <microsim/MSLane.h>
32#include <microsim/MSNet.h>
43
45
46//#define DEBUG_PARKING
47
48// ===========================================================================
49// method definitions
50// ===========================================================================
52 SUMOTrafficObject(pars->id),
53 myParameter(pars), myVType(vtype), myPlan(plan),
54 myAmPerson(isPerson),
55 myNumericalID(myCurrentNumericalIndex++) {
56 myStep = myPlan->begin();
57 // init devices
59 for (MSStage* const stage : * myPlan) {
60 stage->init(this);
61 }
62}
63
64
67 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
68 if (stage->getVehicle() != nullptr) {
69 stage->getVehicle()->removeTransportable(this);
70 } else if (stage->getOriginStop() != nullptr) {
71 stage->getOriginStop()->removeTransportable(this);
72 }
73 }
74 if (myPlan != nullptr) {
75 for (MSTransportablePlan::const_iterator i = myPlan->begin(); i != myPlan->end(); ++i) {
76 delete *i;
77 }
78 delete myPlan;
79 myPlan = nullptr;
80 }
81 for (MSTransportableDevice* dev : myDevices) {
82 delete dev;
83 }
84 delete myParameter;
87 }
88}
89
92 return getEdge()->getLanes()[0]->getRNG();
93}
94
95int
97 return getEdge()->getLanes()[0]->getRNGIndex();
98}
99
100bool
101MSTransportable::proceed(MSNet* net, SUMOTime time, const bool vehicleArrived) {
102 MSStage* const prior = *myStep;
103 const std::string& error = prior->setArrived(net, this, time, vehicleArrived);
104 // must be done before increasing myStep to avoid invalid state for rendering
105 prior->getEdge()->removeTransportable(this);
106 myStep++;
107 if (error != "") {
108 throw ProcessError(error);
109 }
110 /* We need to check whether an access stage is needed (or maybe even two).
111 The general scheme is: If the prior stage ended at a stop and the next stage
112 starts at an edge which is not the one the stop is at, but the stop has an access to it
113 we need an access stage. The same is true if prior ends at an edge, the next stage
114 is allowed to start at any stop the edge has access to.
115 If we start at a stop or end at a stop no access is needed.
116 */
117 bool accessToStop = false;
119 accessToStop = checkAccess(prior);
120 } else if (prior->getStageType() == MSStageType::WAITING_FOR_DEPART) {
121 for (MSTransportableDevice* const dev : myDevices) {
122 dev->notifyEnter(*this, MSMoveReminder::NOTIFICATION_DEPARTED, nullptr);
123 }
124 }
125 if (!accessToStop && (myStep == myPlan->end()
126 || ((*myStep)->getStageType() != MSStageType::DRIVING
127 && (*myStep)->getStageType() != MSStageType::TRIP))) {
128 MSStoppingPlace* priorStop = prior->getStageType() == MSStageType::TRIP ? prior->getOriginStop() : prior->getDestinationStop();
129 // a trip might resolve to DRIVING so we would have to stay at the stop
130 // if a trip resolves to something else, this step will do stop removal
131 if (priorStop != nullptr) {
132 priorStop->removeTransportable(this);
133 }
134 }
135 if (myStep != myPlan->end()) {
136 if ((*myStep)->getStageType() == MSStageType::WALKING && (prior->getStageType() != MSStageType::ACCESS || prior->getDestination() != (*myStep)->getFromEdge())) {
137 checkAccess(prior, false);
138 } else if ((*myStep)->getStageType() == MSStageType::WAITING && prior->getStageType() == MSStageType::WAITING && prior->getDestination() != (*myStep)->getFromEdge()) {
139 checkAccess(prior, false);
140 }
141 (*myStep)->proceed(net, this, time, prior);
142 return true;
143 } else {
145 return false;
146 }
147}
148
149
150void
151MSTransportable::setID(const std::string& /*newID*/) {
152 throw ProcessError(TL("Changing a transportable ID is not permitted"));
153}
154
159
160void
162 (*myStep)->setDeparted(now);
163}
164
167 for (const MSStage* const stage : *myPlan) {
168 if (stage->getDeparted() >= 0) {
169 return stage->getDeparted();
170 }
171 }
172 return -1;
173}
174
175
176double
178 return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
179}
180
181double
183 return getEdgePos() - getVehicleType().getLength();
184}
185
186int
188 return (*myStep)->getDirection();
189}
190
193 return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
194}
195
196double
198 return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
199}
200
201double
203 return STEPS2TIME((*myStep)->getWaitingTime());
204}
205
206double
208 return (*myStep)->getSpeed();
209}
210
211
212void
214 SUMOTime departure = myPlan->front()->getDeparted();
215 os.openTag(isPerson() ? "personinfo" : "containerinfo");
217 os.writeAttr(SUMO_ATTR_DEPART, departure >= 0 ? time2string(departure) : "-1");
219 if (isPerson()) {
221 }
222 SUMOTime duration = 0;
223 SUMOTime waitingTime = 0;
224 SUMOTime timeLoss = 0;
225 SUMOTime travelTime = 0;
226 bool durationOK = true;
227 bool waitingTimeOK = true;
228 bool timeLossOK = true;
229 bool travelTimeOK = true;
230 for (MSStage* const i : *myPlan) {
231 SUMOTime t = i->getDuration();
232 if (t != SUMOTime_MAX) {
233 duration += t;
234 } else {
235 durationOK = false;
236 }
237 t = i->getTotalWaitingTime();
238 if (t != SUMOTime_MAX) {
239 waitingTime += t;
240 } else {
241 waitingTimeOK = false;
242 }
243 t = i->getTimeLoss(this);
244 if (t != SUMOTime_MAX) {
245 timeLoss += t;
246 } else {
247 timeLossOK = false;
248 }
249 t = i->getTravelTime();
250 if (t != SUMOTime_MAX) {
251 travelTime += t;
252 } else {
253 travelTimeOK = false;
254 }
255 }
256 os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
257 os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
258 os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
259 os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
260 for (MSStage* const i : *myPlan) {
261 i->tripInfoOutput(os, this);
262 }
263 os.closeTag();
264}
265
266
267void
268MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
269 const std::string typeID = (
273 if (hasArrived()) {
274 os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
275 }
276 const MSStage* previous = nullptr;
277 for (const MSStage* const stage : *myPlan) {
278 stage->routeOutput(myAmPerson, os, withRouteLength, previous);
279 previous = stage;
280 }
282 os.closeTag();
283 os.lf();
284}
285
286
287void
297
298
301 WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
302 isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
305 (*myStep)->abort(this);
306 if (!proceed(MSNet::getInstance(), step)) {
307 tc.erase(this);
308 }
309 return 0;
310}
311
312
313void
315 // myStep is invalidated upon modifying myPlan
316 const int stepIndex = (int)(myStep - myPlan->begin());
317 if (next < 0) {
318 myPlan->push_back(stage);
319 } else {
320 if (stepIndex + next > (int)myPlan->size()) {
321 throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
322 }
323 myPlan->insert(myPlan->begin() + stepIndex + next, stage);
324 }
325 myStep = myPlan->begin() + stepIndex;
326}
327
328
329void
330MSTransportable::removeStage(int next, bool stayInSim) {
331 assert(myStep + next < myPlan->end());
332 assert(next >= 0);
333 if (next > 0) {
334 // myStep is invalidated upon modifying myPlan
335 int stepIndex = (int)(myStep - myPlan->begin());
336 delete *(myStep + next);
337 myPlan->erase(myStep + next);
338 myStep = myPlan->begin() + stepIndex;
339 } else {
340 if (myStep + 1 == myPlan->end() && stayInSim) {
341 // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
342 appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
343 } else if (myStep + 1 != myPlan->end()) {
344 (*(myStep + 1))->setOrigin(getEdge(), getEdge() == getFromEdge() ? (*myStep)->getOriginStop() : nullptr, getEdgePos());
345 }
346 (*myStep)->abort(this);
349 } else if (myPlan->front()->getDeparted() < 0) {
350 myPlan->front()->setDeparted(SIMSTEP);
351 }
352 }
353}
354
355
356void
358 for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
359 (*i)->setSpeed(speed);
360 }
362}
363
364
365bool
366MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
367 if (isPerson()) {
368 static_cast<MSPerson*>(this)->replaceWalk(newRoute->getEdges(), getPositionOnLane(), 0, 1);
369 return true;
370 }
371 return false;
372}
373
374
375bool
376MSTransportable::reroute(SUMOTime t, const std::string& /* info */, MSTransportableRouter& router, const bool /* onInit */, const bool /* withTaz */, const bool /* silent */, const MSEdge* /* sink */) {
378 if (trip == nullptr) {
379 // TODO this should be possible after factoring out MSStageTrip::reroute
380 return false;
381 }
382 if (getCurrentStage()->getVehicle() != nullptr) {
383 // TODO rerouting during a ride still needs to be implemented
384 return false;
385 }
386 // find the final stage of the trip
387 int tripEndOffset = -1;
388 for (int i = getNumRemainingStages() - 1; i >= 0; i--) {
389 if (getNextStage(i)->getTrip() == trip) {
390 tripEndOffset = i;
391 break;
392 }
393 }
394 std::vector<MSStage*> stages;
395 MSStageWaiting start(getEdge(), getCurrentStage()->getOriginStop(), -1, t, getEdgePos(), "start", true);
396 if (trip->reroute(t, router, this, &start, getEdge(), getRerouteDestination(), stages) == "") {
397 // check whether the new plan actually differs
398 while (tripEndOffset >= 0 && !stages.empty() && stages.back()->equals(*getNextStage(tripEndOffset))) {
399 delete stages.back();
400 stages.pop_back();
401 tripEndOffset--;
402 }
403 bool abortCurrent = true;
404 // check whether the future route of the current stage is identical to the route
405 if (!stages.empty() && stages.front()->isWalk() && getCurrentStage()->isWalk()) {
406 // TODO this check should be done for rides as well
407 MSStageMoving* s = static_cast<MSStageMoving*>(getCurrentStage());
408 int routeIndex = (int)(s->getRouteStep() - s->getRoute().begin());
409 ConstMSEdgeVector oldEdges = s->getEdges();
410 oldEdges.erase(oldEdges.begin(), oldEdges.begin() + routeIndex);
411 ConstMSEdgeVector newEdges = stages.front()->getEdges();
412 if (newEdges == oldEdges) {
413 delete stages.front();
414 stages.erase(stages.begin());
415 abortCurrent = false;
416 }
417 }
418 if (stages.empty()) {
419 return false;
420 }
421 // remove future stages of the trip
422 for (int i = tripEndOffset; i >= 1; i--) {
423 removeStage(i);
424 }
425 // insert new stages of the rerouting
426 int idx = 1;
427 for (MSStage* stage : stages) {
428 appendStage(stage, idx++);
429 }
430 if (abortCurrent) {
431 removeStage(0);
432 }
433 return true;
434 }
435 return false;
436}
437
438
439void
441 const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
442 if (myVType->isVehicleSpecific()) {
444 }
445 if (isPerson()
446 && type->getVehicleClass() != oldVClass
447 && type->getVehicleClass() != SVC_PEDESTRIAN
449 WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
450 }
451 myVType = type;
452}
453
454
457 if (myVType->isVehicleSpecific()) {
458 return *const_cast<MSVehicleType*>(myVType);
459 }
461 replaceVehicleType(type);
462 return *type;
463}
464
465
468 PositionVector centerLine;
469 const Position p = getPosition();
470 const double angle = getAngle();
471 const double length = getVehicleType().getLength();
472 const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
473 centerLine.push_back(p);
474 centerLine.push_back(back);
475 centerLine.move2side(0.5 * getVehicleType().getWidth());
476 PositionVector result = centerLine;
477 centerLine.move2side(-getVehicleType().getWidth());
478 result.append(centerLine.reverse(), POSITION_EPS);
479 //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
480 return result;
481}
482
483
484std::string
485MSTransportable::getStageSummary(int stageIndex) const {
486 assert(stageIndex < (int)myPlan->size());
487 assert(stageIndex >= 0);
488 return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
489}
490
491
492const std::set<SUMOTrafficObject::NumericalID>
494 std::set<SUMOTrafficObject::NumericalID> result;
495 for (auto step = myStep; step != myPlan->end(); ++step) {
496 for (const MSEdge* const e : (*step)->getEdges()) {
497 result.insert(e->getNumericalID());
498 }
499 }
500 return result;
501}
502
503
504bool
506 return myStep == myPlan->end();
507}
508
509bool
511 return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
512}
513
514
515void
517 // check whether the transportable was riding to the orignal stop
518 // @note: parkingArea can currently not be set as myDestinationStop so we
519 // check for stops on the edge instead
520#ifdef DEBUG_PARKING
521 std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
522#endif
524 if (!myAmPerson) {
525 WRITE_WARNING(TL("parkingAreaReroute not supported for containers"));
526 return;
527 }
528 if (getDestination() == &orig->getLane().getEdge()) {
529 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
530 assert(stage != 0);
531 assert(stage->getVehicle() != 0);
532 // adapt plan
533 stage->setDestination(&replacement->getLane().getEdge(), replacement);
534 stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
535#ifdef DEBUG_PARKING
536 std::cout << " set ride destination\n";
537#endif
538 if (myStep + 1 == myPlan->end()) {
539 return;
540 }
541 // if the next step is a walk, adapt the route
542 MSStage* nextStage = *(myStep + 1);
543 if (nextStage->getStageType() == MSStageType::TRIP) {
544 dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination(), stage->getDestinationStop(), stage->getArrivalPos());
545#ifdef DEBUG_PARKING
546 std::cout << " set subsequent trip origin\n";
547#endif
548 } else if (nextStage->getStageType() == MSStageType::WALKING) {
549#ifdef DEBUG_PARKING
550 std::cout << " replace subsequent walk with a trip\n";
551#endif
552 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
553 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
554 removeStage(1);
555 appendStage(newStage, 1);
556 } else if (nextStage->getStageType() == MSStageType::WAITING) {
557#ifdef DEBUG_PARKING
558 std::cout << " add subsequent walk to reach stop\n";
559 std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
560#endif
561 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
562 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
563 appendStage(newStage, 1);
564 }
565 // if the plan contains another ride with the same vehicle from the same
566 // parking area, adapt the preceeding walk to end at the replacement
567 for (auto it = myStep + 2; it != myPlan->end(); it++) {
568 MSStage* const futureStage = *it;
569 MSStage* const prevStage = *(it - 1);
570 if (futureStage->getStageType() == MSStageType::DRIVING) {
571 MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
572 // ride origin is set implicitly from the walk destination
573 ds->setOrigin(nullptr, nullptr, -1);
574 if (ds->getLines() == stage->getLines()
575 && prevStage->getDestination() == &orig->getLane().getEdge()) {
576 if (prevStage->getStageType() == MSStageType::TRIP) {
577 dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
578#ifdef DEBUG_PARKING
579 std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
580#endif
581 } else if (prevStage->getStageType() == MSStageType::WALKING) {
582#ifdef DEBUG_PARKING
583 std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
584#endif
585 MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
586 replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
587 int prevStageRelIndex = (int)(it - 1 - myStep);
588 removeStage(prevStageRelIndex);
589 appendStage(newStage, prevStageRelIndex);
590 }
591 break;
592 }
593 }
594 }
595 }
596}
597
598
600MSTransportable::getDevice(const std::type_info& type) const {
601 for (MSTransportableDevice* const dev : myDevices) {
602 if (typeid(*dev) == type) {
603 return dev;
604 }
605 }
606 return nullptr;
607}
608
609
610void
611MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
614 const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
615 // checked in MSLink::ignoreFoe
616 } else {
617 throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
618 }
619}
620
621
622double
624 const MSEdge* edge = getEdge();
625 const double ep = getEdgePos();
626 const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
627 return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
628}
629
630
632MSTransportable::getWaitingTime(const bool /* accumulated */) const {
633 return (*myStep)->getWaitingTime();
634}
635
636
637double
639 return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
640}
641
642
647
648
649int
654
655void
657 // this saves lots of departParameters which are only needed for transportables that did not yet depart
658 // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
659 const SUMOTime desiredDepart = myParameter->depart;
660 if (myPlan->front()->getDeparted() >= 0) {
661 // this is only relevant in the context of delayed departure (max-num-persons)
662 const_cast<SUMOVehicleParameter*>(myParameter)->depart = myPlan->front()->getDeparted();
663 }
665 const_cast<SUMOVehicleParameter*>(myParameter)->depart = desiredDepart;
670 }
671 int stepIdx = (int)(myStep - myPlan->begin());
672 for (auto it = myPlan->begin(); it != myStep; ++it) {
673 const MSStageType st = (*it)->getStageType();
674 if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
675 stepIdx--;
676 }
677 }
678 std::ostringstream state;
679 state << myParameter->parametersSet << " " << stepIdx;
680 (*myStep)->saveState(state);
681 out.writeAttr(SUMO_ATTR_STATE, state.str());
682 const MSStage* previous = nullptr;
683 for (const MSStage* const stage : *myPlan) {
684 stage->routeOutput(myAmPerson, out, false, previous);
685 previous = stage;
686 }
687 out.closeTag();
688}
689
690
691void
692MSTransportable::loadState(const std::string& state) {
693 std::istringstream iss(state);
694 int step;
695 iss >> myParameter->parametersSet >> step;
696 myPlan->front()->setDeparted(myParameter->depart);
697 myStep = myPlan->begin() + step;
698 (*myStep)->loadState(this, iss);
699}
700
701
702/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
std::vector< const MSEdge * > ConstMSEdgeVector
Definition MSEdge.h:74
MSStageType
Definition MSStage.h:55
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:288
#define WRITE_WARNING(msg)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:305
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SIMSTEP
Definition SUMOTime.h:61
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:62
const long long int VTYPEPARS_VEHICLECLASS_SET
const std::string DEFAULT_PEDTYPE_ID
const std::string DEFAULT_CONTAINERTYPE_ID
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PEDESTRIAN
pedestrian
const long long int VEHPARS_JUNCTIONMODEL_PARAMS_SET
const long long int VEHPARS_SPEEDFACTOR_SET
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_PERSON
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_WAITINGTIME
@ SUMO_ATTR_JM_IGNORE_IDS
@ SUMO_ATTR_TRAVELTIME
@ SUMO_ATTR_JM_IGNORE_TYPES
@ SUMO_ATTR_TIMELOSS
@ SUMO_ATTR_SPEEDFACTOR
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_ID
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_STATE
The state of a link.
int gPrecision
the precision for floating point outputs
Definition StdDefs.cpp:26
int gPrecisionRandom
Definition StdDefs.cpp:29
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
Abstract in-vehicle / in-person device.
Definition MSDevice.h:62
static void buildTransportableDevices(MSTransportable &p, std::vector< MSTransportableDevice * > &into)
Build devices for the given person, if needed.
Definition MSDevice.cpp:139
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
virtual void removeTransportable(MSTransportable *t) const
Definition MSEdge.cpp:1203
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
Representation of a lane in the micro simulation.
Definition MSLane.h:84
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:769
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
The simulated network and simulation perfomer.
Definition MSNet.h:89
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:186
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition MSNet.h:477
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1209
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:326
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:384
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1200
SUMOVehicle * getVehicle() const
Current vehicle in which the transportable is driving (or nullptr)
void setOrigin(const MSEdge *origin, MSStoppingPlace *originStop, double departPos)
change origin for parking area rerouting
const std::set< std::string > & getLines() const
MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
double getArrivalPos() const
return default value for undefined arrivalPos
const MSEdge * getDestination() const
returns the destination edge
Definition MSStage.cpp:65
virtual const MSEdge * getFromEdge() const
Definition MSStage.cpp:77
MSStageTrip * getTrip() const
Definition MSStage.h:283
virtual double getArrivalPos() const
Definition MSStage.h:97
virtual MSStoppingPlace * getOriginStop() const
returns the origin stop (if any). only needed for MSStageTrip
Definition MSStage.h:93
virtual const std::string setArrived(MSNet *net, MSTransportable *transportable, SUMOTime now, const bool vehicleArrived)
logs end of the step
Definition MSStage.cpp:160
MSStoppingPlace * getDestinationStop() const
returns the destination stop (if any)
Definition MSStage.h:88
MSStageType getStageType() const
Definition MSStage.h:138
void setArrivalPos(double arrivalPos)
Definition MSStage.h:108
void setDestination(const MSEdge *newDestination, MSStoppingPlace *newDestStop)
Definition MSStage.cpp:188
virtual void routeOutput(const bool isPerson, OutputDevice &os, const bool withRouteLength, const MSStage *const previous) const =0
Called on writing vehroute output.
virtual const MSEdge * getEdge() const
Returns the current edge.
Definition MSStage.cpp:71
ConstMSEdgeVector getEdges() const
the edges of the current stage
const std::vector< const MSEdge * > & getRoute() const
const std::vector< constMSEdge * >::iterator getRouteStep() const
const std::string reroute(const SUMOTime time, MSTransportableRouter &router, MSTransportable *const transportable, MSStage *previous, const MSEdge *origin, const MSEdge *destination, std::vector< MSStage * > &stages)
A lane area vehicles can halt at.
double getBeginLanePosition() const
Returns the begin position of this stop.
double getEndLanePosition() const
Returns the end position of this stop.
void removeTransportable(const MSTransportable *p)
Removes a transportable from this stop.
const MSLane & getLane() const
Returns the lane this stop is located at.
void registerTeleportAbortWait()
register a teleport after aborting a long wait
virtual void erase(MSTransportable *transportable)
removes a single transportable
Abstract in-person device.
const MSEdge * getFromEdge() const
Returns the departure edge.
virtual double getChosenSpeedFactor() const
the current speed factor of the transportable (where applicable)
virtual double getEdgePos() const
Return the position on the edge.
bool hasDeparted() const
return whether the transportable has started its plan
int getRNGIndex() const
returns the index of the associated RNG
SUMOVehicleClass getVClass() const
Returns the object's access class.
static NumericalID myCurrentNumericalIndex
SUMOTime getDeparture() const
logs depart time of the current stage
double getBackPositionOnLane(const MSLane *lane) const
Get the object's back position along the given lane.
const MSEdge * getDestination() const
Returns the current destination.
virtual double getAngle() const
return the current angle of the transportable
void setAbortWaiting(const SUMOTime timeout)
MSStage * getNextStage(int offset) const
Return the next (or previous) stage denoted by the offset.
void routeOutput(OutputDevice &os, const bool withRouteLength) const
Called on writing vehroute output.
void setJunctionModelParameter(const std::string &key, const std::string &value)
set individual junction model paramete (not type related)
int getNumRemainingStages() const
Return the number of remaining stages (including the current)
virtual double getSpeed() const
the current speed of the transportable
PositionVector getBoundingBox() const
return the bounding box of the person
const bool myAmPerson
virtual bool checkAccess(const MSStage *const prior, const bool waitAtStop=true)
SUMOTime abortStage(SUMOTime step)
Abort current stage (used for aborting waiting for a vehicle)
std::string getStageSummary(int stageIndex) const
return textual summary for the given stage
const MSVehicleType * myVType
This transportable's type. (mainly used for drawing related information Note sure if it is really nec...
MSStage * getCurrentStage() const
Return the current stage.
void setDeparted(SUMOTime now)
logs depart time of the current stage
const std::set< NumericalID > getUpcomingEdgeIDs() const
returns the numerical IDs of edges to be used (possibly of future stages)
void setSpeed(double speed)
set the speed for all present and future (walking) stages and modify the vType so that stages added l...
virtual bool proceed(MSNet *net, SUMOTime time, const bool vehicleArrived=false)
MSTransportablePlan::iterator myStep
the iterator over the route
MSTransportablePlan * myPlan
the plan of the transportable
void removeStage(int next, bool stayInSim=true)
removes the nth next stage
SUMOVehicle * getVehicle() const
The vehicle associated with this transportable.
SUMOTime getWaitingTime(const bool accumulated=false) const
bool isPerson() const
Whether it is a person.
virtual Position getPosition() const
Return the Network coordinate of the transportable.
const SUMOVehicleParameter * myParameter
the plan of the transportable
double getPositionOnLane() const
Get the object's position along the lane.
void saveState(OutputDevice &out)
Saves the current state into the given stream.
bool isContainer() const
Whether it is a container.
void replaceVehicleType(const MSVehicleType *type)
Replaces the current vehicle type by the one given.
const MSVehicleType & getVehicleType() const
Returns the object's "vehicle" type.
virtual ~MSTransportable()
destructor
MSStageType getCurrentStageType() const
the current stage type of the transportable
void rerouteParkingArea(MSStoppingPlace *orig, MSStoppingPlace *replacement)
adapt plan when the vehicle reroutes and now stops at replacement instead of orig
std::string getObjectType()
void loadState(const std::string &state)
Reconstructs the current state.
std::vector< MSTransportableDevice * > myDevices
The devices this transportable has.
virtual double getWaitingSeconds() const
the time this transportable spent waiting in seconds
MSTransportable(const SUMOVehicleParameter *pars, MSVehicleType *vtype, MSTransportablePlan *plan, const bool isPerson)
constructor
bool hasArrived() const
return whether the person has reached the end of its plan
double getSlope() const
Returns the slope of the road at object's position in degrees.
bool reroute(SUMOTime t, const std::string &info, MSTransportableRouter &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)
void tripInfoOutput(OutputDevice &os) const
Called on writing tripinfo output.
void appendStage(MSStage *stage, int next=-1)
Appends the given stage to the current plan.
SumoRNG * getRNG() const
returns the associated RNG
virtual int getRoutingMode() const
return routing mode (configures router choice but also handling of transient permission changes)
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
const MSEdge * getEdge() const
Returns the current edge.
const MSEdge * getRerouteDestination() const
Returns the end point for reroutes (usually the last edge of the route)
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr)
Replaces the current route by the given one.
virtual int getDirection() const
Return the movement directon on the edge.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
MSDevice * getDevice(const std::type_info &type) const
Returns a device of the given type if it exists or nullptr if not.
void setID(const std::string &newID)
set the id (inherited from Named but forbidden for transportables)
WrappingCommand< MSTransportable > * myAbortCommand
SUMOTime getDesiredDepart() const
Returns the desired departure time.
const SUMOVehicleParameter & getParameter() const
Returns the vehicle's parameter (including departure definition)
double getMaxSpeed() const
Returns the maximum speed (the minimum of desired and physical maximum speed)
void removeVType(const MSVehicleType *vehType)
The car-following model and parameter.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
const std::string & getID() const
Returns the name of the vehicle type.
void setMaxSpeed(const double &maxSpeed)
Set a new value for this type's maximum speed.
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
double getLength() const
Get vehicle's length [m].
const SUMOVTypeParameter & getParameter() const
MSVehicleType * buildSingularType(const std::string &id) const
Duplicates the microsim vehicle type giving the newly created type the given id, marking it as vehicl...
const std::string & getID() const
Returns the id.
Definition Named.h:74
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
void lf()
writes a line feed if applicable
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.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
A point in 2D or 3D with translation and scaling methods.
Definition Position.h:37
A list of positions.
void append(const PositionVector &v, double sameThreshold=2.0)
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
PositionVector reverse() const
reverse position vector
Representation of a vehicle, person, or container.
long long int NumericalID
bool wasSet(long long int what) const
Returns whether the given parameter was set.
virtual void removeTransportable(MSTransportable *t)=0
removes a person or container
Structure representing possible vehicle parameter.
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
A wrapper for a Command function.
void deschedule()
Marks this Command as being descheduled.
TRACI_CONST int ROUTING_MODE_DEFAULT