Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
TraCIServerAPI_Polygon.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/****************************************************************************/
23// APIs for getting/setting polygon values via TraCI
24/****************************************************************************/
25#include <config.h>
26
28#include <microsim/MSNet.h>
30#include <libsumo/Polygon.h>
31#include <libsumo/Helper.h>
35
36
37// ===========================================================================
38// method definitions
39// ===========================================================================
40bool
42 tcpip::Storage& outputStorage) {
43 const int variable = inputStorage.readUnsignedByte();
44 const std::string id = inputStorage.readString();
46 try {
47 if (!libsumo::Polygon::handleVariable(id, variable, &server, &inputStorage)) {
48 return server.writeErrorStatusCmd(libsumo::CMD_GET_POLYGON_VARIABLE, "Get Polygon Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
49 }
50 } catch (libsumo::TraCIException& e) {
51 return server.writeErrorStatusCmd(libsumo::CMD_GET_POLYGON_VARIABLE, e.what(), outputStorage);
52 }
54 server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
55 return true;
56}
57
58bool
60 tcpip::Storage& outputStorage) {
61 std::string warning = ""; // additional description for response
62 // variable
63 int variable = inputStorage.readUnsignedByte();
64 if (variable != libsumo::VAR_TYPE && variable != libsumo::VAR_COLOR && variable != libsumo::VAR_SHAPE && variable != libsumo::VAR_FILL
65 && variable != libsumo::VAR_WIDTH && variable != libsumo::VAR_MOVE_TO
66 && variable != libsumo::ADD && variable != libsumo::REMOVE && variable != libsumo::VAR_PARAMETER) {
68 "Change Polygon State: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
69 }
70 // id
71 std::string id = inputStorage.readString();
72 try {
73 // process
74 switch (variable) {
75 case libsumo::VAR_TYPE: {
76 std::string type;
77 if (!server.readTypeCheckingString(inputStorage, type)) {
78 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The type must be given as a string.", outputStorage);
79 }
80 libsumo::Polygon::setType(id, type);
81 }
82 break;
83 case libsumo::VAR_COLOR: {
85 if (!server.readTypeCheckingColor(inputStorage, col)) {
86 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The color must be given using an according type.", outputStorage);
87 }
88 libsumo::Polygon::setColor(id, col);
89 }
90 break;
91 case libsumo::VAR_SHAPE: {
92 PositionVector shape;
93 if (!server.readTypeCheckingPolygon(inputStorage, shape)) {
94 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The shape must be given using an according type.", outputStorage);
95 }
96 libsumo::Polygon::setShape(id, libsumo::Helper::makeTraCIPositionVector(shape));
97 }
98 break;
99 case libsumo::VAR_FILL: {
100 const int value = StoHelp::readTypedInt(inputStorage, "'fill' must be defined using an integer.");
101 libsumo::Polygon::setFilled(id, value != 0);
102 }
103 break;
104 case libsumo::VAR_WIDTH: {
105 double value = 0;
106 if (!server.readTypeCheckingDouble(inputStorage, value)) {
107 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "'lineWidth' must be defined using an double.", outputStorage);
108 }
109 libsumo::Polygon::setLineWidth(id, value);
110 }
111 break;
112 case libsumo::ADD: {
113 if (inputStorage.readUnsignedByte() != libsumo::TYPE_COMPOUND) {
114 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "A compound object is needed for setting a new polygon.", outputStorage);
115 }
116 int itemNo = inputStorage.readInt();
117 if (itemNo != 5 && itemNo != 6) {
118 return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLE_VARIABLE, "Adding a polygon needs five to six parameters.", outputStorage);
119 }
120 std::string type;
121 if (!server.readTypeCheckingString(inputStorage, type)) {
122 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The type must be given as a string.", outputStorage);
123 }
125 if (!server.readTypeCheckingColor(inputStorage, col)) {
126 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The second polygon parameter must be the color.", outputStorage);
127 }
128 int value = 0;
129 if (!server.readTypeCheckingUnsignedByte(inputStorage, value)) {
130 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The third polygon parameter must be 'fill' encoded as ubyte.", outputStorage);
131 }
132 bool fill = value != 0;
133 const int layer = StoHelp::readTypedInt(inputStorage, "The fourth polygon parameter must be the layer encoded as int.");
134 PositionVector shape;
135 if (!server.readTypeCheckingPolygon(inputStorage, shape)) {
136 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The fifth polygon parameter must be the shape.", outputStorage);
137 }
138 double lineWidth = 1;
139 if (itemNo == 6) {
140 if (!server.readTypeCheckingDouble(inputStorage, lineWidth)) {
141 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The sixth polygon parameter must be the lineWidth encoded as double.", outputStorage);
142 }
143 }
145 libsumo::Polygon::add(id, tp, col, fill, type, layer, lineWidth);
146 }
147 break;
149 // Add dynamics to polygon.
150 if (inputStorage.readUnsignedByte() != libsumo::TYPE_COMPOUND) {
151 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "A compound object is needed for adding dynamics to a polygon.", outputStorage);
152 }
153 int itemNo = inputStorage.readInt();
154 if (itemNo != 5) {
155 return server.writeErrorStatusCmd(libsumo::CMD_SET_VEHICLE_VARIABLE, "Adding polygon dynamics needs four parameters.", outputStorage);
156 }
157
158 std::string trackedID;
159 if (!server.readTypeCheckingString(inputStorage, trackedID)) {
160 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The first parameter for adding polygon dynamics must be ID of the tracked object as a string ('' to disregard tracking).", outputStorage);
161 }
162
163 std::vector<double> timeSpan;
164 if (!server.readTypeCheckingDoubleList(inputStorage, timeSpan)) {
165 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The second parameter for adding polygon dynamics must be the timespan of the animation (length=0 to disregard animation).", outputStorage);
166 }
167
168 std::vector<double> alphaSpan;
169 if (!server.readTypeCheckingDoubleList(inputStorage, alphaSpan)) {
170 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The third parameter for adding polygon dynamics must be the alphaSpanStr of the animation (length=0 to disregard alpha animation).", outputStorage);
171 }
172
173 int looped;
174 if (!server.readTypeCheckingUnsignedByte(inputStorage, looped)) {
175 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The fourth parameter for adding polygon dynamics must be boolean indicating whether the animation should be looped.", outputStorage);
176 }
177
178 int rotate;
179 if (!server.readTypeCheckingUnsignedByte(inputStorage, rotate)) {
180 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The fifth parameter for adding polygon dynamics must be boolean indicating whether the tracking polygon should be rotated.", outputStorage);
181 }
182
183 libsumo::Polygon::addDynamics(id, trackedID, timeSpan, alphaSpan, looped != 0, rotate != 0);
184 }
185 break;
186 case libsumo::REMOVE: {
187 // !!! layer not used yet (shouldn't the id be enough?)
188 libsumo::Polygon::remove(id, StoHelp::readTypedInt(inputStorage, "The layer must be given using an int."));
189 }
190 break;
192 if (inputStorage.readUnsignedByte() != libsumo::TYPE_COMPOUND) {
193 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "A compound object is needed for setting a parameter.", outputStorage);
194 }
195 //readt itemNo
196 inputStorage.readInt();
197 std::string name;
198 if (!server.readTypeCheckingString(inputStorage, name)) {
199 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The name of the parameter must be given as a string.", outputStorage);
200 }
201 std::string value;
202 if (!server.readTypeCheckingString(inputStorage, value)) {
203 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, "The value of the parameter must be given as a string.", outputStorage);
204 }
205 libsumo::Polygon::setParameter(id, name, value);
206
207 }
208 break;
209 default:
210 break;
211 }
212 } catch (libsumo::TraCIException& e) {
213 return server.writeErrorStatusCmd(libsumo::CMD_SET_POLYGON_VARIABLE, e.what(), outputStorage);
214 }
216 return true;
217}
218
219
220/****************************************************************************/
std::string toHex(const T i, std::streamsize numDigits=0)
Definition ToString.h:56
A list of positions.
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc8: Change Polygon State)
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa8: Get Polygon 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.
bool readTypeCheckingString(tcpip::Storage &inputStorage, std::string &into)
Reads the value type and a string, verifying the type.
tcpip::Storage & getWrapperStorage()
bool readTypeCheckingUnsignedByte(tcpip::Storage &inputStorage, int &into)
Reads the value type and an unsigned byte, verifying the type.
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.
bool readTypeCheckingDoubleList(tcpip::Storage &inputStorage, std::vector< double > &into)
Reads the value type and a double list, verifying the type.
bool readTypeCheckingDouble(tcpip::Storage &inputStorage, double &into)
Reads the value type and a double, verifying the type.
void writeResponseWithLength(tcpip::Storage &outputStorage, tcpip::Storage &tempMsg)
bool readTypeCheckingPolygon(tcpip::Storage &inputStorage, PositionVector &into)
Reads the value type and a polygon, verifying the type.
bool readTypeCheckingColor(tcpip::Storage &inputStorage, libsumo::TraCIColor &into)
Reads the value type and a color, verifying the type.
static TraCIPositionVector makeTraCIPositionVector(const PositionVector &positionVector)
helper functions
Definition Helper.cpp:353
static int readTypedInt(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
virtual int readInt()
Definition storage.cpp:311
TRACI_CONST int RESPONSE_GET_POLYGON_VARIABLE
TRACI_CONST int VAR_TYPE
TRACI_CONST int TYPE_COMPOUND
TRACI_CONST int VAR_MOVE_TO
TRACI_CONST int CMD_SET_POLYGON_VARIABLE
TRACI_CONST int VAR_COLOR
TRACI_CONST int VAR_WIDTH
TRACI_CONST int CMD_SET_VEHICLE_VARIABLE
TRACI_CONST int VAR_SHAPE
TRACI_CONST int VAR_PARAMETER
TRACI_CONST int REMOVE
TRACI_CONST int VAR_ADD_DYNAMICS
TRACI_CONST int CMD_GET_POLYGON_VARIABLE
TRACI_CONST int VAR_FILL
TRACI_CONST int RTYPE_OK
TRACI_CONST int ADD
A list of positions.
Definition TraCIDefs.h:240