Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
TraCIServerAPI_Lane.cpp
Go to the documentation of this file.
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/****************************************************************************/
24// APIs for getting/setting lane values via TraCI
25/****************************************************************************/
26#include <config.h>
27
28#include <microsim/MSEdge.h>
30#include <microsim/MSLane.h>
31#include <microsim/MSNet.h>
32#include <microsim/MSVehicle.h>
34#include <libsumo/Lane.h>
37#include "TraCIServer.h"
38#include "TraCIServerAPI_Lane.h"
39
40
41// ===========================================================================
42// method definitions
43// ===========================================================================
44bool
46 tcpip::Storage& outputStorage) {
47 const int variable = inputStorage.readUnsignedByte();
48 const std::string id = inputStorage.readString();
50 try {
51 if (!libsumo::Lane::handleVariable(id, variable, &server, &inputStorage)) {
52 switch (variable) {
55 const std::vector<libsumo::TraCIConnection> links = libsumo::Lane::getLinks(id);
56 tcpip::Storage tempContent;
57 int cnt = 0;
59 tempContent.writeInt((int) links.size());
60 ++cnt;
61 for (std::vector<libsumo::TraCIConnection>::const_iterator i = links.begin(); i != links.end(); ++i) {
62 // approached non-internal lane (if any)
64 tempContent.writeString(i->approachedLane);
65 ++cnt;
66 // approached "via", internal lane (if any)
68 tempContent.writeString(i->approachedInternal);
69 ++cnt;
70 // priority
72 tempContent.writeUnsignedByte(i->hasPrio);
73 ++cnt;
74 // opened
76 tempContent.writeUnsignedByte(i->isOpen);
77 ++cnt;
78 // approaching foe
80 tempContent.writeUnsignedByte(i->hasFoe);
81 ++cnt;
82 // state (not implemented, yet)
84 tempContent.writeString(i->state);
85 ++cnt;
86 // direction
88 tempContent.writeString(i->direction);
89 ++cnt;
90 // length
92 tempContent.writeDouble(i->length);
93 ++cnt;
94 }
95 server.getWrapperStorage().writeInt(cnt);
96 server.getWrapperStorage().writeStorage(tempContent);
97 break;
98 }
99 case libsumo::VAR_FOES: {
100 const std::string toLane = StoHelp::readTypedString(inputStorage, "Foe retrieval requires a string.");
101 StoHelp::writeTypedStringList(server.getWrapperStorage(), toLane == "" ? libsumo::Lane::getInternalFoes(id) : libsumo::Lane::getFoes(id, toLane));
102 break;
103 }
104 default:
105 return server.writeErrorStatusCmd(libsumo::CMD_GET_LANE_VARIABLE, "Get Lane Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
106 }
107 }
108 } catch (libsumo::TraCIException& e) {
109 return server.writeErrorStatusCmd(libsumo::CMD_GET_LANE_VARIABLE, e.what(), outputStorage);
110 }
112 server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
113 return true;
114}
115
116
117bool
119 tcpip::Storage& outputStorage) {
120 std::string warning = ""; // additional description for response
121 // variable
122 int variable = inputStorage.readUnsignedByte();
123 if (variable != libsumo::VAR_MAXSPEED && variable != libsumo::VAR_LENGTH && variable != libsumo::LANE_ALLOWED && variable != libsumo::LANE_DISALLOWED
124 && variable != libsumo::VAR_PARAMETER && variable != libsumo::LANE_CHANGES) {
125 return server.writeErrorStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, "Change Lane State: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
126 }
127 // id
128 std::string id = inputStorage.readString();
129 MSLane* l = MSLane::dictionary(id);
130 if (l == nullptr) {
131 return server.writeErrorStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, "Lane '" + id + "' is not known", outputStorage);
132 }
133 try {
134 // process
135 switch (variable) {
137 const double value = StoHelp::readTypedDouble(inputStorage, "The speed must be given as a double.");
138 libsumo::Lane::setMaxSpeed(id, value);
139 break;
140 }
142 const double value = StoHelp::readTypedDouble(inputStorage, "The friction must be given as a double.");
143 libsumo::Lane::setFriction(id, value);
144 break;
145 }
146 case libsumo::VAR_LENGTH: {
147 const double value = StoHelp::readTypedDouble(inputStorage, "The length must be given as a double.");
148 libsumo::Lane::setLength(id, value);
149 break;
150 }
152 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Allowed vehicle classes must be given as a list of strings.");
153 libsumo::Lane::setAllowed(id, classes);
154 break;
155 }
157 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Not allowed vehicle classes must be given as a list of strings.");
158 libsumo::Lane::setDisallowed(id, classes);
159 break;
160 }
162 StoHelp::readCompound(inputStorage, 2, "A compound object of size 2 is needed for setting lane change permissions.");
163 const std::vector<std::string> classes = StoHelp::readTypedStringList(inputStorage, "Vehicle classes allowed to change lane must be given as a list of strings.");
164 const int direction = StoHelp::readTypedByte(inputStorage, "The lane change direction must be given as an integer.");
165 libsumo::Lane::setChangePermissions(id, classes, direction);
166 break;
167 }
169 StoHelp::readCompound(inputStorage, 2, "A compound object of size 2 is needed for setting a parameter.");
170 const std::string name = StoHelp::readTypedString(inputStorage, "The name of the parameter must be given as a string.");
171 const std::string value = StoHelp::readTypedString(inputStorage, "The value of the parameter must be given as a string.");
172 libsumo::Lane::setParameter(id, name, value);
173 break;
174 }
175 default:
176 break;
177 }
178 } catch (libsumo::TraCIException& e) {
179 return server.writeErrorStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, e.what(), outputStorage);
180 }
181 server.writeStatusCmd(libsumo::CMD_SET_LANE_VARIABLE, libsumo::RTYPE_OK, warning, outputStorage);
182 return true;
183}
184
185
186/****************************************************************************/
std::string toHex(const T i, std::streamsize numDigits=0)
Definition ToString.h:56
Representation of a lane in the micro simulation.
Definition MSLane.h:84
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2414
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa3: Get Lane Variable)
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc3: Change Lane State)
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 readTypedByte(tcpip::Storage &ret, const std::string &error="")
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 void writeTypedStringList(tcpip::Storage &content, const std::vector< std::string > &value)
static double readTypedDouble(tcpip::Storage &ret, const std::string &error="")
An error which allows to continue.
Definition TraCIDefs.h:144
virtual std::string readString()
Definition storage.cpp:180
virtual void writeString(const std::string &s)
Definition storage.cpp:197
virtual void writeInt(int)
Definition storage.cpp:321
virtual void writeDouble(double)
Definition storage.cpp:354
virtual int readUnsignedByte()
Definition storage.cpp:155
virtual void writeUnsignedByte(int)
Definition storage.cpp:165
virtual void writeStorage(tcpip::Storage &store)
Definition storage.cpp:388
TRACI_CONST int LANE_LINKS
TRACI_CONST int LANE_CHANGES
TRACI_CONST int TYPE_COMPOUND
TRACI_CONST int TYPE_UBYTE
TRACI_CONST int VAR_MAXSPEED
TRACI_CONST int TYPE_INTEGER
TRACI_CONST int VAR_LENGTH
TRACI_CONST int VAR_PARAMETER
TRACI_CONST int RESPONSE_GET_LANE_VARIABLE
TRACI_CONST int CMD_SET_LANE_VARIABLE
TRACI_CONST int CMD_GET_LANE_VARIABLE
TRACI_CONST int LANE_DISALLOWED
TRACI_CONST int VAR_FRICTION
TRACI_CONST int TYPE_DOUBLE
TRACI_CONST int RTYPE_OK
TRACI_CONST int VAR_FOES
TRACI_CONST int LANE_ALLOWED
TRACI_CONST int TYPE_STRING