183 #ifdef DEBUG_MULTI_CLIENTS 184 std::cout <<
"Creating new TraCIServer for " << numClients <<
" clients on port " << port <<
"." << std::endl;
231 WRITE_WARNING(
"Starting TraCI without using internal lanes!");
239 if (numClients > 1) {
242 while ((
int)
mySockets.size() < numClients) {
257 if (numClients > 1) {
262 if (numClients > 1) {
289 for (std::map<int, CmdExecutor>::const_iterator i = execs.begin(); i != execs.end(); ++i) {
325 for (std::map<int, SocketInfo*>::iterator i =
mySockets.begin(); i !=
mySockets.end(); ++i) {
326 i->second->vehicleStateChanges[to].push_back(vehicle->
getID());
334 #ifdef DEBUG_MULTI_CLIENTS 335 std::cout <<
"Checking client order requests." << std::endl;
341 #ifdef DEBUG_MULTI_CLIENTS 342 std::cout <<
" Socket " <<
myCurrentSocket->second->socket <<
":" << std::endl;
346 #pragma warning(push) 347 #pragma warning(disable: 4127) // do not warn about constant conditional expression 355 int commandStart, commandLength;
357 #ifdef DEBUG_MULTI_CLIENTS 358 std::cout <<
" received command " << commandId << std::endl;
364 #ifdef DEBUG_MULTI_CLIENTS 365 std::cout <<
" Init command. Sending response." << std::endl;
384 #ifdef DEBUG_MULTI_CLIENTS 385 std::cout <<
" Client " <<
myCurrentSocket->second->socket <<
" did not set order initially." << std::endl;
387 throw ProcessError(
"Execution order (libsumo::CMD_SETORDER) was not set for all TraCI clients in pre-execution phase.");
405 std::map<int, SocketInfo*>::iterator j;
406 #ifdef DEBUG_MULTI_CLIENTS 407 std::cout <<
SIMTIME <<
" Current socket ordering:\n";
409 std::cout <<
" " << j->first <<
": " << j->second->socket <<
"\n";
411 std::cout <<
"Reordering requests:\n";
413 std::cout <<
" Socket " << i->second->socket <<
" -> " << i->first <<
"\n";
420 if (j->second->socket == i->second->socket) {
432 #ifdef DEBUG_MULTI_CLIENTS 433 std::cout <<
"New socket ordering:\n";
435 std::cout <<
" " << j->first <<
": " << j->second->socket <<
"\n";
437 std::cout << std::endl;
445 #ifdef DEBUG_MULTI_CLIENTS 446 std::cout <<
"\n Determining new target time..." << std::endl;
448 std::cout <<
" All clients have disconnected." << std::endl;
451 std::map<int, SocketInfo*>::const_iterator i;
452 SUMOTime targetTime = std::numeric_limits<SUMOTime>::max();
454 #ifdef DEBUG_MULTI_CLIENTS 455 std::cout <<
" target time for client " << i->second->socket <<
": " << i->second->targetTime <<
"\n";
457 targetTime =
MIN2(targetTime, i->second->targetTime);
459 #ifdef DEBUG_MULTI_CLIENTS 460 std::cout << std::endl;
469 #ifdef DEBUG_MULTI_CLIENTS 470 std::cout <<
"\n Sending subscription results to clients:\n";
472 std::map<int, SocketInfo*>::const_iterator i =
mySockets.begin();
477 #ifdef DEBUG_MULTI_CLIENTS 478 std::cout << i->second->socket <<
"\n";
483 #ifdef DEBUG_MULTI_CLIENTS 484 std::cout << std::endl;
491 #ifdef DEBUG_MULTI_CLIENTS 492 std::cout <<
SIMTIME <<
" processCommandsUntilSimStep(step = " << step <<
"):\n" << std::endl;
511 #ifdef DEBUG_MULTI_CLIENTS 513 std::cout <<
" next target time is larger than next SUMO simstep (" << step <<
"). Returning from processCommandsUntilSimStep()." << std::endl;
525 #ifdef DEBUG_MULTI_CLIENTS 526 std::cout <<
" Next target time: " <<
myTargetTime << std::endl;
531 #ifdef DEBUG_MULTI_CLIENTS 539 #ifdef DEBUG_MULTI_CLIENTS 541 <<
" with target time " <<
myCurrentSocket->second->targetTime << std::endl;
549 while (!done && !closed && !load) {
553 #ifdef DEBUG_MULTI_CLIENTS 554 std::cout <<
" sending response..." << std::endl;
560 #ifdef DEBUG_MULTI_CLIENTS 561 std::cout <<
" No input and no output stored (This is the next client)." << std::endl;
564 #ifdef DEBUG_MULTI_CLIENTS 565 std::cout <<
" resetting input storage and reading next command..." << std::endl;
575 #ifdef DEBUG_MULTI_CLIENTS 576 std::cout <<
" Received command " << cmd << std::endl;
579 #ifdef DEBUG_MULTI_CLIENTS 580 std::cout <<
" Received command SIM_STEP, end turn for client " <<
myCurrentSocket->second->socket << std::endl;
584 #ifdef DEBUG_MULTI_CLIENTS 585 std::cout <<
" Received command LOAD." << std::endl;
589 #ifdef DEBUG_MULTI_CLIENTS 590 std::cout <<
" Received command CLOSE." << std::endl;
613 #ifdef DEBUG_MULTI_CLIENTS 614 std::cout <<
" Breaking loop to load new simulation." << std::endl;
618 #ifdef DEBUG_MULTI_CLIENTS 619 std::cout <<
" Breaking loop because last client closed connection." << std::endl;
637 }
catch (std::invalid_argument& e) {
657 std::map<MSNet::VehicleState, std::vector<std::string> >::iterator i;
665 std::map<int, TraCIServer::SocketInfo*>::iterator
667 #ifdef DEBUG_MULTI_CLIENTS 699 if (commandLength == 0) {
702 #ifdef DEBUG_RAW_INPUT 703 std::cout <<
" commandStart=" << commandStart <<
" commandLength=" << commandLength <<
" pos=" <<
myInputStorage.
position() <<
" raw=";
705 std::cout << (int)*it <<
" ";
715 int commandStart, commandLength;
717 #ifdef DEBUG_MULTI_CLIENTS 718 std::cout <<
" dispatchCommand() called for client " <<
myCurrentSocket->second->socket
719 <<
", commandId = " << commandId << std::endl;
721 bool success =
false;
731 std::vector<std::string> args;
735 #ifdef DEBUG_MULTI_CLIENTS 736 std::cout <<
" commandId == libsumo::CMD_LOAD" 737 <<
", args = " <<
toString(args) << std::endl;
759 #ifdef DEBUG_MULTI_CLIENTS 760 std::cout <<
" commandId == libsumo::CMD_SIMSTEP" 761 <<
", next target time for client is " <<
myCurrentSocket->second->targetTime << std::endl;
782 #ifdef DEBUG_MULTI_CLIENTS 783 std::cout <<
" commandId == libsumo::CMD_SETORDER" 784 <<
", order index is " << order << std::endl;
849 std::ostringstream msg;
850 msg <<
"Wrong position in requestMessage after dispatching command " << commandId <<
".";
851 msg <<
" Expected command length was " << commandLength;
867 answerTmp.
writeString(std::string(
"SUMO ") + sumoVersion);
883 #ifdef DEBUG_MULTI_CLIENTS 884 std::cout <<
" postProcessSimulationStep() at time " << t << std::endl;
893 if ((s.
endTime < t) || isArrivedVehicle || isArrivedPerson) {
904 #ifdef DEBUG_SUBSCRIPTIONS 906 <<
"\n Nr. of active subscriptions = " << noActive << std::endl;
909 #ifdef DEBUG_SUBSCRIPTIONS 921 #ifdef DEBUG_SUBSCRIPTIONS 922 std::cout <<
" Size of into-store for subscription " << s.
id 923 <<
": " << into.
size() << std::endl;
933 #ifdef DEBUG_SUBSCRIPTIONS 941 #ifdef DEBUG_MULTI_CLIENTS 942 std::cout <<
" Sending cached simstep response to current client " <<
myCurrentSocket->second->socket
943 <<
" (-> intermediate TraCI step)." 969 WRITE_ERROR(
"Answered with error to command " +
toHex(commandId, 2) +
": " + description);
971 WRITE_ERROR(
"Requested command not implemented (" +
toHex(commandId, 2) +
"): " + description);
973 outputStorage.
writeUnsignedByte(1 + 1 + 1 + 4 + static_cast<int>(description.length()));
996 bool needNewSubscription =
true;
1001 std::vector<std::vector<unsigned char> >::const_iterator k = s.
parameters.begin();
1002 for (std::vector<int>::const_iterator j = s.
variables.begin(); j != s.
variables.end(); ++j, ++k) {
1003 const int offset = (int)(std::find(o.variables.begin(), o.variables.end(), *j) - o.variables.begin());
1004 if (offset == (
int)o.variables.size() || o.parameters[offset] != *k) {
1005 o.variables.push_back(*j);
1006 o.parameters.push_back(*k);
1009 needNewSubscription =
false;
1010 modifiedSubscription = &o;
1014 if (needNewSubscription) {
1015 mySubscriptions.push_back(s);
1016 modifiedSubscription = &mySubscriptions.back();
1050 std::vector<libsumo::Subscription>::iterator j;
1052 if (j->id ==
id && j->commandId == commandId && (domain < 0 || j->contextDomain == domain)) {
1079 std::string& errors) {
1083 std::set<std::string> objIDs;
1092 objIDs.insert(s.
id);
1096 for (std::set<std::string>::iterator j = objIDs.begin(); j != objIDs.end(); ++j) {
1105 std::vector<std::vector<unsigned char> >::const_iterator k = s.
parameters.begin();
1106 for (std::vector<int>::const_iterator i = s.
variables.begin(); i != s.
variables.end(); ++i, ++k) {
1113 ok &=
myExecutors[getCommandId](*
this, message, tmpOutput);
1121 while (--length > 0) {
1124 int lengthLength = 1;
1136 length -= (lengthLength + 1 + 4 + (int)
id.length());
1137 while (--length > 0) {
1152 errors = errors + msg;
1157 int length = (1 + 4) + 1 + (4 + (
int)(s.
id.length())) + 1 + (int)outputStorage.
size();
1170 writeInto.
writeInt((
int)objIDs.size() - skipped);
1189 std::vector<int> variables;
1190 std::vector<std::vector<unsigned char> > parameters;
1191 for (
int i = 0; i < num; ++i) {
1193 variables.push_back(varID);
1194 parameters.push_back(std::vector<unsigned char>());
1200 if (variables.size() == 0) {
1214 bool success =
true;
1216 WRITE_WARNING(
"addSubscriptionFilter: No previous vehicle context subscription exists to apply the context filter.");
1223 switch (filterType) {
1231 std::vector<int> lanes;
1232 for (
int i = 0; i < nrLanes; ++i) {
1271 std::set<std::string> vTypesSet;
1272 vTypesSet.insert(vTypesVector.begin(), vTypesVector.end());
1292 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1293 std::cout <<
"Removing filters" << std::endl;
1300 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1301 std::cout <<
"Adding lane filter (lanes=" <<
toString(lanes) <<
")" << std::endl;
1309 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1310 std::cout <<
"Adding no opposite filter" << std::endl;
1317 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1318 std::cout <<
"Adding downstream dist filter (dist=" <<
toString(dist) <<
")" << std::endl;
1326 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1327 std::cout <<
"Adding upstream dist filter (dist=" <<
toString(dist) <<
")" << std::endl;
1335 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1336 std::cout <<
"Adding Lead/Follow-maneuver filter" << std::endl;
1343 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1344 std::cout <<
"Adding turn-maneuver filter" << std::endl;
1351 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1352 std::cout <<
"Adding vClass filter (vClasses=" <<
toString(vClasses) <<
")" << std::endl;
1360 #ifdef DEBUG_SUBSCRIPTION_FILTERS 1361 std::cout <<
"Adding vType filter (vTypes=" <<
toString(vTypes) <<
")" << std::endl;
1369 if (tempMsg.
size() < 254) {
1382 if (shape.size() < 256) {
1386 outputStorage.
writeInt((
int)shape.size());
1400 into = inputStorage.
readInt();
1498 size = inputStorage.
readInt();
1501 for (
int i = 0; i < size; ++i) {
1504 if (std::isnan(x) || std::isnan(y)) {
1517 s.second->targetTime = targetTime;
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa3: Get Lane Variable)
The vehicle has departed (was inserted into the network)
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
void addSubscriptionFilterDownstreamDistance(double dist)
TRACI_CONST int TYPE_COLOR
TRACI_CONST int CMD_SET_POLYGON_VARIABLE
tcpip::Storage mySubscriptionCache
The last timestep's subscription results.
bool readTypeCheckingColor(tcpip::Storage &inputStorage, libsumo::TraCIColor &into)
Reads the value type and a color, verifying the type.
virtual std::vector< double > readDoubleList()
Representation of a subscription.
TRACI_CONST int POSITION_3D
double range
The range of the context.
static void applySubscriptionFilters(const Subscription &s, std::set< std::string > &objIDs)
Filter the given ID-Set (which was obtained from an R-Tree search) according to the filters set by th...
TRACI_CONST int CMD_GET_TL_VARIABLE
StorageType::const_iterator end() const
TRACI_CONST int CMD_SUBSCRIBE_ROUTE_CONTEXT
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc3: Change Lane State)
bool wrapString(const std::string &objID, const int variable, const std::string &value)
An edgeId, position and laneIndex.
bool processSingleSubscription(const libsumo::Subscription &s, tcpip::Storage &writeInto, std::string &errors)
virtual ~TraCIServer()
Destructor.
TRACI_CONST int CMD_GET_LANE_VARIABLE
bool commandGetVersion()
Returns the TraCI-version.
virtual const std::string & getID() const =0
Get the vehicle's ID.
TRACI_CONST int CMD_SUBSCRIBE_PERSON_VARIABLE
TRACI_CONST int VAR_LEADER
virtual std::vector< std::string > readStringList()
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc4: Change Vehicle State)
TRACI_CONST int CMD_SUBSCRIBE_VEHICLE_VARIABLE
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc7: Change PoI State)
TRACI_CONST int CMD_GET_LANEAREA_VARIABLE
TRACI_CONST int FILTER_TYPE_VCLASS
TRACI_CONST int CMD_ADD_SUBSCRIPTION_FILTER
TRACI_CONST int CMD_GET_ROUTE_VARIABLE
TRACI_CONST int CMD_GET_VEHICLETYPE_VARIABLE
TRACI_CONST int CMD_CLOSE
bool wrapInt(const std::string &objID, const int variable, const int value)
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
TRACI_CONST int CMD_SET_VEHICLE_VARIABLE
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa9: Get Junction Variable)
TRACI_CONST int TYPE_DOUBLELIST
virtual double readDouble()
tcpip::Storage myOutputStorage
The storage to write to.
TRACI_CONST int CMD_GET_PERSON_VARIABLE
void initialiseSubscription(libsumo::Subscription &s)
void postProcessSimulationStep()
Handles subscriptions to send after a simstep2 command.
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc2: Change Traffic Lights State)
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xab: Get Simulation Variable)
bool readTypeCheckingInt(tcpip::Storage &inputStorage, int &into)
Reads the value type and an int, verifying the type.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc6: Change Route State)
std::vector< std::string > myLoadArgs
bool readTypeCheckingString(tcpip::Storage &inputStorage, std::string &into)
Reads the value type and a string, verifying the type.
bool readTypeCheckingDouble(tcpip::Storage &inputStorage, double &into)
Reads the value type and a double, verifying the type.
tcpip::Storage myInputStorage
The storage to read from.
SUMOTime beginTime
The begin time of the subscription.
TRACI_CONST int CMD_SET_SIM_VARIABLE
virtual void writePacket(unsigned char *packet, int length)
bool centralObject(const libsumo::Subscription &s, const std::string &objID)
check whether a found objID refers to the central object of a context subscription ...
void cleanup()
clean up subscriptions
bool readTypeCheckingPolygon(tcpip::Storage &inputStorage, PositionVector &into)
Reads the value type and a polygon, verifying the type.
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xca: Change Edge State)
bool wrapRoadPosition(const std::string &objID, const int variable, const libsumo::TraCIRoadPosition &value)
virtual void writeUnsignedByte(int)
TRACI_CONST int CMD_SET_POI_VARIABLE
bool writeErrorStatusCmd(int commandId, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage with status = RTYPE_ERR.
TRACI_CONST int FILTER_TYPE_NOOPPOSITE
TRACI_CONST int CMD_SUBSCRIBE_LANEAREA_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_PERSON_CONTEXT
virtual unsigned char readChar()
void addVehicleStateListener(VehicleStateListener *listener)
Adds a vehicle states listener.
TRACI_CONST int RTYPE_ERR
virtual void writeInt(int)
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
virtual int readUnsignedByte()
SUMOTime endTime
The end time of the subscription.
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa4: Get Vehicle Variable)
std::string id
The id of the object that is subscribed.
static bool myDoCloseConnection
Whether the connection was set to be to close.
std::map< int, SocketInfo * >::iterator removeCurrentSocket()
removes myCurrentSocket from mySockets and returns an iterator pointing to the next member according ...
void addSubscriptionFilterVClass(SVCPermissions vClasses)
The vehicles starts to stop.
TRACI_CONST int TYPE_INTEGER
TRACI_CONST int CMD_GET_POI_VARIABLE
TRACI_CONST int CMD_SET_TL_VARIABLE
std::map< int, CmdExecutor > myExecutors
Map of commandIds -> their executors; applicable if the executor applies to the method footprint...
TRACI_CONST int TYPE_BYTE
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa1: Get AreaDetector Variable)
TRACI_CONST int FILTER_TYPE_VTYPE
TRACI_CONST int TRACI_ID_LIST
int commandId
commandIdArg The command id of the subscription
void removeSubscription(int commandId, const std::string &identity, int domain)
TRACI_CONST int CMD_GET_SIM_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_POLYGON_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_JUNCTION_VARIABLE
int activeFilters
Active filters for the subscription (bitset,.
static void close()
request termination of connection
TRACI_CONST int FILTER_TYPE_NONE
TRACI_CONST int CMD_SUBSCRIBE_SIM_CONTEXT
TRACI_CONST int CMD_SUBSCRIBE_VEHICLE_CONTEXT
bool addObjectVariableSubscription(const int commandId, const bool hasContext)
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xcb: Set Simulation Variable)
TRACI_CONST int CMD_SUBSCRIBE_EDGE_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_POI_CONTEXT
The vehicle got a new route.
The vehicle arrived at his destination (is deleted)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
The vehicles starts to park.
TRACI_CONST int CMD_SUBSCRIBE_POLYGON_VARIABLE
The vehicle is involved in a collision.
TRACI_CONST int CMD_SET_PERSON_VARIABLE
TRACI_CONST int TYPE_POLYGON
TRACI_CONST int CMD_SUBSCRIBE_SIM_VARIABLE
TRACI_CONST int CMD_SUBSCRIBE_POI_VARIABLE
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xce: Change Person State)
Representation of a vehicle.
bool readTypeCheckingDoubleList(tcpip::Storage &inputStorage, std::vector< double > &into)
Reads the value type and a double list, verifying the type.
int contextDomain
The domain ID of the context.
void addSubscriptionFilterNoOpposite()
double filterDownstreamDist
Downstream distance specified by the downstream distance filter.
The vehicle had to brake harder than permitted.
virtual MSTransportableControl & getPersonControl()
Returns the person control.
TRACI_CONST int CMD_GET_VEHICLE_VARIABLE
TRACI_CONST int FILTER_TYPE_UPSTREAM_DIST
A point in 2D or 3D with translation and scaling methods.
int filterVClasses
vClasses specified by the vClasses filter,
TRACI_CONST int CMD_SUBSCRIBE_JUNCTION_CONTEXT
TRACI_CONST int CMD_SET_VEHICLETYPE_VARIABLE
virtual void writeByte(int)
bool wrapStringList(const std::string &objID, const int variable, const std::vector< std::string > &value)
TRACI_CONST int CMD_SETORDER
bool readTypeCheckingStringList(tcpip::Storage &inputStorage, std::vector< std::string > &into)
Reads the value type and a string list, verifying the type.
TRACI_CONST int FILTER_TYPE_LEAD_FOLLOW
virtual void writeStringList(const std::vector< std::string > &s)
TRACI_CONST int CMD_SUBSCRIBE_LANEAREA_VARIABLE
TRACI_CONST int CMD_GET_MULTIENTRYEXIT_VARIABLE
TRACI_CONST int CMD_GETVERSION
TRACI_CONST int CMD_SUBSCRIBE_VEHICLETYPE_CONTEXT
TRACI_CONST int CMD_SET_LANE_VARIABLE
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa5: Get Vehicle Type Variable)
SUMOTime string2time(const std::string &r)
TRACI_CONST int TYPE_DOUBLE
void addSubscriptionFilterUpstreamDistance(double dist)
bool addSubscriptionFilter()
TRACI_CONST int FILTER_TYPE_TURN
The vehicle started to teleport.
tcpip::Storage & getWrapperStorage()
TRACI_CONST int TYPE_STRINGLIST
virtual std::string readString()
libsumo::Subscription * myLastContextSubscription
The last modified context subscription (the one to add a filter to, see (), currently only for vehicl...
virtual unsigned int position() const
void addSubscriptionFilterTurn()
TRACI_CONST int TYPE_STRING
TRACI_CONST int CMD_SUBSCRIBE_TL_CONTEXT
void addSubscriptionFilterLeadFollow()
bool isVehicleToVehicleContextSubscription(const libsumo::Subscription &s)
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
int readCommandID(int &commandStart, int &commandLength)
Reads the next command ID from the input storage.
TRACI_CONST int CMD_SUBSCRIBE_GUI_VARIABLE
static TraCIServer * myInstance
Singleton instance of the server.
TRACI_CONST int VAR_POSITION3D
The vehicle ends to park.
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa0: Get Induction Loop Variable)
Socket * accept(const bool create=false)
Wait for a incoming connection to port_.
bool readTypeCheckingUnsignedByte(tcpip::Storage &inputStorage, int &into)
Reads the value type and an unsigned byte, verifying the type.
TraCI server used to control sumo by a remote TraCI client.
void sendOutputToAll() const
send out subscription results (actually just the content of myOutputStorage) to clients which will ac...
TraCIServer(const SUMOTime begin, const int port, const int numClients)
Constructor.
virtual void writeStorage(tcpip::Storage &store)
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xae: Get Person Variable)
void sendSingleSimStepResponse()
sends an empty response to a simstep command to the current client. (This applies to a situation wher...
std::set< std::string > filterVTypes
vTypes specified by the vTypes filter
double filterUpstreamDist
Upstream distance specified by the upstream distance filter.
std::vector< std::vector< unsigned char > > parameters
The parameters for the subscribed variables.
StorageType::size_type size() const
TRACI_CONST int CMD_SUBSCRIBE_MULTIENTRYEXIT_VARIABLE
bool wrapColor(const std::string &objID, const int variable, const libsumo::TraCIColor &value)
void writeResponseWithLength(tcpip::Storage &outputStorage, tcpip::Storage &tempMsg)
TRACI_CONST int CMD_SUBSCRIBE_INDUCTIONLOOP_CONTEXT
VehicleState
Definition of a vehicle state.
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa7: Get PoI Variable)
TRACI_CONST int TRACI_VERSION
The vehicle was built, but has not yet departed.
void processCommandsUntilSimStep(SUMOTime step)
process all commands until the next SUMO simulation step. It is guaranteed that t->getTargetTime() >=...
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa2: Get Traffic Lights Variable)
TRACI_CONST int CMD_SUBSCRIBE_GUI_CONTEXT
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc5: Change Vehicle Type State)
void processReorderingRequests()
checks for and processes reordering requests (relevant for multiple clients)
static void openSocket(const std::map< int, CmdExecutor > &execs)
Initialises the server.
void writePositionVector(tcpip::Storage &outputStorage, const libsumo::TraCIPositionVector &shape)
TRACI_CONST int MAX_ORDER
virtual void writeString(const std::string &s)
TRACI_CONST int CMD_SUBSCRIBE_LANE_CONTEXT
TRACI_CONST int CMD_GET_GUI_VARIABLE
std::string toHex(const T i, std::streamsize numDigits=0)
std::vector< TraCIPosition > TraCIPositionVector
bool wrapPosition(const std::string &objID, const int variable, const libsumo::TraCIPosition &value)
static void collectObjectsInRange(int domain, const PositionVector &shape, double range, std::set< std::string > &into)
TRACI_CONST int FILTER_TYPE_DOWNSTREAM_DIST
TRACI_CONST int CMD_SUBSCRIBE_TL_VARIABLE
TRACI_CONST int CMD_SET_EDGE_VARIABLE
std::map< int, SocketInfo * >::iterator myCurrentSocket
The currently active client socket.
std::vector< int > variables
The subscribed variables.
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
SUMOTime nextTargetTime() const
get the minimal next target time among all clients
StorageType::const_iterator begin() const
void setTargetTime(SUMOTime targetTime)
Sets myTargetTime on server and sockets to the given value.
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
SUMOTime myTargetTime
The time step to reach until processing the next commands.
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa6: Get Route Variable)
std::vector< libsumo::Subscription > mySubscriptions
The list of known, still valid subscriptions.
The vehicle ends to stop.
TRACI_CONST int CMD_SUBSCRIBE_ROUTE_VARIABLE
bool readTypeCheckingPosition2D(tcpip::Storage &inputStorage, libsumo::TraCIPosition &into)
Reads the value type and a 2D position, verifying the type.
TRACI_CONST int TYPE_UBYTE
virtual void writeDouble(double)
TRACI_CONST int CMD_SUBSCRIBE_LANE_VARIABLE
MSTransportable * get(const std::string &id) const
Returns the named transportable, if existing.
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa1: Get MeMeDetector Variable)
void addSubscriptionFilterLanes(std::vector< int > lanes)
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa8: Get Polygon Variable)
int dispatchCommand()
Handles command, writes response to myOutputStorage.
TRACI_CONST int FILTER_TYPE_LANES
TRACI_CONST int CMD_SIMSTEP
TRACI_CONST int CMD_GET_JUNCTION_VARIABLE
tcpip::Storage myWrapperStorage
A temporary storage to let the wrapper write to.
std::map< int, SocketInfo * > mySockets
The socket connections to the clients the first component (index) determines the client's order (lowe...
void writeStatusCmd(int commandId, int status, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage.
std::map< int, SocketInfo * > mySocketReorderRequests
This stores the setOrder(int) requests of the clients.
TRACI_CONST int POSITION_2D
void initWrapper(const int domainID, const int variable, const std::string &objID)
TRACI_CONST int CMD_SUBSCRIBE_INDUCTIONLOOP_VARIABLE
TRACI_CONST int CMD_GET_INDUCTIONLOOP_VARIABLE
static void findObjectShape(int domain, const std::string &id, PositionVector &shape)
TRACI_CONST int CMD_SUBSCRIBE_MULTIENTRYEXIT_CONTEXT
TRACI_CONST int CMD_GET_EDGE_VARIABLE
TRACI_CONST int RTYPE_NOTIMPLEMENTED
#define WRITE_MESSAGE(msg)
TRACI_CONST double INVALID_DOUBLE_VALUE
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xaa: Get Edge Variable)
void addSubscriptionFilterVType(std::set< std::string > vTypes)
static bool wasClosed()
check whether close was requested
std::map< MSNet::VehicleState, std::vector< std::string > > myVehicleStateChanges
Changes in the states of simulated vehicles.
The vehicle ended being teleported.
TRACI_CONST int CMD_SUBSCRIBE_EDGE_CONTEXT
TRACI_CONST int CMD_SET_ROUTE_VARIABLE
bool readTypeCheckingByte(tcpip::Storage &inputStorage, int &into)
Reads the value type and a byte, verifying the type.
bool wrapDouble(const std::string &objID, const int variable, const double value)
TRACI_CONST int CMD_SUBSCRIBE_VEHICLETYPE_VARIABLE
tcpip::Socket * myServerSocket
The server socket.
TRACI_CONST int CMD_GET_POLYGON_VARIABLE
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc8: Change Polygon State)
TRACI_CONST int CMD_SET_GUI_VARIABLE
std::vector< int > filterLanes
lanes specified by the lanes filter
std::map< int, int > myParameterSizes
Map of variable ids to the size of the parameter in bytes.
void checkClientOrdering()
Called once after connection of all clients for executing SET_ORDER (and possibly prior GET_VERSION) ...