50 #ifdef CHECK_MEMORY_LEAKS
52 #endif // CHECK_MEMORY_LEAKS
59 : outputFileName(outputFileName), answerLog(
"") {
60 answerLog.setf(std::ios::fixed , std::ios::floatfield);
73 std::ifstream defFile;
74 std::string fileContentStr;
75 std::stringstream fileContent;
76 std::string lineCommand;
77 std::stringstream msg;
79 bool commentRead =
false;
85 std::stringstream msg;
86 msg <<
"#Error while connecting: " << e.
what();
92 defFile.open(fileName.c_str());
94 msg <<
"Can not open definition file " << fileName << std::endl;
98 defFile.unsetf(std::ios::dec);
100 while (defFile >> lineCommand) {
102 if (lineCommand.compare(
"%") == 0) {
104 commentRead = !commentRead;
111 if (lineCommand.compare(
"repeat") == 0) {
113 defFile >> lineCommand;
115 if (lineCommand.compare(
"simstep2") == 0) {
119 for (
int i = 0; i < repNo; i++) {
122 }
else if (lineCommand.compare(
"getvariable") == 0) {
126 defFile >> domID >> varID >> objID;
128 }
else if (lineCommand.compare(
"getvariable_plus") == 0) {
132 defFile >> domID >> varID >> objID;
133 std::stringstream msg;
136 std::string msgS = msg.str();
141 }
else if (lineCommand.compare(
"subscribevariable") == 0) {
144 std::string beginTime, endTime;
146 defFile >> domID >> objID >> beginTime >> endTime >> varNo;
148 }
else if (lineCommand.compare(
"subscribecontext") == 0) {
150 int domID, varNo, domain;
152 std::string beginTime, endTime;
154 defFile >> domID >> objID >> beginTime >> endTime >> domain >> range >> varNo;
156 }
else if (lineCommand.compare(
"setvalue") == 0) {
160 defFile >> domID >> varID >> objID;
163 msg <<
"Error in definition file: " << lineCommand <<
" is not a valid command";
181 answerLog << std::endl <<
"-> Command sent: <SimulationStep2>:" << std::endl;
184 std::string acknowledgement;
186 answerLog << acknowledgement << std::endl;
197 answerLog << std::endl <<
"-> Command sent: <Close>:" << std::endl;
200 std::string acknowledgement;
202 answerLog << acknowledgement << std::endl;
212 answerLog << std::endl <<
"-> Command sent: <GetVariable>:" << std::endl
213 <<
" domID=" << domID <<
" varID=" << varID
214 <<
" objID=" << objID << std::endl;
217 std::string acknowledgement;
219 answerLog << acknowledgement << std::endl;
229 answerLog <<
" CommandID=" << (domID + 0x10) <<
" VariableID=" << variableID <<
" ObjectID=" << objectID;
231 answerLog <<
" valueDataType=" << valueDataType;
234 std::stringstream msg;
235 msg <<
"Error while receiving command: " << e.
what();
244 std::stringstream msg;
247 std::string msgS = msg.str();
252 answerLog << std::endl <<
"-> Command sent: <SetValue>:" << std::endl
253 <<
" domID=" << domID <<
" varID=" << varID
254 <<
" objID=" << objID << std::endl;
256 std::string acknowledgement;
258 answerLog << acknowledgement << std::endl;
267 std::vector<int> vars;
268 for (
int i = 0; i < varNo; ++i) {
275 answerLog << std::endl <<
"-> Command sent: <SubscribeVariable>:" << std::endl
276 <<
" domID=" << domID <<
" objID=" << objID <<
" with " << varNo <<
" variables" << std::endl;
279 std::string acknowledgement;
281 answerLog << acknowledgement << std::endl;
291 int domain,
SUMOReal range,
int varNo, std::ifstream& defFile) {
292 std::vector<int> vars;
293 for (
int i = 0; i < varNo; ++i) {
300 answerLog << std::endl <<
"-> Command sent: <SubscribeContext>:" << std::endl
301 <<
" domID=" << domID <<
" objID=" << objID <<
" domain=" << domain <<
" range=" << range
302 <<
" with " << varNo <<
" variables" << std::endl;
305 std::string acknowledgement;
307 answerLog << acknowledgement << std::endl;
322 std::cerr <<
"Unable to write result file" << std::endl;
325 locTime = localtime(&seconds);
326 outFile <<
"TraCITestClient output file. Date: " << asctime(locTime) << std::endl;
334 std::cerr << msg.str() << std::endl;
335 answerLog <<
"----" << std::endl << msg.str() << std::endl;
346 int noSubscriptions = inMsg.
readInt();
347 for (
int s = 0; s < noSubscriptions; ++s) {
352 }
catch (std::invalid_argument& e) {
353 answerLog <<
"#Error while reading message:" << e.what() << std::endl;
372 answerLog <<
" #variables=" << varNo << std::endl;
373 for (
unsigned int i = 0; i < varNo; ++i) {
378 answerLog <<
" valueDataType=" << valueDataType;
386 answerLog <<
" #variables=" << varNo << std::endl;
387 unsigned int objNo = inMsg.
readInt();
388 answerLog <<
" #objects=" << objNo << std::endl;
389 for (
unsigned int j = 0; j < objNo; ++j) {
391 for (
unsigned int i = 0; i < varNo; ++i) {
396 answerLog <<
" valueDataType=" << valueDataType;
401 answerLog <<
"#Error: received response with command id: " << cmdId <<
" but expected a subscription response (0xe0-0xef / 0x90-0x9f)" << std::endl;
404 }
catch (std::invalid_argument& e) {
405 answerLog <<
"#Error while reading message:" << e.what() << std::endl;
420 std::string dataTypeS;
421 defFile >> dataTypeS;
422 if (dataTypeS ==
"<airDist>") {
425 }
else if (dataTypeS ==
"<drivingDist>") {
428 }
else if (dataTypeS ==
"<objSubscription>") {
429 int beginTime, endTime, numVars;
430 defFile >> beginTime >> endTime >> numVars;
434 for (
int i = 0; i < numVars; ++i) {
439 return 4 + 4 + 4 + numVars;
443 if (dataTypeS ==
"<int>") {
448 }
else if (dataTypeS ==
"<byte>") {
453 }
else if (dataTypeS ==
"<ubyte>") {
458 }
else if (dataTypeS ==
"<float>") {
463 }
else if (dataTypeS ==
"<double>") {
468 }
else if (dataTypeS ==
"<string>") {
471 if (valueS ==
"\"\"") {
476 return 4 + 1 + (
int) valueS.length();
477 }
else if (dataTypeS ==
"<string*>") {
478 std::vector<std::string> slValue;
481 for (
int i = 0; i < valI; ++i) {
484 slValue.push_back(tmp);
485 length += 4 +
int(tmp.length());
490 }
else if (dataTypeS ==
"<compound>") {
495 for (
int i = 0; i < valI; ++i) {
499 }
else if (dataTypeS ==
"<color>") {
503 for (
int i = 0; i < 3; ++i) {
508 }
else if (dataTypeS ==
"<position2D>") {
515 }
else if (dataTypeS ==
"<position3D>") {
523 return 1 + 8 + 8 + 8;
524 }
else if (dataTypeS ==
"<positionRoadmap>") {
529 int length = 1 + 8 + (
int) valueS.length();
534 return length + 4 + 1;
535 }
else if (dataTypeS ==
"<shape>") {
540 for (
int i = 0; i < valI; ++i) {
549 msg <<
"## Unknown data type: " << dataTypeS;
558 answerLog <<
" Unsigned Byte Value: " << ubyte << std::endl;
561 answerLog <<
" Byte value: " << byte << std::endl;
564 answerLog <<
" Int value: " << integer << std::endl;
567 if (floatv < 0.1 && floatv > 0) {
568 answerLog.setf(std::ios::scientific, std::ios::floatfield);
570 answerLog <<
" float value: " << floatv << std::endl;
571 answerLog.setf(std::ios::fixed , std::ios::floatfield);
576 answerLog <<
" Double value: " << doublev << std::endl;
582 answerLog <<
" BoundaryBoxValue: lowerLeft x=" << lowerLeftX
583 <<
" y=" << lowerLeftY <<
" upperRight x=" << upperRightX
584 <<
" y=" << upperRightY << std::endl;
588 for (
int i = 0; i < length; i++) {
591 answerLog <<
"(" << x <<
"," << y <<
") ";
598 answerLog <<
" Position3DValue: " << std::endl;
600 <<
" z: " << z << std::endl;
605 answerLog <<
" RoadMapPositionValue: roadId=" << roadId
607 <<
" laneId=" << laneId << std::endl;
610 answerLog <<
" TLPhaseListValue: length=" << length << std::endl;
611 for (
int i = 0; i < length; i++) {
615 answerLog <<
" precRoad=" << pred <<
" succRoad=" << succ
628 answerLog <<
"#Error: unknown phase value" << (
int)phase << std::endl;
634 answerLog <<
" string value: " << s << std::endl;
637 answerLog <<
" string list value: [ " << std::endl;
638 for (std::vector<std::string>::iterator i = s.begin(); i != s.end(); ++i) {
639 if (i != s.begin()) {
647 answerLog <<
" compound value with " << no <<
" members: [ " << std::endl;
648 for (
int i = 0; i < no; ++i) {
650 answerLog <<
" valueDataType=" << currentValueDataType;
657 answerLog <<
" position value: (" << xv <<
"," << yv <<
")" << std::endl;
663 answerLog <<
" color value: (" << r <<
"," << g <<
"," << b <<
"," << a <<
")" << std::endl;
665 answerLog <<
"#Error: unknown valueDataType!" << std::endl;