From 2cf725b5aafadb793ebbc332e2340769b929482a Mon Sep 17 00:00:00 2001 From: RenovateBot Date: Sun, 8 Oct 2023 02:02:35 +0200 Subject: [PATCH 1/2] Update Rust crate num-traits to 0.2.17 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 16073f6..6b9a181 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,7 @@ reqwest = "0.11.22" tokio = { version = "1.32.0", features=["macros", "rt-multi-thread"] } futures = "0.3.28" serial_test = "2.0.0" -num-traits = "0.2.0" +num-traits = "0.2.17" num-derive = "0.4.0" #crypto -- 2.45.2 From 56fe4beb2a02c2f37a2a913bbd39b15cc4bb0c8c Mon Sep 17 00:00:00 2001 From: hodasemi Date: Mon, 9 Oct 2023 07:39:13 +0200 Subject: [PATCH 2/2] Improve write test --- src/command/request.rs | 35 ++++++++++++++++++++ src/device.rs | 73 +++++++++++++++++++++++++++--------------- src/devices/e1.rs | 2 +- 3 files changed, 84 insertions(+), 26 deletions(-) diff --git a/src/command/request.rs b/src/command/request.rs index 4c864dd..0e18507 100644 --- a/src/command/request.rs +++ b/src/command/request.rs @@ -2,6 +2,9 @@ use super::{body::Body, header::Header, Command, MessageType}; use std::ops::Deref; pub trait RequestSerializer { + fn message_type(&self) -> MessageType; + fn body_type(&self) -> u8; + fn serialize(&self) -> Vec; } @@ -65,6 +68,14 @@ impl RequestSerializer for CommandRequest { stream } + + fn message_type(&self) -> MessageType { + self.header().message_type() + } + + fn body_type(&self) -> u8 { + self.body().body_type() + } } pub struct CommandQuerySubtype { @@ -102,6 +113,14 @@ impl RequestSerializer for CommandQuerySubtype { fn serialize(&self) -> Vec { self.command.serialize() } + + fn message_type(&self) -> MessageType { + self.header().message_type() + } + + fn body_type(&self) -> u8 { + self.body().body_type() + } } pub struct CommandQueryCustom { @@ -140,6 +159,14 @@ impl RequestSerializer for CommandQueryCustom { fn serialize(&self) -> Vec { self.command.serialize() } + + fn message_type(&self) -> MessageType { + self.header().message_type() + } + + fn body_type(&self) -> u8 { + self.body().body_type() + } } pub struct CommandHeartbeat; @@ -148,4 +175,12 @@ impl RequestSerializer for CommandHeartbeat { fn serialize(&self) -> Vec { vec![0x00] } + + fn message_type(&self) -> MessageType { + MessageType::None + } + + fn body_type(&self) -> u8 { + 0 + } } diff --git a/src/device.rs b/src/device.rs index bac30e8..b00da20 100644 --- a/src/device.rs +++ b/src/device.rs @@ -124,24 +124,22 @@ impl Device { } for cmd in cmds { - 'sending: loop { - self.build_send(cmd.clone())?; + self.build_send(cmd.clone())?; - loop { - let mut buf = [0; 512]; - let bytes_read = match self.socket.lock().unwrap().read(&mut buf) { - Ok(b) => b, - Err(_) => continue, - }; + loop { + let mut buf = [0; 512]; + let bytes_read = match self.socket.lock().unwrap().read(&mut buf) { + Ok(b) => b, + Err(_) => continue, + }; - if bytes_read == 0 { - break; - } + if bytes_read == 0 { + break; + } - match self.parse_message(&buf[..bytes_read])? { - ParseMessage::Success => break 'sending, - ParseMessage::Padding => continue, - } + match self.parse_message(&buf[..bytes_read])? { + ParseMessage::Success => break, + ParseMessage::Padding => continue, } } } @@ -226,7 +224,11 @@ impl Device { fn send_message(&self, msg: &[u8]) -> Result<()> { let data = self.security.encode_8370(msg, MsgType::ENCRYPTED_REQUEST)?; - self.socket.lock().unwrap().write(&data)?; + self.socket + .lock() + .unwrap() + .write(&data) + .context(format!("{msg:?}"))?; Ok(()) } @@ -237,15 +239,26 @@ impl Device { } fn build_send(&self, cmd: impl RequestSerializer) -> Result<()> { + let message_type = cmd.message_type(); + let body_type = cmd.body_type(); + let data = PacketBuilder::builder(self.info.id, cmd).finalize(1); - self.send_message(&data) + Ok(self.send_message(&data).context(format!( + "message_type: {message_type:?}, body_type: {body_type}" + ))?) } } #[cfg(test)] mod test { - use std::net::{Ipv4Addr, SocketAddr}; + use std::{ + net::{Ipv4Addr, SocketAddr}, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, + }, + }; use anyhow::{Context, Result}; use futures::future::try_join; @@ -342,19 +355,29 @@ mod test { addr: SocketAddr::new(std::net::IpAddr::V4(Ipv4Addr::new(192, 168, 178, 94)), 6444), }; - let mut device = Device::connect(device_info, token, key) - .await? - .register_update(|attributes| { - println!("{attributes:?}"); + let power: Arc = Arc::new(AtomicBool::new(false)); - Ok(()) + let device = Device::connect(device_info, token, key) + .await? + .register_update({ + let power = power.clone(); + + move |attributes| { + println!("{attributes:?}"); + + power.store(attributes["power"].bool(), Ordering::SeqCst); + + Ok(()) + } }); device - .set_attribute("attribute", AttributeValue::Bool(false)) + .set_attribute("power", AttributeValue::Bool(true)) .await?; - device.refresh_status().await?; + device + .set_attribute("power", AttributeValue::Bool(false)) + .await?; Ok(()) } diff --git a/src/devices/e1.rs b/src/devices/e1.rs index ed34bf7..22549b8 100644 --- a/src/devices/e1.rs +++ b/src/devices/e1.rs @@ -127,7 +127,7 @@ impl DeviceBackend for E1 { cmd.request() } - _ => todo!(), + _ => todo!("attribute: {attribute}"), } } -- 2.45.2