use crate::components::{FloorPosition, Orientation};
use crate::dispatch::{BuiltinReposition, BuiltinStrategy, HallCallMode};
use crate::stop::{StopConfig, StopId};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, 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: f64,
pub acceleration: f64,
pub deceleration: f64,
pub weight_capacity: f64,
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: 2.0,
acceleration: 1.5,
deceleration: 2.0,
weight_capacity: 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(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SimulationParams {
pub ticks_per_second: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PassengerSpawnConfig {
pub mean_interval_ticks: u32,
pub weight_range: (f64, f64),
}
#[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<FloorPosition>,
#[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>,
}