LCOV - code coverage report
Current view: top level - src/microsim - MSMoveReminder.h (source / functions) Coverage Total Hit
Test: lcov.info Lines: 100.0 % 23 23
Test Date: 2025-11-13 15:38:19 Functions: 91.7 % 12 11

            Line data    Source code
       1              : /****************************************************************************/
       2              : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3              : // Copyright (C) 2003-2025 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    MSMoveReminder.h
      15              : /// @author  Christian Roessel
      16              : /// @author  Daniel Krajzewicz
      17              : /// @author  Sascha Krieg
      18              : /// @author  Michael Behrisch
      19              : /// @author  Jakob Erdmann
      20              : /// @date    2003-05-21
      21              : ///
      22              : // Something on a lane to be noticed about vehicle movement
      23              : /****************************************************************************/
      24              : #pragma once
      25              : #include <config.h>
      26              : 
      27              : #include <iostream>
      28              : #include <map>
      29              : #include <utils/common/SUMOTime.h>
      30              : #include <utils/common/StdDefs.h>
      31              : #include <utils/common/StringBijection.h>
      32              : #ifdef HAVE_FOX
      33              : #include <utils/foxtools/fxheader.h>
      34              : #endif
      35              : 
      36              : 
      37              : // ===========================================================================
      38              : // class declarations
      39              : // ===========================================================================
      40              : class SUMOTrafficObject;
      41              : class OutputDevice;
      42              : class MSLane;
      43              : 
      44              : 
      45              : // ===========================================================================
      46              : // class definitions
      47              : // ===========================================================================
      48              : /**
      49              :  * @class MSMoveReminder
      50              :  * @brief Something on a lane to be noticed about vehicle movement
      51              :  *
      52              :  * Base class of all move-reminders. During move, the vehicles call
      53              :  *  notifyMove() for all reminders on their current lane (all lanes
      54              :  *  they pass during one step). If a vehicle enters the lane the reminder is
      55              :  *  positioned at during insertion or lanechange notifyEnter() is
      56              :  *  called. If a vehicle leaves the reminder lane it calls notifyLeave().
      57              :  *
      58              :  * The reminder knows whom to tell about move, insertion and lanechange. The
      59              :  * vehicles will remove the reminder that is not notifyMove() from
      60              :  * their reminder container.
      61              :  *
      62              :  * @see MSLane::addMoveReminder
      63              :  * @see MSLane::getMoveReminder
      64              :  * @note: cannot inherit from Named because it would couse double inheritance
      65              :  */
      66              : class MSMoveReminder {
      67              : public:
      68              :     /** @brief Constructor.
      69              :      *
      70              :      * @param[in] lane Lane on which the reminder will work.
      71              :      * @param[in] doAdd whether to add the reminder to the lane
      72              :      */
      73              :     MSMoveReminder(const std::string& description, MSLane* const lane = nullptr, const bool doAdd = true);
      74              : 
      75              : 
      76              :     /** @brief Destructor
      77              :      */
      78     15110190 :     virtual ~MSMoveReminder() {}
      79              : 
      80              : 
      81              :     /** @brief Returns the lane the reminder works on.
      82              :      *
      83              :      * @return The lane the reminder is anchored on.
      84              :      */
      85              :     const MSLane* getLane() const {
      86    167783327 :         return myLane;
      87              :     }
      88              : 
      89              : 
      90              :     /// @brief Definition of a vehicle state
      91              :     enum Notification {
      92              :         /// @brief The vehicle has departed (was inserted into the network)
      93              :         NOTIFICATION_DEPARTED,
      94              :         /// @brief The vehicle arrived at a junction
      95              :         NOTIFICATION_JUNCTION,
      96              :         /// @brief The vehicle changes the segment (meso only)
      97              :         NOTIFICATION_SEGMENT,
      98              :         /// @brief The vehicle changes lanes (micro only)
      99              :         NOTIFICATION_LANE_CHANGE,
     100              :         /// @brief The vehicle has been loaded from a state file
     101              :         NOTIFICATION_LOAD_STATE,
     102              :         /* All notifications below must result in the vehicle not being on the net
     103              :          * (onLeaveLane sets amOnNet=false if reason>=NOTIFICATION_TELEPORT) */
     104              :         /// @brief The vehicle is being teleported
     105              :         NOTIFICATION_TELEPORT,
     106              :         /// @brief The vehicle continues being teleported past an edge
     107              :         NOTIFICATION_TELEPORT_CONTINUATION,
     108              :         /// @brief The vehicle starts or ends parking
     109              :         NOTIFICATION_PARKING,
     110              :         /// @brief The vehicle changed it's route
     111              :         NOTIFICATION_REROUTE,
     112              :         /// @brief The vehicle needs another parking area
     113              :         NOTIFICATION_PARKING_REROUTE,
     114              :         /// @brief The vehicle arrived at its destination (is deleted)
     115              :         NOTIFICATION_ARRIVED, // arrived and everything after is treated as permanent deletion from the net
     116              :         /// @brief The vehicle was teleported out of the net
     117              :         NOTIFICATION_TELEPORT_ARRIVED,
     118              :         /// @brief The vehicle got removed by a calibrator
     119              :         NOTIFICATION_VAPORIZED_CALIBRATOR,
     120              :         /// @brief The vehicle got removed by a collision
     121              :         NOTIFICATION_VAPORIZED_COLLISION,
     122              :         /// @brief The vehicle got removed via TraCI
     123              :         NOTIFICATION_VAPORIZED_TRACI,
     124              :         /// @brief The vehicle got removed via the GUI
     125              :         NOTIFICATION_VAPORIZED_GUI,
     126              :         /// @brief The vehicle got vaporized with a vaporizer
     127              :         NOTIFICATION_VAPORIZED_VAPORIZER,
     128              :         /// @brief The vehicle got removed via stationfinder device
     129              :         NOTIFICATION_VAPORIZED_BREAKDOWN,
     130              :         /// @brief must be the last one
     131              :         NOTIFICATION_NONE
     132              :     };
     133              : 
     134              : 
     135              :     /// @name Interface methods, to be derived by subclasses
     136              :     /// @{
     137              : 
     138              :     /** @brief Checks whether the reminder is activated by a vehicle entering the lane
     139              :      *
     140              :      * Lane change means in this case that the vehicle changes to the lane
     141              :      *  the reminder is placed at.
     142              :      *
     143              :      * @param[in] veh The entering vehicle.
     144              :      * @param[in] reason how the vehicle enters the lane
     145              :      * @return True if vehicle enters the reminder.
     146              :      * @see Notification
     147              :      */
     148       525074 :     virtual bool notifyEnter(SUMOTrafficObject& veh, Notification reason, const MSLane* enteredLane) {
     149              :         UNUSED_PARAMETER(reason);
     150              :         UNUSED_PARAMETER(&veh);
     151              :         UNUSED_PARAMETER(&enteredLane);
     152       525074 :         return true;
     153              :     }
     154              : 
     155              : 
     156              :     /** @brief Checks whether the reminder still has to be notified about the vehicle moves
     157              :      *
     158              :      * Indicator if the reminders is still active for the passed
     159              :      * vehicle/parameters. If false, the vehicle will erase this reminder
     160              :      * from its reminder-container.
     161              :      *
     162              :      * @param[in] veh Vehicle that asks this reminder.
     163              :      * @param[in] oldPos Position before move.
     164              :      * @param[in] newPos Position after move with newSpeed.
     165              :      * @param[in] newSpeed Moving speed.
     166              :      *
     167              :      * @return True if vehicle hasn't passed the reminder completely.
     168              :      */
     169    135367140 :     virtual bool notifyMove(SUMOTrafficObject& veh,
     170              :                             double oldPos,
     171              :                             double newPos,
     172              :                             double newSpeed) {
     173              :         UNUSED_PARAMETER(oldPos);
     174              :         UNUSED_PARAMETER(newPos);
     175              :         UNUSED_PARAMETER(newSpeed);
     176              :         UNUSED_PARAMETER(&veh);
     177    135367140 :         return true;
     178              :     }
     179              : 
     180              :     /** @brief Computes idling emission values and adds them to the emission sums
     181              :     *
     182              :     * Idling implied by zero velocity, acceleration and slope
     183              :     *
     184              :     * @param[in] veh The vehicle
     185              :     *
     186              :     * @see MSMoveReminder::notifyMove
     187              :     * @see PollutantsInterface
     188              :     */
     189       160367 :     virtual bool notifyIdle(SUMOTrafficObject& veh) {
     190              :         UNUSED_PARAMETER(&veh);
     191       160367 :         return true;
     192              :     }
     193              : 
     194              :     /// @brief called to update state for parking vehicles
     195      8048433 :     virtual void notifyParking() {}
     196              : 
     197              :     /// @brief called to update state for stopped vehicles
     198        48274 :     virtual void notifyStopEnded() {}
     199              : 
     200              :     /** @brief Called if the vehicle leaves the reminder's lane
     201              :      *
     202              :      * Informs if vehicle leaves reminder lane (due to lane change, removal
     203              :      *  from the network, or leaving to the next lane).
     204              :      *  The default is to do nothing.
     205              :      *
     206              :      * @param[in] veh The leaving vehicle.
     207              :      * @param[in] lastPos Position on the lane when leaving.
     208              :      * @param[in] reason how the vehicle leaves the lane
     209              :      * @see Notification
     210              :      *
     211              :      * @return True if the reminder wants to receive further info.
     212              :      */
     213       600458 :     virtual bool notifyLeave(SUMOTrafficObject& veh, double lastPos, Notification reason, const MSLane* enteredLane = nullptr) {
     214              :         UNUSED_PARAMETER(&veh);
     215              :         UNUSED_PARAMETER(lastPos);
     216              :         UNUSED_PARAMETER(reason);
     217              :         UNUSED_PARAMETER(enteredLane);
     218       600458 :         return true;
     219              :     }
     220              : 
     221              :     /** @brief Called if the vehicle's back leaves the reminder's lane
     222              :      *
     223              :      * Informs if vehicle back leaves reminder lane (due to lane change, removal
     224              :      *  from the network, or leaving to the next lane).
     225              :      *  The default is to do nothing.
     226              :      *
     227              :      * @param[in] veh The leaving vehicle.
     228              :      * @param[in] reason how the vehicle leaves the lane
     229              :      * @param[in] leftLane The lane that the vehicle's back left
     230              :      * @see Notification
     231              :      *
     232              :      * @return True if the reminder wants to receive further info.
     233              :      */
     234        61174 :     virtual bool notifyLeaveBack(SUMOTrafficObject& veh, Notification reason, const MSLane* leftLane) {
     235              :         UNUSED_PARAMETER(&veh);
     236              :         UNUSED_PARAMETER(reason);
     237              :         UNUSED_PARAMETER(leftLane);
     238        61174 :         return true;
     239              :     }
     240              : 
     241              :     /** @brief Called if the vehicle change it's route
     242              :      * @param[in] veh The rerouted vehicle.
     243              :      * @return True if the reminder wants to receive further info.
     244              :      */
     245         1666 :     virtual bool notifyReroute(SUMOTrafficObject& veh) {
     246              :         UNUSED_PARAMETER(&veh);
     247         1666 :         return true;
     248              :     }
     249              : 
     250              :     // TODO: Documentation
     251              :     void updateDetector(SUMOTrafficObject& veh, double entryPos, double leavePos,
     252              :                         SUMOTime entryTime, SUMOTime currentTime, SUMOTime leaveTime,
     253              :                         bool cleanUp);
     254              : 
     255              :     /// @}
     256              : 
     257              :     /** @brief Internal notification about the vehicle moves.
     258              :      *  @note meso uses this though it never calls notifyMove()
     259              :      *
     260              :      * Indicator if the reminders is still active for the passed
     261              :      * vehicle/parameters. If false, the vehicle will erase this reminder
     262              :      * from its reminder-container.
     263              :      *
     264              :      * @param[in] veh Vehicle that asks this reminder.
     265              :      * @param[in] frontOnLane time the front of the vehicle spent on the lane.
     266              :      * @param[in] timeOnLane time some part of the vehicle spent on the lane.
     267              :      * @param[in] meanSpeedFrontOnLane Average speed for the time that the front is on the lane.
     268              :      * @param[in] meanSpeedVehicleOnLane Average speed for the time that the vehicle is on the lane (with front or back).
     269              :      * @param[in] travelledDistanceFrontOnLane distance travelled while overlapping with the lane.
     270              :      * @param[in] travelledDistanceVehicleOnLane distance travelled while front was on the lane.
     271              :      * @param[in] meanLengthOnLane the average length of the vehicle's part on the lane during the last step (==complete length in meso case)
     272              :      */
     273      7985556 :     virtual void notifyMoveInternal(const SUMOTrafficObject& veh,
     274              :                                     const double frontOnLane,
     275              :                                     const double timeOnLane,
     276              :                                     const double meanSpeedFrontOnLane,
     277              :                                     const double meanSpeedVehicleOnLane,
     278              :                                     const double travelledDistanceFrontOnLane,
     279              :                                     const double travelledDistanceVehicleOnLane,
     280              :                                     const double meanLengthOnLane) {
     281              :         UNUSED_PARAMETER(&veh);
     282              :         UNUSED_PARAMETER(frontOnLane);
     283              :         UNUSED_PARAMETER(timeOnLane);
     284              :         UNUSED_PARAMETER(meanSpeedFrontOnLane);
     285              :         UNUSED_PARAMETER(meanSpeedVehicleOnLane);
     286              :         UNUSED_PARAMETER(travelledDistanceFrontOnLane);
     287              :         UNUSED_PARAMETER(travelledDistanceVehicleOnLane);
     288              :         UNUSED_PARAMETER(meanLengthOnLane);
     289      7985556 :     }
     290              : 
     291              :     void setDescription(const std::string& description) {
     292        30685 :         myDescription = description;
     293        30685 :     }
     294              : 
     295              :     const std::string& getDescription() const {
     296          197 :         return myDescription;
     297              :     }
     298              : 
     299              :     // @brief return whether this moveReminder triggers parking reroute
     300        21224 :     virtual bool isParkingRerouter() const {
     301        21224 :         return false;
     302              :     }
     303              : 
     304              :     /** @brief Saves the current state into the given stream */
     305              :     void saveReminderState(OutputDevice& out, const SUMOTrafficObject& veh);
     306              : 
     307              :     void loadReminderState(long long int numID, SUMOTime time, double pos);
     308              : 
     309              :     static StringBijection<Notification> Notifications;
     310              : 
     311              : protected:
     312              :     void removeFromVehicleUpdateValues(SUMOTrafficObject& veh);
     313              : 
     314              : protected:
     315              : 
     316              :     /// @brief Lane on which the reminder works
     317              :     MSLane* myLane;
     318              :     /// @brief a description of this moveReminder
     319              :     std::string myDescription;
     320              : 
     321              : #ifdef HAVE_FOX
     322              :     /// @brief the mutex for notifications
     323              :     mutable FXMutex myNotificationMutex;
     324              : #endif
     325              : 
     326              : private:
     327              :     std::map<long long int, std::pair<SUMOTime, double> > myLastVehicleUpdateValues;
     328              :     static StringBijection<Notification>::Entry NotificationValues[];
     329              : 
     330              : 
     331              : private:
     332              :     MSMoveReminder& operator=(const MSMoveReminder&); // just to avoid a compiler warning
     333              : 
     334              : };
        

Generated by: LCOV version 2.0-1