changeset 591:4a944663fa8d rust

more skeleton
author Matt Johnston <matt@ucc.asn.au>
date Fri, 23 Dec 2016 00:33:19 +0800
parents dccd8504aa38
children 03b48ec0bb03
files rust/Cargo.lock rust/Cargo.toml rust/rustnotes.txt rust/src/main.rs rust/src/sensor.rs
diffstat 5 files changed, 106 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/rust/Cargo.lock	Wed Dec 21 21:40:32 2016 +0800
+++ b/rust/Cargo.lock	Fri Dec 23 00:33:19 2016 +0800
@@ -3,6 +3,7 @@
 version = "0.1.0"
 dependencies = [
  "futures 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
  "tokio-core 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -101,6 +102,11 @@
 ]
 
 [[package]]
+name = "rustc-serialize"
+version = "0.3.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "rustc_version"
 version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -171,6 +177,7 @@
 "checksum miow 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d5bfc6782530ac8ace97af10a540054a37126b63b0702ddaaa243b73b5745b9a"
 "checksum net2 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "5edf9cb6be97212423aed9413dd4729d62b370b5e1c571750e882cebbbc1e3e2"
 "checksum nix 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0d95c5fa8b641c10ad0b8887454ebaafa3c92b5cd5350f8fc693adafd178e7b"
+"checksum rustc-serialize 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "237546c689f20bb44980270c73c3b9edd0891c1be49cc1274406134a66d3957b"
 "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
 "checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d"
 "checksum semver 0.1.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f410fedcf71af0345d7607d246e7ad15faaadd49d240ee3b24e5dc21a820ac"
--- a/rust/Cargo.toml	Wed Dec 21 21:40:32 2016 +0800
+++ b/rust/Cargo.toml	Fri Dec 23 00:33:19 2016 +0800
@@ -6,4 +6,5 @@
 [dependencies]
 futures = "0.1.6"
 tokio-core = "0.1.1"
+rustc-serialize = "0.3.*"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rust/rustnotes.txt	Fri Dec 23 00:33:19 2016 +0800
@@ -0,0 +1,19 @@
+fridge
+- called on external param change
+- called on external reading change
+- called on integrator timeout
+- called on slowstart timeout
+
+sensor
+- emits readings
+- threadpool to read sensors
+
+sender
+- called on timeout
+
+configwaiter
+- emits params
+- called on http response
+- called on new longpoll
+- possibly takes old/existing params
+
--- a/rust/src/main.rs	Wed Dec 21 21:40:32 2016 +0800
+++ b/rust/src/main.rs	Fri Dec 23 00:33:19 2016 +0800
@@ -1,24 +1,91 @@
 extern crate tokio_core;
 extern crate futures;
+extern crate rustc_serialize;
 
 use tokio_core::reactor::Core;
-use futures::Stream;
+use futures::{Future,Stream};
+use rustc_serialize::json;
 
 mod sensor;
 
+#[derive(RustcDecodable, RustcEncodable)]
+struct Params {
+    fridge_setpoint: f32,
+    fridge_difference: f32,
+    overshoot_delay: u32,
+    overshoot_factor: f32,
+    disabled: bool,
+    nowort: bool,
+    fridge_range_lower: f32,
+    fridge_range_upper: f32,
+}
+
+struct ParamHolder {
+    p: Params,
+    epoch: String, // XXX or a byte array?
+}
+
+impl ParamHolder {
+    fn new() -> ParamHolder {
+        ParamHolder {
+            p: Params {
+                fridge_setpoint: 16.0,
+                fridge_difference: 0.2,
+                overshoot_delay: 720, // 12 minutes
+                overshoot_factor: 1.0,
+                disabled: false,
+                nowort: false,
+                fridge_range_lower: 3.0,
+                fridge_range_upper: 3.0,
+            },
+            epoch: String::new(),
+        }
+    }
+}
+
+struct Readings {
+    temps: Vec<Vec<sensor::Reading>>,
+}
+
+impl Readings {
+    fn new() -> Readings {
+        Readings {
+            temps: Vec::new(),
+        }
+    }
+    fn fridge() -> Option<f32> {
+        unimplemented!();
+    }
+
+    fn wort() -> Option<f32> {
+        unimplemented!();
+    }
+}
+
 fn main() {
     println!("Wort Templog");
 
+    let param = ParamHolder::new();
+    let mut readings = Readings::new();
+
     let mut core = Core::new().unwrap();
     let handle = core.handle();
 
-    let s = sensor::Sensor::run(&handle);
+    let s = sensor::Sensor::run(&handle, 400, "sens1".to_string());
+    let t = sensor::Sensor::run(&handle, 747, "frid".to_string());
 
     let h = s.for_each(|r| {
         println!("readings {:?}", r);
         Ok(())
     });
 
-    core.run(h);
+    let i = t.for_each(|r| {
+        println!("fridgereadings {:?}", r);
+        Ok(())
+    });
+
+    let all = h.select(i);
+
+    core.run(all);
 }
 
--- a/rust/src/sensor.rs	Wed Dec 21 21:40:32 2016 +0800
+++ b/rust/src/sensor.rs	Fri Dec 23 00:33:19 2016 +0800
@@ -14,29 +14,28 @@
     value: Option<f32>,
 }
 
-pub type Readings = Vec<Reading>;
-
 pub struct Sensor {
     current: f32,
+    suf: String,
 }
 
 impl Sensor {
-
-    fn step(&mut self) -> Readings {
+    fn step(&mut self) -> Vec<Reading> {
         let mut r = Vec::new();
         self.current = self.current + 0.1;
-        r.push(Reading { name: "aaa".to_string(), value: Some(self.current) });
+        r.push(Reading { name: "aaa".to_string() + &self.suf, value: Some(self.current) });
+        r.push(Reading { name: "b".to_string() + &self.suf, value: Some(self.current/3.0) });
         r
     }
 
-    fn new() -> Self {
-        Sensor { current: 22.0 }
+    fn new(suffix: String) -> Self {
+        Sensor { current: 22.0, suf: suffix }
     }
 
-    pub fn run(handle: &Handle) -> Box<Stream<Item=Readings, Error=io::Error>> {
-        let mut s = Sensor::new();
+    pub fn run(handle: &Handle, rate: u64, suffix: String) -> Box<Stream<Item=Vec<Reading>, Error=io::Error>> {
+        let mut s = Sensor::new(suffix);
 
-        let dur = Duration::from_millis(400);
+        let dur = Duration::from_millis(rate);
         Interval::new(dur, handle).unwrap().map(move |()| {
             s.step()
         }).boxed()