LCOV - code coverage report
Current view: top level - src/traci-server - TraCIServerAPI_VehicleType.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 172 230 74.8 %
Date: 2024-05-08 15:29:52 Functions: 3 3 100.0 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2001-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_VehicleType.cpp
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Jakob Erdmann
      17             : /// @author  Michael Behrisch
      18             : /// @author  Laura Bieker
      19             : /// @author  Robert Hilbrich
      20             : /// @author  Gregor Laemmel
      21             : /// @date    07.05.2009
      22             : ///
      23             : // APIs for getting/setting vehicle type values via TraCI
      24             : /****************************************************************************/
      25             : #include <config.h>
      26             : 
      27             : #include <limits>
      28             : #include <utils/emissions/PollutantsInterface.h>
      29             : #include <microsim/MSNet.h>
      30             : #include <microsim/MSVehicleType.h>
      31             : #include <libsumo/TraCIConstants.h>
      32             : #include <libsumo/VehicleType.h>
      33             : #include "TraCIServerAPI_VehicleType.h"
      34             : 
      35             : 
      36             : // ===========================================================================
      37             : // method definitions
      38             : // ===========================================================================
      39             : bool
      40        2878 : TraCIServerAPI_VehicleType::processGet(TraCIServer& server, tcpip::Storage& inputStorage,
      41             :                                        tcpip::Storage& outputStorage) {
      42        2878 :     const int variable = inputStorage.readUnsignedByte();
      43        2878 :     const std::string id = inputStorage.readString();
      44        2878 :     server.initWrapper(libsumo::RESPONSE_GET_VEHICLETYPE_VARIABLE, variable, id);
      45             :     try {
      46        2878 :         if (!libsumo::VehicleType::handleVariable(id, variable, &server, &inputStorage)) {
      47           2 :             return server.writeErrorStatusCmd(libsumo::CMD_GET_VEHICLETYPE_VARIABLE,
      48           4 :                                               "Get Vehicle Type Variable: unsupported variable " + toHex(variable, 2)
      49           4 :                                               + " specified", outputStorage);
      50             :         }
      51           2 :     } catch (libsumo::TraCIException& e) {
      52           2 :         return server.writeErrorStatusCmd(libsumo::CMD_GET_VEHICLETYPE_VARIABLE, e.what(), outputStorage);
      53           2 :     }
      54        2874 :     server.writeStatusCmd(libsumo::CMD_GET_VEHICLETYPE_VARIABLE, libsumo::RTYPE_OK, "", outputStorage);
      55        2874 :     server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
      56             :     return true;
      57             : }
      58             : 
      59             : 
      60             : bool
      61         233 : TraCIServerAPI_VehicleType::processSet(TraCIServer& server, tcpip::Storage& inputStorage,
      62             :                                        tcpip::Storage& outputStorage) {
      63         233 :     std::string warning = ""; // additional description for response
      64             :     // variable
      65         233 :     int variable = inputStorage.readUnsignedByte();
      66         233 :     if (variable != libsumo::VAR_LENGTH && variable != libsumo::VAR_MAXSPEED && variable != libsumo::VAR_VEHICLECLASS
      67         215 :             && variable != libsumo::VAR_SPEED_FACTOR && variable != libsumo::VAR_SPEED_DEVIATION && variable != libsumo::VAR_EMISSIONCLASS
      68         196 :             && variable != libsumo::VAR_WIDTH && variable != libsumo::VAR_MINGAP && variable != libsumo::VAR_SHAPECLASS
      69         181 :             && variable != libsumo::VAR_ACCEL && variable != libsumo::VAR_IMPERFECTION
      70         164 :             && variable != libsumo::VAR_DECEL && variable != libsumo::VAR_EMERGENCY_DECEL && variable != libsumo::VAR_APPARENT_DECEL
      71         126 :             && variable != libsumo::VAR_TAU && variable != libsumo::VAR_COLOR && variable != libsumo::VAR_ACTIONSTEPLENGTH
      72         114 :             && variable != libsumo::VAR_SCALE
      73             :             && variable != libsumo::VAR_HEIGHT
      74         100 :             && variable != libsumo::VAR_MINGAP_LAT
      75             :             && variable != libsumo::VAR_MAXSPEED_LAT
      76          90 :             && variable != libsumo::VAR_LATALIGNMENT
      77          80 :             && variable != libsumo::VAR_BOARDING_DURATION
      78          80 :             && variable != libsumo::VAR_IMPATIENCE
      79          72 :             && variable != libsumo::VAR_PARAMETER
      80          72 :             && variable != libsumo::COPY
      81             :        ) {
      82           0 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLETYPE_VARIABLE,
      83           0 :                                           "Change Vehicle Type State: unsupported variable " + toHex(variable, 2)
      84           0 :                                           + " specified", outputStorage);
      85             :     }
      86             :     // id
      87         233 :     std::string id = inputStorage.readString();
      88             : //    MSVehicleType* v = libsumo::VehicleType::getVType(id);
      89             : //    if (v == 0) {
      90             : //        return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, "Vehicle type '" + id + "' is not known",
      91             : //                                          outputStorage);
      92             : //    }
      93             :     // process
      94             :     try {
      95         233 :         if (setVariable(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, variable, id, server, inputStorage, outputStorage)) {
      96         221 :             server.writeStatusCmd(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::RTYPE_OK, warning, outputStorage);
      97             :             return true;
      98             :         }
      99          12 :     } catch (ProcessError& e) {
     100           0 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, e.what(), outputStorage);
     101          12 :     } catch (libsumo::TraCIException& e) {
     102          12 :         return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, e.what(), outputStorage);
     103          12 :     }
     104             :     return false;
     105             : }
     106             : 
     107             : 
     108             : bool
     109         519 : TraCIServerAPI_VehicleType::setVariable(const int cmd, const int variable,
     110             :                                         const std::string& id, TraCIServer& server,
     111             :                                         tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) {
     112         519 :     switch (variable) {
     113          97 :         case libsumo::VAR_LENGTH: {
     114          97 :             double value = 0;
     115          97 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     116           0 :                 return server.writeErrorStatusCmd(cmd, "Setting length requires a double.", outputStorage);
     117             :             }
     118          97 :             if (value <= 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     119           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid length.", outputStorage);
     120             :             }
     121          97 :             libsumo::VehicleType::setLength(id, value);
     122             :         }
     123          97 :         break;
     124          16 :         case libsumo::VAR_HEIGHT: {
     125          16 :             double value = 0;
     126          16 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     127           0 :                 return server.writeErrorStatusCmd(cmd, "Setting height requires a double.", outputStorage);
     128             :             }
     129          16 :             if (value <= 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     130           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid height.", outputStorage);
     131             :             }
     132          16 :             libsumo::VehicleType::setHeight(id, value);
     133             :         }
     134          16 :         break;
     135          43 :         case libsumo::VAR_MAXSPEED: {
     136          43 :             double value = 0;
     137          43 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     138           0 :                 return server.writeErrorStatusCmd(cmd, "Setting maximum speed requires a double.", outputStorage);
     139             :             }
     140          43 :             if (value <= 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     141           2 :                 return server.writeErrorStatusCmd(cmd, "Invalid maximum speed.", outputStorage);
     142             :             }
     143          42 :             libsumo::VehicleType::setMaxSpeed(id, value);
     144             :         }
     145          42 :         break;
     146             :         case libsumo::VAR_VEHICLECLASS: {
     147             :             std::string vclass;
     148          14 :             if (!server.readTypeCheckingString(inputStorage, vclass)) {
     149           0 :                 return server.writeErrorStatusCmd(cmd, "Setting vehicle class requires a string.", outputStorage);
     150             :             }
     151             :             try {
     152          14 :                 libsumo::VehicleType::setVehicleClass(id, vclass);
     153           0 :             } catch (InvalidArgument&) {
     154           0 :                 return server.writeErrorStatusCmd(cmd, "Unknown vehicle class '" + vclass + "'.", outputStorage);
     155           0 :             }
     156             :         }
     157             :         break;
     158           7 :         case libsumo::VAR_SPEED_FACTOR: {
     159           7 :             double value = 0;
     160           7 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     161           0 :                 return server.writeErrorStatusCmd(cmd, "Setting speed factor requires a double.", outputStorage);
     162             :             }
     163           7 :             if (value <= 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     164           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid speed factor.", outputStorage);
     165             :             }
     166           7 :             libsumo::VehicleType::setSpeedFactor(id, value);
     167             :         }
     168           7 :         break;
     169           4 :         case libsumo::VAR_SPEED_DEVIATION: {
     170           4 :             double value = 0;
     171           4 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     172           0 :                 return server.writeErrorStatusCmd(cmd, "Setting speed deviation requires a double.", outputStorage);
     173             :             }
     174           4 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     175           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid speed deviation.", outputStorage);
     176             :             }
     177           4 :             libsumo::VehicleType::setSpeedDeviation(id, value);
     178             :         }
     179           4 :         break;
     180             :         case libsumo::VAR_EMISSIONCLASS: {
     181             :             std::string eclass;
     182          19 :             if (!server.readTypeCheckingString(inputStorage, eclass)) {
     183           0 :                 return server.writeErrorStatusCmd(cmd, "Setting emission class requires a string.", outputStorage);
     184             :             }
     185             :             try {
     186          19 :                 libsumo::VehicleType::setEmissionClass(id, eclass);
     187           0 :             } catch (InvalidArgument& e) {
     188           0 :                 return server.writeErrorStatusCmd(cmd, e.what(), outputStorage);
     189           0 :             }
     190             :         }
     191             :         break;
     192          23 :         case libsumo::VAR_WIDTH: {
     193          23 :             double value = 0;
     194          23 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     195           0 :                 return server.writeErrorStatusCmd(cmd, "Setting width requires a double.", outputStorage);
     196             :             }
     197          23 :             if (value <= 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     198           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid width.", outputStorage);
     199             :             }
     200          23 :             libsumo::VehicleType::setWidth(id, value);
     201             :         }
     202          23 :         break;
     203          12 :         case libsumo::VAR_MINGAP: {
     204          12 :             double value = 0;
     205          12 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     206           0 :                 return server.writeErrorStatusCmd(cmd, "Setting minimum gap requires a double.", outputStorage);
     207             :             }
     208          12 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     209           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid minimum gap.", outputStorage);
     210             :             }
     211          12 :             libsumo::VehicleType::setMinGap(id, value);
     212             :         }
     213          12 :         break;
     214           5 :         case libsumo::VAR_MINGAP_LAT: {
     215           5 :             double value = 0;
     216           5 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     217           0 :                 return server.writeErrorStatusCmd(cmd, "Setting minimum lateral gap requires a double.", outputStorage);
     218             :             }
     219           5 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     220           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid minimum lateral gap.", outputStorage);
     221             :             }
     222           5 :             libsumo::VehicleType::setMinGapLat(id, value);
     223             :         }
     224           5 :         break;
     225          11 :         case libsumo::VAR_MAXSPEED_LAT: {
     226          11 :             double value = 0;
     227          11 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     228           0 :                 return server.writeErrorStatusCmd(cmd, "Setting maximum lateral speed requires a double.", outputStorage);
     229             :             }
     230          11 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     231           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid maximum lateral speed.", outputStorage);
     232             :             }
     233          11 :             libsumo::VehicleType::setMaxSpeedLat(id, value);
     234             :         }
     235          11 :         break;
     236             :         case libsumo::VAR_LATALIGNMENT: {
     237             :             std::string latAlign;
     238          11 :             if (!server.readTypeCheckingString(inputStorage, latAlign)) {
     239           0 :                 return server.writeErrorStatusCmd(cmd, "Setting preferred lateral alignment requires a string.",
     240             :                                                   outputStorage);
     241             :             }
     242             :             try {
     243          11 :                 libsumo::VehicleType::setLateralAlignment(id, latAlign);
     244           0 :             } catch (const libsumo::TraCIException& e) {
     245           0 :                 return server.writeErrorStatusCmd(cmd, e.what(), outputStorage);
     246           0 :             }
     247             :         }
     248             :         break;
     249             :         case libsumo::VAR_SHAPECLASS: {
     250             :             std::string sclass;
     251          12 :             if (!server.readTypeCheckingString(inputStorage, sclass)) {
     252           0 :                 return server.writeErrorStatusCmd(cmd, "Setting vehicle shape requires a string.", outputStorage);
     253             :             }
     254             :             try {
     255          12 :                 libsumo::VehicleType::setShapeClass(id, sclass);
     256           0 :             } catch (InvalidArgument& e) {
     257           0 :                 return server.writeErrorStatusCmd(cmd, e.what(), outputStorage);
     258           0 :             }
     259             :         }
     260             :         break;
     261          32 :         case libsumo::VAR_ACCEL: {
     262          32 :             double value = 0;
     263          32 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     264           0 :                 return server.writeErrorStatusCmd(cmd, "Setting acceleration requires a double.", outputStorage);
     265             :             }
     266          32 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     267           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid acceleration.", outputStorage);
     268             :             }
     269          32 :             libsumo::VehicleType::setAccel(id, value);
     270             :         }
     271          32 :         break;
     272          19 :         case libsumo::VAR_DECEL: {
     273          19 :             double value = 0;
     274          19 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     275           0 :                 return server.writeErrorStatusCmd(cmd, "Setting deceleration requires a double.", outputStorage);
     276             :             }
     277          19 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     278           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid deceleration.", outputStorage);
     279             :             }
     280          19 :             libsumo::VehicleType::setDecel(id, value);
     281             :         }
     282          19 :         break;
     283          25 :         case libsumo::VAR_EMERGENCY_DECEL: {
     284          25 :             double value = 0;
     285          25 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     286           0 :                 return server.writeErrorStatusCmd(cmd, "Setting deceleration requires a double.", outputStorage);
     287             :             }
     288          25 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     289           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid deceleration.", outputStorage);
     290             :             }
     291          25 :             libsumo::VehicleType::setEmergencyDecel(id, value);
     292             :         }
     293          25 :         break;
     294          19 :         case libsumo::VAR_APPARENT_DECEL: {
     295          19 :             double value = 0;
     296          19 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     297           0 :                 return server.writeErrorStatusCmd(cmd, "Setting deceleration requires a double.", outputStorage);
     298             :             }
     299          19 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     300           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid deceleration.", outputStorage);
     301             :             }
     302          19 :             libsumo::VehicleType::setApparentDecel(id, value);
     303             :         }
     304          19 :         break;
     305           4 :         case libsumo::VAR_SCALE: {
     306           4 :             double value = 0;
     307           4 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     308           0 :                 return server.writeErrorStatusCmd(cmd, "Setting traffic scale requires a double.", outputStorage);
     309             :             }
     310           4 :             if (value < 0.0) {
     311           0 :                 return server.writeErrorStatusCmd(cmd, "Traffic scale may not be negative.", outputStorage);
     312             :             }
     313           4 :             libsumo::VehicleType::setScale(id, value);
     314             :         }
     315           4 :         break;
     316          10 :         case libsumo::VAR_ACTIONSTEPLENGTH: {
     317          10 :             double value = 0;
     318          10 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     319           0 :                 return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLE_VARIABLE, "Setting action step length requires a double.", outputStorage);
     320             :             }
     321          10 :             if (fabs(value) == std::numeric_limits<double>::infinity()) {
     322           0 :                 return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLE_VARIABLE, "Invalid action step length.", outputStorage);
     323             :             }
     324          10 :             bool resetActionOffset = value >= 0.0;
     325          10 :             libsumo::VehicleType::setActionStepLength(id, fabs(value), resetActionOffset);
     326             :         }
     327          10 :         break;
     328          27 :         case libsumo::VAR_IMPERFECTION: {
     329          27 :             double value = 0;
     330          27 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     331           0 :                 return server.writeErrorStatusCmd(cmd, "Setting driver imperfection requires a double.", outputStorage);
     332             :             }
     333          27 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     334           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid driver imperfection.", outputStorage);
     335             :             }
     336          27 :             libsumo::VehicleType::setImperfection(id, value);
     337             :         }
     338          27 :         break;
     339          19 :         case libsumo::VAR_TAU: {
     340          19 :             double value = 0;
     341          19 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     342           0 :                 return server.writeErrorStatusCmd(cmd, "Setting headway time requires a double.", outputStorage);
     343             :             }
     344          19 :             if (value < 0.0 || fabs(value) == std::numeric_limits<double>::infinity()) {
     345           0 :                 return server.writeErrorStatusCmd(cmd, "Invalid headway time.", outputStorage);
     346             :             }
     347          19 :             libsumo::VehicleType::setTau(id, value);
     348             :         }
     349          19 :         break;
     350           4 :         case libsumo::VAR_IMPATIENCE: {
     351           4 :             double value = 0;
     352           4 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     353           0 :                 return server.writeErrorStatusCmd(cmd, "Setting impatience requires a double.", outputStorage);
     354             :             }
     355           4 :             libsumo::VehicleType::setImpatience(id, value);
     356             :         }
     357           4 :         break;
     358          10 :         case libsumo::VAR_BOARDING_DURATION: {
     359          10 :             double value = 0;
     360          10 :             if (!server.readTypeCheckingDouble(inputStorage, value)) {
     361           0 :                 return server.writeErrorStatusCmd(cmd, "Setting boardingDuration requires a double.", outputStorage);
     362             :             }
     363          10 :             libsumo::VehicleType::setBoardingDuration(id, value);
     364             :         }
     365          10 :         break;
     366             :         case libsumo::VAR_COLOR: {
     367             :             libsumo::TraCIColor col;
     368           4 :             if (!server.readTypeCheckingColor(inputStorage, col)) {
     369           0 :                 return server.writeErrorStatusCmd(cmd, "The color must be given using the according type.", outputStorage);
     370             :             }
     371           4 :             libsumo::VehicleType::setColor(id, col);
     372             :         }
     373             :         break;
     374             :         case libsumo::COPY: {
     375             :             std::string newTypeID;
     376           5 :             if (!server.readTypeCheckingString(inputStorage, newTypeID)) {
     377           0 :                 return server.writeErrorStatusCmd(cmd, "copying a vehicle type requires a string.",
     378             :                                                   outputStorage);
     379             :             }
     380           5 :             libsumo::VehicleType::copy(id, newTypeID);
     381             :         }
     382             :         break;
     383          67 :         case libsumo::VAR_PARAMETER: {
     384          67 :             if (inputStorage.readUnsignedByte() != libsumo::TYPE_COMPOUND) {
     385           0 :                 return server.writeErrorStatusCmd(cmd, "A compound object is needed for setting a parameter.",
     386             :                                                   outputStorage);
     387             :             }
     388             :             //readt itemNo
     389          67 :             inputStorage.readInt();
     390             :             std::string name;
     391          67 :             if (!server.readTypeCheckingString(inputStorage, name)) {
     392          12 :                 return server.writeErrorStatusCmd(cmd, "The name of the parameter must be given as a string.",
     393             :                                                   outputStorage);
     394             :             }
     395             :             std::string value;
     396          67 :             if (!server.readTypeCheckingString(inputStorage, value)) {
     397          12 :                 return server.writeErrorStatusCmd(cmd, "The value of the parameter must be given as a string.",
     398             :                                                   outputStorage);
     399             :             }
     400          67 :             libsumo::VehicleType::setParameter(id, name, value);
     401             :         }
     402             :         break;
     403             :         default:
     404             :             break;
     405             :     }
     406             :     return true;
     407             : }
     408             : 
     409             : 
     410             : /****************************************************************************/

Generated by: LCOV version 1.14