X-Git-Url: https://git.euphorik.ch/?a=blobdiff_plain;f=src%2Fcorsair_lighting_pro.rs;h=25bee13755773a1b40b76d1da49465d6fe680beb;hb=HEAD;hp=7ccb3731bb885d1507a6376af16d77e848dbb609;hpb=9789f56d04a0a45fdb0495ca4fab6b01ba3d4f3e;p=temp2RGB.git diff --git a/src/corsair_lighting_pro.rs b/src/corsair_lighting_pro.rs index 7ccb373..957326b 100644 --- a/src/corsair_lighting_pro.rs +++ b/src/corsair_lighting_pro.rs @@ -1,4 +1,4 @@ -use crate::rgb::RGB; +use crate::rgb::Rgb; const CORSAIR_VID: u16 = 0x1B1C; const CORSAIR_LIGHTING_NODE_PRO_PID: u16 = 0x0C0B; @@ -32,65 +32,69 @@ pub struct Device { } impl Device { - pub fn new(api: &hidapi::HidApi, initial_color: &RGB) -> Self { + pub fn new(api: &hidapi::HidApi, initial_color: &Rgb) -> anyhow::Result { let device = Device { - device: api - .open(CORSAIR_VID, CORSAIR_LIGHTING_NODE_PRO_PID) - .unwrap(), + device: api.open(CORSAIR_VID, CORSAIR_LIGHTING_NODE_PRO_PID)?, }; for channel_id in 0..CHANNEL_COUNT { - device.send_reset(channel_id); - device.send_begin(channel_id); - device.send_port_state(channel_id, CORSAIR_LIGHTING_NODE_PORT_STATE_HARDWARE); - device.send_effect_config(channel_id, initial_color); - device.send_commit(channel_id); + device.send_reset(channel_id)?; + device.send_begin(channel_id)?; + device.send_port_state(channel_id, CORSAIR_LIGHTING_NODE_PORT_STATE_HARDWARE)?; + device.send_effect_config(channel_id, initial_color)?; + device.send_commit(channel_id)?; } - device + Ok(device) } - fn send_reset(&self, channel_id: u8) { + fn send_reset(&self, channel_id: u8) -> anyhow::Result<()> { let mut buffer = [0u8; 65]; buffer[0x01] = CORSAIR_LIGHTING_NODE_PACKET_ID_RESET; buffer[0x02] = channel_id; - let n_write = self.device.write(&buffer).unwrap(); - assert_eq!(n_write, 65); + let n_write = self.device.write(&buffer)?; + // assert_eq!(n_write, 65); - let n_read = self.device.read(&mut buffer[0..16]).unwrap(); - assert_eq!(n_read, 16); - assert_eq!(buffer[0], 0); + let n_read = self.device.read(&mut buffer[0..16])?; + // assert_eq!(n_read, 16); + // assert_eq!(buffer[0], 0); + + Ok(()) } - fn send_begin(&self, channel_id: u8) { + fn send_begin(&self, channel_id: u8) -> anyhow::Result<()> { let mut buffer = [0u8; 65]; buffer[0x01] = CORSAIR_LIGHTING_NODE_PACKET_ID_BEGIN; buffer[0x02] = channel_id; - let n_write = self.device.write(&buffer).unwrap(); - assert_eq!(n_write, 65); + let n_write = self.device.write(&buffer)?; + // assert_eq!(n_write, 65); + + let n_read = self.device.read(&mut buffer[0..16])?; + // assert_eq!(n_read, 16); + // assert_eq!(buffer[0], 0); - let n_read = self.device.read(&mut buffer[0..16]).unwrap(); - assert_eq!(n_read, 16); - assert_eq!(buffer[0], 0); + Ok(()) } - fn send_port_state(&self, channel_id: u8, state: u8) { + fn send_port_state(&self, channel_id: u8, state: u8) -> anyhow::Result<()> { let mut buffer = [0u8; 65]; buffer[0x01] = CORSAIR_LIGHTING_NODE_PACKET_ID_PORT_STATE; buffer[0x02] = channel_id; buffer[0x03] = state; - let n_write = self.device.write(&buffer).unwrap(); - assert_eq!(n_write, 65); + let n_write = self.device.write(&buffer)?; + // assert_eq!(n_write, 65); + + let n_read = self.device.read(&mut buffer[0..16])?; + // assert_eq!(n_read, 16); + // assert_eq!(buffer[0], 0); - let n_read = self.device.read(&mut buffer[0..16]).unwrap(); - assert_eq!(n_read, 16); - assert_eq!(buffer[0], 0); + Ok(()) } - fn send_effect_config(&self, channel_id: u8, color: &RGB) { + fn send_effect_config(&self, channel_id: u8, color: &Rgb) -> anyhow::Result<()> { println!("{color:?}"); let mut buffer = [0u8; 65]; @@ -111,31 +115,35 @@ impl Device { buffer[offset_color + 3 * i + 2] = color.blue; } - let n_write = self.device.write(&buffer).unwrap(); - assert_eq!(n_write, 65); + let n_write = self.device.write(&buffer)?; + // assert_eq!(n_write, 65); - let n_read = self.device.read(&mut buffer[0..16]).unwrap(); - assert_eq!(n_read, 16); - assert_eq!(buffer[0], 0); + let n_read = self.device.read(&mut buffer[0..16])?; + // assert_eq!(n_read, 16); + // assert_eq!(buffer[0], 0); + + Ok(()) } - fn send_commit(&self, channel_id: u8) { + fn send_commit(&self, channel_id: u8) -> anyhow::Result<()> { let mut buffer = [0u8; 65]; buffer[0x01] = CORSAIR_LIGHTING_NODE_PACKET_ID_COMMIT; buffer[0x02] = 0xFF; - let n_write = self.device.write(&buffer).unwrap(); - assert_eq!(n_write, 65); + let n_write = self.device.write(&buffer)?; + // assert_eq!(n_write, 65); + + let n_read = self.device.read(&mut buffer[0..16])?; + // assert_eq!(n_read, 16); + // assert_eq!(buffer[0], 0); - let n_read = self.device.read(&mut buffer[0..16]).unwrap(); - assert_eq!(n_read, 16); - assert_eq!(buffer[0], 0); + Ok(()) } - pub fn set_color(&self, color: &RGB) { + pub fn set_color(&self, color: &Rgb) -> anyhow::Result<()> { // println!("set_color: {color:?}"); for channel_id in 0..CHANNEL_COUNT { - self.send_port_state(channel_id, CORSAIR_LIGHTING_NODE_PORT_STATE_SOFTWARE); + self.send_port_state(channel_id, CORSAIR_LIGHTING_NODE_PORT_STATE_SOFTWARE)?; let mut buffer = [0u8; 65]; @@ -149,7 +157,7 @@ impl Device { buffer[0x04] = NB_LEDS; // Number of color; buffer[0x05] = color_channel; - let color_component = match color_channel { + let color_component = match color_channel { 0 => color.red, 1 => color.green, _ => color.blue, @@ -159,15 +167,17 @@ impl Device { buffer[0x06 + n as usize] = color_component; } - let n_write = self.device.write(&buffer).unwrap(); - assert_eq!(n_write, 65); + let n_write = self.device.write(&buffer)?; + // assert_eq!(n_write, 65); - let n_read = self.device.read(&mut buffer[0..16]).unwrap(); - assert_eq!(n_read, 16); - assert_eq!(buffer[0], 0); + let n_read = self.device.read(&mut buffer[0..16])?; + // assert_eq!(n_read, 16); + // assert_eq!(buffer[0], 0); } - self.send_commit(channel_id); + self.send_commit(channel_id)?; } + + Ok(()) } }