SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SUMOVehicleParameter.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Structure representing possible vehicle parameter
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
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 "SUMOVehicleParameter.h"
34 #include <utils/common/ToString.h>
39 
40 #ifdef CHECK_MEMORY_LEAKS
41 #include <foreign/nvwa/debug_new.h>
42 #endif // CHECK_MEMORY_LEAKS
43 
44 
45 // ===========================================================================
46 // member method definitions
47 // ===========================================================================
49  : vtypeid(DEFAULT_VTYPE_ID), color(RGBColor::DEFAULT_COLOR),
50  depart(-1), departProcedure(DEPART_GIVEN),
51  departLane(0), departLaneProcedure(DEPART_LANE_DEFAULT),
52  departPos(0), departPosProcedure(DEPART_POS_DEFAULT),
53  departSpeed(-1), departSpeedProcedure(DEPART_SPEED_DEFAULT),
54  arrivalLane(0), arrivalLaneProcedure(ARRIVAL_LANE_DEFAULT),
55  arrivalPos(0), arrivalPosProcedure(ARRIVAL_POS_DEFAULT),
56  arrivalSpeed(-1), arrivalSpeedProcedure(ARRIVAL_SPEED_DEFAULT),
57  repetitionNumber(-1), repetitionsDone(-1), repetitionOffset(-1),
58  line(), fromTaz(), toTaz(), personCapacity(0), personNumber(0), setParameter(0) {
59 }
60 
61 
62 bool
63 SUMOVehicleParameter::defaultOptionOverrides(const OptionsCont& oc, const std::string& optionName) const {
64  return oc.isSet(optionName) && oc.getBool("defaults-override");
65 }
66 
67 
68 void
73  }
75  dev.writeAttr(SUMO_ATTR_DEPART, "triggered");
76  } else {
78  }
79 
80  // optional parameter
81  // departlane
82  if (wasSet(VEHPARS_DEPARTLANE_SET) && !defaultOptionOverrides(oc, "departlane")) {
83  std::string val;
84  switch (departLaneProcedure) {
85  case DEPART_LANE_GIVEN:
86  val = toString(departLane);
87  break;
88  case DEPART_LANE_RANDOM:
89  val = "random";
90  break;
91  case DEPART_LANE_FREE:
92  val = "free";
93  break;
95  val = "allowed";
96  break;
98  val = "best";
99  break;
100  case DEPART_LANE_DEFAULT:
101  default:
102  break;
103  }
105  } else if (oc.isSet("departlane")) {
106  dev.writeAttr(SUMO_ATTR_DEPARTLANE, oc.getString("departlane"));
107  }
108  // departpos
109  if (wasSet(VEHPARS_DEPARTPOS_SET) && !defaultOptionOverrides(oc, "departpos")) {
110  std::string val;
111  switch (departPosProcedure) {
112  case DEPART_POS_GIVEN:
113  val = toString(departPos);
114  break;
115  case DEPART_POS_RANDOM:
116  val = "random";
117  break;
119  val = "random_free";
120  break;
121  case DEPART_POS_FREE:
122  val = "free";
123  break;
125  val = "pwagSimple";
126  break;
128  val = "pwagGeneric";
129  break;
131  val = "maxSpeedGap";
132  break;
133  case DEPART_POS_BASE:
134  val = "base";
135  break;
136  case DEPART_POS_DEFAULT:
137  default:
138  break;
139  }
140  dev.writeAttr(SUMO_ATTR_DEPARTPOS, val);
141  } else if (oc.isSet("departpos")) {
142  dev.writeAttr(SUMO_ATTR_DEPARTPOS, oc.getString("departpos"));
143  }
144  // departspeed
145  if (wasSet(VEHPARS_DEPARTSPEED_SET) && !defaultOptionOverrides(oc, "departspeed")) {
146  std::string val;
147  switch (departSpeedProcedure) {
148  case DEPART_SPEED_GIVEN:
149  val = toString(departSpeed);
150  break;
151  case DEPART_SPEED_RANDOM:
152  val = "random";
153  break;
154  case DEPART_SPEED_MAX:
155  val = "max";
156  break;
158  default:
159  break;
160  }
162  } else if (oc.isSet("departspeed")) {
163  dev.writeAttr(SUMO_ATTR_DEPARTSPEED, oc.getString("departspeed"));
164  }
165 
166  // arrivallane
167  if (wasSet(VEHPARS_ARRIVALLANE_SET) && !defaultOptionOverrides(oc, "arrivallane")) {
168  std::string val;
169  switch (arrivalLaneProcedure) {
170  case ARRIVAL_LANE_GIVEN:
171  val = toString(arrivalLane);
172  break;
174  val = "current";
175  break;
177  default:
178  break;
179  }
181  } else if (oc.isSet("arrivallane")) {
182  dev.writeAttr(SUMO_ATTR_ARRIVALLANE, oc.getString("arrivallane"));
183  }
184  // arrivalpos
185  if (wasSet(VEHPARS_ARRIVALPOS_SET) && !defaultOptionOverrides(oc, "arrivalpos")) {
186  std::string val;
187  switch (arrivalPosProcedure) {
188  case ARRIVAL_POS_GIVEN:
189  val = toString(arrivalPos);
190  break;
191  case ARRIVAL_POS_RANDOM:
192  val = "random";
193  break;
194  case ARRIVAL_POS_MAX:
195  val = "max";
196  break;
197  case ARRIVAL_POS_DEFAULT:
198  default:
199  break;
200  }
202  } else if (oc.isSet("arrivalpos")) {
203  dev.writeAttr(SUMO_ATTR_ARRIVALPOS, oc.getString("arrivalpos"));
204  }
205  // arrivalspeed
206  if (wasSet(VEHPARS_ARRIVALSPEED_SET) && !defaultOptionOverrides(oc, "arrivalspeed")) {
207  std::string val;
208  switch (arrivalSpeedProcedure) {
209  case ARRIVAL_SPEED_GIVEN:
210  val = toString(arrivalSpeed);
211  break;
213  val = "current";
214  break;
216  default:
217  break;
218  }
220  } else if (oc.isSet("arrivalspeed")) {
221  dev.writeAttr(SUMO_ATTR_ARRIVALSPEED, oc.getString("arrivalspeed"));
222  }
223 
224  // color
225  if (wasSet(VEHPARS_COLOR_SET)) {
227  }
228  if (wasSet(VEHPARS_LINE_SET)) {
230  }
231  if (wasSet(VEHPARS_TAZ_SET)) {
233  }
236  }
239  }
240 }
241 
242 
243 void
245  for (std::vector<Stop>::const_iterator stop = stops.begin(); stop != stops.end(); ++stop) {
246  if (stop->busstop != "") {
247  dev.writeAttr(SUMO_ATTR_BUS_STOP, stop->busstop);
248  } else {
249  dev.openTag(SUMO_TAG_STOP).writeAttr(SUMO_ATTR_LANE, stop->lane);
250  if ((stop->setParameter & STOP_START_SET) != 0) {
251  dev.writeAttr(SUMO_ATTR_STARTPOS, stop->startPos);
252  }
253  if ((stop->setParameter & STOP_END_SET) != 0) {
254  dev.writeAttr(SUMO_ATTR_ENDPOS, stop->endPos);
255  }
256  }
257  if (stop->duration >= 0) {
258  dev.writeAttr(SUMO_ATTR_DURATION, stop->duration);
259  }
260  if (stop->until >= 0) {
261  dev.writeAttr(SUMO_ATTR_UNTIL, stop->until);
262  }
263  if ((stop->setParameter & STOP_TRIGGER_SET) != 0) {
264  dev.writeAttr(SUMO_ATTR_TRIGGERED, stop->triggered);
265  }
266  if ((stop->setParameter & STOP_PARKING_SET) != 0) {
267  dev.writeAttr(SUMO_ATTR_PARKING, stop->parking);
268  }
269  dev.closeTag();
270  }
271 }
272 
273 
274 bool
275 SUMOVehicleParameter::parseDepartLane(const std::string& val, const std::string& element, const std::string& id,
276  int& lane, DepartLaneDefinition& dld, std::string& error) {
277  bool ok = true;
278  if (val == "random") {
279  dld = DEPART_LANE_RANDOM;
280  } else if (val == "free") {
281  dld = DEPART_LANE_FREE;
282  } else if (val == "allowed") {
284  } else if (val == "best") {
285  dld = DEPART_LANE_BEST_FREE;
286  } else {
287  try {
288  lane = TplConvert::_2int(val.c_str());
289  dld = DEPART_LANE_GIVEN;
290  if (lane < 0) {
291  ok = false;
292  }
293  } catch (...) {
294  ok = false;
295  }
296  }
297  if (!ok) {
298  error = "Invalid departLane definition for " + element + " '" + id + "';\n must be one of (\"random\", \"free\", \"allowed\", \"best\", or an int>0)";
299  }
300  return ok;
301 }
302 
303 
304 bool
305 SUMOVehicleParameter::parseDepartPos(const std::string& val, const std::string& element, const std::string& id,
306  SUMOReal& pos, DepartPosDefinition& dpd, std::string& error) {
307  bool ok = true;
308  if (val == "random") {
309  dpd = DEPART_POS_RANDOM;
310  } else if (val == "random_free") {
312  } else if (val == "free") {
313  dpd = DEPART_POS_FREE;
314  } else if (val == "base") {
315  dpd = DEPART_POS_BASE;
316  } else if (val == "pwagSimple") {
318  } else if (val == "pwagGeneric") {
320  } else if (val == "maxSpeedGap") {
322  } else {
323  try {
324  pos = TplConvert::_2SUMOReal(val.c_str());
325  dpd = DEPART_POS_GIVEN;
326  } catch (...) {
327  ok = false;
328  }
329  }
330  if (!ok) {
331  error = "Invalid departPos definition for " + element + " '" + id + "';\n must be one of (\"random\", \"random_free\", \"free\", \"base\", \"pwagSimple\", \"pwagGeneric\", \"maxSpeedGap\", or a float)";
332  }
333  return ok;
334 }
335 
336 
337 bool
338 SUMOVehicleParameter::parseDepartSpeed(const std::string& val, const std::string& element, const std::string& id,
339  SUMOReal& speed, DepartSpeedDefinition& dsd, std::string& error) {
340  bool ok = true;
341  if (val == "random") {
342  dsd = DEPART_SPEED_RANDOM;
343  } else if (val == "max") {
344  dsd = DEPART_SPEED_MAX;
345  } else {
346  try {
347  speed = TplConvert::_2SUMOReal(val.c_str());
348  dsd = DEPART_SPEED_GIVEN;
349  if (speed < 0) {
350  ok = false;
351  }
352  } catch (...) {
353  ok = false;
354  }
355  }
356  if (!ok) {
357  error = "Invalid departSpeed definition for " + element + " '" + id + "';\n must be one of (\"random\", \"max\", or a float>0)";
358  }
359  return ok;
360 }
361 
362 
363 bool
364 SUMOVehicleParameter::parseArrivalLane(const std::string& val, const std::string& element, const std::string& id,
365  int& lane, ArrivalLaneDefinition& ald, std::string& error) {
366  bool ok = true;
367  if (val == "current") {
368  ald = ARRIVAL_LANE_CURRENT;
369  } else {
370  try {
371  lane = TplConvert::_2int(val.c_str());
372  ald = ARRIVAL_LANE_GIVEN;
373  if (lane < 0) {
374  ok = false;
375  }
376  } catch (...) {
377  ok = false;
378  }
379  }
380  if (!ok) {
381  error = "Invalid arrivalLane definition for " + element + " '" + id + "';\n must be one of (\"current\", or int>0)";
382  }
383  return ok;
384 }
385 
386 
387 bool
388 SUMOVehicleParameter::parseArrivalPos(const std::string& val, const std::string& element, const std::string& id,
389  SUMOReal& pos, ArrivalPosDefinition& apd, std::string& error) {
390  bool ok = true;
391  if (val == "random") {
392  apd = ARRIVAL_POS_RANDOM;
393  } else if (val == "max") {
394  apd = ARRIVAL_POS_MAX;
395  } else {
396  try {
397  pos = TplConvert::_2SUMOReal(val.c_str());
398  apd = ARRIVAL_POS_GIVEN;
399  } catch (...) {
400  ok = false;
401  }
402  }
403  if (!ok) {
404  error = "Invalid arrivalPos definition for " + element + " '" + id + "';\n must be one of (\"random\", \"max\", or a float)";
405  }
406  return ok;
407 }
408 
409 
410 bool
411 SUMOVehicleParameter::parseArrivalSpeed(const std::string& val, const std::string& element, const std::string& id,
412  SUMOReal& speed, ArrivalSpeedDefinition& asd, std::string& error) {
413  bool ok = true;
414  if (val == "current") {
415  asd = ARRIVAL_SPEED_CURRENT;
416  } else {
417  try {
418  speed = TplConvert::_2SUMOReal(val.c_str());
419  asd = ARRIVAL_SPEED_GIVEN;
420  } catch (...) {
421  ok = false;
422  }
423  }
424  if (!ok) {
425  error = "Invalid arrivalSpeed definition for " + element + " '" + id + "';\n must be one of (\"current\", or a float>0)";
426  }
427  return ok;
428 }
429 
430 
431 SUMOReal
432 SUMOVehicleParameter::interpretEdgePos(SUMOReal pos, SUMOReal maximumValue, SumoXMLAttr attr, const std::string& id) {
433  if (pos < 0) {
434  pos = maximumValue + pos;
435  }
436  if (pos > maximumValue) {
437  WRITE_WARNING("Invalid " + toString(attr) + " " + toString(pos) + " given for " + id + ". Inserting at edge end instead.");
438  pos = maximumValue;
439  }
440  return pos;
441 }
442 
443 
444 /****************************************************************************/