Path: blob/main/src/traci_testclient/TraCITestClient.cpp
169665 views
/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2008-2025 German Aerospace Center (DLR) and others.3// This program and the accompanying materials are made available under the4// terms of the Eclipse Public License 2.0 which is available at5// https://www.eclipse.org/legal/epl-2.0/6// This Source Code may also be made available under the following Secondary7// Licenses when the conditions for such availability set forth in the Eclipse8// Public License 2.0 are satisfied: GNU General Public License, version 29// or later which is available at10// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html11// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later12/****************************************************************************/13/// @file TraCITestClient.cpp14/// @author Friedemann Wesner15/// @author Daniel Krajzewicz16/// @author Laura Bieker17/// @author Axel Wegener18/// @author Michael Behrisch19/// @author Jakob Erdmann20/// @date 2008/04/0721///22// A test execution class23/****************************************************************************/24/* =========================================================================25* included modules26* ======================================================================= */27#ifdef _MSC_VER28#define _CRT_SECURE_NO_WARNINGS29// Avoid some noisy warnings with Visual Studio30#pragma warning(disable:4820 4514 5045 4710)31#endif32#include <vector>33#include <iostream>34#include <iomanip>35#include <fstream>36#include <sstream>37#include <ctime>38#include <cstdlib>3940#define BUILD_TCPIP41#include <foreign/tcpip/storage.h>42#include <foreign/tcpip/socket.h>4344#include <libsumo/TraCIConstants.h>45#include <libsumo/TraCIDefs.h>46#include "TraCITestClient.h"474849// ===========================================================================50// method definitions51// ===========================================================================52TraCITestClient::TraCITestClient(std::string outputFileName)53: outputFileName(outputFileName), answerLog("") {54answerLog.setf(std::ios::fixed, std::ios::floatfield); // use decimal format55answerLog.setf(std::ios::showpoint); // print decimal point56answerLog << std::setprecision(2);57}585960TraCITestClient::~TraCITestClient() {61writeResult();62}636465int66TraCITestClient::run(std::string fileName, int port, std::string host) {67std::ifstream defFile;68std::string fileContentStr;69std::stringstream fileContent;70std::string lineCommand;71std::stringstream msg;72int repNo = 1;73bool commentRead = false;7475// try to connect76try {77TraCIAPI::connect(host, port);78} catch (tcpip::SocketException& e) {79msg << "#Error while connecting: " << e.what();80errorMsg(msg);81return 2;82}8384// read definition file and trigger commands according to it85defFile.open(fileName.c_str());86if (!defFile) {87msg << "Can not open definition file " << fileName << std::endl;88errorMsg(msg);89return 1;90}91defFile.unsetf(std::ios::dec);9293while (defFile >> lineCommand) {94repNo = 1;95if (lineCommand.compare("%") == 0) {96// a comment was read97commentRead = !commentRead;98continue;99}100if (commentRead) {101// wait until end of comment is reached102continue;103}104if (lineCommand.compare("repeat") == 0) {105defFile >> repNo;106defFile >> lineCommand;107}108if (lineCommand.compare("simstep2") == 0) {109// read parameter for command simulation step and trigger command110double time;111defFile >> time;112for (int i = 0; i < repNo; i++) {113commandSimulationStep(time);114}115} else if (lineCommand.compare("getvariable") == 0) {116// trigger command GetXXXVariable117int domID, varID;118std::string objID;119defFile >> domID >> varID >> objID;120commandGetVariable(domID, varID, objID);121} else if (lineCommand.compare("getvariable_plus") == 0) {122// trigger command GetXXXVariable with one parameter123int domID, varID;124std::string objID;125defFile >> domID >> varID >> objID;126tcpip::Storage tmp;127setValueTypeDependant(tmp, defFile, msg);128std::string msgS = msg.str();129if (msgS != "") {130errorMsg(msg);131}132commandGetVariable(domID, varID, objID, &tmp);133} else if (lineCommand.compare("subscribevariable") == 0) {134// trigger command SubscribeXXXVariable135int domID, varNo;136double beginTime, endTime;137std::string objID;138defFile >> domID >> objID >> beginTime >> endTime >> varNo;139commandSubscribeObjectVariable(domID, objID, beginTime, endTime, varNo, defFile);140} else if (lineCommand.compare("subscribecontext") == 0) {141// trigger command SubscribeXXXVariable142int domID, varNo, domain;143double range;144double beginTime, endTime;145std::string objID;146defFile >> domID >> objID >> beginTime >> endTime >> domain >> range >> varNo;147commandSubscribeContextVariable(domID, objID, beginTime, endTime, domain, range, varNo, defFile);148} else if (lineCommand.compare("setvalue") == 0) {149// trigger command SetXXXValue150int domID, varID;151std::string objID;152defFile >> domID >> varID >> objID;153commandSetValue(domID, varID, objID, defFile);154} else if (lineCommand.compare("testAPI") == 0) {155// call all native API methods156testAPI();157} else if (lineCommand.compare("setorder") == 0) {158// call setOrder159int order;160defFile >> order;161commandSetOrder(order);162} else {163msg << "Error in definition file: " << lineCommand << " is not a valid command";164errorMsg(msg);165commandClose();166closeSocket();167return 1;168}169}170defFile.close();171commandClose();172closeSocket();173return 0;174}175176177// ---------- Commands handling178void179TraCITestClient::commandSimulationStep(double time) {180try {181send_commandSimulationStep(time);182answerLog << std::endl << "-> Command sent: <SimulationStep>:" << std::endl;183tcpip::Storage inMsg;184std::string acknowledgement;185check_resultState(inMsg, libsumo::CMD_SIMSTEP, false, &acknowledgement);186answerLog << acknowledgement << std::endl;187validateSimulationStep2(inMsg);188} catch (libsumo::TraCIException& e) {189answerLog << e.what() << std::endl;190}191}192193194void195TraCITestClient::commandClose() {196try {197send_commandClose();198answerLog << std::endl << "-> Command sent: <Close>:" << std::endl;199tcpip::Storage inMsg;200std::string acknowledgement;201check_resultState(inMsg, libsumo::CMD_CLOSE, false, &acknowledgement);202answerLog << acknowledgement << std::endl;203} catch (libsumo::TraCIException& e) {204answerLog << e.what() << std::endl;205}206}207208209void210TraCITestClient::commandSetOrder(int order) {211try {212send_commandSetOrder(order);213answerLog << std::endl << "-> Command sent: <SetOrder>:" << std::endl;214tcpip::Storage inMsg;215std::string acknowledgement;216check_resultState(inMsg, libsumo::CMD_SETORDER, false, &acknowledgement);217answerLog << acknowledgement << std::endl;218} catch (libsumo::TraCIException& e) {219answerLog << e.what() << std::endl;220}221}222223224void225TraCITestClient::commandGetVariable(int domID, int varID, const std::string& objID, tcpip::Storage* addData) {226tcpip::Storage inMsg;227try {228createCommand(domID, varID, objID, addData);229mySocket->sendExact(myOutput);230answerLog << std::endl << "-> Command sent: <GetVariable>:" << std::endl231<< " domID=" << domID << " varID=" << varID232<< " objID=" << objID << std::endl;233std::string acknowledgement;234check_resultState(inMsg, domID, false, &acknowledgement);235answerLog << acknowledgement << std::endl;236} catch (libsumo::TraCIException& e) {237answerLog << e.what() << std::endl;238return;239}240check_commandGetResult(inMsg, domID, -1, false);241// report result state242try {243int variableID = inMsg.readUnsignedByte();244std::string objectID = inMsg.readString();245answerLog << " CommandID=" << (domID + 0x10) << " VariableID=" << variableID << " ObjectID=" << objectID;246int valueDataType = inMsg.readUnsignedByte();247answerLog << " valueDataType=" << valueDataType;248readAndReportTypeDependent(inMsg, valueDataType);249} catch (libsumo::TraCIException& e) {250std::stringstream msg;251msg << "Error while receiving command: " << e.what();252errorMsg(msg);253return;254}255}256257258void259TraCITestClient::commandSetValue(int domID, int varID, const std::string& objID, std::ifstream& defFile) {260std::stringstream msg;261tcpip::Storage inMsg, tmp;262setValueTypeDependant(tmp, defFile, msg);263std::string msgS = msg.str();264if (msgS != "") {265errorMsg(msg);266}267createCommand(domID, varID, objID, &tmp);268mySocket->sendExact(myOutput);269answerLog << std::endl << "-> Command sent: <SetValue>:" << std::endl270<< " domID=" << domID << " varID=" << varID271<< " objID=" << objID << std::endl;272try {273std::string acknowledgement;274check_resultState(inMsg, domID, false, &acknowledgement);275answerLog << acknowledgement << std::endl;276} catch (libsumo::TraCIException& e) {277answerLog << e.what() << std::endl;278}279}280281282void283TraCITestClient::commandSubscribeObjectVariable(int domID, const std::string& objID, double beginTime, double endTime, int varNo, std::ifstream& defFile) {284std::vector<int> vars;285for (int i = 0; i < varNo; ++i) {286int var;287defFile >> var;288// variable id289vars.push_back(var);290}291send_commandSubscribeObjectVariable(domID, objID, beginTime, endTime, vars);292answerLog << std::endl << "-> Command sent: <SubscribeVariable>:" << std::endl293<< " domID=" << domID << " objID=" << objID << " with " << varNo << " variables" << std::endl;294tcpip::Storage inMsg;295try {296std::string acknowledgement;297check_resultState(inMsg, domID, false, &acknowledgement);298answerLog << acknowledgement << std::endl;299validateSubscription(inMsg);300} catch (libsumo::TraCIException& e) {301answerLog << e.what() << std::endl;302}303}304305306void307TraCITestClient::commandSubscribeContextVariable(int domID, const std::string& objID, double beginTime, double endTime,308int domain, double range, int varNo, std::ifstream& defFile) {309std::vector<int> vars;310for (int i = 0; i < varNo; ++i) {311int var;312defFile >> var;313// variable id314vars.push_back(var);315}316send_commandSubscribeObjectContext(domID, objID, beginTime, endTime, domain, range, vars);317answerLog << std::endl << "-> Command sent: <SubscribeContext>:" << std::endl318<< " domID=" << domID << " objID=" << objID << " domain=" << domain << " range=" << range319<< " with " << varNo << " variables" << std::endl;320tcpip::Storage inMsg;321try {322std::string acknowledgement;323check_resultState(inMsg, domID, false, &acknowledgement);324answerLog << acknowledgement << std::endl;325validateSubscription(inMsg);326} catch (libsumo::TraCIException& e) {327answerLog << e.what() << std::endl;328}329}330331332// ---------- Report helper333void334TraCITestClient::writeResult() {335time_t seconds;336tm* locTime;337std::ofstream outFile(outputFileName.c_str());338if (!outFile) {339std::cerr << "Unable to write result file" << std::endl;340}341time(&seconds);342locTime = localtime(&seconds);343outFile << "TraCITestClient output file. Date: " << asctime(locTime) << std::endl;344outFile << answerLog.str();345outFile.close();346}347348349void350TraCITestClient::errorMsg(std::stringstream& msg) {351std::cerr << msg.str() << std::endl;352answerLog << "----" << std::endl << msg.str() << std::endl;353}354355356357358359360bool361TraCITestClient::validateSimulationStep2(tcpip::Storage& inMsg) {362try {363int noSubscriptions = inMsg.readInt();364for (int s = 0; s < noSubscriptions; ++s) {365if (!validateSubscription(inMsg)) {366return false;367}368}369} catch (std::invalid_argument& e) {370answerLog << "#Error while reading message:" << e.what() << std::endl;371return false;372}373return true;374}375376377bool378TraCITestClient::validateSubscription(tcpip::Storage& inMsg) {379try {380int length = inMsg.readUnsignedByte();381if (length == 0) {382length = inMsg.readInt();383}384int cmdId = inMsg.readUnsignedByte();385if (cmdId >= libsumo::RESPONSE_SUBSCRIBE_INDUCTIONLOOP_VARIABLE && cmdId <= libsumo::RESPONSE_SUBSCRIBE_GUI_VARIABLE) {386answerLog << " CommandID=" << cmdId;387answerLog << " ObjectID=" << inMsg.readString();388int varNo = inMsg.readUnsignedByte();389answerLog << " #variables=" << varNo << std::endl;390for (int i = 0; i < varNo; ++i) {391answerLog << " VariableID=" << inMsg.readUnsignedByte();392bool ok = inMsg.readUnsignedByte() == libsumo::RTYPE_OK;393answerLog << " ok=" << ok;394int valueDataType = inMsg.readUnsignedByte();395answerLog << " valueDataType=" << valueDataType;396readAndReportTypeDependent(inMsg, valueDataType);397}398} else if (cmdId >= libsumo::RESPONSE_SUBSCRIBE_INDUCTIONLOOP_CONTEXT && cmdId <= libsumo::RESPONSE_SUBSCRIBE_GUI_CONTEXT) {399answerLog << " CommandID=" << cmdId;400answerLog << " ObjectID=" << inMsg.readString();401answerLog << " Domain=" << inMsg.readUnsignedByte();402int varNo = inMsg.readUnsignedByte();403answerLog << " #variables=" << varNo << std::endl;404int objNo = inMsg.readInt();405answerLog << " #objects=" << objNo << std::endl;406for (int j = 0; j < objNo; ++j) {407answerLog << " ObjectID=" << inMsg.readString() << std::endl;408for (int i = 0; i < varNo; ++i) {409answerLog << " VariableID=" << inMsg.readUnsignedByte();410bool ok = inMsg.readUnsignedByte() == libsumo::RTYPE_OK;411answerLog << " ok=" << ok;412int valueDataType = inMsg.readUnsignedByte();413answerLog << " valueDataType=" << valueDataType;414readAndReportTypeDependent(inMsg, valueDataType);415}416}417} else {418answerLog << "#Error: received response with command id: " << cmdId << " but expected a subscription response (0xe0-0xef / 0x90-0x9f)" << std::endl;419return false;420}421} catch (std::invalid_argument& e) {422answerLog << "#Error while reading message:" << e.what() << std::endl;423return false;424}425return true;426}427428429430431432433434// ---------- Conversion helper435int436TraCITestClient::setValueTypeDependant(tcpip::Storage& into, std::ifstream& defFile, std::stringstream& msg) {437std::string dataTypeS;438defFile >> dataTypeS;439if (dataTypeS == "<airDist>") {440into.writeUnsignedByte(libsumo::REQUEST_AIRDIST);441return 1;442} else if (dataTypeS == "<drivingDist>") {443into.writeUnsignedByte(libsumo::REQUEST_DRIVINGDIST);444return 1;445} else if (dataTypeS == "<objSubscription>") {446int beginTime, endTime, numVars;447defFile >> beginTime >> endTime >> numVars;448into.writeInt(beginTime);449into.writeInt(endTime);450into.writeInt(numVars);451for (int i = 0; i < numVars; ++i) {452int var;453defFile >> var;454into.writeUnsignedByte(var);455}456return 4 + 4 + 4 + numVars;457}458int valI;459double valF;460if (dataTypeS == "<int>") {461defFile >> valI;462into.writeUnsignedByte(libsumo::TYPE_INTEGER);463into.writeInt(valI);464return 4 + 1;465} else if (dataTypeS == "<byte>") {466defFile >> valI;467into.writeUnsignedByte(libsumo::TYPE_BYTE);468into.writeByte(valI);469return 1 + 1;470} else if (dataTypeS == "<ubyte>") {471defFile >> valI;472into.writeUnsignedByte(libsumo::TYPE_UBYTE);473into.writeUnsignedByte(valI);474return 1 + 1;475} else if (dataTypeS == "<double>") {476defFile >> valF;477into.writeUnsignedByte(libsumo::TYPE_DOUBLE);478into.writeDouble(valF);479return 8 + 1;480} else if (dataTypeS == "<string>") {481std::string valueS;482defFile >> valueS;483if (valueS == "\"\"") {484valueS = "";485}486into.writeUnsignedByte(libsumo::TYPE_STRING);487into.writeString(valueS);488return 4 + 1 + (int) valueS.length();489} else if (dataTypeS == "<string*>") {490std::vector<std::string> slValue;491defFile >> valI;492int length = 1 + 4;493for (int i = 0; i < valI; ++i) {494std::string tmp;495defFile >> tmp;496slValue.push_back(tmp);497length += 4 + int(tmp.length());498}499into.writeUnsignedByte(libsumo::TYPE_STRINGLIST);500into.writeStringList(slValue);501return length;502} else if (dataTypeS == "<compound>") {503defFile >> valI;504into.writeUnsignedByte(libsumo::TYPE_COMPOUND);505into.writeInt(valI);506int length = 1 + 4;507for (int i = 0; i < valI; ++i) {508length += setValueTypeDependant(into, defFile, msg);509}510return length;511} else if (dataTypeS == "<color>") {512defFile >> valI;513into.writeUnsignedByte(libsumo::TYPE_COLOR);514into.writeUnsignedByte(valI);515for (int i = 0; i < 3; ++i) {516defFile >> valI;517into.writeUnsignedByte(valI);518}519return 1 + 4;520} else if (dataTypeS == "<position2D>") {521defFile >> valF;522into.writeUnsignedByte(libsumo::POSITION_2D);523into.writeDouble(valF);524defFile >> valF;525into.writeDouble(valF);526return 1 + 8 + 8;527} else if (dataTypeS == "<position3D>") {528defFile >> valF;529into.writeUnsignedByte(libsumo::POSITION_3D);530into.writeDouble(valF);531defFile >> valF;532into.writeDouble(valF);533defFile >> valF;534into.writeDouble(valF);535return 1 + 8 + 8 + 8;536} else if (dataTypeS == "<positionRoadmap>") {537std::string valueS;538defFile >> valueS;539into.writeUnsignedByte(libsumo::POSITION_ROADMAP);540into.writeString(valueS);541int length = 1 + 8 + (int) valueS.length();542defFile >> valF;543into.writeDouble(valF);544defFile >> valI;545into.writeUnsignedByte(valI);546return length + 4 + 1;547} else if (dataTypeS == "<shape>") {548defFile >> valI;549into.writeUnsignedByte(libsumo::TYPE_POLYGON);550into.writeUnsignedByte(valI);551int length = 1 + 1;552for (int i = 0; i < valI; ++i) {553double x, y;554defFile >> x >> y;555into.writeDouble(x);556into.writeDouble(y);557length += 8 + 8;558}559return length;560}561msg << "## Unknown data type: " << dataTypeS;562return 0;563}564565566void567TraCITestClient::readAndReportTypeDependent(tcpip::Storage& inMsg, int valueDataType) {568if (valueDataType == libsumo::TYPE_UBYTE) {569int ubyte = inMsg.readUnsignedByte();570answerLog << " Unsigned Byte Value: " << ubyte << std::endl;571} else if (valueDataType == libsumo::TYPE_BYTE) {572int byte = inMsg.readByte();573answerLog << " Byte value: " << byte << std::endl;574} else if (valueDataType == libsumo::TYPE_INTEGER) {575int integer = inMsg.readInt();576answerLog << " Int value: " << integer << std::endl;577} else if (valueDataType == libsumo::TYPE_DOUBLE) {578double doublev = inMsg.readDouble();579answerLog << " Double value: " << doublev << std::endl;580} else if (valueDataType == libsumo::TYPE_POLYGON) {581int size = inMsg.readUnsignedByte();582if (size == 0) {583size = inMsg.readInt();584}585answerLog << " PolygonValue: ";586for (int i = 0; i < size; i++) {587double x = inMsg.readDouble();588double y = inMsg.readDouble();589answerLog << "(" << x << "," << y << ") ";590}591answerLog << std::endl;592} else if (valueDataType == libsumo::POSITION_3D) {593double x = inMsg.readDouble();594double y = inMsg.readDouble();595double z = inMsg.readDouble();596answerLog << " Position3DValue:";597answerLog << " x: " << x << " y: " << y598<< " z: " << z << std::endl;599} else if (valueDataType == libsumo::POSITION_ROADMAP) {600std::string roadId = inMsg.readString();601double pos = inMsg.readDouble();602int laneId = inMsg.readUnsignedByte();603answerLog << " RoadMapPositionValue: roadId=" << roadId604<< " pos=" << pos605<< " laneId=" << laneId << std::endl;606} else if (valueDataType == libsumo::TYPE_STRING) {607std::string s = inMsg.readString();608answerLog << " string value: " << (s.empty() ? "''" : s) << std::endl;609} else if (valueDataType == libsumo::TYPE_STRINGLIST) {610std::vector<std::string> s = inMsg.readStringList();611answerLog << " string list value: [ ";612for (std::vector<std::string>::iterator i = s.begin(); i != s.end(); ++i) {613if (i != s.begin()) {614answerLog << ", ";615}616answerLog << '"' << *i << '"';617}618answerLog << " ]" << std::endl;619} else if (valueDataType == libsumo::TYPE_COMPOUND) {620int no = inMsg.readInt();621answerLog << " compound value with " << no << " members: [";622for (int i = 0; i < no; ++i) {623int currentValueDataType = inMsg.readUnsignedByte();624answerLog << " valueDataType=" << currentValueDataType;625readAndReportTypeDependent(inMsg, currentValueDataType);626}627answerLog << " ]" << std::endl;628} else if (valueDataType == libsumo::POSITION_2D) {629double xv = inMsg.readDouble();630double yv = inMsg.readDouble();631answerLog << " position value: (" << xv << "," << yv << ")" << std::endl;632} else if (valueDataType == libsumo::TYPE_COLOR) {633int r = inMsg.readUnsignedByte();634int g = inMsg.readUnsignedByte();635int b = inMsg.readUnsignedByte();636int a = inMsg.readUnsignedByte();637answerLog << " color value: (" << r << "," << g << "," << b << "," << a << ")" << std::endl;638} else {639answerLog << "#Error: unknown valueDataType!" << std::endl;640}641}642643644void645TraCITestClient::testAPI() {646answerLog << "testAPI:\n";647const auto& version = getVersion();648answerLog << " getVersion: " << version.first << ", " << version.second << "\n";649answerLog << " setOrder:\n";650setOrder(0);651// edge652answerLog << " edge:\n";653answerLog << " getIDList: " << joinToString(edge.getIDList(), " ") << "\n";654answerLog << " getIDCount: " << edge.getIDCount() << "\n";655const std::string edgeID = "e_m0";656edge.adaptTraveltime(edgeID, 42, 0, 10);657edge.setEffort(edgeID, 420, 0, 10);658answerLog << " currentTraveltime: " << edge.getTraveltime(edgeID) << "\n";659answerLog << " adaptedTravelTime: " << edge.getAdaptedTraveltime(edgeID, 0) << "\n";660answerLog << " effort: " << edge.getEffort(edgeID, 0) << "\n";661answerLog << " laneNumber: " << edge.getLaneNumber(edgeID) << "\n";662answerLog << " streetName: " << edge.getStreetName(edgeID) << "\n";663edge.setMaxSpeed(edgeID, 42);664answerLog << " maxSpeed: " << lane.getMaxSpeed(edgeID + "_0") << "\n";665666// lane667answerLog << " lane:\n";668answerLog << " getIDList: " << joinToString(lane.getIDList(), " ") << "\n";669answerLog << " getIDCount: " << lane.getIDCount() << "\n";670const std::string laneID = "e_m6_0";671answerLog << " getLinkNumber: " << lane.getLinkNumber(laneID) << "\n";672std::vector<libsumo::TraCIConnection> connections = lane.getLinks(laneID);673answerLog << " getLinks:\n";674for (int i = 0; i < (int)connections.size(); ++i) {675const libsumo::TraCIConnection& c = connections[i];676answerLog << " approachedLane=" << c.approachedLane677<< " hasPrio=" << c.hasPrio678<< " isOpen=" << c.isOpen679<< " hasFoe=" << c.hasFoe680<< " approachedInternal=" << c.approachedInternal681<< " state=" << c.state682<< " direction=" << c.direction683<< " length=" << c.length684<< "\n";685}686answerLog << " getFoes: " << joinToString(lane.getFoes("e_vu0_0", "e_m4_0"), " ") << "\n";687try {688answerLog << " getFoes (invalid): ";689answerLog << joinToString(lane.getFoes("e_vu0_0", "e_m4_1"), " ") << "\n";690} catch (libsumo::TraCIException& e) {691answerLog << " caught TraCIException(" << e.what() << ")\n";692}693answerLog << " getInternalFoes: " << joinToString(lane.getInternalFoes(":n_m4_2_0"), " ") << "\n";694try {695answerLog << " getInternalFoes (invalid): ";696answerLog << joinToString(lane.getInternalFoes("dummy"), " ") << "\n";697} catch (libsumo::TraCIException& e) {698answerLog << " caught TraCIException(" << e.what() << ")\n";699}700lane.setMaxSpeed(laneID, 42);701answerLog << " maxSpeed: " << lane.getMaxSpeed(laneID) << "\n";702// poi703answerLog << " POI:\n";704answerLog << " getIDList: " << joinToString(poi.getIDList(), " ") << "\n";705answerLog << " getIDCount: " << poi.getIDCount() << "\n";706answerLog << " getPosition: " << poi.getPosition("poi0").getString() << "\n";707answerLog << " getColor: " << poi.getColor("poi0").getString() << "\n";708709// poly710answerLog << " polygon:\n";711answerLog << " getIDList: " << joinToString(polygon.getIDList(), " ") << "\n";712answerLog << " getIDCount: " << polygon.getIDCount() << "\n";713libsumo::TraCIPositionVector shape = polygon.getShape("poly0");714polygon.setLineWidth("poly0", 0.6);715answerLog << " getLineWidth: " << polygon.getLineWidth("poly0") << "\n";716answerLog << " getShape: " << shape.getString() << "\n";717answerLog << " getColor: " << polygon.getColor("poly0").getString() << "\n";718shape.value[0].x = 42;719polygon.setShape("poly0", shape);720answerLog << " getShape after modification: " << polygon.getShape("poly0").getString() << "\n";721722// junction723answerLog << " junction:\n";724answerLog << " getIDList: " << joinToString(junction.getIDList(), " ") << "\n";725answerLog << " getIDCount: " << junction.getIDCount() << "\n";726answerLog << " getShape: " << junction.getShape("n_m4").getString() << "\n";727728// route729answerLog << " route:\n";730answerLog << " add:\n";731std::vector<std::string> edges;732edges.push_back("e_u1");733edges.push_back("e_u0");734route.add("e_u1", edges);735edges.clear();736edges.push_back("e_m4");737route.add("e_m4", edges);738answerLog << " getIDList: " << joinToString(route.getIDList(), " ") << "\n";739740// vehicletype741answerLog << " vehicleType:\n";742answerLog << " getIDList: " << joinToString(vehicletype.getIDList(), " ") << "\n";743vehicletype.setEmergencyDecel("t1", 9.9);744answerLog << " getEmergencyDecel: " << vehicletype.getEmergencyDecel("t1") << "\n";745vehicletype.setApparentDecel("t1", 99.9);746answerLog << " getApparentDecel: " << vehicletype.getApparentDecel("t1") << "\n";747vehicletype.setWidth("t1", 1.9);748answerLog << " getWidth: " << vehicletype.getWidth("t1") << "\n";749vehicletype.setHeight("t1", 1.8);750answerLog << " getHeight: " << vehicletype.getHeight("t1") << "\n";751vehicletype.setMinGapLat("t1", 1.5);752answerLog << " setMinGapLat: " << vehicletype.getMinGapLat("t1") << "\n";753vehicletype.setMaxSpeedLat("t1", 1.2);754answerLog << " setMaxSpeedLat: " << vehicletype.getMaxSpeedLat("t1") << "\n";755vehicletype.setLateralAlignment("t1", "compact");756answerLog << " getLateralAlignment: " << vehicletype.getLateralAlignment("t1") << "\n";757answerLog << " getPersonCapacity: " << vehicletype.getPersonCapacity("t1") << "\n";758answerLog << " copy type 't1' to 't1_copy' and set accel to 100.\n";759vehicletype.copy("t1", "t1_copy");760answerLog << " getIDList: " << joinToString(vehicletype.getIDList(), " ") << "\n";761vehicletype.setAccel("t1_copy", 100.);762answerLog << " getAccel('t1'): " << vehicletype.getAccel("t1") << "\n";763answerLog << " getAccel('t1_copy'): " << vehicletype.getAccel("t1_copy") << "\n";764765// vehicle766answerLog << " vehicle:\n";767vehicle.setLine("0", "S42");768std::vector<std::string> via;769via.push_back("e_shape1");770vehicle.setVia("0", via);771vehicle.setType("0", "t1_copy");772answerLog << " getTypeID: " << vehicle.getTypeID("0") << "\n";773answerLog << " getRoadID: " << vehicle.getRoadID("0") << "\n";774answerLog << " getRouteID: " << vehicle.getRouteID("0") << "\n";775answerLog << " getLaneID: " << vehicle.getLaneID("0") << "\n";776answerLog << " getLanePosition: " << vehicle.getLanePosition("0") << "\n";777answerLog << " getLateralLanePosition: " << vehicle.getLateralLanePosition("0") << "\n";778answerLog << " getSpeed: " << vehicle.getSpeed("0") << "\n";779answerLog << " getLateralSpeed: " << vehicle.getLateralSpeed("0") << "\n";780answerLog << " getAcceleration: " << vehicle.getAcceleration("0") << "\n";781782answerLog << " getFollowSpeed: " << vehicle.getFollowSpeed("0", 10, 20, 9, 4.5) << "\n";783answerLog << " getSecureGap: " << vehicle.getSecureGap("0", 10, 9, 4.5) << "\n";784answerLog << " getStopSpeed: " << vehicle.getStopSpeed("0", 10, 20) << "\n";785786answerLog << " getSpeedMode: " << vehicle.getSpeedMode("0") << "\n";787answerLog << " getSlope: " << vehicle.getSlope("0") << "\n";788answerLog << " getLine: " << vehicle.getLine("0") << "\n";789answerLog << " getVia: " << joinToString(vehicle.getVia("0"), ",") << "\n";790answerLog << " getPersonCapacity: " << vehicle.getPersonCapacity("0") << "\n";791vehicle.setMaxSpeed("0", 30);792answerLog << " getMaxSpeed: " << vehicle.getMaxSpeed("0") << "\n";793answerLog << " isRouteValid: " << vehicle.isRouteValid("0") << "\n";794answerLog << " getStopState: " << vehicle.getStopState("0") << "\n";795answerLog << " getStopDelay: " << vehicle.getStopDelay("0") << "\n";796vehicle.setParameter("0", "meaningOfLife", "42");797answerLog << " param: " << vehicle.getParameter("0", "meaningOfLife") << "\n";798std::pair<std::string, std::string> paramTuple = vehicle.getParameterWithKey("0", "meaningOfLife");799answerLog << " parameterWithKey: (" << paramTuple.first << ", " << paramTuple.second << ")\n";800libsumo::TraCIColor col1;801col1.r = 255;802col1.g = 255;803col1.b = 0;804col1.a = 128;805vehicle.setColor("0", col1);806libsumo::TraCIColor col2 = vehicle.getColor("0");807answerLog << " getColor: r=" << (int)col2.r << " g=" << (int)col2.g << " b=" << (int)col2.b << " a=" << (int)col2.a << "\n";808int signals = vehicle.getSignals("0");809answerLog << " getSignals: " << signals << "\n";810vehicle.setSignals("0", signals ^ TraCIAPI::VehicleScope::SIGNAL_FOGLIGHT);811vehicle.setRoutingMode("0", libsumo::ROUTING_MODE_AGGREGATED);812answerLog << " getRoutingMode: " << vehicle.getRoutingMode("0") << "\n";813answerLog << " getNextTLS:\n";814std::vector<libsumo::TraCINextTLSData> result = vehicle.getNextTLS("0");815for (int i = 0; i < (int)result.size(); ++i) {816const libsumo::TraCINextTLSData& d = result[i];817answerLog << " tls=" << d.id << " tlIndex=" << d.tlIndex << " dist=" << d.dist << " state=" << d.state << "\n";818}819answerLog << " moveToXY, simStep:\n";820vehicle.moveToXY("0", "dummy", 0, 2231.61, 498.29, 90, 1);821simulationStep();822// simulationStep(1);823answerLog << " getRoadID: " << vehicle.getRoadID("0") << "\n";824answerLog << " getLaneID: " << vehicle.getLaneID("0") << "\n";825vehicle.changeTarget("0", "e_o0");826std::vector<std::string> edges2 = vehicle.getRoute("0");827answerLog << " edges: " << joinToString(edges2, " ") << "\n";828vehicle.setRouteID("0", "e_m4");829answerLog << " edges: " << joinToString(vehicle.getRoute("0"), " ") << "\n";830vehicle.setRoute("0", edges2);831answerLog << " edges: " << joinToString(vehicle.getRoute("0"), " ") << "\n";832answerLog << " add:\n";833vehicle.add("1", "e_u1");834vehicle.add("2", "e_u1");835vehicle.moveTo("2", "e_u0_0", 5);836simulationStep();837answerLog << " getIDList: " << joinToString(vehicle.getIDList(), " ") << "\n";838answerLog << " getWaitingTime: " << vehicle.getWaitingTime("0") << "\n";839answerLog << " getAccumulatedWaitingTime: " << vehicle.getAccumulatedWaitingTime("0") << "\n";840vehicle.setShapeClass("0", "bicycle");841answerLog << " getShapeClass: " << vehicle.getShapeClass("0") << "\n";842std::pair<std::string, double> leader = vehicle.getLeader("1", 1000);843answerLog << " getLeader: " << leader.first << ", " << leader.second << "\n";844std::pair<std::string, double> follower = vehicle.getFollower("1", 1000);845answerLog << " getFollower: " << follower.first << ", " << follower.second << "\n";846std::pair<int, int> state = vehicle.getLaneChangeState("1", 1);847answerLog << " getLaneChangeState (left): " << state.first << ", " << state.second << "\n";848state = vehicle.getLaneChangeState("1", -1);849answerLog << " getLaneChangeState (right): " << state.first << ", " << state.second << "\n";850vehicle.rerouteTraveltime("0");851vehicle.setSpeedFactor("0", 0.8);852vehicle.setSpeedMode("0", 0);853answerLog << " getSpeedMode after change: " << vehicle.getSpeedMode("0") << "\n";854vehicle.setLaneChangeMode("0", 0);855answerLog << " getLaneChangeMode after change: " << vehicle.getLaneChangeMode("0") << "\n";856answerLog << " remove:\n";857vehicle.remove("0");858answerLog << " getIDCount: " << vehicle.getIDCount() << "\n";859860// inductionLoop861answerLog << " inductionloop:\n";862answerLog << " getIDList: " << joinToString(inductionloop.getIDList(), " ") << "\n";863answerLog << " getVehicleData:\n";864std::vector<libsumo::TraCIVehicleData> result2 = inductionloop.getVehicleData("det1");865for (int i = 0; i < (int)result2.size(); ++i) {866const libsumo::TraCIVehicleData& vd = result2[i];867answerLog << " veh=" << vd.id << " length=" << vd.length << " entered=" << vd.entryTime << " left=" << vd.leaveTime << " type=" << vd.typeID << "\n";868}869870// multi-entry/-exit detector871// answerLog << " multi-entry/-exit detector:\n";872// answerLog << " getLastStepVehicleIDs: " << joinToString(multientryexit.getLastStepVehicleIDs("det2"), " ") << "\n";873// answerLog << " getEntryLanes: " << joinToString(multientryexit.getEntryLanes("det2"), " ") << "\n";874// answerLog << " getExitLanes: " << joinToString(multientryexit.getExitLanes("det2"), " ") << "\n";875// answerLog << " getEntryPositions: " << joinToString(multientryexit.getEntryPositions("det2"), " ") << "\n";876// answerLog << " getExitPositions: " << joinToString(multientryexit.getExitPositions("det2"), " ") << "\n";877878// simulation879answerLog << " simulation:\n";880answerLog << " getOption: " << simulation.getOption("net-file") << "\n";881answerLog << " convert2D: " << simulation.convert2D("e_m5", 0).getString() << "\n";882answerLog << " convert2DGeo: " << simulation.convert2D("e_m5", 0, 0, true).getString() << "\n";883answerLog << " convert3D: " << simulation.convert3D("e_m5", 0).getString() << "\n";884answerLog << " convert3DGeo: " << simulation.convert3D("e_m5", 0, 0, true).getString() << "\n";885answerLog << " convertRoad: " << simulation.convertRoad(2500, 500).getString() << "\n";886answerLog << " convertRoadBus: " << simulation.convertRoad(2500, 500, false, "bus").getString() << "\n";887answerLog << " convertGeo: " << simulation.convertGeo(2500, 500).getString() << "\n";888answerLog << " convertCartesian: " << simulation.convertGeo(12, 52, true).getString() << "\n";889answerLog << " getDistance2D_air: " << simulation.getDistance2D(2500, 500, 2000, 500, false, false) << "\n";890answerLog << " getDistance2D_driving: " << simulation.getDistance2D(2500, 500, 2000, 500, false, true) << "\n";891answerLog << " getDistanceRoad_air: " << simulation.getDistanceRoad("e_m5", 0, "e_m4", 0, false) << "\n";892answerLog << " getDistanceRoad_driving: " << simulation.getDistanceRoad("e_m5", 0, "e_m4", 0, true) << "\n";893answerLog << " getCurrentTime: " << simulation.getCurrentTime() << "\n";894answerLog << " getDeltaT: " << simulation.getDeltaT() << "\n";895answerLog << " parkingArea param: " << simulation.getParameter("park1", "parkingArea.capacity") << "\n";896answerLog << " busStopWaiting: " << simulation.getBusStopWaiting("bs1") << "\n";897answerLog << " busStopWaitingIDs: " << joinToString(simulation.getBusStopWaitingIDList("bs1"), " ") << "\n";898simulation.writeMessage("custom message test");899answerLog << " subscribe to road and pos of vehicle '1':\n";900answerLog << " findRoute: " << joinToString(simulation.findRoute("e_m5", "e_m4").edges, " ") << "\n";901std::vector<int> vars;902vars.push_back(libsumo::VAR_ROAD_ID);903vars.push_back(libsumo::VAR_LANEPOSITION);904vehicle.subscribe("1", vars, 0, 100);905simulationStep();906answerLog << " subscription results:\n";907libsumo::TraCIResults result3 = vehicle.getSubscriptionResults("1");908answerLog << " roadID=" << result3[libsumo::VAR_ROAD_ID]->getString() << " pos=" << result3[libsumo::VAR_LANEPOSITION]->getString() << "\n";909910answerLog << " subscribe to vehicles around edge 'e_u1':\n";911std::vector<int> vars2;912vars2.push_back(libsumo::VAR_LANEPOSITION);913edge.subscribeContext("e_u1", libsumo::CMD_GET_VEHICLE_VARIABLE, 100, vars2, 0, 100);914simulationStep();915answerLog << " context subscription results:\n";916libsumo::SubscriptionResults result4 = edge.getContextSubscriptionResults("e_u1");917for (libsumo::SubscriptionResults::iterator it = result4.begin(); it != result4.end(); ++it) {918answerLog << " vehicle=" << it->first << " pos=" << it->second[libsumo::VAR_LANEPOSITION]->getString() << "\n";919}920921answerLog << " subscribe to vehicles around vehicle '1':\n";922std::vector<int> vars3;923vars3.push_back(libsumo::VAR_SPEED);924vehicle.subscribeContext("1", libsumo::CMD_GET_VEHICLE_VARIABLE, 1000, vars3, 0, 100);925vehicle.addSubscriptionFilterLanes(std::vector<int>({0, 1, 2}));926vehicle.addSubscriptionFilterNoOpposite();927vehicle.addSubscriptionFilterDownstreamDistance(1000);928vehicle.addSubscriptionFilterUpstreamDistance(1000);929vehicle.addSubscriptionFilterCFManeuver();930vehicle.addSubscriptionFilterLeadFollow(std::vector<int>({0, 1, 2}));931vehicle.addSubscriptionFilterTurn();932vehicle.addSubscriptionFilterVClass(std::vector<std::string>({"passenger"}));933vehicle.addSubscriptionFilterVType(std::vector<std::string>({"DEFAULT_VEHTYPE"}));934vehicle.addSubscriptionFilterLCManeuver(1);935936vehicle.subscribeContext("3", libsumo::CMD_GET_VEHICLE_VARIABLE, 200, vars3, 0, 100);937vehicle.addSubscriptionFilterFieldOfVision(90);938939vehicle.subscribeContext("4", libsumo::CMD_GET_VEHICLE_VARIABLE, 200, vars3, 0, 100);940vehicle.addSubscriptionFilterLateralDistance(50);941//942943simulationStep();944answerLog << " context subscription results:\n";945libsumo::SubscriptionResults result5 = vehicle.getContextSubscriptionResults("1");946for (auto item : result5) {947answerLog << " vehicle=" << item.first << "\n";948}949950// person951answerLog << " person:\n";952person.setWidth("p0", 1);953person.setMinGap("p0", 2);954person.setLength("p0", 3);955person.setHeight("p0", 4);956person.setColor("p0", col1);957person.setType("p0", "stilts");958answerLog << " getIDList: " << joinToString(person.getIDList(), " ") << "\n";959answerLog << " getRoadID: " << person.getRoadID("p0") << "\n";960answerLog << " getLaneID: " << person.getLaneID("p0") << "\n";961answerLog << " getTypeID: " << person.getTypeID("p0") << "\n";962answerLog << " getWaitingTime: " << person.getWaitingTime("p0") << "\n";963answerLog << " getNextEdge: " << person.getNextEdge("p0") << "\n";964answerLog << " getStage: " << person.getStage("p0").description << "\n";965answerLog << " getRemainingStages: " << person.getRemainingStages("p0") << "\n";966answerLog << " getVehicle: " << person.getVehicle("p0") << "\n";967answerLog << " getEdges: " << joinToString(person.getEdges("p0"), " ") << "\n";968answerLog << " getPosition: " << person.getPosition("p0").getString() << "\n";969answerLog << " getPosition3D: " << person.getPosition3D("p0").getString() << "\n";970answerLog << " getAngle: " << person.getAngle("p0") << "\n";971answerLog << " getSlope: " << person.getSlope("p0") << "\n";972answerLog << " getLanePosition: " << person.getLanePosition("p0") << "\n";973answerLog << " getLength: " << person.getLength("p0") << "\n";974answerLog << " getColor: " << person.getColor("p0").getString() << "\n";975person.setParameter("p0", "foo", "bar");976answerLog << " param: " << person.getParameter("p0", "foo") << "\n";977person.setSpeed("p0", 3);978simulationStep();979answerLog << " getSpeed: " << person.getSpeed("p0") << "\n";980person.add("p1", "e_u1", 10);981std::vector<std::string> walkEdges;982walkEdges.push_back("e_u1");983walkEdges.push_back("e_shape1");984person.appendWalkingStage("p1", walkEdges, -20);985person.appendWaitingStage("p1", 5);986person.appendDrivingStage("p1", "e_vu2", "BusLine42");987libsumo::TraCIStage stage(libsumo::STAGE_WALKING);988stage.edges.push_back("e_vu2");989stage.edges.push_back("e_vo2");990stage.arrivalPos = -10;991person.appendStage("p1", stage);992simulationStep();993// expect 5 stages due to the initial waiting-for-departure stage994answerLog << " getRemainingStages: " << person.getRemainingStages("p1") << "\n";995person.removeStage("p1", 3);996answerLog << " getRemainingStages: " << person.getRemainingStages("p1") << "\n";997person.removeStages("p1");998answerLog << " getRemainingStages: " << person.getRemainingStages("p1") << "\n";999answerLog << " getStage: " << person.getStage("p1").description << "\n";1000walkEdges.push_back("e_m5");1001person.appendWalkingStage("p1", walkEdges, -20);1002simulationStep();1003answerLog << " getEdges before rerouting: " << joinToString(person.getEdges("p1"), " ") << "\n";1004person.rerouteTraveltime("p1");1005answerLog << " getEdges after rerouting: " << joinToString(person.getEdges("p1"), " ") << "\n";10061007// trafficlights1008answerLog << " trafficlights:\n";1009trafficlights.setPhase("n_m4", 0);1010trafficlights.setPhaseName("n_m4", "nameSetByTraCI");1011answerLog << " getIDList: " << joinToString(trafficlights.getIDList(), " ") << "\n";1012answerLog << " getIDCount: " << trafficlights.getIDCount() << "\n";1013answerLog << " state: " << trafficlights.getRedYellowGreenState("n_m4") << "\n";1014answerLog << " program: " << trafficlights.getProgram("n_m4") << "\n";1015answerLog << " phase: " << trafficlights.getPhase("n_m4") << "\n";1016answerLog << " phaseName: " << trafficlights.getPhaseName("n_m4") << "\n";1017answerLog << " phaseDuration: " << trafficlights.getPhaseDuration("n_m4") << "\n";1018answerLog << " nextSwitch: " << trafficlights.getNextSwitch("n_m4") << "\n";1019answerLog << " controlledLanes: " << joinToString(trafficlights.getControlledLanes("n_m4"), " ") << "\n";1020std::vector<std::vector<libsumo::TraCILink> > links = trafficlights.getControlledLinks("n_m4");1021answerLog << " controlledLinks:\n";1022for (int i = 0; i < (int)links.size(); ++i) {1023for (int j = 0; j < (int)links[i].size(); ++j) {1024answerLog << " index=" << i << " link=" << j << " fromLane=" << links[i][j].fromLane << " viaLane=" << links[i][j].viaLane << " toLane=" << links[i][j].toLane << "\n";1025}1026}1027libsumo::TraCILogic logic("custom", 0, 3);1028logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(5, "rrrrrrr", 5, 5));1029logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(10, "ggggggg", 5, 15));1030logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(3, "GGGGGGG", 3, 3));1031logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(3, "yyyyyyy", 3, 3));1032trafficlights.setProgramLogic("n_m4", logic);10331034std::vector<libsumo::TraCILogic> logics = trafficlights.getAllProgramLogics("n_m4");1035answerLog << " completeDefinition:\n";1036for (int i = 0; i < (int)logics.size(); ++i) {1037answerLog << " subID=" << logics[i].programID << " type=" << logics[i].type << " phase=" << logics[i].currentPhaseIndex << "\n";1038answerLog << " params=" << joinToString(logics[i].subParameter) << "\n";1039for (int j = 0; j < (int)logics[i].phases.size(); ++j) {1040answerLog << " phase=" << logics[i].phases[j]->state1041<< " dur=" << logics[i].phases[j]->duration1042<< " minDur=" << logics[i].phases[j]->minDur1043<< " maxDur=" << logics[i].phases[j]->maxDur1044<< "\n";1045}1046}1047simulationStep();1048answerLog << " state=" << trafficlights.getRedYellowGreenState("n_m4") << "\n";1049trafficlights.setRedYellowGreenState("n_m4", "gGyruoO");1050answerLog << " stateSet=" << trafficlights.getRedYellowGreenState("n_m4") << "\n";1051answerLog << " program: " << trafficlights.getProgram("n_m4") << "\n";10521053answerLog << " gui:\n";1054try {1055answerLog << " setScheme: \n";1056gui.setSchema("View #0", "real world");1057answerLog << " getScheme: " << gui.getSchema("View #0") << "\n";1058gui.setZoom("View #0", 50);1059answerLog << " getZoom: " << gui.getZoom() << "\n";1060answerLog << " take screenshot: \n";1061gui.screenshot("View #0", "image.png", 500, 500);1062} catch (libsumo::TraCIException&) {1063answerLog << " no support for gui commands\n";1064}10651066answerLog << " load:\n";1067std::vector<std::string> args;1068args.push_back("-n");1069args.push_back("net.net.xml");1070args.push_back("-r");1071args.push_back("input_routes.rou.xml");1072args.push_back("-a");1073args.push_back("input_additional.add.xml");1074args.push_back("--no-step-log");1075load(args);1076simulationStep();1077answerLog << " getCurrentTime: " << simulation.getCurrentTime() << "\n";1078vehicle.subscribe("0", vars, 0, 100);1079edge.subscribeContext("e_u1", libsumo::CMD_GET_VEHICLE_VARIABLE, 100, vars2, 0, 100);1080}108110821083