annotate rust/src/fridge.rs @ 632:bde302def78e rust

moving to riker, nowhere near yet
author Matt Johnston <matt@ucc.asn.au>
date Thu, 22 Aug 2019 23:59:50 +0800
parents c57821a60e51
children 490e9e15b98c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
1 use std;
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
2
597
a440eafa84a9 progress for debug
Matt Johnston <matt@ucc.asn.au>
parents: 595
diff changeset
3 use std::time::{Duration,Instant};
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
4 use riker::actors::*;
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
5
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
6 #[cfg(target_os = "linux")]
626
efcbe0d3afd6 fix to work with hyper
Matt Johnston <matt@ucc.asn.au>
parents: 621
diff changeset
7 use self::sysfs_gpio::{Direction, Pin};
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
8
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
9 use super::config::Config;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
10 use super::params::Params;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
11 use super::types::*;
592
03b48ec0bb03 fridge, types, configwaiter
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
12
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
13 #[derive(Debug)]
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
14 pub struct Reading {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
15 wort: Option<f32>,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
16 fridge: Option<f32>,
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
17 }
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
18
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
19 #[derive(Debug)]
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
20 pub struct Tick;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
21
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
22
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
23 #[actor(Params, Tick, Reading)]
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
24 pub struct Fridge {
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
25 params: Params,
603
b45b8b4cf0f5 get rid of lazy_static, config is passed around
Matt Johnston <matt@ucc.asn.au>
parents: 601
diff changeset
26 config: Config,
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
27
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
28 on: bool,
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
29 temp_wort: Option<f32>,
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
30 temp_fridge: Option<f32>,
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
31 last_off_time: Instant,
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
32 wort_valid_time: Instant,
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
33 integrator: StepIntegrator,
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
34 control: FridgeControl,
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
35 }
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
36
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
37 impl Actor for Fridge {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
38 type Msg = FridgeMsg;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
39 fn recv(&mut self,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
40 ctx: &Context<Self::Msg>,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
41 msg: Self::Msg,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
42 sender: Sender) {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
43 self.receive(ctx, msg, sender);
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
44 // TODO: should we do self.tick(ctx) here instead?
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
45 }
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
46
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
47 fn post_start(&mut self, ctx: &Context<Self::Msg>) {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
48 self.tick(ctx);
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
49 }
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
50 }
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
51
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
52 impl Receive<Reading> for Fridge {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
53 type Msg = FridgeMsg;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
54 fn receive(&mut self,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
55 ctx: &Context<Self::Msg>,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
56 r: Reading,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
57 _sender: Sender) {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
58 self.temp_wort = r.wort;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
59 self.temp_fridge = r.fridge;
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
60
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
61 if self.temp_wort.is_some() {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
62 self.wort_valid_time = Instant::now();
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
63 }
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
64
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
65 self.tick(ctx);
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
66 }
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
67 }
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
68
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
69 impl Receive<Params> for Fridge {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
70 type Msg = FridgeMsg;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
71 fn receive(&mut self,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
72 ctx: &Context<Self::Msg>,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
73 p: Params,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
74 _sender: Sender) {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
75 self.params = p;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
76 println!("fridge set_params {:?}", self.params);
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
77
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
78 self.tick(ctx);
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
79 }
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
80 }
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
81
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
82 impl Receive<Tick> for Fridge {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
83 type Msg = FridgeMsg;
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
84 fn receive(&mut self,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
85 ctx: &Context<Self::Msg>,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
86 _tick: Tick,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
87 _sender: Sender) {
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
88 self.tick(ctx);
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
89 }
592
03b48ec0bb03 fridge, types, configwaiter
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
90 }
03b48ec0bb03 fridge, types, configwaiter
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
91
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
92 enum FridgeControl {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
93 #[cfg(target_os = "linux")]
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
94 Gpio(Pin),
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
95 Fake,
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
96 }
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
97
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
98 impl Drop for Fridge {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
99 fn drop(&mut self) {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
100 // safety fridge off
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
101 self.turn(false);
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
102 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
103 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
104
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
105 impl Fridge {
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
106 pub fn new(config: &Config, nowait: bool, p: Params) -> Fridge {
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
107 let mut f = Fridge {
603
b45b8b4cf0f5 get rid of lazy_static, config is passed around
Matt Johnston <matt@ucc.asn.au>
parents: 601
diff changeset
108 config: config.clone(),
615
f153aec221be move Params, epoch code
Matt Johnston <matt@ucc.asn.au>
parents: 611
diff changeset
109 params: p.clone(),
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
110 on: false,
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
111 temp_wort: None,
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
112 temp_fridge: None,
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
113 last_off_time: Instant::now(),
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
114 wort_valid_time: Instant::now() - Duration::new(config.FRIDGE_WORT_INVALID_TIME, 100),
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
115 integrator: StepIntegrator::new(Duration::new(p.overshoot_delay, 0)),
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
116 control: Self::make_control(config),
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
117 };
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
118
597
a440eafa84a9 progress for debug
Matt Johnston <matt@ucc.asn.au>
parents: 595
diff changeset
119 if nowait {
609
7bda01659426 not building, paramwaiter work
Matt Johnston <matt@ucc.asn.au>
parents: 606
diff changeset
120 f.last_off_time -= Duration::new(config.FRIDGE_DELAY, 1);
597
a440eafa84a9 progress for debug
Matt Johnston <matt@ucc.asn.au>
parents: 595
diff changeset
121 }
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
122
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
123 f.tick();
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
124
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
125 f
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
126 }
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
127
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
128 #[cfg(target_os = "linux")]
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
129 fn make_control(config: &Config) -> FridgeControl {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
130 let mut pin = Pin(config.FRIDGE_GPIO_PIN);
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
131 // XXX better error handling?
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
132 pin.export().expect("Exporting fridge gpio failed");
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
133 pin.set_direction(Direction::Low).expect("Fridge gpio direction failed");
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
134 FridgeControl::Gpio(pin)
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
135 }
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
136
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
137 #[cfg(not(target_os = "linux"))]
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
138 fn make_control(config: &Config) -> FridgeControl {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
139 FridgeControl::Fake
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
140 }
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
141
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
142 fn next_wakeup(&self) -> Duration {
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
143 let millis = 400;
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
144 let dur = Duration::from_millis(millis);
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
145 dur
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
146 }
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
147
606
3c1d37d78415 untested wort_valid_time
Matt Johnston <matt@ucc.asn.au>
parents: 603
diff changeset
148
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
149 fn turn_off(&mut self) {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
150 info!("Turning fridge off");
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
151 self.turn(false);
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
152 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
153
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
154 fn turn_on(&mut self) {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
155 info!("Turning fridge on");
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
156 self.turn(true);
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
157 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
158
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
159 fn turn(&mut self, on: bool) {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
160 match self.control {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
161 #[cfg(target_os = "linux")]
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
162 Gpio(pin) => pin.set_value(on as u8),
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
163 FridgeControl::Fake => debug!("fridge turns {}", if on {"on"} else {"off"}),
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
164 }
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
165 self.on = on;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
166 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
167
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
168 // Turns the fridge off and on
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
169 fn compare_temperatures(&mut self) {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
170 let fridge_min = self.params.fridge_setpoint - self.params.fridge_range_lower;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
171 let fridge_max = self.params.fridge_setpoint - self.params.fridge_range_upper;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
172 let wort_max = self.params.fridge_setpoint + self.params.fridge_difference;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
173 let off_time = Instant::now() - self.last_off_time;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
174
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
175 // Or elsewhere?
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
176 self.integrator.set_limit(Duration::new(self.params.overshoot_delay, 0));
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
177
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
178 // Safety to avoid bad things happening to the fridge motor (?)
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
179 // When it turns off don't start up again for at least FRIDGE_DELAY
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
180 if !self.on && off_time < Duration::new(self.config.FRIDGE_DELAY, 0) {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
181 info!("fridge skipping, too early");
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
182 return;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
183 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
184
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
185 if self.params.disabled {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
186 if self.on {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
187 info!("Disabled, turning fridge off");
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
188 self.turn_off();
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
189 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
190 return;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
191 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
192
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
193 // handle broken wort sensor
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
194 if self.temp_wort.is_none() {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
195 let invalid_time = Instant::now() - self.wort_valid_time;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
196 warn!("Invalid wort sensor for {:?} secs", invalid_time);
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
197 if invalid_time < Duration::new(self.config.FRIDGE_WORT_INVALID_TIME, 0) {
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
198 warn!("Has only been invalid for {:?}, waiting", invalid_time);
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
199 return;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
200 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
201 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
202
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
203 if self.temp_fridge.is_none() {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
204 warn!("Invalid fridge sensor");
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
205 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
206
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
207 if self.on {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
208 debug!("fridge is on");
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
209 let on_time = self.integrator.integrate().as_secs() as f32;
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
210 let on_ratio = on_time / self.params.overshoot_delay as f32;
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
211
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
212 let overshoot = self.params.overshoot_factor as f32 * on_ratio;
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
213 debug!("on_percent {}, overshoot {}", on_ratio * 100.0, overshoot);
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
214
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
215 let mut turn_off = false;
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
216 if self.temp_wort.is_some() && !self.params.nowort {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
217 let t = self.temp_wort.unwrap();
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
218 // use the wort temperature
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
219 if t - overshoot < self.params.fridge_setpoint {
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
220 info!("wort has cooled enough, {temp}º (overshoot {overshoot}º = {factor} × {percent}%)",
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
221 temp = t, overshoot = overshoot,
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
222 factor = self.params.overshoot_factor,
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
223 percent = on_ratio*100.0);
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
224 turn_off = true;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
225 }
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
226 } else if let Some(t) = self.temp_fridge {
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
227 // use the fridge temperature
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
228 if t < fridge_min {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
229 warn!("fridge off fallback, fridge {}, min {}", t, fridge_min);
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
230 if self.temp_wort.is_none() {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
231 warn!("wort has been invalid for {:?}", Instant::now() - self.wort_valid_time);
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
232 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
233 turn_off = true;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
234 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
235 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
236 if turn_off {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
237 self.turn_off();
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
238 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
239 } else {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
240 debug!("fridge is off. fridge {:?} max {:?}. wort {:?} max {:?}",
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
241 self.temp_fridge, fridge_max, self.temp_wort, wort_max);
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
242 let mut turn_on = false;
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
243 if self.temp_wort.is_some() && !self.params.nowort {
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
244 // use the wort temperature
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
245 let t = self.temp_wort.unwrap();
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
246 if t >= wort_max {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
247 info!("Wort is too hot {}°, max {}°", t, wort_max);
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
248 turn_on = true;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
249 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
250 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
251
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
252 if let Some(t) = self.temp_fridge {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
253 if t >= fridge_max {
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
254 warn!("fridge too hot fallback, fridge {}°, max {}°", t, fridge_max);
620
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
255 turn_on = true;
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
256 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
257 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
258
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
259 if turn_on {
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
260 self.turn_on()
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
261 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
262 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
263 }
8fda564cc46f fridge work
Matt Johnston <matt@ucc.asn.au>
parents: 615
diff changeset
264
606
3c1d37d78415 untested wort_valid_time
Matt Johnston <matt@ucc.asn.au>
parents: 603
diff changeset
265 /// Must be called after every state change. Turns the fridge on/off as required and
3c1d37d78415 untested wort_valid_time
Matt Johnston <matt@ucc.asn.au>
parents: 603
diff changeset
266 /// schedules any future wakeups based on the present (new) state
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
267 /// Examples of wakeups events are
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
268 ///
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
269 /// * overshoot calculation
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
270 /// * minimum fridge-off time
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
271 /// * invalid wort timeout
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
272 /// All specified in next_wakeup()
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
273 fn tick(&mut self,
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
274 ctx: &Context<Self::Msg>) {
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
275 debug!("tick");
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
276
621
8136a6b99866 make it compile again
Matt Johnston <matt@ucc.asn.au>
parents: 620
diff changeset
277 self.compare_temperatures();
592
03b48ec0bb03 fridge, types, configwaiter
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
278
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
279 // Sets the next self-wakeup timeout
594
aff50ee77252 rust working better now with streams and sinks.
Matt Johnston <matt@ucc.asn.au>
parents: 593
diff changeset
280 let dur = self.next_wakeup();
632
bde302def78e moving to riker, nowhere near yet
Matt Johnston <matt@ucc.asn.au>
parents: 631
diff changeset
281 ctx.schedule_once(dur, self, None, Tick);
593
bf138339d20a fiddling with timeouts and closures
Matt Johnston <matt@ucc.asn.au>
parents: 592
diff changeset
282 }
592
03b48ec0bb03 fridge, types, configwaiter
Matt Johnston <matt@ucc.asn.au>
parents:
diff changeset
283 }