Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file MSStageDriving.h
15 : /// @author Michael Behrisch
16 : /// @date Tue, 21 Apr 2015
17 : ///
18 : // A stage performing the travelling by a transport system (cars, public transport)
19 : /****************************************************************************/
20 : #pragma once
21 : #include <config.h>
22 :
23 : #include <set>
24 : #include <cassert>
25 : #include <utils/common/Command.h>
26 : #include <utils/common/SUMOTime.h>
27 : #include <utils/common/SUMOVehicleClass.h>
28 : #include <utils/geom/Position.h>
29 : #include <utils/geom/PositionVector.h>
30 : #include <utils/geom/Boundary.h>
31 : #include <utils/router/SUMOAbstractRouter.h>
32 : #include <utils/vehicle/SUMOTrafficObject.h>
33 : #include "MSStage.h"
34 :
35 :
36 : // ===========================================================================
37 : // class declarations
38 : // ===========================================================================
39 : class MSEdge;
40 : class MSLane;
41 : class MSNet;
42 : class MSStop;
43 : class MSStoppingPlace;
44 : class MSVehicleType;
45 : class OutputDevice;
46 : class SUMOVehicleParameter;
47 : class SUMOVehicle;
48 : class MSTransportableDevice;
49 : class MSTransportable;
50 :
51 : typedef std::vector<const MSEdge*> ConstMSEdgeVector;
52 :
53 : // ===========================================================================
54 : // class definitions
55 : // ===========================================================================
56 : /**
57 : * A "real" stage performing the travelling by a transport system
58 : * The given route will be chosen. The travel time is computed by the simulation
59 : */
60 : class MSStageDriving : public MSStage {
61 : public:
62 : /// constructor
63 : MSStageDriving(const MSEdge* origin, const MSEdge* destination, MSStoppingPlace* toStop,
64 : const double arrivalPos, const double arrivalPosLat, const std::vector<std::string>& lines,
65 : const std::string& group = "",
66 : const std::string& intendedVeh = "", SUMOTime intendedDepart = -1);
67 :
68 : /// destructor
69 : virtual ~MSStageDriving();
70 :
71 : MSStage* clone() const;
72 :
73 : /// @brief return default value for undefined arrivalPos
74 : double getArrivalPos() const;
75 :
76 : bool unspecifiedArrivalPos() const;
77 :
78 : /// abort this stage (TraCI)
79 : void abort(MSTransportable* t);
80 :
81 : /// initialization, e.g. for param-related events
82 : void init(MSTransportable* transportable);
83 :
84 : /// Returns the current edge
85 : const MSEdge* getEdge() const;
86 : const MSEdge* getFromEdge() const;
87 : double getEdgePos(SUMOTime now) const;
88 :
89 : /// @brief Return the movement directon on the edge
90 : int getDirection() const;
91 :
92 : const MSLane* getLane() const;
93 :
94 98492 : MSStoppingPlace* getOriginStop() const {
95 98492 : return myOriginStop;
96 : }
97 :
98 : ///
99 : Position getPosition(SUMOTime now) const;
100 :
101 : double getAngle(SUMOTime now) const;
102 :
103 : /// @brief get travel distance in this stage
104 : double getDistance() const;
105 :
106 : /// @brief return (brief) string representation of the current stage
107 : std::string getStageDescription(const bool isPerson) const;
108 :
109 : /// @brief return string summary of the current stage
110 : std::string getStageSummary(const bool isPerson) const;
111 :
112 : /// proceeds to this stage
113 : void proceed(MSNet* net, MSTransportable* transportable, SUMOTime now, MSStage* previous);
114 :
115 : /** @brief Called on writing tripinfo output
116 : * @param[in] os The stream to write the information into
117 : * @exception IOError not yet implemented
118 : */
119 : void tripInfoOutput(OutputDevice& os, const MSTransportable* const transportable) const;
120 :
121 : /** @brief Called on writing vehroute output
122 : * @param[in] isPerson Whether we are writing person or container info
123 : * @param[in] os The stream to write the information into
124 : * @param[in] withRouteLength whether route length shall be written
125 : * @param[in] previous The previous stage for additional info such as from edge
126 : * @exception IOError not yet implemented
127 : */
128 : void routeOutput(const bool isPerson, OutputDevice& os, const bool withRouteLength, const MSStage* const previous) const;
129 :
130 : /// Whether the person waits for the given vehicle
131 : bool isWaitingFor(const SUMOVehicle* vehicle) const;
132 :
133 : /// @brief Whether the person waits for a vehicle
134 : bool isWaiting4Vehicle() const;
135 :
136 : /// @brief Return where the person waits and for what
137 : std::string getWaitingDescription() const;
138 :
139 73291 : SUMOVehicle* getVehicle() const {
140 73291 : return myVehicle;
141 : }
142 :
143 : /// @brief time spent waiting for a ride
144 : SUMOTime getWaitingTime(SUMOTime now) const;
145 :
146 : double getSpeed() const;
147 :
148 : ConstMSEdgeVector getEdges() const;
149 :
150 : void setVehicle(SUMOVehicle* v);
151 :
152 : /// @brief marks arrival time and records driven distance
153 : const std::string setArrived(MSNet* net, MSTransportable* transportable, SUMOTime now, const bool vehicleArrived);
154 :
155 : const std::set<std::string>& getLines() const {
156 75411 : return myLines;
157 : }
158 :
159 : std::string getIntendedVehicleID() const {
160 525 : return myIntendedVehicleID;
161 : }
162 :
163 : SUMOTime getIntendedDepart() const {
164 102 : return myIntendedDepart;
165 : }
166 :
167 : std::string getVehicleType() const {
168 525 : return myVehicleType;
169 : }
170 :
171 : /// change origin for parking area rerouting
172 : void setOrigin(const MSEdge* origin) {
173 10 : myOrigin = origin;
174 : }
175 :
176 : /// @brief checks whether the person may exit at the current vehicle position
177 : bool canLeaveVehicle(const MSTransportable* t, const SUMOVehicle& veh, const MSStop& stop);
178 :
179 : SUMOTime getTimeLoss(const MSTransportable* transportable) const;
180 : SUMOTime getDuration() const;
181 : SUMOTime getTravelTime() const;
182 : SUMOTime getWaitingTime() const;
183 :
184 : /** @brief Saves the current state into the given stream
185 : */
186 : void saveState(std::ostringstream& out);
187 :
188 : /** @brief Reconstructs the current state
189 : */
190 : void loadState(MSTransportable* transportable, std::istringstream& state);
191 :
192 38 : bool equals(const MSStage& s) const {
193 38 : if (!MSStage::equals(s)) {
194 : return false;
195 : }
196 : // this is safe because MSStage already checked that the type fits
197 : const MSStageDriving& sd = static_cast<const MSStageDriving&>(s);
198 38 : return myOrigin == sd.myOrigin &&
199 38 : myLines == sd.myLines &&
200 32 : myIntendedVehicleID == sd.myIntendedVehicleID;
201 : }
202 :
203 : protected:
204 : /// the origin edge
205 : const MSEdge* myOrigin;
206 :
207 : /// the lines to choose from
208 : const std::set<std::string> myLines;
209 :
210 : /// @brief The taken vehicle
211 : SUMOVehicle* myVehicle;
212 : /// @brief cached vehicle data for output after the vehicle has been removed
213 : std::string myVehicleID;
214 : std::string myVehicleLine;
215 : std::string myVehicleType;
216 :
217 : SUMOVehicleClass myVehicleVClass;
218 : double myVehicleDistance;
219 : /// @brief While driving, this is the timeLoss of the vehicle when the ride started, after arrival this is the timeLoss which the vehicle accumulated during the ride
220 : SUMOTime myTimeLoss;
221 :
222 : double myWaitingPos;
223 : /// @brief The time since which this person is waiting for a ride
224 : SUMOTime myWaitingSince;
225 : const MSEdge* myWaitingEdge;
226 : Position myStopWaitPos;
227 : /// @brief the stop at which this ride starts (or nullptr)
228 : MSStoppingPlace* myOriginStop;
229 :
230 : std::string myIntendedVehicleID;
231 : SUMOTime myIntendedDepart;
232 :
233 :
234 : private:
235 : /// brief register waiting person (on proceed or loadState)
236 : void registerWaiting(MSTransportable* transportable, SUMOTime now);
237 :
238 : private:
239 : /// @brief Invalidated copy constructor.
240 : MSStageDriving(const MSStageDriving&);
241 :
242 : /// @brief Invalidated assignment operator.
243 : MSStageDriving& operator=(const MSStageDriving&) = delete;
244 :
245 : private:
246 : class BookReservation : public Command {
247 : public:
248 162 : BookReservation(MSTransportable* transportable, SUMOTime earliestPickupTime, MSStageDriving* stage) :
249 162 : myTransportable(transportable), myEarliestPickupTime(earliestPickupTime), myStage(stage), myWaitingPos(stage->myWaitingPos) {}
250 : SUMOTime execute(SUMOTime currentTime);
251 :
252 : public:
253 : MSTransportable* myTransportable;
254 : SUMOTime myEarliestPickupTime;
255 : MSStageDriving* myStage;
256 : double myWaitingPos;
257 : };
258 :
259 : protected:
260 : BookReservation* myReservationCommand;
261 :
262 : };
|