MSMessageEmitter.cpp
Go to the documentation of this file.00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifdef _MSC_VER
00024 #include <windows_config.h>
00025 #else
00026 #include <config.h>
00027 #endif
00028
00029 #ifdef _MESSAGES
00030
00031 #include <utils/common/StringTokenizer.h>
00032 #include <utils/iodevices/OutputDevice.h>
00033 #include <iostream>
00034 #include "MSMessageEmitter.h"
00035 #include "MSLane.h"
00036
00037 #ifdef CHECK_MEMORY_LEAKS
00038 #include <foreign/nvwa/debug_new.h>
00039 #endif // CHECK_MEMORY_LEAKS
00040
00041
00042
00043
00044
00045 MSMessageEmitter::MSMessageEmitter(std::string& file,
00046 const std::string& base,
00047 std::string& whatemit,
00048 bool reverse,
00049 bool tableOut,
00050 bool xy,
00051 SUMOReal step) : writeLCEvent(false), writeBEvent(false),
00052 writeHBEvent(false),
00053 myDev(OutputDevice::getDevice(file, base)) {
00054 #ifdef _DEBUG
00055 std::cout << "constructing MSMessageEmitter with file '" + file + "'" << std::endl;
00056 #endif
00057 MSMessageEmitter::xyCoords = xy;
00058 MSMessageEmitter::tableOutput = tableOut;
00059 MSMessageEmitter::reverseOrder = reverse;
00060 MSMessageEmitter::myStep = step;
00061 setWriteEvents(whatemit);
00062 if (!tableOutput)
00063 initXML();
00064 }
00065
00066
00067 MSMessageEmitter::~MSMessageEmitter() {
00068 }
00069
00070
00071 void
00072 MSMessageEmitter::initXML() {
00073 myDev.writeXMLHeader("emitter");
00074 }
00075
00076
00077 std::string
00078 MSMessageEmitter::trimmed(const std::string& str, const char* sepSet) {
00079 std::string::size_type const first = str.find_first_not_of(sepSet);
00080 return (first==std::string::npos) ?
00081 std::string() :
00082 str.substr(first, str.find_last_not_of(sepSet)-first+1);
00083 }
00084
00085
00086 void
00087 MSMessageEmitter::writeLaneChangeEvent(const std::string& id, SUMOReal& timeStep,
00088 MSLane *oldlane, SUMOReal myPos,
00089 SUMOReal mySpeed, MSLane *newlane,
00090 SUMOReal x, SUMOReal y) {
00091
00092 if (tableOutput) {
00093 if (!reverseOrder) {
00094 myDev << id + "\t\t"
00095 + oldlane->getID() + "\t" + newlane->getID()
00096 + "\t";
00097 if (xyCoords) {
00098 myDev << x << "\t" << y << "\t";
00099 }
00100 myDev << myPos;
00101 myDev << "\t" << mySpeed;
00102 myDev << "\t";
00103 myDev << timeStep;
00104 myDev << "\t\t1\n";
00105 } else {
00106 myDev << timeStep;
00107 myDev << "\t" + id + "\t\t"
00108 + oldlane->getID() + "\t" + newlane->getID()
00109 + "\t";
00110 if (xyCoords) {
00111 myDev << x << "\t" << y << "\t";
00112 }
00113 myDev << myPos;
00114 myDev << "\t" << mySpeed;
00115 myDev << "\t\t1\n";
00116 }
00117 } else {
00118 if (!reverseOrder) {
00119 myDev << " <message vID=\"" + id + "\" oldlane=\""
00120 + oldlane->getID() + "\" newlane=\""
00121 + newlane->getID() + "\" pos=\"";
00122 myDev << myPos;
00123 myDev << "\" speed=\"" << mySpeed;
00124 if (xyCoords) {
00125 myDev << "\" X=\"" << x << "\" Y=\"" << y;
00126 }
00127 myDev << "\" edge=\"" << oldlane->getEdge().getID();
00128 myDev << "\" timestep=\"";
00129 myDev << timeStep;
00130 myDev << "\" event_type=\"lanechange";
00131 myDev << "\" />\n";
00132 } else {
00133 myDev << " <message timestep=\"";
00134 myDev << timeStep;
00135 myDev << "\" vID=\"" + id + "\" oldlane=\""
00136 + oldlane->getID() + "\" newlane=\""
00137 + newlane->getID() + "\" pos=\"";
00138 myDev << myPos;
00139 myDev << "\" speed=\"" << mySpeed;
00140 myDev << "\" edge=\"" << oldlane->getEdge().getID();
00141 if (xyCoords) {
00142 myDev << "\" X=\"" << x << "\" Y=\"" << y;
00143 }
00144 myDev << "\" event_type=\"lanechange";
00145 myDev << "\" />\n";
00146 }
00147 }
00148 }
00149
00150
00151 bool
00152 MSMessageEmitter::getWriteLCEvent() {
00153 return writeLCEvent;
00154 }
00155
00156
00157 bool
00158 MSMessageEmitter::getWriteBEvent() {
00159 return writeBEvent;
00160 }
00161
00162
00163 bool
00164 MSMessageEmitter::getWriteHBEvent() {
00165 return writeHBEvent;
00166 }
00167
00168
00169 bool
00170 MSMessageEmitter::getEventsEnabled(const std::string& enabled) {
00171 bool retVal = false;
00172 if (enabled == "lanechange" && writeLCEvent) {
00173 retVal = true;
00174 } else if (enabled == "break" && writeBEvent) {
00175 retVal = true;
00176 } else if (enabled == "heartbeat" && writeHBEvent) {
00177 retVal = true;
00178 }
00179 return retVal;
00180 }
00181
00182
00183 void
00184 MSMessageEmitter::writeHeartBeatEvent(const std::string &id, SUMOReal& timeStep, MSLane* lane, SUMOReal myPos,
00185 SUMOReal speed, SUMOReal x, SUMOReal y) {
00186 if (fmod(timeStep, myStep) == 0) {
00187 if (tableOutput) {
00188 if (!reverseOrder) {
00189 myDev << id + "\t\t";
00190 myDev << lane->getID();
00191 myDev << "\t";
00192 if (xyCoords) {
00193 myDev << x << "\t" << y << "\t";
00194 }
00195 myDev << myPos;
00196 myDev << "\t" << speed;
00197 myDev << "\t";
00198 myDev << timeStep;
00199 myDev << "\t2\n";
00200 } else {
00201 myDev << timeStep;
00202 myDev << "\t" + id + "\t\t";
00203 myDev << lane->getID();
00204 myDev << "\t";
00205 if (xyCoords) {
00206 myDev << x << "\t" << y << "\t";
00207 }
00208 myDev << myPos;
00209 myDev << "\t" << speed;
00210 myDev << "\t\t2\n";
00211 }
00212 } else {
00213 if (!reverseOrder) {
00214 myDev << " <message vID=\"" + id + "\" lane=\"";
00215 myDev << lane->getID();
00216 myDev << "\" timestep=\"";
00217 myDev << timeStep;
00218 if (xyCoords) {
00219 myDev << "\" X=\"" << x << "\" Y=\"" << y;
00220 }
00221 myDev << "\" edge=\"" << lane->getEdge().getID();
00222 myDev << "\" pos=\"" << myPos;
00223 myDev << "\" speed=\"" << speed;
00224 myDev << "\" event_type=\"heartbeat";
00225 myDev << "\" />\n";
00226 } else {
00227 myDev << " <message timestep=\"";
00228 myDev << timeStep;
00229 myDev << "\" vID=\"" + id + "\" lane=\"";
00230 myDev << lane->getID();
00231 if (xyCoords) {
00232 myDev << "\" X=\"" << x << "\" Y=\"" << y;
00233 }
00234 myDev << "\" edge=\"" << lane->getEdge().getID();
00235 myDev << "\" pos=\"" << myPos;
00236 myDev << "\" speed=\"" << speed;
00237 myDev << "\" event_type=\"heartbeat";
00238 myDev << "\" />\n";
00239 }
00240 }
00241 }
00242 }
00243
00244
00245 void
00246 MSMessageEmitter::writeBreakEvent(const std::string& id, SUMOReal& timeStep, MSLane* lane, SUMOReal myPos,
00247 SUMOReal speed, SUMOReal x, SUMOReal y) {
00248 if (tableOutput) {
00249 if (!reverseOrder) {
00250 myDev << id + "\t\t";
00251 myDev << lane->getID();
00252 myDev << "\t";
00253 if (xyCoords) {
00254 myDev << x << "\t" << y << "\t";
00255 }
00256 myDev << myPos;
00257 myDev << "\t" << speed;
00258 myDev << "\t";
00259 myDev << timeStep;
00260 myDev << "\t2\n";
00261 } else {
00262 myDev << timeStep;
00263 myDev << "\t" + id + "\t\t";
00264 myDev << lane->getID();
00265 myDev << "\t";
00266 if (xyCoords) {
00267 myDev << x << "\t" << y << "\t";
00268 }
00269 myDev << myPos;
00270 myDev << "\t" << speed;
00271 myDev << "\t\t2\n";
00272 }
00273 } else {
00274 if (!reverseOrder) {
00275 myDev << " <message vID=\"" + id + "\" lane=\"";
00276 myDev << lane->getID();
00277 myDev << "\" timestep=\"";
00278 myDev << timeStep;
00279 if (xyCoords) {
00280 myDev << "\" X=\"" << x << "\" Y=\"" << y;
00281 }
00282 myDev << "\" edge=\"" << lane->getEdge().getID();
00283 myDev << "\" pos=\"" << myPos;
00284 myDev << "\" speed=\"" << speed;
00285 myDev << "\" event_type=\"break";
00286 myDev << "\" />\n";
00287 } else {
00288 myDev << " <message timestep=\"";
00289 myDev << timeStep;
00290 myDev << "\" vID=\"" + id + "\" lane=\"";
00291 myDev << lane->getID();
00292 if (xyCoords) {
00293 myDev << "\" X=\"" << x << "\" Y=\"" << y;
00294 }
00295 myDev << "\" edge=\"" << lane->getEdge().getID();
00296 myDev << "\" pos=\"" << myPos;
00297 myDev << "\" speed=\"" << speed;
00298 myDev << "\" event_type=\"break";
00299 myDev << "\" />\n";
00300 }
00301 }
00302 }
00303
00304
00305 void
00306 MSMessageEmitter::setWriteEvents(std::string &events) {
00307 std::string tmp;
00308 StringTokenizer st(events, ";");
00309 while (st.hasNext()) {
00310 tmp = trimmed(st.next());
00311 if (tmp == "lanechange") {
00312 #ifdef _DEBUG
00313 std::cout << "set event '" + tmp + "' to true" << std::endl;
00314 #endif
00315 MSMessageEmitter::writeLCEvent = true;
00316 } else if (tmp == "break") {
00317 #ifdef _DEBUG
00318 std::cout << "set event '" + tmp + "' to true" << std::endl;
00319 #endif
00320 MSMessageEmitter::writeBEvent = true;
00321 } else if (tmp == "heartbeat") {
00322 #ifdef _DEBUG
00323 std::cout << "set event '" + tmp + "' to true" << std::endl;
00324 #endif
00325 MSMessageEmitter::writeHBEvent = true;
00326 } else {
00327 std::cout << "unknown event '" + tmp + "', skipping" << std::endl;
00328 }
00329 }
00330 }
00331
00332
00333 void
00334 MSMessageEmitter::setFile(const std::string& file) {
00335 #ifdef _DEBUG
00336 std::cout << "Filename: '" + file + "'." << std::endl;
00337 #endif
00338 myDev = OutputDevice::getDevice(file);
00339 #ifdef _DEBUG
00340 std::cout << "done..." << std::endl;
00341 #endif
00342 }
00343 #endif