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 2001-2010 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) : 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     //myDev << "LaneChangeEvent\n";
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

Generated on Wed May 5 00:06:32 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6