use crate::network;
use crate::elevio::{CallButton, CallType, elev};
use crossbeam_channel as cbc;
use std::thread;
use std::time;
#[doc(hidden)]
pub fn call_buttons(elev: elev::Elevator, ch: cbc::Sender<CallButton>, period: time::Duration) {
let mut prev = vec![[false; 3]; elev.num_floors.into()];
loop {
for f in 0..elev.num_floors {
for c in 0..3 {
let v = elev.call_button(f, c);
if v && prev[f as usize][c as usize] != v {
ch.send(CallButton { floor: f, call_type: CallType::from(c), elev_id: network::read_self_id()}).unwrap();
}
prev[f as usize][c as usize] = v;
}
}
thread::sleep(period)
}
}
#[doc(hidden)]
pub fn floor_sensor(elev: elev::Elevator, ch: cbc::Sender<u8>, period: time::Duration) {
let mut prev = u8::MAX;
loop {
if let Some(f) = elev.floor_sensor() {
if f != prev {
ch.send(f).unwrap();
prev = f;
}
}
thread::sleep(period)
}
}
#[doc(hidden)]
pub fn stop_button(elev: elev::Elevator, ch: cbc::Sender<bool>, period: time::Duration) {
let mut prev = false;
loop {
let v = elev.obstruction();
if prev != v {
ch.send(v).unwrap();
prev = v;
}
thread::sleep(period)
}
}
#[doc(hidden)]
pub fn obstruction(elev: elev::Elevator, ch: cbc::Sender<bool>, period: time::Duration) {
let mut prev = false;
loop {
let v = elev.stop_button();
if prev != v {
ch.send(v).unwrap();
prev = v;
}
thread::sleep(period)
}
}