42 #ifdef CHECK_MEMORY_LEAKS
44 #endif // CHECK_MEMORY_LEAKS
50 MSMessageEmitter::MSMessageEmitter(std::string& file,
51 const std::string& base,
52 std::string& whatemit,
62 std::cout <<
"constructing MSMessageEmitter with file '" + file +
"'" << std::endl;
64 MSMessageEmitter::xyCoords = xy;
65 MSMessageEmitter::tableOutput = tableOut;
66 MSMessageEmitter::reverseOrder = reverse;
67 MSMessageEmitter::myStep = step;
68 setWriteEvents(whatemit);
75 MSMessageEmitter::~MSMessageEmitter() {
80 MSMessageEmitter::initXML() {
81 myDev.writeXMLHeader(
"emitter");
86 MSMessageEmitter::trimmed(
const std::string& str,
const char* sepSet) {
87 std::string::size_type
const first = str.find_first_not_of(sepSet);
88 return (first == std::string::npos) ?
90 str.substr(first, str.find_last_not_of(sepSet) - first + 1);
95 MSMessageEmitter::writeLaneChangeEvent(
const std::string&
id,
SUMOReal& timeStep,
106 myDev << x <<
"\t" << y <<
"\t";
109 myDev <<
"\t" << mySpeed;
115 myDev <<
"\t" +
id +
"\t\t"
119 myDev << x <<
"\t" << y <<
"\t";
122 myDev <<
"\t" << mySpeed;
127 myDev <<
" <message vID=\"" +
id +
"\" oldlane=\""
128 + oldlane->
getID() +
"\" newlane=\""
129 + newlane->
getID() +
"\" pos=\"";
131 myDev <<
"\" speed=\"" << mySpeed;
133 myDev <<
"\" X=\"" << x <<
"\" Y=\"" << y;
136 myDev <<
"\" timestep=\"";
138 myDev <<
"\" event_type=\"lanechange";
141 myDev <<
" <message timestep=\"";
143 myDev <<
"\" vID=\"" +
id +
"\" oldlane=\""
144 + oldlane->
getID() +
"\" newlane=\""
145 + newlane->
getID() +
"\" pos=\"";
147 myDev <<
"\" speed=\"" << mySpeed;
150 myDev <<
"\" X=\"" << x <<
"\" Y=\"" << y;
152 myDev <<
"\" event_type=\"lanechange";
160 MSMessageEmitter::getWriteLCEvent() {
166 MSMessageEmitter::getWriteBEvent() {
172 MSMessageEmitter::getWriteHBEvent() {
178 MSMessageEmitter::getEventsEnabled(
const std::string& enabled) {
180 if (enabled ==
"lanechange" && writeLCEvent) {
182 }
else if (enabled ==
"break" && writeBEvent) {
184 }
else if (enabled ==
"heartbeat" && writeHBEvent) {
192 MSMessageEmitter::writeHeartBeatEvent(
const std::string&
id,
SUMOReal& timeStep,
MSLane* lane,
SUMOReal myPos,
194 if (fmod(timeStep, myStep) == 0) {
197 myDev <<
id +
"\t\t";
198 myDev << lane->
getID();
201 myDev << x <<
"\t" << y <<
"\t";
204 myDev <<
"\t" << speed;
210 myDev <<
"\t" +
id +
"\t\t";
211 myDev << lane->
getID();
214 myDev << x <<
"\t" << y <<
"\t";
217 myDev <<
"\t" << speed;
222 myDev <<
" <message vID=\"" +
id +
"\" lane=\"";
223 myDev << lane->
getID();
224 myDev <<
"\" timestep=\"";
227 myDev <<
"\" X=\"" << x <<
"\" Y=\"" << y;
230 myDev <<
"\" pos=\"" << myPos;
231 myDev <<
"\" speed=\"" << speed;
232 myDev <<
"\" event_type=\"heartbeat";
235 myDev <<
" <message timestep=\"";
237 myDev <<
"\" vID=\"" +
id +
"\" lane=\"";
238 myDev << lane->
getID();
240 myDev <<
"\" X=\"" << x <<
"\" Y=\"" << y;
243 myDev <<
"\" pos=\"" << myPos;
244 myDev <<
"\" speed=\"" << speed;
245 myDev <<
"\" event_type=\"heartbeat";
254 MSMessageEmitter::writeBreakEvent(
const std::string&
id,
SUMOReal& timeStep,
MSLane* lane,
SUMOReal myPos,
258 myDev <<
id +
"\t\t";
259 myDev << lane->
getID();
262 myDev << x <<
"\t" << y <<
"\t";
265 myDev <<
"\t" << speed;
271 myDev <<
"\t" +
id +
"\t\t";
272 myDev << lane->
getID();
275 myDev << x <<
"\t" << y <<
"\t";
278 myDev <<
"\t" << speed;
283 myDev <<
" <message vID=\"" +
id +
"\" lane=\"";
284 myDev << lane->
getID();
285 myDev <<
"\" timestep=\"";
288 myDev <<
"\" X=\"" << x <<
"\" Y=\"" << y;
291 myDev <<
"\" pos=\"" << myPos;
292 myDev <<
"\" speed=\"" << speed;
293 myDev <<
"\" event_type=\"break";
296 myDev <<
" <message timestep=\"";
298 myDev <<
"\" vID=\"" +
id +
"\" lane=\"";
299 myDev << lane->
getID();
301 myDev <<
"\" X=\"" << x <<
"\" Y=\"" << y;
304 myDev <<
"\" pos=\"" << myPos;
305 myDev <<
"\" speed=\"" << speed;
306 myDev <<
"\" event_type=\"break";
314 MSMessageEmitter::setWriteEvents(std::string& events) {
317 while (st.hasNext()) {
318 tmp = trimmed(st.next());
319 if (tmp ==
"lanechange") {
321 std::cout <<
"set event '" + tmp +
"' to true" << std::endl;
323 MSMessageEmitter::writeLCEvent =
true;
324 }
else if (tmp ==
"break") {
326 std::cout <<
"set event '" + tmp +
"' to true" << std::endl;
328 MSMessageEmitter::writeBEvent =
true;
329 }
else if (tmp ==
"heartbeat") {
331 std::cout <<
"set event '" + tmp +
"' to true" << std::endl;
333 MSMessageEmitter::writeHBEvent =
true;
335 std::cout <<
"unknown event '" + tmp +
"', skipping" << std::endl;