LCOV - code coverage report
Current view: top level - src/traci-server - TraCIServerAPI_Lane.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 75 78 96.2 %
Date: 2024-05-08 15:29:52 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2009-2024 German Aerospace Center (DLR) and others.
       4             : // This program and the accompanying materials are made available under the
       5             : // terms of the Eclipse Public License 2.0 which is available at
       6             : // https://www.eclipse.org/legal/epl-2.0/
       7             : // This Source Code may also be made available under the following Secondary
       8             : // Licenses when the conditions for such availability set forth in the Eclipse
       9             : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10             : // or later which is available at
      11             : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12             : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13             : /****************************************************************************/
      14             : /// @file    TraCIServerAPI_Lane.cpp
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Jakob Erdmann
      17             : /// @author  Michael Behrisch
      18             : /// @author  Laura Bieker
      19             : /// @author  Mario Krumnow
      20             : /// @author  Leonhard Luecken
      21             : /// @author  Mirko Barthauer
      22             : /// @date    07.05.2009
      23             : ///
      24             : // APIs for getting/setting lane values via TraCI
      25             : /****************************************************************************/
      26             : #include <config.h>
      27             : 
      28             : #include <microsim/MSEdge.h>
      29             : #include <microsim/MSEdgeControl.h>
      30             : #include <microsim/MSLane.h>
      31             : #include <microsim/MSNet.h>
      32             : #include <microsim/MSVehicle.h>
      33             : #include <microsim/transportables/MSTransportable.h>
      34             : #include <libsumo/Lane.h>
      35             : #include <libsumo/TraCIConstants.h>
      36             : #include <libsumo/StorageHelper.h>
      37             : #include "TraCIServer.h"
      38             : #include "TraCIServerAPI_Lane.h"
      39             : 
      40             : 
      41             : // ===========================================================================
      42             : // method definitions
      43             : // ===========================================================================
      44             : bool
      45       20856 : TraCIServerAPI_Lane::processGet(TraCIServer& server, tcpip::Storage& inputStorage,
      46             :                                 tcpip::Storage& outputStorage) {
      47       20856 :     const int variable = inputStorage.readUnsignedByte();
      48       20856 :     const std::string id = inputStorage.readString();
      49       20856 :     server.initWrapper(libsumo::RESPONSE_GET_LANE_VARIABLE, variable, id);
      50             :     try {
      51       20856 :         if (!libsumo::Lane::handleVariable(id, variable, &server, &inputStorage)) {
      52          54 :             switch (variable) {
      53          29 :                 case libsumo::LANE_LINKS: {
      54          29 :                     server.getWrapperStorage().writeUnsignedByte(libsumo::TYPE_COMPOUND);
      55          29 :                     const std::vector<libsumo::TraCIConnection> links = libsumo::Lane::getLinks(id);
      56          29 :                     tcpip::Storage tempContent;
      57             :                     int cnt = 0;
      58          29 :                     tempContent.writeUnsignedByte(libsumo::TYPE_INTEGER);
      59          29 :                     tempContent.writeInt((int) links.size());
      60             :                     ++cnt;
      61          91 :                     for (std::vector<libsumo::TraCIConnection>::const_iterator i = links.begin(); i != links.end(); ++i) {
      62             :                         // approached non-internal lane (if any)
      63          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_STRING);
      64          62 :                         tempContent.writeString(i->approachedLane);
      65             :                         ++cnt;
      66             :                         // approached "via", internal lane (if any)
      67          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_STRING);
      68          62 :                         tempContent.writeString(i->approachedInternal);
      69             :                         ++cnt;
      70             :                         // priority
      71          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_UBYTE);
      72          62 :                         tempContent.writeUnsignedByte(i->hasPrio);
      73             :                         ++cnt;
      74             :                         // opened
      75          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_UBYTE);
      76          62 :                         tempContent.writeUnsignedByte(i->isOpen);
      77             :                         ++cnt;
      78             :                         // approaching foe
      79          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_UBYTE);
      80          62 :                         tempContent.writeUnsignedByte(i->hasFoe);
      81             :                         ++cnt;
      82             :                         // state (not implemented, yet)
      83          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_STRING);
      84          62 :                         tempContent.writeString(i->state);
      85             :                         ++cnt;
      86             :                         // direction
      87          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_STRING);
      88          62 :                         tempContent.writeString(i->direction);
      89             :                         ++cnt;
      90             :                         // length
      91          62 :                         tempContent.writeUnsignedByte(libsumo::TYPE_DOUBLE);
      92          62 :                         tempContent.writeDouble(i->length);
      93          62 :                         ++cnt;
      94             :                     }
      95          29 :                     server.getWrapperStorage().writeInt(cnt);
      96          29 :                     server.getWrapperStorage().writeStorage(tempContent);
      97             :                     break;
      98          29 :                 }
      99             :                 case libsumo::VAR_FOES: {
     100          46 :                     const std::string toLane = StoHelp::readTypedString(inputStorage, "Foe retrieval requires a string.");
     101          43 :                     StoHelp::writeTypedStringList(server.getWrapperStorage(), toLane == "" ? libsumo::Lane::getInternalFoes(id) : libsumo::Lane::getFoes(id, toLane));
     102             :                     break;
     103             :                 }
     104           2 :                 default:
     105           4 :                     return server.writeErrorStatusCmd(libsumo::CMD_GET_LANE_VARIABLE, "Get Lane Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
     106             :             }
     107             :         }
     108           5 :     } catch (libsumo::TraCIException& e) {
     109           5 :         return server.writeErrorStatusCmd(libsumo::CMD_GET_LANE_VARIABLE, e.what(), outputStorage);
     110           5 :     }
     111       20849 :     server.writeStatusCmd(libsumo::CMD_GET_LANE_VARIABLE, libsumo::RTYPE_OK, "", outputStorage);
     112       20849 :     server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
     113             :     return true;
     114             : }
     115             : 
     116             : 
     117             : bool
     118         155 : TraCIServerAPI_Lane::processSet(TraCIServer& server, tcpip::Storage& inputStorage,
     119             :                                 tcpip::Storage& outputStorage) {
     120         155 :     std::string warning = ""; // additional description for response
     121             :     // variable
     122         155 :     int variable = inputStorage.readUnsignedByte();
     123         155 :     if (variable != libsumo::VAR_MAXSPEED && variable != libsumo::VAR_LENGTH && variable != libsumo::LANE_ALLOWED && variable != libsumo::LANE_DISALLOWED
     124          62 :             && variable != libsumo::VAR_PARAMETER && variable != libsumo::LANE_CHANGES) {
     125           0 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, "Change Lane State: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
     126             :     }
     127             :     // id
     128         155 :     std::string id = inputStorage.readString();
     129         155 :     MSLane* l = MSLane::dictionary(id);
     130         155 :     if (l == nullptr) {
     131           8 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, "Lane '" + id + "' is not known", outputStorage);
     132             :     }
     133             :     try {
     134             :         // process
     135         151 :         switch (variable) {
     136             :             case libsumo::VAR_MAXSPEED: {
     137          30 :                 const double value = StoHelp::readTypedDouble(inputStorage, "The speed must be given as a double.");
     138          29 :                 libsumo::Lane::setMaxSpeed(id, value);
     139             :                 break;
     140             :             }
     141             :             case libsumo::VAR_FRICTION: {
     142           0 :                 const double value = StoHelp::readTypedDouble(inputStorage, "The friction must be given as a double.");
     143           0 :                 libsumo::Lane::setFriction(id, value);
     144             :                 break;
     145             :             }
     146             :             case libsumo::VAR_LENGTH: {
     147          13 :                 const double value = StoHelp::readTypedDouble(inputStorage, "The length must be given as a double.");
     148          12 :                 libsumo::Lane::setLength(id, value);
     149             :                 break;
     150             :             }
     151             :             case libsumo::LANE_ALLOWED: {
     152          29 :                 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Allowed vehicle classes must be given as a list of strings.");
     153          28 :                 libsumo::Lane::setAllowed(id, classes);
     154             :                 break;
     155          28 :             }
     156             :             case libsumo::LANE_DISALLOWED: {
     157          17 :                 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Not allowed vehicle classes must be given as a list of strings.");
     158          16 :                 libsumo::Lane::setDisallowed(id, classes);
     159             :                 break;
     160          16 :             }
     161             :             case libsumo::LANE_CHANGES: {
     162          14 :                 StoHelp::readCompound(inputStorage, 2, "A compound object of size 2 is needed for setting lane change permissions.");
     163          14 :                 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Vehicle classes allowed to change lane must be given as a list of strings.");
     164          14 :                 const int direction = StoHelp::readTypedByte(inputStorage, "The lane change direction must be given as an integer.");
     165          14 :                 libsumo::Lane::setChangePermissions(id, classes, direction);
     166             :                 break;
     167          14 :             }
     168             :             case libsumo::VAR_PARAMETER: {
     169          48 :                 StoHelp::readCompound(inputStorage, 2, "A compound object of size 2 is needed for setting a parameter.");
     170          48 :                 const std::string name = StoHelp::readTypedString(inputStorage, "The name of the parameter must be given as a string.");
     171          48 :                 const std::string value = StoHelp::readTypedString(inputStorage, "The value of the parameter must be given as a string.");
     172          48 :                 libsumo::Lane::setParameter(id, name, value);
     173             :                 break;
     174             :             }
     175             :             default:
     176             :                 break;
     177             :         }
     178           4 :     } catch (libsumo::TraCIException& e) {
     179           4 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, e.what(), outputStorage);
     180           4 :     }
     181         147 :     server.writeStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, libsumo::RTYPE_OK, warning, outputStorage);
     182             :     return true;
     183             : }
     184             : 
     185             : 
     186             : /****************************************************************************/

Generated by: LCOV version 1.14