use crate::components::{Accel, RiderPhase, Speed, Weight};
use crate::config::*;
use crate::dispatch::scan::ScanDispatch;
use crate::sim::Simulation;
use crate::stop::{StopConfig, StopId};
pub fn default_config() -> SimConfig {
SimConfig {
building: BuildingConfig {
name: "Test Building".into(),
stops: vec![
StopConfig {
id: StopId(0),
name: "Ground".into(),
position: 0.0,
},
StopConfig {
id: StopId(1),
name: "Floor 2".into(),
position: 4.0,
},
StopConfig {
id: StopId(2),
name: "Floor 3".into(),
position: 8.0,
},
],
lines: None,
groups: None,
},
elevators: vec![ElevatorConfig {
id: 0,
name: "Main".into(),
max_speed: Speed::from(2.0),
acceleration: Accel::from(1.5),
deceleration: Accel::from(2.0),
weight_capacity: Weight::from(800.0),
starting_stop: StopId(0),
door_open_ticks: 10,
door_transition_ticks: 5,
restricted_stops: Vec::new(),
#[cfg(feature = "energy")]
energy_profile: None,
service_mode: None,
inspection_speed_factor: 0.25,
bypass_load_up_pct: None,
bypass_load_down_pct: None,
}],
simulation: SimulationParams {
ticks_per_second: 60.0,
},
passenger_spawning: PassengerSpawnConfig {
mean_interval_ticks: 120,
weight_range: (50.0, 100.0),
},
}
}
pub fn all_riders_arrived(sim: &Simulation) -> bool {
sim.world()
.iter_riders()
.all(|(_, r)| r.phase == RiderPhase::Arrived)
}
pub fn scan() -> ScanDispatch {
ScanDispatch::new()
}
pub fn multi_floor_config(stops: usize, cars: usize) -> SimConfig {
assert!(stops >= 2, "multi_floor_config requires at least 2 stops");
assert!(cars >= 1, "multi_floor_config requires at least 1 car");
let stop_configs: Vec<StopConfig> = (0..stops)
.map(|i| StopConfig {
id: StopId(i as u32),
name: format!("Floor {i}"),
position: i as f64 * 4.0,
})
.collect();
let elevators: Vec<ElevatorConfig> = (0..cars)
.map(|i| ElevatorConfig {
id: i as u32,
name: format!("Car {i}"),
max_speed: Speed::from(2.0),
acceleration: Accel::from(1.5),
deceleration: Accel::from(2.0),
weight_capacity: Weight::from(800.0),
starting_stop: StopId(0),
door_open_ticks: 10,
door_transition_ticks: 5,
restricted_stops: Vec::new(),
#[cfg(feature = "energy")]
energy_profile: None,
service_mode: None,
inspection_speed_factor: 0.25,
bypass_load_up_pct: None,
bypass_load_down_pct: None,
})
.collect();
SimConfig {
building: BuildingConfig {
name: format!("{stops}-stop test building"),
stops: stop_configs,
lines: None,
groups: None,
},
elevators,
simulation: SimulationParams {
ticks_per_second: 60.0,
},
passenger_spawning: PassengerSpawnConfig {
mean_interval_ticks: 120,
weight_range: (50.0, 100.0),
},
}
}
pub fn run_until_done(sim: &mut Simulation, max_ticks: u64) -> bool {
for _ in 0..max_ticks {
sim.step();
sim.drain_events();
let all_terminal = sim
.world()
.iter_riders()
.all(|(_, r)| matches!(r.phase, RiderPhase::Arrived | RiderPhase::Abandoned));
if all_terminal {
return true;
}
}
false
}