From 91975eaf49e98a96151e0deaf742ee684bb34459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Thu, 30 Apr 2026 11:40:28 +0200 Subject: [PATCH 1/3] Implement set_side_tone_packet for Cloud III S Wireless --- src/devices/cloud_iii_s_wireless.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/devices/cloud_iii_s_wireless.rs b/src/devices/cloud_iii_s_wireless.rs index 71f1bde..4400957 100644 --- a/src/devices/cloud_iii_s_wireless.rs +++ b/src/devices/cloud_iii_s_wireless.rs @@ -52,6 +52,7 @@ const COLOR_COMMAND_ID: u8 = 0x4D; const CHARGE_STATE_COMMAND_ID: u8 = 0x48; const GET_MIC_MUTE_COMMAND_ID: u8 = 0x04; const GET_SIDE_TONE_COMMAND_ID: u8 = 0x16; +const SET_SIDE_TONE_COMMAND_ID: u8 = 0x0D; const GET_AUTO_POWER_OFF_COMMAND_ID: u8 = 0x4B; const GET_VOICE_PROMPT_COMMAND_ID: u8 = 0x14; @@ -210,8 +211,14 @@ impl Device for CloudIIISWireless { Some(packet) } - fn set_side_tone_packet(&self, _side_tone_on: bool) -> Option> { - None + fn set_side_tone_packet(&self, side_tone_on: bool) -> Option> { + // Confirmed via NGenuity USB capture: `0c 02 03 00 00 0d <0|1>`. + // byte[3] = 0x00 marks a SET (vs 0x01 for GET). + let mut packet = BASE_PACKET.to_vec(); + packet[3] = 0x00; + packet[5] = SET_SIDE_TONE_COMMAND_ID; + packet[6] = side_tone_on as u8; + Some(packet) } fn get_side_tone_volume_packet(&self) -> Option> { From dcd956e5ccac249f1aa93ea92b458fc7deab5e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Thu, 30 Apr 2026 12:05:56 +0200 Subject: [PATCH 2/3] Implement set_voice_prompt_packet for Cloud III S Wireless --- src/devices/cloud_iii_s_wireless.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/devices/cloud_iii_s_wireless.rs b/src/devices/cloud_iii_s_wireless.rs index 4400957..510e27d 100644 --- a/src/devices/cloud_iii_s_wireless.rs +++ b/src/devices/cloud_iii_s_wireless.rs @@ -55,6 +55,7 @@ const GET_SIDE_TONE_COMMAND_ID: u8 = 0x16; const SET_SIDE_TONE_COMMAND_ID: u8 = 0x0D; const GET_AUTO_POWER_OFF_COMMAND_ID: u8 = 0x4B; const GET_VOICE_PROMPT_COMMAND_ID: u8 = 0x14; +const SET_VOICE_PROMPT_COMMAND_ID: u8 = 0x0B; // Button report header (incoming from headset) const CONSUMER_CONTROL_HEADER: u8 = 0x0f; @@ -235,8 +236,13 @@ impl Device for CloudIIISWireless { Some(packet) } - fn set_voice_prompt_packet(&self, _enable: bool) -> Option> { - None + fn set_voice_prompt_packet(&self, enable: bool) -> Option> { + // Confirmed via NGenuity USB capture: `0c 02 03 00 00 0b <0|1>`. + let mut packet = BASE_PACKET.to_vec(); + packet[3] = 0x00; + packet[5] = SET_VOICE_PROMPT_COMMAND_ID; + packet[6] = enable as u8; + Some(packet) } fn get_wireless_connected_status_packet(&self) -> Option> { From b016e6e06bdf0fd96c8c20b90c7cd696371a102c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Thu, 30 Apr 2026 14:27:54 +0200 Subject: [PATCH 3/3] Cleanup --- src/devices/cloud_iii_s_wireless.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/devices/cloud_iii_s_wireless.rs b/src/devices/cloud_iii_s_wireless.rs index 510e27d..746bab1 100644 --- a/src/devices/cloud_iii_s_wireless.rs +++ b/src/devices/cloud_iii_s_wireless.rs @@ -213,8 +213,6 @@ impl Device for CloudIIISWireless { } fn set_side_tone_packet(&self, side_tone_on: bool) -> Option> { - // Confirmed via NGenuity USB capture: `0c 02 03 00 00 0d <0|1>`. - // byte[3] = 0x00 marks a SET (vs 0x01 for GET). let mut packet = BASE_PACKET.to_vec(); packet[3] = 0x00; packet[5] = SET_SIDE_TONE_COMMAND_ID; @@ -237,7 +235,6 @@ impl Device for CloudIIISWireless { } fn set_voice_prompt_packet(&self, enable: bool) -> Option> { - // Confirmed via NGenuity USB capture: `0c 02 03 00 00 0b <0|1>`. let mut packet = BASE_PACKET.to_vec(); packet[3] = 0x00; packet[5] = SET_VOICE_PROMPT_COMMAND_ID;