Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
TraCIServerAPI_Edge.cpp
Go to the documentation of this file.
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/****************************************************************************/
24// APIs for getting/setting edge values via TraCI
25/****************************************************************************/
26#include <config.h>
27
29#include <microsim/MSNet.h>
31#include <microsim/MSEdge.h>
32#include <microsim/MSLane.h>
33#include <microsim/MSVehicle.h>
36#include "TraCIServerAPI_Edge.h"
40#include <libsumo/Edge.h>
41
42
43// ===========================================================================
44// method definitions
45// ===========================================================================
46bool
48 tcpip::Storage& outputStorage) {
49 const int variable = inputStorage.readUnsignedByte();
50 const std::string id = inputStorage.readString();
52 try {
53 if (!libsumo::Edge::handleVariable(id, variable, &server, &inputStorage)) {
55 "Get Edge Variable: unsupported variable " + toHex(variable, 2)
56 + " specified", outputStorage);
57 }
58 } catch (libsumo::TraCIException& e) {
59 return server.writeErrorStatusCmd(libsumo::CMD_GET_EDGE_VARIABLE, e.what(), outputStorage);
60 }
62 server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
63 return true;
64}
65
66
67bool
69 tcpip::Storage& outputStorage) {
70 std::string warning; // additional description for response
71 // variable
72 int variable = inputStorage.readUnsignedByte();
73 if (variable != libsumo::VAR_EDGE_TRAVELTIME
74 && variable != libsumo::VAR_EDGE_EFFORT
75 && variable != libsumo::VAR_MAXSPEED
76 && variable != libsumo::LANE_ALLOWED
77 && variable != libsumo::LANE_DISALLOWED
78 && variable != libsumo::VAR_FRICTION
79 && variable != libsumo::VAR_PARAMETER) {
81 "Change Edge State: unsupported variable " + toHex(variable, 2)
82 + " specified", outputStorage);
83 }
84 // id
85 std::string id = inputStorage.readString();
86 try {
87 // process
88 switch (variable) {
90 // read and set allowed vehicle classes
91 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Allowed vehicle classes must be given as a list of strings.");
92 libsumo::Edge::setAllowed(id, classes);
93 break;
94 }
96 // read and set disallowed vehicle classes
97 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Not allowed vehicle classes must be given as a list of strings.");
98 libsumo::Edge::setDisallowed(id, classes);
99 break;
100 }
102 // read and set travel time
103 const int parameterCount = StoHelp::readCompound(inputStorage, -1, "Setting travel time requires a compound object.");
104 if (parameterCount == 3) {
105 // bound by time
106 const double begTime = StoHelp::readTypedDouble(inputStorage, "The first variable must be the begin time given as double.");
107 const double endTime = StoHelp::readTypedDouble(inputStorage, "The second variable must be the end time given as double.");
108 const double value = StoHelp::readTypedDouble(inputStorage, "The third variable must be the value given as double.");
109 libsumo::Edge::adaptTraveltime(id, value, begTime, endTime);
110 } else if (parameterCount == 1) {
111 // unbound
112 const double value = StoHelp::readTypedDouble(inputStorage, "The variable must be the value given as double.");
113 libsumo::Edge::adaptTraveltime(id, value, 0., std::numeric_limits<double>::max());
114 } else {
116 "Setting travel time requires either begin time, end time, and value, or only value as parameter.",
117 outputStorage);
118 }
119 break;
120 }
122 // read and set effort
123 const int parameterCount = StoHelp::readCompound(inputStorage, -1, "Setting effort requires a compound object.");
124 if (parameterCount == 3) {
125 // bound by time
126 const double begTime = StoHelp::readTypedDouble(inputStorage, "The first variable must be the begin time given as double.");
127 const double endTime = StoHelp::readTypedDouble(inputStorage, "The second variable must be the end time given as double.");
128 const double value = StoHelp::readTypedDouble(inputStorage, "The third variable must be the value given as double.");
129 libsumo::Edge::setEffort(id, value, begTime, endTime);
130 } else if (parameterCount == 1) {
131 // unbound
132 const double value = StoHelp::readTypedDouble(inputStorage, "The variable must be the value given as double.");
133 libsumo::Edge::setEffort(id, value, 0., std::numeric_limits<double>::max());
134 } else {
136 "Setting effort requires either begin time, end time, and value, or only value as parameter.",
137 outputStorage);
138 }
139 break;
140 }
142 // read and set max. speed
143 const double value = StoHelp::readTypedDouble(inputStorage, "The speed must be given as a double.");
144 libsumo::Edge::setMaxSpeed(id, value);
145 break;
146 }
148 // read and set friction for entire edge
149 const double value = StoHelp::readTypedDouble(inputStorage, "The friction must be given as a double.");
150 libsumo::Edge::setFriction(id, value);
151 break;
152 }
154 // read and check item number
155 StoHelp::readCompound(inputStorage, 2, "A compound object of size 2 is needed for setting a parameter.");
156 const std::string name = StoHelp::readTypedString(inputStorage, "The name of the parameter must be given as a string.");
157 const std::string value = StoHelp::readTypedString(inputStorage, "The value of the parameter must be given as a string.");
158 libsumo::Edge::setParameter(id, name, value);
159 break;
160 }
161 default:
162 break;
163 }
164 } catch (libsumo::TraCIException& e) {
165 return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE, e.what(), outputStorage);
166 }
167 server.writeStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE, libsumo::RTYPE_OK, warning, outputStorage);
168 return true;
169}
170
171
172/****************************************************************************/
std::string toHex(const T i, std::streamsize numDigits=0)
Definition ToString.h:56
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xca: Change Edge State)
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xaa: Get Edge Variable)
TraCI server used to control sumo by a remote TraCI client.
Definition TraCIServer.h:59
void writeStatusCmd(int commandId, int status, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage.
tcpip::Storage & getWrapperStorage()
void initWrapper(const int domainID, const int variable, const std::string &objID)
bool writeErrorStatusCmd(int commandId, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage with status = RTYPE_ERR.
void writeResponseWithLength(tcpip::Storage &outputStorage, tcpip::Storage &tempMsg)
static int readCompound(tcpip::Storage &ret, int expectedSize=-1, const std::string &error="")
static std::vector< std::string > readTypedStringList(tcpip::Storage &ret, const std::string &error="")
static std::string readTypedString(tcpip::Storage &ret, const std::string &error="")
static double readTypedDouble(tcpip::Storage &ret, const std::string &error="")
An error which allows to continue.
Definition TraCIDefs.h:145
virtual std::string readString()
Definition storage.cpp:180
virtual int readUnsignedByte()
Definition storage.cpp:155
TRACI_CONST int CMD_SET_EDGE_VARIABLE
TRACI_CONST int VAR_EDGE_TRAVELTIME
TRACI_CONST int CMD_GET_EDGE_VARIABLE
TRACI_CONST int RESPONSE_GET_EDGE_VARIABLE
TRACI_CONST int VAR_EDGE_EFFORT
TRACI_CONST int VAR_MAXSPEED
TRACI_CONST int VAR_PARAMETER
TRACI_CONST int LANE_DISALLOWED
TRACI_CONST int VAR_FRICTION
TRACI_CONST int RTYPE_OK
TRACI_CONST int LANE_ALLOWED