LCOV - code coverage report
Current view: top level - src/netload - NLDiscreteEventBuilder.cpp (source / functions) Coverage Total Hit
Test: lcov.info Lines: 73.2 % 97 71
Test Date: 2024-11-20 15:55:46 Functions: 100.0 % 7 7

            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    NLDiscreteEventBuilder.cpp
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Sascha Krieg
      18              : /// @author  Michael Behrisch
      19              : /// @date    Sep, 2003
      20              : ///
      21              : // }
      22              : /****************************************************************************/
      23              : #include <config.h>
      24              : 
      25              : #include <utils/xml/SUMOXMLDefinitions.h>
      26              : #include <microsim/MSNet.h>
      27              : #include <microsim/actions/Command_SaveTLSState.h>
      28              : #include <microsim/actions/Command_SaveTLSSwitches.h>
      29              : #include <microsim/actions/Command_SaveTLSSwitchStates.h>
      30              : #include <microsim/actions/Command_SaveTLSProgram.h>
      31              : #include <microsim/MSEventControl.h>
      32              : #include <microsim/traffic_lights/MSTLLogicControl.h>
      33              : #include <microsim/traffic_lights/MSTrafficLightLogic.h>
      34              : #include <utils/common/FileHelpers.h>
      35              : #include <utils/common/UtilExceptions.h>
      36              : #include <utils/iodevices/OutputDevice.h>
      37              : #include "NLDiscreteEventBuilder.h"
      38              : 
      39              : 
      40              : // ===========================================================================
      41              : // method definitions
      42              : // ===========================================================================
      43        42766 : NLDiscreteEventBuilder::NLDiscreteEventBuilder(MSNet& net)
      44        42766 :     : myNet(net) {
      45        42766 :     myActions["SaveTLSStates"] = EV_SAVETLSTATE;
      46        42766 :     myActions["SaveTLSSwitchTimes"] = EV_SAVETLSWITCHES;
      47        42766 :     myActions["SaveTLSSwitchStates"] = EV_SAVETLSWITCHSTATES;
      48        42766 :     myActions["SaveTLSProgram"] = EV_SAVETLSPROGRAM;
      49        42766 : }
      50              : 
      51              : 
      52        42766 : NLDiscreteEventBuilder::~NLDiscreteEventBuilder() {}
      53              : 
      54              : 
      55              : void
      56          963 : NLDiscreteEventBuilder::addAction(const SUMOSAXAttributes& attrs,
      57              :                                   const std::string& basePath) {
      58          963 :     bool ok = true;
      59          963 :     const std::string type = attrs.getOpt<std::string>(SUMO_ATTR_TYPE, nullptr, ok, "");
      60              :     // check whether the type was given
      61          963 :     if (type == "" || !ok) {
      62            0 :         throw InvalidArgument("An action's type is not given.");
      63              :     }
      64              :     // get the numerical representation
      65              :     KnownActions::iterator i = myActions.find(type);
      66          963 :     if (i == myActions.end()) {
      67            0 :         throw InvalidArgument("The action type '" + type + "' is not known.");
      68              :     }
      69              :     // build the action
      70          963 :     switch ((*i).second) {
      71          377 :         case EV_SAVETLSTATE:
      72          377 :             buildSaveTLStateCommand(attrs, basePath);
      73              :             break;
      74          137 :         case EV_SAVETLSWITCHES:
      75          137 :             buildSaveTLSwitchesCommand(attrs, basePath);
      76              :             break;
      77          422 :         case EV_SAVETLSWITCHSTATES:
      78          422 :             buildSaveTLSwitchStatesCommand(attrs, basePath);
      79              :             break;
      80           27 :         case EV_SAVETLSPROGRAM:
      81           27 :             buildSaveTLSProgramCommand(attrs, basePath);
      82              :             break;
      83              :     }
      84          963 : }
      85              : 
      86              : 
      87              : void
      88          377 : NLDiscreteEventBuilder::buildSaveTLStateCommand(const SUMOSAXAttributes& attrs,
      89              :         const std::string& basePath) {
      90          377 :     bool ok = true;
      91          377 :     const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
      92          377 :     const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
      93          377 :     const bool saveDetectors = attrs.getOpt<bool>(SUMO_ATTR_SAVE_DETECTORS, nullptr, ok, false);
      94          377 :     const bool saveConditions = attrs.getOpt<bool>(SUMO_ATTR_SAVE_CONDITIONS, nullptr, ok, false);
      95              :     // check the parameter
      96          377 :     if (dest == "" || !ok) {
      97            0 :         throw InvalidArgument("Incomplete description of an 'SaveTLSState'-action occurred.");
      98              :     }
      99          377 :     if (source == "") {
     100            0 :         const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
     101            0 :         for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
     102            0 :             const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
     103            0 :             new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
     104            0 :                                      saveDetectors, saveConditions);
     105              :         }
     106            0 :     } else {
     107              :         // get the logic
     108          377 :         if (!myNet.getTLSControl().knows(source)) {
     109            0 :             throw InvalidArgument("The traffic light logic to save (" + source +  ") is not known.");
     110              :         }
     111          377 :         const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
     112              :         // build the action
     113          377 :         new Command_SaveTLSState(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)),
     114          377 :                                  saveDetectors, saveConditions);
     115              :     }
     116          377 : }
     117              : 
     118              : 
     119              : void
     120          137 : NLDiscreteEventBuilder::buildSaveTLSwitchesCommand(const SUMOSAXAttributes& attrs,
     121              :         const std::string& basePath) {
     122          137 :     bool ok = true;
     123          137 :     const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
     124          137 :     const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
     125              :     // check the parameter
     126          137 :     if (dest == "" || !ok) {
     127            0 :         throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchTimes'-action occurred.");
     128              :     }
     129          137 :     if (source == "") {
     130            0 :         const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
     131            0 :         for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
     132            0 :             const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
     133            0 :             new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
     134              :         }
     135            0 :     } else {
     136              :         // get the logic
     137          137 :         if (!myNet.getTLSControl().knows(source)) {
     138            0 :             throw InvalidArgument("The traffic light logic to save (" + source +  ") is not known.");
     139              :         }
     140          137 :         const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
     141              :         // build the action
     142          274 :         new Command_SaveTLSSwitches(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
     143              :     }
     144          137 : }
     145              : 
     146              : 
     147              : void
     148          422 : NLDiscreteEventBuilder::buildSaveTLSwitchStatesCommand(const SUMOSAXAttributes& attrs,
     149              :         const std::string& basePath) {
     150          422 :     bool ok = true;
     151          422 :     const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
     152          422 :     const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
     153              :     // check the parameter
     154          422 :     if (dest == "" || !ok) {
     155            0 :         throw InvalidArgument("Incomplete description of an 'SaveTLSSwitchStates'-action occurred.");
     156              :     }
     157          422 :     if (source == "") {
     158           16 :         const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
     159           43 :         for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
     160           27 :             const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
     161           54 :             new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
     162              :         }
     163           16 :     } else {
     164              :         // get the logic
     165          406 :         if (!myNet.getTLSControl().knows(source)) {
     166            0 :             throw InvalidArgument("The traffic light logic to save (" + source +  ") is not known.");
     167              :         }
     168          406 :         const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
     169              :         // build the action
     170          812 :         new Command_SaveTLSSwitchStates(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
     171              :     }
     172          422 : }
     173              : 
     174              : 
     175              : void
     176           27 : NLDiscreteEventBuilder::buildSaveTLSProgramCommand(const SUMOSAXAttributes& attrs,
     177              :         const std::string& basePath) {
     178           27 :     bool ok = true;
     179           27 :     const std::string dest = attrs.getOpt<std::string>(SUMO_ATTR_DEST, nullptr, ok, "");
     180           27 :     const std::string source = attrs.getOpt<std::string>(SUMO_ATTR_SOURCE, nullptr, ok, "");
     181              :     // check the parameter
     182           27 :     if (dest == "" || !ok) {
     183            0 :         throw InvalidArgument("Incomplete description of an 'SaveTLSProgram'-action occurred.");
     184              :     }
     185           27 :     if (source == "") {
     186            0 :         const std::vector<std::string> ids = myNet.getTLSControl().getAllTLIds();
     187            0 :         for (std::vector<std::string>::const_iterator tls = ids.begin(); tls != ids.end(); ++tls) {
     188            0 :             const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(*tls);
     189            0 :             new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
     190              :         }
     191            0 :     } else {
     192              :         // get the logic
     193           27 :         if (!myNet.getTLSControl().knows(source)) {
     194            0 :             throw InvalidArgument("The traffic light logic to save (" + source +  ") is not known.");
     195              :         }
     196           27 :         const MSTLLogicControl::TLSLogicVariants& logics = myNet.getTLSControl().get(source);
     197              :         // build the action
     198           54 :         new Command_SaveTLSProgram(logics, OutputDevice::getDevice(FileHelpers::checkForRelativity(dest, basePath)));
     199              :     }
     200           27 : }
     201              : 
     202              : 
     203              : /****************************************************************************/
        

Generated by: LCOV version 2.0-1