LCOV - code coverage report
Current view: top level - src/netbuild - NBTrafficLightLogic.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 95.8 % 24 23
Test Date: 2024-11-21 15:56:26 Functions: 100.0 % 2 2

            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    NBTrafficLightLogic.h
      15              : /// @author  Daniel Krajzewicz
      16              : /// @author  Jakob Erdmann
      17              : /// @author  Michael Behrisch
      18              : /// @date    Sept 2002
      19              : ///
      20              : // A SUMO-compliant built logic for a traffic light
      21              : /****************************************************************************/
      22              : #pragma once
      23              : #include <config.h>
      24              : 
      25              : #include <vector>
      26              : #include <string>
      27              : #include <bitset>
      28              : #include <utility>
      29              : #include <set>
      30              : #include "NBConnectionDefs.h"
      31              : #include <utils/common/SUMOTime.h>
      32              : #include <utils/common/Named.h>
      33              : #include <utils/common/Parameterised.h>
      34              : 
      35              : 
      36              : // ===========================================================================
      37              : // class declarations
      38              : // ===========================================================================
      39              : class OutputDevice;
      40              : 
      41              : 
      42              : // ===========================================================================
      43              : // class definitions
      44              : // ===========================================================================
      45              : /**
      46              :  * @class NBTrafficLightLogic
      47              :  * @brief A SUMO-compliant built logic for a traffic light
      48              :  */
      49              : class NBTrafficLightLogic : public Named, public Parameterised {
      50              : public:
      51              :     /**
      52              :      * @class PhaseDefinition
      53              :      * @brief The definition of a single phase of the logic
      54              :      */
      55              :     class PhaseDefinition {
      56              : 
      57              :     public:
      58              :         /// @brief The duration of the phase in s
      59              :         SUMOTime duration;
      60              : 
      61              :         /// @brief The state definition
      62              :         std::string state;
      63              : 
      64              :         /// @brief minimum duration (for actuated)
      65              :         SUMOTime minDur;
      66              : 
      67              :         /// @brief maximum duration duration (for actuated)
      68              :         SUMOTime maxDur;
      69              : 
      70              :         /// @brief minimum duration (for actuated)
      71              :         SUMOTime earliestEnd;
      72              : 
      73              :         /// @brief maximum duration duration (for actuated)
      74              :         SUMOTime latestEnd;
      75              : 
      76              :         /// @brief veh ext (for NEMA)
      77              :         SUMOTime vehExt;
      78              : 
      79              :         /// @brief yellow (for NEMA)
      80              :         SUMOTime yellow;
      81              : 
      82              :         /// @brief red (for NEMA)
      83              :         SUMOTime red;
      84              : 
      85              :         /// @brief next phase indices or empty list
      86              :         std::vector<int> next;
      87              : 
      88              :         /// @brief option phase name
      89              :         std::string name;
      90              : 
      91              :         /** @brief Constructor
      92              :          * @param[in] durationArg The duration of the phase
      93              :          * @param[in] stateArg Signals per link
      94              :          */
      95        17114 :         PhaseDefinition(const SUMOTime duration_, const std::string& state_, const SUMOTime minDur_, const SUMOTime maxDur_,
      96              :                         const SUMOTime earliestEnd_, const SUMOTime latestEnd_, const SUMOTime vehExt_, const SUMOTime yellow_,
      97        17114 :                         const SUMOTime red_, const std::vector<int>& next_, const std::string& name_) :
      98        17114 :             duration(duration_),
      99        17114 :             state(state_),
     100        17114 :             minDur(minDur_),
     101        17114 :             maxDur(maxDur_),
     102        17114 :             earliestEnd(earliestEnd_),
     103        17114 :             latestEnd(latestEnd_),
     104        17114 :             vehExt(vehExt_),
     105        17114 :             yellow(yellow_),
     106        17114 :             red(red_),
     107        17114 :             next(next_),
     108        17114 :             name(name_)
     109        17114 :         { }
     110              : 
     111              :         /// @brief Destructor
     112        58812 :         ~PhaseDefinition() { }
     113              : 
     114              :         /** @brief Comparison operator
     115              :          * @param[in] pd A second phase
     116              :          * @return Whether this and the given phases are same
     117              :          */
     118              :         bool operator!=(const PhaseDefinition& pd) const {
     119              :             return ((pd.duration != duration) ||
     120              :                     (pd.minDur != minDur) ||
     121              :                     (pd.maxDur != maxDur) ||
     122              :                     (pd.earliestEnd != earliestEnd) ||
     123              :                     (pd.latestEnd != latestEnd) ||
     124              :                     (pd.state != state) ||
     125              :                     (pd.next != next) ||
     126              :                     (pd.name != name));
     127              :         }
     128              : 
     129              :     };
     130              : 
     131              : 
     132              :     /** @brief Constructor
     133              :      * @param[in] id The id of the traffic light
     134              :      * @param[in] subid The id of the program
     135              :      * @param[in] noLinks Number of links that are controlled by this tls. 0 means the value is not known beforehand
     136              :      * @param[in] offset The offset of the program (delay)
     137              :      * @param[in] type The algorithm type for the computed traffic light
     138              :      */
     139              :     NBTrafficLightLogic(const std::string& id, const std::string& subid, int noLinks,
     140              :                         SUMOTime offset = 0, TrafficLightType type = TrafficLightType::STATIC);
     141              : 
     142              : 
     143              :     /** @brief Copy Constructor
     144              :      * @param[in] logic The logic to copy
     145              :      */
     146              :     NBTrafficLightLogic(const NBTrafficLightLogic* logic);
     147              : 
     148              : 
     149              :     /// @brief Destructor
     150              :     ~NBTrafficLightLogic();
     151              : 
     152              : 
     153              :     /** @brief Adds a phase to the logic (static)
     154              :      *
     155              :      * @param[in] duration The duration of the phase to add
     156              :      * @param[in] state The state definition of a tls phase
     157              :      * @param[in] name The name of the phase
     158              :      * @param[in] next The index of the next phase
     159              :      * @param[in] index The index of the new phase (-1 means append to end)
     160              :      * @note: the length of the state has to match the number of links
     161              :      *        and the length given in previous calls to addStep (throws ProcessError)
     162              :      */
     163              :     void addStep(const SUMOTime duration, const std::string& state, const std::vector<int>& next = std::vector<int>(),
     164              :                  const std::string& name = "", const int index = -1);
     165              : 
     166              :     /** @brief Adds a phase to the logic (actuated)
     167              :      *
     168              :      * @param[in] duration The duration of the phase to add
     169              :      * @param[in] state The state definition of a tls phase
     170              :      * @param[in] name The name of the phase
     171              :      * @param[in] minDur The minimum duration of the phase to add
     172              :      * @param[in] maxDur The maximum duration of the phase to add
     173              :      * @param[in] earliestEnd The earliest end of the phase to add
     174              :      * @param[in] latestEnd The latest end of the phase to add
     175              :      * @param[in] vehExt The vehExt of the phase to add
     176              :      * @param[in] yellow The yellow of the phase to add
     177              :      * @param[in] red The red of the phase to add
     178              :      * @param[in] next The index of the next phase
     179              :      * @param[in] index The index of the new phase (-1 means append to end)
     180              :      * @note: the length of the state has to match the number of links
     181              :      *        and the length given in previous calls to addStep (throws ProcessError)
     182              :      */
     183              :     void addStep(const SUMOTime duration, const std::string& state, const SUMOTime minDur, const SUMOTime maxDur, const SUMOTime earliestEnd,
     184              :                  const SUMOTime latestEnd,
     185              :                  const SUMOTime vehExt = -1, // UNSPECIFIED_DURATION
     186              :                  const SUMOTime yellow = -1, // UNSPECIFIED_DURATION
     187              :                  const SUMOTime red = -1, // UNSPECIFIED_DURATION
     188              :                  const std::string& name = "",
     189              :                  const std::vector<int>& next = std::vector<int>(),
     190              :                  int index = -1);
     191              : 
     192              :     /** @brief Modifies the state for an existing phase (used by netedit)
     193              :      * @param[in] phaseIndex The index of the phase to modify
     194              :      * @param[in] tlIndex The index at which to modify the state
     195              :      * @param[in] linkState The new link state for the given index
     196              :      */
     197              :     void setPhaseState(int phaseIndex, int tlIndex, LinkState linkState);
     198              : 
     199              :     /** @brief Modifies the duration for an existing phase (used by netedit)
     200              :      * @param[in] phaseIndex The index of the phase to modify
     201              :      * @param[in] duration The new duration for this phase
     202              :      */
     203              :     void setPhaseDuration(int phaseIndex, SUMOTime duration);
     204              : 
     205              :     /** @brief Modifies the min duration for an existing phase (used by netedit)
     206              :      * @param[in] phaseIndex The index of the phase to modify
     207              :      * @param[in] duration The new min duration for this phase
     208              :      */
     209              :     void setPhaseMinDuration(int phaseIndex, SUMOTime duration);
     210              : 
     211              :     /** @brief Modifies the max duration for an existing phase (used by netedit)
     212              :      * @param[in] phaseIndex The index of the phase to modify
     213              :      * @param[in] duration The new max duration for this phase
     214              :      */
     215              :     void setPhaseMaxDuration(int phaseIndex, SUMOTime duration);
     216              : 
     217              :     /** @brief Modifies the min duration for an existing phase (used by netedit)
     218              :      * @param[in] phaseIndex The index of the phase to modify
     219              :      * @param[in] duration The new earliestEnd for this phase
     220              :      */
     221              :     void setPhaseEarliestEnd(int phaseIndex, SUMOTime duration);
     222              : 
     223              :     /** @brief Modifies the max duration for an existing phase (used by netedit)
     224              :      * @param[in] phaseIndex The index of the phase to modify
     225              :      * @param[in] duration The new latestEnd for this phase
     226              :      */
     227              :     void setPhaseLatestEnd(int phaseIndex, SUMOTime duration);
     228              : 
     229              :     /** @brief Modifies the veh ex for an existing phase (used by netedit)
     230              :      * @param[in] phaseIndex The index of the phase to modify
     231              :      * @param[in] duration The new vehEx for this phase
     232              :      */
     233              :     void setPhaseVehExt(int phaseIndex, SUMOTime duration);
     234              : 
     235              :     /** @brief Modifies the veh ex for an existing phase (used by netedit)
     236              :     * @param[in] phaseIndex The index of the phase to modify
     237              :     * @param[in] duration The new vehEx for this phase
     238              :     */
     239              :     void setPhaseYellow(int phaseIndex, SUMOTime duration);
     240              : 
     241              :     /** @brief Modifies the veh ex for an existing phase (used by netedit)
     242              :     * @param[in] phaseIndex The index of the phase to modify
     243              :     * @param[in] duration The new vehEx for this phase
     244              :     */
     245              :     void setPhaseRed(int phaseIndex, SUMOTime duration);
     246              : 
     247              :     /** @brief Modifies the next phase (used by netedit)
     248              :      * @param[in] phaseIndex The index of the phase to modify
     249              :      * @param[in] duration The new duration for this phase
     250              :      */
     251              :     void setPhaseNext(int phaseIndex, const std::vector<int>& next);
     252              : 
     253              :     /** @brief Modifies the phase name (used by netedit)
     254              :      * @param[in] phaseIndex The index of the phase to modify
     255              :      * @param[in] duration The new duration for this phase
     256              :      */
     257              :     void setPhaseName(int phaseIndex, const std::string& name);
     258              : 
     259              :     /** @brief override state with the given character(used by netedit)
     260              :      * @param[in] phaseIndex The index of the phase to modify
     261              :      * @param[in] c the character to override (r, y, g, G...)
     262              :      */
     263              :     void overrideState(int phaseIndex, const char c);
     264              : 
     265              :     /* @brief deletes the phase at the given index
     266              :      * @note throws InvalidArgument on out-of range index
     267              :      */
     268              :     void deletePhase(int index);
     269              : 
     270              :     /* @brief swap phases
     271              :      * @note throws InvalidArgument on out-of range index
     272              :      */
     273              :     void swapPhase(int indexPhaseA, int indexPhaseB);
     274              : 
     275              :     /// @brief swap first phase
     276              :     void swapfirstPhase();
     277              : 
     278              :     /// @brief swap first phase
     279              :     void swaplastPhase();
     280              : 
     281              :     /* @brief changes state size either by cutting of at the end or by adding
     282              :      * new states at the end
     283              :      */
     284              :     void setStateLength(int numLinks, LinkState fill = LINKSTATE_TL_RED);
     285              : 
     286              :     /// @brief remove the index from all phase states
     287              :     void deleteStateIndex(int index);
     288              : 
     289              :     /// @brief deletes all phases and reset the expect number of links
     290              :     void resetPhases();
     291              : 
     292              :     /** @brief closes the building process
     293              :      *
     294              :      * Joins equal steps.
     295              :      */
     296              :     void closeBuilding(bool checkVarDurations = true);
     297              : 
     298              :     /// @brief Returns the duration of the complete cycle
     299              :     SUMOTime getDuration() const;
     300              : 
     301              :     /** @brief Sets the offset of this tls
     302              :      * @param[in] offset The offset of this cycle
     303              :      */
     304              :     void setOffset(SUMOTime offset) {
     305            7 :         myOffset = offset;
     306            4 :     }
     307              : 
     308              :     /// @brief Returns the ProgramID
     309              :     const std::string& getProgramID() const {
     310         4195 :         return mySubID;
     311              :     };
     312              : 
     313              :     /// @brief Returns the phases
     314              :     const std::vector<PhaseDefinition>& getPhases() const {
     315          547 :         return myPhases;
     316              :     }
     317              : 
     318              :     /// @brief copy phase values in other
     319              :     void copyPhase(const int origin, const int destination) {
     320              :         myPhases.at(destination) = myPhases.at(origin);
     321              :     }
     322              : 
     323              :     /// @brief Returns the offset of first switch
     324              :     SUMOTime getOffset() const {
     325         2726 :         return myOffset;
     326              :     };
     327              : 
     328              :     /// @brief Returns the number of participating links
     329              :     int getNumLinks() {
     330        19943 :         return myNumLinks;
     331              :     }
     332              : 
     333              :     /// @brief get the algorithm type (static etc..)
     334              :     TrafficLightType getType() const {
     335         5473 :         return myType;
     336              :     }
     337              : 
     338              :     /// @brief set the algorithm type (static etc..)
     339              :     void setType(TrafficLightType type) {
     340            5 :         myType = type;
     341              :     }
     342              : 
     343              :     /** @brief Sets the programID
     344              :      * @param[in] programID The new ID of the program (subID)
     345              :      */
     346              :     void setProgramID(const std::string& programID) {
     347            0 :         mySubID = programID;
     348              :     }
     349              : 
     350              : private:
     351              :     /// @brief The number of participating links
     352              :     int myNumLinks;
     353              : 
     354              :     /// @brief The tls program's subid
     355              :     std::string mySubID;
     356              : 
     357              :     /// @brief The tls program's offset
     358              :     SUMOTime myOffset;
     359              : 
     360              :     /// @brief Definition of a vector of traffic light phases
     361              :     typedef std::vector<PhaseDefinition> PhaseDefinitionVector;
     362              : 
     363              :     /// @brief The junction logic's storage for traffic light phase list
     364              :     PhaseDefinitionVector myPhases;
     365              : 
     366              :     /// @brief The algorithm type for the traffic light
     367              :     TrafficLightType myType;
     368              : 
     369              :     /// @brief Invalidated assignment operator
     370              :     NBTrafficLightLogic& operator=(const NBTrafficLightLogic& s) = delete;
     371              : };
        

Generated by: LCOV version 2.0-1