SUMO - Simulation of Urban MObility
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MSMessageEmitter.cpp
Go to the documentation of this file.
1 /****************************************************************************/
9 // Builds detectors for microsim
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
12 // Copyright (C) 2001-2013 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #ifdef _MSC_VER
28 #include <windows_config.h>
29 #else
30 #include <config.h>
31 #endif
32 
33 #ifdef _MESSAGES
34 
37 #include <iostream>
38 #include "MSMessageEmitter.h"
39 #include "MSLane.h"
40 #include "MSEdge.h"
41 
42 #ifdef CHECK_MEMORY_LEAKS
43 #include <foreign/nvwa/debug_new.h>
44 #endif // CHECK_MEMORY_LEAKS
45 
46 
47 // ===========================================================================
48 // method definitions
49 // ===========================================================================
50 MSMessageEmitter::MSMessageEmitter(std::string& file,
51  const std::string& base,
52  std::string& whatemit,
53  bool reverse,
54  bool tableOut,
55  bool xy,
56  SUMOReal step) :
57  myDev(OutputDevice::getDevice(FileHelpers::checkForRelativity(file, base))),
58  writeLCEvent(false),
59  writeBEvent(false),
60  writeHBEvent(false) {
61 #ifdef _DEBUG
62  std::cout << "constructing MSMessageEmitter with file '" + file + "'" << std::endl;
63 #endif
64  MSMessageEmitter::xyCoords = xy;
65  MSMessageEmitter::tableOutput = tableOut;
66  MSMessageEmitter::reverseOrder = reverse;
67  MSMessageEmitter::myStep = step;
68  setWriteEvents(whatemit);
69  if (!tableOutput) {
70  initXML();
71  }
72 }
73 
74 
75 MSMessageEmitter::~MSMessageEmitter() {
76 }
77 
78 
79 void
80 MSMessageEmitter::initXML() {
81  myDev.writeXMLHeader("emitter");
82 }
83 
84 
85 std::string
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) ?
89  std::string() :
90  str.substr(first, str.find_last_not_of(sepSet) - first + 1);
91 }
92 
93 
94 void
95 MSMessageEmitter::writeLaneChangeEvent(const std::string& id, SUMOReal& timeStep,
96  MSLane* oldlane, SUMOReal myPos,
97  SUMOReal mySpeed, MSLane* newlane,
98  SUMOReal x, SUMOReal y) {
99  //myDev << "LaneChangeEvent\n";
100  if (tableOutput) {
101  if (!reverseOrder) {
102  myDev << id + "\t\t"
103  + oldlane->getID() + "\t" + newlane->getID()
104  + "\t";
105  if (xyCoords) {
106  myDev << x << "\t" << y << "\t";
107  }
108  myDev << myPos;
109  myDev << "\t" << mySpeed;
110  myDev << "\t";
111  myDev << timeStep;
112  myDev << "\t\t1\n";
113  } else {
114  myDev << timeStep;
115  myDev << "\t" + id + "\t\t"
116  + oldlane->getID() + "\t" + newlane->getID()
117  + "\t";
118  if (xyCoords) {
119  myDev << x << "\t" << y << "\t";
120  }
121  myDev << myPos;
122  myDev << "\t" << mySpeed;
123  myDev << "\t\t1\n";
124  }
125  } else {
126  if (!reverseOrder) {
127  myDev << " <message vID=\"" + id + "\" oldlane=\""
128  + oldlane->getID() + "\" newlane=\""
129  + newlane->getID() + "\" pos=\"";
130  myDev << myPos;
131  myDev << "\" speed=\"" << mySpeed;
132  if (xyCoords) {
133  myDev << "\" X=\"" << x << "\" Y=\"" << y;
134  }
135  myDev << "\" edge=\"" << oldlane->getEdge().getID();
136  myDev << "\" timestep=\"";
137  myDev << timeStep;
138  myDev << "\" event_type=\"lanechange";
139  myDev << "\" />\n";
140  } else {
141  myDev << " <message timestep=\"";
142  myDev << timeStep;
143  myDev << "\" vID=\"" + id + "\" oldlane=\""
144  + oldlane->getID() + "\" newlane=\""
145  + newlane->getID() + "\" pos=\"";
146  myDev << myPos;
147  myDev << "\" speed=\"" << mySpeed;
148  myDev << "\" edge=\"" << oldlane->getEdge().getID();
149  if (xyCoords) {
150  myDev << "\" X=\"" << x << "\" Y=\"" << y;
151  }
152  myDev << "\" event_type=\"lanechange";
153  myDev << "\" />\n";
154  }
155  }
156 }
157 
158 
159 bool
160 MSMessageEmitter::getWriteLCEvent() {
161  return writeLCEvent;
162 }
163 
164 
165 bool
166 MSMessageEmitter::getWriteBEvent() {
167  return writeBEvent;
168 }
169 
170 
171 bool
172 MSMessageEmitter::getWriteHBEvent() {
173  return writeHBEvent;
174 }
175 
176 
177 bool
178 MSMessageEmitter::getEventsEnabled(const std::string& enabled) {
179  bool retVal = false;
180  if (enabled == "lanechange" && writeLCEvent) {
181  retVal = true;
182  } else if (enabled == "break" && writeBEvent) {
183  retVal = true;
184  } else if (enabled == "heartbeat" && writeHBEvent) {
185  retVal = true;
186  }
187  return retVal;
188 }
189 
190 
191 void
192 MSMessageEmitter::writeHeartBeatEvent(const std::string& id, SUMOReal& timeStep, MSLane* lane, SUMOReal myPos,
193  SUMOReal speed, SUMOReal x, SUMOReal y) {
194  if (fmod(timeStep, myStep) == 0) {
195  if (tableOutput) {
196  if (!reverseOrder) {
197  myDev << id + "\t\t";
198  myDev << lane->getID();
199  myDev << "\t";
200  if (xyCoords) {
201  myDev << x << "\t" << y << "\t";
202  }
203  myDev << myPos;
204  myDev << "\t" << speed;
205  myDev << "\t";
206  myDev << timeStep;
207  myDev << "\t2\n";
208  } else {
209  myDev << timeStep;
210  myDev << "\t" + id + "\t\t";
211  myDev << lane->getID();
212  myDev << "\t";
213  if (xyCoords) {
214  myDev << x << "\t" << y << "\t";
215  }
216  myDev << myPos;
217  myDev << "\t" << speed;
218  myDev << "\t\t2\n";
219  }
220  } else {
221  if (!reverseOrder) {
222  myDev << " <message vID=\"" + id + "\" lane=\"";
223  myDev << lane->getID();
224  myDev << "\" timestep=\"";
225  myDev << timeStep;
226  if (xyCoords) {
227  myDev << "\" X=\"" << x << "\" Y=\"" << y;
228  }
229  myDev << "\" edge=\"" << lane->getEdge().getID();
230  myDev << "\" pos=\"" << myPos;
231  myDev << "\" speed=\"" << speed;
232  myDev << "\" event_type=\"heartbeat";
233  myDev << "\" />\n";
234  } else {
235  myDev << " <message timestep=\"";
236  myDev << timeStep;
237  myDev << "\" vID=\"" + id + "\" lane=\"";
238  myDev << lane->getID();
239  if (xyCoords) {
240  myDev << "\" X=\"" << x << "\" Y=\"" << y;
241  }
242  myDev << "\" edge=\"" << lane->getEdge().getID();
243  myDev << "\" pos=\"" << myPos;
244  myDev << "\" speed=\"" << speed;
245  myDev << "\" event_type=\"heartbeat";
246  myDev << "\" />\n";
247  }
248  }
249  }
250 }
251 
252 
253 void
254 MSMessageEmitter::writeBreakEvent(const std::string& id, SUMOReal& timeStep, MSLane* lane, SUMOReal myPos,
255  SUMOReal speed, SUMOReal x, SUMOReal y) {
256  if (tableOutput) {
257  if (!reverseOrder) {
258  myDev << id + "\t\t";
259  myDev << lane->getID();
260  myDev << "\t";
261  if (xyCoords) {
262  myDev << x << "\t" << y << "\t";
263  }
264  myDev << myPos;
265  myDev << "\t" << speed;
266  myDev << "\t";
267  myDev << timeStep;
268  myDev << "\t2\n";
269  } else {
270  myDev << timeStep;
271  myDev << "\t" + id + "\t\t";
272  myDev << lane->getID();
273  myDev << "\t";
274  if (xyCoords) {
275  myDev << x << "\t" << y << "\t";
276  }
277  myDev << myPos;
278  myDev << "\t" << speed;
279  myDev << "\t\t2\n";
280  }
281  } else {
282  if (!reverseOrder) {
283  myDev << " <message vID=\"" + id + "\" lane=\"";
284  myDev << lane->getID();
285  myDev << "\" timestep=\"";
286  myDev << timeStep;
287  if (xyCoords) {
288  myDev << "\" X=\"" << x << "\" Y=\"" << y;
289  }
290  myDev << "\" edge=\"" << lane->getEdge().getID();
291  myDev << "\" pos=\"" << myPos;
292  myDev << "\" speed=\"" << speed;
293  myDev << "\" event_type=\"break";
294  myDev << "\" />\n";
295  } else {
296  myDev << " <message timestep=\"";
297  myDev << timeStep;
298  myDev << "\" vID=\"" + id + "\" lane=\"";
299  myDev << lane->getID();
300  if (xyCoords) {
301  myDev << "\" X=\"" << x << "\" Y=\"" << y;
302  }
303  myDev << "\" edge=\"" << lane->getEdge().getID();
304  myDev << "\" pos=\"" << myPos;
305  myDev << "\" speed=\"" << speed;
306  myDev << "\" event_type=\"break";
307  myDev << "\" />\n";
308  }
309  }
310 }
311 
312 
313 void
314 MSMessageEmitter::setWriteEvents(std::string& events) {
315  std::string tmp;
316  StringTokenizer st(events, ";");
317  while (st.hasNext()) {
318  tmp = trimmed(st.next());
319  if (tmp == "lanechange") {
320 #ifdef _DEBUG
321  std::cout << "set event '" + tmp + "' to true" << std::endl;
322 #endif
323  MSMessageEmitter::writeLCEvent = true;
324  } else if (tmp == "break") {
325 #ifdef _DEBUG
326  std::cout << "set event '" + tmp + "' to true" << std::endl;
327 #endif
328  MSMessageEmitter::writeBEvent = true;
329  } else if (tmp == "heartbeat") {
330 #ifdef _DEBUG
331  std::cout << "set event '" + tmp + "' to true" << std::endl;
332 #endif
333  MSMessageEmitter::writeHBEvent = true;
334  } else {
335  std::cout << "unknown event '" + tmp + "', skipping" << std::endl;
336  }
337  }
338 }
339 #endif