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-2012 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(), 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
69 SUMOVehicleParameter::writeAs(const std::string& xmlElem, OutputDevice& dev,
70  const OptionsCont& oc) const {
71  dev.openTag(xmlElem).writeAttr(SUMO_ATTR_ID, id);
74  }
76 
77  // optional parameter
78  // departlane
79  if (wasSet(VEHPARS_DEPARTLANE_SET) && !defaultOptionOverrides(oc, "departlane")) {
80  std::string val;
81  switch (departLaneProcedure) {
82  case DEPART_LANE_GIVEN:
83  val = toString(departLane);
84  break;
85  case DEPART_LANE_RANDOM:
86  val = "random";
87  break;
88  case DEPART_LANE_FREE:
89  val = "free";
90  break;
92  val = "allowed";
93  break;
95  val = "best";
96  break;
98  default:
99  break;
100  }
102  } else if (oc.isSet("departlane")) {
103  dev.writeAttr(SUMO_ATTR_DEPARTLANE, oc.getString("departlane"));
104  }
105  // departpos
106  if (wasSet(VEHPARS_DEPARTPOS_SET) && !defaultOptionOverrides(oc, "departpos")) {
107  std::string val;
108  switch (departPosProcedure) {
109  case DEPART_POS_GIVEN:
110  val = toString(departPos);
111  break;
112  case DEPART_POS_RANDOM:
113  val = "random";
114  break;
116  val = "random_free";
117  break;
118  case DEPART_POS_FREE:
119  val = "free";
120  break;
122  val = "pwagSimple";
123  break;
125  val = "pwagGeneric";
126  break;
128  val = "maxSpeedGap";
129  break;
130  case DEPART_POS_BASE:
131  val = "base";
132  break;
133  case DEPART_POS_DEFAULT:
134  default:
135  break;
136  }
137  dev.writeAttr(SUMO_ATTR_DEPARTPOS, val);
138  } else if (oc.isSet("departpos")) {
139  dev.writeAttr(SUMO_ATTR_DEPARTPOS, oc.getString("departpos"));
140  }
141  // departspeed
142  if (wasSet(VEHPARS_DEPARTSPEED_SET) && !defaultOptionOverrides(oc, "departspeed")) {
143  std::string val;
144  switch (departSpeedProcedure) {
145  case DEPART_SPEED_GIVEN:
146  val = toString(departSpeed);
147  break;
148  case DEPART_SPEED_RANDOM:
149  val = "random";
150  break;
151  case DEPART_SPEED_MAX:
152  val = "max";
153  break;
155  default:
156  break;
157  }
159  } else if (oc.isSet("departspeed")) {
160  dev.writeAttr(SUMO_ATTR_DEPARTSPEED, oc.getString("departspeed"));
161  }
162 
163  // arrivallane
164  if (wasSet(VEHPARS_ARRIVALLANE_SET) && !defaultOptionOverrides(oc, "arrivallane")) {
165  std::string val;
166  switch (arrivalLaneProcedure) {
167  case ARRIVAL_LANE_GIVEN:
168  val = toString(arrivalLane);
169  break;
171  val = "current";
172  break;
174  default:
175  break;
176  }
178  } else if (oc.isSet("arrivallane")) {
179  dev.writeAttr(SUMO_ATTR_ARRIVALLANE, oc.getString("arrivallane"));
180  }
181  // arrivalpos
182  if (wasSet(VEHPARS_ARRIVALPOS_SET) && !defaultOptionOverrides(oc, "arrivalpos")) {
183  std::string val;
184  switch (arrivalPosProcedure) {
185  case ARRIVAL_POS_GIVEN:
186  val = toString(arrivalPos);
187  break;
188  case ARRIVAL_POS_RANDOM:
189  val = "random";
190  break;
191  case ARRIVAL_POS_MAX:
192  val = "max";
193  break;
194  case ARRIVAL_POS_DEFAULT:
195  default:
196  break;
197  }
199  } else if (oc.isSet("arrivalpos")) {
200  dev.writeAttr(SUMO_ATTR_ARRIVALPOS, oc.getString("arrivalpos"));
201  }
202  // arrivalspeed
203  if (wasSet(VEHPARS_ARRIVALSPEED_SET) && !defaultOptionOverrides(oc, "arrivalspeed")) {
204  std::string val;
205  switch (arrivalSpeedProcedure) {
206  case ARRIVAL_SPEED_GIVEN:
207  val = toString(arrivalSpeed);
208  break;
210  val = "current";
211  break;
213  default:
214  break;
215  }
217  } else if (oc.isSet("arrivalspeed")) {
218  dev.writeAttr(SUMO_ATTR_ARRIVALSPEED, oc.getString("arrivalspeed"));
219  }
220 
221  // color
222  if (wasSet(VEHPARS_COLOR_SET)) {
224  }
225  // repetition values
228  }
230 #ifdef HAVE_SUBSECOND_TIMESTEPS
232 #else
234 #endif
235  }
236  if (wasSet(VEHPARS_LINE_SET)) {
238  }
239  if (wasSet(VEHPARS_TAZ_SET)) {
241  }
242  dev.closeOpener();
243 }
244 
245 
246 bool
248  if (val == "random" || val == "free" || val == "departlane" || val == "allowed" || val == "best") {
249  return true;
250  }
251  try {
252  TplConvert<char>::_2int(val.c_str());
253  return true;
254  } catch (NumberFormatException&) {
255  } catch (EmptyData&) {
256  }
257  WRITE_ERROR("Invalid departlane definition;\n must be one of (\"departlane\", \"random\", \"free\", \"allowed\", \"best\", or an int>0)");
258  return false;
259 }
260 
261 
262 bool
264  if (val == "random" || val == "free" || val == "random_free" || val == "base" || val == "pwagSimple" || val == "pwagGeneric" || val == "maxSpeedGap") {
265  return true;
266  }
267  try {
268  TplConvert<char>::_2SUMOReal(val.c_str());
269  return true;
270  } catch (NumberFormatException&) {
271  } catch (EmptyData&) {
272  }
273  WRITE_ERROR("Invalid departpos definition;\n must be one of (\"random\", \"random_free\", \"free\", \"base\", \"pwagSimple\", \"pwagGeneric\", \"maxSpeedGap\", or a float)");
274  return false;
275 }
276 
277 
278 bool
280  if (val == "random" || val == "max") {
281  return true;
282  }
283  try {
284  TplConvert<char>::_2SUMOReal(val.c_str());
285  return true;
286  } catch (NumberFormatException&) {
287  } catch (EmptyData&) {
288  }
289  WRITE_ERROR("Invalid departspeed definition;\n must be one of (\"random\", \"max\", or a float>0)");
290  return false;
291 }
292 
293 
294 bool
296  if (val == "current") {
297  return true;
298  }
299  try {
300  TplConvert<char>::_2int(val.c_str());
301  return true;
302  } catch (NumberFormatException&) {
303  } catch (EmptyData&) {
304  }
305  WRITE_ERROR("Invalid arrivallane definition;\n must be one of (\"current\", or int>0)");
306  return false;
307 }
308 
309 
310 bool
312  if (val == "random" || val == "max") {
313  return true;
314  }
315  try {
316  TplConvert<char>::_2SUMOReal(val.c_str());
317  return true;
318  } catch (NumberFormatException&) {
319  } catch (EmptyData&) {
320  }
321  WRITE_ERROR("Invalid arrivalpos definition;\n must be one of (\"random\", \"max\", or a float)");
322  return false;
323 }
324 
325 
326 bool
328  if (val == "current") {
329  return true;
330  }
331  try {
332  TplConvert<char>::_2SUMOReal(val.c_str());
333  return true;
334  } catch (NumberFormatException&) {
335  } catch (EmptyData&) {
336  }
337  WRITE_ERROR("Invalid arrivalspeed definition;\n must be one of (\"current\", or a float>0)");
338  return false;
339 }
340 
341 
342 /****************************************************************************/
343