SUMO - Simulation of Urban MObility

TraCIServerAPI_VehicleType.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // APIs for getting/setting vehicle type values via TraCI
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors
00011 /****************************************************************************/
00012 //
00013 //   This program is free software; you can redistribute it and/or modify
00014 //   it under the terms of the GNU General Public License as published by
00015 //   the Free Software Foundation; either version 2 of the License, or
00016 //   (at your option) any later version.
00017 //
00018 /****************************************************************************/
00019 
00020 
00021 // ===========================================================================
00022 // included modules
00023 // ===========================================================================
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029 
00030 #include <limits>
00031 #include <microsim/MSNet.h>
00032 #include <microsim/MSVehicleType.h>
00033 #include "TraCIConstants.h"
00034 #include "TraCIServerAPI_VehicleType.h"
00035 
00036 #ifdef CHECK_MEMORY_LEAKS
00037 #include <foreign/nvwa/debug_new.h>
00038 #endif // CHECK_MEMORY_LEAKS
00039 
00040 
00041 // ===========================================================================
00042 // used namespaces
00043 // ===========================================================================
00044 using namespace traci;
00045 
00046 
00047 // ===========================================================================
00048 // method definitions
00049 // ===========================================================================
00050 bool
00051 TraCIServerAPI_VehicleType::processGet(TraCIServer& server, tcpip::Storage& inputStorage,
00052                                        tcpip::Storage& outputStorage) {
00053     std::string warning = ""; // additional description for response
00054     // variable & id
00055     int variable = inputStorage.readUnsignedByte();
00056     std::string id = inputStorage.readString();
00057     // check variable
00058     if (variable!=ID_LIST&&variable!=VAR_LENGTH&&variable!=VAR_MAXSPEED&&variable!=VAR_ACCEL&&variable!=VAR_DECEL
00059             &&variable!=VAR_TAU&&variable!=VAR_VEHICLECLASS&&variable!=VAR_EMISSIONCLASS&&variable!=VAR_SHAPECLASS
00060             &&variable!=VAR_SPEED_FACTOR&&variable!=VAR_SPEED_DEVIATION&&variable!=VAR_IMPERFECTION
00061             &&variable!=VAR_MINGAP&&variable!=VAR_WIDTH&&variable!=VAR_COLOR&&variable!=ID_COUNT) {
00062         server.writeStatusCmd(CMD_GET_VEHICLETYPE_VARIABLE, RTYPE_ERR, "Get Vehicle Type Variable: unsupported variable specified", outputStorage);
00063         return false;
00064     }
00065     // begin response building
00066     tcpip::Storage tempMsg;
00067     //  response-code, variableID, objectID
00068     tempMsg.writeUnsignedByte(RESPONSE_GET_VEHICLETYPE_VARIABLE);
00069     tempMsg.writeUnsignedByte(variable);
00070     tempMsg.writeString(id);
00071     // process request
00072     if (variable==ID_LIST) {
00073         std::vector<std::string> ids;
00074         MSNet::getInstance()->getVehicleControl().insertVTypeIDs(ids);
00075         tempMsg.writeUnsignedByte(TYPE_STRINGLIST);
00076         tempMsg.writeStringList(ids);
00077     } else if (variable==ID_COUNT) {
00078         std::vector<std::string> ids;
00079         MSNet::getInstance()->getVehicleControl().insertVTypeIDs(ids);
00080         tempMsg.writeUnsignedByte(TYPE_INTEGER);
00081         tempMsg.writeInt((int) ids.size());
00082     } else {
00083         MSVehicleType* v = MSNet::getInstance()->getVehicleControl().getVType(id);
00084         if (v==0) {
00085             server.writeStatusCmd(CMD_GET_VEHICLETYPE_VARIABLE, RTYPE_ERR, "Vehicle type '" + id + "' is not known", outputStorage);
00086             return false;
00087         }
00088         getVariable(variable, *v, tempMsg);
00089     }
00090     server.writeStatusCmd(CMD_GET_VEHICLETYPE_VARIABLE, RTYPE_OK, warning, outputStorage);
00091     server.writeResponseWithLength(outputStorage, tempMsg);
00092     return true;
00093 }
00094 
00095 bool
00096 TraCIServerAPI_VehicleType::getVariable(const int variable, const MSVehicleType& v, tcpip::Storage& tempMsg) {
00097     switch (variable) {
00098     case VAR_LENGTH:
00099         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00100         tempMsg.writeDouble(v.getLength());
00101         break;
00102     case VAR_MINGAP:
00103         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00104         tempMsg.writeDouble(v.getMinGap());
00105         break;
00106     case VAR_MAXSPEED:
00107         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00108         tempMsg.writeDouble(v.getMaxSpeed());
00109         break;
00110     case VAR_ACCEL:
00111         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00112         tempMsg.writeDouble(v.getCarFollowModel().getMaxAccel());
00113         break;
00114     case VAR_DECEL:
00115         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00116         tempMsg.writeDouble(v.getCarFollowModel().getMaxDecel());
00117         break;
00118     case VAR_IMPERFECTION:
00119         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00120         tempMsg.writeDouble(v.getCarFollowModel().getImperfection());
00121         break;
00122     case VAR_TAU:
00123         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00124         tempMsg.writeDouble(v.getCarFollowModel().getHeadwayTime());
00125         break;
00126     case VAR_SPEED_FACTOR:
00127         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00128         tempMsg.writeDouble(v.getSpeedFactor());
00129         break;
00130     case VAR_SPEED_DEVIATION:
00131         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00132         tempMsg.writeDouble(v.getSpeedDeviation());
00133         break;
00134     case VAR_VEHICLECLASS:
00135         tempMsg.writeUnsignedByte(TYPE_STRING);
00136         tempMsg.writeString(toString(v.getVehicleClass()));
00137         break;
00138     case VAR_EMISSIONCLASS:
00139         tempMsg.writeUnsignedByte(TYPE_STRING);
00140         tempMsg.writeString(getVehicleEmissionTypeName(v.getEmissionClass()));
00141         break;
00142     case VAR_SHAPECLASS:
00143         tempMsg.writeUnsignedByte(TYPE_STRING);
00144         tempMsg.writeString(getVehicleShapeName(v.getGuiShape()));
00145         break;
00146     case VAR_WIDTH:
00147         tempMsg.writeUnsignedByte(TYPE_DOUBLE);
00148         tempMsg.writeDouble(v.getGuiWidth());
00149         break;
00150     case VAR_COLOR:
00151         tempMsg.writeUnsignedByte(TYPE_COLOR);
00152         tempMsg.writeUnsignedByte(static_cast<int>(v.getColor().red()*255.+0.5));
00153         tempMsg.writeUnsignedByte(static_cast<int>(v.getColor().green()*255.+0.5));
00154         tempMsg.writeUnsignedByte(static_cast<int>(v.getColor().blue()*255.+0.5));
00155         tempMsg.writeUnsignedByte(255);
00156         break;
00157     default:
00158         break;
00159     }
00160     return true;
00161 }
00162 
00163 bool
00164 TraCIServerAPI_VehicleType::processSet(TraCIServer& server, tcpip::Storage& inputStorage,
00165                                        tcpip::Storage& outputStorage) {
00166     std::string warning = ""; // additional description for response
00167     // variable
00168     int variable = inputStorage.readUnsignedByte();
00169     if (variable!=VAR_LENGTH&&variable!=VAR_MAXSPEED&&variable!=VAR_VEHICLECLASS
00170             &&variable!=VAR_SPEED_FACTOR&&variable!=VAR_SPEED_DEVIATION&&variable!=VAR_EMISSIONCLASS
00171             &&variable!=VAR_WIDTH&&variable!=VAR_MINGAP&&variable!=VAR_SHAPECLASS
00172             &&variable!=VAR_ACCEL&&variable!=VAR_DECEL&&variable!=VAR_IMPERFECTION
00173             &&variable!=VAR_TAU&&variable!=VAR_COLOR
00174        ) {
00175         server.writeStatusCmd(CMD_SET_VEHICLETYPE_VARIABLE, RTYPE_ERR, "Change Vehicle Type State: unsupported variable specified", outputStorage);
00176         return false;
00177     }
00178     // id
00179     std::string id = inputStorage.readString();
00180     MSVehicleType* v = MSNet::getInstance()->getVehicleControl().getVType(id);
00181     if (v==0) {
00182         server.writeStatusCmd(CMD_SET_VEHICLETYPE_VARIABLE, RTYPE_ERR, "Vehicle type '" + id + "' is not known", outputStorage);
00183         return false;
00184     }
00185     // process
00186     try {
00187         if (setVariable(CMD_SET_VEHICLETYPE_VARIABLE, variable, inputStorage.readUnsignedByte(),
00188                         *v, server, inputStorage, outputStorage)) {
00189             server.writeStatusCmd(CMD_SET_VEHICLETYPE_VARIABLE, RTYPE_OK, warning, outputStorage);
00190             return true;
00191         }
00192     } catch (ProcessError& e) {
00193         server.writeStatusCmd(CMD_SET_VEHICLETYPE_VARIABLE, RTYPE_ERR, e.what(), outputStorage);
00194     }
00195     return false;
00196 }
00197 
00198 
00199 bool
00200 TraCIServerAPI_VehicleType::setVariable(const int cmd, const int variable, const int valueDataType,
00201                                         MSVehicleType& v, traci::TraCIServer& server,
00202                                         tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) {
00203     switch (variable) {
00204     case VAR_LENGTH: {
00205         if (valueDataType!=TYPE_DOUBLE) {
00206             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting length requires a double.", outputStorage);
00207             return false;
00208         }
00209         double val = inputStorage.readDouble();
00210         if (val == 0.0 || fabs(val) == std::numeric_limits<double>::infinity()) {
00211             server.writeStatusCmd(cmd, RTYPE_ERR, "Invalid length.", outputStorage);
00212             return false;
00213         }
00214         v.setLength(val);
00215     }
00216     break;
00217     case VAR_MAXSPEED: {
00218         if (valueDataType!=TYPE_DOUBLE) {
00219             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting maximum speed requires a double.", outputStorage);
00220             return false;
00221         }
00222         double val = inputStorage.readDouble();
00223         if (val == 0.0 || fabs(val) == std::numeric_limits<double>::infinity()) {
00224             server.writeStatusCmd(cmd, RTYPE_ERR, "Invalid maximum speed.", outputStorage);
00225             return false;
00226         }
00227         v.setMaxSpeed(val);
00228     }
00229     break;
00230     case VAR_VEHICLECLASS: {
00231         if (valueDataType!=TYPE_STRING) {
00232             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting vehicle class requires a string.", outputStorage);
00233             return false;
00234         }
00235         v.setVClass(getVehicleClassID(inputStorage.readString()));
00236     }
00237     break;
00238     case VAR_SPEED_FACTOR: {
00239         if (valueDataType!=TYPE_DOUBLE) {
00240             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting speed factor requires a double.", outputStorage);
00241             return false;
00242         }
00243         v.setSpeedFactor(inputStorage.readDouble());
00244     }
00245     break;
00246     case VAR_SPEED_DEVIATION: {
00247         if (valueDataType!=TYPE_DOUBLE) {
00248             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting speed deviation requires a double.", outputStorage);
00249             return false;
00250         }
00251         v.setSpeedDeviation(inputStorage.readDouble());
00252     }
00253     break;
00254     case VAR_EMISSIONCLASS: {
00255         if (valueDataType!=TYPE_STRING) {
00256             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting emission class requires a string.", outputStorage);
00257             return false;
00258         }
00259         v.setEmissionClass(getVehicleEmissionTypeID(inputStorage.readString()));
00260     }
00261     break;
00262     case VAR_WIDTH: {
00263         if (valueDataType!=TYPE_DOUBLE) {
00264             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting width requires a double.", outputStorage);
00265             return false;
00266         }
00267         v.setWidth(inputStorage.readDouble());
00268     }
00269     break;
00270     case VAR_MINGAP: {
00271         if (valueDataType!=TYPE_DOUBLE) {
00272             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting minimum gap requires a double.", outputStorage);
00273             return false;
00274         }
00275         v.setMinGap(inputStorage.readDouble());
00276     }
00277     break;
00278     case VAR_SHAPECLASS: {
00279         if (valueDataType!=TYPE_STRING) {
00280             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting vehicle shape requires a string.", outputStorage);
00281             return false;
00282         }
00283         v.setShape(getVehicleShapeID(inputStorage.readString()));
00284     }
00285     break;
00286     case VAR_ACCEL: {
00287         if (valueDataType!=TYPE_DOUBLE) {
00288             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting acceleration requires a double.", outputStorage);
00289             return false;
00290         }
00291         v.getCarFollowModel().setMaxAccel(inputStorage.readDouble());
00292     }
00293     break;
00294     case VAR_DECEL: {
00295         if (valueDataType!=TYPE_DOUBLE) {
00296             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting deceleration requires a double.", outputStorage);
00297             return false;
00298         }
00299         v.getCarFollowModel().setMaxDecel(inputStorage.readDouble());
00300     }
00301     break;
00302     case VAR_IMPERFECTION: {
00303         if (valueDataType!=TYPE_DOUBLE) {
00304             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting driver imperfection requires a double.", outputStorage);
00305             return false;
00306         }
00307         v.getCarFollowModel().setImperfection(inputStorage.readDouble());
00308     }
00309     break;
00310     case VAR_TAU: {
00311         if (valueDataType!=TYPE_DOUBLE) {
00312             server.writeStatusCmd(cmd, RTYPE_ERR, "Setting headway time requires a double.", outputStorage);
00313             return false;
00314         }
00315         v.getCarFollowModel().setHeadwayTime(inputStorage.readDouble());
00316     }
00317     break;
00318     case VAR_COLOR: {
00319         if (valueDataType!=TYPE_COLOR) {
00320             server.writeStatusCmd(cmd, RTYPE_ERR, "The color must be given using the according type.", outputStorage);
00321             return false;
00322         }
00323         SUMOReal r = (SUMOReal) inputStorage.readUnsignedByte() / 255.;
00324         SUMOReal g = (SUMOReal) inputStorage.readUnsignedByte() / 255.;
00325         SUMOReal b = (SUMOReal) inputStorage.readUnsignedByte() / 255.;
00326         inputStorage.readUnsignedByte(); // skip alpha level
00327         RGBColor col(r, g, b);
00328         v.setColor(col);
00329     }
00330     break;
00331     default:
00332         break;
00333     }
00334     return true;
00335 }
00336 
00337 /****************************************************************************/
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines