SUMO - Simulation of Urban MObility

MSMessageEmitter.cpp

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