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 #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