SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00009 // Structure representing possible vehicle parameter 00010 /****************************************************************************/ 00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors 00013 /****************************************************************************/ 00014 // 00015 // This file is part of SUMO. 00016 // SUMO is free software: you can redistribute it and/or modify 00017 // it under the terms of the GNU General Public License as published by 00018 // the Free Software Foundation, either version 3 of the License, or 00019 // (at your option) any later version. 00020 // 00021 /****************************************************************************/ 00022 00023 00024 // =========================================================================== 00025 // included modules 00026 // =========================================================================== 00027 #ifdef _MSC_VER 00028 #include <windows_config.h> 00029 #else 00030 #include <config.h> 00031 #endif 00032 00033 #include "SUMOVehicleParameter.h" 00034 #include <utils/common/ToString.h> 00035 #include <utils/common/TplConvert.h> 00036 #include <utils/common/MsgHandler.h> 00037 #include <utils/iodevices/OutputDevice.h> 00038 #include <utils/options/OptionsCont.h> 00039 00040 #ifdef CHECK_MEMORY_LEAKS 00041 #include <foreign/nvwa/debug_new.h> 00042 #endif // CHECK_MEMORY_LEAKS 00043 00044 00045 // =========================================================================== 00046 // member method definitions 00047 // =========================================================================== 00048 SUMOVehicleParameter::SUMOVehicleParameter() 00049 : vtypeid(DEFAULT_VTYPE_ID), color(RGBColor::DEFAULT_COLOR), 00050 depart(-1), departProcedure(DEPART_GIVEN), 00051 departLane(0), departLaneProcedure(DEPART_LANE_DEFAULT), 00052 departPos(0), departPosProcedure(DEPART_POS_DEFAULT), 00053 departSpeed(-1), departSpeedProcedure(DEPART_SPEED_DEFAULT), 00054 arrivalLane(0), arrivalLaneProcedure(ARRIVAL_LANE_DEFAULT), 00055 arrivalPos(0), arrivalPosProcedure(ARRIVAL_POS_DEFAULT), 00056 arrivalSpeed(-1), arrivalSpeedProcedure(ARRIVAL_SPEED_DEFAULT), 00057 repetitionNumber(-1), repetitionsDone(-1), repetitionOffset(-1), 00058 line(), fromTaz(), toTaz(), setParameter(0) { 00059 } 00060 00061 00062 bool 00063 SUMOVehicleParameter::defaultOptionOverrides(const OptionsCont& oc, const std::string& optionName) const { 00064 return oc.isSet(optionName) && oc.getBool("defaults-override"); 00065 } 00066 00067 00068 void 00069 SUMOVehicleParameter::writeAs(const std::string& xmlElem, OutputDevice& dev, 00070 const OptionsCont& oc) const { 00071 dev.openTag(xmlElem).writeAttr(SUMO_ATTR_ID, id); 00072 if (wasSet(VEHPARS_VTYPE_SET)) { 00073 dev.writeAttr(SUMO_ATTR_TYPE, vtypeid); 00074 } 00075 dev.writeAttr(SUMO_ATTR_DEPART, time2string(depart)); 00076 00077 // optional parameter 00078 // departlane 00079 if (wasSet(VEHPARS_DEPARTLANE_SET) && !defaultOptionOverrides(oc, "departlane")) { 00080 std::string val; 00081 switch (departLaneProcedure) { 00082 case DEPART_LANE_GIVEN: 00083 val = toString(departLane); 00084 break; 00085 case DEPART_LANE_RANDOM: 00086 val = "random"; 00087 break; 00088 case DEPART_LANE_FREE: 00089 val = "free"; 00090 break; 00091 case DEPART_LANE_ALLOWED_FREE: 00092 val = "allowed"; 00093 break; 00094 case DEPART_LANE_BEST_FREE: 00095 val = "best"; 00096 break; 00097 case DEPART_LANE_DEFAULT: 00098 default: 00099 break; 00100 } 00101 dev.writeAttr(SUMO_ATTR_DEPARTLANE, val); 00102 } else if (oc.isSet("departlane")) { 00103 dev.writeAttr(SUMO_ATTR_DEPARTLANE, oc.getString("departlane")); 00104 } 00105 // departpos 00106 if (wasSet(VEHPARS_DEPARTPOS_SET) && !defaultOptionOverrides(oc, "departpos")) { 00107 std::string val; 00108 switch (departPosProcedure) { 00109 case DEPART_POS_GIVEN: 00110 val = toString(departPos); 00111 break; 00112 case DEPART_POS_RANDOM: 00113 val = "random"; 00114 break; 00115 case DEPART_POS_RANDOM_FREE: 00116 val = "random_free"; 00117 break; 00118 case DEPART_POS_FREE: 00119 val = "free"; 00120 break; 00121 case DEPART_POS_PWAG_SIMPLE: 00122 val = "pwagSimple"; 00123 break; 00124 case DEPART_POS_PWAG_GENERIC: 00125 val = "pwagGeneric"; 00126 break; 00127 case DEPART_POS_MAX_SPEED_GAP: 00128 val = "maxSpeedGap"; 00129 break; 00130 case DEPART_POS_BASE: 00131 val = "base"; 00132 break; 00133 case DEPART_POS_DEFAULT: 00134 default: 00135 break; 00136 } 00137 dev.writeAttr(SUMO_ATTR_DEPARTPOS, val); 00138 } else if (oc.isSet("departpos")) { 00139 dev.writeAttr(SUMO_ATTR_DEPARTPOS, oc.getString("departpos")); 00140 } 00141 // departspeed 00142 if (wasSet(VEHPARS_DEPARTSPEED_SET) && !defaultOptionOverrides(oc, "departspeed")) { 00143 std::string val; 00144 switch (departSpeedProcedure) { 00145 case DEPART_SPEED_GIVEN: 00146 val = toString(departSpeed); 00147 break; 00148 case DEPART_SPEED_RANDOM: 00149 val = "random"; 00150 break; 00151 case DEPART_SPEED_MAX: 00152 val = "max"; 00153 break; 00154 case DEPART_SPEED_DEFAULT: 00155 default: 00156 break; 00157 } 00158 dev.writeAttr(SUMO_ATTR_DEPARTSPEED, val); 00159 } else if (oc.isSet("departspeed")) { 00160 dev.writeAttr(SUMO_ATTR_DEPARTSPEED, oc.getString("departspeed")); 00161 } 00162 00163 // arrivallane 00164 if (wasSet(VEHPARS_ARRIVALLANE_SET) && !defaultOptionOverrides(oc, "arrivallane")) { 00165 std::string val; 00166 switch (arrivalLaneProcedure) { 00167 case ARRIVAL_LANE_GIVEN: 00168 val = toString(arrivalLane); 00169 break; 00170 case ARRIVAL_LANE_CURRENT: 00171 val = "current"; 00172 break; 00173 case ARRIVAL_LANE_DEFAULT: 00174 default: 00175 break; 00176 } 00177 dev.writeAttr(SUMO_ATTR_ARRIVALLANE, val); 00178 } else if (oc.isSet("arrivallane")) { 00179 dev.writeAttr(SUMO_ATTR_ARRIVALLANE, oc.getString("arrivallane")); 00180 } 00181 // arrivalpos 00182 if (wasSet(VEHPARS_ARRIVALPOS_SET) && !defaultOptionOverrides(oc, "arrivalpos")) { 00183 std::string val; 00184 switch (arrivalPosProcedure) { 00185 case ARRIVAL_POS_GIVEN: 00186 val = toString(arrivalPos); 00187 break; 00188 case ARRIVAL_POS_RANDOM: 00189 val = "random"; 00190 break; 00191 case ARRIVAL_POS_MAX: 00192 val = "max"; 00193 break; 00194 case ARRIVAL_POS_DEFAULT: 00195 default: 00196 break; 00197 } 00198 dev.writeAttr(SUMO_ATTR_ARRIVALPOS, val); 00199 } else if (oc.isSet("arrivalpos")) { 00200 dev.writeAttr(SUMO_ATTR_ARRIVALPOS, oc.getString("arrivalpos")); 00201 } 00202 // arrivalspeed 00203 if (wasSet(VEHPARS_ARRIVALSPEED_SET) && !defaultOptionOverrides(oc, "arrivalspeed")) { 00204 std::string val; 00205 switch (arrivalSpeedProcedure) { 00206 case ARRIVAL_SPEED_GIVEN: 00207 val = toString(arrivalSpeed); 00208 break; 00209 case ARRIVAL_SPEED_CURRENT: 00210 val = "current"; 00211 break; 00212 case ARRIVAL_SPEED_DEFAULT: 00213 default: 00214 break; 00215 } 00216 dev.writeAttr(SUMO_ATTR_ARRIVALSPEED, val); 00217 } else if (oc.isSet("arrivalspeed")) { 00218 dev.writeAttr(SUMO_ATTR_ARRIVALSPEED, oc.getString("arrivalspeed")); 00219 } 00220 00221 // color 00222 if (wasSet(VEHPARS_COLOR_SET)) { 00223 dev.writeAttr(SUMO_ATTR_COLOR, color); 00224 } 00225 // repetition values 00226 if (wasSet(VEHPARS_PERIODNUM_SET)) { 00227 dev.writeAttr(SUMO_ATTR_REPNUMBER, repetitionNumber); 00228 } 00229 if (wasSet(VEHPARS_PERIODFREQ_SET)) { 00230 #ifdef HAVE_SUBSECOND_TIMESTEPS 00231 dev.writeAttr(SUMO_ATTR_PERIOD, time2string(repetitionOffset)); 00232 #else 00233 dev.writeAttr(SUMO_ATTR_PERIOD, repetitionOffset); 00234 #endif 00235 } 00236 if (wasSet(VEHPARS_LINE_SET)) { 00237 dev.writeAttr(SUMO_ATTR_LINE, line); 00238 } 00239 if (wasSet(VEHPARS_TAZ_SET)) { 00240 dev.writeAttr(SUMO_ATTR_FROM_TAZ, fromTaz).writeAttr(SUMO_ATTR_TO_TAZ, toTaz); 00241 } 00242 dev.closeOpener(); 00243 } 00244 00245 00246 bool 00247 SUMOVehicleParameter::departlaneValidate(const std::string& val) { 00248 if (val == "random" || val == "free" || val == "departlane" || val == "allowed" || val == "best") { 00249 return true; 00250 } 00251 try { 00252 TplConvert<char>::_2int(val.c_str()); 00253 return true; 00254 } catch (NumberFormatException&) { 00255 } catch (EmptyData&) { 00256 } 00257 WRITE_ERROR("Invalid departlane definition;\n must be one of (\"departlane\", \"random\", \"free\", \"allowed\", \"best\", or an int>0)"); 00258 return false; 00259 } 00260 00261 00262 bool 00263 SUMOVehicleParameter::departposValidate(const std::string& val) { 00264 if (val == "random" || val == "free" || val == "random_free" || val == "base" || val == "pwagSimple" || val == "pwagGeneric" || val == "maxSpeedGap") { 00265 return true; 00266 } 00267 try { 00268 TplConvert<char>::_2SUMOReal(val.c_str()); 00269 return true; 00270 } catch (NumberFormatException&) { 00271 } catch (EmptyData&) { 00272 } 00273 WRITE_ERROR("Invalid departpos definition;\n must be one of (\"random\", \"random_free\", \"free\", \"base\", \"pwagSimple\", \"pwagGeneric\", \"maxSpeedGap\", or a float)"); 00274 return false; 00275 } 00276 00277 00278 bool 00279 SUMOVehicleParameter::departspeedValidate(const std::string& val) { 00280 if (val == "random" || val == "max") { 00281 return true; 00282 } 00283 try { 00284 TplConvert<char>::_2SUMOReal(val.c_str()); 00285 return true; 00286 } catch (NumberFormatException&) { 00287 } catch (EmptyData&) { 00288 } 00289 WRITE_ERROR("Invalid departspeed definition;\n must be one of (\"random\", \"max\", or a float>0)"); 00290 return false; 00291 } 00292 00293 00294 bool 00295 SUMOVehicleParameter::arrivallaneValidate(const std::string& val) { 00296 if (val == "current") { 00297 return true; 00298 } 00299 try { 00300 TplConvert<char>::_2int(val.c_str()); 00301 return true; 00302 } catch (NumberFormatException&) { 00303 } catch (EmptyData&) { 00304 } 00305 WRITE_ERROR("Invalid arrivallane definition;\n must be one of (\"current\", or int>0)"); 00306 return false; 00307 } 00308 00309 00310 bool 00311 SUMOVehicleParameter::arrivalposValidate(const std::string& val) { 00312 if (val == "random" || val == "max") { 00313 return true; 00314 } 00315 try { 00316 TplConvert<char>::_2SUMOReal(val.c_str()); 00317 return true; 00318 } catch (NumberFormatException&) { 00319 } catch (EmptyData&) { 00320 } 00321 WRITE_ERROR("Invalid arrivalpos definition;\n must be one of (\"random\", \"max\", or a float)"); 00322 return false; 00323 } 00324 00325 00326 bool 00327 SUMOVehicleParameter::arrivalspeedValidate(const std::string& val) { 00328 if (val == "current") { 00329 return true; 00330 } 00331 try { 00332 TplConvert<char>::_2SUMOReal(val.c_str()); 00333 return true; 00334 } catch (NumberFormatException&) { 00335 } catch (EmptyData&) { 00336 } 00337 WRITE_ERROR("Invalid arrivalspeed definition;\n must be one of (\"current\", or a float>0)"); 00338 return false; 00339 } 00340 00341 00342 /****************************************************************************/ 00343