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