use serde::{Deserialize, Serialize};
use geom::{Duration, Speed};
use map_model::{
BuildingID, BusRouteID, BusStopID, CompressedMovementID, IntersectionID, LaneID, Map, Path,
PathRequest, Traversable, TurnID,
};
use crate::{
AgentID, CarID, OffMapLocation, ParkingSpot, PedestrianID, PersonID, TripID, TripMode,
};
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub enum Event {
CarReachedParkingSpot(CarID, ParkingSpot),
CarLeftParkingSpot(CarID, ParkingSpot),
BusArrivedAtStop(CarID, BusRouteID, BusStopID),
BusDepartedFromStop(CarID, BusRouteID, BusStopID),
PassengerBoardsTransit(PersonID, CarID, BusRouteID, BusStopID, Duration),
PassengerAlightsTransit(PersonID, CarID, BusRouteID, BusStopID),
PersonEntersBuilding(PersonID, BuildingID),
PersonLeavesBuilding(PersonID, BuildingID),
PersonLeavesMap(
PersonID,
Option<AgentID>,
IntersectionID,
Option<OffMapLocation>,
),
PersonEntersMap(PersonID, AgentID, IntersectionID, Option<OffMapLocation>),
PersonEntersRemoteBuilding(PersonID, OffMapLocation),
PersonLeavesRemoteBuilding(PersonID, OffMapLocation),
PedReachedParkingSpot(PedestrianID, ParkingSpot),
BikeStoppedAtSidewalk(CarID, LaneID),
AgentEntersTraversable(AgentID, Traversable, Option<usize>),
IntersectionDelayMeasured(CompressedMovementID, Duration, AgentID),
TripFinished {
trip: TripID,
mode: TripMode,
total_time: Duration,
blocked_time: Duration,
},
TripCancelled(TripID),
TripPhaseStarting(TripID, PersonID, Option<PathRequest>, TripPhaseType),
TripIntersectionDelay(TripID, TurnID, AgentID, Duration),
LaneSpeedPercentage(TripID, LaneID, Speed, Speed),
PathAmended(Path),
Alert(AlertLocation, String),
}
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
pub enum AlertLocation {
Nil,
Intersection(IntersectionID),
Person(PersonID),
Building(BuildingID),
}
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)]
pub enum TripPhaseType {
Driving,
Walking,
Biking,
Parking,
WaitingForBus(BusRouteID, BusStopID),
RidingBus(BusRouteID, BusStopID, CarID),
Cancelled,
Finished,
DelayedStart,
Remote,
}
impl TripPhaseType {
pub fn describe(self, map: &Map) -> String {
match self {
TripPhaseType::Driving => "Driving".to_string(),
TripPhaseType::Walking => "Walking".to_string(),
TripPhaseType::Biking => "Biking".to_string(),
TripPhaseType::Parking => "Parking".to_string(),
TripPhaseType::WaitingForBus(r, _) => {
format!("Waiting for bus {}", map.get_br(r).full_name)
}
TripPhaseType::RidingBus(r, _, _) => format!("Riding bus {}", map.get_br(r).full_name),
TripPhaseType::Cancelled => "Trip was cancelled due to some bug".to_string(),
TripPhaseType::Finished => "Trip finished".to_string(),
TripPhaseType::DelayedStart => "Delayed by a previous trip taking too long".to_string(),
TripPhaseType::Remote => "Remote trip outside is the map boundaries".to_string(),
}
}
}