LCOV - code coverage report
Current view: top level - app/src/Dynamic/Env/Event - EventDespawnVehicle.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 42 0.0 %
Date: 2023-08-17 16:45:52 Functions: 0 2 0.0 %

          Line data    Source code
       1             : #include "Dynamic/Env/Event/EventDespawnVehicle.hpp"
       2             : 
       3             : #include <spdlog/spdlog.h>
       4             : 
       5             : #include <stdexcept>
       6             : 
       7             : #include "Dynamic/Env/Event/EventPopQueue.hpp"
       8             : #include "Dynamic/Env/Event/EventUpdateVehicle.hpp"
       9             : 
      10             : using namespace std;
      11             : using namespace Dynamic::Env;
      12             : 
      13           0 : EventDespawnVehicle::EventDespawnVehicle(Time t_, Vehicle::ID vehicleID_):
      14             :     Event(t_),
      15           0 :     vehicleID(vehicleID_) {}
      16             : 
      17           0 : void EventDespawnVehicle::process(Env &env) {
      18           0 :     Vehicle *vehiclePtr = nullptr;
      19           0 :     try {
      20           0 :         vehiclePtr = &env.getVehicle(vehicleID);
      21           0 :     } catch(const out_of_range &e) {
      22             :         // Vehicle does not exist
      23           0 :         return;
      24             :     }
      25           0 :     Vehicle &vehicle = *vehiclePtr;
      26             : 
      27           0 :     Time waitingFor = env.getTime() - vehicle.lastMoveTime;
      28           0 :     if(
      29           0 :         vehicle.state != Vehicle::State::STOPPED
      30           0 :         || vehicle != vehicle.position.lane.stopped.front().first.get()
      31           0 :         || waitingFor < env.getDespawnTime() - TIME_EPSILON
      32             :     ) {
      33             :         // Vehicle has been updated since the event was scheduled
      34           0 :         return;
      35             :     }
      36             : 
      37           0 :     spdlog::info(
      38             :         "[t={}] Despawning vehicle {} at lane {}",
      39           0 :         env.getTime(),
      40           0 :         vehicle.id,
      41           0 :         vehicle.position.lane.idAsString()
      42             :     );
      43             : 
      44           0 :     Lane &lane = vehicle.position.lane;
      45             : 
      46             :     // Actually despawn
      47           0 :     assert(!lane.stopped.empty());
      48             : 
      49           0 :     auto p = lane.stopped.front();
      50             : 
      51             :     // Move vehicle at front of queue
      52           0 :     lane.stopped.pop();
      53             : 
      54           0 :     vehicle.state = Vehicle::State::LEFT;
      55           0 :     ++env.numberOfDespawnedVehicles();
      56             : 
      57             :     // Change lastUpdateTime for despawning
      58             :     // clang-format off
      59           0 :     if(
      60           0 :         env.getDespawnTime() < numeric_limits<Time>::infinity() &&
      61           0 :         lane.stopped.size() > 0
      62             :     ) {
      63             :         // clang-format on
      64           0 :         Vehicle &frontVehicle       = lane.stopped.front().first.get();
      65           0 :         frontVehicle.lastUpdateTime = env.getTime();
      66           0 :         frontVehicle.lastMoveTime   = env.getTime();
      67           0 :         env.pushEvent(make_shared<EventDespawnVehicle>(
      68           0 :             env.getTime() + env.getDespawnTime(),
      69           0 :             frontVehicle.id
      70             :         ));
      71             :     }
      72             : 
      73             :     /*
      74             :      * Process next waiting vehicle (instantiate vehicle or get vehicle from
      75             :      * previous queue)
      76             :      */
      77           0 :     lane.processNextWaitingVehicle(env);
      78             : 
      79             :     // TODO: check if EventPopQueue should only be created if !stopped.empty()
      80             :     // Schedule next EventPopQueue
      81           0 :     Time tFuture = env.getTime() + Lane::QUEUE_PERIOD;
      82           0 :     env.pushEvent(make_shared<EventPopQueue>(
      83             :         tFuture,
      84             :         lane
      85             :     ));
      86           0 :     lane.nextPopTime = tFuture;
      87             : 
      88             :     // If queue dissipated, pull from every lane.
      89           0 :     if(lane.stopped.empty()) {
      90           0 :         for(Connection &connection: lane.getIncomingConnections()) {
      91           0 :             Lane &prevLane = connection.fromLane;
      92           0 :             env.pushEvent(make_shared<EventPopQueue>(
      93             :                 tFuture,
      94             :                 prevLane
      95             :             ));
      96             :         }
      97             :     }
      98             : }

Generated by: LCOV version 1.14