extern crate chrono;
extern crate sensd;
extern crate serde;
use sensd::action::{Action, actions, IOCommand, Trigger};
use sensd::errors::ErrorType;
use sensd::io::{Device, IdType, Input, IOKind, Output, RawValue};
use sensd::storage::{Group, Persistent};
use std::ops::DerefMut;
const INPUT_ID: IdType = 0;
const OUTPUT_ID: IdType = 1;
const FREQUENCY: std::time::Duration = std::time::Duration::from_secs(5);
const THRESHOLD: i8 = 10;
static mut EXTERNAL_VALUE: RawValue = RawValue::Int8(0);
fn init(name: &str) -> Group {
let group = Group::new(name.clone());
println!("Initialized poll group: \"{}\"", name);
group
}
fn build_actions(poller: &mut Group) {
println!("\n█▓▒░ Building subscribers ...");
let input = poller.inputs.get(&INPUT_ID).unwrap().clone();
let output = poller.outputs.get(&OUTPUT_ID).unwrap().clone();
let mut binding = input.try_lock().unwrap();
let binding = binding.deref_mut();
println!("- Initializing subscriber ...");
let name = format!("Subscriber for Input:{}", INPUT_ID);
let threshold = RawValue::Int8(THRESHOLD);
let trigger = Trigger::LT;
if let Some(publisher) = binding.publisher_mut() {
publisher.subscribe(
actions::Threshold::new(
name,
threshold,
trigger,
)
.set_output(output)
.into_boxed()
);
}
println!("\n... Finished Initializing subscribers\n");
}
fn poll(poller: &mut Group) -> Result<(), ErrorType> {
match poller.poll() {
Ok(_) => match poller.save() {
Ok(_) => println!("\n"),
Err(t) => {
return Err(t);
}
},
_ => (),
};
Ok(())
}
fn main() {
let mut poller = init("main");
poller.push_input(
unsafe {
Input::new(
"mock temp sensor",
INPUT_ID,
IOKind::Temperature,
).set_command(
IOCommand::Input(|| EXTERNAL_VALUE)
).init_log()
}
);
poller.push_output(
Output::new(
"test mock cooling device",
OUTPUT_ID,
IOKind::Temperature,
).set_command(
IOCommand::Output(|val| Ok(println!("\nSimulated HW Output: {}\n", val)))
).init_log()
);
build_actions(&mut poller);
println!("█▓▒░ Beginning polling ░▒▓█\n");
let range = 5..11;
for value in range.clone().into_iter().chain(range.rev()).cycle() {
unsafe {
EXTERNAL_VALUE = RawValue::Int8(value);
}
poll(&mut poller).expect("Error occurred during polling");
std::thread::sleep(FREQUENCY);
}
}