SUMO - Simulation of Urban MObility

TraCIServerAPI_POI.cpp

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