Eclipse SUMO - Simulation of Urban MObility
Connection.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3// Copyright (C) 2012-2023 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/****************************************************************************/
20// C++ TraCI client API implementation
21/****************************************************************************/
22#pragma once
23#include <config.h>
24
25#include <vector>
26#include <map>
27#include <limits>
28#include <string>
29#include <sstream>
30#include <iomanip>
31#include <thread>
32#include <mutex>
35
36
37// ===========================================================================
38// global definitions
39// ===========================================================================
40#define PRECISION 2
41
42
43// ===========================================================================
44// class definitions
45// ===========================================================================
46namespace libtraci {
52public:
53 static void connect(const std::string& host, int port, int numRetries, const std::string& label, FILE* const pipe) {
54 myConnections[label] = new Connection(host, port, numRetries, label, pipe);
55 }
56
58 return *myActive;
59 }
60
61 static bool isActive() {
62 return myActive != nullptr;
63 }
64
65 static void switchCon(const std::string& label) {
66 myActive = myConnections.find(label)->second;
67 }
68
69 const std::string& getLabel() const {
70 return myLabel;
71 }
72
73 std::mutex& getMutex() const {
74 return myMutex;
75 }
76
78 void close();
79
81 return mySubscriptionResults[domain];
82 }
83
85 return myContextSubscriptionResults[domain];
86 }
87
90
93 void simulationStep(double time);
94
95
98 void setOrder(int order);
99
107 void createCommand(int cmdID, int varID, const std::string* const objID, tcpip::Storage* add = nullptr) const;
108
109
120 void subscribe(int domID, const std::string& objID, double beginTime, double endTime,
121 int domain, double range, const std::vector<int>& vars, const libsumo::TraCIResults& params);
123
124
125 tcpip::Storage& doCommand(int command, int var = -1, const std::string& id = "", tcpip::Storage* add = nullptr, int expectedType = -1);
126 void addFilter(int var, tcpip::Storage* add = nullptr);
127
128 void readVariableSubscription(int responseID, tcpip::Storage& inMsg);
129 void readContextSubscription(int responseID, tcpip::Storage& inMsg);
130 void readVariables(tcpip::Storage& inMsg, const std::string& objectID, int variableCount, libsumo::SubscriptionResults& into);
131
132private:
139 void check_resultState(tcpip::Storage& inMsg, int command, bool ignoreCommandId = false, std::string* acknowledgement = 0);
140
144 int check_commandGetResult(tcpip::Storage& inMsg, int command, int expectedType = -1, bool ignoreCommandId = false) const;
145
146 template <class T>
147 static inline std::string toString(const T& t, std::streamsize accuracy = PRECISION) {
148 std::ostringstream oss;
149 oss.setf(std::ios::fixed, std::ios::floatfield);
150 oss << std::setprecision(accuracy);
151 oss << t;
152 return oss.str();
153 }
154
155 template<typename T>
156 inline std::string toHex(const T i, std::streamsize numDigits = 2) {
157 // inspired by http://stackoverflow.com/questions/5100718/int-to-hex-string-in-c
158 std::stringstream stream;
159 stream << "0x" << std::setfill('0') << std::setw(numDigits == 0 ? sizeof(T) * 2 : numDigits) << std::hex << i;
160 return stream.str();
161 }
162
163 void readOutput();
164
170 Connection(const std::string& host, int port, int numRetries, const std::string& label, FILE* const pipe);
171
172private:
173 const std::string myLabel;
174 FILE* const myProcessPipe;
175 std::thread* myProcessReader;
182
183 mutable std::mutex myMutex;
184
185 std::map<int, libsumo::SubscriptionResults> mySubscriptionResults;
186 std::map<int, libsumo::ContextSubscriptionResults> myContextSubscriptionResults;
187
189 static std::map<const std::string, Connection*> myConnections;
190
191private:
194
195};
196
197}
#define PRECISION
Definition: Connection.h:40
C++ TraCI client API implementation.
Definition: Connection.h:51
void simulationStep(double time)
Sends a SimulationStep command.
Definition: Connection.cpp:120
static void connect(const std::string &host, int port, int numRetries, const std::string &label, FILE *const pipe)
Definition: Connection.h:53
Connection(const std::string &host, int port, int numRetries, const std::string &label, FILE *const pipe)
Constructor, connects to the specified SUMO server.
Definition: Connection.cpp:44
static bool isActive()
Definition: Connection.h:61
void close()
ends the simulation and closes the connection
Definition: Connection.cpp:88
void createCommand(int cmdID, int varID, const std::string *const objID, tcpip::Storage *add=nullptr) const
Sends a GetVariable / SetVariable request if mySocket is connected. Otherwise writes to myOutput only...
Definition: Connection.cpp:166
int check_commandGetResult(tcpip::Storage &inMsg, int command, int expectedType=-1, bool ignoreCommandId=false) const
Validates the result state of a command.
Definition: Connection.cpp:305
static Connection & getActive()
Definition: Connection.h:57
void addFilter(int var, tcpip::Storage *add=nullptr)
Definition: Connection.cpp:341
void readVariableSubscription(int responseID, tcpip::Storage &inMsg)
Definition: Connection.cpp:438
libsumo::ContextSubscriptionResults & getAllContextSubscriptionResults(const int domain)
Definition: Connection.h:84
tcpip::Socket mySocket
The socket.
Definition: Connection.h:177
std::map< int, libsumo::SubscriptionResults > mySubscriptionResults
Definition: Connection.h:185
void check_resultState(tcpip::Storage &inMsg, int command, bool ignoreCommandId=false, std::string *acknowledgement=0)
Validates the result state of a command.
Definition: Connection.cpp:266
std::mutex & getMutex() const
Definition: Connection.h:73
tcpip::Storage myInput
The reusable input storage.
Definition: Connection.h:181
FILE *const myProcessPipe
Definition: Connection.h:174
void readVariables(tcpip::Storage &inMsg, const std::string &objectID, int variableCount, libsumo::SubscriptionResults &into)
Definition: Connection.cpp:351
std::mutex myMutex
Definition: Connection.h:183
std::map< int, libsumo::ContextSubscriptionResults > myContextSubscriptionResults
Definition: Connection.h:186
tcpip::Storage myOutput
The reusable output storage.
Definition: Connection.h:179
Connection & operator=(const Connection &)
Invalidated assignment operator.
void setOrder(int order)
Sends a SetOrder command.
Definition: Connection.cpp:149
libsumo::SubscriptionResults getAllSubscriptionResults(const int domain)
Definition: Connection.h:80
void subscribe(int domID, const std::string &objID, double beginTime, double endTime, int domain, double range, const std::vector< int > &vars, const libsumo::TraCIResults &params)
Sends a SubscribeContext or a SubscribeVariable request.
Definition: Connection.cpp:203
static std::map< const std::string, Connection * > myConnections
Definition: Connection.h:189
const std::string myLabel
Definition: Connection.h:173
void readContextSubscription(int responseID, tcpip::Storage &inMsg)
Definition: Connection.cpp:446
tcpip::Storage & doCommand(int command, int var=-1, const std::string &id="", tcpip::Storage *add=nullptr, int expectedType=-1)
Definition: Connection.cpp:328
static Connection * myActive
Definition: Connection.h:188
static std::string toString(const T &t, std::streamsize accuracy=PRECISION)
Definition: Connection.h:147
std::thread * myProcessReader
Definition: Connection.h:175
static void switchCon(const std::string &label)
Definition: Connection.h:65
const std::string & getLabel() const
Definition: Connection.h:69
std::string toHex(const T i, std::streamsize numDigits=2)
Definition: Connection.h:156
std::map< std::string, libsumo::SubscriptionResults > ContextSubscriptionResults
Definition: TraCIDefs.h:338
std::map< std::string, libsumo::TraCIResults > SubscriptionResults
{object->{variable->value}}
Definition: TraCIDefs.h:337
std::map< int, std::shared_ptr< libsumo::TraCIResult > > TraCIResults
{variable->value}
Definition: TraCIDefs.h:335