SUMO - Simulation of Urban MObility
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
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>
34
#include <
utils/common/MsgHandler.h
>
35
#include "
MSNet.h
"
36
#include "
MSLane.h
"
37
#include "
MSEdge.h
"
38
#include "
MSVehicle.h
"
39
#include "
MSAbstractLaneChangeModel.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
// ===========================================================================
51
MSVehicleTransfer
*
MSVehicleTransfer::myInstance
= 0;
52
const
SUMOReal
MSVehicleTransfer::TeleportMinSpeed
= 1;
53
const
std::set<const MSVehicle*>
MSVehicleTransfer::myEmptyVehicleSet
;
54
55
// ===========================================================================
56
// member method definitions
57
// ===========================================================================
58
void
59
MSVehicleTransfer::addVeh
(
const
SUMOTime
t,
MSVehicle
* veh) {
60
veh->
getLaneChangeModel
().
endLaneChangeManeuver
();
61
if
(veh->
isParking
()) {
62
MSNet::getInstance
()->
informVehicleStateListener
(veh,
MSNet::VEHICLE_STATE_STARTING_PARKING
);
63
myParkingVehicles
[veh->
getLane
()].insert(veh);
// initialized to empty set on first use
64
veh->
onRemovalFromNet
(
MSMoveReminder::NOTIFICATION_PARKING
);
65
}
else
{
66
MSNet::getInstance
()->
informVehicleStateListener
(veh,
MSNet::VEHICLE_STATE_STARTING_TELEPORT
);
67
if
(veh->
succEdge
(1) == 0) {
68
WRITE_WARNING
(
"Vehicle '"
+ veh->
getID
() +
"' teleports beyond end of route ('"
+ veh->
getEdge
()->
getID
() +
"'), time "
+
time2string
(t) +
"."
);
69
veh->
onRemovalFromNet
(
MSMoveReminder::NOTIFICATION_TELEPORT_ARRIVED
);
70
MSNet::getInstance
()->
getVehicleControl
().
scheduleVehicleRemoval
(veh);
71
return
;
72
}
73
veh->
onRemovalFromNet
(
MSMoveReminder::NOTIFICATION_TELEPORT
);
74
veh->
enterLaneAtMove
(veh->
succEdge
(1)->
getLanes
()[0],
true
);
75
}
76
myVehicles
.push_back(
VehicleInformation
(veh,
77
t +
TIME2STEPS
(veh->
getEdge
()->
getCurrentTravelTime
(
TeleportMinSpeed
)),
78
veh->
isParking
()));
79
}
80
81
82
void
83
MSVehicleTransfer::checkInsertions
(
SUMOTime
time) {
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
109
if
(l->
isInsertionSuccess
(desc.
myVeh
, 0, desc.
myVeh
->
getPositionOnLane
(),
false
,
MSMoveReminder::NOTIFICATION_PARKING
)) {
110
MSNet::getInstance
()->
informVehicleStateListener
(desc.
myVeh
,
MSNet::VEHICLE_STATE_ENDING_PARKING
);
111
myParkingVehicles
[desc.
myVeh
->
getLane
()].erase(desc.
myVeh
);
112
i =
myVehicles
.erase(i);
113
}
else
{
114
i++;
115
}
116
}
else
{
117
// handle teleporting vehicles
118
if
(l->
freeInsertion
(*(desc.
myVeh
),
MIN2
(l->
getSpeedLimit
(), desc.
myVeh
->
getMaxSpeed
()),
MSMoveReminder::NOTIFICATION_TELEPORT
)) {
119
WRITE_WARNING
(
"Vehicle '"
+ desc.
myVeh
->
getID
() +
"' ends teleporting on edge '"
+ e->
getID
() +
"', time "
+
time2string
(
MSNet::getInstance
()->getCurrentTimeStep()) +
"."
);
120
MSNet::getInstance
()->
informVehicleStateListener
(desc.
myVeh
,
MSNet::VEHICLE_STATE_ENDING_TELEPORT
);
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()) +
"."
);
127
desc.
myVeh
->
leaveLane
(
MSMoveReminder::NOTIFICATION_TELEPORT_ARRIVED
);
128
MSNet::getInstance
()->
getVehicleControl
().
scheduleVehicleRemoval
(desc.
myVeh
);
129
i =
myVehicles
.erase(i);
130
continue
;
131
}
132
// let the vehicle move to the next edge
133
desc.
myVeh
->
leaveLane
(
MSMoveReminder::NOTIFICATION_TELEPORT
);
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
137
desc.
myProceedTime
= time +
TIME2STEPS
(e->
getCurrentTravelTime
(
TeleportMinSpeed
));
138
}
139
++i;
140
}
141
}
142
}
143
}
144
145
146
bool
147
MSVehicleTransfer::hasPending
()
const
{
148
return
!
myVehicles
.empty();
149
}
150
151
152
MSVehicleTransfer
*
153
MSVehicleTransfer::getInstance
() {
154
if
(
myInstance
== 0) {
155
myInstance
=
new
MSVehicleTransfer
();
156
}
157
return
myInstance
;
158
}
159
160
161
MSVehicleTransfer::MSVehicleTransfer
() {}
162
163
164
MSVehicleTransfer::~MSVehicleTransfer
() {
165
myInstance
= 0;
166
}
167
168
169
const
std::set<const MSVehicle*>&
170
MSVehicleTransfer::getParkingVehicles
(
const
MSLane
* lane)
const
{
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
home
delphi
sumo
src
microsim
MSVehicleTransfer.cpp
Generated by
1.8.2