use log::*;
use std::sync::Arc;
use std::sync::Mutex;
use echonet::{Controller, Device, Node, Object, ObjectCode, RequestHandler};
use echonet::protocol::{ESV, Property};
use echonet::util::Bytes;
pub struct TestController {}
impl TestController {
pub fn new(node: Arc<Mutex<Node>>) -> Controller {
Controller::new_with_node(node)
}
}
pub struct TestDevice {
dev: Device,
num_on_req: u32,
num_off_req: u32,
}
impl TestDevice {
pub fn new(node: Arc<Mutex<Node>>) -> Arc<Mutex<TestDevice>> {
let m = Arc::new(Mutex::new(TestDevice {
dev: Device::new_with_node(0x05FD, node), num_on_req: 0,
num_off_req: 0,
}));
m.lock().unwrap().dev.set_request_handler(m.clone());
m
}
pub fn code(&self) -> ObjectCode {
self.dev.code()
}
pub fn start(&mut self) -> bool {
self.dev.start()
}
pub fn stop(&mut self) -> bool {
self.dev.stop()
}
}
impl RequestHandler for TestDevice {
fn property_request_received(&mut self, deoj: &mut Object, esv: ESV, prop: &Property) -> bool {
if deoj.code() != self.dev.code() {
return false;
}
match esv {
ESV::WriteRequest | ESV::WriteReadRequest | ESV::WriteRequestResponseRequired => {
let prop_code = prop.code();
let prop_bytes = prop.data();
match prop_code {
0x80 => {
let prop_u32 = Bytes::to_u32(prop_bytes);
match prop_u32 {
0x30 => {
info!("On");
deoj.set_property_byte(prop_code, 0x30);
self.num_on_req+= 1;
}
0x31 => {
info!("Off");
deoj.set_property_byte(prop_code, 0x31);
self.num_off_req+= 1;
}
_ => {
return false;
}
}
}
_ => {
return false;
}
}
}
_ => {}
}
true
}
}