SUMO - Simulation of Urban MObility
SUMOVehicleParameter.cpp
Go to the documentation of this file.
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 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines