Line data Source code
1 : /****************************************************************************/ 2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo 3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others. 4 : // This program and the accompanying materials are made available under the 5 : // terms of the Eclipse Public License 2.0 which is available at 6 : // https://www.eclipse.org/legal/epl-2.0/ 7 : // This Source Code may also be made available under the following Secondary 8 : // Licenses when the conditions for such availability set forth in the Eclipse 9 : // Public License 2.0 are satisfied: GNU General Public License, version 2 10 : // or later which is available at 11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html 12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later 13 : /****************************************************************************/ 14 : /// @file Command_SaveTLSProgram.cpp 15 : /// @author Jakob Erdmann 16 : /// @date 18.09.2019 17 : /// 18 : // Writes the switch times of a tls into a file when the tls switches 19 : /****************************************************************************/ 20 : #include <config.h> 21 : 22 : #include "Command_SaveTLSProgram.h" 23 : #include <microsim/traffic_lights/MSTrafficLightLogic.h> 24 : #include <microsim/MSEventControl.h> 25 : #include <microsim/MSNet.h> 26 : #include <utils/common/UtilExceptions.h> 27 : #include <utils/common/MsgHandler.h> 28 : #include <utils/iodevices/OutputDevice.h> 29 : 30 : 31 : // =========================================================================== 32 : // method definitions 33 : // =========================================================================== 34 23 : Command_SaveTLSProgram::Command_SaveTLSProgram(const MSTLLogicControl::TLSLogicVariants& logics, OutputDevice& od): 35 23 : myOutputDevice(od), 36 23 : myLogics(logics) { 37 23 : MSNet::getInstance()->getEndOfTimestepEvents()->addEvent(this); 38 69 : myOutputDevice.writeXMLHeader("additional", "additional_file.xsd"); 39 23 : } 40 : 41 : 42 44 : Command_SaveTLSProgram::~Command_SaveTLSProgram() { 43 22 : writeCurrent(); 44 44 : } 45 : 46 : 47 : SUMOTime 48 14522 : Command_SaveTLSProgram::execute(SUMOTime /*currentTime*/) { 49 14522 : const std::string& state = myLogics.getActive()->getCurrentPhaseDef().getState(); 50 14522 : const std::string& name = myLogics.getActive()->getCurrentPhaseDef().getName(); 51 14522 : if (myLogics.getActive()->getProgramID() != myPreviousProgramID) { 52 22 : writeCurrent(); 53 22 : myPreviousProgramID = myLogics.getActive()->getProgramID(); 54 22 : myTLSID = myLogics.getActive()->getID(); 55 : } 56 14522 : if (myPreviousStates.size() == 0 || myPreviousStates.back().getState() != state) { 57 3792 : myPreviousStates.push_back(MSPhaseDefinition(0, state, name)); 58 : } 59 14522 : myPreviousStates.back().duration += DELTA_T; 60 14522 : return DELTA_T; 61 : } 62 : 63 : void 64 44 : Command_SaveTLSProgram::writeCurrent() { 65 44 : if (myPreviousStates.size() > 0) { 66 22 : myOutputDevice.openTag(SUMO_TAG_TLLOGIC); 67 22 : myOutputDevice.writeAttr(SUMO_ATTR_ID, myTLSID); 68 22 : myOutputDevice.writeAttr(SUMO_ATTR_TYPE, "static"); 69 22 : myOutputDevice.writeAttr(SUMO_ATTR_PROGRAMID, myPreviousProgramID); 70 : // write the phases 71 1918 : for (const MSPhaseDefinition& p : myPreviousStates) { 72 1896 : myOutputDevice.openTag(SUMO_TAG_PHASE); 73 1896 : myOutputDevice.writeAttr(SUMO_ATTR_DURATION, STEPS2TIME(p.duration)); 74 1896 : if (p.duration < TIME2STEPS(10)) { 75 3296 : myOutputDevice.writePadding(" "); 76 : } 77 1896 : myOutputDevice.writeAttr(SUMO_ATTR_STATE, p.getState()); 78 1896 : if (p.getName() != "") { 79 622 : myOutputDevice.writeAttr(SUMO_ATTR_NAME, p.getName()); 80 : } 81 3792 : myOutputDevice.closeTag(); 82 : } 83 : // write params 84 44 : myOutputDevice.closeTag(); 85 : myPreviousStates.clear(); 86 : } 87 44 : } 88 : 89 : 90 : /****************************************************************************/