SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MSVehicleTransfer.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // A mover of vehicles that got stucked due to grid locks
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo-sim.org/
12 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #include <iostream>
35 #include "MSNet.h"
36 #include "MSLane.h"
37 #include "MSEdge.h"
38 #include "MSVehicle.h"
40 #include "MSVehicleControl.h"
41 #include "MSVehicleTransfer.h"
42 
43 #ifdef CHECK_MEMORY_LEAKS
44 #include <foreign/nvwa/debug_new.h>
45 #endif // CHECK_MEMORY_LEAKS
46 
47 
48 // ===========================================================================
49 // static member definitions
50 // ===========================================================================
53 const std::set<const MSVehicle*> MSVehicleTransfer::myEmptyVehicleSet;
54 
55 // ===========================================================================
56 // member method definitions
57 // ===========================================================================
58 void
61  if (veh->isParking()) {
63  myParkingVehicles[veh->getLane()].insert(veh); // initialized to empty set on first use
65  } else {
67  if (veh->succEdge(1) == 0) {
68  WRITE_WARNING("Vehicle '" + veh->getID() + "' teleports beyond end of route ('" + veh->getEdge()->getID() + "'), time " + time2string(t) + ".");
71  return;
72  }
74  veh->enterLaneAtMove(veh->succEdge(1)->getLanes()[0], true);
75  }
76  myVehicles.push_back(VehicleInformation(veh,
78  veh->isParking()));
79 }
80 
81 
82 void
84  // go through vehicles
85  for (VehicleInfVector::iterator i = myVehicles.begin(); i != myVehicles.end();) {
86  // get the vehicle information
87  VehicleInformation& desc = *i;
88 
89  if (desc.myParking) {
90  // handle parking vehicles
91  if (desc.myVeh->processNextStop(1) == 0) {
92  ++i;
93  continue;
94  }
95  // parking finished, head back into traffic
96  }
97  const SUMOVehicleClass vclass = desc.myVeh->getVehicleType().getVehicleClass();
98  const MSEdge* e = desc.myVeh->getEdge();
99  const MSEdge* nextEdge = desc.myVeh->succEdge(1);
100 
101  // get the lane on which this vehicle should continue
102  // first select all the lanes which allow continuation onto nextEdge
103  // then pick the one which is least occupied
104  // @todo maybe parking vehicles should always continue on the rightmost lane?
105  MSLane* l = e->getFreeLane(e->allowedLanes(*nextEdge, vclass), vclass);
106 
107  if (desc.myParking) {
108  // handle parking vehicles
111  myParkingVehicles[desc.myVeh->getLane()].erase(desc.myVeh);
112  i = myVehicles.erase(i);
113  } else {
114  i++;
115  }
116  } else {
117  // handle teleporting vehicles
119  WRITE_WARNING("Vehicle '" + desc.myVeh->getID() + "' ends teleporting on edge '" + e->getID() + "', time " + time2string(MSNet::getInstance()->getCurrentTimeStep()) + ".");
121  i = myVehicles.erase(i);
122  } else {
123  // could not insert. maybe we should proceed in virtual space
124  if (desc.myProceedTime < time) {
125  if (desc.myVeh->succEdge(1) == 0) {
126  WRITE_WARNING("Vehicle '" + desc.myVeh->getID() + "' teleports beyond end of route ('" + e->getID() + "'), time " + time2string(MSNet::getInstance()->getCurrentTimeStep()) + ".");
129  i = myVehicles.erase(i);
130  continue;
131  }
132  // let the vehicle move to the next edge
134  // active move reminders (i.e. rerouters)
135  desc.myVeh->enterLaneAtMove(desc.myVeh->succEdge(1)->getLanes()[0], true);
136  // use current travel time to determine when to move the vehicle forward
138  }
139  ++i;
140  }
141  }
142  }
143 }
144 
145 
146 bool
148  return !myVehicles.empty();
149 }
150 
151 
154  if (myInstance == 0) {
156  }
157  return myInstance;
158 }
159 
160 
162 
163 
165  myInstance = 0;
166 }
167 
168 
169 const std::set<const MSVehicle*>&
171  ParkingVehicles::const_iterator it = myParkingVehicles.find(lane);
172  if (it != myParkingVehicles.end()) {
173  return it->second;
174  } else {
175  return myEmptyVehicleSet;
176  }
177 }
178 
179 
180 /****************************************************************************/
181