From 06d75c110cfc705c88fb46a0cafc16a078585bfa Mon Sep 17 00:00:00 2001 From: lennard Date: Fri, 9 Jun 2023 21:36:34 +0200 Subject: [PATCH] Added some validation checks, and the app now detects the charging state. --- src/lib.rs | 20 +++++++++++++++++--- src/main.rs | 5 +++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 321d8a0..c6f9d4f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,12 @@ const VENDOR_IDS: [u16; 2] = [0x0951, 0x03F0]; // Possible Cloud II Wireless product IDs const PRODUCT_IDS: [u16; 2] = [0x1718, 0x018B]; +const BATTERY_LEVEL_INDEX: usize = 7; +const CHARGING_INDEX: usize = 5; +const CHARGING_STATE: u8 = 0x10; +const NOT_CHARGING_STATE: u8 = 0xF; +const PREAMBLE: [u8; 5] = [6, 255, 187, 2, 0]; + const BATTERY_PACKET: [u8; 20] = { let mut packet = [0; 20]; (packet[0], packet[1], packet[2], packet[3]) = (0x06, 0xff, 0xbb, 0x02); @@ -20,6 +26,8 @@ pub enum DeviceError { NoDeviceFound(), #[error("Error: No response. Is the headset turned on?")] HeadSetOff(), + #[error("Error: Unknown response.")] + UnknownResponse(), } pub struct Device { @@ -39,7 +47,6 @@ impl Device { Ok(Device { hid_device }) } - //TODO: implement charging pub fn get_battery_level(&self) -> Result<(u8, bool), DeviceError> { self.hid_device.write(&BATTERY_PACKET)?; let mut buf = [0u8; 8]; @@ -47,7 +54,14 @@ impl Device { if res == 0 { return Err(DeviceError::HeadSetOff()); } - println!("Read: {:?}", &buf[..res]); - Ok((buf[7], false)) + if !buf.starts_with(&PREAMBLE) { + return Err(DeviceError::UnknownResponse()); + } + let charging = match buf[CHARGING_INDEX] { + CHARGING_STATE => true, + NOT_CHARGING_STATE => false, + _ => return Err(DeviceError::UnknownResponse()), + }; + Ok((buf[BATTERY_LEVEL_INDEX], charging)) } } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index d679500..e9b14be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,4 +16,9 @@ fn main() { } }; println!("Battery level: {}%", battery_level); + if charging { + println!("Charging"); + } else { + println!("Not charging"); + } }