Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/traci_testclient/TraCITestClient.cpp
169665 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2008-2025 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 TraCITestClient.cpp
15
/// @author Friedemann Wesner
16
/// @author Daniel Krajzewicz
17
/// @author Laura Bieker
18
/// @author Axel Wegener
19
/// @author Michael Behrisch
20
/// @author Jakob Erdmann
21
/// @date 2008/04/07
22
///
23
// A test execution class
24
/****************************************************************************/
25
/* =========================================================================
26
* included modules
27
* ======================================================================= */
28
#ifdef _MSC_VER
29
#define _CRT_SECURE_NO_WARNINGS
30
// Avoid some noisy warnings with Visual Studio
31
#pragma warning(disable:4820 4514 5045 4710)
32
#endif
33
#include <vector>
34
#include <iostream>
35
#include <iomanip>
36
#include <fstream>
37
#include <sstream>
38
#include <ctime>
39
#include <cstdlib>
40
41
#define BUILD_TCPIP
42
#include <foreign/tcpip/storage.h>
43
#include <foreign/tcpip/socket.h>
44
45
#include <libsumo/TraCIConstants.h>
46
#include <libsumo/TraCIDefs.h>
47
#include "TraCITestClient.h"
48
49
50
// ===========================================================================
51
// method definitions
52
// ===========================================================================
53
TraCITestClient::TraCITestClient(std::string outputFileName)
54
: outputFileName(outputFileName), answerLog("") {
55
answerLog.setf(std::ios::fixed, std::ios::floatfield); // use decimal format
56
answerLog.setf(std::ios::showpoint); // print decimal point
57
answerLog << std::setprecision(2);
58
}
59
60
61
TraCITestClient::~TraCITestClient() {
62
writeResult();
63
}
64
65
66
int
67
TraCITestClient::run(std::string fileName, int port, std::string host) {
68
std::ifstream defFile;
69
std::string fileContentStr;
70
std::stringstream fileContent;
71
std::string lineCommand;
72
std::stringstream msg;
73
int repNo = 1;
74
bool commentRead = false;
75
76
// try to connect
77
try {
78
TraCIAPI::connect(host, port);
79
} catch (tcpip::SocketException& e) {
80
msg << "#Error while connecting: " << e.what();
81
errorMsg(msg);
82
return 2;
83
}
84
85
// read definition file and trigger commands according to it
86
defFile.open(fileName.c_str());
87
if (!defFile) {
88
msg << "Can not open definition file " << fileName << std::endl;
89
errorMsg(msg);
90
return 1;
91
}
92
defFile.unsetf(std::ios::dec);
93
94
while (defFile >> lineCommand) {
95
repNo = 1;
96
if (lineCommand.compare("%") == 0) {
97
// a comment was read
98
commentRead = !commentRead;
99
continue;
100
}
101
if (commentRead) {
102
// wait until end of comment is reached
103
continue;
104
}
105
if (lineCommand.compare("repeat") == 0) {
106
defFile >> repNo;
107
defFile >> lineCommand;
108
}
109
if (lineCommand.compare("simstep2") == 0) {
110
// read parameter for command simulation step and trigger command
111
double time;
112
defFile >> time;
113
for (int i = 0; i < repNo; i++) {
114
commandSimulationStep(time);
115
}
116
} else if (lineCommand.compare("getvariable") == 0) {
117
// trigger command GetXXXVariable
118
int domID, varID;
119
std::string objID;
120
defFile >> domID >> varID >> objID;
121
commandGetVariable(domID, varID, objID);
122
} else if (lineCommand.compare("getvariable_plus") == 0) {
123
// trigger command GetXXXVariable with one parameter
124
int domID, varID;
125
std::string objID;
126
defFile >> domID >> varID >> objID;
127
tcpip::Storage tmp;
128
setValueTypeDependant(tmp, defFile, msg);
129
std::string msgS = msg.str();
130
if (msgS != "") {
131
errorMsg(msg);
132
}
133
commandGetVariable(domID, varID, objID, &tmp);
134
} else if (lineCommand.compare("subscribevariable") == 0) {
135
// trigger command SubscribeXXXVariable
136
int domID, varNo;
137
double beginTime, endTime;
138
std::string objID;
139
defFile >> domID >> objID >> beginTime >> endTime >> varNo;
140
commandSubscribeObjectVariable(domID, objID, beginTime, endTime, varNo, defFile);
141
} else if (lineCommand.compare("subscribecontext") == 0) {
142
// trigger command SubscribeXXXVariable
143
int domID, varNo, domain;
144
double range;
145
double beginTime, endTime;
146
std::string objID;
147
defFile >> domID >> objID >> beginTime >> endTime >> domain >> range >> varNo;
148
commandSubscribeContextVariable(domID, objID, beginTime, endTime, domain, range, varNo, defFile);
149
} else if (lineCommand.compare("setvalue") == 0) {
150
// trigger command SetXXXValue
151
int domID, varID;
152
std::string objID;
153
defFile >> domID >> varID >> objID;
154
commandSetValue(domID, varID, objID, defFile);
155
} else if (lineCommand.compare("testAPI") == 0) {
156
// call all native API methods
157
testAPI();
158
} else if (lineCommand.compare("setorder") == 0) {
159
// call setOrder
160
int order;
161
defFile >> order;
162
commandSetOrder(order);
163
} else {
164
msg << "Error in definition file: " << lineCommand << " is not a valid command";
165
errorMsg(msg);
166
commandClose();
167
closeSocket();
168
return 1;
169
}
170
}
171
defFile.close();
172
commandClose();
173
closeSocket();
174
return 0;
175
}
176
177
178
// ---------- Commands handling
179
void
180
TraCITestClient::commandSimulationStep(double time) {
181
try {
182
send_commandSimulationStep(time);
183
answerLog << std::endl << "-> Command sent: <SimulationStep>:" << std::endl;
184
tcpip::Storage inMsg;
185
std::string acknowledgement;
186
check_resultState(inMsg, libsumo::CMD_SIMSTEP, false, &acknowledgement);
187
answerLog << acknowledgement << std::endl;
188
validateSimulationStep2(inMsg);
189
} catch (libsumo::TraCIException& e) {
190
answerLog << e.what() << std::endl;
191
}
192
}
193
194
195
void
196
TraCITestClient::commandClose() {
197
try {
198
send_commandClose();
199
answerLog << std::endl << "-> Command sent: <Close>:" << std::endl;
200
tcpip::Storage inMsg;
201
std::string acknowledgement;
202
check_resultState(inMsg, libsumo::CMD_CLOSE, false, &acknowledgement);
203
answerLog << acknowledgement << std::endl;
204
} catch (libsumo::TraCIException& e) {
205
answerLog << e.what() << std::endl;
206
}
207
}
208
209
210
void
211
TraCITestClient::commandSetOrder(int order) {
212
try {
213
send_commandSetOrder(order);
214
answerLog << std::endl << "-> Command sent: <SetOrder>:" << std::endl;
215
tcpip::Storage inMsg;
216
std::string acknowledgement;
217
check_resultState(inMsg, libsumo::CMD_SETORDER, false, &acknowledgement);
218
answerLog << acknowledgement << std::endl;
219
} catch (libsumo::TraCIException& e) {
220
answerLog << e.what() << std::endl;
221
}
222
}
223
224
225
void
226
TraCITestClient::commandGetVariable(int domID, int varID, const std::string& objID, tcpip::Storage* addData) {
227
tcpip::Storage inMsg;
228
try {
229
createCommand(domID, varID, objID, addData);
230
mySocket->sendExact(myOutput);
231
answerLog << std::endl << "-> Command sent: <GetVariable>:" << std::endl
232
<< " domID=" << domID << " varID=" << varID
233
<< " objID=" << objID << std::endl;
234
std::string acknowledgement;
235
check_resultState(inMsg, domID, false, &acknowledgement);
236
answerLog << acknowledgement << std::endl;
237
} catch (libsumo::TraCIException& e) {
238
answerLog << e.what() << std::endl;
239
return;
240
}
241
check_commandGetResult(inMsg, domID, -1, false);
242
// report result state
243
try {
244
int variableID = inMsg.readUnsignedByte();
245
std::string objectID = inMsg.readString();
246
answerLog << " CommandID=" << (domID + 0x10) << " VariableID=" << variableID << " ObjectID=" << objectID;
247
int valueDataType = inMsg.readUnsignedByte();
248
answerLog << " valueDataType=" << valueDataType;
249
readAndReportTypeDependent(inMsg, valueDataType);
250
} catch (libsumo::TraCIException& e) {
251
std::stringstream msg;
252
msg << "Error while receiving command: " << e.what();
253
errorMsg(msg);
254
return;
255
}
256
}
257
258
259
void
260
TraCITestClient::commandSetValue(int domID, int varID, const std::string& objID, std::ifstream& defFile) {
261
std::stringstream msg;
262
tcpip::Storage inMsg, tmp;
263
setValueTypeDependant(tmp, defFile, msg);
264
std::string msgS = msg.str();
265
if (msgS != "") {
266
errorMsg(msg);
267
}
268
createCommand(domID, varID, objID, &tmp);
269
mySocket->sendExact(myOutput);
270
answerLog << std::endl << "-> Command sent: <SetValue>:" << std::endl
271
<< " domID=" << domID << " varID=" << varID
272
<< " objID=" << objID << std::endl;
273
try {
274
std::string acknowledgement;
275
check_resultState(inMsg, domID, false, &acknowledgement);
276
answerLog << acknowledgement << std::endl;
277
} catch (libsumo::TraCIException& e) {
278
answerLog << e.what() << std::endl;
279
}
280
}
281
282
283
void
284
TraCITestClient::commandSubscribeObjectVariable(int domID, const std::string& objID, double beginTime, double endTime, int varNo, std::ifstream& defFile) {
285
std::vector<int> vars;
286
for (int i = 0; i < varNo; ++i) {
287
int var;
288
defFile >> var;
289
// variable id
290
vars.push_back(var);
291
}
292
send_commandSubscribeObjectVariable(domID, objID, beginTime, endTime, vars);
293
answerLog << std::endl << "-> Command sent: <SubscribeVariable>:" << std::endl
294
<< " domID=" << domID << " objID=" << objID << " with " << varNo << " variables" << std::endl;
295
tcpip::Storage inMsg;
296
try {
297
std::string acknowledgement;
298
check_resultState(inMsg, domID, false, &acknowledgement);
299
answerLog << acknowledgement << std::endl;
300
validateSubscription(inMsg);
301
} catch (libsumo::TraCIException& e) {
302
answerLog << e.what() << std::endl;
303
}
304
}
305
306
307
void
308
TraCITestClient::commandSubscribeContextVariable(int domID, const std::string& objID, double beginTime, double endTime,
309
int domain, double range, int varNo, std::ifstream& defFile) {
310
std::vector<int> vars;
311
for (int i = 0; i < varNo; ++i) {
312
int var;
313
defFile >> var;
314
// variable id
315
vars.push_back(var);
316
}
317
send_commandSubscribeObjectContext(domID, objID, beginTime, endTime, domain, range, vars);
318
answerLog << std::endl << "-> Command sent: <SubscribeContext>:" << std::endl
319
<< " domID=" << domID << " objID=" << objID << " domain=" << domain << " range=" << range
320
<< " with " << varNo << " variables" << std::endl;
321
tcpip::Storage inMsg;
322
try {
323
std::string acknowledgement;
324
check_resultState(inMsg, domID, false, &acknowledgement);
325
answerLog << acknowledgement << std::endl;
326
validateSubscription(inMsg);
327
} catch (libsumo::TraCIException& e) {
328
answerLog << e.what() << std::endl;
329
}
330
}
331
332
333
// ---------- Report helper
334
void
335
TraCITestClient::writeResult() {
336
time_t seconds;
337
tm* locTime;
338
std::ofstream outFile(outputFileName.c_str());
339
if (!outFile) {
340
std::cerr << "Unable to write result file" << std::endl;
341
}
342
time(&seconds);
343
locTime = localtime(&seconds);
344
outFile << "TraCITestClient output file. Date: " << asctime(locTime) << std::endl;
345
outFile << answerLog.str();
346
outFile.close();
347
}
348
349
350
void
351
TraCITestClient::errorMsg(std::stringstream& msg) {
352
std::cerr << msg.str() << std::endl;
353
answerLog << "----" << std::endl << msg.str() << std::endl;
354
}
355
356
357
358
359
360
361
bool
362
TraCITestClient::validateSimulationStep2(tcpip::Storage& inMsg) {
363
try {
364
int noSubscriptions = inMsg.readInt();
365
for (int s = 0; s < noSubscriptions; ++s) {
366
if (!validateSubscription(inMsg)) {
367
return false;
368
}
369
}
370
} catch (std::invalid_argument& e) {
371
answerLog << "#Error while reading message:" << e.what() << std::endl;
372
return false;
373
}
374
return true;
375
}
376
377
378
bool
379
TraCITestClient::validateSubscription(tcpip::Storage& inMsg) {
380
try {
381
int length = inMsg.readUnsignedByte();
382
if (length == 0) {
383
length = inMsg.readInt();
384
}
385
int cmdId = inMsg.readUnsignedByte();
386
if (cmdId >= libsumo::RESPONSE_SUBSCRIBE_INDUCTIONLOOP_VARIABLE && cmdId <= libsumo::RESPONSE_SUBSCRIBE_GUI_VARIABLE) {
387
answerLog << " CommandID=" << cmdId;
388
answerLog << " ObjectID=" << inMsg.readString();
389
int varNo = inMsg.readUnsignedByte();
390
answerLog << " #variables=" << varNo << std::endl;
391
for (int i = 0; i < varNo; ++i) {
392
answerLog << " VariableID=" << inMsg.readUnsignedByte();
393
bool ok = inMsg.readUnsignedByte() == libsumo::RTYPE_OK;
394
answerLog << " ok=" << ok;
395
int valueDataType = inMsg.readUnsignedByte();
396
answerLog << " valueDataType=" << valueDataType;
397
readAndReportTypeDependent(inMsg, valueDataType);
398
}
399
} else if (cmdId >= libsumo::RESPONSE_SUBSCRIBE_INDUCTIONLOOP_CONTEXT && cmdId <= libsumo::RESPONSE_SUBSCRIBE_GUI_CONTEXT) {
400
answerLog << " CommandID=" << cmdId;
401
answerLog << " ObjectID=" << inMsg.readString();
402
answerLog << " Domain=" << inMsg.readUnsignedByte();
403
int varNo = inMsg.readUnsignedByte();
404
answerLog << " #variables=" << varNo << std::endl;
405
int objNo = inMsg.readInt();
406
answerLog << " #objects=" << objNo << std::endl;
407
for (int j = 0; j < objNo; ++j) {
408
answerLog << " ObjectID=" << inMsg.readString() << std::endl;
409
for (int i = 0; i < varNo; ++i) {
410
answerLog << " VariableID=" << inMsg.readUnsignedByte();
411
bool ok = inMsg.readUnsignedByte() == libsumo::RTYPE_OK;
412
answerLog << " ok=" << ok;
413
int valueDataType = inMsg.readUnsignedByte();
414
answerLog << " valueDataType=" << valueDataType;
415
readAndReportTypeDependent(inMsg, valueDataType);
416
}
417
}
418
} else {
419
answerLog << "#Error: received response with command id: " << cmdId << " but expected a subscription response (0xe0-0xef / 0x90-0x9f)" << std::endl;
420
return false;
421
}
422
} catch (std::invalid_argument& e) {
423
answerLog << "#Error while reading message:" << e.what() << std::endl;
424
return false;
425
}
426
return true;
427
}
428
429
430
431
432
433
434
435
// ---------- Conversion helper
436
int
437
TraCITestClient::setValueTypeDependant(tcpip::Storage& into, std::ifstream& defFile, std::stringstream& msg) {
438
std::string dataTypeS;
439
defFile >> dataTypeS;
440
if (dataTypeS == "<airDist>") {
441
into.writeUnsignedByte(libsumo::REQUEST_AIRDIST);
442
return 1;
443
} else if (dataTypeS == "<drivingDist>") {
444
into.writeUnsignedByte(libsumo::REQUEST_DRIVINGDIST);
445
return 1;
446
} else if (dataTypeS == "<objSubscription>") {
447
int beginTime, endTime, numVars;
448
defFile >> beginTime >> endTime >> numVars;
449
into.writeInt(beginTime);
450
into.writeInt(endTime);
451
into.writeInt(numVars);
452
for (int i = 0; i < numVars; ++i) {
453
int var;
454
defFile >> var;
455
into.writeUnsignedByte(var);
456
}
457
return 4 + 4 + 4 + numVars;
458
}
459
int valI;
460
double valF;
461
if (dataTypeS == "<int>") {
462
defFile >> valI;
463
into.writeUnsignedByte(libsumo::TYPE_INTEGER);
464
into.writeInt(valI);
465
return 4 + 1;
466
} else if (dataTypeS == "<byte>") {
467
defFile >> valI;
468
into.writeUnsignedByte(libsumo::TYPE_BYTE);
469
into.writeByte(valI);
470
return 1 + 1;
471
} else if (dataTypeS == "<ubyte>") {
472
defFile >> valI;
473
into.writeUnsignedByte(libsumo::TYPE_UBYTE);
474
into.writeUnsignedByte(valI);
475
return 1 + 1;
476
} else if (dataTypeS == "<double>") {
477
defFile >> valF;
478
into.writeUnsignedByte(libsumo::TYPE_DOUBLE);
479
into.writeDouble(valF);
480
return 8 + 1;
481
} else if (dataTypeS == "<string>") {
482
std::string valueS;
483
defFile >> valueS;
484
if (valueS == "\"\"") {
485
valueS = "";
486
}
487
into.writeUnsignedByte(libsumo::TYPE_STRING);
488
into.writeString(valueS);
489
return 4 + 1 + (int) valueS.length();
490
} else if (dataTypeS == "<string*>") {
491
std::vector<std::string> slValue;
492
defFile >> valI;
493
int length = 1 + 4;
494
for (int i = 0; i < valI; ++i) {
495
std::string tmp;
496
defFile >> tmp;
497
slValue.push_back(tmp);
498
length += 4 + int(tmp.length());
499
}
500
into.writeUnsignedByte(libsumo::TYPE_STRINGLIST);
501
into.writeStringList(slValue);
502
return length;
503
} else if (dataTypeS == "<compound>") {
504
defFile >> valI;
505
into.writeUnsignedByte(libsumo::TYPE_COMPOUND);
506
into.writeInt(valI);
507
int length = 1 + 4;
508
for (int i = 0; i < valI; ++i) {
509
length += setValueTypeDependant(into, defFile, msg);
510
}
511
return length;
512
} else if (dataTypeS == "<color>") {
513
defFile >> valI;
514
into.writeUnsignedByte(libsumo::TYPE_COLOR);
515
into.writeUnsignedByte(valI);
516
for (int i = 0; i < 3; ++i) {
517
defFile >> valI;
518
into.writeUnsignedByte(valI);
519
}
520
return 1 + 4;
521
} else if (dataTypeS == "<position2D>") {
522
defFile >> valF;
523
into.writeUnsignedByte(libsumo::POSITION_2D);
524
into.writeDouble(valF);
525
defFile >> valF;
526
into.writeDouble(valF);
527
return 1 + 8 + 8;
528
} else if (dataTypeS == "<position3D>") {
529
defFile >> valF;
530
into.writeUnsignedByte(libsumo::POSITION_3D);
531
into.writeDouble(valF);
532
defFile >> valF;
533
into.writeDouble(valF);
534
defFile >> valF;
535
into.writeDouble(valF);
536
return 1 + 8 + 8 + 8;
537
} else if (dataTypeS == "<positionRoadmap>") {
538
std::string valueS;
539
defFile >> valueS;
540
into.writeUnsignedByte(libsumo::POSITION_ROADMAP);
541
into.writeString(valueS);
542
int length = 1 + 8 + (int) valueS.length();
543
defFile >> valF;
544
into.writeDouble(valF);
545
defFile >> valI;
546
into.writeUnsignedByte(valI);
547
return length + 4 + 1;
548
} else if (dataTypeS == "<shape>") {
549
defFile >> valI;
550
into.writeUnsignedByte(libsumo::TYPE_POLYGON);
551
into.writeUnsignedByte(valI);
552
int length = 1 + 1;
553
for (int i = 0; i < valI; ++i) {
554
double x, y;
555
defFile >> x >> y;
556
into.writeDouble(x);
557
into.writeDouble(y);
558
length += 8 + 8;
559
}
560
return length;
561
}
562
msg << "## Unknown data type: " << dataTypeS;
563
return 0;
564
}
565
566
567
void
568
TraCITestClient::readAndReportTypeDependent(tcpip::Storage& inMsg, int valueDataType) {
569
if (valueDataType == libsumo::TYPE_UBYTE) {
570
int ubyte = inMsg.readUnsignedByte();
571
answerLog << " Unsigned Byte Value: " << ubyte << std::endl;
572
} else if (valueDataType == libsumo::TYPE_BYTE) {
573
int byte = inMsg.readByte();
574
answerLog << " Byte value: " << byte << std::endl;
575
} else if (valueDataType == libsumo::TYPE_INTEGER) {
576
int integer = inMsg.readInt();
577
answerLog << " Int value: " << integer << std::endl;
578
} else if (valueDataType == libsumo::TYPE_DOUBLE) {
579
double doublev = inMsg.readDouble();
580
answerLog << " Double value: " << doublev << std::endl;
581
} else if (valueDataType == libsumo::TYPE_POLYGON) {
582
int size = inMsg.readUnsignedByte();
583
if (size == 0) {
584
size = inMsg.readInt();
585
}
586
answerLog << " PolygonValue: ";
587
for (int i = 0; i < size; i++) {
588
double x = inMsg.readDouble();
589
double y = inMsg.readDouble();
590
answerLog << "(" << x << "," << y << ") ";
591
}
592
answerLog << std::endl;
593
} else if (valueDataType == libsumo::POSITION_3D) {
594
double x = inMsg.readDouble();
595
double y = inMsg.readDouble();
596
double z = inMsg.readDouble();
597
answerLog << " Position3DValue:";
598
answerLog << " x: " << x << " y: " << y
599
<< " z: " << z << std::endl;
600
} else if (valueDataType == libsumo::POSITION_ROADMAP) {
601
std::string roadId = inMsg.readString();
602
double pos = inMsg.readDouble();
603
int laneId = inMsg.readUnsignedByte();
604
answerLog << " RoadMapPositionValue: roadId=" << roadId
605
<< " pos=" << pos
606
<< " laneId=" << laneId << std::endl;
607
} else if (valueDataType == libsumo::TYPE_STRING) {
608
std::string s = inMsg.readString();
609
answerLog << " string value: " << (s.empty() ? "''" : s) << std::endl;
610
} else if (valueDataType == libsumo::TYPE_STRINGLIST) {
611
std::vector<std::string> s = inMsg.readStringList();
612
answerLog << " string list value: [ ";
613
for (std::vector<std::string>::iterator i = s.begin(); i != s.end(); ++i) {
614
if (i != s.begin()) {
615
answerLog << ", ";
616
}
617
answerLog << '"' << *i << '"';
618
}
619
answerLog << " ]" << std::endl;
620
} else if (valueDataType == libsumo::TYPE_COMPOUND) {
621
int no = inMsg.readInt();
622
answerLog << " compound value with " << no << " members: [";
623
for (int i = 0; i < no; ++i) {
624
int currentValueDataType = inMsg.readUnsignedByte();
625
answerLog << " valueDataType=" << currentValueDataType;
626
readAndReportTypeDependent(inMsg, currentValueDataType);
627
}
628
answerLog << " ]" << std::endl;
629
} else if (valueDataType == libsumo::POSITION_2D) {
630
double xv = inMsg.readDouble();
631
double yv = inMsg.readDouble();
632
answerLog << " position value: (" << xv << "," << yv << ")" << std::endl;
633
} else if (valueDataType == libsumo::TYPE_COLOR) {
634
int r = inMsg.readUnsignedByte();
635
int g = inMsg.readUnsignedByte();
636
int b = inMsg.readUnsignedByte();
637
int a = inMsg.readUnsignedByte();
638
answerLog << " color value: (" << r << "," << g << "," << b << "," << a << ")" << std::endl;
639
} else {
640
answerLog << "#Error: unknown valueDataType!" << std::endl;
641
}
642
}
643
644
645
void
646
TraCITestClient::testAPI() {
647
answerLog << "testAPI:\n";
648
const auto& version = getVersion();
649
answerLog << " getVersion: " << version.first << ", " << version.second << "\n";
650
answerLog << " setOrder:\n";
651
setOrder(0);
652
// edge
653
answerLog << " edge:\n";
654
answerLog << " getIDList: " << joinToString(edge.getIDList(), " ") << "\n";
655
answerLog << " getIDCount: " << edge.getIDCount() << "\n";
656
const std::string edgeID = "e_m0";
657
edge.adaptTraveltime(edgeID, 42, 0, 10);
658
edge.setEffort(edgeID, 420, 0, 10);
659
answerLog << " currentTraveltime: " << edge.getTraveltime(edgeID) << "\n";
660
answerLog << " adaptedTravelTime: " << edge.getAdaptedTraveltime(edgeID, 0) << "\n";
661
answerLog << " effort: " << edge.getEffort(edgeID, 0) << "\n";
662
answerLog << " laneNumber: " << edge.getLaneNumber(edgeID) << "\n";
663
answerLog << " streetName: " << edge.getStreetName(edgeID) << "\n";
664
edge.setMaxSpeed(edgeID, 42);
665
answerLog << " maxSpeed: " << lane.getMaxSpeed(edgeID + "_0") << "\n";
666
667
// lane
668
answerLog << " lane:\n";
669
answerLog << " getIDList: " << joinToString(lane.getIDList(), " ") << "\n";
670
answerLog << " getIDCount: " << lane.getIDCount() << "\n";
671
const std::string laneID = "e_m6_0";
672
answerLog << " getLinkNumber: " << lane.getLinkNumber(laneID) << "\n";
673
std::vector<libsumo::TraCIConnection> connections = lane.getLinks(laneID);
674
answerLog << " getLinks:\n";
675
for (int i = 0; i < (int)connections.size(); ++i) {
676
const libsumo::TraCIConnection& c = connections[i];
677
answerLog << " approachedLane=" << c.approachedLane
678
<< " hasPrio=" << c.hasPrio
679
<< " isOpen=" << c.isOpen
680
<< " hasFoe=" << c.hasFoe
681
<< " approachedInternal=" << c.approachedInternal
682
<< " state=" << c.state
683
<< " direction=" << c.direction
684
<< " length=" << c.length
685
<< "\n";
686
}
687
answerLog << " getFoes: " << joinToString(lane.getFoes("e_vu0_0", "e_m4_0"), " ") << "\n";
688
try {
689
answerLog << " getFoes (invalid): ";
690
answerLog << joinToString(lane.getFoes("e_vu0_0", "e_m4_1"), " ") << "\n";
691
} catch (libsumo::TraCIException& e) {
692
answerLog << " caught TraCIException(" << e.what() << ")\n";
693
}
694
answerLog << " getInternalFoes: " << joinToString(lane.getInternalFoes(":n_m4_2_0"), " ") << "\n";
695
try {
696
answerLog << " getInternalFoes (invalid): ";
697
answerLog << joinToString(lane.getInternalFoes("dummy"), " ") << "\n";
698
} catch (libsumo::TraCIException& e) {
699
answerLog << " caught TraCIException(" << e.what() << ")\n";
700
}
701
lane.setMaxSpeed(laneID, 42);
702
answerLog << " maxSpeed: " << lane.getMaxSpeed(laneID) << "\n";
703
// poi
704
answerLog << " POI:\n";
705
answerLog << " getIDList: " << joinToString(poi.getIDList(), " ") << "\n";
706
answerLog << " getIDCount: " << poi.getIDCount() << "\n";
707
answerLog << " getPosition: " << poi.getPosition("poi0").getString() << "\n";
708
answerLog << " getColor: " << poi.getColor("poi0").getString() << "\n";
709
710
// poly
711
answerLog << " polygon:\n";
712
answerLog << " getIDList: " << joinToString(polygon.getIDList(), " ") << "\n";
713
answerLog << " getIDCount: " << polygon.getIDCount() << "\n";
714
libsumo::TraCIPositionVector shape = polygon.getShape("poly0");
715
polygon.setLineWidth("poly0", 0.6);
716
answerLog << " getLineWidth: " << polygon.getLineWidth("poly0") << "\n";
717
answerLog << " getShape: " << shape.getString() << "\n";
718
answerLog << " getColor: " << polygon.getColor("poly0").getString() << "\n";
719
shape.value[0].x = 42;
720
polygon.setShape("poly0", shape);
721
answerLog << " getShape after modification: " << polygon.getShape("poly0").getString() << "\n";
722
723
// junction
724
answerLog << " junction:\n";
725
answerLog << " getIDList: " << joinToString(junction.getIDList(), " ") << "\n";
726
answerLog << " getIDCount: " << junction.getIDCount() << "\n";
727
answerLog << " getShape: " << junction.getShape("n_m4").getString() << "\n";
728
729
// route
730
answerLog << " route:\n";
731
answerLog << " add:\n";
732
std::vector<std::string> edges;
733
edges.push_back("e_u1");
734
edges.push_back("e_u0");
735
route.add("e_u1", edges);
736
edges.clear();
737
edges.push_back("e_m4");
738
route.add("e_m4", edges);
739
answerLog << " getIDList: " << joinToString(route.getIDList(), " ") << "\n";
740
741
// vehicletype
742
answerLog << " vehicleType:\n";
743
answerLog << " getIDList: " << joinToString(vehicletype.getIDList(), " ") << "\n";
744
vehicletype.setEmergencyDecel("t1", 9.9);
745
answerLog << " getEmergencyDecel: " << vehicletype.getEmergencyDecel("t1") << "\n";
746
vehicletype.setApparentDecel("t1", 99.9);
747
answerLog << " getApparentDecel: " << vehicletype.getApparentDecel("t1") << "\n";
748
vehicletype.setWidth("t1", 1.9);
749
answerLog << " getWidth: " << vehicletype.getWidth("t1") << "\n";
750
vehicletype.setHeight("t1", 1.8);
751
answerLog << " getHeight: " << vehicletype.getHeight("t1") << "\n";
752
vehicletype.setMinGapLat("t1", 1.5);
753
answerLog << " setMinGapLat: " << vehicletype.getMinGapLat("t1") << "\n";
754
vehicletype.setMaxSpeedLat("t1", 1.2);
755
answerLog << " setMaxSpeedLat: " << vehicletype.getMaxSpeedLat("t1") << "\n";
756
vehicletype.setLateralAlignment("t1", "compact");
757
answerLog << " getLateralAlignment: " << vehicletype.getLateralAlignment("t1") << "\n";
758
answerLog << " getPersonCapacity: " << vehicletype.getPersonCapacity("t1") << "\n";
759
answerLog << " copy type 't1' to 't1_copy' and set accel to 100.\n";
760
vehicletype.copy("t1", "t1_copy");
761
answerLog << " getIDList: " << joinToString(vehicletype.getIDList(), " ") << "\n";
762
vehicletype.setAccel("t1_copy", 100.);
763
answerLog << " getAccel('t1'): " << vehicletype.getAccel("t1") << "\n";
764
answerLog << " getAccel('t1_copy'): " << vehicletype.getAccel("t1_copy") << "\n";
765
766
// vehicle
767
answerLog << " vehicle:\n";
768
vehicle.setLine("0", "S42");
769
std::vector<std::string> via;
770
via.push_back("e_shape1");
771
vehicle.setVia("0", via);
772
vehicle.setType("0", "t1_copy");
773
answerLog << " getTypeID: " << vehicle.getTypeID("0") << "\n";
774
answerLog << " getRoadID: " << vehicle.getRoadID("0") << "\n";
775
answerLog << " getRouteID: " << vehicle.getRouteID("0") << "\n";
776
answerLog << " getLaneID: " << vehicle.getLaneID("0") << "\n";
777
answerLog << " getLanePosition: " << vehicle.getLanePosition("0") << "\n";
778
answerLog << " getLateralLanePosition: " << vehicle.getLateralLanePosition("0") << "\n";
779
answerLog << " getSpeed: " << vehicle.getSpeed("0") << "\n";
780
answerLog << " getLateralSpeed: " << vehicle.getLateralSpeed("0") << "\n";
781
answerLog << " getAcceleration: " << vehicle.getAcceleration("0") << "\n";
782
783
answerLog << " getFollowSpeed: " << vehicle.getFollowSpeed("0", 10, 20, 9, 4.5) << "\n";
784
answerLog << " getSecureGap: " << vehicle.getSecureGap("0", 10, 9, 4.5) << "\n";
785
answerLog << " getStopSpeed: " << vehicle.getStopSpeed("0", 10, 20) << "\n";
786
787
answerLog << " getSpeedMode: " << vehicle.getSpeedMode("0") << "\n";
788
answerLog << " getSlope: " << vehicle.getSlope("0") << "\n";
789
answerLog << " getLine: " << vehicle.getLine("0") << "\n";
790
answerLog << " getVia: " << joinToString(vehicle.getVia("0"), ",") << "\n";
791
answerLog << " getPersonCapacity: " << vehicle.getPersonCapacity("0") << "\n";
792
vehicle.setMaxSpeed("0", 30);
793
answerLog << " getMaxSpeed: " << vehicle.getMaxSpeed("0") << "\n";
794
answerLog << " isRouteValid: " << vehicle.isRouteValid("0") << "\n";
795
answerLog << " getStopState: " << vehicle.getStopState("0") << "\n";
796
answerLog << " getStopDelay: " << vehicle.getStopDelay("0") << "\n";
797
vehicle.setParameter("0", "meaningOfLife", "42");
798
answerLog << " param: " << vehicle.getParameter("0", "meaningOfLife") << "\n";
799
std::pair<std::string, std::string> paramTuple = vehicle.getParameterWithKey("0", "meaningOfLife");
800
answerLog << " parameterWithKey: (" << paramTuple.first << ", " << paramTuple.second << ")\n";
801
libsumo::TraCIColor col1;
802
col1.r = 255;
803
col1.g = 255;
804
col1.b = 0;
805
col1.a = 128;
806
vehicle.setColor("0", col1);
807
libsumo::TraCIColor col2 = vehicle.getColor("0");
808
answerLog << " getColor: r=" << (int)col2.r << " g=" << (int)col2.g << " b=" << (int)col2.b << " a=" << (int)col2.a << "\n";
809
int signals = vehicle.getSignals("0");
810
answerLog << " getSignals: " << signals << "\n";
811
vehicle.setSignals("0", signals ^ TraCIAPI::VehicleScope::SIGNAL_FOGLIGHT);
812
vehicle.setRoutingMode("0", libsumo::ROUTING_MODE_AGGREGATED);
813
answerLog << " getRoutingMode: " << vehicle.getRoutingMode("0") << "\n";
814
answerLog << " getNextTLS:\n";
815
std::vector<libsumo::TraCINextTLSData> result = vehicle.getNextTLS("0");
816
for (int i = 0; i < (int)result.size(); ++i) {
817
const libsumo::TraCINextTLSData& d = result[i];
818
answerLog << " tls=" << d.id << " tlIndex=" << d.tlIndex << " dist=" << d.dist << " state=" << d.state << "\n";
819
}
820
answerLog << " moveToXY, simStep:\n";
821
vehicle.moveToXY("0", "dummy", 0, 2231.61, 498.29, 90, 1);
822
simulationStep();
823
// simulationStep(1);
824
answerLog << " getRoadID: " << vehicle.getRoadID("0") << "\n";
825
answerLog << " getLaneID: " << vehicle.getLaneID("0") << "\n";
826
vehicle.changeTarget("0", "e_o0");
827
std::vector<std::string> edges2 = vehicle.getRoute("0");
828
answerLog << " edges: " << joinToString(edges2, " ") << "\n";
829
vehicle.setRouteID("0", "e_m4");
830
answerLog << " edges: " << joinToString(vehicle.getRoute("0"), " ") << "\n";
831
vehicle.setRoute("0", edges2);
832
answerLog << " edges: " << joinToString(vehicle.getRoute("0"), " ") << "\n";
833
answerLog << " add:\n";
834
vehicle.add("1", "e_u1");
835
vehicle.add("2", "e_u1");
836
vehicle.moveTo("2", "e_u0_0", 5);
837
simulationStep();
838
answerLog << " getIDList: " << joinToString(vehicle.getIDList(), " ") << "\n";
839
answerLog << " getWaitingTime: " << vehicle.getWaitingTime("0") << "\n";
840
answerLog << " getAccumulatedWaitingTime: " << vehicle.getAccumulatedWaitingTime("0") << "\n";
841
vehicle.setShapeClass("0", "bicycle");
842
answerLog << " getShapeClass: " << vehicle.getShapeClass("0") << "\n";
843
std::pair<std::string, double> leader = vehicle.getLeader("1", 1000);
844
answerLog << " getLeader: " << leader.first << ", " << leader.second << "\n";
845
std::pair<std::string, double> follower = vehicle.getFollower("1", 1000);
846
answerLog << " getFollower: " << follower.first << ", " << follower.second << "\n";
847
std::pair<int, int> state = vehicle.getLaneChangeState("1", 1);
848
answerLog << " getLaneChangeState (left): " << state.first << ", " << state.second << "\n";
849
state = vehicle.getLaneChangeState("1", -1);
850
answerLog << " getLaneChangeState (right): " << state.first << ", " << state.second << "\n";
851
vehicle.rerouteTraveltime("0");
852
vehicle.setSpeedFactor("0", 0.8);
853
vehicle.setSpeedMode("0", 0);
854
answerLog << " getSpeedMode after change: " << vehicle.getSpeedMode("0") << "\n";
855
vehicle.setLaneChangeMode("0", 0);
856
answerLog << " getLaneChangeMode after change: " << vehicle.getLaneChangeMode("0") << "\n";
857
answerLog << " remove:\n";
858
vehicle.remove("0");
859
answerLog << " getIDCount: " << vehicle.getIDCount() << "\n";
860
861
// inductionLoop
862
answerLog << " inductionloop:\n";
863
answerLog << " getIDList: " << joinToString(inductionloop.getIDList(), " ") << "\n";
864
answerLog << " getVehicleData:\n";
865
std::vector<libsumo::TraCIVehicleData> result2 = inductionloop.getVehicleData("det1");
866
for (int i = 0; i < (int)result2.size(); ++i) {
867
const libsumo::TraCIVehicleData& vd = result2[i];
868
answerLog << " veh=" << vd.id << " length=" << vd.length << " entered=" << vd.entryTime << " left=" << vd.leaveTime << " type=" << vd.typeID << "\n";
869
}
870
871
// multi-entry/-exit detector
872
// answerLog << " multi-entry/-exit detector:\n";
873
// answerLog << " getLastStepVehicleIDs: " << joinToString(multientryexit.getLastStepVehicleIDs("det2"), " ") << "\n";
874
// answerLog << " getEntryLanes: " << joinToString(multientryexit.getEntryLanes("det2"), " ") << "\n";
875
// answerLog << " getExitLanes: " << joinToString(multientryexit.getExitLanes("det2"), " ") << "\n";
876
// answerLog << " getEntryPositions: " << joinToString(multientryexit.getEntryPositions("det2"), " ") << "\n";
877
// answerLog << " getExitPositions: " << joinToString(multientryexit.getExitPositions("det2"), " ") << "\n";
878
879
// simulation
880
answerLog << " simulation:\n";
881
answerLog << " getOption: " << simulation.getOption("net-file") << "\n";
882
answerLog << " convert2D: " << simulation.convert2D("e_m5", 0).getString() << "\n";
883
answerLog << " convert2DGeo: " << simulation.convert2D("e_m5", 0, 0, true).getString() << "\n";
884
answerLog << " convert3D: " << simulation.convert3D("e_m5", 0).getString() << "\n";
885
answerLog << " convert3DGeo: " << simulation.convert3D("e_m5", 0, 0, true).getString() << "\n";
886
answerLog << " convertRoad: " << simulation.convertRoad(2500, 500).getString() << "\n";
887
answerLog << " convertRoadBus: " << simulation.convertRoad(2500, 500, false, "bus").getString() << "\n";
888
answerLog << " convertGeo: " << simulation.convertGeo(2500, 500).getString() << "\n";
889
answerLog << " convertCartesian: " << simulation.convertGeo(12, 52, true).getString() << "\n";
890
answerLog << " getDistance2D_air: " << simulation.getDistance2D(2500, 500, 2000, 500, false, false) << "\n";
891
answerLog << " getDistance2D_driving: " << simulation.getDistance2D(2500, 500, 2000, 500, false, true) << "\n";
892
answerLog << " getDistanceRoad_air: " << simulation.getDistanceRoad("e_m5", 0, "e_m4", 0, false) << "\n";
893
answerLog << " getDistanceRoad_driving: " << simulation.getDistanceRoad("e_m5", 0, "e_m4", 0, true) << "\n";
894
answerLog << " getCurrentTime: " << simulation.getCurrentTime() << "\n";
895
answerLog << " getDeltaT: " << simulation.getDeltaT() << "\n";
896
answerLog << " parkingArea param: " << simulation.getParameter("park1", "parkingArea.capacity") << "\n";
897
answerLog << " busStopWaiting: " << simulation.getBusStopWaiting("bs1") << "\n";
898
answerLog << " busStopWaitingIDs: " << joinToString(simulation.getBusStopWaitingIDList("bs1"), " ") << "\n";
899
simulation.writeMessage("custom message test");
900
answerLog << " subscribe to road and pos of vehicle '1':\n";
901
answerLog << " findRoute: " << joinToString(simulation.findRoute("e_m5", "e_m4").edges, " ") << "\n";
902
std::vector<int> vars;
903
vars.push_back(libsumo::VAR_ROAD_ID);
904
vars.push_back(libsumo::VAR_LANEPOSITION);
905
vehicle.subscribe("1", vars, 0, 100);
906
simulationStep();
907
answerLog << " subscription results:\n";
908
libsumo::TraCIResults result3 = vehicle.getSubscriptionResults("1");
909
answerLog << " roadID=" << result3[libsumo::VAR_ROAD_ID]->getString() << " pos=" << result3[libsumo::VAR_LANEPOSITION]->getString() << "\n";
910
911
answerLog << " subscribe to vehicles around edge 'e_u1':\n";
912
std::vector<int> vars2;
913
vars2.push_back(libsumo::VAR_LANEPOSITION);
914
edge.subscribeContext("e_u1", libsumo::CMD_GET_VEHICLE_VARIABLE, 100, vars2, 0, 100);
915
simulationStep();
916
answerLog << " context subscription results:\n";
917
libsumo::SubscriptionResults result4 = edge.getContextSubscriptionResults("e_u1");
918
for (libsumo::SubscriptionResults::iterator it = result4.begin(); it != result4.end(); ++it) {
919
answerLog << " vehicle=" << it->first << " pos=" << it->second[libsumo::VAR_LANEPOSITION]->getString() << "\n";
920
}
921
922
answerLog << " subscribe to vehicles around vehicle '1':\n";
923
std::vector<int> vars3;
924
vars3.push_back(libsumo::VAR_SPEED);
925
vehicle.subscribeContext("1", libsumo::CMD_GET_VEHICLE_VARIABLE, 1000, vars3, 0, 100);
926
vehicle.addSubscriptionFilterLanes(std::vector<int>({0, 1, 2}));
927
vehicle.addSubscriptionFilterNoOpposite();
928
vehicle.addSubscriptionFilterDownstreamDistance(1000);
929
vehicle.addSubscriptionFilterUpstreamDistance(1000);
930
vehicle.addSubscriptionFilterCFManeuver();
931
vehicle.addSubscriptionFilterLeadFollow(std::vector<int>({0, 1, 2}));
932
vehicle.addSubscriptionFilterTurn();
933
vehicle.addSubscriptionFilterVClass(std::vector<std::string>({"passenger"}));
934
vehicle.addSubscriptionFilterVType(std::vector<std::string>({"DEFAULT_VEHTYPE"}));
935
vehicle.addSubscriptionFilterLCManeuver(1);
936
937
vehicle.subscribeContext("3", libsumo::CMD_GET_VEHICLE_VARIABLE, 200, vars3, 0, 100);
938
vehicle.addSubscriptionFilterFieldOfVision(90);
939
940
vehicle.subscribeContext("4", libsumo::CMD_GET_VEHICLE_VARIABLE, 200, vars3, 0, 100);
941
vehicle.addSubscriptionFilterLateralDistance(50);
942
//
943
944
simulationStep();
945
answerLog << " context subscription results:\n";
946
libsumo::SubscriptionResults result5 = vehicle.getContextSubscriptionResults("1");
947
for (auto item : result5) {
948
answerLog << " vehicle=" << item.first << "\n";
949
}
950
951
// person
952
answerLog << " person:\n";
953
person.setWidth("p0", 1);
954
person.setMinGap("p0", 2);
955
person.setLength("p0", 3);
956
person.setHeight("p0", 4);
957
person.setColor("p0", col1);
958
person.setType("p0", "stilts");
959
answerLog << " getIDList: " << joinToString(person.getIDList(), " ") << "\n";
960
answerLog << " getRoadID: " << person.getRoadID("p0") << "\n";
961
answerLog << " getLaneID: " << person.getLaneID("p0") << "\n";
962
answerLog << " getTypeID: " << person.getTypeID("p0") << "\n";
963
answerLog << " getWaitingTime: " << person.getWaitingTime("p0") << "\n";
964
answerLog << " getNextEdge: " << person.getNextEdge("p0") << "\n";
965
answerLog << " getStage: " << person.getStage("p0").description << "\n";
966
answerLog << " getRemainingStages: " << person.getRemainingStages("p0") << "\n";
967
answerLog << " getVehicle: " << person.getVehicle("p0") << "\n";
968
answerLog << " getEdges: " << joinToString(person.getEdges("p0"), " ") << "\n";
969
answerLog << " getPosition: " << person.getPosition("p0").getString() << "\n";
970
answerLog << " getPosition3D: " << person.getPosition3D("p0").getString() << "\n";
971
answerLog << " getAngle: " << person.getAngle("p0") << "\n";
972
answerLog << " getSlope: " << person.getSlope("p0") << "\n";
973
answerLog << " getLanePosition: " << person.getLanePosition("p0") << "\n";
974
answerLog << " getLength: " << person.getLength("p0") << "\n";
975
answerLog << " getColor: " << person.getColor("p0").getString() << "\n";
976
person.setParameter("p0", "foo", "bar");
977
answerLog << " param: " << person.getParameter("p0", "foo") << "\n";
978
person.setSpeed("p0", 3);
979
simulationStep();
980
answerLog << " getSpeed: " << person.getSpeed("p0") << "\n";
981
person.add("p1", "e_u1", 10);
982
std::vector<std::string> walkEdges;
983
walkEdges.push_back("e_u1");
984
walkEdges.push_back("e_shape1");
985
person.appendWalkingStage("p1", walkEdges, -20);
986
person.appendWaitingStage("p1", 5);
987
person.appendDrivingStage("p1", "e_vu2", "BusLine42");
988
libsumo::TraCIStage stage(libsumo::STAGE_WALKING);
989
stage.edges.push_back("e_vu2");
990
stage.edges.push_back("e_vo2");
991
stage.arrivalPos = -10;
992
person.appendStage("p1", stage);
993
simulationStep();
994
// expect 5 stages due to the initial waiting-for-departure stage
995
answerLog << " getRemainingStages: " << person.getRemainingStages("p1") << "\n";
996
person.removeStage("p1", 3);
997
answerLog << " getRemainingStages: " << person.getRemainingStages("p1") << "\n";
998
person.removeStages("p1");
999
answerLog << " getRemainingStages: " << person.getRemainingStages("p1") << "\n";
1000
answerLog << " getStage: " << person.getStage("p1").description << "\n";
1001
walkEdges.push_back("e_m5");
1002
person.appendWalkingStage("p1", walkEdges, -20);
1003
simulationStep();
1004
answerLog << " getEdges before rerouting: " << joinToString(person.getEdges("p1"), " ") << "\n";
1005
person.rerouteTraveltime("p1");
1006
answerLog << " getEdges after rerouting: " << joinToString(person.getEdges("p1"), " ") << "\n";
1007
1008
// trafficlights
1009
answerLog << " trafficlights:\n";
1010
trafficlights.setPhase("n_m4", 0);
1011
trafficlights.setPhaseName("n_m4", "nameSetByTraCI");
1012
answerLog << " getIDList: " << joinToString(trafficlights.getIDList(), " ") << "\n";
1013
answerLog << " getIDCount: " << trafficlights.getIDCount() << "\n";
1014
answerLog << " state: " << trafficlights.getRedYellowGreenState("n_m4") << "\n";
1015
answerLog << " program: " << trafficlights.getProgram("n_m4") << "\n";
1016
answerLog << " phase: " << trafficlights.getPhase("n_m4") << "\n";
1017
answerLog << " phaseName: " << trafficlights.getPhaseName("n_m4") << "\n";
1018
answerLog << " phaseDuration: " << trafficlights.getPhaseDuration("n_m4") << "\n";
1019
answerLog << " nextSwitch: " << trafficlights.getNextSwitch("n_m4") << "\n";
1020
answerLog << " controlledLanes: " << joinToString(trafficlights.getControlledLanes("n_m4"), " ") << "\n";
1021
std::vector<std::vector<libsumo::TraCILink> > links = trafficlights.getControlledLinks("n_m4");
1022
answerLog << " controlledLinks:\n";
1023
for (int i = 0; i < (int)links.size(); ++i) {
1024
for (int j = 0; j < (int)links[i].size(); ++j) {
1025
answerLog << " index=" << i << " link=" << j << " fromLane=" << links[i][j].fromLane << " viaLane=" << links[i][j].viaLane << " toLane=" << links[i][j].toLane << "\n";
1026
}
1027
}
1028
libsumo::TraCILogic logic("custom", 0, 3);
1029
logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(5, "rrrrrrr", 5, 5));
1030
logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(10, "ggggggg", 5, 15));
1031
logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(3, "GGGGGGG", 3, 3));
1032
logic.phases.push_back(std::make_shared<libsumo::TraCIPhase>(3, "yyyyyyy", 3, 3));
1033
trafficlights.setProgramLogic("n_m4", logic);
1034
1035
std::vector<libsumo::TraCILogic> logics = trafficlights.getAllProgramLogics("n_m4");
1036
answerLog << " completeDefinition:\n";
1037
for (int i = 0; i < (int)logics.size(); ++i) {
1038
answerLog << " subID=" << logics[i].programID << " type=" << logics[i].type << " phase=" << logics[i].currentPhaseIndex << "\n";
1039
answerLog << " params=" << joinToString(logics[i].subParameter) << "\n";
1040
for (int j = 0; j < (int)logics[i].phases.size(); ++j) {
1041
answerLog << " phase=" << logics[i].phases[j]->state
1042
<< " dur=" << logics[i].phases[j]->duration
1043
<< " minDur=" << logics[i].phases[j]->minDur
1044
<< " maxDur=" << logics[i].phases[j]->maxDur
1045
<< "\n";
1046
}
1047
}
1048
simulationStep();
1049
answerLog << " state=" << trafficlights.getRedYellowGreenState("n_m4") << "\n";
1050
trafficlights.setRedYellowGreenState("n_m4", "gGyruoO");
1051
answerLog << " stateSet=" << trafficlights.getRedYellowGreenState("n_m4") << "\n";
1052
answerLog << " program: " << trafficlights.getProgram("n_m4") << "\n";
1053
1054
answerLog << " gui:\n";
1055
try {
1056
answerLog << " setScheme: \n";
1057
gui.setSchema("View #0", "real world");
1058
answerLog << " getScheme: " << gui.getSchema("View #0") << "\n";
1059
gui.setZoom("View #0", 50);
1060
answerLog << " getZoom: " << gui.getZoom() << "\n";
1061
answerLog << " take screenshot: \n";
1062
gui.screenshot("View #0", "image.png", 500, 500);
1063
} catch (libsumo::TraCIException&) {
1064
answerLog << " no support for gui commands\n";
1065
}
1066
1067
answerLog << " load:\n";
1068
std::vector<std::string> args;
1069
args.push_back("-n");
1070
args.push_back("net.net.xml");
1071
args.push_back("-r");
1072
args.push_back("input_routes.rou.xml");
1073
args.push_back("-a");
1074
args.push_back("input_additional.add.xml");
1075
args.push_back("--no-step-log");
1076
load(args);
1077
simulationStep();
1078
answerLog << " getCurrentTime: " << simulation.getCurrentTime() << "\n";
1079
vehicle.subscribe("0", vars, 0, 100);
1080
edge.subscribeContext("e_u1", libsumo::CMD_GET_VEHICLE_VARIABLE, 100, vars2, 0, 100);
1081
}
1082
1083