mod accessors;
mod calls;
mod construction;
mod destinations;
mod eta;
mod lifecycle;
mod manual;
mod rider;
mod runtime;
pub(crate) mod strategy_set;
mod substep;
mod tagging;
mod topology;
pub(crate) use strategy_set::{DispatcherSet, RepositionerSet};
#[allow(clippy::redundant_pub_crate)]
pub(crate) mod transition;
pub use rider::RiderBuilder;
use crate::components::{Accel, Orientation, SpatialPosition, Speed, Weight};
use crate::dispatch::ElevatorGroup;
use crate::entity::EntityId;
use crate::events::{Event, EventBus};
use crate::hooks::PhaseHooks;
use crate::ids::GroupId;
use crate::metrics::Metrics;
use crate::rider_index::RiderIndex;
use crate::stop::StopId;
use crate::time::TimeAdapter;
use crate::topology::TopologyGraph;
use crate::world::World;
use std::collections::{HashMap, HashSet};
use std::fmt;
use std::sync::Mutex;
#[derive(Debug, Clone)]
pub struct ElevatorParams {
pub max_speed: Speed,
pub acceleration: Accel,
pub deceleration: Accel,
pub weight_capacity: Weight,
pub door_transition_ticks: u32,
pub door_open_ticks: u32,
pub restricted_stops: HashSet<EntityId>,
pub inspection_speed_factor: f64,
pub bypass_load_up_pct: Option<f64>,
pub bypass_load_down_pct: Option<f64>,
}
impl Default for ElevatorParams {
fn default() -> Self {
Self {
max_speed: Speed::from(2.0),
acceleration: Accel::from(1.5),
deceleration: Accel::from(2.0),
weight_capacity: Weight::from(800.0),
door_transition_ticks: 5,
door_open_ticks: 10,
restricted_stops: HashSet::new(),
inspection_speed_factor: 0.25,
bypass_load_up_pct: None,
bypass_load_down_pct: None,
}
}
}
#[derive(Debug, Clone)]
pub struct LineParams {
pub name: String,
pub group: GroupId,
pub orientation: Orientation,
pub min_position: f64,
pub max_position: f64,
pub position: Option<SpatialPosition>,
pub max_cars: Option<usize>,
}
impl LineParams {
pub fn new(name: impl Into<String>, group: GroupId) -> Self {
Self {
name: name.into(),
group,
orientation: Orientation::default(),
min_position: 0.0,
max_position: 0.0,
position: None,
max_cars: None,
}
}
}
pub struct Simulation {
world: World,
events: EventBus,
pending_output: Vec<Event>,
tick: u64,
dt: f64,
groups: Vec<ElevatorGroup>,
stop_lookup: HashMap<StopId, EntityId>,
dispatcher_set: DispatcherSet,
repositioner_set: RepositionerSet,
metrics: Metrics,
time: TimeAdapter,
hooks: PhaseHooks,
elevator_ids_buf: Vec<EntityId>,
reposition_buf: Vec<(EntityId, EntityId)>,
pub(crate) dispatch_scratch: crate::dispatch::DispatchScratch,
topo_graph: Mutex<TopologyGraph>,
rider_index: RiderIndex,
tick_in_progress: bool,
}
impl Simulation {
#[must_use]
pub(crate) const fn tick_in_progress(&self) -> bool {
self.tick_in_progress
}
pub(crate) const fn set_tick_in_progress(&mut self, in_progress: bool) {
self.tick_in_progress = in_progress;
}
}
impl fmt::Debug for Simulation {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Simulation")
.field("tick", &self.tick)
.field("dt", &self.dt)
.field("groups", &self.groups.len())
.field("entities", &self.world.entity_count())
.finish_non_exhaustive()
}
}