Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/traci-server/TraCIServerAPI_Edge.cpp
169665 views
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
TraCIServerAPI_Edge::processGet(TraCIServer& server, tcpip::Storage& inputStorage,
48
tcpip::Storage& outputStorage) {
49
const int variable = inputStorage.readUnsignedByte();
50
const std::string id = inputStorage.readString();
51
server.initWrapper(libsumo::RESPONSE_GET_EDGE_VARIABLE, variable, id);
52
try {
53
if (!libsumo::Edge::handleVariable(id, variable, &server, &inputStorage)) {
54
return server.writeErrorStatusCmd(libsumo::CMD_GET_EDGE_VARIABLE,
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
}
61
server.writeStatusCmd(libsumo::CMD_GET_EDGE_VARIABLE, libsumo::RTYPE_OK, "", outputStorage);
62
server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
63
return true;
64
}
65
66
67
bool
68
TraCIServerAPI_Edge::processSet(TraCIServer& server, tcpip::Storage& inputStorage,
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) {
80
return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE,
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) {
89
case libsumo::LANE_ALLOWED: {
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
}
95
case libsumo::LANE_DISALLOWED: {
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
}
101
case libsumo::VAR_EDGE_TRAVELTIME: {
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 {
115
return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE,
116
"Setting travel time requires either begin time, end time, and value, or only value as parameter.",
117
outputStorage);
118
}
119
break;
120
}
121
case libsumo::VAR_EDGE_EFFORT: {
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 {
135
return server.writeErrorStatusCmd(libsumo::CMD_SET_EDGE_VARIABLE,
136
"Setting effort requires either begin time, end time, and value, or only value as parameter.",
137
outputStorage);
138
}
139
break;
140
}
141
case libsumo::VAR_MAXSPEED: {
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
}
147
case libsumo::VAR_FRICTION: {
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
}
153
case libsumo::VAR_PARAMETER: {
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
/****************************************************************************/
173
174