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