|
SUMO - Simulation of Urban MObility
|
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