use crate::components::{Accel, Orientation, SpatialPosition, Speed, Weight};
use crate::dispatch::{BuiltinReposition, BuiltinStrategy, HallCallMode};
use crate::stop::{StopConfig, StopId};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SimConfig {
pub building: BuildingConfig,
#[serde(default)]
pub elevators: Vec<ElevatorConfig>,
pub simulation: SimulationParams,
pub passenger_spawning: PassengerSpawnConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BuildingConfig {
pub name: String,
pub stops: Vec<StopConfig>,
#[serde(default)]
pub lines: Option<Vec<LineConfig>>,
#[serde(default)]
pub groups: Option<Vec<GroupConfig>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ElevatorConfig {
pub id: u32,
pub name: String,
pub max_speed: Speed,
pub acceleration: Accel,
pub deceleration: Accel,
pub weight_capacity: Weight,
pub starting_stop: StopId,
pub door_open_ticks: u32,
pub door_transition_ticks: u32,
#[serde(default)]
pub restricted_stops: Vec<StopId>,
#[cfg(feature = "energy")]
#[serde(default)]
pub energy_profile: Option<crate::energy::EnergyProfile>,
#[serde(default)]
pub service_mode: Option<crate::components::ServiceMode>,
#[serde(default = "default_inspection_speed_factor")]
pub inspection_speed_factor: f64,
}
const fn default_inspection_speed_factor() -> f64 {
0.25
}
impl Default for ElevatorConfig {
fn default() -> Self {
Self {
id: 0,
name: "Elevator 1".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: default_inspection_speed_factor(),
}
}
}
impl Default for BuildingConfig {
fn default() -> Self {
Self {
name: "Building".into(),
stops: Vec::new(),
lines: None,
groups: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SimulationParams {
pub ticks_per_second: f64,
}
impl Default for SimulationParams {
fn default() -> Self {
Self {
ticks_per_second: 60.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PassengerSpawnConfig {
pub mean_interval_ticks: u32,
pub weight_range: (f64, f64),
}
impl Default for PassengerSpawnConfig {
fn default() -> Self {
Self {
mean_interval_ticks: 120,
weight_range: (50.0, 100.0),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct LineConfig {
pub id: u32,
pub name: String,
pub serves: Vec<StopId>,
pub elevators: Vec<ElevatorConfig>,
#[serde(default)]
pub orientation: Orientation,
#[serde(default)]
pub position: Option<SpatialPosition>,
#[serde(default)]
pub min_position: Option<f64>,
#[serde(default)]
pub max_position: Option<f64>,
#[serde(default)]
pub max_cars: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroupConfig {
pub id: u32,
pub name: String,
pub lines: Vec<u32>,
pub dispatch: BuiltinStrategy,
#[serde(default)]
pub reposition: Option<BuiltinReposition>,
#[serde(default)]
pub hall_call_mode: Option<HallCallMode>,
#[serde(default)]
pub ack_latency_ticks: Option<u32>,
}