use std::io::{self, Write};
use std::thread;
use std::time::Duration;
use deimos::calc::{Hysteretic, min};
use deimos::controller::context::ControllerCtx;
use deimos::peripheral::DeimosDaqRev7;
use deimos::{Controller, LoopMethod};
fn main() -> Result<(), String> {
let mut ctx = ControllerCtx::default();
ctx.op_name = "bangbang_example".to_owned();
ctx.op_dir = "./software/deimos/examples".into();
ctx.dt_ns = (1e9 / 10.0) as u32; ctx.loop_method = LoopMethod::Efficient;
let mut controller = Controller::new(ctx);
controller.add_peripheral("daq", Box::new(DeimosDaqRev7 { serial_number: 3 }))?;
controller.add_calc("tc_min", min(&["daq.tc_0_K", "daq.tc_1_K"]));
controller.add_calc(
"bangbang",
Hysteretic::new_with_values("tc_min.y".to_owned(), 80.0, 90.0, 20, 0.0, 1.0)?,
);
controller.set_peripheral_input_source("daq.do0", "bangbang.y");
let mut run_handle = controller.run_nonblocking(None, None, true)?;
println!(""); while run_handle.is_running() {
thread::sleep(Duration::from_millis(100));
if !run_handle.is_running() {
break;
}
let values = run_handle.read().values;
let tc0 = values["daq.tc_0_K"];
let tc1 = values["daq.tc_1_K"];
let do0 = values["daq.do0"];
print!("\r\x1b[2K"); print!("tc0: {tc0:.2} K {tc1:.2} K do0: {do0:.0}");
let _ = io::stdout().flush();
}
println!();
run_handle.join().map(|_| ())
}