|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // APIs for getting/setting POI 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 <microsim/MSNet.h> 00031 #include <utils/shapes/PointOfInterest.h> 00032 #include <utils/shapes/ShapeContainer.h> 00033 #include "TraCIConstants.h" 00034 #include "TraCIServerAPI_POI.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_POI::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_TYPE&&variable!=VAR_COLOR&&variable!=VAR_POSITION&&variable!=ID_COUNT) { 00059 server.writeStatusCmd(CMD_GET_POI_VARIABLE, RTYPE_ERR, "Get PoI Variable: unsupported variable specified", outputStorage); 00060 return false; 00061 } 00062 // begin response building 00063 tcpip::Storage tempMsg; 00064 // response-code, variableID, objectID 00065 tempMsg.writeUnsignedByte(RESPONSE_GET_POI_VARIABLE); 00066 tempMsg.writeUnsignedByte(variable); 00067 tempMsg.writeString(id); 00068 // process request 00069 if (variable==ID_LIST||variable==ID_COUNT) { 00070 std::vector<std::string> ids; 00071 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 00072 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); ++i) { 00073 shapeCont.getPOICont(i).insertIDs(ids); 00074 } 00075 if (variable==ID_LIST) { 00076 tempMsg.writeUnsignedByte(TYPE_STRINGLIST); 00077 tempMsg.writeStringList(ids); 00078 } else { 00079 tempMsg.writeUnsignedByte(TYPE_INTEGER); 00080 tempMsg.writeInt((int) ids.size()); 00081 } 00082 } else { 00083 PointOfInterest* p = 0; 00084 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 00085 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer()&&p==0; ++i) { 00086 p = shapeCont.getPOICont(i).get(id); 00087 } 00088 if (p==0) { 00089 server.writeStatusCmd(CMD_GET_POI_VARIABLE, RTYPE_ERR, "POI '" + id + "' is not known", outputStorage); 00090 return false; 00091 } 00092 switch (variable) { 00093 case VAR_TYPE: 00094 tempMsg.writeUnsignedByte(TYPE_STRING); 00095 tempMsg.writeString(p->getType()); 00096 break; 00097 case VAR_COLOR: 00098 tempMsg.writeUnsignedByte(TYPE_COLOR); 00099 tempMsg.writeUnsignedByte(static_cast<int>(p->red()*255.+.5)); 00100 tempMsg.writeUnsignedByte(static_cast<int>(p->green()*255.+.5)); 00101 tempMsg.writeUnsignedByte(static_cast<int>(p->blue()*255.+.5)); 00102 tempMsg.writeUnsignedByte(255); 00103 break; 00104 case VAR_POSITION: 00105 tempMsg.writeUnsignedByte(POSITION_2D); 00106 tempMsg.writeDouble(p->x()); 00107 tempMsg.writeDouble(p->y()); 00108 break; 00109 default: 00110 break; 00111 } 00112 } 00113 server.writeStatusCmd(CMD_GET_POI_VARIABLE, RTYPE_OK, warning, outputStorage); 00114 server.writeResponseWithLength(outputStorage, tempMsg); 00115 return true; 00116 } 00117 00118 00119 bool 00120 TraCIServerAPI_POI::processSet(TraCIServer& server, tcpip::Storage& inputStorage, 00121 tcpip::Storage& outputStorage) { 00122 std::string warning = ""; // additional description for response 00123 // variable 00124 int variable = inputStorage.readUnsignedByte(); 00125 if (variable!=VAR_TYPE&&variable!=VAR_COLOR&&variable!=VAR_POSITION 00126 &&variable!=ADD&&variable!=REMOVE) { 00127 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "Change PoI State: unsupported variable specified", outputStorage); 00128 return false; 00129 } 00130 // id 00131 std::string id = inputStorage.readString(); 00132 PointOfInterest* p = 0; 00133 int layer = 0; 00134 ShapeContainer& shapeCont = MSNet::getInstance()->getShapeContainer(); 00135 if (variable!=ADD&&variable!=REMOVE) { 00136 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer()&&p==0; ++i) { 00137 p = shapeCont.getPOICont(i).get(id); 00138 layer = i; 00139 } 00140 if (p==0) { 00141 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "POI '" + id + "' is not known", outputStorage); 00142 return false; 00143 } 00144 } 00145 // process 00146 int valueDataType = inputStorage.readUnsignedByte(); 00147 switch (variable) { 00148 case VAR_TYPE: { 00149 if (valueDataType!=TYPE_STRING) { 00150 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The type must be given as a string.", outputStorage); 00151 return false; 00152 } 00153 std::string type = inputStorage.readString(); 00154 p->setType(type); 00155 } 00156 break; 00157 case VAR_COLOR: { 00158 if (valueDataType!=TYPE_COLOR) { 00159 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The color must be given using an accoring type.", outputStorage); 00160 return false; 00161 } 00162 SUMOReal r = (SUMOReal) inputStorage.readUnsignedByte() / 255.; 00163 SUMOReal g = (SUMOReal) inputStorage.readUnsignedByte() / 255.; 00164 SUMOReal b = (SUMOReal) inputStorage.readUnsignedByte() / 255.; 00165 //read SUMOReal a 00166 inputStorage.readUnsignedByte(); 00167 dynamic_cast<RGBColor*>(p)->set(r,g,b); 00168 } 00169 break; 00170 case VAR_POSITION: { 00171 if (valueDataType!=POSITION_2D) { 00172 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The position must be given using an accoring type.", outputStorage); 00173 return false; 00174 } 00175 SUMOReal x = inputStorage.readDouble(); 00176 SUMOReal y = inputStorage.readDouble(); 00177 shapeCont.movePoI(layer, id, Position(x, y)); 00178 } 00179 break; 00180 case ADD: { 00181 if (valueDataType!=TYPE_COMPOUND) { 00182 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "A compound object is needed for setting a new PoI.", outputStorage); 00183 return false; 00184 } 00185 //read itemNo 00186 inputStorage.readInt(); 00187 // type 00188 if (inputStorage.readUnsignedByte()!=TYPE_STRING) { 00189 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The first PoI parameter must be the type encoded as a string.", outputStorage); 00190 return false; 00191 } 00192 std::string type = inputStorage.readString(); 00193 // color 00194 if (inputStorage.readUnsignedByte()!=TYPE_COLOR) { 00195 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The second PoI parameter must be the color.", outputStorage); 00196 return false; 00197 } 00198 SUMOReal r = (SUMOReal) inputStorage.readUnsignedByte() / 255.; 00199 SUMOReal g = (SUMOReal) inputStorage.readUnsignedByte() / 255.; 00200 SUMOReal b = (SUMOReal) inputStorage.readUnsignedByte() / 255.; 00201 //read SUMOReal a 00202 inputStorage.readUnsignedByte(); 00203 // layer 00204 if (inputStorage.readUnsignedByte()!=TYPE_INTEGER) { 00205 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The third PoI parameter must be the layer encoded as int.", outputStorage); 00206 return false; 00207 } 00208 layer = inputStorage.readInt(); 00209 // pos 00210 if (inputStorage.readUnsignedByte()!=POSITION_2D) { 00211 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The fourth PoI parameter must be the position.", outputStorage); 00212 return false; 00213 } 00214 SUMOReal x = inputStorage.readDouble(); 00215 SUMOReal y = inputStorage.readDouble(); 00216 // 00217 if (!shapeCont.addPoI(id, layer, type, RGBColor(r, g, b), Position(x, y))) { 00218 delete p; 00219 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "Could not add PoI.", outputStorage); 00220 return false; 00221 } 00222 } 00223 break; 00224 case REMOVE: { 00225 if (valueDataType!=TYPE_INTEGER) { 00226 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "The layer must be given using an int.", outputStorage); 00227 return false; 00228 } 00229 layer = inputStorage.readInt(); 00230 if (!shapeCont.removePoI(layer, id)) { 00231 bool removed = false; 00232 for (int i = shapeCont.getMinLayer(); i <= shapeCont.getMaxLayer(); ++i) { 00233 removed |= shapeCont.removePoI(i, id); 00234 } 00235 if (!removed) { 00236 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_ERR, "Could not remove PoI '" + id + "'", outputStorage); 00237 return false; 00238 } 00239 } 00240 } 00241 break; 00242 default: 00243 break; 00244 } 00245 server.writeStatusCmd(CMD_SET_POI_VARIABLE, RTYPE_OK, warning, outputStorage); 00246 return true; 00247 } 00248 00249 00250 00251 /****************************************************************************/ 00252