master
Andrew Johnson 6 years ago
parent 594f349137
commit 01d2437d4d

@ -25,9 +25,8 @@ pub fn deserialize(n: u64) -> Box<Building>
pub fn getCarriageFloor(floorHeights: Vec<f64>, height: f64) -> u64
{
let mut c = 0.0;
for fi in 0..floorHeights.len()
{
c += floorHeights[fi];
for (fi, fht) in floorHeights.iter().enumerate() {
c += fht;
if height <= c {
return (fi as u64)
}
@ -37,12 +36,7 @@ pub fn getCarriageFloor(floorHeights: Vec<f64>, height: f64) -> u64
pub fn getCumulativeFloorHeight(heights: Vec<f64>, floor: u64) -> f64
{
let mut c = 0.0;
for fi in 0..floor
{
c += heights[fi as usize];
};
c
heights.iter().take(floor as usize).sum()
}
pub struct Building1;

@ -4,7 +4,7 @@ use buildings::{Building, getCumulativeFloorHeight};
pub trait MotionController
{
fn init(&mut self, esp: Box<Building>, est: ElevatorState);
fn poll(&mut self, est: ElevatorState, dst: u64) -> f64;
fn adjust(&mut self, est: &ElevatorState, dst: u64) -> f64;
}
pub struct SmoothMotionController
@ -21,7 +21,7 @@ impl MotionController for SmoothMotionController
self.timestamp = est.timestamp;
}
fn poll(&mut self, est: ElevatorState, dst: u64) -> f64
fn adjust(&mut self, est: &ElevatorState, dst: u64) -> f64
{
//5.3. Adjust motor control to process next floor request

@ -6,6 +6,7 @@ use elevator::trip_planning::{FloorRequests, RequestQueue};
use elevator::physics::{ElevatorState, simulate_elevator};
use elevator::motion_controllers::{SmoothMotionController, MotionController};
use std::collections::VecDeque;
use floating_duration::{TimeAsFloat, TimeFormat};
use std::{thread, time};
use std::time::Instant;
@ -31,7 +32,7 @@ pub fn run_operator()
//3. Store input building description and floor requests
let mut esp: Box<Building> = Box::new(Building1);
let mut floor_requests: Box<RequestQueue> = Box::new(FloorRequests {
requests: Vec::new()
requests: VecDeque::new()
});
//4. Parse input and store as building description and static floor requests
@ -148,7 +149,7 @@ pub fn run_operator()
}
//5.3. Adjust motor control to process next floor request
est.motor_input = mc.poll(est.clone(), dst);
est.motor_input = mc.adjust(&est, dst);
//Adjust motor
esp.get_motor_controller().adjust_motor(est.motor_input);

@ -63,7 +63,7 @@ pub fn simulate_elevator(esp: Box<Building>, est: ElevatorState, floor_requests:
dr.poll(est.clone(), dst);
//5.3. Adjust motor control to process next floor request
est.motor_input = mc.poll(est.clone(), dst);
est.motor_input = mc.adjust(&est, dst);
thread::sleep(time::Duration::from_millis(1));
}

@ -7,6 +7,7 @@ use elevator::physics::{ElevatorState, simulate_elevator};
use elevator::motion_controllers::{SmoothMotionController, MotionController};
use elevator::data_recorders::{newSimpleDataRecorder, DataRecorder};
use std::collections::VecDeque;
use std::time::Instant;
use std::env;
use std::fs::File;
@ -30,7 +31,7 @@ pub fn run_simulation()
//3. Store input building description and floor requests
let mut esp: Box<Building> = Box::new(Building1);
let mut floor_requests: Box<RequestQueue> = Box::new(FloorRequests {
requests: Vec::new()
requests: VecDeque::new()
});
//4. Parse input and store as building description and floor requests

@ -1,13 +1,14 @@
use std::collections::VecDeque;
pub struct FloorRequests
{
pub requests: Vec<u64>
pub requests: VecDeque<u64>
}
pub trait RequestQueue
{
fn add_request(&mut self, req: u64);
fn add_requests(&mut self, reqs: Vec<u64>);
fn add_requests(&mut self, reqs: &Vec<u64>);
fn pop_request(&mut self) -> Option<u64>;
}
@ -15,21 +16,17 @@ impl RequestQueue for FloorRequests
{
fn add_request(&mut self, req: u64)
{
self.requests.push(req);
self.requests.push_back(req);
}
fn add_requests(&mut self, reqs: Vec<u64>)
fn add_requests(&mut self, reqs: &Vec<u64>)
{
for req in reqs
{
self.requests.push(req);
self.requests.push_back(*req);
}
}
fn pop_request(&mut self) -> Option<u64>
{
if self.requests.len()>0 {
Some(self.requests.remove(0))
} else {
None
}
self.requests.pop_front()
}
}

Loading…
Cancel
Save