Chapter 4 almost code complete

master
Andrew Johnson 6 years ago
parent 8932e07d69
commit 6c1a3cbed8

@ -37,3 +37,7 @@ path = "lifetimes.rs"
[[bin]]
name = "parameters"
path = "parameters.rs"
[[bin]]
name = "serialize"
path = "serialize.rs"

@ -0,0 +1,28 @@
#[macro_use] extern crate serde_derive;
extern crate serde;
extern crate serde_json;
struct Foo
{
bar: Box<u64>
}
trait T {}
#[derive(Serialize,Deserialize)]
struct S1;
impl T for S1 {}
#[derive(Serialize,Deserialize)]
struct S2;
impl T for S2 {}
#[derive(Serialize,Deserialize)]
struct Container
{
field: Box<T>
}
fn main()
{
}

@ -1,7 +1,8 @@
mod physics;
mod motor;
use physics::{ElevatorSpecification, ElevatorState, MotorInput, simulate_elevator, DataRecorder, MotorController, MotorVoltage, ElevatorStateClone};
use physics::{ElevatorSpecification, ElevatorState, MotorInput, simulate_elevator, DataRecorder, MotorController, MotorVoltage,
ElevatorStateClone, ElevatorSpecificationClone};
#[macro_use] extern crate serde_derive;
extern crate serde;
@ -31,12 +32,12 @@ fn main()
let mut start_location = 0.0;
for line in simlog.lines() {
let l = line.unwrap();
match esp.clone() {
match esp {
None => {
let spec: ElevatorSpecification = serde_json::from_str(&l).unwrap();
esp = Some(spec);
let spec: (u64,f64,f64,u64) = serde_json::from_str(&l).unwrap();
esp = Some(ElevatorSpecification::load(spec));
},
Some(esp) => {
Some(ref esp) => {
let (est, dst): ((f64,f64,f64,f64,f64),u64) = serde_json::from_str(&l).unwrap();
let est = ElevatorState::load(est);
let dl = dst_timing.len();

@ -1,7 +1,8 @@
mod physics;
mod motor;
use physics::{ElevatorSpecification, ElevatorState, MotorInput, SimpleMotorInput, simulate_elevator, DataRecorder, MotorController, MotorVoltage, ElevatorStateClone};
use physics::{ElevatorSpecification, ElevatorState, MotorInput, SimpleMotorInput, simulate_elevator, DataRecorder, MotorController, MotorVoltage,
ElevatorStateClone, ElevatorSpecificationClone, Motor, SimpleMotor};
use motor::{SmoothMotorController, SimpleMotorController};
#[macro_use] extern crate serde_derive;
@ -67,7 +68,7 @@ impl<'a, W: Write> DataRecorder for SimpleDataRecorder<'a, W>
fn init(&mut self, esp: ElevatorSpecification, est: ElevatorState)
{
self.esp = esp.clone();
self.log.write_all(serde_json::to_string(&esp.clone()).unwrap().as_bytes()).expect("write spec to log");
self.log.write_all(serde_json::to_string(&esp.clone().dump()).unwrap().as_bytes()).expect("write spec to log");
self.log.write_all(b"\r\n").expect("write spec to log");
}
fn poll(&mut self, est: ElevatorState, dst: u64)
@ -152,7 +153,8 @@ pub fn run_simulation()
let mut esp = ElevatorSpecification {
floor_count: 0,
floor_height: 0.0,
carriage_weight: 120000.0
carriage_weight: 120000.0,
motor: Box::new(SimpleMotor)
};
let mut floor_requests = Vec::new();

@ -64,7 +64,7 @@ impl MotorController for SimpleMotorController
let gravity_adjusted_acceleration = target_acceleration + 9.8;
let target_force = gravity_adjusted_acceleration * self.esp.carriage_weight;
let target_voltage = target_force / 8.0;
let target_voltage = self.esp.motor.voltage_of_force(target_force);
if target_voltage > 0.0 {
Box::new(SimpleMotorInput::Up { voltage: target_voltage })
} else {
@ -160,7 +160,7 @@ impl MotorController for SmoothMotorController
let gravity_adjusted_acceleration = target_acceleration + 9.8;
let target_force = gravity_adjusted_acceleration * self.esp.carriage_weight;
let target_voltage = target_force / 8.0;
let target_voltage = self.esp.motor.voltage_of_force(target_force);
if !target_voltage.is_finite() {
//divide by zero etc.
//may happen if time delta underflows

@ -4,6 +4,25 @@ use floating_duration::{TimeAsFloat, TimeFormat};
use std::{thread, time};
use serde;
pub trait Motor
{
fn force_of_voltage(&self, v: f64) -> f64;
fn voltage_of_force(&self, v: f64) -> f64;
}
pub struct SimpleMotor;
impl Motor for SimpleMotor
{
fn force_of_voltage(&self, v: f64) -> f64
{
8.0 * v
}
fn voltage_of_force(&self, v: f64) -> f64
{
v / 8.0
}
}
#[derive(Clone,Serialize,Deserialize,Debug)]
pub enum SimpleMotorInput
{
@ -16,12 +35,48 @@ pub trait MotorInput: MotorForce + MotorVoltage
}
impl MotorInput for SimpleMotorInput {}
#[derive(Clone,Serialize,Deserialize,Debug)]
pub struct ElevatorSpecification
{
pub floor_count: u64,
pub floor_height: f64,
pub carriage_weight: f64
pub carriage_weight: f64,
pub motor: Box<Motor>
}
pub trait ElevatorSpecificationClone
{
fn clone(&self) -> ElevatorSpecification;
fn dump(&self) -> (u64,f64,f64,u64);
fn load((u64,f64,f64,u64)) -> ElevatorSpecification;
}
impl ElevatorSpecificationClone for ElevatorSpecification
{
fn clone(&self) -> ElevatorSpecification
{
ElevatorSpecification
{
floor_count: self.floor_count,
floor_height: self.floor_height,
carriage_weight: self.carriage_weight,
motor: Box::new(SimpleMotor)
}
}
fn dump(&self) -> (u64,f64,f64,u64)
{
(self.floor_count,
self.floor_height,
self.carriage_weight,
0)
}
fn load(esp: (u64,f64,f64,u64)) -> ElevatorSpecification
{
ElevatorSpecification
{
floor_count: esp.0,
floor_height: esp.1,
carriage_weight: esp.2,
motor: Box::new(SimpleMotor)
}
}
}
pub struct ElevatorState

Loading…
Cancel
Save