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-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
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 myRandomSeed(RandHelper::murmur3_32(pars->id, RandHelper::getSeed())) {
57 myStep = myPlan->begin();
58 // init devices
60 for (MSStage* const stage : * myPlan) {
61 stage->init(this);
62 }
63}
64
65
68 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
69 if (stage->getVehicle() != nullptr) {
70 stage->getVehicle()->removeTransportable(this);
71 } else if (stage->getOriginStop() != nullptr) {
72 stage->getOriginStop()->removeTransportable(this);
73 }
74 }
75 if (myPlan != nullptr) {
76 for (MSTransportablePlan::const_iterator i = myPlan->begin(); i != myPlan->end(); ++i) {
77 delete *i;
78 }
79 delete myPlan;
80 myPlan = nullptr;
81 }
82 for (MSTransportableDevice* dev : myDevices) {
83 delete dev;
84 }
85 delete myParameter;
88 }
89}
90
93 return getEdge()->getLanes()[0]->getRNG();
94}
95
96int
98 return getEdge()->getLanes()[0]->getRNGIndex();
99}
100
101bool
102MSTransportable::proceed(MSNet* net, SUMOTime time, const bool vehicleArrived) {
103 MSStage* const prior = *myStep;
104 const std::string& error = prior->setArrived(net, this, time, vehicleArrived);
105 // must be done before increasing myStep to avoid invalid state for rendering
106 prior->getEdge()->removeTransportable(this);
107 myStep++;
108 if (error != "") {
109 throw ProcessError(error);
110 }
111 /* We need to check whether an access stage is needed (or maybe even two).
112 The general scheme is: If the prior stage ended at a stop and the next stage
113 starts at an edge which is not the one the stop is at, but the stop has an access to it
114 we need an access stage. The same is true if prior ends at an edge, the next stage
115 is allowed to start at any stop the edge has access to.
116 If we start at a stop or end at a stop no access is needed.
117 */
118 bool accessToStop = false;
120 accessToStop = checkAccess(prior);
121 } else if (prior->getStageType() == MSStageType::WAITING_FOR_DEPART) {
122 for (MSTransportableDevice* const dev : myDevices) {
123 dev->notifyEnter(*this, MSMoveReminder::NOTIFICATION_DEPARTED, nullptr);
124 }
125 }
126 if (!accessToStop && (myStep == myPlan->end()
127 || ((*myStep)->getStageType() != MSStageType::DRIVING
128 && (*myStep)->getStageType() != MSStageType::TRIP))) {
129 MSStoppingPlace* priorStop = prior->getStageType() == MSStageType::TRIP ? prior->getOriginStop() : prior->getDestinationStop();
130 // a trip might resolve to DRIVING so we would have to stay at the stop
131 // if a trip resolves to something else, this step will do stop removal
132 if (priorStop != nullptr) {
133 priorStop->removeTransportable(this);
134 }
135 }
136 if (myStep != myPlan->end()) {
137 if ((*myStep)->getStageType() == MSStageType::WALKING && (prior->getStageType() != MSStageType::ACCESS || prior->getDestination() != (*myStep)->getFromEdge())) {
138 checkAccess(prior, false);
139 } else if ((*myStep)->getStageType() == MSStageType::WAITING && prior->getStageType() == MSStageType::WAITING && prior->getDestination() != (*myStep)->getFromEdge()) {
140 checkAccess(prior, false);
141 }
142 (*myStep)->proceed(net, this, time, prior);
143 return true;
144 } else {
146 return false;
147 }
148}
149
150
151void
152MSTransportable::setID(const std::string& /*newID*/) {
153 throw ProcessError(TL("Changing a transportable ID is not permitted"));
154}
155
160
161void
163 (*myStep)->setDeparted(now);
164}
165
168 for (const MSStage* const stage : *myPlan) {
169 if (stage->getDeparted() >= 0) {
170 return stage->getDeparted();
171 }
172 }
173 return -1;
174}
175
176const MSEdge*
178 const MSLane* lane = getLane();
179 return lane == nullptr ? getEdge() : &lane->getEdge();
180}
181
182double
184 return (*myStep)->getEdgePos(MSNet::getInstance()->getCurrentTimeStep());
185}
186
187double
189 return getEdgePos() - getVehicleType().getLength();
190}
191
192int
194 return (*myStep)->getDirection();
195}
196
199 return (*myStep)->getPosition(MSNet::getInstance()->getCurrentTimeStep());
200}
201
202double
204 return (*myStep)->getAngle(MSNet::getInstance()->getCurrentTimeStep());
205}
206
207double
209 return STEPS2TIME((*myStep)->getWaitingTime());
210}
211
212double
214 return (*myStep)->getSpeed();
215}
216
217
218void
220 SUMOTime departure = myPlan->front()->getDeparted();
221 os.openTag(isPerson() ? "personinfo" : "containerinfo");
223 os.writeAttr(SUMO_ATTR_DEPART, departure >= 0 ? time2string(departure) : "-1");
225 if (isPerson()) {
227 }
228 SUMOTime duration = 0;
229 SUMOTime waitingTime = 0;
230 SUMOTime timeLoss = 0;
231 SUMOTime travelTime = 0;
232 bool durationOK = true;
233 bool waitingTimeOK = true;
234 bool timeLossOK = true;
235 bool travelTimeOK = true;
236 for (MSStage* const i : *myPlan) {
237 SUMOTime t = i->getDuration();
238 if (t != SUMOTime_MAX) {
239 duration += t;
240 } else {
241 durationOK = false;
242 }
243 t = i->getTotalWaitingTime();
244 if (t != SUMOTime_MAX) {
245 waitingTime += t;
246 } else {
247 waitingTimeOK = false;
248 }
249 t = i->getTimeLoss(this);
250 if (t != SUMOTime_MAX) {
251 timeLoss += t;
252 } else {
253 timeLossOK = false;
254 }
255 t = i->getTravelTime();
256 if (t != SUMOTime_MAX) {
257 travelTime += t;
258 } else {
259 travelTimeOK = false;
260 }
261 }
262 os.writeAttr(SUMO_ATTR_DURATION, durationOK ? time2string(duration) : "-1");
263 os.writeAttr(SUMO_ATTR_WAITINGTIME, waitingTimeOK ? time2string(waitingTime) : "-1");
264 os.writeAttr(SUMO_ATTR_TIMELOSS, timeLossOK ? time2string(timeLoss) : "-1");
265 os.writeAttr(SUMO_ATTR_TRAVELTIME, travelTimeOK ? time2string(travelTime) : "-1");
266 for (MSStage* const i : *myPlan) {
267 i->tripInfoOutput(os, this);
268 }
269 os.closeTag();
270}
271
272
273void
274MSTransportable::routeOutput(OutputDevice& os, const bool withRouteLength) const {
275 const std::string typeID = (
279 if (hasArrived()) {
280 os.writeAttr("arrival", time2string(MSNet::getInstance()->getCurrentTimeStep()));
281 }
282 const MSStage* previous = nullptr;
283 const bool withTiming = OptionsCont::getOptions().getBool("vehroute-output.exit-times");
284 for (const MSStage* const stage : *myPlan) {
285 stage->routeOutput(myAmPerson, os, withRouteLength, previous, withTiming);
286 previous = stage;
287 }
289 os.closeTag();
290 os.lf();
291}
292
293
294void
304
305
308 WRITE_WARNINGF(TL("Teleporting % '%'; waited too long, from edge '%', time=%."),
309 isPerson() ? "person" : "container", getID(), (*myStep)->getEdge()->getID(), time2string(step));
312 (*myStep)->abort(this);
313 if (!proceed(MSNet::getInstance(), step)) {
314 tc.erase(this);
315 }
316 return 0;
317}
318
319
320void
322 // myStep is invalidated upon modifying myPlan
323 const int stepIndex = (int)(myStep - myPlan->begin());
324 if (next < 0) {
325 myPlan->push_back(stage);
326 } else {
327 if (stepIndex + next > (int)myPlan->size()) {
328 throw ProcessError("invalid index '" + toString(next) + "' for inserting new stage into plan of '" + getID() + "'");
329 }
330 myPlan->insert(myPlan->begin() + stepIndex + next, stage);
331 }
332 myStep = myPlan->begin() + stepIndex;
333}
334
335
336void
337MSTransportable::removeStage(int next, bool stayInSim) {
338 assert(myStep + next < myPlan->end());
339 assert(next >= 0);
340 if (next > 0) {
341 // myStep is invalidated upon modifying myPlan
342 int stepIndex = (int)(myStep - myPlan->begin());
343 delete *(myStep + next);
344 myPlan->erase(myStep + next);
345 myStep = myPlan->begin() + stepIndex;
346 } else {
347 if (myStep + 1 == myPlan->end() && stayInSim) {
348 // stay in the simulation until the start of simStep to allow appending new stages (at the correct position)
349 appendStage(new MSStageWaiting(getEdge(), nullptr, 0, 0, getEdgePos(), "last stage removed", false));
350 } else if (myStep + 1 != myPlan->end()) {
351 (*(myStep + 1))->setOrigin(getEdge(), getEdge() == getFromEdge() ? (*myStep)->getOriginStop() : nullptr, getEdgePos());
352 }
353 (*myStep)->abort(this);
356 } else if (myPlan->front()->getDeparted() < 0) {
357 myPlan->front()->setDeparted(SIMSTEP);
358 }
359 }
360}
361
362
363void
365 for (MSTransportablePlan::const_iterator i = myStep; i != myPlan->end(); ++i) {
366 (*i)->setSpeed(speed);
367 }
369}
370
371
372bool
373MSTransportable::replaceRoute(ConstMSRoutePtr newRoute, const std::string& /* info */, bool /* onInit */, int /* offset */, bool /* addRouteStops */, bool /* removeStops */, std::string* /* msgReturn */) {
374 if (isPerson()) {
375 static_cast<MSPerson*>(this)->replaceWalk(newRoute->getEdges(), getPositionOnLane(), 0, 1);
376 return true;
377 }
378 return false;
379}
380
381
382bool
383MSTransportable::reroute(SUMOTime t, const std::string& /* info */, MSTransportableRouter& router, const bool /* onInit */, const bool /* withTaz */, const bool /* silent */, const MSEdge* /* sink */) {
385 if (trip == nullptr) {
386 // TODO this should be possible after factoring out MSStageTrip::reroute
387 return false;
388 }
389 if (getCurrentStage()->getVehicle() != nullptr) {
390 // TODO rerouting during a ride still needs to be implemented
391 return false;
392 }
393 // find the final stage of the trip
394 int tripEndOffset = -1;
395 for (int i = getNumRemainingStages() - 1; i >= 0; i--) {
396 if (getNextStage(i)->getTrip() == trip) {
397 tripEndOffset = i;
398 break;
399 }
400 }
401 std::vector<MSStage*> stages;
402 MSStageWaiting start(getEdge(), getCurrentStage()->getOriginStop(), -1, t, getEdgePos(), "start", true);
403 if (trip->reroute(t, router, this, &start, getEdge(), getRerouteDestination(), stages) == "") {
404 // check whether the new plan actually differs
405 while (tripEndOffset >= 0 && !stages.empty() && stages.back()->equals(*getNextStage(tripEndOffset))) {
406 delete stages.back();
407 stages.pop_back();
408 tripEndOffset--;
409 }
410 bool abortCurrent = true;
411 // check whether the future route of the current stage is identical to the route
412 if (!stages.empty() && stages.front()->isWalk() && getCurrentStage()->isWalk()) {
413 // TODO this check should be done for rides as well
414 MSStageMoving* s = static_cast<MSStageMoving*>(getCurrentStage());
415 int routeIndex = (int)(s->getRouteStep() - s->getRoute().begin());
416 ConstMSEdgeVector oldEdges = s->getEdges();
417 oldEdges.erase(oldEdges.begin(), oldEdges.begin() + routeIndex);
418 ConstMSEdgeVector newEdges = stages.front()->getEdges();
419 if (newEdges == oldEdges) {
420 delete stages.front();
421 stages.erase(stages.begin());
422 abortCurrent = false;
423 }
424 }
425 if (stages.empty()) {
426 return false;
427 }
428 // remove future stages of the trip
429 for (int i = tripEndOffset; i >= 1; i--) {
430 removeStage(i);
431 }
432 // insert new stages of the rerouting
433 int idx = 1;
434 for (MSStage* stage : stages) {
435 appendStage(stage, idx++);
436 }
437 if (abortCurrent) {
438 removeStage(0);
439 }
440 return true;
441 }
442 return false;
443}
444
445
446void
448 const SUMOVehicleClass oldVClass = myVType->getVehicleClass();
449 if (myVType->isVehicleSpecific()) {
451 }
452 if (isPerson()
453 && type->getVehicleClass() != oldVClass
454 && type->getVehicleClass() != SVC_PEDESTRIAN
456 WRITE_WARNINGF(TL("Person '%' receives type '%' which implicitly uses unsuitable vClass '%'."), getID(), type->getID(), toString(type->getVehicleClass()));
457 }
458 myVType = type;
459}
460
461
464 if (myVType->isVehicleSpecific()) {
465 return *const_cast<MSVehicleType*>(myVType);
466 }
468 replaceVehicleType(type);
469 return *type;
470}
471
472
475 PositionVector centerLine;
476 const Position p = getPosition();
477 const double angle = getAngle();
478 const double length = getVehicleType().getLength();
479 const Position back = p + Position(-cos(angle) * length, -sin(angle) * length);
480 centerLine.push_back(p);
481 centerLine.push_back(back);
482 centerLine.move2side(0.5 * getVehicleType().getWidth());
483 PositionVector result = centerLine;
484 centerLine.move2side(-getVehicleType().getWidth());
485 result.append(centerLine.reverse(), POSITION_EPS);
486 //std::cout << " transp=" << getID() << " p=" << p << " angle=" << GeomHelper::naviDegree(angle) << " back=" << back << " result=" << result << "\n";
487 return result;
488}
489
490
491std::string
492MSTransportable::getStageSummary(int stageIndex) const {
493 assert(stageIndex < (int)myPlan->size());
494 assert(stageIndex >= 0);
495 return (*myPlan)[stageIndex]->getStageSummary(myAmPerson);
496}
497
498
499const std::set<SUMOTrafficObject::NumericalID>
501 std::set<SUMOTrafficObject::NumericalID> result;
502 for (auto step = myStep; step != myPlan->end(); ++step) {
503 for (const MSEdge* const e : (*step)->getEdges()) {
504 result.insert(e->getNumericalID());
505 }
506 }
507 return result;
508}
509
510
511bool
513 return myStep == myPlan->end();
514}
515
516bool
518 return myPlan->size() > 0 && (myPlan->front()->getDeparted() >= 0 || myStep > myPlan->begin());
519}
520
521
522void
524 // check whether the transportable was riding to the orignal stop
525 // @note: parkingArea can currently not be set as myDestinationStop so we
526 // check for stops on the edge instead
527#ifdef DEBUG_PARKING
528 std::cout << SIMTIME << " person=" << getID() << " rerouteParkingArea orig=" << orig->getID() << " replacement=" << replacement->getID() << "\n";
529#endif
531 if (!myAmPerson) {
532 WRITE_WARNING(TL("parkingAreaReroute not supported for containers"));
533 return;
534 }
535 if (getDestination() == &orig->getLane().getEdge()) {
536 MSStageDriving* const stage = dynamic_cast<MSStageDriving*>(*myStep);
537 assert(stage != 0);
538 assert(stage->getVehicle() != 0);
539 // adapt plan
540 stage->setDestination(&replacement->getLane().getEdge(), replacement);
541 stage->setArrivalPos((replacement->getBeginLanePosition() + replacement->getEndLanePosition()) / 2);
542#ifdef DEBUG_PARKING
543 std::cout << " set ride destination\n";
544#endif
545 if (myStep + 1 == myPlan->end()) {
546 return;
547 }
548 // if the next step is a walk, adapt the route
549 MSStage* nextStage = *(myStep + 1);
550 if (nextStage->getStageType() == MSStageType::TRIP) {
551 dynamic_cast<MSStageTrip*>(nextStage)->setOrigin(stage->getDestination(), stage->getDestinationStop(), stage->getArrivalPos());
552#ifdef DEBUG_PARKING
553 std::cout << " set subsequent trip origin\n";
554#endif
555 } else if (nextStage->getStageType() == MSStageType::WALKING) {
556#ifdef DEBUG_PARKING
557 std::cout << " replace subsequent walk with a trip\n";
558#endif
559 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
560 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
561 removeStage(1);
562 appendStage(newStage, 1);
563 } else if (nextStage->getStageType() == MSStageType::WAITING) {
564#ifdef DEBUG_PARKING
565 std::cout << " add subsequent walk to reach stop\n";
566 std::cout << " arrivalPos=" << nextStage->getArrivalPos() << "\n";
567#endif
568 MSStageTrip* newStage = new MSStageTrip(stage->getDestination(), nullptr, nextStage->getDestination(),
569 nextStage->getDestinationStop(), -1, 0, "", -1, 1, getID(), 0, true, nextStage->getArrivalPos());
570 appendStage(newStage, 1);
571 }
572 // if the plan contains another ride with the same vehicle from the same
573 // parking area, adapt the preceeding walk to end at the replacement
574 for (auto it = myStep + 2; it != myPlan->end(); it++) {
575 MSStage* const futureStage = *it;
576 MSStage* const prevStage = *(it - 1);
577 if (futureStage->getStageType() == MSStageType::DRIVING) {
578 MSStageDriving* const ds = static_cast<MSStageDriving*>(futureStage);
579 // ride origin is set implicitly from the walk destination
580 ds->setOrigin(nullptr, nullptr, -1);
581 if (ds->getLines() == stage->getLines()
582 && prevStage->getDestination() == &orig->getLane().getEdge()) {
583 if (prevStage->getStageType() == MSStageType::TRIP) {
584 dynamic_cast<MSStageTrip*>(prevStage)->setDestination(stage->getDestination(), replacement);
585#ifdef DEBUG_PARKING
586 std::cout << " replace later trip before ride (" << (it - myPlan->begin()) << ")\n";
587#endif
588 } else if (prevStage->getStageType() == MSStageType::WALKING) {
589#ifdef DEBUG_PARKING
590 std::cout << " replace later walk before ride (" << (it - myPlan->begin()) << ")\n";
591#endif
592 MSStageTrip* newStage = new MSStageTrip(prevStage->getFromEdge(), nullptr, stage->getDestination(),
593 replacement, -1, 0, "", -1, 1, getID(), 0, true, stage->getArrivalPos());
594 int prevStageRelIndex = (int)(it - 1 - myStep);
595 removeStage(prevStageRelIndex);
596 appendStage(newStage, prevStageRelIndex);
597 }
598 break;
599 }
600 }
601 }
602 }
603}
604
605
607MSTransportable::getDevice(const std::type_info& type) const {
608 for (MSTransportableDevice* const dev : myDevices) {
609 if (typeid(*dev) == type) {
610 return dev;
611 }
612 }
613 return nullptr;
614}
615
616
617void
618MSTransportable::setJunctionModelParameter(const std::string& key, const std::string& value) {
621 const_cast<SUMOVehicleParameter&>(getParameter()).setParameter(key, value);
622 // checked in MSLink::ignoreFoe
623 } else {
624 throw InvalidArgument(getObjectType() + " '" + getID() + "' does not support junctionModel parameter '" + key + "'");
625 }
626}
627
628
629double
631 const MSEdge* edge = getEdge();
632 const double ep = getEdgePos();
633 const double gp = edge->getLanes()[0]->interpolateLanePosToGeometryPos(ep);
634 return edge->getLanes()[0]->getShape().slopeDegreeAtOffset(gp);
635}
636
637
639MSTransportable::getWaitingTime(const bool /* accumulated */) const {
640 return (*myStep)->getWaitingTime();
641}
642
643
644double
646 return MIN2(getVehicleType().getMaxSpeed(), getVehicleType().getDesiredMaxSpeed() * getChosenSpeedFactor());
647}
648
649
654
655
656int
661
662void
664 // this saves lots of departParameters which are only needed for transportables that did not yet depart
665 // the parameters may hold the name of a vTypeDistribution but we are interested in the actual type
666 const SUMOTime desiredDepart = myParameter->depart;
667 if (myPlan->front()->getDeparted() >= 0) {
668 // this is only relevant in the context of delayed departure (max-num-persons)
669 const_cast<SUMOVehicleParameter*>(myParameter)->depart = myPlan->front()->getDeparted();
670 }
672 const_cast<SUMOVehicleParameter*>(myParameter)->depart = desiredDepart;
677 }
678 int stepIdx = (int)(myStep - myPlan->begin());
679 for (auto it = myPlan->begin(); it != myStep; ++it) {
680 const MSStageType st = (*it)->getStageType();
681 if (st == MSStageType::TRIP || st == MSStageType::ACCESS) {
682 stepIdx--;
683 }
684 }
685 const bool isAccess = (*myStep)->getStageType() == MSStageType::ACCESS;
686 std::ostringstream state;
687 state << myParameter->parametersSet << " " << (isAccess ? toString(stepIdx - 0.5, 1) : toString(stepIdx));
688 (*myStep)->saveState(state, this);
689 out.writeAttr(SUMO_ATTR_STATE, state.str());
690 const MSStage* previous = nullptr;
691 for (const MSStage* const stage : *myPlan) {
692 const bool routeLength = stage->getDeparted() >= 0 && stage->getStageType() == MSStageType::DRIVING;
693 const bool withTiming = stage->getDeparted() >= 0;
694 stage->routeOutput(myAmPerson, out, routeLength, previous, withTiming, true);
695 previous = stage;
696 }
697 out.closeTag();
698}
699
700
701void
702MSTransportable::loadState(const std::string& state) {
703 std::istringstream iss(state);
704 double step;
705 iss >> myParameter->parametersSet >> step;
706 myPlan->front()->setDeparted(myParameter->depart);
707 if (step != floor(step)) {
708 // we are in an access stage
709 int priorIndex = (int)(step - 0.5);
710 MSStage* prior = *(myPlan->begin() + priorIndex);
711 myStep = myPlan->begin() + priorIndex + 1;
712 bool waitAtStop = prior->getDestinationStop() != nullptr
713 && &prior->getDestinationStop()->getLane().getEdge() != prior->getDestination();
714 checkAccess(prior, waitAtStop);
715 //std::cout << " step=" << step << " i=" << getCurrentStageIndex() << " stage=" << getStageSummary(true) << "\n";
716 } else {
717 myStep = myPlan->begin() + (int)step;
718 }
719 (*myStep)->loadState(this, iss);
720 for (int i = 1; i < step; i++) {
721 if ((*myPlan)[i]->getStageType() == MSStageType::DRIVING) {
722 dynamic_cast<MSStageDriving*>((*myPlan)[i])->setWaitingSince((*myPlan)[i - 1]->getArrived());
723 }
724 }
725}
726
727
728/****************************************************************************/
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:287
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
#define TL(string)
Definition MsgHandler.h:304
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:58
#define SIMSTEP
Definition SUMOTime.h:64
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SIMTIME
Definition SUMOTime.h:65
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:27
int gPrecisionRandom
Definition StdDefs.cpp:30
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:49
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:1231
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:775
@ 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:199
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
Definition MSNet.h:495
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1295
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1286
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:287
virtual double getArrivalPos() const
Definition MSStage.h:97
SUMOTime getDeparted() const
get departure time of stage
Definition MSStage.cpp:129
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:167
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:195
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 override
the current speed factor of the transportable (where applicable)
bool isContainer() const override
Whether it is a container.
bool replaceRoute(ConstMSRoutePtr route, const std::string &info, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true, std::string *msgReturn=nullptr) override
Replaces the current route by the given one.
virtual double getEdgePos() const
Return the position on the edge.
bool hasDeparted() const
return whether the transportable has started its plan
double getPositionOnLane() const override
Get the object's position along the lane.
static NumericalID myCurrentNumericalIndex
double getBackPositionOnLane(const MSLane *lane) const override
Get the object's back position along the given lane.
const std::set< NumericalID > getUpcomingEdgeIDs() const override
returns the numerical IDs of edges to be used (possibly of future stages)
const MSLane * getLane() const override
Returns the current lane (may be nullptr)
virtual double getSpeed() const override
the current speed of the transportable
void replaceVehicleType(const MSVehicleType *type) override
Replaces the current vehicle type by the one given.
SUMOTime getDeparture() const
logs depart time of the current stage
const MSEdge * getDestination() const
Returns the current destination.
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)
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.
SumoRNG * getRNG() const override
returns the associated RNG
void setDeparted(SUMOTime now)
logs depart time of the current stage
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)
SUMOVehicleClass getVClass() const override
Returns the object's access class.
double getMaxSpeed() const override
Returns the maximum speed (the minimum of desired and physical maximum speed)
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.
bool isPerson() const override
Whether it is a person.
virtual Position getPosition() const
Return the Network coordinate of the transportable.
const SUMOVehicleParameter * myParameter
the plan of the transportable
void saveState(OutputDevice &out)
Saves the current state into the given stream.
const MSEdge * getRerouteDestination() const override
Returns the end point for reroutes (usually the last edge of the route)
MSDevice * getDevice(const std::type_info &type) const override
Returns a device of the given type if it exists or nullptr if not.
virtual ~MSTransportable()
destructor
SUMOTime getWaitingTime(const bool accumulated=false) const override
const MSEdge * getCurrentEdge() const override
Returns the edge (normal or internal) the object is currently at.
MSStageType getCurrentStageType() const
the current stage type of the transportable
int getRNGIndex() const override
returns the index of the associated RNG
void rerouteParkingArea(MSStoppingPlace *orig, MSStoppingPlace *replacement)
adapt plan when the vehicle reroutes and now stops at replacement instead of orig
std::string getObjectType()
const SUMOVehicleParameter & getParameter() const override
Returns the vehicle's parameter (including departure definition)
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
const MSVehicleType & getVehicleType() const override
Returns the object's "vehicle" type.
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.
virtual int getRoutingMode() const override
return routing mode (configures router choice but also handling of transient permission changes)
virtual double getAngle() const override
return the current angle of the transportable
void appendStage(MSStage *stage, int next=-1)
Appends the given stage to the current plan.
void setID(const std::string &newID) override
set the id (inherited from Named but forbidden for transportables)
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
const MSEdge * getEdge() const override
Returns the current edge.
virtual int getDirection() const
Return the movement directon on the edge.
double getSlope() const override
Returns the slope of the road at object's position in degrees.
std::vector< MSStage * > MSTransportablePlan
the structure holding the plan of a transportable
WrappingCommand< MSTransportable > * myAbortCommand
bool hasArrived() const override
return whether the person has reached the end of its plan
SUMOTime getDesiredDepart() const
Returns the desired departure time.
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
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.
void lf()
writes a line feed if applicable
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false)
writes a named attribute
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
Utility functions for using a global, resetable random number generator.
Definition RandHelper.h:133
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