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