SUMO - Simulation of Urban MObility
TraCIServerAPI_Vehicle.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2009-2018 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
23 // APIs for getting/setting vehicle values via TraCI
24 /****************************************************************************/
25 
26 
27 // ===========================================================================
28 // included modules
29 // ===========================================================================
30 #include <config.h>
31 
32 #include <microsim/MSNet.h>
34 #include <microsim/MSVehicle.h>
36 #include <microsim/MSLane.h>
37 #include <microsim/MSEdge.h>
38 #include <microsim/MSGlobals.h>
46 #include <libsumo/Vehicle.h>
47 #include <libsumo/VehicleType.h>
48 #include "TraCIConstants.h"
50 #include "TraCIServerAPI_Vehicle.h"
52 
53 
54 // ===========================================================================
55 // method definitions
56 // ===========================================================================
57 bool
59  tcpip::Storage& outputStorage) {
60  const int variable = inputStorage.readUnsignedByte();
61  const std::string id = inputStorage.readString();
62  server.initWrapper(RESPONSE_GET_VEHICLE_VARIABLE, variable, id);
63  try {
64  if (!libsumo::Vehicle::handleVariable(id, variable, &server) &&
66  switch (variable) {
67  case VAR_LEADER: {
68  double dist = 0;
69  if (!server.readTypeCheckingDouble(inputStorage, dist)) {
70  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Leader retrieval requires a double.", outputStorage);
71  }
72  std::pair<std::string, double> leaderInfo = libsumo::Vehicle::getLeader(id, dist);
74  server.getWrapperStorage().writeInt(2);
76  server.getWrapperStorage().writeString(leaderInfo.first);
78  server.getWrapperStorage().writeDouble(leaderInfo.second);
79  break;
80  }
81  case VAR_EDGE_TRAVELTIME: {
82  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
83  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of travel time requires a compound object.", outputStorage);
84  }
85  if (inputStorage.readInt() != 2) {
86  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of travel time requires time and edge as parameter.", outputStorage);
87  }
88  double time = 0.;
89  if (!server.readTypeCheckingDouble(inputStorage, time)) {
90  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of travel time requires the referenced time as first parameter.", outputStorage);
91  }
92  // edge
93  std::string edgeID;
94  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
95  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of travel time requires the referenced edge as second parameter.", outputStorage);
96  }
97  // retrieve
100  break;
101  }
102  case VAR_EDGE_EFFORT: {
103  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
104  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of effort requires a compound object.", outputStorage);
105  }
106  if (inputStorage.readInt() != 2) {
107  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of effort requires time and edge as parameter.", outputStorage);
108  }
109  double time = 0.;
110  if (!server.readTypeCheckingDouble(inputStorage, time)) {
111  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of effort requires the referenced time as first parameter.", outputStorage);
112  }
113  // edge
114  std::string edgeID;
115  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
116  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of effort requires the referenced edge as second parameter.", outputStorage);
117  }
119  server.getWrapperStorage().writeDouble(libsumo::Vehicle::getEffort(id, time, edgeID));
120  break;
121  }
122  case VAR_BEST_LANES: {
124  tcpip::Storage tempContent;
125  int cnt = 0;
126  tempContent.writeUnsignedByte(TYPE_INTEGER);
127  std::vector<libsumo::TraCIBestLanesData> bestLanes = libsumo::Vehicle::getBestLanes(id);
128  tempContent.writeInt((int)bestLanes.size());
129  ++cnt;
130  for (std::vector<libsumo::TraCIBestLanesData>::const_iterator i = bestLanes.begin(); i != bestLanes.end(); ++i) {
131  const libsumo::TraCIBestLanesData& bld = *i;
132  tempContent.writeUnsignedByte(TYPE_STRING);
133  tempContent.writeString(bld.laneID);
134  ++cnt;
135  tempContent.writeUnsignedByte(TYPE_DOUBLE);
136  tempContent.writeDouble(bld.length);
137  ++cnt;
138  tempContent.writeUnsignedByte(TYPE_DOUBLE);
139  tempContent.writeDouble(bld.occupation);
140  ++cnt;
141  tempContent.writeUnsignedByte(TYPE_BYTE);
142  tempContent.writeByte(bld.bestLaneOffset);
143  ++cnt;
144  tempContent.writeUnsignedByte(TYPE_UBYTE);
145  bld.allowsContinuation ? tempContent.writeUnsignedByte(1) : tempContent.writeUnsignedByte(0);
146  ++cnt;
147  tempContent.writeUnsignedByte(TYPE_STRINGLIST);
148  tempContent.writeStringList(bld.continuationLanes);
149  ++cnt;
150  }
151  server.getWrapperStorage().writeInt((int)cnt);
152  server.getWrapperStorage().writeStorage(tempContent);
153  break;
154  }
155  case VAR_NEXT_TLS: {
156  std::vector<libsumo::TraCINextTLSData> nextTLS = libsumo::Vehicle::getNextTLS(id);
158  const int cnt = 1 + (int)nextTLS.size() * 4;
159  server.getWrapperStorage().writeInt(cnt);
161  server.getWrapperStorage().writeInt((int)nextTLS.size());
162  for (std::vector<libsumo::TraCINextTLSData>::iterator it = nextTLS.begin(); it != nextTLS.end(); ++it) {
164  server.getWrapperStorage().writeString(it->id);
166  server.getWrapperStorage().writeInt(it->tlIndex);
168  server.getWrapperStorage().writeDouble(it->dist);
170  server.getWrapperStorage().writeByte(it->state);
171  }
172  break;
173  }
174  case VAR_NEXT_STOPS: {
175  std::vector<libsumo::TraCINextStopData> nextStops = libsumo::Vehicle::getNextStops(id);
177  const int cnt = 1 + (int)nextStops.size() * 4;
178  server.getWrapperStorage().writeInt(cnt);
180  server.getWrapperStorage().writeInt((int)nextStops.size());
181  for (std::vector<libsumo::TraCINextStopData>::iterator it = nextStops.begin(); it != nextStops.end(); ++it) {
183  server.getWrapperStorage().writeString(it->lane);
185  server.getWrapperStorage().writeDouble(it->endPos);
187  server.getWrapperStorage().writeString(it->stoppingPlaceID);
189  server.getWrapperStorage().writeInt(it->stopFlags);
191  server.getWrapperStorage().writeDouble(it->duration);
193  server.getWrapperStorage().writeDouble(it->until);
194  }
195  break;
196  }
197  case DISTANCE_REQUEST: {
198  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
199  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of distance requires a compound object.", outputStorage);
200  }
201  if (inputStorage.readInt() != 2) {
202  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of distance requires position and distance type as parameter.", outputStorage);
203  }
204 
205  double edgePos;
206  std::string roadID;
207  int laneIndex;
208  // read position
209  int posType = inputStorage.readUnsignedByte();
210  switch (posType) {
211  case POSITION_ROADMAP:
212  try {
213  std::string roadID = inputStorage.readString();
214  edgePos = inputStorage.readDouble();
215  laneIndex = inputStorage.readUnsignedByte();
217  server.getWrapperStorage().writeDouble(libsumo::Vehicle::getDrivingDistance(id, roadID, edgePos, laneIndex));
218  break;
219  } catch (libsumo::TraCIException& e) {
220  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, e.what(), outputStorage);
221  }
222  case POSITION_2D:
223  case POSITION_3D: {
224  const double p1x = inputStorage.readDouble();
225  const double p1y = inputStorage.readDouble();
226  if (posType == POSITION_3D) {
227  inputStorage.readDouble(); // z value is ignored
228  }
231  break;
232  }
233  default:
234  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Unknown position format used for distance request", outputStorage);
235  }
236  // read distance type
237  int distType = inputStorage.readUnsignedByte();
238  if (distType != REQUEST_DRIVINGDIST) {
239  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Only driving distance is supported for vehicles.", outputStorage);
240  }
241  break;
242  }
243  case CMD_CHANGELANE: {
244  int direction = 0;
245  if (!server.readTypeCheckingInt(inputStorage, direction)) {
246  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of lane change state requires a direction as int.", outputStorage);
247  }
248  const std::pair<int, int> state = libsumo::Vehicle::getLaneChangeState(id, direction);
250  server.getWrapperStorage().writeInt(2);
252  server.getWrapperStorage().writeInt(state.first);
254  server.getWrapperStorage().writeInt(state.second);
255  break;
256  }
257  case VAR_PARAMETER: {
258  std::string paramName = "";
259  if (!server.readTypeCheckingString(inputStorage, paramName)) {
260  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Retrieval of a parameter requires its name.", outputStorage);
261  }
264  break;
265  }
266  default:
267  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Get Vehicle Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
268  }
269  }
270  } catch (libsumo::TraCIException& e) {
271  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, e.what(), outputStorage);
272  }
273  server.writeStatusCmd(CMD_GET_VEHICLE_VARIABLE, RTYPE_OK, "", outputStorage);
274  server.writeResponseWithLength(outputStorage, server.getWrapperStorage());
275  return true;
276 }
277 
278 
279 bool
281  tcpip::Storage& outputStorage) {
282  std::string warning = ""; // additional description for response
283  // variable
284  int variable = inputStorage.readUnsignedByte();
285  if (variable != CMD_STOP && variable != CMD_CHANGELANE
286  && variable != CMD_REROUTE_TO_PARKING
287  && variable != CMD_CHANGESUBLANE
288  && variable != CMD_SLOWDOWN && variable != CMD_CHANGETARGET && variable != CMD_RESUME
289  && variable != VAR_TYPE && variable != VAR_ROUTE_ID && variable != VAR_ROUTE
290  && variable != VAR_UPDATE_BESTLANES
291  && variable != VAR_EDGE_TRAVELTIME && variable != VAR_EDGE_EFFORT
292  && variable != CMD_REROUTE_TRAVELTIME && variable != CMD_REROUTE_EFFORT
293  && variable != VAR_SIGNALS && variable != VAR_MOVE_TO
294  && variable != VAR_LENGTH && variable != VAR_MAXSPEED && variable != VAR_VEHICLECLASS
295  && variable != VAR_SPEED_FACTOR && variable != VAR_EMISSIONCLASS
296  && variable != VAR_WIDTH && variable != VAR_MINGAP && variable != VAR_SHAPECLASS
297  && variable != VAR_ACCEL && variable != VAR_DECEL && variable != VAR_IMPERFECTION
298  && variable != VAR_APPARENT_DECEL && variable != VAR_EMERGENCY_DECEL
299  && variable != VAR_ACTIONSTEPLENGTH
300  && variable != VAR_TAU && variable != VAR_LANECHANGE_MODE
301  && variable != VAR_SPEED && variable != VAR_SPEEDSETMODE && variable != VAR_COLOR
302  && variable != ADD && variable != ADD_FULL && variable != REMOVE
303  && variable != VAR_HEIGHT
304  && variable != VAR_ROUTING_MODE
305  && variable != VAR_LATALIGNMENT
306  && variable != VAR_MAXSPEED_LAT
307  && variable != VAR_MINGAP_LAT
308  && variable != VAR_LINE
309  && variable != VAR_VIA
310  && variable != MOVE_TO_XY && variable != VAR_PARAMETER/* && variable != VAR_SPEED_TIME_LINE && variable != VAR_LANE_TIME_LINE*/
311  ) {
312  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Change Vehicle State: unsupported variable " + toHex(variable, 2) + " specified", outputStorage);
313  }
314  // id
315  std::string id = inputStorage.readString();
316 #ifdef DEBUG_MOVEXY
317  std::cout << SIMTIME << " processSet veh=" << id << "\n";
318 #endif
319  const bool shouldExist = variable != ADD && variable != ADD_FULL;
321  if (sumoVehicle == 0) {
322  if (shouldExist) {
323  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Vehicle '" + id + "' is not known", outputStorage);
324  }
325  }
326  MSVehicle* v = dynamic_cast<MSVehicle*>(sumoVehicle);
327  if (v == 0 && shouldExist) {
328  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "Vehicle '" + id + "' is not a micro-simulation vehicle", outputStorage);
329  }
330  try {
331  switch (variable) {
332  case CMD_STOP: {
333  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
334  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Stop needs a compound object description.", outputStorage);
335  }
336  int compoundSize = inputStorage.readInt();
337  if (compoundSize < 4 || compoundSize > 7) {
338  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Stop needs a compound object description of four to seven items.", outputStorage);
339  }
340  // read road map position
341  std::string edgeID;
342  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
343  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The first stop parameter must be the edge id given as a string.", outputStorage);
344  }
345  double pos = 0;
346  if (!server.readTypeCheckingDouble(inputStorage, pos)) {
347  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The second stop parameter must be the end position along the edge given as a double.", outputStorage);
348  }
349  int laneIndex = 0;
350  if (!server.readTypeCheckingByte(inputStorage, laneIndex)) {
351  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The third stop parameter must be the lane index given as a byte.", outputStorage);
352  }
353  // waitTime
354  double duration = INVALID_DOUBLE_VALUE;
355  if (!server.readTypeCheckingDouble(inputStorage, duration)) {
356  return server.writeErrorStatusCmd(CMD_GET_VEHICLE_VARIABLE, "The fourth stop parameter must be the stopping duration given as a double.", outputStorage);
357  }
358  int stopFlags = 0;
359  if (compoundSize >= 5) {
360  if (!server.readTypeCheckingByte(inputStorage, stopFlags)) {
361  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The fifth stop parameter must be a byte indicating its parking/triggered status.", outputStorage);
362  }
363  }
364  double startPos = INVALID_DOUBLE_VALUE;
365  if (compoundSize >= 6) {
366  if (!server.readTypeCheckingDouble(inputStorage, startPos)) {
367  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The sixth stop parameter must be the start position along the edge given as a double.", outputStorage);
368  }
369  }
370  double until = INVALID_DOUBLE_VALUE;
371  if (compoundSize >= 7) {
372  if (!server.readTypeCheckingDouble(inputStorage, until)) {
373  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The seventh stop parameter must be the minimum departure time given as a double.", outputStorage);
374  }
375  }
376  libsumo::Vehicle::setStop(id, edgeID, pos, laneIndex, duration, stopFlags, startPos, until);
377  }
378  break;
379  case CMD_REROUTE_TO_PARKING: {
380  // read variables
381  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
382  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Reroute to stop needs a compound object description.", outputStorage);
383  }
384  int compoundSize = inputStorage.readInt();
385  if (compoundSize != 1) {
386  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Reroute to stop needs a compound object description of 1 item.", outputStorage);
387  }
388  std::string parkingAreaID;
389  if (!server.readTypeCheckingString(inputStorage, parkingAreaID)) {
390  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The first reroute to stop parameter must be the parking area id given as a string.", outputStorage);
391  }
392  libsumo::Vehicle::rerouteParkingArea(id, parkingAreaID);
393  }
394  break;
395  case CMD_RESUME: {
396  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
397  server.writeStatusCmd(CMD_SET_VEHICLE_VARIABLE, RTYPE_ERR, "Resuming requires a compound object.", outputStorage);
398  return false;
399  }
400  if (inputStorage.readInt() != 0) {
401  server.writeStatusCmd(CMD_SET_VEHICLE_VARIABLE, RTYPE_ERR, "Resuming should obtain an empty compound object.", outputStorage);
402  return false;
403  }
405  }
406  break;
407  case CMD_CHANGELANE: {
408  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
409  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Lane change needs a compound object description.", outputStorage);
410  }
411  int compounds = inputStorage.readInt();
412  if (compounds != 3 && compounds != 2) {
413  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Lane change needs a compound object description of two or three items.", outputStorage);
414  }
415  // Lane ID
416  int laneIndex = 0;
417  if (!server.readTypeCheckingByte(inputStorage, laneIndex)) {
418  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The first lane change parameter must be the lane index given as a byte.", outputStorage);
419  }
420  // duration
421  double duration = 0.;
422  if (!server.readTypeCheckingDouble(inputStorage, duration)) {
423  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The second lane change parameter must be the duration given as a double.", outputStorage);
424  }
425  // relativelanechange
426  int relative = 0;
427  if (compounds == 3) {
428  if (!server.readTypeCheckingByte(inputStorage, relative)) {
429  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The third lane change parameter must be a Byte for defining whether a relative lane change should be applied.", outputStorage);
430  }
431  }
432 
433  if ((laneIndex < 0) || (laneIndex >= (int)(v->getEdge()->getLanes().size()) && relative < 1)) {
434  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "No lane with index '" + toString(laneIndex) + "' on road '" + v->getEdge()->getID() + "'.", outputStorage);
435  }
436 
437  if (relative < 1) {
438  libsumo::Vehicle::changeLane(id, laneIndex, duration);
439  } else {
440  libsumo::Vehicle::changeLaneRelative(id, laneIndex, duration);
441  }
442  }
443  break;
444  case CMD_CHANGESUBLANE: {
445  double latDist = 0;
446  if (!server.readTypeCheckingDouble(inputStorage, latDist)) {
447  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Sublane-changing requires a double.", outputStorage);
448  }
449  libsumo::Vehicle::changeSublane(id, latDist);
450  }
451  break;
452  case CMD_SLOWDOWN: {
453  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
454  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Slow down needs a compound object description.", outputStorage);
455  }
456  if (inputStorage.readInt() != 2) {
457  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Slow down needs a compound object description of two items.", outputStorage);
458  }
459  double newSpeed = 0;
460  if (!server.readTypeCheckingDouble(inputStorage, newSpeed)) {
461  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The first slow down parameter must be the speed given as a double.", outputStorage);
462  }
463  if (newSpeed < 0) {
464  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Speed must not be negative", outputStorage);
465  }
466  double duration = 0.;
467  if (!server.readTypeCheckingDouble(inputStorage, duration)) {
468  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The second slow down parameter must be the duration given as a double.", outputStorage);
469  }
470  if (duration < 0 || SIMTIME + duration > STEPS2TIME(SUMOTime_MAX - DELTA_T)) {
471  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Invalid time interval", outputStorage);
472  }
473  libsumo::Vehicle::slowDown(id, newSpeed, duration);
474  }
475  break;
476  case CMD_CHANGETARGET: {
477  std::string edgeID;
478  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
479  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Change target requires a string containing the id of the new destination edge as parameter.", outputStorage);
480  }
481  libsumo::Vehicle::changeTarget(id, edgeID);
482  }
483  break;
484  case VAR_TYPE: {
485  std::string vTypeID;
486  if (!server.readTypeCheckingString(inputStorage, vTypeID)) {
487  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The vehicle type id must be given as a string.", outputStorage);
488  }
489  libsumo::Vehicle::setType(id, vTypeID);
490  }
491  break;
492  case VAR_ROUTE_ID: {
493  std::string rid;
494  if (!server.readTypeCheckingString(inputStorage, rid)) {
495  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The route id must be given as a string.", outputStorage);
496  }
498  }
499  break;
500  case VAR_ROUTE: {
501  std::vector<std::string> edgeIDs;
502  if (!server.readTypeCheckingStringList(inputStorage, edgeIDs)) {
503  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "A route must be defined as a list of edge ids.", outputStorage);
504  }
505  libsumo::Vehicle::setRoute(id, edgeIDs);
506  }
507  break;
508  case VAR_EDGE_TRAVELTIME: {
509  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
510  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time requires a compound object.", outputStorage);
511  }
512  int parameterCount = inputStorage.readInt();
513  std::string edgeID;
514  double begTime = 0.;
515  double endTime = std::numeric_limits<double>::max();
516  double value = INVALID_DOUBLE_VALUE;
517  if (parameterCount == 4) {
518  // begin time
519  if (!server.readTypeCheckingDouble(inputStorage, begTime)) {
520  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 4 parameters requires the begin time as first parameter.", outputStorage);
521  }
522  // begin time
523  if (!server.readTypeCheckingDouble(inputStorage, endTime)) {
524  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 4 parameters requires the end time as second parameter.", outputStorage);
525  }
526  // edge
527  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
528  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 4 parameters requires the referenced edge as third parameter.", outputStorage);
529  }
530  // value
531  if (!server.readTypeCheckingDouble(inputStorage, value)) {
532  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 4 parameters requires the travel time as double as fourth parameter.", outputStorage);
533  }
534  } else if (parameterCount == 2) {
535  // edge
536  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
537  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 2 parameters requires the referenced edge as first parameter.", outputStorage);
538  }
539  // value
540  if (!server.readTypeCheckingDouble(inputStorage, value)) {
541  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 2 parameters requires the travel time as second parameter.", outputStorage);
542  }
543  } else if (parameterCount == 1) {
544  // edge
545  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
546  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time using 1 parameter requires the referenced edge as first parameter.", outputStorage);
547  }
548  } else {
549  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting travel time requires 1, 2, or 4 parameters.", outputStorage);
550  }
551  libsumo::Vehicle::setAdaptedTraveltime(id, edgeID, value, begTime, endTime);
552  }
553  break;
554  case VAR_EDGE_EFFORT: {
555  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
556  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort requires a compound object.", outputStorage);
557  }
558  int parameterCount = inputStorage.readInt();
559  std::string edgeID;
560  double begTime = 0.;
561  double endTime = std::numeric_limits<double>::max();
562  double value = INVALID_DOUBLE_VALUE;
563  if (parameterCount == 4) {
564  // begin time
565  if (!server.readTypeCheckingDouble(inputStorage, begTime)) {
566  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 4 parameters requires the begin time as first parameter.", outputStorage);
567  }
568  // begin time
569  if (!server.readTypeCheckingDouble(inputStorage, endTime)) {
570  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 4 parameters requires the end time as second parameter.", outputStorage);
571  }
572  // edge
573  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
574  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 4 parameters requires the referenced edge as third parameter.", outputStorage);
575  }
576  // value
577  if (!server.readTypeCheckingDouble(inputStorage, value)) {
578  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 4 parameters requires the travel time as fourth parameter.", outputStorage);
579  }
580  } else if (parameterCount == 2) {
581  // edge
582  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
583  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 2 parameters requires the referenced edge as first parameter.", outputStorage);
584  }
585  if (!server.readTypeCheckingDouble(inputStorage, value)) {
586  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 2 parameters requires the travel time as second parameter.", outputStorage);
587  }
588  } else if (parameterCount == 1) {
589  // edge
590  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
591  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort using 1 parameter requires the referenced edge as first parameter.", outputStorage);
592  }
593  } else {
594  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting effort requires 1, 2, or 4 parameters.", outputStorage);
595  }
596  // retrieve
597  libsumo::Vehicle::setEffort(id, edgeID, value, begTime, endTime);
598  }
599  break;
600  case CMD_REROUTE_TRAVELTIME: {
601  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
602  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Rerouting requires a compound object.", outputStorage);
603  }
604  if (inputStorage.readInt() != 0) {
605  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Rerouting should obtain an empty compound object.", outputStorage);
606  }
608  }
609  break;
610  case CMD_REROUTE_EFFORT: {
611  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
612  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Rerouting requires a compound object.", outputStorage);
613  }
614  if (inputStorage.readInt() != 0) {
615  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Rerouting should obtain an empty compound object.", outputStorage);
616  }
618  }
619  break;
620  case VAR_SIGNALS: {
621  int signals = 0;
622  if (!server.readTypeCheckingInt(inputStorage, signals)) {
623  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting signals requires an integer.", outputStorage);
624  }
625  libsumo::Vehicle::setSignals(id, signals);
626  }
627  break;
628  case VAR_MOVE_TO: {
629  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
630  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting position requires a compound object.", outputStorage);
631  }
632  if (inputStorage.readInt() != 2) {
633  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting position should obtain the lane id and the position.", outputStorage);
634  }
635  // lane ID
636  std::string laneID;
637  if (!server.readTypeCheckingString(inputStorage, laneID)) {
638  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The first parameter for setting a position must be the lane ID given as a string.", outputStorage);
639  }
640  // position on lane
641  double position = 0;
642  if (!server.readTypeCheckingDouble(inputStorage, position)) {
643  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The second parameter for setting a position must be the position given as a double.", outputStorage);
644  }
645  // process
646  libsumo::Vehicle::moveTo(id, laneID, position);
647  }
648  break;
649  case VAR_SPEED: {
650  double speed = 0;
651  if (!server.readTypeCheckingDouble(inputStorage, speed)) {
652  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting speed requires a double.", outputStorage);
653  }
654  libsumo::Vehicle::setSpeed(id, speed);
655  }
656  break;
657  case VAR_SPEEDSETMODE: {
658  int speedMode = 0;
659  if (!server.readTypeCheckingInt(inputStorage, speedMode)) {
660  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting speed mode requires an integer.", outputStorage);
661  }
662  libsumo::Vehicle::setSpeedMode(id, speedMode);
663  }
664  break;
665  case VAR_LANECHANGE_MODE: {
666  int laneChangeMode = 0;
667  if (!server.readTypeCheckingInt(inputStorage, laneChangeMode)) {
668  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting lane change mode requires an integer.", outputStorage);
669  }
670  libsumo::Vehicle::setLaneChangeMode(id, laneChangeMode);
671  }
672  break;
673  case VAR_ROUTING_MODE: {
674  int routingMode = 0;
675  if (!server.readTypeCheckingInt(inputStorage, routingMode)) {
676  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting routing mode requires an integer.", outputStorage);
677  }
678  libsumo::Vehicle::setRoutingMode(id, routingMode);
679  }
680  break;
681  case VAR_COLOR: {
683  if (!server.readTypeCheckingColor(inputStorage, col)) {
684  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The color must be given using the according type.", outputStorage);
685  }
686  libsumo::Vehicle::setColor(id, col);
687  break;
688  }
689  case ADD: {
690  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
691  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Adding a vehicle requires a compound object.", outputStorage);
692  }
693  if (inputStorage.readInt() != 6) {
694  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Adding a vehicle needs six parameters.", outputStorage);
695  }
696  std::string vTypeID;
697  if (!server.readTypeCheckingString(inputStorage, vTypeID)) {
698  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "First parameter (type) requires a string.", outputStorage);
699  }
700  std::string routeID;
701  if (!server.readTypeCheckingString(inputStorage, routeID)) {
702  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Second parameter (route) requires a string.", outputStorage);
703  }
704  int departCode;
705  if (!server.readTypeCheckingInt(inputStorage, departCode)) {
706  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Third parameter (depart) requires an integer.", outputStorage);
707  }
708  std::string depart = toString(STEPS2TIME(departCode));
709  if (-departCode == DEPART_TRIGGERED) {
710  depart = "triggered";
711  } else if (-departCode == DEPART_CONTAINER_TRIGGERED) {
712  depart = "containerTriggered";
713  } else if (-departCode == DEPART_NOW) {
714  depart = "now";
715  }
716 
717  double departPosCode;
718  if (!server.readTypeCheckingDouble(inputStorage, departPosCode)) {
719  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Fourth parameter (position) requires a double.", outputStorage);
720  }
721  std::string departPos = toString(departPosCode);
722  if (-departPosCode == DEPART_POS_RANDOM) {
723  departPos = "random";
724  } else if (-departPosCode == DEPART_POS_RANDOM_FREE) {
725  departPos = "random_free";
726  } else if (-departPosCode == DEPART_POS_FREE) {
727  departPos = "free";
728  } else if (-departPosCode == DEPART_POS_BASE) {
729  departPos = "base";
730  } else if (-departPosCode == DEPART_POS_LAST) {
731  departPos = "last";
732  } else if (-departPosCode == DEPART_POS_GIVEN) {
733  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Invalid departure position.", outputStorage);
734  }
735 
736  double departSpeedCode;
737  if (!server.readTypeCheckingDouble(inputStorage, departSpeedCode)) {
738  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Fifth parameter (speed) requires a double.", outputStorage);
739  }
740  std::string departSpeed = toString(departSpeedCode);
741  if (-departSpeedCode == DEPART_SPEED_RANDOM) {
742  departSpeed = "random";
743  } else if (-departSpeedCode == DEPART_SPEED_MAX) {
744  departSpeed = "max";
745  }
746 
747  int departLaneCode;
748  if (!server.readTypeCheckingByte(inputStorage, departLaneCode)) {
749  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Sixth parameter (lane) requires a byte.", outputStorage);
750  }
751  std::string departLane = toString(departLaneCode);
752  if (-departLaneCode == DEPART_LANE_RANDOM) {
753  departLane = "random";
754  } else if (-departLaneCode == DEPART_LANE_FREE) {
755  departLane = "free";
756  } else if (-departLaneCode == DEPART_LANE_ALLOWED_FREE) {
757  departLane = "allowed";
758  } else if (-departLaneCode == DEPART_LANE_BEST_FREE) {
759  departLane = "best";
760  } else if (-departLaneCode == DEPART_LANE_FIRST_ALLOWED) {
761  departLane = "first";
762  }
763  libsumo::Vehicle::add(id, routeID, vTypeID, depart, departLane, departPos, departSpeed);
764  }
765  break;
766  case ADD_FULL: {
767  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
768  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Adding a vehicle requires a compound object.", outputStorage);
769  }
770  if (inputStorage.readInt() != 14) {
771  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Adding a fully specified vehicle needs fourteen parameters.", outputStorage);
772  }
773  std::string routeID;
774  if (!server.readTypeCheckingString(inputStorage, routeID)) {
775  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Second parameter (route) requires a string.", outputStorage);
776  }
777  std::string vTypeID;
778  if (!server.readTypeCheckingString(inputStorage, vTypeID)) {
779  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "First parameter (type) requires a string.", outputStorage);
780  }
781  std::string depart;
782  if (!server.readTypeCheckingString(inputStorage, depart)) {
783  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Third parameter (depart) requires an string.", outputStorage);
784  }
785  std::string departLane;
786  if (!server.readTypeCheckingString(inputStorage, departLane)) {
787  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Fourth parameter (depart lane) requires a string.", outputStorage);
788  }
789  std::string departPos;
790  if (!server.readTypeCheckingString(inputStorage, departPos)) {
791  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Fifth parameter (depart position) requires a string.", outputStorage);
792  }
793  std::string departSpeed;
794  if (!server.readTypeCheckingString(inputStorage, departSpeed)) {
795  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Sixth parameter (depart speed) requires a string.", outputStorage);
796  }
797  std::string arrivalLane;
798  if (!server.readTypeCheckingString(inputStorage, arrivalLane)) {
799  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Seventh parameter (arrival lane) requires a string.", outputStorage);
800  }
801  std::string arrivalPos;
802  if (!server.readTypeCheckingString(inputStorage, arrivalPos)) {
803  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Eighth parameter (arrival position) requires a string.", outputStorage);
804  }
805  std::string arrivalSpeed;
806  if (!server.readTypeCheckingString(inputStorage, arrivalSpeed)) {
807  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Ninth parameter (arrival speed) requires a string.", outputStorage);
808  }
809  std::string fromTaz;
810  if (!server.readTypeCheckingString(inputStorage, fromTaz)) {
811  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Tenth parameter (from taz) requires a string.", outputStorage);
812  }
813  std::string toTaz;
814  if (!server.readTypeCheckingString(inputStorage, toTaz)) {
815  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Eleventh parameter (to taz) requires a string.", outputStorage);
816  }
817  std::string line;
818  if (!server.readTypeCheckingString(inputStorage, line)) {
819  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Twelth parameter (line) requires a string.", outputStorage);
820  }
821  int personCapacity;
822  if (!server.readTypeCheckingInt(inputStorage, personCapacity)) {
823  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "13th parameter (person capacity) requires an int.", outputStorage);
824  }
825  int personNumber;
826  if (!server.readTypeCheckingInt(inputStorage, personNumber)) {
827  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "14th parameter (person number) requires an int.", outputStorage);
828  }
829  libsumo::Vehicle::add(id, routeID, vTypeID, depart, departLane, departPos, departSpeed, arrivalLane, arrivalPos, arrivalSpeed,
830  fromTaz, toTaz, line, personCapacity, personNumber);
831  }
832  break;
833  case REMOVE: {
834  int why = 0;
835  if (!server.readTypeCheckingByte(inputStorage, why)) {
836  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Removing a vehicle requires a byte.", outputStorage);
837  }
838  libsumo::Vehicle::remove(id, (char)why);
839  }
840  break;
841  case MOVE_TO_XY: {
842  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
843  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "MoveToXY vehicle requires a compound object.", outputStorage);
844  }
845  const int numArgs = inputStorage.readInt();
846  if (numArgs != 5 && numArgs != 6) {
847  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "MoveToXY vehicle should obtain: edgeID, lane, x, y, angle and optionally keepRouteFlag.", outputStorage);
848  }
849  // edge ID
850  std::string edgeID;
851  if (!server.readTypeCheckingString(inputStorage, edgeID)) {
852  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The first parameter for moveToXY must be the edge ID given as a string.", outputStorage);
853  }
854  // lane index
855  int laneNum = 0;
856  if (!server.readTypeCheckingInt(inputStorage, laneNum)) {
857  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The second parameter for moveToXY must be lane given as an int.", outputStorage);
858  }
859  // x
860  double x = 0;
861  if (!server.readTypeCheckingDouble(inputStorage, x)) {
862  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The third parameter for moveToXY must be the x-position given as a double.", outputStorage);
863  }
864  // y
865  double y = 0;
866  if (!server.readTypeCheckingDouble(inputStorage, y)) {
867  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The fourth parameter for moveToXY must be the y-position given as a double.", outputStorage);
868  }
869  // angle
870  double angle = 0;
871  if (!server.readTypeCheckingDouble(inputStorage, angle)) {
872  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The fifth parameter for moveToXY must be the angle given as a double.", outputStorage);
873  }
874 
875  int keepRouteFlag = 1;
876  if (numArgs == 6) {
877  if (!server.readTypeCheckingByte(inputStorage, keepRouteFlag)) {
878  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The sixth parameter for moveToXY must be the keepRouteFlag given as a byte.", outputStorage);
879  }
880  }
881  libsumo::Vehicle::moveToXY(id, edgeID, laneNum, x, y, angle, keepRouteFlag);
882  }
883  break;
884  case VAR_SPEED_FACTOR: {
885  double factor = 0;
886  if (!server.readTypeCheckingDouble(inputStorage, factor)) {
887  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting speed factor requires a double.", outputStorage);
888  }
889  libsumo::Vehicle::setSpeedFactor(id, factor);
890  }
891  break;
892  case VAR_LINE: {
893  std::string line;
894  if (!server.readTypeCheckingString(inputStorage, line)) {
895  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The line must be given as a string.", outputStorage);
896  }
897  libsumo::Vehicle::setLine(id, line);
898  }
899  break;
900  case VAR_VIA: {
901  std::vector<std::string> edgeIDs;
902  if (!server.readTypeCheckingStringList(inputStorage, edgeIDs)) {
903  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Vias must be defined as a list of edge ids.", outputStorage);
904  }
905  libsumo::Vehicle::setVia(id, edgeIDs);
906  }
907  break;
908  case VAR_PARAMETER: {
909  if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) {
910  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "A compound object is needed for setting a parameter.", outputStorage);
911  }
912  //readt itemNo
913  inputStorage.readInt();
914  std::string name;
915  if (!server.readTypeCheckingString(inputStorage, name)) {
916  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The name of the parameter must be given as a string.", outputStorage);
917  }
918  std::string value;
919  if (!server.readTypeCheckingString(inputStorage, value)) {
920  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "The value of the parameter must be given as a string.", outputStorage);
921  }
922  try {
924  libsumo::Vehicle::setParameter(id, name, value);
925  } catch (libsumo::TraCIException& e) {
926  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, e.what(), outputStorage);
927  }
928  }
929  break;
930  case VAR_ACTIONSTEPLENGTH: {
931  double value = 0;
932  if (!server.readTypeCheckingDouble(inputStorage, value)) {
933  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Setting action step length requires a double.", outputStorage);
934  }
935  if (fabs(value) == std::numeric_limits<double>::infinity()) {
936  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, "Invalid action step length.", outputStorage);
937  }
938  bool resetActionOffset = value >= 0.0;
939  libsumo::Vehicle::setActionStepLength(id, fabs(value), resetActionOffset);
940  }
941  break;
942  case VAR_UPDATE_BESTLANES: {
944  }
945  break;
946  default: {
947  try {
948  if (!TraCIServerAPI_VehicleType::setVariable(CMD_SET_VEHICLE_VARIABLE, variable, v->getSingularType().getID(), server, inputStorage, outputStorage)) {
949  return false;
950  }
951  } catch (ProcessError& e) {
952  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, e.what(), outputStorage);
953  } catch (libsumo::TraCIException& e) {
954  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, e.what(), outputStorage);
955  }
956  }
957  break;
958  }
959  } catch (libsumo::TraCIException& e) {
960  return server.writeErrorStatusCmd(CMD_SET_VEHICLE_VARIABLE, e.what(), outputStorage);
961  }
962  server.writeStatusCmd(CMD_SET_VEHICLE_VARIABLE, RTYPE_OK, warning, outputStorage);
963  return true;
964 }
965 
966 
967 /****************************************************************************/
The departure is person triggered.
static std::vector< TraCIBestLanesData > getBestLanes(const std::string &vehicleID)
Definition: Vehicle.cpp:342
static void setStop(const std::string &vehicleID, const std::string &edgeID, double pos=1., int laneIndex=0, double duration=INVALID_DOUBLE_VALUE, int flags=STOP_DEFAULT, double startPos=INVALID_DOUBLE_VALUE, double until=INVALID_DOUBLE_VALUE)
Definition: Vehicle.cpp:726
bool readTypeCheckingColor(tcpip::Storage &inputStorage, libsumo::TraCIColor &into)
Reads the value type and a color, verifying the type.
static void setEffort(const std::string &vehicleID, const std::string &edgeID, double effort=INVALID_DOUBLE_VALUE, double begSeconds=0, double endSeconds=std::numeric_limits< double >::max())
Definition: Vehicle.cpp:1199
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:79
#define VAR_EMISSIONCLASS
#define VAR_VIA
#define REQUEST_DRIVINGDIST
#define VAR_LENGTH
static void setLine(const std::string &vehicleID, const std::string &line)
Definition: Vehicle.cpp:1363
bool allowsContinuation
Whether this lane allows continuing the route.
Definition: TraCIDefs.h:314
static void updateBestLanes(const std::string &vehicleID)
Definition: Vehicle.cpp:1166
#define VAR_LATALIGNMENT
#define RESPONSE_GET_VEHICLE_VARIABLE
The vehicle is discarded if emission fails (not fully implemented yet)
#define CMD_GET_VEHICLE_VARIABLE
#define TYPE_COMPOUND
static void setRoute(const std::string &vehicleID, const std::vector< std::string > &edgeIDs)
Definition: Vehicle.cpp:1152
#define CMD_RESUME
#define POSITION_2D
static bool processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value command (Command 0xc4: Change Vehicle State)
#define VAR_ROUTE
#define CMD_CHANGELANE
The departure is container triggered.
#define VAR_SPEEDSETMODE
#define VAR_TAU
#define CMD_STOP
static void setParameter(const std::string &vehicleID, const std::string &key, const std::string &value)
Definition: Vehicle.cpp:1485
#define TYPE_UBYTE
The position is given.
#define RTYPE_OK
#define POSITION_ROADMAP
#define VAR_HEIGHT
#define DISTANCE_REQUEST
virtual double readDouble()
The least occupied lane is used.
#define VAR_SIGNALS
#define VAR_TYPE
static std::string getTypeID(const std::string &vehicleID)
Definition: Vehicle.cpp:179
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
#define VAR_ROUTE_ID
#define CMD_CHANGESUBLANE
static void setRoutingMode(const std::string &vehicleID, int routingMode)
Definition: Vehicle.cpp:1118
#define VAR_VEHICLECLASS
#define VAR_SPEED_FACTOR
#define VAR_COLOR
double occupation
The traffic density along length.
Definition: TraCIDefs.h:310
bool readTypeCheckingInt(tcpip::Storage &inputStorage, int &into)
Reads the value type and an int, verifying the type.
const std::vector< MSLane * > & getLanes() const
Returns this edge&#39;s lanes.
Definition: MSEdge.h:162
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:160
std::string laneID
The id of the lane.
Definition: TraCIDefs.h:306
static void setSpeedMode(const std::string &vehicleID, int speedMode)
Definition: Vehicle.cpp:1108
SUMOTime DELTA_T
Definition: SUMOTime.cpp:35
bool readTypeCheckingString(tcpip::Storage &inputStorage, std::string &into)
Reads the value type and a string, verifying the type.
#define TYPE_STRINGLIST
bool readTypeCheckingDouble(tcpip::Storage &inputStorage, double &into)
Reads the value type and a double, verifying the type.
The speed is chosen randomly.
#define VAR_ROUTING_MODE
#define POSITION_3D
static void rerouteParkingArea(const std::string &vehicleID, const std::string &parkingAreaID)
Definition: Vehicle.cpp:793
#define VAR_BEST_LANES
The lane is chosen randomly.
#define VAR_UPDATE_BESTLANES
static void setRouteID(const std::string &vehicleID, const std::string &routeID)
Definition: Vehicle.cpp:1132
const std::string & getID() const
Returns the id.
Definition: Named.h:69
virtual void writeUnsignedByte(int)
#define VAR_NEXT_TLS
bool writeErrorStatusCmd(int commandId, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage with status = RTYPE_ERR.
The least occupied lane from best lanes.
The position is chosen randomly.
virtual void writeInt(int)
#define TYPE_STRING
#define SIMTIME
Definition: SUMOTime.h:65
virtual int readUnsignedByte()
static std::pair< int, int > getLaneChangeState(const std::string &vehicleID, int direction)
Definition: Vehicle.cpp:562
static bool processGet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a get value command (Command 0xa4: Get Vehicle Variable)
static void rerouteTraveltime(const std::string &vehicleID)
Definition: Vehicle.cpp:1225
static double getEffort(const std::string &vehicleID, double time, const std::string &edgeID)
Definition: Vehicle.cpp:308
int bestLaneOffset
The offset of this lane from the best lane.
Definition: TraCIDefs.h:312
static void resume(const std::string &vehicleID)
Definition: Vehicle.cpp:803
#define CMD_SLOWDOWN
#define VAR_SHAPECLASS
static std::vector< TraCINextTLSData > getNextTLS(const std::string &vehicleID)
Definition: Vehicle.cpp:368
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:49
#define MOVE_TO_XY
#define VAR_ACCEL
#define CMD_CHANGETARGET
Representation of a vehicle.
Definition: SUMOVehicle.h:60
static void setLaneChangeMode(const std::string &vehicleID, int laneChangeMode)
Definition: Vehicle.cpp:1113
virtual int readInt()
static void setVia(const std::string &vehicleID, const std::vector< std::string > &via)
Definition: Vehicle.cpp:1369
The least occupied lane from lanes which allow the continuation.
#define VAR_ACTIONSTEPLENGTH
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:309
#define CMD_REROUTE_TO_PARKING
static void add(const std::string &vehicleID, const std::string &routeID, const std::string &typeID="DEFAULT_VEHTYPE", const std::string &depart="now", const std::string &departLane="first", const std::string &departPos="base", const std::string &departSpeed="0", const std::string &arrivalLane="current", const std::string &arrivalPos="max", const std::string &arrivalSpeed="current", const std::string &fromTaz="", const std::string &toTaz="", const std::string &line="", int personCapacity=4, int personNumber=0)
Definition: Vehicle.cpp:878
virtual void writeByte(int)
#define VAR_EMERGENCY_DECEL
bool readTypeCheckingStringList(tcpip::Storage &inputStorage, std::vector< std::string > &into)
Reads the value type and a string list, verifying the type.
virtual void writeStringList(const std::vector< std::string > &s)
#define STEPS2TIME(x)
Definition: SUMOTime.h:58
The maximum speed is used.
#define CMD_SET_VEHICLE_VARIABLE
static void moveTo(const std::string &vehicleID, const std::string &laneID, double position)
Definition: Vehicle.cpp:1253
#define VAR_IMPERFECTION
tcpip::Storage & getWrapperStorage()
virtual std::string readString()
static void changeLane(const std::string &vehicleID, int laneIndex, double duration)
Definition: Vehicle.cpp:848
#define VAR_EDGE_EFFORT
#define CMD_REROUTE_EFFORT
static bool handleVariable(const std::string &objID, const int variable, VariableWrapper *wrapper)
Definition: Vehicle.cpp:1546
#define ADD
#define REMOVE
TraCI server used to control sumo by a remote TraCI client.
Definition: TraCIServer.h:62
virtual void writeStorage(tcpip::Storage &store)
static void setSpeed(const std::string &vehicleID, double speed)
Definition: Vehicle.cpp:1097
#define VAR_LEADER
If a fixed number of random choices fails, a free position is chosen.
static double getAdaptedTraveltime(const std::string &vehicleID, double time, const std::string &edgeID)
Definition: Vehicle.cpp:299
The rightmost lane the vehicle may use.
#define INVALID_DOUBLE_VALUE
#define VAR_SPEED
void writeResponseWithLength(tcpip::Storage &outputStorage, tcpip::Storage &tempMsg)
static std::string getParameter(const std::string &vehicleID, const std::string &key)
Definition: Vehicle.cpp:573
#define VAR_EDGE_TRAVELTIME
static bool setVariable(const int cmd, const int variable, const std::string &id, TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage)
Processes a set value for the given type.
virtual void writeString(const std::string &s)
static void changeTarget(const std::string &vehicleID, const std::string &edgeID)
Definition: Vehicle.cpp:822
static bool handleVariable(const std::string &objID, const int variable, VariableWrapper *wrapper)
#define VAR_MOVE_TO
#define SUMOTime_MAX
Definition: SUMOTime.h:37
static void setSignals(const std::string &vehicleID, int signals)
Definition: Vehicle.cpp:1240
#define TYPE_DOUBLE
std::string toHex(const T i, std::streamsize numDigits=0)
Definition: ToString.h:59
#define CMD_REROUTE_TRAVELTIME
static void moveToXY(const std::string &vehicleID, const std::string &edgeID, const int laneIndex, const double x, const double y, double angle=INVALID_DOUBLE_VALUE, const int keepRoute=1)
Definition: Vehicle.cpp:986
static double getDrivingDistance2D(const std::string &vehicleID, double x, double y)
Definition: Vehicle.cpp:501
#define TYPE_BYTE
static std::pair< std::string, double > getLeader(const std::string &vehicleID, double dist=0.)
Definition: Vehicle.cpp:273
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:94
static void slowDown(const std::string &vehicleID, double speed, double duration)
Definition: Vehicle.cpp:1088
virtual void writeDouble(double)
static void setAdaptedTraveltime(const std::string &vehicleID, const std::string &edgeID, double time=INVALID_DOUBLE_VALUE, double begSeconds=0, double endSeconds=std::numeric_limits< double >::max())
Definition: Vehicle.cpp:1173
static void changeLaneRelative(const std::string &vehicleID, int laneChange, double duration)
Definition: Vehicle.cpp:856
void writeStatusCmd(int commandId, int status, const std::string &description, tcpip::Storage &outputStorage)
Writes a status command to the given storage.
static void remove(const std::string &vehicleID, char reason=REMOVE_VAPORIZED)
Definition: Vehicle.cpp:1309
#define VAR_APPARENT_DECEL
double length
The length than can be driven from that lane without lane change.
Definition: TraCIDefs.h:308
#define VAR_LANECHANGE_MODE
#define VAR_MAXSPEED
#define VAR_MINGAP_LAT
void initWrapper(const int domainID, const int variable, const std::string &objID)
#define VAR_DECEL
A free position is chosen.
#define VAR_PARAMETER
Insert behind the last vehicle as close as possible to still allow the specified departSpeed. Fallback to DEPART_POS_BASE if there is no vehicle on the departLane yet.
static void setType(const std::string &vehicleID, const std::string &typeID)
Definition: Vehicle.cpp:1123
#define VAR_NEXT_STOPS
#define VAR_LINE
MSVehicleType & getSingularType()
Replaces the current vehicle type with a new one used by this vehicle only.
static double getDrivingDistance(const std::string &vehicleID, const std::string &edgeID, double position, int laneIndex=0)
Definition: Vehicle.cpp:485
#define RTYPE_ERR
#define TYPE_INTEGER
#define VAR_MINGAP
#define ADD_FULL
static void changeSublane(const std::string &vehicleID, double latDist)
Definition: Vehicle.cpp:872
Back-at-zero position.
static std::vector< TraCINextStopData > getNextStops(const std::string &vehicleID)
Definition: Vehicle.cpp:401
#define VAR_MAXSPEED_LAT
std::vector< std::string > continuationLanes
The sequence of lanes that best allows continuing the route without lane change.
Definition: TraCIDefs.h:316
bool readTypeCheckingByte(tcpip::Storage &inputStorage, int &into)
Reads the value type and a byte, verifying the type.
#define VAR_WIDTH
static void rerouteEffort(const std::string &vehicleID)
Definition: Vehicle.cpp:1233