LCOV - code coverage report
Current view: top level - src/traci-server - TraCIServerAPI_Edge.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 80.4 % 51 41
Test Date: 2025-12-06 15:35:27 Functions: 100.0 % 1 1

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2002-2025 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_Edge.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Jerome Haerri
      18              : /// @author  Michael Behrisch
      19              : /// @author  Laura Bieker
      20              : /// @author  Mario Krumnow
      21              : /// @author  Gregor Laemmel
      22              : /// @date    Sept 2002
      23              : ///
      24              : // APIs for getting/setting edge values via TraCI
      25              : /****************************************************************************/
      26              : #include <config.h>
      27              : 
      28              : #include <utils/common/StdDefs.h>
      29              : #include <microsim/MSNet.h>
      30              : #include <microsim/MSEdgeControl.h>
      31              : #include <microsim/MSEdge.h>
      32              : #include <microsim/MSLane.h>
      33              : #include <microsim/MSVehicle.h>
      34              : #include <microsim/transportables/MSPerson.h>
      35              : #include <libsumo/TraCIConstants.h>
      36              : #include "TraCIServerAPI_Edge.h"
      37              : #include <microsim/MSEdgeWeightsStorage.h>
      38              : #include <utils/emissions/HelpersHarmonoise.h>
      39              : #include <libsumo/StorageHelper.h>
      40              : #include <libsumo/Edge.h>
      41              : 
      42              : 
      43              : // ===========================================================================
      44              : // method definitions
      45              : // ===========================================================================
      46              : bool
      47          164 : TraCIServerAPI_Edge::processSet(TraCIServer& server, tcpip::Storage& inputStorage,
      48              :                                 tcpip::Storage& outputStorage) {
      49              :     std::string warning; // additional description for response
      50              :     // variable
      51          164 :     int variable = inputStorage.readUnsignedByte();
      52          164 :     if (variable != libsumo::VAR_EDGE_TRAVELTIME
      53          164 :             && variable != libsumo::VAR_EDGE_EFFORT
      54          164 :             && variable != libsumo::VAR_MAXSPEED
      55              :             && variable != libsumo::LANE_ALLOWED
      56           68 :             && variable != libsumo::LANE_DISALLOWED
      57           62 :             && variable != libsumo::VAR_FRICTION
      58           62 :             && variable != libsumo::VAR_PARAMETER) {
      59            0 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE,
      60            0 :                                           "Change Edge State: unsupported variable " + toHex(variable, 2)
      61            0 :                                           + " specified", outputStorage);
      62              :     }
      63              :     // id
      64          164 :     std::string id = inputStorage.readString();
      65              :     try {
      66              :         // process
      67          164 :         switch (variable) {
      68              :             case libsumo::LANE_ALLOWED: {
      69              :                 // read and set allowed vehicle classes
      70            6 :                 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Allowed vehicle classes must be given as a list of strings.");
      71            6 :                 libsumo::Edge::setAllowed(id, classes);
      72              :                 break;
      73            6 :             }
      74              :             case libsumo::LANE_DISALLOWED: {
      75              :                 // read and set disallowed vehicle classes
      76            0 :                 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Not allowed vehicle classes must be given as a list of strings.");
      77            0 :                 libsumo::Edge::setDisallowed(id, classes);
      78              :                 break;
      79            0 :             }
      80              :             case libsumo::VAR_EDGE_TRAVELTIME: {
      81              :                 // read and set travel time
      82           71 :                 const int parameterCount = StoHelp::readCompound(inputStorage, -1, "Setting travel time requires a compound object.");
      83           71 :                 if (parameterCount == 3) {
      84              :                     // bound by time
      85           15 :                     const double begTime = StoHelp::readTypedDouble(inputStorage, "The first variable must be the begin time given as double.");
      86           15 :                     const double endTime = StoHelp::readTypedDouble(inputStorage, "The second variable must be the end time given as double.");
      87           15 :                     const double value = StoHelp::readTypedDouble(inputStorage, "The third variable must be the value given as double.");
      88           15 :                     libsumo::Edge::adaptTraveltime(id, value, begTime, endTime);
      89           56 :                 } else if (parameterCount == 1) {
      90              :                     // unbound
      91           56 :                     const double value = StoHelp::readTypedDouble(inputStorage, "The variable must be the value given as double.");
      92           56 :                     libsumo::Edge::adaptTraveltime(id, value, 0., std::numeric_limits<double>::max());
      93              :                 } else {
      94            0 :                     return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE,
      95              :                                                       "Setting travel time requires either begin time, end time, and value, or only value as parameter.",
      96              :                                                       outputStorage);
      97              :                 }
      98              :                 break;
      99              :             }
     100              :             case libsumo::VAR_EDGE_EFFORT: {
     101              :                 // read and set effort
     102           12 :                 const int parameterCount = StoHelp::readCompound(inputStorage, -1, "Setting effort requires a compound object.");
     103           12 :                 if (parameterCount == 3) {
     104              :                     // bound by time
     105            9 :                     const double begTime = StoHelp::readTypedDouble(inputStorage, "The first variable must be the begin time given as double.");
     106            9 :                     const double endTime = StoHelp::readTypedDouble(inputStorage, "The second variable must be the end time given as double.");
     107            9 :                     const double value = StoHelp::readTypedDouble(inputStorage, "The third variable must be the value given as double.");
     108            9 :                     libsumo::Edge::setEffort(id, value, begTime, endTime);
     109            3 :                 } else if (parameterCount == 1) {
     110              :                     // unbound
     111            3 :                     const double value = StoHelp::readTypedDouble(inputStorage, "The variable must be the value given as double.");
     112            3 :                     libsumo::Edge::setEffort(id, value, 0., std::numeric_limits<double>::max());
     113              :                 } else {
     114            0 :                     return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE,
     115              :                                                       "Setting effort requires either begin time, end time, and value, or only value as parameter.",
     116              :                                                       outputStorage);
     117              :                 }
     118              :                 break;
     119              :             }
     120              :             case libsumo::VAR_MAXSPEED: {
     121              :                 // read and set max. speed
     122           13 :                 const double value = StoHelp::readTypedDouble(inputStorage, "The speed must be given as a double.");
     123           13 :                 libsumo::Edge::setMaxSpeed(id, value);
     124              :                 break;
     125              :             }
     126              :             case libsumo::VAR_FRICTION: {
     127              :                 // read and set friction for entire edge
     128            0 :                 const double value = StoHelp::readTypedDouble(inputStorage, "The friction must be given as a double.");
     129            0 :                 libsumo::Edge::setFriction(id, value);
     130              :                 break;
     131              :             }
     132              :             case libsumo::VAR_PARAMETER: {
     133              :                 // read and check item number
     134           62 :                 StoHelp::readCompound(inputStorage, 2, "A compound object of size 2 is needed for setting a parameter.");
     135           62 :                 const std::string name = StoHelp::readTypedString(inputStorage, "The name of the parameter must be given as a string.");
     136           62 :                 const std::string value = StoHelp::readTypedString(inputStorage, "The value of the parameter must be given as a string.");
     137           62 :                 libsumo::Edge::setParameter(id, name, value);
     138              :                 break;
     139              :             }
     140              :             default:
     141              :                 break;
     142              :         }
     143            2 :     } catch (libsumo::TraCIException& e) {
     144            2 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE, e.what(), outputStorage);
     145            2 :     }
     146          162 :     server.writeStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE, libsumo::RTYPE_OK, warning, outputStorage);
     147              :     return true;
     148              : }
     149              : 
     150              : 
     151              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1