|
SUMO - Simulation of Urban MObility
|
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 /****************************************************************************/