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 : }