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.dev/sumo
3 // Copyright (C) 2001-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 /****************************************************************************/
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
36 #include <foreign/tcpip/socket.h>
37 #include <foreign/tcpip/storage.h>
39 #include <utils/common/SUMOTime.h>
40 #include <utils/common/ToString.h>
41 #include <utils/geom/Boundary.h>
42 #include <utils/geom/Position.h>
43 #include <utils/geom/GeomHelper.h>
45 #include <microsim/MSNet.h>
47 #include <libsumo/TraCIConstants.h>
48 #include <libsumo/Subscription.h>
49 #include <libsumo/TraCIDefs.h>
50 #include "TraCIServerAPI_Lane.h"
51 
52 
53 // ===========================================================================
54 // class definitions
55 // ===========================================================================
60 public:
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 
95  int processCommands(const SUMOTime step, const bool afterMove = false);
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
138  return myVehicleStateChanges;
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 
214  bool readTypeCheckingColor(tcpip::Storage& inputStorage, libsumo::TraCIColor& into);
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 
279 private:
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  }
303  bool executeMove = false;
307  std::map<MSNet::VehicleState, std::vector<std::string> > vehicleStateChanges;
309  std::map<MSNet::TransportableState, std::vector<std::string> > transportableStateChanges;
310  private:
312  };
313 
316 
320  bool commandGetVersion();
321 
326 
327 
331  int readCommandID(int& commandStart, int& commandLength);
332 
334  int dispatchCommand();
335 
338  void checkClientOrdering();
339 
342 
344  SUMOTime nextTargetTime() const;
345 
347  void sendOutputToAll() const;
348 
351 
353  std::map<int, SocketInfo*>::iterator removeCurrentSocket();
354 
355 
356 private:
359 
361  static bool myDoCloseConnection;
362 
365  std::map<int, SocketInfo*> mySockets;
366 
368  std::map<int, SocketInfo*> mySocketReorderRequests;
369 
371  std::map<int, SocketInfo*>::iterator myCurrentSocket;
372 
375 
378 
381 
384 
387 
389  std::map<int, CmdExecutor> myExecutors;
390 
392  std::set<std::pair<int, int>> myParameterized;
393 
394  std::vector<std::string> myLoadArgs;
395 
397  std::vector<libsumo::Subscription> mySubscriptions;
398 
401 
409  std::map<MSNet::VehicleState, std::vector<std::string> > myVehicleStateChanges;
410 
418  std::map<MSNet::TransportableState, std::vector<std::string> > myTransportableStateChanges;
419 
420 private:
421  bool addObjectVariableSubscription(const int commandId, const bool hasContext);
423  void removeSubscription(int commandId, const std::string& identity, int domain);
425  std::string& errors);
426 
427 
428  bool addSubscriptionFilter();
429  void removeFilters();
430  void addSubscriptionFilterLanes(std::vector<int> lanes);
432  void addSubscriptionFilterDownstreamDistance(double dist);
433  void addSubscriptionFilterUpstreamDistance(double dist);
435  // TODO: for libsumo, implement convenience definitions present in python client:
436  // void addSubscriptionFilterCF();
437  // void addSubscriptionFilterLC(int direction);
438  void addSubscriptionFilterTurn(double dist);
440  void addSubscriptionFilterVType(std::set<std::string> vTypes);
445  void addSubscriptionFilterFieldOfVision(double openingAngle);
450  void addSubscriptionFilterLateralDistance(double dist);
451 
453  bool centralObject(const libsumo::Subscription& s, const std::string& objID);
454 
455 
456 private:
458  TraCIServer& operator=(const TraCIServer& s) = delete;
459 
460 };
long long int SUMOTime
Definition: GUI.h:35
long long 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:694
Interface for objects listening to vehicle state changes.
Definition: MSNet.h:635
VehicleState
Definition of a vehicle state.
Definition: MSNet.h:602
TransportableState
Definition of a transportable state.
Definition: MSNet.h:679
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:361
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:383
std::map< int, SocketInfo * > mySockets
The socket connections to the clients the first component (index) determines the client's order (lowe...
Definition: TraCIServer.h:365
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)
TraCIServer & operator=(const TraCIServer &s)=delete
Invalidated assignment operator.
bool centralObject(const libsumo::Subscription &s, const std::string &objID)
check whether a found objID refers to the central object of a context subscription
std::map< int, SocketInfo * >::iterator myCurrentSocket
The currently active client socket.
Definition: TraCIServer.h:371
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:380
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:418
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:386
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)
std::vector< std::string > & getLoadArgs()
Definition: TraCIServer.h:258
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.
const std::map< MSNet::TransportableState, std::vector< std::string > > & getTransportableStateChanges() const
Definition: TraCIServer.h:145
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...
void cleanup()
clean up subscriptions
static void close()
request termination of connection
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:394
void removeFilters()
static TraCIServer * getInstance()
Definition: TraCIServer.h:68
void addSubscriptionFilterLanes(std::vector< int > lanes)
int processCommands(const SUMOTime step, const bool afterMove=false)
process all commands until the next SUMO simulation step. It is guaranteed that t->getTargetTime() >=...
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:374
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:409
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:389
std::vector< libsumo::Subscription > mySubscriptions
The list of known, still valid subscriptions.
Definition: TraCIServer.h:397
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.
tcpip::Storage myInputStorage
The storage to read from.
Definition: TraCIServer.h:377
const std::map< MSNet::VehicleState, std::vector< std::string > > & getVehicleStateChanges() const
Definition: TraCIServer.h:135
libsumo::Subscription * myLastContextSubscription
The last modified context subscription (the one to add a filter to, see @addSubscriptionFilter(),...
Definition: TraCIServer.h:400
void addSubscriptionFilterVClass(SVCPermissions vClasses)
static TraCIServer * myInstance
Singleton instance of the server.
Definition: TraCIServer.h:358
std::map< int, SocketInfo * > mySocketReorderRequests
This stores the setOrder(int) requests of the clients.
Definition: TraCIServer.h:368
bool addSubscriptionFilter()
std::set< std::pair< int, int > > myParameterized
Set of variables which have parameters.
Definition: TraCIServer.h:392
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.
Representation of a subscription.
Definition: Subscription.h:70
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:307
bool executeMove
whether a "half step" has been done, executing only the move
Definition: TraCIServer.h:303
SocketInfo(tcpip::Socket *socket, SUMOTime t)
constructor
Definition: TraCIServer.h:294
tcpip::Socket * socket
Socket object for this client.
Definition: TraCIServer.h:305
SUMOTime targetTime
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:309
A 2D or 3D-position, for 2D positions z == INVALID_DOUBLE_VALUE.
Definition: TraCIDefs.h:178
A list of positions.
Definition: TraCIDefs.h:234