Eclipse SUMO - Simulation of Urban MObility
TraCIServer.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3// Copyright (C) 2001-2022 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/****************************************************************************/
26// TraCI server used to control sumo by a remote TraCI client
27/****************************************************************************/
28#pragma once
29#include <config.h>
30
31#include <map>
32#include <string>
33#include <set>
34
35#define BUILD_TCPIP
41#include <utils/geom/Boundary.h>
42#include <utils/geom/Position.h>
45#include <microsim/MSNet.h>
49#include <libsumo/TraCIDefs.h>
50#include "TraCIServerAPI_Lane.h"
51
52
53// ===========================================================================
54// class definitions
55// ===========================================================================
60public:
62 typedef bool(*CmdExecutor)(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage);
63
65 return myTargetTime;
66 }
67
69 return myInstance;
70 }
71
74
78 static void openSocket(const std::map<int, CmdExecutor>& execs);
79
80
82 static void close();
83
84
88 static bool wasClosed();
90
91
96
98 void cleanup();
99
100
101 void vehicleStateChanged(const SUMOVehicle* const vehicle, MSNet::VehicleState to, const std::string& info = "");
102
103 void transportableStateChanged(const MSTransportable* const transportable, MSNet::TransportableState to, const std::string& info = "");
104
107
114 void writeStatusCmd(int commandId, int status, const std::string& description, tcpip::Storage& outputStorage);
115
116
122 void writeStatusCmd(int commandId, int status, const std::string& description);
123
124
130 bool writeErrorStatusCmd(int commandId, const std::string& description, tcpip::Storage& outputStorage);
132
133
134
135 const std::map<MSNet::VehicleState, std::vector<std::string> >& getVehicleStateChanges() const {
136 if (myCurrentSocket == mySockets.end()) {
137 // Requested in context of a subscription update
139 } else {
140 // Requested in the context of a custom query by active client
141 return myCurrentSocket->second->vehicleStateChanges;
142 }
143 }
144
145 const std::map<MSNet::TransportableState, std::vector<std::string> >& getTransportableStateChanges() const {
146 if (myCurrentSocket == mySockets.end()) {
147 // Requested in context of a subscription update
149 } else {
150 // Requested in the context of a custom query by active client
151 return myCurrentSocket->second->transportableStateChanges;
152 }
153 }
154
155 void writeResponseWithLength(tcpip::Storage& outputStorage, tcpip::Storage& tempMsg);
156
157 void writePositionVector(tcpip::Storage& outputStorage, const libsumo::TraCIPositionVector& shape);
158
159
162
169 bool readTypeCheckingInt(tcpip::Storage& inputStorage, int& into);
170
171
178 bool readTypeCheckingDouble(tcpip::Storage& inputStorage, double& into);
179
180
187 bool readTypeCheckingString(tcpip::Storage& inputStorage, std::string& into);
188
189
196 bool readTypeCheckingStringList(tcpip::Storage& inputStorage, std::vector<std::string>& into);
197
198
205 bool readTypeCheckingDoubleList(tcpip::Storage& inputStorage, std::vector<double>& into);
206
207
215
216
224
225
232 bool readTypeCheckingByte(tcpip::Storage& inputStorage, int& into);
233
234
241 bool readTypeCheckingUnsignedByte(tcpip::Storage& inputStorage, int& into);
242
243
250 bool readTypeCheckingPolygon(tcpip::Storage& inputStorage, PositionVector& into);
252
253
256 void stateLoaded(SUMOTime targetTime);
257
258 std::vector<std::string>& getLoadArgs() {
259 return myLoadArgs;
260 }
261
264 void initWrapper(const int domainID, const int variable, const std::string& objID);
265 bool wrapDouble(const std::string& objID, const int variable, const double value);
266 bool wrapInt(const std::string& objID, const int variable, const int value);
267 bool wrapString(const std::string& objID, const int variable, const std::string& value);
268 bool wrapStringList(const std::string& objID, const int variable, const std::vector<std::string>& value);
269 bool wrapDoubleList(const std::string& objID, const int variable, const std::vector<double>& value);
270 bool wrapPosition(const std::string& objID, const int variable, const libsumo::TraCIPosition& value);
271 bool wrapPositionVector(const std::string& objID, const int variable, const libsumo::TraCIPositionVector& value);
272 bool wrapColor(const std::string& objID, const int variable, const libsumo::TraCIColor& value);
273 bool wrapStringDoublePair(const std::string& objID, const int variable, const std::pair<std::string, double>& value);
274 bool wrapStringPair(const std::string& objID, const int variable, const std::pair<std::string, std::string>& value);
277
278
279private:
283 TraCIServer(const SUMOTime begin, const int port, const int numClients);
284
285
287 virtual ~TraCIServer();
288
289
290
291 struct SocketInfo {
292 public:
295 : targetTime(t), socket(socket) {}
298 delete socket;
299 }
305 std::map<MSNet::VehicleState, std::vector<std::string> > vehicleStateChanges;
307 std::map<MSNet::TransportableState, std::vector<std::string> > transportableStateChanges;
308 private:
310 };
311
314
318 bool commandGetVersion();
319
324
325
329 int readCommandID(int& commandStart, int& commandLength);
330
332 int dispatchCommand();
333
336 void checkClientOrdering();
337
340
342 SUMOTime nextTargetTime() const;
343
345 void sendOutputToAll() const;
346
349
351 std::map<int, SocketInfo*>::iterator removeCurrentSocket();
352
353
354private:
357
360
363 std::map<int, SocketInfo*> mySockets;
364
366 std::map<int, SocketInfo*> mySocketReorderRequests;
367
369 std::map<int, SocketInfo*>::iterator myCurrentSocket;
370
373
376
379
382
385
387 std::map<int, CmdExecutor> myExecutors;
388
390 std::set<std::pair<int, int>> myParameterized;
391
392 std::vector<std::string> myLoadArgs;
393
395 std::vector<libsumo::Subscription> mySubscriptions;
396
399
407 std::map<MSNet::VehicleState, std::vector<std::string> > myVehicleStateChanges;
408
416 std::map<MSNet::TransportableState, std::vector<std::string> > myTransportableStateChanges;
417
418private:
419 bool addObjectVariableSubscription(const int commandId, const bool hasContext);
421 void removeSubscription(int commandId, const std::string& identity, int domain);
423 std::string& errors);
424
425
427 void removeFilters();
428 void addSubscriptionFilterLanes(std::vector<int> lanes);
433 // TODO: for libsumo, implement convenience definitions present in python client:
434 // void addSubscriptionFilterCF();
435 // void addSubscriptionFilterLC(int direction);
436 void addSubscriptionFilterTurn(double dist);
438 void addSubscriptionFilterVType(std::set<std::string> vTypes);
443 void addSubscriptionFilterFieldOfVision(double openingAngle);
448 void addSubscriptionFilterLateralDistance(double dist);
449
451 bool centralObject(const libsumo::Subscription& s, const std::string& objID);
452
453
454private:
456 TraCIServer& operator=(const TraCIServer& s) = delete;
457
458};
459
460
long long int SUMOTime
Definition: GUI.h:36
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
Interface for objects listening to transportable state changes.
Definition: MSNet.h:695
Interface for objects listening to vehicle state changes.
Definition: MSNet.h:636
VehicleState
Definition of a vehicle state.
Definition: MSNet.h:603
TransportableState
Definition of a transportable state.
Definition: MSNet.h:680
A list of positions.
Representation of a vehicle.
Definition: SUMOVehicle.h:60
TraCI server used to control sumo by a remote TraCI client.
Definition: TraCIServer.h:59
bool(* CmdExecutor)(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Definition of a method to be called for serving an associated commandID.
Definition: TraCIServer.h:62
void addSubscriptionFilterDownstreamDistance(double dist)
static bool myDoCloseConnection
Whether the connection was set to be to close.
Definition: TraCIServer.h:359
bool wrapStringDoublePair(const std::string &objID, const int variable, const std::pair< std::string, double > &value)
tcpip::Storage myWrapperStorage
A temporary storage to let the wrapper write to.
Definition: TraCIServer.h:381
TraCIServer & operator=(const TraCIServer &s)=delete
Invalidated assignment operator.
std::map< int, SocketInfo * > mySockets
The socket connections to the clients the first component (index) determines the client's order (lowe...
Definition: TraCIServer.h:363
void addSubscriptionFilterLateralDistance(double dist)
Filter only vehicles within the given lateral distance.
void writeStatusCmd(int commandId, int status, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage.
static bool wasClosed()
check whether close was requested
void addSubscriptionFilterTurn(double dist)
bool centralObject(const libsumo::Subscription &s, const std::string &objID)
check whether a found objID refers to the central object of a context subscription
bool wrapPositionVector(const std::string &objID, const int variable, const libsumo::TraCIPositionVector &value)
void addSubscriptionFilterVType(std::set< std::string > vTypes)
bool readTypeCheckingString(tcpip::Storage &inputStorage, std::string &into)
Reads the value type and a string, verifying the type.
bool wrapInt(const std::string &objID, const int variable, const int value)
bool readTypeCheckingByte(tcpip::Storage &inputStorage, int &into)
Reads the value type and a byte, verifying the type.
std::map< int, SocketInfo * >::iterator removeCurrentSocket()
removes myCurrentSocket from mySockets and returns an iterator pointing to the next member according ...
tcpip::Storage myOutputStorage
The storage to write to.
Definition: TraCIServer.h:378
bool addObjectVariableSubscription(const int commandId, const bool hasContext)
void addSubscriptionFilterUpstreamDistance(double dist)
SUMOTime getTargetTime() const
Definition: TraCIServer.h:64
void stateLoaded(SUMOTime targetTime)
updates myTargetTime and resets vehicle state changes after loading a simulation state
void addSubscriptionFilterLeadFollow()
void addSubscriptionFilterNoOpposite()
tcpip::Storage & getWrapperStorage()
SUMOTime nextTargetTime() const
get the minimal next target time among all clients
std::map< MSNet::TransportableState, std::vector< std::string > > myTransportableStateChanges
Changes in the states of simulated transportables.
Definition: TraCIServer.h:416
void removeSubscription(int commandId, const std::string &identity, int domain)
bool wrapDouble(const std::string &objID, const int variable, const double value)
tcpip::Storage mySubscriptionCache
The last timestep's subscription results.
Definition: TraCIServer.h:384
bool readTypeCheckingUnsignedByte(tcpip::Storage &inputStorage, int &into)
Reads the value type and an unsigned byte, verifying the type.
bool wrapColor(const std::string &objID, const int variable, const libsumo::TraCIColor &value)
bool wrapString(const std::string &objID, const int variable, const std::string &value)
int dispatchCommand()
Handles command, writes response to myOutputStorage.
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.
static TraCIServer * getInstance()
Definition: TraCIServer.h:68
bool wrapDoubleList(const std::string &objID, const int variable, const std::vector< double > &value)
void checkClientOrdering()
Called once after connection of all clients for executing SET_ORDER (and possibly prior GET_VERSION) ...
bool readTypeCheckingPosition2D(tcpip::Storage &inputStorage, libsumo::TraCIPosition &into)
Reads the value type and a 2D position, verifying the type.
void processReorderingRequests()
checks for and processes reordering requests (relevant for multiple clients)
void sendOutputToAll() const
send out subscription results (actually just the content of myOutputStorage) to clients which will ac...
std::vector< std::string > & getLoadArgs()
Definition: TraCIServer.h:258
void cleanup()
clean up subscriptions
static void close()
request termination of connection
void processCommandsUntilSimStep(SUMOTime step)
process all commands until the next SUMO simulation step. It is guaranteed that t->getTargetTime() >=...
void postProcessSimulationStep()
Handles subscriptions to send after a simstep2 command.
bool readTypeCheckingInt(tcpip::Storage &inputStorage, int &into)
Reads the value type and an int, verifying the type.
bool commandGetVersion()
Returns the TraCI-version.
bool wrapPosition(const std::string &objID, const int variable, const libsumo::TraCIPosition &value)
static void openSocket(const std::map< int, CmdExecutor > &execs)
Initialises the server.
std::vector< std::string > myLoadArgs
Definition: TraCIServer.h:392
void removeFilters()
void addSubscriptionFilterLanes(std::vector< int > lanes)
bool readTypeCheckingDoubleList(tcpip::Storage &inputStorage, std::vector< double > &into)
Reads the value type and a double list, verifying the type.
bool readTypeCheckingStringList(tcpip::Storage &inputStorage, std::vector< std::string > &into)
Reads the value type and a string list, verifying the type.
SUMOTime myTargetTime
The time step to reach until processing the next commands.
Definition: TraCIServer.h:372
virtual ~TraCIServer()
Destructor.
bool readTypeCheckingDouble(tcpip::Storage &inputStorage, double &into)
Reads the value type and a double, verifying the type.
void writePositionVector(tcpip::Storage &outputStorage, const libsumo::TraCIPositionVector &shape)
bool wrapStringPair(const std::string &objID, const int variable, const std::pair< std::string, std::string > &value)
std::map< MSNet::VehicleState, std::vector< std::string > > myVehicleStateChanges
Changes in the states of simulated vehicles.
Definition: TraCIServer.h:407
int readCommandID(int &commandStart, int &commandLength)
Reads the next command ID from the input storage.
void sendSingleSimStepResponse()
sends an empty response to a simstep command to the current client. (This applies to a situation wher...
std::map< int, CmdExecutor > myExecutors
Map of commandIds -> their executors; applicable if the executor applies to the method footprint.
Definition: TraCIServer.h:387
std::vector< libsumo::Subscription > mySubscriptions
The list of known, still valid subscriptions.
Definition: TraCIServer.h:395
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
void writeResponseWithLength(tcpip::Storage &outputStorage, tcpip::Storage &tempMsg)
TraCIServer(const SUMOTime begin, const int port, const int numClients)
Constructor.
const std::map< MSNet::VehicleState, std::vector< std::string > > & getVehicleStateChanges() const
Definition: TraCIServer.h:135
tcpip::Storage myInputStorage
The storage to read from.
Definition: TraCIServer.h:375
libsumo::Subscription * myLastContextSubscription
The last modified context subscription (the one to add a filter to, see @addSubscriptionFilter(),...
Definition: TraCIServer.h:398
std::map< int, SocketInfo * >::iterator myCurrentSocket
The currently active client socket.
Definition: TraCIServer.h:369
void addSubscriptionFilterVClass(SVCPermissions vClasses)
static TraCIServer * myInstance
Singleton instance of the server.
Definition: TraCIServer.h:356
std::map< int, SocketInfo * > mySocketReorderRequests
This stores the setOrder(int) requests of the clients.
Definition: TraCIServer.h:366
bool addSubscriptionFilter()
std::set< std::pair< int, int > > myParameterized
Set of variables which have parameters.
Definition: TraCIServer.h:390
void transportableStateChanged(const MSTransportable *const transportable, MSNet::TransportableState to, const std::string &info="")
Called if a transportable changes its state.
bool processSingleSubscription(const libsumo::Subscription &s, tcpip::Storage &writeInto, std::string &errors)
void initialiseSubscription(libsumo::Subscription &s)
bool readTypeCheckingPolygon(tcpip::Storage &inputStorage, PositionVector &into)
Reads the value type and a polygon, verifying the type.
void addSubscriptionFilterFieldOfVision(double openingAngle)
Filter only vehicles within field of vision.
bool wrapStringList(const std::string &objID, const int variable, const std::vector< std::string > &value)
bool readTypeCheckingColor(tcpip::Storage &inputStorage, libsumo::TraCIColor &into)
Reads the value type and a color, verifying the type.
const std::map< MSNet::TransportableState, std::vector< std::string > > & getTransportableStateChanges() const
Definition: TraCIServer.h:145
Representation of a subscription.
Definition: Subscription.h:69
SocketInfo(const SocketInfo &)
std::map< MSNet::VehicleState, std::vector< std::string > > vehicleStateChanges
container for vehicle state changes since last step taken by this client
Definition: TraCIServer.h:305
SocketInfo(tcpip::Socket *socket, SUMOTime t)
constructor
Definition: TraCIServer.h:294
tcpip::Socket * socket
Socket object for this client.
Definition: TraCIServer.h:303
SUMOTime targetTime
Target time: next point of action for the client.
Definition: TraCIServer.h:301
std::map< MSNet::TransportableState, std::vector< std::string > > transportableStateChanges
container for transportable state changes since last step taken by this client
Definition: TraCIServer.h:307
A 3D-position.
Definition: TraCIDefs.h:172
A list of positions.
Definition: TraCIDefs.h:215