Mercurial > templog
view rust/src/sensor.rs @ 596:ca8102feaca6 rust
sensor takes config parameter
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 06 Jan 2017 22:04:10 +0800 |
parents | e87655ed8429 |
children | 8c21df3711e2 |
line wrap: on
line source
extern crate tokio_core; extern crate futures; use std::time::Duration; use std::io; use std::fs::File; use std::io::Read; use tokio_core::reactor::Interval; use tokio_core::reactor::Handle; use futures::Stream; use types::*; use config::Config; pub trait Sensor { fn stream(handle: &Handle, config: &Config) -> Box<Stream<Item=Readings, Error=io::Error>>; } pub struct OneWireSensor { config: Config, } impl OneWireSensor { fn new(config: &Config) -> OneWireSensor { OneWireSensor { config: config.clone(), } } fn step(&mut self) -> Readings { let mut r = Readings::new(); r.add("ambient", Some(31.2)); r.add("wort_todo", Some(8.0)); debug!("sensor step {:?}", r); r } fn sensor_names(&self) -> Vec<String> { let mut names = vec![]; names } } impl Sensor for OneWireSensor { fn stream(handle: &Handle, config: &Config) -> Box<Stream<Item=Readings, Error=io::Error>> { let mut s = OneWireSensor::new(config); let dur = Duration::new(s.config.SENSOR_SLEEP,0); Interval::new(dur, handle).unwrap().map(move |()| { s.step() }).boxed() } } pub struct TestSensor { config: Config, } impl TestSensor { pub fn new(config: &Config) -> Self { TestSensor { config: config.clone(), } } fn step(&mut self) -> Readings { let mut r = Readings::new(); r.add("ambient", Some(31.2)); r.add("wort", Some(Self::try_read("test_wort.txt").unwrap_or_else(|_| 18.0))); r.add("fridge", Some(Self::try_read("test_fridge.txt").unwrap_or_else(|_| 20.0))); r } fn try_read(filename: &str) -> Result<f32, String> { File::open(filename) .map_err(|e| e.to_string()) .and_then(|mut f| { let mut s = String::new(); f.read_to_string(&mut s) .map_err(|e| e.to_string()) .map(|_| s) }) .and_then(|s| { s.trim().parse::<f32>() .map_err(|e| e.to_string()) }) } } impl Sensor for TestSensor { fn stream(handle: &Handle, config: &Config) -> Box<Stream<Item=Readings, Error=io::Error>> { let mut s = TestSensor::new(config); let dur = Duration::new(s.config.SENSOR_SLEEP,0); Interval::new(dur, handle).unwrap().map(move |()| { s.step() }).boxed() } }