LCOV - code coverage report
Current view: top level - src/utils/traci - TraCIAPI.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 63.7 % 2366 1506
Test Date: 2024-12-21 15:45:41 Functions: 53.0 % 404 214

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2012-2024 German Aerospace Center (DLR) and others.
       4              : // This program and the accompanying materials are made available under the
       5              : // terms of the Eclipse Public License 2.0 which is available at
       6              : // https://www.eclipse.org/legal/epl-2.0/
       7              : // This Source Code may also be made available under the following Secondary
       8              : // Licenses when the conditions for such availability set forth in the Eclipse
       9              : // Public License 2.0 are satisfied: GNU General Public License, version 2
      10              : // or later which is available at
      11              : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
      12              : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
      13              : /****************************************************************************/
      14              : /// @file    TraCIAPI.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Mario Krumnow
      17              : /// @author  Jakob Erdmann
      18              : /// @author  Michael Behrisch
      19              : /// @date    30.05.2012
      20              : ///
      21              : // C++ TraCI client API implementation
      22              : /****************************************************************************/
      23              : #include "TraCIAPI.h"
      24              : 
      25              : 
      26              : // ===========================================================================
      27              : // member definitions
      28              : // ===========================================================================
      29              : 
      30              : // ---------------------------------------------------------------------------
      31              : // TraCIAPI-methods
      32              : // ---------------------------------------------------------------------------
      33              : 
      34         1248 : TraCIAPI::TraCIAPI() :
      35              :     edge(*this), gui(*this), inductionloop(*this),
      36              :     junction(*this), lane(*this), lanearea(*this), multientryexit(*this),
      37              :     person(*this), poi(*this), polygon(*this),
      38              :     rerouter(*this), route(*this), routeprobe(*this),
      39              :     simulation(*this), trafficlights(*this),
      40              :     vehicle(*this), vehicletype(*this),
      41         1248 :     mySocket(nullptr) {
      42         1248 :     std::cerr << "TraCIAPI is deprecated. Please use libtraci instead, see https://sumo.dlr.de/docs/Libtraci.html.\n";
      43         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_EDGE_VARIABLE] = &edge;
      44         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_GUI_VARIABLE] = &gui;
      45         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_JUNCTION_VARIABLE] = &junction;
      46         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_LANE_VARIABLE] = &lane;
      47         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_LANEAREA_VARIABLE] = &lanearea;
      48         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_MULTIENTRYEXIT_VARIABLE] = &multientryexit;
      49         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_PERSON_VARIABLE] = &person;
      50         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_POI_VARIABLE] = &poi;
      51         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_POLYGON_VARIABLE] = &polygon;
      52         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_REROUTER_VARIABLE] = &rerouter;
      53         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_ROUTE_VARIABLE] = &route;
      54         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_ROUTEPROBE_VARIABLE] = &routeprobe;
      55         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_SIM_VARIABLE] = &simulation;
      56         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_TL_VARIABLE] = &trafficlights;
      57         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_VEHICLE_VARIABLE] = &vehicle;
      58         1248 :     myDomains[libsumo::RESPONSE_SUBSCRIBE_VEHICLETYPE_VARIABLE] = &vehicletype;
      59         1248 : }
      60              : 
      61              : 
      62         1248 : TraCIAPI::~TraCIAPI() {
      63         1248 :     delete mySocket;
      64         1248 : }
      65              : 
      66              : 
      67              : void
      68         1248 : TraCIAPI::connect(const std::string& host, int port) {
      69         2496 :     mySocket = new tcpip::Socket(host, port);
      70              :     try {
      71         1248 :         mySocket->connect();
      72          639 :     } catch (tcpip::SocketException&) {
      73          639 :         delete mySocket;
      74          639 :         mySocket = nullptr;
      75          639 :         throw;
      76          639 :     }
      77          609 : }
      78              : 
      79              : 
      80              : void
      81            1 : TraCIAPI::setOrder(int order) {
      82            1 :     tcpip::Storage outMsg;
      83              :     // command length
      84            1 :     outMsg.writeUnsignedByte(1 + 1 + 4);
      85              :     // command id
      86            1 :     outMsg.writeUnsignedByte(libsumo::CMD_SETORDER);
      87            1 :     outMsg.writeInt(order);
      88              :     // send request message
      89            1 :     mySocket->sendExact(outMsg);
      90            1 :     tcpip::Storage inMsg;
      91            1 :     check_resultState(inMsg, libsumo::CMD_SETORDER);
      92            1 : }
      93              : 
      94              : 
      95              : void
      96            0 : TraCIAPI::close() {
      97            0 :     send_commandClose();
      98            0 :     tcpip::Storage inMsg;
      99              :     std::string acknowledgement;
     100            0 :     check_resultState(inMsg, libsumo::CMD_CLOSE, false, &acknowledgement);
     101            0 :     closeSocket();
     102            0 : }
     103              : 
     104              : 
     105              : void
     106          608 : TraCIAPI::closeSocket() {
     107          608 :     if (mySocket == nullptr) {
     108              :         return;
     109              :     }
     110          608 :     mySocket->close();
     111          608 :     delete mySocket;
     112          608 :     mySocket = nullptr;
     113              : }
     114              : 
     115              : 
     116              : void
     117         5064 : TraCIAPI::send_commandSimulationStep(double time) const {
     118         5064 :     tcpip::Storage outMsg;
     119              :     // command length
     120         5064 :     outMsg.writeUnsignedByte(1 + 1 + 8);
     121              :     // command id
     122         5064 :     outMsg.writeUnsignedByte(libsumo::CMD_SIMSTEP);
     123         5064 :     outMsg.writeDouble(time);
     124              :     // send request message
     125         5064 :     mySocket->sendExact(outMsg);
     126         5064 : }
     127              : 
     128              : 
     129              : void
     130          608 : TraCIAPI::send_commandClose() const {
     131          608 :     tcpip::Storage outMsg;
     132              :     // command length
     133          608 :     outMsg.writeUnsignedByte(1 + 1);
     134              :     // command id
     135          608 :     outMsg.writeUnsignedByte(libsumo::CMD_CLOSE);
     136          608 :     mySocket->sendExact(outMsg);
     137          608 : }
     138              : 
     139              : 
     140              : void
     141            1 : TraCIAPI::send_commandSetOrder(int order) const {
     142            1 :     tcpip::Storage outMsg;
     143              :     // command length
     144            1 :     outMsg.writeUnsignedByte(1 + 1 + 4);
     145              :     // command id
     146            1 :     outMsg.writeUnsignedByte(libsumo::CMD_SETORDER);
     147              :     // client index
     148            1 :     outMsg.writeInt(order);
     149            1 :     mySocket->sendExact(outMsg);
     150            1 : }
     151              : 
     152              : 
     153              : void
     154         1924 : TraCIAPI::createCommand(int cmdID, int varID, const std::string& objID, tcpip::Storage* add) const {
     155         1924 :     myOutput.reset();
     156              :     // command length
     157         1924 :     int length = 1 + 1 + 1 + 4 + (int) objID.length();
     158         1924 :     if (add != nullptr) {
     159          512 :         length += (int)add->size();
     160              :     }
     161         1924 :     if (length <= 255) {
     162         1923 :         myOutput.writeUnsignedByte(length);
     163              :     } else {
     164            1 :         myOutput.writeUnsignedByte(0);
     165            1 :         myOutput.writeInt(length + 4);
     166              :     }
     167         1924 :     myOutput.writeUnsignedByte(cmdID);
     168         1924 :     myOutput.writeUnsignedByte(varID);
     169         1924 :     myOutput.writeString(objID);
     170              :     // additional values
     171         1924 :     if (add != nullptr) {
     172          512 :         myOutput.writeStorage(*add);
     173              :     }
     174         1924 : }
     175              : 
     176              : 
     177              : void
     178           15 : TraCIAPI::createFilterCommand(int cmdID, int varID, tcpip::Storage* add) const {
     179           15 :     myOutput.reset();
     180              :     // command length
     181              :     int length = 1 + 1 + 1;
     182           15 :     if (add != nullptr) {
     183           11 :         length += (int)add->size();
     184              :     }
     185           11 :     if (length <= 255) {
     186           15 :         myOutput.writeUnsignedByte(length);
     187              :     } else {
     188            0 :         myOutput.writeUnsignedByte(0);
     189            0 :         myOutput.writeInt(length + 4);
     190              :     }
     191           15 :     myOutput.writeUnsignedByte(cmdID);
     192           15 :     myOutput.writeUnsignedByte(varID);
     193              :     // additional values
     194           15 :     if (add != nullptr) {
     195           11 :         myOutput.writeStorage(*add);
     196              :     }
     197           15 : }
     198              : 
     199              : 
     200              : void
     201           13 : TraCIAPI::send_commandSubscribeObjectVariable(int domID, const std::string& objID, double beginTime, double endTime,
     202              :         const std::vector<int>& vars) const {
     203           13 :     if (mySocket == nullptr) {
     204            0 :         throw tcpip::SocketException("Socket is not initialised");
     205              :     }
     206           13 :     tcpip::Storage outMsg;
     207              :     // command length (domID, objID, beginTime, endTime, length, vars)
     208           13 :     int varNo = (int) vars.size();
     209           13 :     outMsg.writeUnsignedByte(0);
     210           13 :     outMsg.writeInt(5 + 1 + 8 + 8 + 4 + (int) objID.length() + 1 + varNo);
     211              :     // command id
     212           13 :     outMsg.writeUnsignedByte(domID);
     213              :     // time
     214           13 :     outMsg.writeDouble(beginTime);
     215           13 :     outMsg.writeDouble(endTime);
     216              :     // object id
     217           13 :     outMsg.writeString(objID);
     218              :     // command id
     219           13 :     outMsg.writeUnsignedByte((int)vars.size());
     220           30 :     for (int i = 0; i < varNo; ++i) {
     221           17 :         outMsg.writeUnsignedByte(vars[i]);
     222              :     }
     223              :     // send message
     224           13 :     mySocket->sendExact(outMsg);
     225           13 : }
     226              : 
     227              : 
     228              : void
     229            8 : TraCIAPI::send_commandSubscribeObjectContext(int domID, const std::string& objID, double beginTime, double endTime,
     230              :         int domain, double range, const std::vector<int>& vars) const {
     231            8 :     if (mySocket == nullptr) {
     232            0 :         throw tcpip::SocketException("Socket is not initialised");
     233              :     }
     234            8 :     tcpip::Storage outMsg;
     235              :     // command length (domID, objID, beginTime, endTime, length, vars)
     236            8 :     int varNo = (int) vars.size();
     237            8 :     outMsg.writeUnsignedByte(0);
     238            8 :     outMsg.writeInt(5 + 1 + 8 + 8 + 4 + (int) objID.length() + 1 + 8 + 1 + varNo);
     239              :     // command id
     240            8 :     outMsg.writeUnsignedByte(domID);
     241              :     // time
     242            8 :     outMsg.writeDouble(beginTime);
     243            8 :     outMsg.writeDouble(endTime);
     244              :     // object id
     245            8 :     outMsg.writeString(objID);
     246              :     // domain and range
     247            8 :     outMsg.writeUnsignedByte(domain);
     248            8 :     outMsg.writeDouble(range);
     249              :     // command id
     250            8 :     outMsg.writeUnsignedByte((int)vars.size());
     251           19 :     for (int i = 0; i < varNo; ++i) {
     252           11 :         outMsg.writeUnsignedByte(vars[i]);
     253              :     }
     254              :     // send message
     255            8 :     mySocket->sendExact(outMsg);
     256            8 : }
     257              : 
     258              : 
     259              : void
     260         7636 : TraCIAPI::check_resultState(tcpip::Storage& inMsg, int command, bool ignoreCommandId, std::string* acknowledgement) const {
     261         7636 :     mySocket->receiveExact(inMsg);
     262              :     int cmdLength;
     263              :     int cmdId;
     264              :     int resultType;
     265              :     int cmdStart;
     266              :     std::string msg;
     267              :     try {
     268         7635 :         cmdStart = inMsg.position();
     269         7635 :         cmdLength = inMsg.readUnsignedByte();
     270         7635 :         cmdId = inMsg.readUnsignedByte();
     271         7635 :         if (command != cmdId && !ignoreCommandId) {
     272            0 :             throw libsumo::TraCIException("#Error: received status response to command: " + toString(cmdId) + " but expected: " + toString(command));
     273              :         }
     274         7635 :         resultType = inMsg.readUnsignedByte();
     275         7635 :         msg = inMsg.readString();
     276            0 :     } catch (std::invalid_argument&) {
     277            0 :         throw libsumo::TraCIException("#Error: an exception was thrown while reading result state message");
     278            0 :     }
     279         7635 :     switch (resultType) {
     280          159 :         case libsumo::RTYPE_ERR:
     281          318 :             throw libsumo::TraCIException(".. Answered with error to command (" + toString(command) + "), [description: " + msg + "]");
     282            2 :         case libsumo::RTYPE_NOTIMPLEMENTED:
     283            4 :             throw libsumo::TraCIException(".. Sent command is not implemented (" + toString(command) + "), [description: " + msg + "]");
     284         7474 :         case libsumo::RTYPE_OK:
     285         7474 :             if (acknowledgement != nullptr) {
     286        21557 :                 (*acknowledgement) = ".. Command acknowledged (" + toString(command) + "), [description: " + msg + "]";
     287              :             }
     288              :             break;
     289            0 :         default:
     290            0 :             throw libsumo::TraCIException(".. Answered with unknown result code(" + toString(resultType) + ") to command(" + toString(command) + "), [description: " + msg + "]");
     291              :     }
     292         7474 :     if ((cmdStart + cmdLength) != (int) inMsg.position()) {
     293            0 :         throw libsumo::TraCIException("#Error: command at position " + toString(cmdStart) + " has wrong length");
     294              :     }
     295         7474 : }
     296              : 
     297              : 
     298              : int
     299         1483 : TraCIAPI::check_commandGetResult(tcpip::Storage& inMsg, int command, int expectedType, bool ignoreCommandId) const {
     300         1483 :     inMsg.position(); // respStart
     301         1483 :     int length = inMsg.readUnsignedByte();
     302         1483 :     if (length == 0) {
     303           53 :         length = inMsg.readInt();
     304              :     }
     305         1483 :     int cmdId = inMsg.readUnsignedByte();
     306         1483 :     if (!ignoreCommandId && cmdId != (command + 0x10)) {
     307            0 :         throw libsumo::TraCIException("#Error: received response with command id: " + toString(cmdId) + "but expected: " + toString(command + 0x10));
     308              :     }
     309         1483 :     if (expectedType >= 0) {
     310              :         // not called from the TraCITestClient but from within the TraCIAPI
     311          198 :         inMsg.readUnsignedByte(); // variableID
     312          198 :         inMsg.readString(); // objectID
     313          198 :         int valueDataType = inMsg.readUnsignedByte();
     314          198 :         if (valueDataType != expectedType) {
     315            0 :             throw libsumo::TraCIException("Expected " + toString(expectedType) + " but got " + toString(valueDataType));
     316              :         }
     317              :     }
     318         1483 :     return cmdId;
     319              : }
     320              : 
     321              : 
     322              : bool
     323          200 : TraCIAPI::processGet(int command, int expectedType, bool ignoreCommandId) {
     324          200 :     if (mySocket != nullptr) {
     325          200 :         mySocket->sendExact(myOutput);
     326          200 :         myInput.reset();
     327          200 :         check_resultState(myInput, command, ignoreCommandId);
     328          198 :         check_commandGetResult(myInput, command, expectedType, ignoreCommandId);
     329          198 :         return true;
     330              :     }
     331              :     return false;
     332              : }
     333              : 
     334              : 
     335              : bool
     336          125 : TraCIAPI::processSet(int command) {
     337          125 :     if (mySocket != nullptr) {
     338          125 :         mySocket->sendExact(myOutput);
     339          125 :         myInput.reset();
     340          125 :         check_resultState(myInput, command);
     341          124 :         return true;
     342              :     }
     343              :     return false;
     344              : }
     345              : 
     346              : 
     347              : void
     348           39 : TraCIAPI::readVariables(tcpip::Storage& inMsg, const std::string& objectID, int variableCount, libsumo::SubscriptionResults& into) {
     349           87 :     while (variableCount > 0) {
     350              : 
     351           48 :         const int variableID = inMsg.readUnsignedByte();
     352           48 :         const int status = inMsg.readUnsignedByte();
     353           48 :         const int type = inMsg.readUnsignedByte();
     354              : 
     355           48 :         if (status == libsumo::RTYPE_OK) {
     356           48 :             switch (type) {
     357           39 :                 case libsumo::TYPE_DOUBLE:
     358           39 :                     into[objectID][variableID] = std::make_shared<libsumo::TraCIDouble>(inMsg.readDouble());
     359           39 :                     break;
     360            9 :                 case libsumo::TYPE_STRING:
     361           18 :                     into[objectID][variableID] = std::make_shared<libsumo::TraCIString>(inMsg.readString());
     362            9 :                     break;
     363            0 :                 case libsumo::POSITION_2D: {
     364              :                     auto p = std::make_shared<libsumo::TraCIPosition>();
     365            0 :                     p->x = inMsg.readDouble();
     366            0 :                     p->y = inMsg.readDouble();
     367            0 :                     p->z = 0.;
     368            0 :                     into[objectID][variableID] = p;
     369              :                     break;
     370              :                 }
     371            0 :                 case libsumo::POSITION_3D: {
     372              :                     auto p = std::make_shared<libsumo::TraCIPosition>();
     373            0 :                     p->x = inMsg.readDouble();
     374            0 :                     p->y = inMsg.readDouble();
     375            0 :                     p->z = inMsg.readDouble();
     376            0 :                     into[objectID][variableID] = p;
     377              :                     break;
     378              :                 }
     379            0 :                 case libsumo::TYPE_COLOR: {
     380              :                     auto c = std::make_shared<libsumo::TraCIColor>();
     381            0 :                     c->r = (unsigned char)inMsg.readUnsignedByte();
     382            0 :                     c->g = (unsigned char)inMsg.readUnsignedByte();
     383            0 :                     c->b = (unsigned char)inMsg.readUnsignedByte();
     384            0 :                     c->a = (unsigned char)inMsg.readUnsignedByte();
     385            0 :                     into[objectID][variableID] = c;
     386              :                     break;
     387              :                 }
     388            0 :                 case libsumo::TYPE_INTEGER:
     389            0 :                     into[objectID][variableID] = std::make_shared<libsumo::TraCIInt>(inMsg.readInt());
     390            0 :                     break;
     391            0 :                 case libsumo::TYPE_STRINGLIST: {
     392              :                     auto sl = std::make_shared<libsumo::TraCIStringList>();
     393            0 :                     int n = inMsg.readInt();
     394            0 :                     for (int i = 0; i < n; ++i) {
     395            0 :                         sl->value.push_back(inMsg.readString());
     396              :                     }
     397            0 :                     into[objectID][variableID] = sl;
     398              :                 }
     399            0 :                 break;
     400              : 
     401              :                 // TODO Other data types
     402              : 
     403            0 :                 default:
     404            0 :                     throw libsumo::TraCIException("Unimplemented subscription type: " + toString(type));
     405              :             }
     406              :         } else {
     407            0 :             throw libsumo::TraCIException("Subscription response error: variableID=" + toString(variableID) + " status=" + toString(status));
     408              :         }
     409              : 
     410           48 :         variableCount--;
     411              :     }
     412           39 : }
     413              : 
     414              : 
     415              : void
     416            9 : TraCIAPI::readVariableSubscription(int cmdId, tcpip::Storage& inMsg) {
     417            9 :     const std::string objectID = inMsg.readString();
     418            9 :     const int variableCount = inMsg.readUnsignedByte();
     419            9 :     readVariables(inMsg, objectID, variableCount, myDomains[cmdId]->getModifiableSubscriptionResults());
     420            9 : }
     421              : 
     422              : 
     423              : void
     424           26 : TraCIAPI::readContextSubscription(int cmdId, tcpip::Storage& inMsg) {
     425           26 :     const std::string contextID = inMsg.readString();
     426           26 :     inMsg.readUnsignedByte(); // context domain
     427           26 :     const int variableCount = inMsg.readUnsignedByte();
     428           26 :     int numObjects = inMsg.readInt();
     429              : 
     430           56 :     while (numObjects > 0) {
     431           30 :         std::string objectID = inMsg.readString();
     432           30 :         readVariables(inMsg, objectID, variableCount, myDomains[cmdId]->getModifiableContextSubscriptionResults(contextID));
     433           30 :         numObjects--;
     434              :     }
     435           26 : }
     436              : 
     437              : 
     438              : void
     439           10 : TraCIAPI::simulationStep(double time) {
     440           10 :     send_commandSimulationStep(time);
     441           10 :     tcpip::Storage inMsg;
     442           10 :     check_resultState(inMsg, libsumo::CMD_SIMSTEP);
     443              : 
     444          170 :     for (auto it : myDomains) {
     445          160 :         it.second->clearSubscriptionResults();
     446              :     }
     447           10 :     int numSubs = inMsg.readInt();
     448           38 :     while (numSubs > 0) {
     449           28 :         int cmdId = check_commandGetResult(inMsg, 0, -1, true);
     450           28 :         if (cmdId >= libsumo::RESPONSE_SUBSCRIBE_INDUCTIONLOOP_VARIABLE && cmdId <= libsumo::RESPONSE_SUBSCRIBE_PERSON_VARIABLE) {
     451            7 :             readVariableSubscription(cmdId, inMsg);
     452              :         } else {
     453           21 :             readContextSubscription(cmdId + 0x50, inMsg);
     454              :         }
     455           28 :         numSubs--;
     456              :     }
     457           10 : }
     458              : 
     459              : 
     460              : void
     461            1 : TraCIAPI::load(const std::vector<std::string>& args) {
     462              :     int numChars = 0;
     463            8 :     for (int i = 0; i < (int)args.size(); ++i) {
     464            7 :         numChars += (int)args[i].size();
     465              :     }
     466            1 :     tcpip::Storage content;
     467            1 :     content.writeUnsignedByte(0);
     468            1 :     content.writeInt(1 + 4 + 1 + 1 + 4 + numChars + 4 * (int)args.size());
     469            1 :     content.writeUnsignedByte(libsumo::CMD_LOAD);
     470            1 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
     471            1 :     content.writeStringList(args);
     472            1 :     mySocket->sendExact(content);
     473            1 :     tcpip::Storage inMsg;
     474            1 :     check_resultState(inMsg, libsumo::CMD_LOAD);
     475            1 : }
     476              : 
     477              : 
     478              : std::pair<int, std::string>
     479            1 : TraCIAPI::getVersion() {
     480            1 :     tcpip::Storage content;
     481            1 :     content.writeUnsignedByte(2);
     482            1 :     content.writeUnsignedByte(libsumo::CMD_GETVERSION);
     483            1 :     mySocket->sendExact(content);
     484            1 :     tcpip::Storage inMsg;
     485            1 :     check_resultState(inMsg, libsumo::CMD_GETVERSION);
     486            1 :     inMsg.readUnsignedByte(); // msg length
     487            1 :     inMsg.readUnsignedByte(); // libsumo::CMD_GETVERSION again, see #7284
     488            1 :     const int traciVersion = inMsg.readInt(); // to fix evaluation order
     489            2 :     return std::make_pair(traciVersion, inMsg.readString());
     490            1 : }
     491              : 
     492              : 
     493              : // ---------------------------------------------------------------------------
     494              : // TraCIAPI::EdgeScope-methods
     495              : // ---------------------------------------------------------------------------
     496              : double
     497            1 : TraCIAPI::EdgeScope::getAdaptedTraveltime(const std::string& edgeID, double time) const {
     498            1 :     tcpip::Storage content;
     499            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
     500            1 :     content.writeDouble(time);
     501            2 :     return getDouble(libsumo::VAR_EDGE_TRAVELTIME, edgeID, &content);
     502            1 : }
     503              : 
     504              : double
     505            1 : TraCIAPI::EdgeScope::getEffort(const std::string& edgeID, double time) const {
     506            1 :     tcpip::Storage content;
     507            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
     508            1 :     content.writeDouble(time);
     509            2 :     return getDouble(libsumo::VAR_EDGE_EFFORT, edgeID, &content);
     510            1 : }
     511              : 
     512              : double
     513            0 : TraCIAPI::EdgeScope::getCO2Emission(const std::string& edgeID) const {
     514            0 :     return getDouble(libsumo::VAR_CO2EMISSION, edgeID);
     515              : }
     516              : 
     517              : 
     518              : double
     519            0 : TraCIAPI::EdgeScope::getCOEmission(const std::string& edgeID) const {
     520            0 :     return getDouble(libsumo::VAR_COEMISSION, edgeID);
     521              : }
     522              : 
     523              : double
     524            0 : TraCIAPI::EdgeScope::getHCEmission(const std::string& edgeID) const {
     525            0 :     return getDouble(libsumo::VAR_HCEMISSION, edgeID);
     526              : }
     527              : 
     528              : double
     529            0 : TraCIAPI::EdgeScope::getPMxEmission(const std::string& edgeID) const {
     530            0 :     return getDouble(libsumo::VAR_PMXEMISSION, edgeID);
     531              : }
     532              : 
     533              : double
     534            0 : TraCIAPI::EdgeScope::getNOxEmission(const std::string& edgeID) const {
     535            0 :     return getDouble(libsumo::VAR_NOXEMISSION, edgeID);
     536              : }
     537              : 
     538              : double
     539            0 : TraCIAPI::EdgeScope::getFuelConsumption(const std::string& edgeID) const {
     540            0 :     return getDouble(libsumo::VAR_FUELCONSUMPTION, edgeID);
     541              : }
     542              : 
     543              : double
     544            0 : TraCIAPI::EdgeScope::getNoiseEmission(const std::string& edgeID) const {
     545            0 :     return getDouble(libsumo::VAR_NOISEEMISSION, edgeID);
     546              : }
     547              : 
     548              : double
     549            0 : TraCIAPI::EdgeScope::getElectricityConsumption(const std::string& edgeID) const {
     550            0 :     return getDouble(libsumo::VAR_ELECTRICITYCONSUMPTION, edgeID);
     551              : }
     552              : 
     553              : double
     554            0 : TraCIAPI::EdgeScope::getLastStepMeanSpeed(const std::string& edgeID) const {
     555            0 :     return getDouble(libsumo::LAST_STEP_MEAN_SPEED, edgeID);
     556              : }
     557              : 
     558              : double
     559            0 : TraCIAPI::EdgeScope::getLastStepOccupancy(const std::string& edgeID) const {
     560            0 :     return getDouble(libsumo::LAST_STEP_OCCUPANCY, edgeID);
     561              : }
     562              : 
     563              : double
     564            0 : TraCIAPI::EdgeScope::getLastStepLength(const std::string& edgeID) const {
     565            0 :     return getDouble(libsumo::LAST_STEP_LENGTH, edgeID);
     566              : }
     567              : 
     568              : double
     569           48 : TraCIAPI::EdgeScope::getTraveltime(const std::string& edgeID) const {
     570           48 :     return getDouble(libsumo::VAR_CURRENT_TRAVELTIME, edgeID);
     571              : }
     572              : 
     573              : int
     574            0 : TraCIAPI::EdgeScope::getLastStepVehicleNumber(const std::string& edgeID) const {
     575            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_NUMBER, edgeID);
     576              : }
     577              : 
     578              : double
     579            0 : TraCIAPI::EdgeScope::getLastStepHaltingNumber(const std::string& edgeID) const {
     580            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_HALTING_NUMBER, edgeID);
     581              : }
     582              : 
     583              : std::vector<std::string>
     584            0 : TraCIAPI::EdgeScope::getLastStepVehicleIDs(const std::string& edgeID) const {
     585            0 :     return getStringVector(libsumo::LAST_STEP_VEHICLE_ID_LIST, edgeID);
     586              : }
     587              : 
     588              : 
     589              : int
     590            1 : TraCIAPI::EdgeScope::getLaneNumber(const std::string& edgeID) const {
     591            1 :     return getInt(libsumo::VAR_LANE_INDEX, edgeID);
     592              : }
     593              : 
     594              : 
     595              : std::string
     596            1 : TraCIAPI::EdgeScope::getStreetName(const std::string& edgeID) const {
     597            1 :     return getString(libsumo::VAR_NAME, edgeID);
     598              : }
     599              : 
     600              : 
     601              : void
     602           48 : TraCIAPI::EdgeScope::adaptTraveltime(const std::string& edgeID, double time, double beginSeconds, double endSeconds) const {
     603           48 :     tcpip::Storage content;
     604           48 :     content.writeByte(libsumo::TYPE_COMPOUND);
     605           48 :     if (endSeconds != std::numeric_limits<double>::max()) {
     606            1 :         content.writeInt(3);
     607            1 :         content.writeByte(libsumo::TYPE_DOUBLE);
     608            1 :         content.writeDouble(beginSeconds);
     609            1 :         content.writeByte(libsumo::TYPE_DOUBLE);
     610            1 :         content.writeDouble(endSeconds);
     611              :     } else {
     612           47 :         content.writeInt(1);
     613              :     }
     614           48 :     content.writeByte(libsumo::TYPE_DOUBLE);
     615           48 :     content.writeDouble(time);
     616           48 :     myParent.createCommand(libsumo::CMD_SET_EDGE_VARIABLE, libsumo::VAR_EDGE_TRAVELTIME, edgeID, &content);
     617           48 :     myParent.processSet(libsumo::CMD_SET_EDGE_VARIABLE);
     618           48 : }
     619              : 
     620              : 
     621              : void
     622            1 : TraCIAPI::EdgeScope::setEffort(const std::string& edgeID, double effort, double beginSeconds, double endSeconds) const {
     623            1 :     tcpip::Storage content;
     624            1 :     content.writeByte(libsumo::TYPE_COMPOUND);
     625            1 :     if (endSeconds != std::numeric_limits<double>::max()) {
     626            1 :         content.writeInt(3);
     627            1 :         content.writeByte(libsumo::TYPE_DOUBLE);
     628            1 :         content.writeDouble(beginSeconds);
     629            1 :         content.writeByte(libsumo::TYPE_DOUBLE);
     630            1 :         content.writeDouble(endSeconds);
     631              :     } else {
     632            0 :         content.writeInt(1);
     633              :     }
     634            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
     635            1 :     content.writeDouble(effort);
     636            1 :     myParent.createCommand(libsumo::CMD_SET_EDGE_VARIABLE, libsumo::VAR_EDGE_EFFORT, edgeID, &content);
     637            1 :     myParent.processSet(libsumo::CMD_SET_EDGE_VARIABLE);
     638            1 : }
     639              : 
     640              : void
     641            1 : TraCIAPI::EdgeScope::setMaxSpeed(const std::string& edgeID, double speed) const {
     642            1 :     setDouble(libsumo::VAR_MAXSPEED, edgeID, speed);
     643            1 : }
     644              : 
     645              : 
     646              : // ---------------------------------------------------------------------------
     647              : // TraCIAPI::GUIScope-methods
     648              : // ---------------------------------------------------------------------------
     649              : double
     650            0 : TraCIAPI::GUIScope::getZoom(const std::string& viewID) const {
     651            0 :     return getDouble(libsumo::VAR_VIEW_ZOOM, viewID);
     652              : }
     653              : 
     654              : libsumo::TraCIPosition
     655            0 : TraCIAPI::GUIScope::getOffset(const std::string& viewID) const {
     656            0 :     return getPos(libsumo::VAR_VIEW_OFFSET, viewID);
     657              : }
     658              : 
     659              : std::string
     660            0 : TraCIAPI::GUIScope::getSchema(const std::string& viewID) const {
     661            0 :     return getString(libsumo::VAR_VIEW_SCHEMA, viewID);
     662              : }
     663              : 
     664              : libsumo::TraCIPositionVector
     665            0 : TraCIAPI::GUIScope::getBoundary(const std::string& viewID) const {
     666            0 :     return getPolygon(libsumo::VAR_VIEW_BOUNDARY, viewID);
     667              : }
     668              : 
     669              : 
     670              : void
     671            0 : TraCIAPI::GUIScope::setZoom(const std::string& viewID, double zoom) const {
     672            0 :     setDouble(libsumo::VAR_VIEW_ZOOM, viewID, zoom);
     673            0 : }
     674              : 
     675              : void
     676            0 : TraCIAPI::GUIScope::setOffset(const std::string& viewID, double x, double y) const {
     677            0 :     tcpip::Storage content;
     678            0 :     content.writeUnsignedByte(libsumo::POSITION_2D);
     679            0 :     content.writeDouble(x);
     680            0 :     content.writeDouble(y);
     681            0 :     myParent.createCommand(libsumo::CMD_SET_GUI_VARIABLE, libsumo::VAR_VIEW_OFFSET, viewID, &content);
     682            0 :     myParent.processSet(libsumo::CMD_SET_GUI_VARIABLE);
     683            0 : }
     684              : 
     685              : void
     686            1 : TraCIAPI::GUIScope::setSchema(const std::string& viewID, const std::string& schemeName) const {
     687            1 :     setString(libsumo::VAR_VIEW_SCHEMA, viewID, schemeName);
     688            0 : }
     689              : 
     690              : void
     691            0 : TraCIAPI::GUIScope::setBoundary(const std::string& viewID, double xmin, double ymin, double xmax, double ymax) const {
     692            0 :     tcpip::Storage content;
     693            0 :     content.writeUnsignedByte(libsumo::TYPE_POLYGON);
     694            0 :     content.writeByte(2);
     695            0 :     content.writeDouble(xmin);
     696            0 :     content.writeDouble(ymin);
     697            0 :     content.writeDouble(xmax);
     698            0 :     content.writeDouble(ymax);
     699            0 :     myParent.createCommand(libsumo::CMD_SET_GUI_VARIABLE, libsumo::VAR_VIEW_BOUNDARY, viewID, &content);
     700            0 :     myParent.processSet(libsumo::CMD_SET_GUI_VARIABLE);
     701            0 : }
     702              : 
     703              : void
     704            0 : TraCIAPI::GUIScope::screenshot(const std::string& viewID, const std::string& filename, const int width, const int height) const {
     705            0 :     tcpip::Storage content;
     706            0 :     content.writeByte(libsumo::TYPE_COMPOUND);
     707            0 :     content.writeInt(3);
     708            0 :     content.writeByte(libsumo::TYPE_STRING);
     709            0 :     content.writeString(filename);
     710            0 :     content.writeByte(libsumo::TYPE_INTEGER);
     711            0 :     content.writeInt(width);
     712            0 :     content.writeByte(libsumo::TYPE_INTEGER);
     713            0 :     content.writeInt(height);
     714            0 :     myParent.createCommand(libsumo::CMD_SET_GUI_VARIABLE, libsumo::VAR_SCREENSHOT, viewID, &content);
     715            0 :     myParent.processSet(libsumo::CMD_SET_GUI_VARIABLE);
     716            0 : }
     717              : 
     718              : void
     719            0 : TraCIAPI::GUIScope::trackVehicle(const std::string& viewID, const std::string& vehID) const {
     720            0 :     setString(libsumo::VAR_VIEW_SCHEMA, viewID, vehID);
     721            0 : }
     722              : 
     723              : 
     724              : // ---------------------------------------------------------------------------
     725              : // TraCIAPI::InductionLoopScope-methods
     726              : // ---------------------------------------------------------------------------
     727              : 
     728            0 : int TraCIAPI::InductionLoopScope::getIntervalVehicleNumber(const std::string& loopID) const {
     729            0 :     return getInt(libsumo::VAR_LAST_INTERVAL_NUMBER, loopID);
     730              : }
     731              : 
     732              : double
     733            0 : TraCIAPI::InductionLoopScope::getPosition(const std::string& loopID) const {
     734            0 :     return getDouble(libsumo::VAR_POSITION, loopID);
     735              : }
     736              : 
     737              : std::string
     738            0 : TraCIAPI::InductionLoopScope::getLaneID(const std::string& loopID) const {
     739            0 :     return getString(libsumo::VAR_LANE_ID, loopID);
     740              : }
     741              : 
     742              : int
     743            0 : TraCIAPI::InductionLoopScope::getLastStepVehicleNumber(const std::string& loopID) const {
     744            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_NUMBER, loopID);
     745              : }
     746              : 
     747              : double
     748            0 : TraCIAPI::InductionLoopScope::getLastStepMeanSpeed(const std::string& loopID) const {
     749            0 :     return getDouble(libsumo::LAST_STEP_MEAN_SPEED, loopID);
     750              : }
     751              : 
     752              : std::vector<std::string>
     753            0 : TraCIAPI::InductionLoopScope::getLastStepVehicleIDs(const std::string& loopID) const {
     754            0 :     return getStringVector(libsumo::LAST_STEP_VEHICLE_ID_LIST, loopID);
     755              : }
     756              : 
     757              : double
     758            0 : TraCIAPI::InductionLoopScope::getLastStepOccupancy(const std::string& loopID) const {
     759            0 :     return getDouble(libsumo::LAST_STEP_OCCUPANCY, loopID);
     760              : }
     761              : 
     762              : double
     763            0 : TraCIAPI::InductionLoopScope::getLastStepMeanLength(const std::string& loopID) const {
     764            0 :     return getDouble(libsumo::LAST_STEP_LENGTH, loopID);
     765              : }
     766              : 
     767              : double
     768            0 : TraCIAPI::InductionLoopScope::getTimeSinceDetection(const std::string& loopID) const {
     769            0 :     return getDouble(libsumo::LAST_STEP_TIME_SINCE_DETECTION, loopID);
     770              : }
     771              : 
     772              : 
     773              : std::vector<libsumo::TraCIVehicleData>
     774            1 : TraCIAPI::InductionLoopScope::getVehicleData(const std::string& loopID) const {
     775              :     std::vector<libsumo::TraCIVehicleData> result;
     776            1 :     myParent.createCommand(libsumo::CMD_GET_INDUCTIONLOOP_VARIABLE, libsumo::LAST_STEP_VEHICLE_DATA, loopID);
     777            1 :     if (myParent.processGet(libsumo::CMD_GET_INDUCTIONLOOP_VARIABLE, libsumo::TYPE_COMPOUND)) {
     778            1 :         myParent.myInput.readInt(); // components
     779              :         // number of items
     780            1 :         myParent.myInput.readUnsignedByte();
     781            1 :         const int n = myParent.myInput.readInt();
     782            1 :         for (int i = 0; i < n; ++i) {
     783              :             libsumo::TraCIVehicleData vd;
     784              : 
     785            0 :             myParent.myInput.readUnsignedByte();
     786            0 :             vd.id = myParent.myInput.readString();
     787              : 
     788            0 :             myParent.myInput.readUnsignedByte();
     789            0 :             vd.length = myParent.myInput.readDouble();
     790              : 
     791            0 :             myParent.myInput.readUnsignedByte();
     792            0 :             vd.entryTime = myParent.myInput.readDouble();
     793              : 
     794            0 :             myParent.myInput.readUnsignedByte();
     795            0 :             vd.leaveTime = myParent.myInput.readDouble();
     796              : 
     797            0 :             myParent.myInput.readUnsignedByte();
     798            0 :             vd.typeID = myParent.myInput.readString();
     799              : 
     800            0 :             result.push_back(vd);
     801              :         }
     802              :     }
     803            1 :     return result;
     804            0 : }
     805              : 
     806              : 
     807              : // ---------------------------------------------------------------------------
     808              : // TraCIAPI::JunctionScope-methods
     809              : // ---------------------------------------------------------------------------
     810              : libsumo::TraCIPosition
     811            0 : TraCIAPI::JunctionScope::getPosition(const std::string& junctionID) const {
     812            0 :     return getPos(libsumo::VAR_POSITION, junctionID);
     813              : }
     814              : 
     815              : libsumo::TraCIPositionVector
     816            1 : TraCIAPI::JunctionScope::getShape(const std::string& junctionID) const {
     817            1 :     return getPolygon(libsumo::VAR_SHAPE, junctionID);
     818              : }
     819              : 
     820              : 
     821              : // ---------------------------------------------------------------------------
     822              : // TraCIAPI::LaneScope-methods
     823              : // ---------------------------------------------------------------------------
     824              : double
     825            0 : TraCIAPI::LaneScope::getLength(const std::string& laneID) const {
     826            0 :     return getDouble(libsumo::VAR_LENGTH, laneID);
     827              : }
     828              : 
     829              : double
     830            2 : TraCIAPI::LaneScope::getMaxSpeed(const std::string& laneID) const {
     831            2 :     return getDouble(libsumo::VAR_MAXSPEED, laneID);
     832              : }
     833              : 
     834              : double
     835            0 : TraCIAPI::LaneScope::getWidth(const std::string& laneID) const {
     836            0 :     return getDouble(libsumo::VAR_WIDTH, laneID);
     837              : }
     838              : 
     839              : std::vector<std::string>
     840            0 : TraCIAPI::LaneScope::getAllowed(const std::string& laneID) const {
     841            0 :     return getStringVector(libsumo::LANE_ALLOWED, laneID);
     842              : }
     843              : 
     844              : std::vector<std::string>
     845            0 : TraCIAPI::LaneScope::getDisallowed(const std::string& laneID) const {
     846            0 :     return getStringVector(libsumo::LANE_DISALLOWED, laneID);
     847              : }
     848              : 
     849              : int
     850            1 : TraCIAPI::LaneScope::getLinkNumber(const std::string& laneID) const {
     851            1 :     return getInt(libsumo::LANE_LINK_NUMBER, laneID);
     852              : }
     853              : 
     854              : std::vector<libsumo::TraCIConnection>
     855            1 : TraCIAPI::LaneScope::getLinks(const std::string& laneID) const {
     856              :     std::vector<libsumo::TraCIConnection> ret;
     857            1 :     myParent.createCommand(libsumo::CMD_GET_LANE_VARIABLE, libsumo::LANE_LINKS, laneID);
     858            1 :     if (myParent.processGet(libsumo::CMD_GET_LANE_VARIABLE, libsumo::TYPE_COMPOUND)) {
     859            1 :         myParent.myInput.readUnsignedByte();
     860            1 :         myParent.myInput.readInt();
     861              : 
     862            1 :         int linkNo = myParent.myInput.readInt();
     863            5 :         for (int i = 0; i < linkNo; ++i) {
     864              : 
     865            4 :             myParent.myInput.readUnsignedByte();
     866            4 :             std::string approachedLane = myParent.myInput.readString();
     867              : 
     868            4 :             myParent.myInput.readUnsignedByte();
     869            4 :             std::string approachedLaneInternal = myParent.myInput.readString();
     870              : 
     871            4 :             myParent.myInput.readUnsignedByte();
     872            4 :             bool hasPrio = myParent.myInput.readUnsignedByte() != 0;
     873              : 
     874            4 :             myParent.myInput.readUnsignedByte();
     875            4 :             bool isOpen = myParent.myInput.readUnsignedByte() != 0;
     876              : 
     877            4 :             myParent.myInput.readUnsignedByte();
     878            4 :             bool hasFoe = myParent.myInput.readUnsignedByte() != 0;
     879              : 
     880            4 :             myParent.myInput.readUnsignedByte();
     881            4 :             std::string state = myParent.myInput.readString();
     882              : 
     883            4 :             myParent.myInput.readUnsignedByte();
     884            4 :             std::string direction = myParent.myInput.readString();
     885              : 
     886            4 :             myParent.myInput.readUnsignedByte();
     887            4 :             double length = myParent.myInput.readDouble();
     888              : 
     889           12 :             ret.push_back(libsumo::TraCIConnection(approachedLane,
     890              :                                                    hasPrio,
     891              :                                                    isOpen,
     892              :                                                    hasFoe,
     893              :                                                    approachedLaneInternal,
     894              :                                                    state,
     895              :                                                    direction,
     896              :                                                    length));
     897              : 
     898              :         }
     899              : 
     900              :     }
     901            1 :     return ret;
     902            0 : }
     903              : 
     904              : libsumo::TraCIPositionVector
     905            0 : TraCIAPI::LaneScope::getShape(const std::string& laneID) const {
     906            0 :     return getPolygon(libsumo::VAR_SHAPE, laneID);
     907              : }
     908              : 
     909              : std::string
     910            0 : TraCIAPI::LaneScope::getEdgeID(const std::string& laneID) const {
     911            0 :     return getString(libsumo::LANE_EDGE_ID, laneID);
     912              : }
     913              : 
     914              : double
     915            0 : TraCIAPI::LaneScope::getCO2Emission(const std::string& laneID) const {
     916            0 :     return getDouble(libsumo::VAR_CO2EMISSION, laneID);
     917              : }
     918              : 
     919              : double
     920            0 : TraCIAPI::LaneScope::getCOEmission(const std::string& laneID) const {
     921            0 :     return getDouble(libsumo::VAR_COEMISSION, laneID);
     922              : }
     923              : 
     924              : double
     925            0 : TraCIAPI::LaneScope::getHCEmission(const std::string& laneID) const {
     926            0 :     return getDouble(libsumo::VAR_HCEMISSION, laneID);
     927              : }
     928              : 
     929              : double
     930            0 : TraCIAPI::LaneScope::getPMxEmission(const std::string& laneID) const {
     931            0 :     return getDouble(libsumo::VAR_PMXEMISSION, laneID);
     932              : }
     933              : 
     934              : double
     935            0 : TraCIAPI::LaneScope::getNOxEmission(const std::string& laneID) const {
     936            0 :     return getDouble(libsumo::VAR_NOXEMISSION, laneID);
     937              : }
     938              : 
     939              : double
     940            0 : TraCIAPI::LaneScope::getFuelConsumption(const std::string& laneID) const {
     941            0 :     return getDouble(libsumo::VAR_FUELCONSUMPTION, laneID);
     942              : }
     943              : 
     944              : double
     945            0 : TraCIAPI::LaneScope::getNoiseEmission(const std::string& laneID) const {
     946            0 :     return getDouble(libsumo::VAR_NOISEEMISSION, laneID);
     947              : }
     948              : 
     949              : double
     950            0 : TraCIAPI::LaneScope::getElectricityConsumption(const std::string& laneID) const {
     951            0 :     return getDouble(libsumo::VAR_ELECTRICITYCONSUMPTION, laneID);
     952              : }
     953              : 
     954              : double
     955            0 : TraCIAPI::LaneScope::getLastStepMeanSpeed(const std::string& laneID) const {
     956            0 :     return getDouble(libsumo::LAST_STEP_MEAN_SPEED, laneID);
     957              : }
     958              : 
     959              : double
     960            0 : TraCIAPI::LaneScope::getLastStepOccupancy(const std::string& laneID) const {
     961            0 :     return getDouble(libsumo::LAST_STEP_OCCUPANCY, laneID);
     962              : }
     963              : 
     964              : double
     965            0 : TraCIAPI::LaneScope::getLastStepLength(const std::string& laneID) const {
     966            0 :     return getDouble(libsumo::LAST_STEP_LENGTH, laneID);
     967              : }
     968              : 
     969              : double
     970            0 : TraCIAPI::LaneScope::getTraveltime(const std::string& laneID) const {
     971            0 :     return getDouble(libsumo::VAR_CURRENT_TRAVELTIME, laneID);
     972              : }
     973              : 
     974              : int
     975            0 : TraCIAPI::LaneScope::getLastStepVehicleNumber(const std::string& laneID) const {
     976            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_NUMBER, laneID);
     977              : }
     978              : 
     979              : int
     980            0 : TraCIAPI::LaneScope::getLastStepHaltingNumber(const std::string& laneID) const {
     981            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_HALTING_NUMBER, laneID);
     982              : }
     983              : 
     984              : std::vector<std::string>
     985            0 : TraCIAPI::LaneScope::getLastStepVehicleIDs(const std::string& laneID) const {
     986            0 :     return getStringVector(libsumo::LAST_STEP_VEHICLE_ID_LIST, laneID);
     987              : }
     988              : 
     989              : 
     990              : std::vector<std::string>
     991            4 : TraCIAPI::LaneScope::getFoes(const std::string& laneID, const std::string& toLaneID) const {
     992              :     std::vector<std::string> r;
     993            4 :     tcpip::Storage content;
     994            4 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
     995            4 :     content.writeString(toLaneID);
     996            4 :     myParent.createCommand(libsumo::CMD_GET_LANE_VARIABLE, libsumo::VAR_FOES, laneID, &content);
     997            4 :     if (myParent.processGet(libsumo::CMD_GET_LANE_VARIABLE, libsumo::TYPE_STRINGLIST)) {
     998            2 :         const int size = myParent.myInput.readInt();
     999           10 :         for (int i = 0; i < size; ++i) {
    1000           16 :             r.push_back(myParent.myInput.readString());
    1001              :         }
    1002              :     }
    1003            2 :     return r;
    1004            6 : }
    1005              : 
    1006              : std::vector<std::string>
    1007            2 : TraCIAPI::LaneScope::getInternalFoes(const std::string& laneID) const {
    1008            3 :     return getFoes(laneID, "");
    1009              : }
    1010              : 
    1011              : 
    1012              : void
    1013            0 : TraCIAPI::LaneScope::setAllowed(const std::string& laneID, const std::vector<std::string>& allowedClasses) const {
    1014            0 :     setStringVector(libsumo::LANE_ALLOWED, laneID, allowedClasses);
    1015            0 : }
    1016              : 
    1017              : void
    1018            0 : TraCIAPI::LaneScope::setDisallowed(const std::string& laneID, const std::vector<std::string>& disallowedClasses) const {
    1019            0 :     setStringVector(libsumo::LANE_DISALLOWED, laneID, disallowedClasses);
    1020            0 : }
    1021              : 
    1022              : void
    1023            1 : TraCIAPI::LaneScope::setMaxSpeed(const std::string& laneID, double speed) const {
    1024            1 :     setDouble(libsumo::VAR_MAXSPEED, laneID, speed);
    1025            1 : }
    1026              : 
    1027              : void
    1028            0 : TraCIAPI::LaneScope::setLength(const std::string& laneID, double length) const {
    1029            0 :     setDouble(libsumo::VAR_LENGTH, laneID, length);
    1030            0 : }
    1031              : 
    1032              : 
    1033              : // ---------------------------------------------------------------------------
    1034              : // TraCIAPI::LaneAreaDetector-methods
    1035              : // ---------------------------------------------------------------------------
    1036              : 
    1037              : 
    1038              : // ---------------------------------------------------------------------------
    1039              : // TraCIAPI::MeMeScope-methods
    1040              : // ---------------------------------------------------------------------------
    1041              : int
    1042            0 : TraCIAPI::MeMeScope::getLastStepVehicleNumber(const std::string& detID) const {
    1043            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_NUMBER, detID);
    1044              : }
    1045              : 
    1046              : double
    1047            0 : TraCIAPI::MeMeScope::getLastStepMeanSpeed(const std::string& detID) const {
    1048            0 :     return getDouble(libsumo::LAST_STEP_MEAN_SPEED, detID);
    1049              : }
    1050              : 
    1051              : std::vector<std::string>
    1052            0 : TraCIAPI::MeMeScope::getLastStepVehicleIDs(const std::string& detID) const {
    1053            0 :     return getStringVector(libsumo::LAST_STEP_VEHICLE_ID_LIST, detID);
    1054              : }
    1055              : 
    1056              : int
    1057            0 : TraCIAPI::MeMeScope::getLastStepHaltingNumber(const std::string& detID) const {
    1058            0 :     return getInt(libsumo::LAST_STEP_VEHICLE_HALTING_NUMBER, detID);
    1059              : }
    1060              : 
    1061              : std::vector<std::string>
    1062            0 : TraCIAPI::MeMeScope::getEntryLanes(const std::string& detID) const {
    1063            0 :     return getStringVector(libsumo::VAR_LANES, detID);
    1064              : }
    1065              : 
    1066              : std::vector<std::string>
    1067            0 : TraCIAPI::MeMeScope::getExitLanes(const std::string& detID) const {
    1068            0 :     return getStringVector(libsumo::VAR_EXIT_LANES, detID);
    1069              : }
    1070              : 
    1071              : std::vector<double>
    1072            0 : TraCIAPI::MeMeScope::getEntryPositions(const std::string& detID) const {
    1073            0 :     return getDoubleVector(libsumo::VAR_POSITION, detID);
    1074              : }
    1075              : 
    1076              : std::vector<double>
    1077            0 : TraCIAPI::MeMeScope::getExitPositions(const std::string& detID) const {
    1078            0 :     return getDoubleVector(libsumo::VAR_EXIT_POSITIONS, detID);
    1079              : }
    1080              : 
    1081              : // ---------------------------------------------------------------------------
    1082              : // TraCIAPI::POIScope-methods
    1083              : // ---------------------------------------------------------------------------
    1084              : std::string
    1085            0 : TraCIAPI::POIScope::getType(const std::string& poiID) const {
    1086            0 :     return getString(libsumo::VAR_TYPE, poiID);
    1087              : }
    1088              : 
    1089              : libsumo::TraCIPosition
    1090            1 : TraCIAPI::POIScope::getPosition(const std::string& poiID) const {
    1091            1 :     return getPos(libsumo::VAR_POSITION, poiID);
    1092              : }
    1093              : 
    1094              : libsumo::TraCIColor
    1095            1 : TraCIAPI::POIScope::getColor(const std::string& poiID) const {
    1096            1 :     return getCol(libsumo::VAR_COLOR, poiID);
    1097              : }
    1098              : 
    1099              : double
    1100            0 : TraCIAPI::POIScope::getWidth(const std::string& poiID) const {
    1101            0 :     return getDouble(libsumo::VAR_WIDTH, poiID);
    1102              : }
    1103              : 
    1104              : double
    1105            0 : TraCIAPI::POIScope::getHeight(const std::string& poiID) const {
    1106            0 :     return getDouble(libsumo::VAR_HEIGHT, poiID);
    1107              : }
    1108              : 
    1109              : double
    1110            0 : TraCIAPI::POIScope::getAngle(const std::string& poiID) const {
    1111            0 :     return getDouble(libsumo::VAR_ANGLE, poiID);
    1112              : }
    1113              : 
    1114              : std::string
    1115            0 : TraCIAPI::POIScope::getImageFile(const std::string& poiID) const {
    1116            0 :     return getString(libsumo::VAR_IMAGEFILE, poiID);
    1117              : }
    1118              : 
    1119              : 
    1120              : void
    1121            0 : TraCIAPI::POIScope::setType(const std::string& poiID, const std::string& setType) const {
    1122            0 :     setString(libsumo::VAR_TYPE, poiID, setType);
    1123            0 : }
    1124              : 
    1125              : 
    1126              : void
    1127            0 : TraCIAPI::POIScope::setPosition(const std::string& poiID, double x, double y) const {
    1128            0 :     tcpip::Storage content;
    1129            0 :     content.writeUnsignedByte(libsumo::POSITION_2D);
    1130            0 :     content.writeDouble(x);
    1131            0 :     content.writeDouble(y);
    1132            0 :     myParent.createCommand(libsumo::CMD_SET_POI_VARIABLE, libsumo::VAR_POSITION, poiID, &content);
    1133            0 :     myParent.processSet(libsumo::CMD_SET_POI_VARIABLE);
    1134            0 : }
    1135              : 
    1136              : 
    1137              : void
    1138            0 : TraCIAPI::POIScope::setColor(const std::string& poiID, const libsumo::TraCIColor& c) const {
    1139            0 :     tcpip::Storage content;
    1140            0 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    1141            0 :     content.writeUnsignedByte(c.r);
    1142            0 :     content.writeUnsignedByte(c.g);
    1143            0 :     content.writeUnsignedByte(c.b);
    1144            0 :     content.writeUnsignedByte(c.a);
    1145            0 :     myParent.createCommand(libsumo::CMD_SET_POI_VARIABLE, libsumo::VAR_COLOR, poiID, &content);
    1146            0 :     myParent.processSet(libsumo::CMD_SET_POI_VARIABLE);
    1147            0 : }
    1148              : 
    1149              : 
    1150              : void
    1151            0 : TraCIAPI::POIScope::setWidth(const std::string& poiID, double width) const {
    1152            0 :     setDouble(libsumo::VAR_WIDTH, poiID, width);
    1153            0 : }
    1154              : 
    1155              : 
    1156              : void
    1157            0 : TraCIAPI::POIScope::setHeight(const std::string& poiID, double height) const {
    1158            0 :     setDouble(libsumo::VAR_HEIGHT, poiID, height);
    1159            0 : }
    1160              : 
    1161              : 
    1162              : void
    1163            0 : TraCIAPI::POIScope::setAngle(const std::string& poiID, double angle) const {
    1164            0 :     setDouble(libsumo::VAR_ANGLE, poiID, angle);
    1165            0 : }
    1166              : 
    1167              : 
    1168              : void
    1169            0 : TraCIAPI::POIScope::setImageFile(const std::string& poiID, const std::string& imageFile) const {
    1170            0 :     setString(libsumo::VAR_IMAGEFILE, poiID, imageFile);
    1171            0 : }
    1172              : 
    1173              : 
    1174              : void
    1175            0 : TraCIAPI::POIScope::add(const std::string& poiID, double x, double y, const libsumo::TraCIColor& c, const std::string& type, int layer, const std::string& imgFile, double width, double height, double angle) const {
    1176            0 :     tcpip::Storage content;
    1177            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1178            0 :     content.writeInt(8);
    1179            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1180            0 :     content.writeString(type);
    1181            0 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    1182            0 :     content.writeUnsignedByte(c.r);
    1183            0 :     content.writeUnsignedByte(c.g);
    1184            0 :     content.writeUnsignedByte(c.b);
    1185            0 :     content.writeUnsignedByte(c.a);
    1186            0 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1187            0 :     content.writeInt(layer);
    1188            0 :     content.writeUnsignedByte(libsumo::POSITION_2D);
    1189            0 :     content.writeDouble(x);
    1190            0 :     content.writeDouble(y);
    1191            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1192            0 :     content.writeString(imgFile);
    1193            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1194            0 :     content.writeDouble(width);
    1195            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1196            0 :     content.writeDouble(height);
    1197            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1198            0 :     content.writeDouble(angle);
    1199            0 :     myParent.createCommand(libsumo::CMD_SET_POI_VARIABLE, libsumo::ADD, poiID, &content);
    1200            0 :     myParent.processSet(libsumo::CMD_SET_POI_VARIABLE);
    1201            0 : }
    1202              : 
    1203              : void
    1204            0 : TraCIAPI::POIScope::remove(const std::string& poiID, int layer) const {
    1205            0 :     tcpip::Storage content;
    1206            0 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1207            0 :     content.writeInt(layer);
    1208            0 :     myParent.createCommand(libsumo::CMD_SET_POI_VARIABLE, libsumo::REMOVE, poiID, &content);
    1209            0 :     myParent.processSet(libsumo::CMD_SET_POI_VARIABLE);
    1210            0 : }
    1211              : 
    1212              : 
    1213              : // ---------------------------------------------------------------------------
    1214              : // TraCIAPI::PolygonScope-methods
    1215              : // ---------------------------------------------------------------------------
    1216              : double
    1217            1 : TraCIAPI::PolygonScope::getLineWidth(const std::string& polygonID) const {
    1218            1 :     return getDouble(libsumo::VAR_WIDTH, polygonID);
    1219              : }
    1220              : 
    1221              : bool
    1222            0 : TraCIAPI::PolygonScope::getFilled(const std::string& polygonID) const {
    1223            0 :     return getInt(libsumo::VAR_FILL, polygonID) != 0;
    1224              : }
    1225              : 
    1226              : std::string
    1227            0 : TraCIAPI::PolygonScope::getType(const std::string& polygonID) const {
    1228            0 :     return getString(libsumo::VAR_TYPE, polygonID);
    1229              : }
    1230              : 
    1231              : libsumo::TraCIPositionVector
    1232            2 : TraCIAPI::PolygonScope::getShape(const std::string& polygonID) const {
    1233            2 :     return getPolygon(libsumo::VAR_SHAPE, polygonID);
    1234              : }
    1235              : 
    1236              : libsumo::TraCIColor
    1237            1 : TraCIAPI::PolygonScope::getColor(const std::string& polygonID) const {
    1238            1 :     return getCol(libsumo::VAR_COLOR, polygonID);
    1239              : }
    1240              : 
    1241              : void
    1242            1 : TraCIAPI::PolygonScope::setLineWidth(const std::string& polygonID, const double lineWidth) const {
    1243            1 :     tcpip::Storage content;
    1244            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1245            1 :     content.writeDouble(lineWidth);
    1246            1 :     myParent.createCommand(libsumo::CMD_SET_POLYGON_VARIABLE, libsumo::VAR_WIDTH, polygonID, &content);
    1247            1 :     myParent.processSet(libsumo::CMD_SET_POLYGON_VARIABLE);
    1248            1 : }
    1249              : 
    1250              : void
    1251            0 : TraCIAPI::PolygonScope::setType(const std::string& polygonID, const std::string& setType) const {
    1252            0 :     tcpip::Storage content;
    1253            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1254            0 :     content.writeString(setType);
    1255            0 :     myParent.createCommand(libsumo::CMD_SET_POLYGON_VARIABLE, libsumo::VAR_TYPE, polygonID, &content);
    1256            0 :     myParent.processSet(libsumo::CMD_SET_POLYGON_VARIABLE);
    1257            0 : }
    1258              : 
    1259              : 
    1260              : void
    1261            1 : TraCIAPI::PolygonScope::setShape(const std::string& polygonID, const libsumo::TraCIPositionVector& shape) const {
    1262            1 :     tcpip::Storage content;
    1263            1 :     content.writeUnsignedByte(libsumo::TYPE_POLYGON);
    1264            1 :     if (shape.value.size() < 256) {
    1265            1 :         content.writeUnsignedByte((int)shape.value.size());
    1266              :     } else {
    1267            0 :         content.writeUnsignedByte(0);
    1268            0 :         content.writeInt((int)shape.value.size());
    1269              :     }
    1270            5 :     for (const libsumo::TraCIPosition& pos : shape.value) {
    1271            4 :         content.writeDouble(pos.x);
    1272            4 :         content.writeDouble(pos.y);
    1273              :     }
    1274            1 :     myParent.createCommand(libsumo::CMD_SET_POLYGON_VARIABLE, libsumo::VAR_SHAPE, polygonID, &content);
    1275            1 :     myParent.processSet(libsumo::CMD_SET_POLYGON_VARIABLE);
    1276            1 : }
    1277              : 
    1278              : 
    1279              : void
    1280            0 : TraCIAPI::PolygonScope::setColor(const std::string& polygonID, const libsumo::TraCIColor& c) const {
    1281            0 :     tcpip::Storage content;
    1282            0 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    1283            0 :     content.writeUnsignedByte(c.r);
    1284            0 :     content.writeUnsignedByte(c.g);
    1285            0 :     content.writeUnsignedByte(c.b);
    1286            0 :     content.writeUnsignedByte(c.a);
    1287            0 :     myParent.createCommand(libsumo::CMD_SET_POLYGON_VARIABLE, libsumo::VAR_COLOR, polygonID, &content);
    1288            0 :     myParent.processSet(libsumo::CMD_SET_POLYGON_VARIABLE);
    1289            0 : }
    1290              : 
    1291              : void
    1292            0 : TraCIAPI::PolygonScope::add(const std::string& polygonID, const libsumo::TraCIPositionVector& shape, const libsumo::TraCIColor& c, bool fill, const std::string& type, int layer) const {
    1293            0 :     tcpip::Storage content;
    1294            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1295            0 :     content.writeInt(5);
    1296            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1297            0 :     content.writeString(type);
    1298            0 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    1299            0 :     content.writeUnsignedByte(c.r);
    1300            0 :     content.writeUnsignedByte(c.g);
    1301            0 :     content.writeUnsignedByte(c.b);
    1302            0 :     content.writeUnsignedByte(c.a);
    1303            0 :     content.writeUnsignedByte(libsumo::TYPE_UBYTE);
    1304            0 :     int f = fill ? 1 : 0;
    1305            0 :     content.writeUnsignedByte(f);
    1306            0 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1307            0 :     content.writeInt(layer);
    1308            0 :     content.writeUnsignedByte(libsumo::TYPE_POLYGON);
    1309            0 :     content.writeUnsignedByte((int)shape.value.size());
    1310            0 :     for (int i = 0; i < (int)shape.value.size(); ++i) {
    1311            0 :         content.writeDouble(shape.value[i].x);
    1312            0 :         content.writeDouble(shape.value[i].y);
    1313              :     }
    1314            0 :     myParent.createCommand(libsumo::CMD_SET_POLYGON_VARIABLE, libsumo::ADD, polygonID, &content);
    1315            0 :     myParent.processSet(libsumo::CMD_SET_POLYGON_VARIABLE);
    1316            0 : }
    1317              : 
    1318              : void
    1319            0 : TraCIAPI::PolygonScope::remove(const std::string& polygonID, int layer) const {
    1320            0 :     tcpip::Storage content;
    1321            0 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1322            0 :     content.writeInt(layer);
    1323            0 :     myParent.createCommand(libsumo::CMD_SET_POLYGON_VARIABLE, libsumo::REMOVE, polygonID, &content);
    1324            0 :     myParent.processSet(libsumo::CMD_SET_POLYGON_VARIABLE);
    1325            0 : }
    1326              : 
    1327              : 
    1328              : // ---------------------------------------------------------------------------
    1329              : // TraCIAPI::RouteScope-methods
    1330              : // ---------------------------------------------------------------------------
    1331              : std::vector<std::string>
    1332            0 : TraCIAPI::RouteScope::getEdges(const std::string& routeID) const {
    1333            0 :     return getStringVector(libsumo::VAR_EDGES, routeID);
    1334              : }
    1335              : 
    1336              : 
    1337              : void
    1338            2 : TraCIAPI::RouteScope::add(const std::string& routeID, const std::vector<std::string>& edges) const {
    1339            2 :     tcpip::Storage content;
    1340            2 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    1341            2 :     content.writeStringList(edges);
    1342            2 :     myParent.createCommand(libsumo::CMD_SET_ROUTE_VARIABLE, libsumo::ADD, routeID, &content);
    1343            2 :     myParent.processSet(libsumo::CMD_SET_ROUTE_VARIABLE);
    1344            2 : }
    1345              : 
    1346              : 
    1347              : // ---------------------------------------------------------------------------
    1348              : // TraCIAPI::SimulationScope-methods
    1349              : // ---------------------------------------------------------------------------
    1350              : int
    1351            4 : TraCIAPI::SimulationScope::getCurrentTime() const {
    1352            8 :     return getInt(libsumo::VAR_TIME_STEP, "");
    1353              : }
    1354              : 
    1355              : double
    1356            0 : TraCIAPI::SimulationScope::getTime() const {
    1357            0 :     return getDouble(libsumo::VAR_TIME, "");
    1358              : }
    1359              : 
    1360              : int
    1361            0 : TraCIAPI::SimulationScope::getLoadedNumber() const {
    1362            0 :     return (int) getInt(libsumo::VAR_LOADED_VEHICLES_NUMBER, "");
    1363              : }
    1364              : 
    1365              : std::vector<std::string>
    1366            0 : TraCIAPI::SimulationScope::getLoadedIDList() const {
    1367            0 :     return getStringVector(libsumo::VAR_LOADED_VEHICLES_IDS, "");
    1368              : }
    1369              : 
    1370              : int
    1371            0 : TraCIAPI::SimulationScope::getDepartedNumber() const {
    1372            0 :     return (int) getInt(libsumo::VAR_DEPARTED_VEHICLES_NUMBER, "");
    1373              : }
    1374              : 
    1375              : std::vector<std::string>
    1376            0 : TraCIAPI::SimulationScope::getDepartedIDList() const {
    1377            0 :     return getStringVector(libsumo::VAR_DEPARTED_VEHICLES_IDS, "");
    1378              : }
    1379              : 
    1380              : int
    1381            0 : TraCIAPI::SimulationScope::getArrivedNumber() const {
    1382            0 :     return (int) getInt(libsumo::VAR_ARRIVED_VEHICLES_NUMBER, "");
    1383              : }
    1384              : 
    1385              : std::vector<std::string>
    1386            0 : TraCIAPI::SimulationScope::getArrivedIDList() const {
    1387            0 :     return getStringVector(libsumo::VAR_ARRIVED_VEHICLES_IDS, "");
    1388              : }
    1389              : 
    1390              : int
    1391            0 : TraCIAPI::SimulationScope::getStartingTeleportNumber() const {
    1392            0 :     return (int) getInt(libsumo::VAR_TELEPORT_STARTING_VEHICLES_NUMBER, "");
    1393              : }
    1394              : 
    1395              : std::vector<std::string>
    1396            0 : TraCIAPI::SimulationScope::getStartingTeleportIDList() const {
    1397            0 :     return getStringVector(libsumo::VAR_TELEPORT_STARTING_VEHICLES_IDS, "");
    1398              : }
    1399              : 
    1400              : int
    1401            0 : TraCIAPI::SimulationScope::getEndingTeleportNumber() const {
    1402            0 :     return (int) getInt(libsumo::VAR_TELEPORT_ENDING_VEHICLES_NUMBER, "");
    1403              : }
    1404              : 
    1405              : std::vector<std::string>
    1406            0 : TraCIAPI::SimulationScope::getEndingTeleportIDList() const {
    1407            0 :     return getStringVector(libsumo::VAR_TELEPORT_ENDING_VEHICLES_IDS, "");
    1408              : }
    1409              : 
    1410              : int
    1411            0 : TraCIAPI::SimulationScope::getDepartedPersonNumber() const {
    1412            0 :     return (int)getInt(libsumo::VAR_DEPARTED_PERSONS_NUMBER, "");
    1413              : }
    1414              : 
    1415              : std::vector<std::string>
    1416            0 : TraCIAPI::SimulationScope::getDepartedPersonIDList() const {
    1417            0 :     return getStringVector(libsumo::VAR_DEPARTED_PERSONS_IDS, "");
    1418              : }
    1419              : 
    1420              : int
    1421            0 : TraCIAPI::SimulationScope::getArrivedPersonNumber() const {
    1422            0 :     return (int)getInt(libsumo::VAR_ARRIVED_PERSONS_NUMBER, "");
    1423              : }
    1424              : 
    1425              : std::vector<std::string>
    1426            0 : TraCIAPI::SimulationScope::getArrivedPersonIDList() const {
    1427            0 :     return getStringVector(libsumo::VAR_ARRIVED_PERSONS_IDS, "");
    1428              : }
    1429              : 
    1430              : double
    1431            1 : TraCIAPI::SimulationScope::getDeltaT() const {
    1432            2 :     return getDouble(libsumo::VAR_DELTA_T, "");
    1433              : }
    1434              : 
    1435              : libsumo::TraCIPositionVector
    1436            0 : TraCIAPI::SimulationScope::getNetBoundary() const {
    1437            0 :     return getPolygon(libsumo::VAR_NET_BOUNDING_BOX, "");
    1438              : }
    1439              : 
    1440              : 
    1441              : int
    1442            0 : TraCIAPI::SimulationScope::getMinExpectedNumber() const {
    1443            0 :     return getInt(libsumo::VAR_MIN_EXPECTED_VEHICLES, "");
    1444              : }
    1445              : 
    1446              : std::string
    1447            1 : TraCIAPI::SimulationScope::getOption(const std::string& option) const {
    1448            1 :     return getString(libsumo::VAR_OPTION, option);
    1449              : }
    1450              : 
    1451              : int
    1452            1 : TraCIAPI::SimulationScope::getBusStopWaiting(const std::string& stopID) const {
    1453            1 :     return (int) getInt(libsumo::VAR_BUS_STOP_WAITING, stopID);
    1454              : }
    1455              : 
    1456              : std::vector<std::string>
    1457            1 : TraCIAPI::SimulationScope::getBusStopWaitingIDList(const std::string& stopID) const {
    1458            1 :     return getStringVector(libsumo::VAR_BUS_STOP_WAITING_IDS, stopID);
    1459              : }
    1460              : 
    1461              : 
    1462              : libsumo::TraCIPosition
    1463            2 : TraCIAPI::SimulationScope::convert2D(const std::string& edgeID, double pos, int laneIndex, bool toGeo) const {
    1464            2 :     const int posType = toGeo ? libsumo::POSITION_LON_LAT : libsumo::POSITION_2D;
    1465            2 :     libsumo::TraCIPosition result;
    1466            2 :     tcpip::Storage content;
    1467            2 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1468            2 :     content.writeInt(2);
    1469            2 :     content.writeByte(libsumo::POSITION_ROADMAP);
    1470            2 :     content.writeString(edgeID);
    1471            2 :     content.writeDouble(pos);
    1472            2 :     content.writeByte(laneIndex);
    1473            2 :     content.writeByte(libsumo::TYPE_UBYTE);
    1474            2 :     content.writeByte(posType);
    1475            2 :     myParent.createCommand(libsumo::CMD_GET_SIM_VARIABLE, libsumo::POSITION_CONVERSION, "", &content);
    1476            2 :     if (myParent.processGet(libsumo::CMD_GET_SIM_VARIABLE, posType)) {
    1477            2 :         result.x = myParent.myInput.readDouble();
    1478            2 :         result.y = myParent.myInput.readDouble();
    1479              :     }
    1480            2 :     return result;
    1481            2 : }
    1482              : 
    1483              : 
    1484              : libsumo::TraCIPosition
    1485            2 : TraCIAPI::SimulationScope::convert3D(const std::string& edgeID, double pos, int laneIndex, bool toGeo) const {
    1486            2 :     const int posType = toGeo ? libsumo::POSITION_LON_LAT_ALT : libsumo::POSITION_3D;
    1487            2 :     libsumo::TraCIPosition result;
    1488            2 :     tcpip::Storage content;
    1489            2 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1490            2 :     content.writeInt(2);
    1491            2 :     content.writeByte(libsumo::POSITION_ROADMAP);
    1492            2 :     content.writeString(edgeID);
    1493            2 :     content.writeDouble(pos);
    1494            2 :     content.writeByte(laneIndex);
    1495            2 :     content.writeByte(libsumo::TYPE_UBYTE);
    1496            2 :     content.writeByte(posType);
    1497            2 :     myParent.createCommand(libsumo::CMD_GET_SIM_VARIABLE, libsumo::POSITION_CONVERSION, "", &content);
    1498            2 :     if (myParent.processGet(libsumo::CMD_GET_SIM_VARIABLE, posType)) {
    1499            2 :         result.x = myParent.myInput.readDouble();
    1500            2 :         result.y = myParent.myInput.readDouble();
    1501            2 :         result.z = myParent.myInput.readDouble();
    1502              :     }
    1503            2 :     return result;
    1504            2 : }
    1505              : 
    1506              : 
    1507              : libsumo::TraCIRoadPosition
    1508            2 : TraCIAPI::SimulationScope::convertRoad(double x, double y, bool isGeo, const std::string& vClass) const {
    1509              :     libsumo::TraCIRoadPosition result;
    1510            2 :     tcpip::Storage content;
    1511            2 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1512            2 :     content.writeInt(3);
    1513            4 :     content.writeByte(isGeo ? libsumo::POSITION_LON_LAT : libsumo::POSITION_2D);
    1514            2 :     content.writeDouble(x);
    1515            2 :     content.writeDouble(y);
    1516            2 :     content.writeByte(libsumo::TYPE_UBYTE);
    1517            2 :     content.writeByte(libsumo::POSITION_ROADMAP);
    1518            2 :     content.writeByte(libsumo::TYPE_STRING);
    1519            2 :     content.writeString(vClass);
    1520            2 :     myParent.createCommand(libsumo::CMD_GET_SIM_VARIABLE, libsumo::POSITION_CONVERSION, "", &content);
    1521            2 :     if (myParent.processGet(libsumo::CMD_GET_SIM_VARIABLE, libsumo::POSITION_ROADMAP)) {
    1522            2 :         result.edgeID = myParent.myInput.readString();
    1523            2 :         result.pos = myParent.myInput.readDouble();
    1524            2 :         result.laneIndex = myParent.myInput.readUnsignedByte();
    1525              :     }
    1526            2 :     return result;
    1527            2 : }
    1528              : 
    1529              : 
    1530              : libsumo::TraCIPosition
    1531            2 : TraCIAPI::SimulationScope::convertGeo(double x, double y, bool fromGeo) const {
    1532            2 :     const int posType = fromGeo ? libsumo::POSITION_2D : libsumo::POSITION_LON_LAT;
    1533            2 :     libsumo::TraCIPosition result;
    1534            2 :     tcpip::Storage content;
    1535            2 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1536            2 :     content.writeInt(2);
    1537            3 :     content.writeByte(fromGeo ? libsumo::POSITION_LON_LAT : libsumo::POSITION_2D);
    1538            2 :     content.writeDouble(x);
    1539            2 :     content.writeDouble(y);
    1540            2 :     content.writeByte(libsumo::TYPE_UBYTE);
    1541            2 :     content.writeByte(posType);
    1542            2 :     myParent.createCommand(libsumo::CMD_GET_SIM_VARIABLE, libsumo::POSITION_CONVERSION, "", &content);
    1543            2 :     if (myParent.processGet(libsumo::CMD_GET_SIM_VARIABLE, posType)) {
    1544            2 :         result.x = myParent.myInput.readDouble();
    1545            2 :         result.y = myParent.myInput.readDouble();
    1546              :     }
    1547            2 :     return result;
    1548            2 : }
    1549              : 
    1550              : 
    1551              : double
    1552            2 : TraCIAPI::SimulationScope::getDistance2D(double x1, double y1, double x2, double y2, bool isGeo, bool isDriving) {
    1553            2 :     tcpip::Storage content;
    1554            2 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1555            2 :     content.writeInt(3);
    1556            4 :     content.writeByte(isGeo ? libsumo::POSITION_LON_LAT : libsumo::POSITION_2D);
    1557            2 :     content.writeDouble(x1);
    1558            2 :     content.writeDouble(y1);
    1559            2 :     content.writeByte(isGeo ? libsumo::POSITION_LON_LAT : libsumo::POSITION_2D);
    1560            2 :     content.writeDouble(x2);
    1561            2 :     content.writeDouble(y2);
    1562            3 :     content.writeByte(isDriving ? libsumo::REQUEST_DRIVINGDIST : libsumo::REQUEST_AIRDIST);
    1563            2 :     myParent.createCommand(libsumo::CMD_GET_SIM_VARIABLE, libsumo::DISTANCE_REQUEST, "", &content);
    1564            2 :     if (myParent.processGet(libsumo::CMD_GET_SIM_VARIABLE, libsumo::TYPE_DOUBLE)) {
    1565            2 :         return myParent.myInput.readDouble();
    1566              :     }
    1567              :     return 0.;
    1568            2 : }
    1569              : 
    1570              : 
    1571              : double
    1572            2 : TraCIAPI::SimulationScope::getDistanceRoad(const std::string& edgeID1, double pos1, const std::string& edgeID2, double pos2, bool isDriving) {
    1573            2 :     tcpip::Storage content;
    1574            2 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1575            2 :     content.writeInt(3);
    1576            2 :     content.writeByte(libsumo::POSITION_ROADMAP);
    1577            2 :     content.writeString(edgeID1);
    1578            2 :     content.writeDouble(pos1);
    1579            2 :     content.writeByte(0); // lane
    1580            2 :     content.writeByte(libsumo::POSITION_ROADMAP);
    1581            2 :     content.writeString(edgeID2);
    1582            2 :     content.writeDouble(pos2);
    1583            2 :     content.writeByte(0); // lane
    1584            3 :     content.writeByte(isDriving ? libsumo::REQUEST_DRIVINGDIST : libsumo::REQUEST_AIRDIST);
    1585            2 :     myParent.createCommand(libsumo::CMD_GET_SIM_VARIABLE, libsumo::DISTANCE_REQUEST, "", &content);
    1586            2 :     if (myParent.processGet(libsumo::CMD_GET_SIM_VARIABLE, libsumo::TYPE_DOUBLE)) {
    1587            2 :         return myParent.myInput.readDouble();
    1588              :     }
    1589              :     return 0.;
    1590            2 : }
    1591              : 
    1592              : 
    1593              : libsumo::TraCIStage
    1594            1 : TraCIAPI::SimulationScope::findRoute(const std::string& fromEdge, const std::string& toEdge, const std::string& vType, double pos, int routingMode) const {
    1595            1 :     tcpip::Storage content;
    1596            1 :     content.writeByte(libsumo::TYPE_COMPOUND);
    1597            1 :     content.writeInt(5);
    1598            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1599            1 :     content.writeString(fromEdge);
    1600            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1601            1 :     content.writeString(toEdge);
    1602            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1603            1 :     content.writeString(vType);
    1604            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1605            1 :     content.writeDouble(pos);
    1606            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1607            1 :     content.writeInt(routingMode);
    1608            2 :     return getTraCIStage(libsumo::FIND_ROUTE, "", &content);
    1609            1 : }
    1610              : 
    1611              : void
    1612            0 : TraCIAPI::SimulationScope::loadState(const std::string& path) const {
    1613            0 :     tcpip::Storage content;
    1614            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1615            0 :     content.writeString(path);
    1616            0 :     myParent.createCommand(libsumo::CMD_SET_SIM_VARIABLE, libsumo::CMD_LOAD_SIMSTATE, "", &content);
    1617            0 :     myParent.processSet(libsumo::CMD_SET_SIM_VARIABLE);
    1618            0 : }
    1619              : 
    1620              : void
    1621            0 : TraCIAPI::SimulationScope::saveState(const std::string& destination) const {
    1622            0 :     tcpip::Storage content;
    1623            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1624            0 :     content.writeString(destination);
    1625            0 :     myParent.createCommand(libsumo::CMD_SET_SIM_VARIABLE, libsumo::CMD_SAVE_SIMSTATE, "", &content);
    1626            0 :     myParent.processSet(libsumo::CMD_SET_SIM_VARIABLE);
    1627            0 : }
    1628              : 
    1629              : void
    1630            1 : TraCIAPI::SimulationScope::writeMessage(const std::string msg) {
    1631            1 :     tcpip::Storage content;
    1632            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1633            1 :     content.writeString(msg);
    1634            1 :     myParent.createCommand(libsumo::CMD_SET_SIM_VARIABLE, libsumo::CMD_MESSAGE, "", &content);
    1635            1 :     myParent.processSet(libsumo::CMD_SET_SIM_VARIABLE);
    1636            1 : }
    1637              : 
    1638              : 
    1639              : // ---------------------------------------------------------------------------
    1640              : // TraCIAPI::TrafficLightScope-methods
    1641              : // ---------------------------------------------------------------------------
    1642              : std::string
    1643            3 : TraCIAPI::TrafficLightScope::getRedYellowGreenState(const std::string& tlsID) const {
    1644            3 :     return getString(libsumo::TL_RED_YELLOW_GREEN_STATE, tlsID);
    1645              : }
    1646              : 
    1647              : std::vector<libsumo::TraCILogic>
    1648            1 : TraCIAPI::TrafficLightScope::getAllProgramLogics(const std::string& tlsID) const {
    1649              :     std::vector<libsumo::TraCILogic> ret;
    1650            1 :     myParent.createCommand(libsumo::CMD_GET_TL_VARIABLE, libsumo::TL_COMPLETE_DEFINITION_RYG, tlsID);
    1651            1 :     if (myParent.processGet(libsumo::CMD_GET_TL_VARIABLE, libsumo::TYPE_COMPOUND)) {
    1652            1 :         const int logicNo = myParent.myInput.readInt();
    1653            3 :         for (int i = 0; i < logicNo; ++i) {
    1654            2 :             myParent.myInput.readUnsignedByte();
    1655            2 :             myParent.myInput.readInt();
    1656            2 :             myParent.myInput.readUnsignedByte();
    1657            2 :             const std::string programID = myParent.myInput.readString();
    1658            2 :             myParent.myInput.readUnsignedByte();
    1659            2 :             const int type = myParent.myInput.readInt();
    1660            2 :             myParent.myInput.readUnsignedByte();
    1661            2 :             const int phaseIndex = myParent.myInput.readInt();
    1662            2 :             myParent.myInput.readUnsignedByte();
    1663            2 :             const int phaseNumber = myParent.myInput.readInt();
    1664            2 :             libsumo::TraCILogic logic(programID, type, phaseIndex);
    1665           12 :             for (int j = 0; j < phaseNumber; j++) {
    1666           10 :                 myParent.myInput.readUnsignedByte();
    1667           10 :                 myParent.myInput.readInt();
    1668           10 :                 myParent.myInput.readUnsignedByte();
    1669           10 :                 const double duration = myParent.myInput.readDouble();
    1670           10 :                 myParent.myInput.readUnsignedByte();
    1671           10 :                 const std::string state = myParent.myInput.readString();
    1672           10 :                 myParent.myInput.readUnsignedByte();
    1673           10 :                 const double minDur = myParent.myInput.readDouble();
    1674           10 :                 myParent.myInput.readUnsignedByte();
    1675           10 :                 const double maxDur = myParent.myInput.readDouble();
    1676           10 :                 myParent.myInput.readUnsignedByte();
    1677           10 :                 const int numNext = myParent.myInput.readInt();
    1678              :                 std::vector<int> next;
    1679           10 :                 for (int k = 0; k < numNext; k++) {
    1680            0 :                     myParent.myInput.readUnsignedByte();
    1681            0 :                     next.push_back(myParent.myInput.readInt());
    1682              :                 }
    1683           10 :                 myParent.myInput.readUnsignedByte();
    1684           10 :                 const std::string name = myParent.myInput.readString();
    1685           10 :                 logic.phases.emplace_back(new libsumo::TraCIPhase(duration, state, minDur, maxDur, next, name));
    1686           10 :             }
    1687            2 :             myParent.myInput.readUnsignedByte();
    1688            2 :             const int paramNumber = myParent.myInput.readInt();
    1689            2 :             for (int j = 0; j < paramNumber; j++) {
    1690            0 :                 myParent.myInput.readUnsignedByte();
    1691            0 :                 const std::vector<std::string> par = myParent.myInput.readStringList();
    1692            0 :                 logic.subParameter[par[0]] = par[1];
    1693            0 :             }
    1694            2 :             ret.emplace_back(logic);
    1695            2 :         }
    1696              :     }
    1697            1 :     return ret;
    1698            0 : }
    1699              : 
    1700              : std::vector<std::string>
    1701            1 : TraCIAPI::TrafficLightScope::getControlledLanes(const std::string& tlsID) const {
    1702            1 :     return getStringVector(libsumo::TL_CONTROLLED_LANES, tlsID);
    1703              : }
    1704              : 
    1705              : std::vector<std::vector<libsumo::TraCILink> >
    1706            1 : TraCIAPI::TrafficLightScope::getControlledLinks(const std::string& tlsID) const {
    1707              :     std::vector<std::vector<libsumo::TraCILink> > result;
    1708            1 :     myParent.createCommand(libsumo::CMD_GET_TL_VARIABLE, libsumo::TL_CONTROLLED_LINKS, tlsID);
    1709            1 :     if (myParent.processGet(libsumo::CMD_GET_TL_VARIABLE, libsumo::TYPE_COMPOUND)) {
    1710              : 
    1711            1 :         myParent.myInput.readUnsignedByte();
    1712            1 :         myParent.myInput.readInt();
    1713              : 
    1714            1 :         int linkNo = myParent.myInput.readInt();
    1715            8 :         for (int i = 0; i < linkNo; ++i) {
    1716            7 :             myParent.myInput.readUnsignedByte();
    1717            7 :             int no = myParent.myInput.readInt();
    1718              :             std::vector<libsumo::TraCILink> ret;
    1719           14 :             for (int i1 = 0; i1 < no; ++i1) {
    1720            7 :                 myParent.myInput.readUnsignedByte();
    1721            7 :                 myParent.myInput.readInt();
    1722            7 :                 std::string from = myParent.myInput.readString();
    1723            7 :                 std::string to = myParent.myInput.readString();
    1724            7 :                 std::string via = myParent.myInput.readString();
    1725            7 :                 ret.emplace_back(libsumo::TraCILink(from, via, to));
    1726              :             }
    1727            7 :             result.emplace_back(ret);
    1728            7 :         }
    1729              :     }
    1730            1 :     return result;
    1731            0 : }
    1732              : 
    1733              : std::string
    1734            2 : TraCIAPI::TrafficLightScope::getProgram(const std::string& tlsID) const {
    1735            2 :     return getString(libsumo::TL_CURRENT_PROGRAM, tlsID);
    1736              : }
    1737              : 
    1738              : int
    1739            1 : TraCIAPI::TrafficLightScope::getPhase(const std::string& tlsID) const {
    1740            1 :     return getInt(libsumo::TL_CURRENT_PHASE, tlsID);
    1741              : }
    1742              : 
    1743              : std::string
    1744            1 : TraCIAPI::TrafficLightScope::getPhaseName(const std::string& tlsID) const {
    1745            1 :     return getString(libsumo::VAR_NAME, tlsID);
    1746              : }
    1747              : 
    1748              : double
    1749            1 : TraCIAPI::TrafficLightScope::getPhaseDuration(const std::string& tlsID) const {
    1750            1 :     return getDouble(libsumo::TL_PHASE_DURATION, tlsID);
    1751              : }
    1752              : 
    1753              : double
    1754            1 : TraCIAPI::TrafficLightScope::getNextSwitch(const std::string& tlsID) const {
    1755            1 :     return getDouble(libsumo::TL_NEXT_SWITCH, tlsID);
    1756              : }
    1757              : 
    1758              : 
    1759              : int
    1760            0 : TraCIAPI::TrafficLightScope::getServedPersonCount(const std::string& tlsID, int index) const {
    1761            0 :     tcpip::Storage content;
    1762            0 :     content.writeByte(libsumo::TYPE_INTEGER);
    1763            0 :     content.writeInt(index);
    1764            0 :     return getInt(libsumo::VAR_PERSON_NUMBER, tlsID, &content);
    1765            0 : }
    1766              : 
    1767              : 
    1768              : void
    1769            1 : TraCIAPI::TrafficLightScope::setRedYellowGreenState(const std::string& tlsID, const std::string& state) const {
    1770            1 :     tcpip::Storage content;
    1771            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1772            1 :     content.writeString(state);
    1773            1 :     myParent.createCommand(libsumo::CMD_SET_TL_VARIABLE, libsumo::TL_RED_YELLOW_GREEN_STATE, tlsID, &content);
    1774            1 :     myParent.processSet(libsumo::CMD_SET_TL_VARIABLE);
    1775            1 : }
    1776              : 
    1777              : void
    1778            1 : TraCIAPI::TrafficLightScope::setPhase(const std::string& tlsID, int index) const {
    1779            1 :     tcpip::Storage content;
    1780            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1781            1 :     content.writeInt(index);
    1782            1 :     myParent.createCommand(libsumo::CMD_SET_TL_VARIABLE, libsumo::TL_PHASE_INDEX, tlsID, &content);
    1783            1 :     myParent.processSet(libsumo::CMD_SET_TL_VARIABLE);
    1784            1 : }
    1785              : 
    1786              : void
    1787            1 : TraCIAPI::TrafficLightScope::setPhaseName(const std::string& tlsID, const std::string& name) const {
    1788            1 :     tcpip::Storage content;
    1789            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1790            1 :     content.writeString(name);
    1791            1 :     myParent.createCommand(libsumo::CMD_SET_TL_VARIABLE, libsumo::VAR_NAME, tlsID, &content);
    1792            1 :     myParent.processSet(libsumo::CMD_SET_TL_VARIABLE);
    1793            1 : }
    1794              : 
    1795              : void
    1796            0 : TraCIAPI::TrafficLightScope::setProgram(const std::string& tlsID, const std::string& programID) const {
    1797            0 :     tcpip::Storage content;
    1798            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1799            0 :     content.writeString(programID);
    1800            0 :     myParent.createCommand(libsumo::CMD_SET_TL_VARIABLE, libsumo::TL_PROGRAM, tlsID, &content);
    1801            0 :     myParent.processSet(libsumo::CMD_SET_TL_VARIABLE);
    1802            0 : }
    1803              : 
    1804              : void
    1805            0 : TraCIAPI::TrafficLightScope::setPhaseDuration(const std::string& tlsID, double phaseDuration) const {
    1806            0 :     tcpip::Storage content;
    1807            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1808            0 :     content.writeDouble(phaseDuration);
    1809            0 :     myParent.createCommand(libsumo::CMD_SET_TL_VARIABLE, libsumo::TL_PHASE_DURATION, tlsID, &content);
    1810            0 :     myParent.processSet(libsumo::CMD_SET_TL_VARIABLE);
    1811            0 : }
    1812              : 
    1813              : void
    1814            1 : TraCIAPI::TrafficLightScope::setProgramLogic(const std::string& tlsID, const libsumo::TraCILogic& logic) const {
    1815            1 :     tcpip::Storage content;
    1816            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1817            1 :     content.writeInt(5);
    1818            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1819            1 :     content.writeString(logic.programID);
    1820            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1821            1 :     content.writeInt(logic.type);
    1822            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1823            1 :     content.writeInt(logic.currentPhaseIndex);
    1824            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1825            1 :     content.writeInt((int)logic.phases.size());
    1826            5 :     for (const std::shared_ptr<libsumo::TraCIPhase>& p : logic.phases) {
    1827            4 :         content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1828            4 :         content.writeInt(6);
    1829            4 :         content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1830            4 :         content.writeDouble(p->duration);
    1831            4 :         content.writeUnsignedByte(libsumo::TYPE_STRING);
    1832            4 :         content.writeString(p->state);
    1833            4 :         content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1834            4 :         content.writeDouble(p->minDur);
    1835            4 :         content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1836            4 :         content.writeDouble(p->maxDur);
    1837            4 :         content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1838            4 :         content.writeInt((int)p->next.size());
    1839            4 :         for (int n : p->next) {
    1840            0 :             content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    1841            0 :             content.writeInt(n);
    1842              :         }
    1843            4 :         content.writeUnsignedByte(libsumo::TYPE_STRING);
    1844            4 :         content.writeString(p->name);
    1845              :     }
    1846            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    1847            1 :     content.writeInt((int)logic.subParameter.size());
    1848            1 :     for (const auto& item : logic.subParameter) {
    1849            0 :         content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    1850            0 :         content.writeInt(2);
    1851            0 :         content.writeString(item.first);
    1852            0 :         content.writeString(item.second);
    1853              :     }
    1854            1 :     myParent.createCommand(libsumo::CMD_SET_TL_VARIABLE, libsumo::TL_COMPLETE_PROGRAM_RYG, tlsID, &content);
    1855            1 :     myParent.processSet(libsumo::CMD_SET_TL_VARIABLE);
    1856            1 : }
    1857              : 
    1858              : 
    1859              : // ---------------------------------------------------------------------------
    1860              : // TraCIAPI::VehicleTypeScope-methods
    1861              : // ---------------------------------------------------------------------------
    1862              : double
    1863            0 : TraCIAPI::VehicleTypeScope::getLength(const std::string& typeID) const {
    1864            0 :     return getDouble(libsumo::VAR_LENGTH, typeID);
    1865              : }
    1866              : 
    1867              : double
    1868            0 : TraCIAPI::VehicleTypeScope::getMaxSpeed(const std::string& typeID) const {
    1869            0 :     return getDouble(libsumo::VAR_MAXSPEED, typeID);
    1870              : }
    1871              : 
    1872              : double
    1873            0 : TraCIAPI::VehicleTypeScope::getSpeedFactor(const std::string& typeID) const {
    1874            0 :     return getDouble(libsumo::VAR_SPEED_FACTOR, typeID);
    1875              : }
    1876              : 
    1877              : double
    1878            0 : TraCIAPI::VehicleTypeScope::getSpeedDeviation(const std::string& typeID) const {
    1879            0 :     return getDouble(libsumo::VAR_SPEED_DEVIATION, typeID);
    1880              : }
    1881              : 
    1882              : double
    1883            2 : TraCIAPI::VehicleTypeScope::getAccel(const std::string& typeID) const {
    1884            2 :     return getDouble(libsumo::VAR_ACCEL, typeID);
    1885              : }
    1886              : 
    1887              : double
    1888            0 : TraCIAPI::VehicleTypeScope::getDecel(const std::string& typeID) const {
    1889            0 :     return getDouble(libsumo::VAR_DECEL, typeID);
    1890              : }
    1891              : 
    1892              : double
    1893            1 : TraCIAPI::VehicleTypeScope::getEmergencyDecel(const std::string& typeID) const {
    1894            1 :     return getDouble(libsumo::VAR_EMERGENCY_DECEL, typeID);
    1895              : }
    1896              : 
    1897              : double
    1898            1 : TraCIAPI::VehicleTypeScope::getApparentDecel(const std::string& typeID) const {
    1899            1 :     return getDouble(libsumo::VAR_APPARENT_DECEL, typeID);
    1900              : }
    1901              : 
    1902              : double
    1903            0 : TraCIAPI::VehicleTypeScope::getImperfection(const std::string& typeID) const {
    1904            0 :     return getDouble(libsumo::VAR_IMPERFECTION, typeID);
    1905              : }
    1906              : 
    1907              : double
    1908            0 : TraCIAPI::VehicleTypeScope::getTau(const std::string& typeID) const {
    1909            0 :     return getDouble(libsumo::VAR_TAU, typeID);
    1910              : }
    1911              : 
    1912              : std::string
    1913            0 : TraCIAPI::VehicleTypeScope::getVehicleClass(const std::string& typeID) const {
    1914            0 :     return getString(libsumo::VAR_VEHICLECLASS, typeID);
    1915              : }
    1916              : 
    1917              : std::string
    1918            0 : TraCIAPI::VehicleTypeScope::getEmissionClass(const std::string& typeID) const {
    1919            0 :     return getString(libsumo::VAR_EMISSIONCLASS, typeID);
    1920              : }
    1921              : 
    1922              : std::string
    1923            0 : TraCIAPI::VehicleTypeScope::getShapeClass(const std::string& typeID) const {
    1924            0 :     return getString(libsumo::VAR_SHAPECLASS, typeID);
    1925              : }
    1926              : 
    1927              : double
    1928            0 : TraCIAPI::VehicleTypeScope::getMinGap(const std::string& typeID) const {
    1929            0 :     return getDouble(libsumo::VAR_MINGAP, typeID);
    1930              : }
    1931              : 
    1932              : double
    1933            1 : TraCIAPI::VehicleTypeScope::getMinGapLat(const std::string& typeID) const {
    1934            1 :     return getDouble(libsumo::VAR_MINGAP_LAT, typeID);
    1935              : }
    1936              : 
    1937              : double
    1938            1 : TraCIAPI::VehicleTypeScope::getMaxSpeedLat(const std::string& typeID) const {
    1939            1 :     return getDouble(libsumo::VAR_MAXSPEED_LAT, typeID);
    1940              : }
    1941              : 
    1942              : std::string
    1943            1 : TraCIAPI::VehicleTypeScope::getLateralAlignment(const std::string& typeID) const {
    1944            1 :     return getString(libsumo::VAR_LATALIGNMENT, typeID);
    1945              : }
    1946              : 
    1947              : int
    1948            1 : TraCIAPI::VehicleTypeScope::getPersonCapacity(const std::string& typeID) const {
    1949            1 :     return getInt(libsumo::VAR_PERSON_CAPACITY, typeID);
    1950              : }
    1951              : 
    1952              : double
    1953            1 : TraCIAPI::VehicleTypeScope::getWidth(const std::string& typeID) const {
    1954            1 :     return getDouble(libsumo::VAR_WIDTH, typeID);
    1955              : }
    1956              : 
    1957              : double
    1958            1 : TraCIAPI::VehicleTypeScope::getHeight(const std::string& typeID) const {
    1959            1 :     return getDouble(libsumo::VAR_HEIGHT, typeID);
    1960              : }
    1961              : 
    1962              : libsumo::TraCIColor
    1963            0 : TraCIAPI::VehicleTypeScope::getColor(const std::string& typeID) const {
    1964            0 :     return getCol(libsumo::VAR_COLOR, typeID);
    1965              : }
    1966              : 
    1967              : 
    1968              : 
    1969              : void
    1970            0 : TraCIAPI::VehicleTypeScope::setLength(const std::string& typeID, double length) const {
    1971            0 :     tcpip::Storage content;
    1972            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1973            0 :     content.writeDouble(length);
    1974            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_LENGTH, typeID, &content);
    1975            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    1976            0 : }
    1977              : 
    1978              : void
    1979            0 : TraCIAPI::VehicleTypeScope::setMaxSpeed(const std::string& typeID, double speed) const {
    1980            0 :     tcpip::Storage content;
    1981            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    1982            0 :     content.writeDouble(speed);
    1983            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_MAXSPEED, typeID, &content);
    1984            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    1985            0 : }
    1986              : 
    1987              : void
    1988            0 : TraCIAPI::VehicleTypeScope::setVehicleClass(const std::string& typeID, const std::string& clazz) const {
    1989            0 :     tcpip::Storage content;
    1990            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    1991            0 :     content.writeString(clazz);
    1992            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_VEHICLECLASS, typeID, &content);
    1993            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    1994            0 : }
    1995              : 
    1996              : void
    1997            0 : TraCIAPI::VehicleTypeScope::setSpeedFactor(const std::string& typeID, double factor) const {
    1998            0 :     tcpip::Storage content;
    1999            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2000            0 :     content.writeDouble(factor);
    2001            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_SPEED_FACTOR, typeID, &content);
    2002            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2003            0 : }
    2004              : 
    2005              : void
    2006            0 : TraCIAPI::VehicleTypeScope::setSpeedDeviation(const std::string& typeID, double deviation) const {
    2007            0 :     tcpip::Storage content;
    2008            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2009            0 :     content.writeDouble(deviation);
    2010            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_SPEED_DEVIATION, typeID, &content);
    2011            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2012            0 : }
    2013              : 
    2014              : 
    2015              : void
    2016            0 : TraCIAPI::VehicleTypeScope::setEmissionClass(const std::string& typeID, const std::string& clazz) const {
    2017            0 :     tcpip::Storage content;
    2018            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2019            0 :     content.writeString(clazz);
    2020            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_EMISSIONCLASS, typeID, &content);
    2021            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2022            0 : }
    2023              : 
    2024              : void
    2025            1 : TraCIAPI::VehicleTypeScope::setWidth(const std::string& typeID, double width) const {
    2026            1 :     tcpip::Storage content;
    2027            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2028            1 :     content.writeDouble(width);
    2029            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_WIDTH, typeID, &content);
    2030            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2031            1 : }
    2032              : 
    2033              : void
    2034            1 : TraCIAPI::VehicleTypeScope::setHeight(const std::string& typeID, double height) const {
    2035            1 :     tcpip::Storage content;
    2036            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2037            1 :     content.writeDouble(height);
    2038            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_HEIGHT, typeID, &content);
    2039            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2040            1 : }
    2041              : 
    2042              : void
    2043            0 : TraCIAPI::VehicleTypeScope::setMinGap(const std::string& typeID, double minGap) const {
    2044            0 :     tcpip::Storage content;
    2045            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2046            0 :     content.writeDouble(minGap);
    2047            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_MINGAP, typeID, &content);
    2048            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2049            0 : }
    2050              : 
    2051              : 
    2052              : void
    2053            1 : TraCIAPI::VehicleTypeScope::setMinGapLat(const std::string& typeID, double minGapLat) const {
    2054            1 :     tcpip::Storage content;
    2055            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2056            1 :     content.writeDouble(minGapLat);
    2057            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_MINGAP_LAT, typeID, &content);
    2058            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2059            1 : }
    2060              : 
    2061              : void
    2062            1 : TraCIAPI::VehicleTypeScope::setMaxSpeedLat(const std::string& typeID, double speed) const {
    2063            1 :     tcpip::Storage content;
    2064            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2065            1 :     content.writeDouble(speed);
    2066            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_MAXSPEED_LAT, typeID, &content);
    2067            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2068            1 : }
    2069              : 
    2070              : void
    2071            1 : TraCIAPI::VehicleTypeScope::setLateralAlignment(const std::string& typeID, const std::string& latAlignment) const {
    2072            1 :     tcpip::Storage content;
    2073            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2074            1 :     content.writeString(latAlignment);
    2075            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_LATALIGNMENT, typeID, &content);
    2076            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2077            1 : }
    2078              : 
    2079              : void
    2080            1 : TraCIAPI::VehicleTypeScope::copy(const std::string& origTypeID, const std::string& newTypeID) const {
    2081            1 :     tcpip::Storage content;
    2082            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2083            1 :     content.writeString(newTypeID);
    2084            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::COPY, origTypeID, &content);
    2085            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2086            1 : }
    2087              : 
    2088              : void
    2089            0 : TraCIAPI::VehicleTypeScope::setShapeClass(const std::string& typeID, const std::string& clazz) const {
    2090            0 :     tcpip::Storage content;
    2091            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2092            0 :     content.writeString(clazz);
    2093            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_SHAPECLASS, typeID, &content);
    2094            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2095            0 : }
    2096              : 
    2097              : void
    2098            1 : TraCIAPI::VehicleTypeScope::setAccel(const std::string& typeID, double accel) const {
    2099            1 :     tcpip::Storage content;
    2100            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2101            1 :     content.writeDouble(accel);
    2102            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_ACCEL, typeID, &content);
    2103            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2104            1 : }
    2105              : 
    2106              : void
    2107            0 : TraCIAPI::VehicleTypeScope::setDecel(const std::string& typeID, double decel) const {
    2108            0 :     tcpip::Storage content;
    2109            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2110            0 :     content.writeDouble(decel);
    2111            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_DECEL, typeID, &content);
    2112            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2113            0 : }
    2114              : 
    2115              : void
    2116            1 : TraCIAPI::VehicleTypeScope::setEmergencyDecel(const std::string& typeID, double decel) const {
    2117            1 :     tcpip::Storage content;
    2118            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2119            1 :     content.writeDouble(decel);
    2120            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_EMERGENCY_DECEL, typeID, &content);
    2121            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2122            1 : }
    2123              : 
    2124              : void
    2125            1 : TraCIAPI::VehicleTypeScope::setApparentDecel(const std::string& typeID, double decel) const {
    2126            1 :     tcpip::Storage content;
    2127            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2128            1 :     content.writeDouble(decel);
    2129            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_APPARENT_DECEL, typeID, &content);
    2130            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2131            1 : }
    2132              : 
    2133              : void
    2134            0 : TraCIAPI::VehicleTypeScope::setImperfection(const std::string& typeID, double imperfection) const {
    2135            0 :     tcpip::Storage content;
    2136            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2137            0 :     content.writeDouble(imperfection);
    2138            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_IMPERFECTION, typeID, &content);
    2139            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2140            0 : }
    2141              : 
    2142              : void
    2143            0 : TraCIAPI::VehicleTypeScope::setTau(const std::string& typeID, double tau) const {
    2144            0 :     tcpip::Storage content;
    2145            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2146            0 :     content.writeDouble(tau);
    2147            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_TAU, typeID, &content);
    2148            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2149            0 : }
    2150              : 
    2151              : void
    2152            0 : TraCIAPI::VehicleTypeScope::setColor(const std::string& typeID, const libsumo::TraCIColor& c) const {
    2153            0 :     tcpip::Storage content;
    2154            0 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    2155            0 :     content.writeUnsignedByte(c.r);
    2156            0 :     content.writeUnsignedByte(c.g);
    2157            0 :     content.writeUnsignedByte(c.b);
    2158            0 :     content.writeUnsignedByte(c.a);
    2159            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLETYPE_VARIABLE, libsumo::VAR_COLOR, typeID, &content);
    2160            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLETYPE_VARIABLE);
    2161            0 : }
    2162              : 
    2163              : 
    2164              : // ---------------------------------------------------------------------------
    2165              : // TraCIAPI::VehicleScope-methods
    2166              : // ---------------------------------------------------------------------------
    2167              : double
    2168            1 : TraCIAPI::VehicleScope::getSpeed(const std::string& vehicleID) const {
    2169            1 :     return getDouble(libsumo::VAR_SPEED, vehicleID);
    2170              : }
    2171              : 
    2172              : double
    2173            1 : TraCIAPI::VehicleScope::getLateralSpeed(const std::string& vehicleID) const {
    2174            1 :     return getDouble(libsumo::VAR_SPEED_LAT, vehicleID);
    2175              : }
    2176              : 
    2177              : double
    2178            1 : TraCIAPI::VehicleScope::getAcceleration(const std::string& vehicleID) const {
    2179            1 :     return getDouble(libsumo::VAR_ACCELERATION, vehicleID);
    2180              : }
    2181              : 
    2182              : double
    2183            1 : TraCIAPI::VehicleScope::getFollowSpeed(const std::string& vehicleID, double speed, double gap, double leaderSpeed, double leaderMaxDecel, const std::string& leaderID) const {
    2184            1 :     tcpip::Storage content;
    2185            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2186            1 :     content.writeInt(5);
    2187            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2188            1 :     content.writeDouble(speed);
    2189            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2190            1 :     content.writeDouble(gap);
    2191            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2192            1 :     content.writeDouble(leaderSpeed);
    2193            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2194            1 :     content.writeDouble(leaderMaxDecel);
    2195            1 :     content.writeByte(libsumo::TYPE_STRING);
    2196            1 :     content.writeString(leaderID);
    2197            2 :     return getDouble(libsumo::VAR_FOLLOW_SPEED, vehicleID, &content);
    2198            1 : }
    2199              : 
    2200              : 
    2201              : double
    2202            1 : TraCIAPI::VehicleScope::getSecureGap(const std::string& vehicleID, double speed, double leaderSpeed, double leaderMaxDecel, const std::string& leaderID) const {
    2203            1 :     tcpip::Storage content;
    2204            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2205            1 :     content.writeInt(4);
    2206            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2207            1 :     content.writeDouble(speed);
    2208            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2209            1 :     content.writeDouble(leaderSpeed);
    2210            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2211            1 :     content.writeDouble(leaderMaxDecel);
    2212            1 :     content.writeByte(libsumo::TYPE_STRING);
    2213            1 :     content.writeString(leaderID);
    2214            2 :     return getDouble(libsumo::VAR_SECURE_GAP, vehicleID, &content);
    2215            1 : }
    2216              : 
    2217              : double
    2218            1 : TraCIAPI::VehicleScope::getStopSpeed(const std::string& vehicleID, double speed, double gap) const {
    2219            1 :     tcpip::Storage content;
    2220            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2221            1 :     content.writeInt(2);
    2222            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2223            1 :     content.writeDouble(speed);
    2224            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2225            1 :     content.writeDouble(gap);
    2226            2 :     return getDouble(libsumo::VAR_STOP_SPEED, vehicleID, &content);
    2227            1 : }
    2228              : 
    2229              : 
    2230              : double
    2231            1 : TraCIAPI::VehicleScope::getMaxSpeed(const std::string& vehicleID) const {
    2232            1 :     return getDouble(libsumo::VAR_MAXSPEED, vehicleID);
    2233              : }
    2234              : 
    2235              : libsumo::TraCIPosition
    2236            0 : TraCIAPI::VehicleScope::getPosition(const std::string& vehicleID) const {
    2237            0 :     return getPos(libsumo::VAR_POSITION, vehicleID);
    2238              : }
    2239              : 
    2240              : libsumo::TraCIPosition
    2241            0 : TraCIAPI::VehicleScope::getPosition3D(const std::string& vehicleID) const {
    2242            0 :     return getPos3D(libsumo::VAR_POSITION3D, vehicleID);
    2243              : }
    2244              : 
    2245              : double
    2246            0 : TraCIAPI::VehicleScope::getAngle(const std::string& vehicleID) const {
    2247            0 :     return getDouble(libsumo::VAR_ANGLE, vehicleID);
    2248              : }
    2249              : 
    2250              : std::string
    2251            2 : TraCIAPI::VehicleScope::getRoadID(const std::string& vehicleID) const {
    2252            2 :     return getString(libsumo::VAR_ROAD_ID, vehicleID);
    2253              : }
    2254              : 
    2255              : std::string
    2256            2 : TraCIAPI::VehicleScope::getLaneID(const std::string& vehicleID) const {
    2257            2 :     return getString(libsumo::VAR_LANE_ID, vehicleID);
    2258              : }
    2259              : 
    2260              : int
    2261            0 : TraCIAPI::VehicleScope::getLaneIndex(const std::string& vehicleID) const {
    2262            0 :     return getInt(libsumo::VAR_LANE_INDEX, vehicleID);
    2263              : }
    2264              : 
    2265              : std::string
    2266            1 : TraCIAPI::VehicleScope::getTypeID(const std::string& vehicleID) const {
    2267            1 :     return getString(libsumo::VAR_TYPE, vehicleID);
    2268              : }
    2269              : 
    2270              : std::string
    2271            1 : TraCIAPI::VehicleScope::getRouteID(const std::string& vehicleID) const {
    2272            1 :     return getString(libsumo::VAR_ROUTE_ID, vehicleID);
    2273              : }
    2274              : 
    2275              : int
    2276            0 : TraCIAPI::VehicleScope::getRouteIndex(const std::string& vehicleID) const {
    2277            0 :     return getInt(libsumo::VAR_ROUTE_INDEX, vehicleID);
    2278              : }
    2279              : 
    2280              : 
    2281              : std::vector<std::string>
    2282            3 : TraCIAPI::VehicleScope::getRoute(const std::string& vehicleID) const {
    2283            3 :     return getStringVector(libsumo::VAR_EDGES, vehicleID);
    2284              : }
    2285              : 
    2286              : libsumo::TraCIColor
    2287            1 : TraCIAPI::VehicleScope::getColor(const std::string& vehicleID) const {
    2288            1 :     return getCol(libsumo::VAR_COLOR, vehicleID);
    2289              : }
    2290              : 
    2291              : double
    2292            1 : TraCIAPI::VehicleScope::getLanePosition(const std::string& vehicleID) const {
    2293            1 :     return getDouble(libsumo::VAR_LANEPOSITION, vehicleID);
    2294              : }
    2295              : 
    2296              : double
    2297            0 : TraCIAPI::VehicleScope::getDistance(const std::string& vehicleID) const {
    2298            0 :     return getDouble(libsumo::VAR_DISTANCE, vehicleID);
    2299              : }
    2300              : 
    2301              : int
    2302            1 : TraCIAPI::VehicleScope::getSignals(const std::string& vehicleID) const {
    2303            1 :     return getInt(libsumo::VAR_SIGNALS, vehicleID);
    2304              : }
    2305              : 
    2306              : double
    2307            1 : TraCIAPI::VehicleScope::getLateralLanePosition(const std::string& vehicleID) const {
    2308            1 :     return getDouble(libsumo::VAR_LANEPOSITION_LAT, vehicleID);
    2309              : }
    2310              : 
    2311              : double
    2312            0 : TraCIAPI::VehicleScope::getCO2Emission(const std::string& vehicleID) const {
    2313            0 :     return getDouble(libsumo::VAR_CO2EMISSION, vehicleID);
    2314              : }
    2315              : 
    2316              : double
    2317            0 : TraCIAPI::VehicleScope::getCOEmission(const std::string& vehicleID) const {
    2318            0 :     return getDouble(libsumo::VAR_COEMISSION, vehicleID);
    2319              : }
    2320              : 
    2321              : double
    2322            0 : TraCIAPI::VehicleScope::getHCEmission(const std::string& vehicleID) const {
    2323            0 :     return getDouble(libsumo::VAR_HCEMISSION, vehicleID);
    2324              : }
    2325              : 
    2326              : double
    2327            0 : TraCIAPI::VehicleScope::getPMxEmission(const std::string& vehicleID) const {
    2328            0 :     return getDouble(libsumo::VAR_PMXEMISSION, vehicleID);
    2329              : }
    2330              : 
    2331              : double
    2332            0 : TraCIAPI::VehicleScope::getNOxEmission(const std::string& vehicleID) const {
    2333            0 :     return getDouble(libsumo::VAR_NOXEMISSION, vehicleID);
    2334              : }
    2335              : 
    2336              : double
    2337            0 : TraCIAPI::VehicleScope::getFuelConsumption(const std::string& vehicleID) const {
    2338            0 :     return getDouble(libsumo::VAR_FUELCONSUMPTION, vehicleID);
    2339              : }
    2340              : 
    2341              : double
    2342            0 : TraCIAPI::VehicleScope::getNoiseEmission(const std::string& vehicleID) const {
    2343            0 :     return getDouble(libsumo::VAR_NOISEEMISSION, vehicleID);
    2344              : }
    2345              : 
    2346              : double
    2347            0 : TraCIAPI::VehicleScope::getElectricityConsumption(const std::string& vehicleID) const {
    2348            0 :     return getDouble(libsumo::VAR_ELECTRICITYCONSUMPTION, vehicleID);
    2349              : }
    2350              : 
    2351              : double
    2352            1 : TraCIAPI::VehicleScope::getWaitingTime(const std::string& vehID) const {
    2353            1 :     return getDouble(libsumo::VAR_WAITING_TIME, vehID);
    2354              : }
    2355              : 
    2356              : int
    2357            1 : TraCIAPI::VehicleScope::getLaneChangeMode(const std::string& vehID) const {
    2358            1 :     return getInt(libsumo::VAR_LANECHANGE_MODE, vehID);
    2359              : }
    2360              : 
    2361              : 
    2362              : int
    2363            2 : TraCIAPI::VehicleScope::getSpeedMode(const std::string& vehID) const {
    2364            2 :     return getInt(libsumo::VAR_SPEEDSETMODE, vehID);
    2365              : }
    2366              : 
    2367              : 
    2368              : double
    2369            1 : TraCIAPI::VehicleScope::getSlope(const std::string& vehID) const {
    2370            1 :     return getDouble(libsumo::VAR_SLOPE, vehID);
    2371              : }
    2372              : 
    2373              : 
    2374              : std::string
    2375            1 : TraCIAPI::VehicleScope::getLine(const std::string& typeID) const {
    2376            1 :     return getString(libsumo::VAR_LINE, typeID);
    2377              : }
    2378              : 
    2379              : std::vector<std::string>
    2380            1 : TraCIAPI::VehicleScope::getVia(const std::string& vehicleID) const {
    2381            1 :     return getStringVector(libsumo::VAR_VIA, vehicleID);
    2382              : }
    2383              : 
    2384              : std::string
    2385            0 : TraCIAPI::VehicleScope::getEmissionClass(const std::string& vehicleID) const {
    2386            0 :     return getString(libsumo::VAR_EMISSIONCLASS, vehicleID);
    2387              : }
    2388              : 
    2389              : std::string
    2390            1 : TraCIAPI::VehicleScope::getShapeClass(const std::string& vehicleID) const {
    2391            1 :     return getString(libsumo::VAR_SHAPECLASS, vehicleID);
    2392              : }
    2393              : 
    2394              : std::vector<libsumo::TraCINextTLSData>
    2395            1 : TraCIAPI::VehicleScope::getNextTLS(const std::string& vehID) const {
    2396              :     std::vector<libsumo::TraCINextTLSData> result;
    2397            1 :     myParent.createCommand(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_NEXT_TLS, vehID);
    2398            1 :     if (myParent.processGet(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::TYPE_COMPOUND)) {
    2399            1 :         myParent.myInput.readInt(); // components
    2400              :         // number of items
    2401            1 :         myParent.myInput.readUnsignedByte();
    2402            1 :         const int n = myParent.myInput.readInt();
    2403            2 :         for (int i = 0; i < n; ++i) {
    2404              :             libsumo::TraCINextTLSData d;
    2405            1 :             myParent.myInput.readUnsignedByte();
    2406            1 :             d.id = myParent.myInput.readString();
    2407              : 
    2408            1 :             myParent.myInput.readUnsignedByte();
    2409            1 :             d.tlIndex = myParent.myInput.readInt();
    2410              : 
    2411            1 :             myParent.myInput.readUnsignedByte();
    2412            1 :             d.dist = myParent.myInput.readDouble();
    2413              : 
    2414            1 :             myParent.myInput.readUnsignedByte();
    2415            1 :             d.state = (char)myParent.myInput.readByte();
    2416              : 
    2417            1 :             result.push_back(d);
    2418              :         }
    2419              :     }
    2420            1 :     return result;
    2421            0 : }
    2422              : 
    2423              : std::vector<libsumo::TraCIBestLanesData>
    2424            0 : TraCIAPI::VehicleScope::getBestLanes(const std::string& vehicleID) const {
    2425              :     std::vector<libsumo::TraCIBestLanesData> result;
    2426            0 :     myParent.createCommand(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_BEST_LANES, vehicleID);
    2427            0 :     if (myParent.processGet(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::TYPE_COMPOUND)) {
    2428            0 :         myParent.myInput.readInt();
    2429            0 :         myParent.myInput.readUnsignedByte();
    2430              : 
    2431            0 :         const int n = myParent.myInput.readInt(); // number of following edge information
    2432            0 :         for (int i = 0; i < n; ++i) {
    2433              :             libsumo::TraCIBestLanesData info;
    2434            0 :             myParent.myInput.readUnsignedByte();
    2435            0 :             info.laneID = myParent.myInput.readString();
    2436              : 
    2437            0 :             myParent.myInput.readUnsignedByte();
    2438            0 :             info.length = myParent.myInput.readDouble();
    2439              : 
    2440            0 :             myParent.myInput.readUnsignedByte();
    2441            0 :             info.occupation = myParent.myInput.readDouble();
    2442              : 
    2443            0 :             myParent.myInput.readUnsignedByte();
    2444            0 :             info.bestLaneOffset = myParent.myInput.readByte();
    2445              : 
    2446            0 :             myParent.myInput.readUnsignedByte();
    2447            0 :             info.allowsContinuation = (myParent.myInput.readUnsignedByte() == 1);
    2448              : 
    2449            0 :             myParent.myInput.readUnsignedByte();
    2450            0 :             const int m = myParent.myInput.readInt();
    2451            0 :             for (int j = 0; j < m; ++j) {
    2452            0 :                 info.continuationLanes.push_back(myParent.myInput.readString());
    2453              :             }
    2454              : 
    2455            0 :             result.push_back(info);
    2456              :         }
    2457              :     }
    2458            0 :     return result;
    2459            0 : }
    2460              : 
    2461              : 
    2462              : std::pair<std::string, double>
    2463            1 : TraCIAPI::VehicleScope::getLeader(const std::string& vehicleID, double dist) const {
    2464            1 :     tcpip::Storage content;
    2465            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2466            1 :     content.writeDouble(dist);
    2467            1 :     myParent.createCommand(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_LEADER, vehicleID, &content);
    2468            1 :     if (myParent.processGet(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::TYPE_COMPOUND)) {
    2469            1 :         myParent.myInput.readInt(); // components
    2470            1 :         myParent.myInput.readUnsignedByte();
    2471            1 :         const std::string leaderID = myParent.myInput.readString();
    2472            1 :         myParent.myInput.readUnsignedByte();
    2473            1 :         const double gap = myParent.myInput.readDouble();
    2474              :         return std::make_pair(leaderID, gap);
    2475              :     }
    2476              :     return std::make_pair("", libsumo::INVALID_DOUBLE_VALUE);
    2477            1 : }
    2478              : 
    2479              : 
    2480              : std::pair<std::string, double>
    2481            1 : TraCIAPI::VehicleScope::getFollower(const std::string& vehicleID, double dist) const {
    2482            1 :     tcpip::Storage content;
    2483            1 :     content.writeByte(libsumo::TYPE_DOUBLE);
    2484            1 :     content.writeDouble(dist);
    2485            1 :     myParent.createCommand(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::VAR_FOLLOWER, vehicleID, &content);
    2486            1 :     if (myParent.processGet(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::TYPE_COMPOUND)) {
    2487            1 :         myParent.myInput.readInt(); // components
    2488            1 :         myParent.myInput.readUnsignedByte();
    2489            1 :         const std::string leaderID = myParent.myInput.readString();
    2490            1 :         myParent.myInput.readUnsignedByte();
    2491            1 :         const double gap = myParent.myInput.readDouble();
    2492              :         return std::make_pair(leaderID, gap);
    2493              :     }
    2494              :     return std::make_pair("", libsumo::INVALID_DOUBLE_VALUE);
    2495            1 : }
    2496              : 
    2497              : 
    2498              : std::pair<int, int>
    2499            2 : TraCIAPI::VehicleScope::getLaneChangeState(const std::string& vehicleID, int direction) const {
    2500            2 :     tcpip::Storage content;
    2501            2 :     content.writeByte(libsumo::TYPE_INTEGER);
    2502            2 :     content.writeInt(direction);
    2503            2 :     myParent.createCommand(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::CMD_CHANGELANE, vehicleID, &content);
    2504            2 :     if (myParent.processGet(libsumo::CMD_GET_VEHICLE_VARIABLE, libsumo::TYPE_COMPOUND)) {
    2505            2 :         myParent.myInput.readInt(); // components
    2506            2 :         myParent.myInput.readUnsignedByte();
    2507            2 :         const int stateWithoutTraCI = myParent.myInput.readInt();
    2508            2 :         myParent.myInput.readUnsignedByte();
    2509            2 :         const int state = myParent.myInput.readInt();
    2510              :         return std::make_pair(stateWithoutTraCI, state);
    2511              :     }
    2512            0 :     return std::make_pair(libsumo::INVALID_INT_VALUE, libsumo::INVALID_INT_VALUE);
    2513            2 : }
    2514              : 
    2515              : 
    2516              : int
    2517            1 : TraCIAPI::VehicleScope::getStopState(const std::string& vehicleID) const {
    2518            1 :     return getInt(libsumo::VAR_STOPSTATE, vehicleID);
    2519              : }
    2520              : 
    2521              : int
    2522            1 : TraCIAPI::VehicleScope::getRoutingMode(const std::string& vehicleID) const {
    2523            1 :     return getInt(libsumo::VAR_ROUTING_MODE, vehicleID);
    2524              : }
    2525              : 
    2526              : double
    2527            1 : TraCIAPI::VehicleScope::getStopDelay(const std::string& vehicleID) const {
    2528            1 :     return getDouble(libsumo::VAR_STOP_DELAY, vehicleID);
    2529              : }
    2530              : 
    2531              : double
    2532            0 : TraCIAPI::VehicleScope::getStopArrivalDelay(const std::string& vehicleID) const {
    2533            0 :     return getDouble(libsumo::VAR_STOP_ARRIVALDELAY, vehicleID);
    2534              : }
    2535              : 
    2536              : 
    2537              : double
    2538            0 : TraCIAPI::VehicleScope::getAccel(const std::string& vehicleID) const {
    2539            0 :     return getDouble(libsumo::VAR_ACCEL, vehicleID);
    2540              : }
    2541              : 
    2542              : double
    2543            0 : TraCIAPI::VehicleScope::getDecel(const std::string& vehicleID) const {
    2544            0 :     return getDouble(libsumo::VAR_DECEL, vehicleID);
    2545              : }
    2546              : 
    2547              : double
    2548            0 : TraCIAPI::VehicleScope::getTau(const std::string& vehicleID) const {
    2549            0 :     return getDouble(libsumo::VAR_TAU, vehicleID);
    2550              : }
    2551              : 
    2552              : double
    2553            0 : TraCIAPI::VehicleScope::getImperfection(const std::string& vehicleID) const {
    2554            0 :     return getDouble(libsumo::VAR_IMPERFECTION, vehicleID);
    2555              : }
    2556              : 
    2557              : double
    2558            0 : TraCIAPI::VehicleScope::getSpeedFactor(const std::string& vehicleID) const {
    2559            0 :     return getDouble(libsumo::VAR_SPEED_FACTOR, vehicleID);
    2560              : }
    2561              : 
    2562              : double
    2563            0 : TraCIAPI::VehicleScope::getSpeedDeviation(const std::string& vehicleID) const {
    2564            0 :     return getDouble(libsumo::VAR_SPEED_DEVIATION, vehicleID);
    2565              : }
    2566              : 
    2567              : std::string
    2568            0 : TraCIAPI::VehicleScope::getVehicleClass(const std::string& vehicleID) const {
    2569            0 :     return getString(libsumo::VAR_VEHICLECLASS, vehicleID);
    2570              : }
    2571              : 
    2572              : double
    2573            0 : TraCIAPI::VehicleScope::getMinGap(const std::string& vehicleID) const {
    2574            0 :     return getDouble(libsumo::VAR_MINGAP, vehicleID);
    2575              : }
    2576              : 
    2577              : double
    2578            0 : TraCIAPI::VehicleScope::getWidth(const std::string& vehicleID) const {
    2579            0 :     return getDouble(libsumo::VAR_WIDTH, vehicleID);
    2580              : }
    2581              : 
    2582              : double
    2583            0 : TraCIAPI::VehicleScope::getLength(const std::string& vehicleID) const {
    2584            0 :     return getDouble(libsumo::VAR_LENGTH, vehicleID);
    2585              : }
    2586              : 
    2587              : double
    2588            0 : TraCIAPI::VehicleScope::getHeight(const std::string& vehicleID) const {
    2589            0 :     return getDouble(libsumo::VAR_HEIGHT, vehicleID);
    2590              : }
    2591              : 
    2592              : double
    2593            1 : TraCIAPI::VehicleScope::getAccumulatedWaitingTime(const std::string& vehicleID) const {
    2594            1 :     return getDouble(libsumo::VAR_ACCUMULATED_WAITING_TIME, vehicleID);
    2595              : }
    2596              : 
    2597              : double
    2598            0 : TraCIAPI::VehicleScope::getAllowedSpeed(const std::string& vehicleID) const {
    2599            0 :     return getDouble(libsumo::VAR_ALLOWED_SPEED, vehicleID);
    2600              : }
    2601              : 
    2602              : int
    2603            0 : TraCIAPI::VehicleScope::getPersonNumber(const std::string& vehicleID) const {
    2604            0 :     return getInt(libsumo::VAR_PERSON_NUMBER, vehicleID);
    2605              : }
    2606              : 
    2607              : int
    2608            1 : TraCIAPI::VehicleScope::getPersonCapacity(const std::string& vehicleID) const {
    2609            1 :     return getInt(libsumo::VAR_PERSON_CAPACITY, vehicleID);
    2610              : }
    2611              : 
    2612              : std::vector<std::string>
    2613            0 : TraCIAPI::VehicleScope::getPersonIDList(const std::string& vehicleID) const {
    2614            0 :     return getStringVector(libsumo::LAST_STEP_PERSON_ID_LIST, vehicleID);
    2615              : }
    2616              : 
    2617              : double
    2618            0 : TraCIAPI::VehicleScope::getSpeedWithoutTraCI(const std::string& vehicleID) const {
    2619            0 :     return getDouble(libsumo::VAR_SPEED_WITHOUT_TRACI, vehicleID);
    2620              : }
    2621              : 
    2622              : bool
    2623            1 : TraCIAPI::VehicleScope::isRouteValid(const std::string& vehicleID) const {
    2624            1 :     return getInt(libsumo::VAR_ROUTE_VALID, vehicleID) != 0;
    2625              : }
    2626              : 
    2627              : double
    2628            0 : TraCIAPI::VehicleScope::getMaxSpeedLat(const std::string& vehicleID) const {
    2629            0 :     return getDouble(libsumo::VAR_MAXSPEED_LAT, vehicleID);
    2630              : }
    2631              : 
    2632              : double
    2633            0 : TraCIAPI::VehicleScope::getMinGapLat(const std::string& vehicleID) const {
    2634            0 :     return getDouble(libsumo::VAR_MINGAP_LAT, vehicleID);
    2635              : }
    2636              : 
    2637              : std::string
    2638            0 : TraCIAPI::VehicleScope::getLateralAlignment(const std::string& vehicleID) const {
    2639            0 :     return getString(libsumo::VAR_LATALIGNMENT, vehicleID);
    2640              : }
    2641              : 
    2642              : void
    2643            2 : TraCIAPI::VehicleScope::add(const std::string& vehicleID,
    2644              :                             const std::string& routeID,
    2645              :                             const std::string& typeID,
    2646              :                             std::string depart,
    2647              :                             const std::string& departLane,
    2648              :                             const std::string& departPos,
    2649              :                             const std::string& departSpeed,
    2650              :                             const std::string& arrivalLane,
    2651              :                             const std::string& arrivalPos,
    2652              :                             const std::string& arrivalSpeed,
    2653              :                             const std::string& fromTaz,
    2654              :                             const std::string& toTaz,
    2655              :                             const std::string& line,
    2656              :                             int personCapacity,
    2657              :                             int personNumber) const {
    2658              : 
    2659            2 :     if (depart == "-1") {
    2660            4 :         depart = toString(myParent.simulation.getCurrentTime() / 1000.0);
    2661              :     }
    2662            2 :     tcpip::Storage content;
    2663            2 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2664            2 :     content.writeInt(14);
    2665            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2666            2 :     content.writeString(routeID);
    2667            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2668            2 :     content.writeString(typeID);
    2669            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2670            2 :     content.writeString(depart);
    2671            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2672            2 :     content.writeString(departLane);
    2673            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2674            2 :     content.writeString(departPos);
    2675            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2676            2 :     content.writeString(departSpeed);
    2677              : 
    2678            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2679            2 :     content.writeString(arrivalLane);
    2680            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2681            2 :     content.writeString(arrivalPos);
    2682            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2683            2 :     content.writeString(arrivalSpeed);
    2684              : 
    2685            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2686            2 :     content.writeString(fromTaz);
    2687            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2688            2 :     content.writeString(toTaz);
    2689            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2690            2 :     content.writeString(line);
    2691              : 
    2692            2 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    2693            2 :     content.writeInt(personCapacity);
    2694            2 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    2695            2 :     content.writeInt(personNumber);
    2696              : 
    2697            2 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::ADD_FULL, vehicleID, &content);
    2698            2 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2699            2 : }
    2700              : 
    2701              : 
    2702              : void
    2703            1 : TraCIAPI::VehicleScope::remove(const std::string& vehicleID, char reason) const {
    2704            1 :     tcpip::Storage content;
    2705            1 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2706            1 :     content.writeUnsignedByte(reason);
    2707            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::REMOVE, vehicleID, &content);
    2708            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2709              : 
    2710            1 : }
    2711              : 
    2712              : 
    2713              : void
    2714            1 : TraCIAPI::VehicleScope::changeTarget(const std::string& vehicleID, const std::string& edgeID) const {
    2715            1 :     tcpip::Storage content;
    2716            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2717            1 :     content.writeString(edgeID);
    2718            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_CHANGETARGET, vehicleID, &content);
    2719            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2720            1 : }
    2721              : 
    2722              : 
    2723              : void
    2724            0 : TraCIAPI::VehicleScope::changeLane(const std::string& vehicleID, int laneIndex, double duration) const {
    2725            0 :     tcpip::Storage content;
    2726            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2727            0 :     content.writeInt(2);
    2728            0 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2729            0 :     content.writeByte(laneIndex);
    2730            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2731            0 :     content.writeDouble(duration);
    2732            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_CHANGELANE, vehicleID, &content);
    2733            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2734            0 : }
    2735              : 
    2736              : 
    2737              : void
    2738            0 : TraCIAPI::VehicleScope::changeLaneRelative(const std::string& vehicleID, int laneChange, double duration) const {
    2739            0 :     tcpip::Storage content;
    2740            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2741            0 :     content.writeInt(3);
    2742            0 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2743            0 :     content.writeByte(laneChange);
    2744            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2745            0 :     content.writeDouble(duration);
    2746            0 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2747            0 :     content.writeByte(1);
    2748            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_CHANGELANE, vehicleID, &content);
    2749            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2750            0 : }
    2751              : 
    2752              : 
    2753              : void
    2754            0 : TraCIAPI::VehicleScope::changeSublane(const std::string& vehicleID, double latDist) const {
    2755            0 :     tcpip::Storage content;
    2756            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2757            0 :     content.writeDouble(latDist);
    2758            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_CHANGESUBLANE, vehicleID, &content);
    2759            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2760            0 : }
    2761              : 
    2762              : 
    2763              : void
    2764            1 : TraCIAPI::VehicleScope::setRouteID(const std::string& vehicleID, const std::string& routeID) const {
    2765            1 :     tcpip::Storage content;
    2766            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2767            1 :     content.writeString(routeID);
    2768            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_ROUTE_ID, vehicleID, &content);
    2769            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2770            1 : }
    2771              : 
    2772              : 
    2773              : void
    2774            1 : TraCIAPI::VehicleScope::setRoute(const std::string& vehicleID, const std::vector<std::string>& edges) const {
    2775            1 :     tcpip::Storage content;
    2776            1 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    2777            1 :     content.writeInt((int)edges.size());
    2778           11 :     for (int i = 0; i < (int)edges.size(); ++i) {
    2779           10 :         content.writeString(edges[i]);
    2780              :     }
    2781            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_ROUTE, vehicleID, &content);
    2782            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2783            1 : }
    2784              : 
    2785              : 
    2786              : void
    2787            1 : TraCIAPI::VehicleScope::rerouteTraveltime(const std::string& vehicleID, bool currentTravelTimes) const {
    2788            1 :     if (currentTravelTimes) {
    2789              :         // updated edge weights with current network traveltimes (at most once per simulation step)
    2790            1 :         std::vector<std::string> edges = myParent.edge.getIDList();
    2791           48 :         for (std::vector<std::string>::iterator it = edges.begin(); it != edges.end(); ++it) {
    2792           47 :             myParent.edge.adaptTraveltime(*it, myParent.edge.getTraveltime(*it));
    2793              :         }
    2794            1 :     }
    2795              : 
    2796            1 :     tcpip::Storage content;
    2797            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2798            1 :     content.writeInt(0);
    2799            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_REROUTE_TRAVELTIME, vehicleID, &content);
    2800            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2801            1 : }
    2802              : 
    2803              : void
    2804            1 : TraCIAPI::VehicleScope::moveTo(const std::string& vehicleID, const std::string& laneID, double position, int reason) const {
    2805            1 :     tcpip::Storage content;
    2806            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2807            1 :     content.writeInt(3);
    2808            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2809            1 :     content.writeString(laneID);
    2810            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2811            1 :     content.writeDouble(position);
    2812            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    2813            1 :     content.writeInt(reason);
    2814            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_MOVE_TO, vehicleID, &content);
    2815            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2816            1 : }
    2817              : 
    2818              : void
    2819            1 : TraCIAPI::VehicleScope::moveToXY(const std::string& vehicleID, const std::string& edgeID, const int lane, const double x, const double y, const double angle, const int keepRoute) const {
    2820            1 :     tcpip::Storage content;
    2821            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2822            1 :     content.writeInt(6);
    2823            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2824            1 :     content.writeString(edgeID);
    2825            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    2826            1 :     content.writeInt(lane);
    2827            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2828            1 :     content.writeDouble(x);
    2829            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2830            1 :     content.writeDouble(y);
    2831            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2832            1 :     content.writeDouble(angle);
    2833            1 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2834            1 :     content.writeByte(keepRoute);
    2835            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::MOVE_TO_XY, vehicleID, &content);
    2836            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2837            1 : }
    2838              : 
    2839              : 
    2840              : void
    2841            0 : TraCIAPI::VehicleScope::slowDown(const std::string& vehicleID, double speed, double duration) const {
    2842            0 :     tcpip::Storage content;
    2843            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2844            0 :     content.writeInt(2);
    2845            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2846            0 :     content.writeDouble(speed);
    2847            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2848            0 :     content.writeDouble(duration);
    2849            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_SLOWDOWN, vehicleID, &content);
    2850            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2851            0 : }
    2852              : 
    2853              : void
    2854            0 : TraCIAPI::VehicleScope::openGap(const std::string& vehicleID, double newTau, double duration, double changeRate, double maxDecel) const {
    2855            0 :     tcpip::Storage content;
    2856            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2857            0 :     if (maxDecel > 0) {
    2858            0 :         content.writeInt(4);
    2859              :     } else {
    2860            0 :         content.writeInt(3);
    2861              :     }
    2862            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2863            0 :     content.writeDouble(newTau);
    2864            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2865            0 :     content.writeDouble(duration);
    2866            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2867            0 :     content.writeDouble(changeRate);
    2868            0 :     if (maxDecel > 0) {
    2869            0 :         content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2870            0 :         content.writeDouble(maxDecel);
    2871              :     }
    2872            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_OPENGAP, vehicleID, &content);
    2873            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2874            0 : }
    2875              : 
    2876              : void
    2877            0 : TraCIAPI::VehicleScope::setSpeed(const std::string& vehicleID, double speed) const {
    2878            0 :     tcpip::Storage content;
    2879            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2880            0 :     content.writeDouble(speed);
    2881            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_SPEED, vehicleID, &content);
    2882            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2883            0 : }
    2884              : 
    2885              : void
    2886            0 : TraCIAPI::VehicleScope::setAcceleration(const std::string& vehicleID, double accel, double duration) const {
    2887            0 :     tcpip::Storage content;
    2888            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2889            0 :     content.writeInt(2);
    2890            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2891            0 :     content.writeDouble(accel);
    2892            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2893            0 :     content.writeDouble(duration);
    2894            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_ACCELERATION, vehicleID, &content);
    2895            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2896            0 : }
    2897              : 
    2898              : void
    2899            0 : TraCIAPI::VehicleScope::setPreviousSpeed(const std::string& vehicleID, double prevSpeed, double prevAcceleration) const {
    2900            0 :     tcpip::Storage content;
    2901            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2902            0 :     content.writeInt(2);
    2903            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2904            0 :     content.writeDouble(prevSpeed);
    2905            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2906            0 :     content.writeDouble(prevAcceleration);
    2907            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_PREV_SPEED, vehicleID, &content);
    2908            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2909            0 : }
    2910              : 
    2911              : void
    2912            1 : TraCIAPI::VehicleScope::setLaneChangeMode(const std::string& vehicleID, int mode) const {
    2913            1 :     tcpip::Storage content;
    2914            1 :     content.writeByte(libsumo::TYPE_INTEGER);
    2915            1 :     content.writeInt(mode);
    2916            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_LANECHANGE_MODE, vehicleID, &content);
    2917            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2918            1 : }
    2919              : 
    2920              : void
    2921            1 : TraCIAPI::VehicleScope::setSpeedMode(const std::string& vehicleID, int mode) const {
    2922            1 :     tcpip::Storage content;
    2923            1 :     content.writeByte(libsumo::TYPE_INTEGER);
    2924            1 :     content.writeInt(mode);
    2925            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_SPEEDSETMODE, vehicleID, &content);
    2926            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2927            1 : }
    2928              : 
    2929              : void
    2930            0 : TraCIAPI::VehicleScope::setStop(const std::string vehicleID, const std::string edgeID, const double endPos, const int laneIndex,
    2931              :                                 const double duration, const int flags, const double startPos, const double until) const {
    2932            0 :     tcpip::Storage content;
    2933            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    2934            0 :     content.writeInt(7);
    2935            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2936            0 :     content.writeString(edgeID);
    2937            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2938            0 :     content.writeDouble(endPos);
    2939            0 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2940            0 :     content.writeByte(laneIndex);
    2941            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2942            0 :     content.writeDouble(duration);
    2943            0 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    2944            0 :     content.writeByte(flags);
    2945            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2946            0 :     content.writeDouble(startPos);
    2947            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2948            0 :     content.writeDouble(until);
    2949            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::CMD_STOP, vehicleID, &content);
    2950            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2951            0 : }
    2952              : 
    2953              : void
    2954            1 : TraCIAPI::VehicleScope::setType(const std::string& vehicleID, const std::string& typeID) const {
    2955            1 :     tcpip::Storage content;
    2956            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    2957            1 :     content.writeString(typeID);
    2958            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_TYPE, vehicleID, &content);
    2959            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2960            1 : }
    2961              : 
    2962              : void
    2963            1 : TraCIAPI::VehicleScope::setSpeedFactor(const std::string& vehicleID, double factor) const {
    2964            1 :     tcpip::Storage content;
    2965            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2966            1 :     content.writeDouble(factor);
    2967            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_SPEED_FACTOR, vehicleID, &content);
    2968            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2969            1 : }
    2970              : 
    2971              : void
    2972            0 : TraCIAPI::VehicleScope::setMinGap(const std::string& vehicleID, double minGap) const {
    2973            0 :     tcpip::Storage content;
    2974            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2975            0 :     content.writeDouble(minGap);
    2976            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_MINGAP, vehicleID, &content);
    2977            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2978            0 : }
    2979              : 
    2980              : void
    2981            1 : TraCIAPI::VehicleScope::setMaxSpeed(const std::string& vehicleID, double speed) const {
    2982            1 :     tcpip::Storage content;
    2983            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    2984            1 :     content.writeDouble(speed);
    2985            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_MAXSPEED, vehicleID, &content);
    2986            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2987            1 : }
    2988              : 
    2989              : void
    2990            1 : TraCIAPI::VehicleScope::setColor(const std::string& vehicleID, const libsumo::TraCIColor& c) const {
    2991            1 :     tcpip::Storage content;
    2992            1 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    2993            1 :     content.writeUnsignedByte(c.r);
    2994            1 :     content.writeUnsignedByte(c.g);
    2995            1 :     content.writeUnsignedByte(c.b);
    2996            1 :     content.writeUnsignedByte(c.a);
    2997            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_COLOR, vehicleID, &content);
    2998            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    2999            1 : }
    3000              : 
    3001              : void
    3002            1 : TraCIAPI::VehicleScope::setLine(const std::string& vehicleID, const std::string& line) const {
    3003            1 :     tcpip::Storage content;
    3004            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3005            1 :     content.writeString(line);
    3006            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_LINE, vehicleID, &content);
    3007            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    3008            1 : }
    3009              : 
    3010              : void
    3011            1 : TraCIAPI::VehicleScope::setVia(const std::string& vehicleID, const std::vector<std::string>& via) const {
    3012            1 :     tcpip::Storage content;
    3013            1 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    3014            1 :     content.writeInt((int)via.size());
    3015            2 :     for (int i = 0; i < (int)via.size(); ++i) {
    3016            1 :         content.writeString(via[i]);
    3017              :     }
    3018            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_VIA, vehicleID, &content);
    3019            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    3020            1 : }
    3021              : 
    3022              : void
    3023            1 : TraCIAPI::VehicleScope::setSignals(const std::string& vehicleID, int signals) const {
    3024            1 :     tcpip::Storage content;
    3025            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3026            1 :     content.writeInt(signals);
    3027            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_SIGNALS, vehicleID, &content);
    3028            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    3029            1 : }
    3030              : 
    3031              : void
    3032            1 : TraCIAPI::VehicleScope::setRoutingMode(const std::string& vehicleID, int routingMode) const {
    3033            1 :     tcpip::Storage content;
    3034            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3035            1 :     content.writeInt(routingMode);
    3036            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_ROUTING_MODE, vehicleID, &content);
    3037            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    3038            1 : }
    3039              : 
    3040              : void
    3041            1 : TraCIAPI::VehicleScope::setShapeClass(const std::string& vehicleID, const std::string& clazz) const {
    3042            1 :     tcpip::Storage content;
    3043            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3044            1 :     content.writeString(clazz);
    3045            1 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_SHAPECLASS, vehicleID, &content);
    3046            1 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    3047            1 : }
    3048              : 
    3049              : 
    3050              : void
    3051            0 : TraCIAPI::VehicleScope::setEmissionClass(const std::string& vehicleID, const std::string& clazz) const {
    3052            0 :     tcpip::Storage content;
    3053            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3054            0 :     content.writeString(clazz);
    3055            0 :     myParent.createCommand(libsumo::CMD_SET_VEHICLE_VARIABLE, libsumo::VAR_EMISSIONCLASS, vehicleID, &content);
    3056            0 :     myParent.processSet(libsumo::CMD_SET_VEHICLE_VARIABLE);
    3057            0 : }
    3058              : 
    3059              : void
    3060            1 : TraCIAPI::VehicleScope::addSubscriptionFilterLanes(const std::vector<int>& lanes,
    3061              :         bool noOpposite, double downstreamDist, double upstreamDist) const {
    3062            1 :     addSubscriptionFilterByteList(libsumo::FILTER_TYPE_LANES, lanes);
    3063            1 :     if (noOpposite) {
    3064            0 :         addSubscriptionFilterNoOpposite();
    3065              :     }
    3066            1 :     if (downstreamDist >= 0) {
    3067            0 :         addSubscriptionFilterDownstreamDistance(downstreamDist);
    3068              :     }
    3069            1 :     if (upstreamDist >= 0) {
    3070            0 :         addSubscriptionFilterUpstreamDistance(upstreamDist);
    3071              :     }
    3072            1 : }
    3073              : 
    3074              : 
    3075              : void
    3076            1 : TraCIAPI::VehicleScope::addSubscriptionFilterNoOpposite() const {
    3077            1 :     addSubscriptionFilterEmpty(libsumo::FILTER_TYPE_NOOPPOSITE);
    3078            1 : }
    3079              : 
    3080              : void
    3081            1 : TraCIAPI::VehicleScope::addSubscriptionFilterDownstreamDistance(double dist) const {
    3082            1 :     addSubscriptionFilterFloat(libsumo::FILTER_TYPE_DOWNSTREAM_DIST, dist);
    3083            1 : }
    3084              : 
    3085              : void
    3086            1 : TraCIAPI::VehicleScope::addSubscriptionFilterUpstreamDistance(double dist) const {
    3087            1 :     addSubscriptionFilterFloat(libsumo::FILTER_TYPE_UPSTREAM_DIST, dist);
    3088            1 : }
    3089              : 
    3090              : 
    3091              : void
    3092            1 : TraCIAPI::VehicleScope::addSubscriptionFilterCFManeuver(double downstreamDist, double upstreamDist) const {
    3093            1 :     addSubscriptionFilterLeadFollow(std::vector<int>({0}));
    3094            1 :     if (downstreamDist >= 0) {
    3095            0 :         addSubscriptionFilterDownstreamDistance(downstreamDist);
    3096              :     }
    3097            1 :     if (upstreamDist >= 0) {
    3098            0 :         addSubscriptionFilterUpstreamDistance(upstreamDist);
    3099              :     }
    3100            1 : }
    3101              : 
    3102              : void
    3103            1 : TraCIAPI::VehicleScope::addSubscriptionFilterLCManeuver(int direction, bool noOpposite, double downstreamDist, double upstreamDist) const {
    3104            1 :     if (abs(direction) != 1) {
    3105            0 :         std::cerr << "Ignoring lane change subscription filter with non-neighboring lane offset direction " << direction << "\n";
    3106            0 :         return;
    3107              :     }
    3108            1 :     addSubscriptionFilterLeadFollow(std::vector<int>({0, direction}));
    3109            1 :     if (noOpposite) {
    3110            0 :         addSubscriptionFilterNoOpposite();
    3111              :     }
    3112            1 :     if (downstreamDist >= 0) {
    3113            0 :         addSubscriptionFilterDownstreamDistance(downstreamDist);
    3114              :     }
    3115            1 :     if (upstreamDist >= 0) {
    3116            0 :         addSubscriptionFilterUpstreamDistance(upstreamDist);
    3117              :     }
    3118              : }
    3119              : 
    3120              : void
    3121            3 : TraCIAPI::VehicleScope::addSubscriptionFilterLeadFollow(const std::vector<int>& lanes) const {
    3122            3 :     addSubscriptionFilterEmpty(libsumo::FILTER_TYPE_LEAD_FOLLOW);
    3123            3 :     addSubscriptionFilterByteList(libsumo::FILTER_TYPE_LANES, lanes);
    3124            3 : }
    3125              : 
    3126              : void
    3127            1 : TraCIAPI::VehicleScope::addSubscriptionFilterTurn(double downstreamDist, double foeDistToJunction) const {
    3128            1 :     addSubscriptionFilterFloat(libsumo::FILTER_TYPE_TURN, foeDistToJunction);
    3129            1 :     if (downstreamDist >= 0) {
    3130            0 :         addSubscriptionFilterDownstreamDistance(downstreamDist);
    3131              :     }
    3132            1 : }
    3133              : 
    3134              : 
    3135              : void
    3136            1 : TraCIAPI::VehicleScope::addSubscriptionFilterVClass(const std::vector<std::string>& vClasses) const {
    3137            1 :     addSubscriptionFilterStringList(libsumo::FILTER_TYPE_VCLASS, vClasses);
    3138            1 : }
    3139              : 
    3140              : 
    3141              : void
    3142            1 : TraCIAPI::VehicleScope::addSubscriptionFilterVType(const std::vector<std::string>& vTypes) const {
    3143            1 :     addSubscriptionFilterStringList(libsumo::FILTER_TYPE_VTYPE, vTypes);
    3144            1 : }
    3145              : 
    3146              : 
    3147              : void
    3148            1 : TraCIAPI::VehicleScope::addSubscriptionFilterFieldOfVision(double angle) const {
    3149            1 :     addSubscriptionFilterFloat(libsumo::FILTER_TYPE_FIELD_OF_VISION, angle);
    3150            1 : }
    3151              : 
    3152              : void
    3153            1 : TraCIAPI::VehicleScope::addSubscriptionFilterLateralDistance(double lateralDist, double downstreamDist, double upstreamDist) const {
    3154            1 :     addSubscriptionFilterFloat(libsumo::FILTER_TYPE_LATERAL_DIST, lateralDist);
    3155            1 :     if (downstreamDist >= 0) {
    3156            0 :         addSubscriptionFilterDownstreamDistance(downstreamDist);
    3157              :     }
    3158            1 :     if (upstreamDist >= 0) {
    3159            0 :         addSubscriptionFilterUpstreamDistance(upstreamDist);
    3160              :     }
    3161            1 : }
    3162              : 
    3163              : void
    3164            4 : TraCIAPI::VehicleScope::addSubscriptionFilterEmpty(int filterType) const {
    3165            4 :     myParent.createFilterCommand(libsumo::CMD_ADD_SUBSCRIPTION_FILTER, filterType);
    3166            4 :     myParent.processSet(libsumo::CMD_ADD_SUBSCRIPTION_FILTER);
    3167            4 : }
    3168              : 
    3169              : void
    3170            5 : TraCIAPI::VehicleScope::addSubscriptionFilterFloat(int filterType, double val) const {
    3171            5 :     tcpip::Storage content;
    3172            5 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3173            5 :     content.writeDouble(val);
    3174            5 :     myParent.createFilterCommand(libsumo::CMD_ADD_SUBSCRIPTION_FILTER, filterType, &content);
    3175            5 :     myParent.processSet(libsumo::CMD_ADD_SUBSCRIPTION_FILTER);
    3176            5 : }
    3177              : 
    3178              : 
    3179              : void
    3180            2 : TraCIAPI::VehicleScope::addSubscriptionFilterStringList(int filterType, const std::vector<std::string>& vals) const {
    3181            2 :     tcpip::Storage content;
    3182            2 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    3183            2 :     content.writeStringList(vals);
    3184            2 :     myParent.createFilterCommand(libsumo::CMD_ADD_SUBSCRIPTION_FILTER, filterType, &content);
    3185            2 :     myParent.processSet(libsumo::CMD_ADD_SUBSCRIPTION_FILTER);
    3186            2 : }
    3187              : 
    3188              : 
    3189              : void
    3190            4 : TraCIAPI::VehicleScope::addSubscriptionFilterByteList(int filterType, const std::vector<int>& vals) const {
    3191            4 :     tcpip::Storage content;
    3192            4 :     content.writeUnsignedByte((int)vals.size());
    3193           13 :     for (int i : vals)  {
    3194            9 :         content.writeByte(i);
    3195              :     }
    3196            4 :     myParent.createFilterCommand(libsumo::CMD_ADD_SUBSCRIPTION_FILTER, filterType, &content);
    3197            4 :     myParent.processSet(libsumo::CMD_ADD_SUBSCRIPTION_FILTER);
    3198            4 : }
    3199              : 
    3200              : 
    3201              : // ---------------------------------------------------------------------------
    3202              : // TraCIAPI::PersonScope-methods
    3203              : // ---------------------------------------------------------------------------
    3204              : double
    3205            1 : TraCIAPI::PersonScope::getSpeed(const std::string& personID) const {
    3206            1 :     return getDouble(libsumo::VAR_SPEED, personID);
    3207              : }
    3208              : 
    3209              : libsumo::TraCIPosition
    3210            1 : TraCIAPI::PersonScope::getPosition(const std::string& personID) const {
    3211            1 :     return getPos(libsumo::VAR_POSITION, personID);
    3212              : }
    3213              : 
    3214              : libsumo::TraCIPosition
    3215            1 : TraCIAPI::PersonScope::getPosition3D(const std::string& personID) const {
    3216            1 :     return getPos3D(libsumo::VAR_POSITION3D, personID);
    3217              : }
    3218              : 
    3219              : double
    3220            1 : TraCIAPI::PersonScope::getAngle(const std::string& personID) const {
    3221            1 :     return getDouble(libsumo::VAR_ANGLE, personID);
    3222              : }
    3223              : 
    3224              : double
    3225            1 : TraCIAPI::PersonScope::getSlope(const std::string& personID) const {
    3226            1 :     return getDouble(libsumo::VAR_SLOPE, personID);
    3227              : }
    3228              : 
    3229              : double
    3230            1 : TraCIAPI::PersonScope::getLanePosition(const std::string& personID) const {
    3231            1 :     return getDouble(libsumo::VAR_LANEPOSITION, personID);
    3232              : }
    3233              : 
    3234              : libsumo::TraCIColor
    3235            1 : TraCIAPI::PersonScope::getColor(const std::string& personID) const {
    3236            1 :     return getCol(libsumo::VAR_COLOR, personID);
    3237              : }
    3238              : 
    3239              : double
    3240            1 : TraCIAPI::PersonScope::getLength(const std::string& personID) const {
    3241            1 :     return getDouble(libsumo::VAR_LENGTH, personID);
    3242              : }
    3243              : 
    3244              : std::string
    3245            1 : TraCIAPI::PersonScope::getRoadID(const std::string& personID) const {
    3246            1 :     return getString(libsumo::VAR_ROAD_ID, personID);
    3247              : }
    3248              : 
    3249              : std::string
    3250            1 : TraCIAPI::PersonScope::getLaneID(const std::string& personID) const {
    3251            1 :     return getString(libsumo::VAR_LANE_ID, personID);
    3252              : }
    3253              : 
    3254              : std::string
    3255            1 : TraCIAPI::PersonScope::getTypeID(const std::string& personID) const {
    3256            1 :     return getString(libsumo::VAR_TYPE, personID);
    3257              : }
    3258              : 
    3259              : double
    3260            0 : TraCIAPI::PersonScope::getSpeedFactor(const std::string& personID) const {
    3261            0 :     return getDouble(libsumo::VAR_SPEED_FACTOR, personID);
    3262              : }
    3263              : 
    3264              : double
    3265            1 : TraCIAPI::PersonScope::getWaitingTime(const std::string& personID) const {
    3266            1 :     return getDouble(libsumo::VAR_WAITING_TIME, personID);
    3267              : }
    3268              : 
    3269              : std::string
    3270            1 : TraCIAPI::PersonScope::getNextEdge(const std::string& personID) const {
    3271            1 :     return getString(libsumo::VAR_NEXT_EDGE, personID);
    3272              : }
    3273              : 
    3274              : 
    3275              : std::string
    3276            1 : TraCIAPI::PersonScope::getVehicle(const std::string& personID) const {
    3277            1 :     return getString(libsumo::VAR_VEHICLE, personID);
    3278              : }
    3279              : 
    3280              : int
    3281            7 : TraCIAPI::PersonScope::getRemainingStages(const std::string& personID) const {
    3282            7 :     return getInt(libsumo::VAR_STAGES_REMAINING, personID);
    3283              : }
    3284              : 
    3285              : libsumo::TraCIStage
    3286            2 : TraCIAPI::PersonScope::getStage(const std::string& personID, int nextStageIndex) const {
    3287            2 :     tcpip::Storage content;
    3288            2 :     content.writeByte(libsumo::TYPE_INTEGER);
    3289            2 :     content.writeInt(nextStageIndex);
    3290            4 :     return getTraCIStage(libsumo::VAR_STAGE, personID, &content);
    3291            2 : }
    3292              : 
    3293              : std::vector<std::string>
    3294            3 : TraCIAPI::PersonScope::getEdges(const std::string& personID, int nextStageIndex) const {
    3295            3 :     tcpip::Storage content;
    3296            3 :     content.writeByte(libsumo::TYPE_INTEGER);
    3297            3 :     content.writeInt(nextStageIndex);
    3298            6 :     return getStringVector(libsumo::VAR_EDGES, personID, &content);
    3299            3 : }
    3300              : 
    3301              : void
    3302            1 : TraCIAPI::PersonScope::removeStages(const std::string& personID) const {
    3303              :     // remove all stages after the current and then abort the current stage
    3304            3 :     while (getRemainingStages(personID) > 1) {
    3305            2 :         removeStage(personID, 1);
    3306              :     }
    3307            1 :     removeStage(personID, 0);
    3308            1 : }
    3309              : 
    3310              : 
    3311              : void
    3312            1 : TraCIAPI::PersonScope::rerouteTraveltime(const std::string& personID) const {
    3313            1 :     tcpip::Storage content;
    3314            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3315            1 :     content.writeInt(0);
    3316            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::CMD_REROUTE_TRAVELTIME, personID, &content);
    3317            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3318            1 : }
    3319              : 
    3320              : 
    3321              : void
    3322            1 : TraCIAPI::PersonScope::add(const std::string& personID, const std::string& edgeID, double pos, double depart, const std::string typeID) {
    3323            1 :     tcpip::Storage content;
    3324            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3325            1 :     content.writeInt(4);
    3326            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3327            1 :     content.writeString(typeID);
    3328            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3329            1 :     content.writeString(edgeID);
    3330            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3331            1 :     content.writeDouble(depart);
    3332            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3333            1 :     content.writeDouble(pos);
    3334            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::ADD, personID, &content);
    3335            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3336            1 : }
    3337              : 
    3338              : void
    3339            1 : TraCIAPI::PersonScope::appendStage(const std::string& personID, const libsumo::TraCIStage& stage) {
    3340            1 :     tcpip::Storage content;
    3341            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3342            1 :     content.writeInt(13);
    3343            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3344            1 :     content.writeInt(stage.type);
    3345            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3346            1 :     content.writeString(stage.vType);
    3347            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3348            1 :     content.writeString(stage.line);
    3349            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3350            1 :     content.writeString(stage.destStop);
    3351            1 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    3352            1 :     content.writeStringList(stage.edges);
    3353            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3354            1 :     content.writeDouble(stage.travelTime);
    3355            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3356            1 :     content.writeDouble(stage.cost);
    3357            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3358            1 :     content.writeDouble(stage.length);
    3359            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3360            1 :     content.writeString(stage.intended);
    3361            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3362            1 :     content.writeDouble(stage.depart);
    3363            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3364            1 :     content.writeDouble(stage.departPos);
    3365            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3366            1 :     content.writeDouble(stage.arrivalPos);
    3367            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3368            1 :     content.writeString(stage.description);
    3369            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::APPEND_STAGE, personID, &content);
    3370            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3371            1 : }
    3372              : 
    3373              : 
    3374              : void
    3375            1 : TraCIAPI::PersonScope::appendWaitingStage(const std::string& personID, double duration, const std::string& description, const std::string& stopID) {
    3376            1 :     tcpip::Storage content;
    3377            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3378            1 :     content.writeInt(4);
    3379            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3380            1 :     content.writeInt(libsumo::STAGE_WAITING);
    3381            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3382            1 :     content.writeDouble(duration);
    3383            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3384            1 :     content.writeString(description);
    3385            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3386            1 :     content.writeString(stopID);
    3387            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::APPEND_STAGE, personID, &content);
    3388            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3389            1 : }
    3390              : 
    3391              : void
    3392            2 : TraCIAPI::PersonScope::appendWalkingStage(const std::string& personID, const std::vector<std::string>& edges, double arrivalPos, double duration, double speed, const std::string& stopID) {
    3393            2 :     tcpip::Storage content;
    3394            2 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3395            2 :     content.writeInt(6);
    3396            2 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3397            2 :     content.writeInt(libsumo::STAGE_WALKING);
    3398            2 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    3399            2 :     content.writeStringList(edges);
    3400            2 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3401            2 :     content.writeDouble(arrivalPos);
    3402            2 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3403            2 :     content.writeDouble(duration);
    3404            2 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3405            2 :     content.writeDouble(speed);
    3406            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3407            2 :     content.writeString(stopID);
    3408            2 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::APPEND_STAGE, personID, &content);
    3409            2 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3410            2 : }
    3411              : 
    3412              : void
    3413            1 : TraCIAPI::PersonScope::appendDrivingStage(const std::string& personID, const std::string& toEdge, const std::string& lines, const std::string& stopID) {
    3414            1 :     tcpip::Storage content;
    3415            1 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3416            1 :     content.writeInt(4);
    3417            1 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3418            1 :     content.writeInt(libsumo::STAGE_DRIVING);
    3419            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3420            1 :     content.writeString(toEdge);
    3421            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3422            1 :     content.writeString(lines);
    3423            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3424            1 :     content.writeString(stopID);
    3425            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::APPEND_STAGE, personID, &content);
    3426            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3427            1 : }
    3428              : 
    3429              : void
    3430            4 : TraCIAPI::PersonScope::removeStage(const std::string& personID, int nextStageIndex) const {
    3431            4 :     tcpip::Storage content;
    3432            4 :     content.writeByte(libsumo::TYPE_INTEGER);
    3433            4 :     content.writeInt(nextStageIndex);
    3434            4 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::REMOVE_STAGE, personID, &content);
    3435            4 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3436            4 : }
    3437              : 
    3438              : void
    3439            0 : TraCIAPI::PersonScope::moveTo(const std::string& personID, const std::string& edgeID, double position) const {
    3440            0 :     tcpip::Storage content;
    3441            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3442            0 :     content.writeInt(2);
    3443            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3444            0 :     content.writeString(edgeID);
    3445            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3446            0 :     content.writeDouble(position);
    3447            0 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_MOVE_TO, personID, &content);
    3448            0 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3449            0 : }
    3450              : 
    3451              : void
    3452            0 : TraCIAPI::PersonScope::moveToXY(const std::string& personID, const std::string& edgeID, const double x, const double y, double angle, const int keepRoute) const {
    3453            0 :     tcpip::Storage content;
    3454            0 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3455            0 :     content.writeInt(5);
    3456            0 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3457            0 :     content.writeString(edgeID);
    3458            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3459            0 :     content.writeDouble(x);
    3460            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3461            0 :     content.writeDouble(y);
    3462            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3463            0 :     content.writeDouble(angle);
    3464            0 :     content.writeUnsignedByte(libsumo::TYPE_BYTE);
    3465            0 :     content.writeByte(keepRoute);
    3466            0 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::MOVE_TO_XY, personID, &content);
    3467            0 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3468            0 : }
    3469              : 
    3470              : void
    3471            1 : TraCIAPI::PersonScope::setSpeed(const std::string& personID, double speed) const {
    3472            1 :     tcpip::Storage content;
    3473            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3474            1 :     content.writeDouble(speed);
    3475            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_SPEED, personID, &content);
    3476            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3477            1 : }
    3478              : 
    3479              : 
    3480              : void
    3481            1 : TraCIAPI::PersonScope::setType(const std::string& personID, const std::string& typeID) const {
    3482            1 :     tcpip::Storage content;
    3483            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3484            1 :     content.writeString(typeID);
    3485            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_TYPE, personID, &content);
    3486            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3487            1 : }
    3488              : 
    3489              : void
    3490            0 : TraCIAPI::PersonScope::setSpeedFactor(const std::string& personID, double factor) const {
    3491            0 :     tcpip::Storage content;
    3492            0 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3493            0 :     content.writeDouble(factor);
    3494            0 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_SPEED_FACTOR, personID, &content);
    3495            0 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3496            0 : }
    3497              : 
    3498              : void
    3499            1 : TraCIAPI::PersonScope::setLength(const std::string& personID, double length) const {
    3500            1 :     tcpip::Storage content;
    3501            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3502            1 :     content.writeDouble(length);
    3503            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_LENGTH, personID, &content);
    3504            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3505            1 : }
    3506              : 
    3507              : 
    3508              : void
    3509            1 : TraCIAPI::PersonScope::setWidth(const std::string& personID, double width) const {
    3510            1 :     tcpip::Storage content;
    3511            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3512            1 :     content.writeDouble(width);
    3513            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_WIDTH, personID, &content);
    3514            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3515            1 : }
    3516              : 
    3517              : void
    3518            1 : TraCIAPI::PersonScope::setHeight(const std::string& personID, double height) const {
    3519            1 :     tcpip::Storage content;
    3520            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3521            1 :     content.writeDouble(height);
    3522            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_HEIGHT, personID, &content);
    3523            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3524            1 : }
    3525              : 
    3526              : void
    3527            1 : TraCIAPI::PersonScope::setMinGap(const std::string& personID, double minGap) const {
    3528            1 :     tcpip::Storage content;
    3529            1 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3530            1 :     content.writeDouble(minGap);
    3531            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_MINGAP, personID, &content);
    3532            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3533            1 : }
    3534              : 
    3535              : 
    3536              : void
    3537            1 : TraCIAPI::PersonScope::setColor(const std::string& personID, const libsumo::TraCIColor& c) const {
    3538            1 :     tcpip::Storage content;
    3539            1 :     content.writeUnsignedByte(libsumo::TYPE_COLOR);
    3540            1 :     content.writeUnsignedByte(c.r);
    3541            1 :     content.writeUnsignedByte(c.g);
    3542            1 :     content.writeUnsignedByte(c.b);
    3543            1 :     content.writeUnsignedByte(c.a);
    3544            1 :     myParent.createCommand(libsumo::CMD_SET_PERSON_VARIABLE, libsumo::VAR_COLOR, personID, &content);
    3545            1 :     myParent.processSet(libsumo::CMD_SET_PERSON_VARIABLE);
    3546            1 : }
    3547              : 
    3548              : 
    3549              : // ---------------------------------------------------------------------------
    3550              : // TraCIAPI::TraCIScopeWrapper-methods
    3551              : // ---------------------------------------------------------------------------
    3552              : 
    3553              : int
    3554            0 : TraCIAPI::TraCIScopeWrapper::getUnsignedByte(int var, const std::string& id, tcpip::Storage* add) const {
    3555            0 :     myParent.createCommand(myCmdGetID, var, id, add);
    3556            0 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_UBYTE)) {
    3557            0 :         return myParent.myInput.readUnsignedByte();
    3558              :     }
    3559              :     return libsumo::INVALID_INT_VALUE;
    3560              : }
    3561              : 
    3562              : 
    3563              : int
    3564            0 : TraCIAPI::TraCIScopeWrapper::getByte(int var, const std::string& id, tcpip::Storage* add) const {
    3565            0 :     myParent.createCommand(myCmdGetID, var, id, add);
    3566            0 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_BYTE)) {
    3567            0 :         return myParent.myInput.readByte();
    3568              :     }
    3569              :     return libsumo::INVALID_INT_VALUE;
    3570              : }
    3571              : 
    3572              : 
    3573              : 
    3574              : int
    3575           31 : TraCIAPI::TraCIScopeWrapper::getInt(int var, const std::string& id, tcpip::Storage* add) const {
    3576           31 :     myParent.createCommand(myCmdGetID, var, id, add);
    3577           31 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_INTEGER)) {
    3578           31 :         return myParent.myInput.readInt();
    3579              :     }
    3580              :     return libsumo::INVALID_INT_VALUE;
    3581              : }
    3582              : 
    3583              : 
    3584              : double
    3585           83 : TraCIAPI::TraCIScopeWrapper::getDouble(int var, const std::string& id, tcpip::Storage* add) const {
    3586           83 :     myParent.createCommand(myCmdGetID, var, id, add);
    3587           83 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_DOUBLE)) {
    3588           83 :         return myParent.myInput.readDouble();
    3589              :     }
    3590              :     return libsumo::INVALID_DOUBLE_VALUE;
    3591              : }
    3592              : 
    3593              : 
    3594              : libsumo::TraCIPositionVector
    3595            3 : TraCIAPI::TraCIScopeWrapper::getPolygon(int var, const std::string& id, tcpip::Storage* add) const {
    3596              :     libsumo::TraCIPositionVector ret;
    3597            3 :     myParent.createCommand(myCmdGetID, var, id, add);
    3598            3 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_POLYGON)) {
    3599            3 :         int size = myParent.myInput.readUnsignedByte();
    3600            3 :         if (size == 0) {
    3601            0 :             size = myParent.myInput.readInt();
    3602              :         }
    3603           20 :         for (int i = 0; i < size; ++i) {
    3604           17 :             libsumo::TraCIPosition p;
    3605           17 :             p.x = myParent.myInput.readDouble();
    3606           17 :             p.y = myParent.myInput.readDouble();
    3607           17 :             p.z = 0.;
    3608           17 :             ret.value.push_back(p);
    3609              :         }
    3610              :     }
    3611            3 :     return ret;
    3612              : }
    3613              : 
    3614              : 
    3615              : libsumo::TraCIPosition
    3616            2 : TraCIAPI::TraCIScopeWrapper::getPos(int var, const std::string& id, tcpip::Storage* add) const {
    3617            2 :     libsumo::TraCIPosition p;
    3618            2 :     myParent.createCommand(myCmdGetID, var, id, add);
    3619            2 :     if (myParent.processGet(myCmdGetID, libsumo::POSITION_2D)) {
    3620            2 :         p.x = myParent.myInput.readDouble();
    3621            2 :         p.y = myParent.myInput.readDouble();
    3622            2 :         p.z = 0;
    3623              :     }
    3624            2 :     return p;
    3625              : }
    3626              : 
    3627              : 
    3628              : libsumo::TraCIPosition
    3629            1 : TraCIAPI::TraCIScopeWrapper::getPos3D(int var, const std::string& id, tcpip::Storage* add) const {
    3630            1 :     libsumo::TraCIPosition p;
    3631            1 :     myParent.createCommand(myCmdGetID, var, id, add);
    3632            1 :     if (myParent.processGet(myCmdGetID, libsumo::POSITION_3D)) {
    3633            1 :         p.x = myParent.myInput.readDouble();
    3634            1 :         p.y = myParent.myInput.readDouble();
    3635            1 :         p.z = myParent.myInput.readDouble();
    3636              :     }
    3637            1 :     return p;
    3638              : }
    3639              : 
    3640              : 
    3641              : std::string
    3642           25 : TraCIAPI::TraCIScopeWrapper::getString(int var, const std::string& id, tcpip::Storage* add) const {
    3643           25 :     myParent.createCommand(myCmdGetID, var, id, add);
    3644           25 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_STRING)) {
    3645           25 :         return myParent.myInput.readString();
    3646              :     }
    3647            0 :     return "";
    3648              : }
    3649              : 
    3650              : 
    3651              : std::vector<std::string>
    3652           22 : TraCIAPI::TraCIScopeWrapper::getStringVector(int var, const std::string& id, tcpip::Storage* add) const {
    3653              :     std::vector<std::string> r;
    3654           22 :     myParent.createCommand(myCmdGetID, var, id, add);
    3655           22 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_STRINGLIST)) {
    3656           22 :         const int size = myParent.myInput.readInt();
    3657          320 :         for (int i = 0; i < size; ++i) {
    3658          596 :             r.push_back(myParent.myInput.readString());
    3659              :         }
    3660              :     }
    3661           22 :     return r;
    3662            0 : }
    3663              : 
    3664              : 
    3665              : std::vector<double>
    3666            0 : TraCIAPI::TraCIScopeWrapper::getDoubleVector(int var, const std::string& id, tcpip::Storage* add) const {
    3667              :     std::vector<double> r;
    3668            0 :     myParent.createCommand(myCmdGetID, var, id, add);
    3669            0 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_DOUBLELIST)) {
    3670            0 :         const int size = myParent.myInput.readInt();
    3671            0 :         for (int i = 0; i < size; ++i) {
    3672            0 :             r.push_back(myParent.myInput.readDouble());
    3673              :         }
    3674              :     }
    3675            0 :     return r;
    3676            0 : }
    3677              : 
    3678              : 
    3679              : libsumo::TraCIColor
    3680            4 : TraCIAPI::TraCIScopeWrapper::getCol(int var, const std::string& id, tcpip::Storage* add) const {
    3681              :     libsumo::TraCIColor c;
    3682            4 :     myParent.createCommand(myCmdGetID, var, id, add);
    3683            4 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_COLOR)) {
    3684            4 :         c.r = (unsigned char)myParent.myInput.readUnsignedByte();
    3685            4 :         c.g = (unsigned char)myParent.myInput.readUnsignedByte();
    3686            4 :         c.b = (unsigned char)myParent.myInput.readUnsignedByte();
    3687            4 :         c.a = (unsigned char)myParent.myInput.readUnsignedByte();
    3688              :     }
    3689            4 :     return c;
    3690              : }
    3691              : 
    3692              : 
    3693              : libsumo::TraCIStage
    3694            3 : TraCIAPI::TraCIScopeWrapper::getTraCIStage(int var, const std::string& id, tcpip::Storage* add) const {
    3695            6 :     libsumo::TraCIStage s;
    3696            3 :     myParent.createCommand(myCmdGetID, var, id, add);
    3697            3 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_COMPOUND)) {
    3698            3 :         myParent.myInput.readInt(); // components
    3699            3 :         myParent.myInput.readUnsignedByte();
    3700            3 :         s.type = myParent.myInput.readInt();
    3701              : 
    3702            3 :         myParent.myInput.readUnsignedByte();
    3703            3 :         s.vType = myParent.myInput.readString();
    3704              : 
    3705            3 :         myParent.myInput.readUnsignedByte();
    3706            3 :         s.line = myParent.myInput.readString();
    3707              : 
    3708            3 :         myParent.myInput.readUnsignedByte();
    3709            3 :         s.destStop = myParent.myInput.readString();
    3710              : 
    3711            3 :         myParent.myInput.readUnsignedByte();
    3712            3 :         s.edges = myParent.myInput.readStringList();
    3713              : 
    3714            3 :         myParent.myInput.readUnsignedByte();
    3715            3 :         s.travelTime = myParent.myInput.readDouble();
    3716              : 
    3717            3 :         myParent.myInput.readUnsignedByte();
    3718            3 :         s.cost = myParent.myInput.readDouble();
    3719              : 
    3720            3 :         myParent.myInput.readUnsignedByte();
    3721            3 :         s.length = myParent.myInput.readDouble();
    3722              : 
    3723            3 :         myParent.myInput.readUnsignedByte();
    3724            3 :         s.intended = myParent.myInput.readString();
    3725              : 
    3726            3 :         myParent.myInput.readUnsignedByte();
    3727            3 :         s.depart = myParent.myInput.readDouble();
    3728              : 
    3729            3 :         myParent.myInput.readUnsignedByte();
    3730            3 :         s.departPos = myParent.myInput.readDouble();
    3731              : 
    3732            3 :         myParent.myInput.readUnsignedByte();
    3733            3 :         s.arrivalPos = myParent.myInput.readDouble();
    3734              : 
    3735            3 :         myParent.myInput.readUnsignedByte();
    3736            6 :         s.description = myParent.myInput.readString();
    3737              :     }
    3738            3 :     return s;
    3739            0 : }
    3740              : 
    3741              : 
    3742              : std::vector<std::string>
    3743           13 : TraCIAPI::TraCIScopeWrapper::getIDList() const {
    3744           26 :     return getStringVector(libsumo::TRACI_ID_LIST, "");
    3745              : }
    3746              : 
    3747              : 
    3748              : int
    3749            7 : TraCIAPI::TraCIScopeWrapper::getIDCount() const {
    3750           14 :     return getInt(libsumo::ID_COUNT, "");
    3751              : }
    3752              : 
    3753              : 
    3754              : std::string
    3755            3 : TraCIAPI::TraCIScopeWrapper::getParameter(const std::string& objectID, const std::string& key) const {
    3756            3 :     tcpip::Storage content;
    3757            3 :     content.writeByte(libsumo::TYPE_STRING);
    3758            3 :     content.writeString(key);
    3759            6 :     return getString(libsumo::VAR_PARAMETER, objectID, &content);
    3760            3 : }
    3761              : 
    3762              : 
    3763              : std::pair<std::string, std::string>
    3764            1 : TraCIAPI::TraCIScopeWrapper::getParameterWithKey(const std::string& objectID, const std::string& key) const {
    3765            1 :     tcpip::Storage content;
    3766            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3767            1 :     content.writeString(key);
    3768              : 
    3769            1 :     myParent.createCommand(myCmdGetID, libsumo::VAR_PARAMETER_WITH_KEY, objectID, &content);
    3770            1 :     if (myParent.processGet(myCmdGetID, libsumo::TYPE_COMPOUND)) {
    3771            1 :         myParent.myInput.readInt();  // number of components
    3772            1 :         myParent.myInput.readUnsignedByte();
    3773            1 :         const std::string returnedKey = myParent.myInput.readString();
    3774            1 :         myParent.myInput.readUnsignedByte();
    3775            1 :         const std::string value = myParent.myInput.readString();
    3776              :         return std::make_pair(returnedKey, value);
    3777              :     }
    3778            0 :     return std::make_pair(key, "");
    3779            1 : }
    3780              : 
    3781              : 
    3782              : void
    3783            2 : TraCIAPI::TraCIScopeWrapper::setParameter(const std::string& objectID, const std::string& key, const std::string& value) const {
    3784            2 :     tcpip::Storage content;
    3785            2 :     content.writeUnsignedByte(libsumo::TYPE_COMPOUND);
    3786            2 :     content.writeInt(2);
    3787            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3788            2 :     content.writeString(key);
    3789            2 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3790            2 :     content.writeString(value);
    3791            2 :     myParent.createCommand(myCmdSetID, libsumo::VAR_PARAMETER, objectID, &content);
    3792            2 :     myParent.processSet(myCmdSetID);
    3793            2 : }
    3794              : 
    3795              : 
    3796              : void
    3797            0 : TraCIAPI::TraCIScopeWrapper::setInt(int var, const std::string& id, int value) const {
    3798            0 :     tcpip::Storage content;
    3799            0 :     content.writeUnsignedByte(libsumo::TYPE_INTEGER);
    3800            0 :     content.writeInt(value);
    3801            0 :     myParent.createCommand(myCmdSetID, var, id, &content);
    3802            0 :     myParent.processSet(myCmdSetID);
    3803            0 : }
    3804              : 
    3805              : 
    3806              : void
    3807            2 : TraCIAPI::TraCIScopeWrapper::setDouble(int var, const std::string& id, double value) const {
    3808            2 :     tcpip::Storage content;
    3809            2 :     content.writeUnsignedByte(libsumo::TYPE_DOUBLE);
    3810            2 :     content.writeDouble(value);
    3811            2 :     myParent.createCommand(myCmdSetID, var, id, &content);
    3812            2 :     myParent.processSet(myCmdSetID);
    3813            2 : }
    3814              : 
    3815              : 
    3816              : void
    3817            1 : TraCIAPI::TraCIScopeWrapper::setString(int var, const std::string& id, const std::string& value) const {
    3818            1 :     tcpip::Storage content;
    3819            1 :     content.writeUnsignedByte(libsumo::TYPE_STRING);
    3820            1 :     content.writeString(value);
    3821            1 :     myParent.createCommand(myCmdSetID, var, id, &content);
    3822            1 :     myParent.processSet(myCmdSetID);
    3823            1 : }
    3824              : 
    3825              : 
    3826              : void
    3827            0 : TraCIAPI::TraCIScopeWrapper::setStringVector(int var, const std::string& id, const std::vector<std::string>& value) const {
    3828            0 :     tcpip::Storage content;
    3829            0 :     content.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
    3830            0 :     content.writeInt((int)value.size());
    3831            0 :     for (const std::string& s : value) {
    3832            0 :         content.writeString(s);
    3833              :     }
    3834            0 :     myParent.createCommand(myCmdSetID, var, id, &content);
    3835            0 :     myParent.processSet(myCmdSetID);
    3836            0 : }
    3837              : 
    3838              : 
    3839              : void
    3840            2 : TraCIAPI::TraCIScopeWrapper::subscribe(const std::string& objID, const std::vector<int>& vars, double beginTime, double endTime) const {
    3841            2 :     myParent.send_commandSubscribeObjectVariable(mySubscribeID, objID, beginTime, endTime, vars);
    3842            2 :     tcpip::Storage inMsg;
    3843            2 :     myParent.check_resultState(inMsg, mySubscribeID);
    3844            2 :     if (vars.size() > 0) {
    3845            2 :         myParent.check_commandGetResult(inMsg, mySubscribeID);
    3846            2 :         myParent.readVariableSubscription(mySubscribeID + 0x10, inMsg);
    3847              :     }
    3848            2 : }
    3849              : 
    3850              : 
    3851              : void
    3852            5 : TraCIAPI::TraCIScopeWrapper::subscribeContext(const std::string& objID, int domain, double range, const std::vector<int>& vars, double beginTime, double endTime) const {
    3853            5 :     myParent.send_commandSubscribeObjectContext(myContextSubscribeID, objID, beginTime, endTime, domain, range, vars);
    3854            5 :     tcpip::Storage inMsg;
    3855            5 :     myParent.check_resultState(inMsg, myContextSubscribeID);
    3856            5 :     myParent.check_commandGetResult(inMsg, myContextSubscribeID);
    3857            5 :     myParent.readContextSubscription(myContextSubscribeID + 0x60, inMsg);
    3858            5 : }
    3859              : 
    3860              : 
    3861              : const libsumo::SubscriptionResults
    3862            0 : TraCIAPI::TraCIScopeWrapper::getAllSubscriptionResults() const {
    3863            0 :     return mySubscriptionResults;
    3864              : }
    3865              : 
    3866              : 
    3867              : const libsumo::TraCIResults
    3868            1 : TraCIAPI::TraCIScopeWrapper::getSubscriptionResults(const std::string& objID) const {
    3869            1 :     if (mySubscriptionResults.find(objID) != mySubscriptionResults.end()) {
    3870              :         return mySubscriptionResults.find(objID)->second;
    3871              :     } else {
    3872            0 :         return libsumo::TraCIResults();
    3873              :     }
    3874              : }
    3875              : 
    3876              : 
    3877              : const libsumo::ContextSubscriptionResults
    3878            0 : TraCIAPI::TraCIScopeWrapper::getAllContextSubscriptionResults() const {
    3879            0 :     return myContextSubscriptionResults;
    3880              : }
    3881              : 
    3882              : 
    3883              : const libsumo::SubscriptionResults
    3884            2 : TraCIAPI::TraCIScopeWrapper::getContextSubscriptionResults(const std::string& objID) const {
    3885            2 :     if (myContextSubscriptionResults.find(objID) != myContextSubscriptionResults.end()) {
    3886              :         return myContextSubscriptionResults.find(objID)->second;
    3887              :     } else {
    3888            0 :         return libsumo::SubscriptionResults();
    3889              :     }
    3890              : }
    3891              : 
    3892              : 
    3893              : void
    3894          160 : TraCIAPI::TraCIScopeWrapper::clearSubscriptionResults() {
    3895              :     mySubscriptionResults.clear();
    3896              :     myContextSubscriptionResults.clear();
    3897          160 : }
    3898              : 
    3899              : 
    3900              : libsumo::SubscriptionResults&
    3901            9 : TraCIAPI::TraCIScopeWrapper::getModifiableSubscriptionResults() {
    3902            9 :     return mySubscriptionResults;
    3903              : }
    3904              : 
    3905              : 
    3906              : libsumo::SubscriptionResults&
    3907           30 : TraCIAPI::TraCIScopeWrapper::getModifiableContextSubscriptionResults(const std::string& objID) {
    3908           30 :     return myContextSubscriptionResults[objID];
    3909              : }
    3910              : 
    3911              : 
    3912              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1