From 4e5da605a9d46f1a3fbae64794f4ec08c510aeab Mon Sep 17 00:00:00 2001 From: damnkrat <32395839+damnkrat@users.noreply.github.com> Date: Wed, 8 Jan 2025 00:44:09 +0300 Subject: [PATCH] Support Ajazz AKP153R (#26) * Support Ajazz AKP153R * Support AKP153R * Support AKP153R * Remove unnecessary E in PID --- 40-streamdeck.rules | 4 ++++ README.md | 1 + examples/simple/Cargo.toml | 2 +- src/info.rs | 24 ++++++++++++++++-------- src/lib.rs | 38 +++++++++++++++++++------------------- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/40-streamdeck.rules b/40-streamdeck.rules index 0f04c5f..4089591 100644 --- a/40-streamdeck.rules +++ b/40-streamdeck.rules @@ -12,6 +12,7 @@ SUBSYSTEM=="usb", ATTR{idVendor}=="5548", ATTR{idProduct}=="6670", MODE="0660", SUBSYSTEM=="usb", ATTR{idVendor}=="5548", ATTR{idProduct}=="6672", MODE="0660", GROUP="plugdev" SUBSYSTEM=="usb", ATTR{idVendor}=="5548", ATTR{idProduct}=="6674", MODE="0660", GROUP="plugdev" SUBSYSTEM=="usb", ATTR{idVendor}=="0300", ATTR{idProduct}=="1010", MODE="0660", GROUP="plugdev" +SUBSYSTEM=="usb", ATTR{idVendor}=="0300", ATTR{idProduct}=="1020", MODE="0660", GROUP="plugdev" SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0060", MODE="0660", GROUP="plugdev" SUBSYSTEM=="usb", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0063", MODE="0660", GROUP="plugdev" @@ -27,6 +28,7 @@ SUBSYSTEM=="usb", ATTRS{idVendor}=="5548", ATTRS{idProduct}=="6670", MODE="0660" SUBSYSTEM=="usb", ATTRS{idVendor}=="5548", ATTRS{idProduct}=="6672", MODE="0660", GROUP="plugdev" SUBSYSTEM=="usb", ATTRS{idVendor}=="5548", ATTRS{idProduct}=="6674", MODE="0660", GROUP="plugdev" SUBSYSTEM=="usb", ATTRS{idVendor}=="0300", ATTRS{idProduct}=="1010", MODE="0660", GROUP="plugdev" +SUBSYSTEM=="usb", ATTRS{idVendor}=="0300", ATTRS{idProduct}=="1020", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="0fd9", ATTR{idProduct}=="0060", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="0fd9", ATTR{idProduct}=="0063", MODE="0660", GROUP="plugdev" @@ -42,6 +44,7 @@ KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="5548", ATTR{idProduct}= KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="5548", ATTR{idProduct}=="6672", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="5548", ATTR{idProduct}=="6674", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="0300", ATTR{idProduct}=="1010", MODE="0660", GROUP="plugdev" +KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTR{idVendor}=="0300", ATTR{idProduct}=="1020", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0060", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0fd9", ATTRS{idProduct}=="0063", MODE="0660", GROUP="plugdev" @@ -57,3 +60,4 @@ KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="5548", ATTRS{idProduct KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="5548", ATTRS{idProduct}=="6672", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="5548", ATTRS{idProduct}=="6674", MODE="0660", GROUP="plugdev" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0300", ATTRS{idProduct}=="1010", MODE="0660", GROUP="plugdev" +KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="0300", ATTRS{idProduct}=="1020", MODE="0660", GROUP="plugdev" diff --git a/README.md b/README.md index 55e1193..2231543 100644 --- a/README.md +++ b/README.md @@ -78,5 +78,6 @@ But as it stands, this library should support following devices: - Stream Deck Neo (thanks to [@ejiektpobehuk](https://github.com/ejiektpobehuk), [@AkechiShiro](https://github.com/AkechiShiro) and [node-elgato-stream-deck](https://github.com/Julusian/node-elgato-stream-deck)) - Ajazz AKP153 (thanks to [@ZCube](https://github.com/ZCube)) - Ajazz AKP153E (thanks to [@teras](https://github.com/teras)) +- Ajazz AKP153R (thanks to [@teras](https://github.com/teras) and [@damnkrat](https://github.com/damnkrat)) - Ajazz AKP815 (thanks to [@teras](https://github.com/teras)) - MiraBox HSV293S (thanks to [@czyz](https://github.com/czyz)) diff --git a/examples/simple/Cargo.toml b/examples/simple/Cargo.toml index a1c2ce1..389f7f4 100644 --- a/examples/simple/Cargo.toml +++ b/examples/simple/Cargo.toml @@ -3,7 +3,7 @@ name = "simple" edition = "2021" [dependencies] -hidapi = { version = "2.6", default-features = false } +hidapi = { version = "2.6", default-features = true } image = { version = "0.25.1", default-features = false, features = [ "bmp", "jpeg", diff --git a/src/info.rs b/src/info.rs index bda6536..8e9dd3b 100644 --- a/src/info.rs +++ b/src/info.rs @@ -38,7 +38,10 @@ pub const PID_AJAZZ_AKP815: u16 = 0x6672; pub const AJAZZ_VENDOR_ID_2: u16 = 0x0300; /// Product ID of Ajazz AKP153E Desk Controller -pub const PID_AJAZZ_E_AKP153E: u16 = 0x1010; +pub const PID_AJAZZ_AKP153E: u16 = 0x1010; + +/// Product ID of Ajazz AKP153R Desk Controller +pub const PID_AJAZZ_AKP153R: u16 = 0x1020; const RECOGNIZED_VENDORS: &'static [u16] = &[ELGATO_VENDOR_ID, AJAZZ_VENDOR_ID_1, AJAZZ_VENDOR_ID_2]; @@ -74,6 +77,8 @@ pub enum Kind { Akp153, /// Ajazz AKP153E Desk Controller Akp153E, + /// Ajazz AKP153R Desk Controller + Akp153R, /// Ajazz AKP815 Desk Controller Akp815, /// MiraBox HSV293S @@ -100,7 +105,8 @@ impl Kind { AJAZZ_VENDOR_ID_1 | AJAZZ_VENDOR_ID_2 => match pid { PID_AJAZZ_AKP153 => Some(Kind::Akp153), - PID_AJAZZ_E_AKP153E => Some(Kind::Akp153E), + PID_AJAZZ_AKP153E => Some(Kind::Akp153E), + PID_AJAZZ_AKP153R => Some(Kind::Akp153R), PID_AJAZZ_AKP815 => Some(Kind::Akp815), PID_MIRABOX_HSV293S => Some(Kind::MiraBoxHSV293S), _ => None, @@ -125,7 +131,8 @@ impl Kind { Kind::Plus => PID_STREAMDECK_PLUS, Kind::Akp153 => PID_AJAZZ_AKP153, Kind::Akp815 => PID_AJAZZ_AKP815, - Kind::Akp153E => PID_AJAZZ_E_AKP153E, + Kind::Akp153E => PID_AJAZZ_AKP153E, + Kind::Akp153R => PID_AJAZZ_AKP153R, Kind::MiraBoxHSV293S => PID_MIRABOX_HSV293S, } } @@ -146,6 +153,7 @@ impl Kind { Kind::Akp153 => AJAZZ_VENDOR_ID_1, Kind::Akp815 => AJAZZ_VENDOR_ID_1, Kind::Akp153E => AJAZZ_VENDOR_ID_2, + Kind::Akp153R => AJAZZ_VENDOR_ID_2, Kind::MiraBoxHSV293S => AJAZZ_VENDOR_ID_1, } } @@ -158,7 +166,7 @@ impl Kind { Kind::Xl | Kind::XlV2 => 32, Kind::Pedal => 3, Kind::Neo | Kind::Plus => 8, - Kind::Akp153 | Kind::Akp153E | Kind::MiraBoxHSV293S => 15 + 3, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::MiraBoxHSV293S => 15 + 3, Kind::Akp815 => 15, } } @@ -171,7 +179,7 @@ impl Kind { Kind::Xl | Kind::XlV2 => 4, Kind::Pedal => 1, Kind::Neo | Kind::Plus => 2, - Kind::Akp153 | Kind::Akp153E | Kind::MiraBoxHSV293S => 3, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::MiraBoxHSV293S => 3, Kind::Akp815 => 5, } } @@ -184,7 +192,7 @@ impl Kind { Kind::Xl | Kind::XlV2 => 8, Kind::Pedal => 3, Kind::Neo | Kind::Plus => 4, - Kind::Akp153 | Kind::Akp153E | Kind::MiraBoxHSV293S => 6, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::MiraBoxHSV293S => 6, Kind::Akp815 => 3, } } @@ -210,7 +218,7 @@ impl Kind { match self { Kind::Plus => Some((800, 100)), Kind::Neo => Some((248, 58)), - Kind::Akp153 | Kind::Akp153E | Kind::MiraBoxHSV293S => Some((854, 480)), + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::MiraBoxHSV293S => Some((854, 480)), Kind::Akp815 => Some((800, 480)), _ => None, } @@ -269,7 +277,7 @@ impl Kind { Kind::Pedal => ImageFormat::default(), - Kind::Akp153 | Kind::Akp153E | Kind::MiraBoxHSV293S => ImageFormat { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::MiraBoxHSV293S => ImageFormat { mode: ImageMode::JPEG, size: (85, 85), rotation: ImageRotation::Rot90, diff --git a/src/lib.rs b/src/lib.rs index 1187f20..a057718 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -223,7 +223,7 @@ impl StreamDeck { } self.initialized.store(true, Ordering::Release); match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let mut buf = vec![0x43, 0x52, 0x54, 0x00, 0x00, 0x44, 0x49, 0x53]; buf.extend(vec![0u8; 512 - buf.len()]); write_data(&self.device, buf.as_slice())?; @@ -260,7 +260,7 @@ impl StreamDeck { } } - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let data = match self.kind { _ => read_data(&self.device, 512, timeout), }?; @@ -312,7 +312,7 @@ impl StreamDeck { Ok(send_feature_report(&self.device, buf.as_slice())?) } - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => Ok({ + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => Ok({ self.set_brightness(100)?; self.clear_button_image(0xff)?; }), @@ -341,7 +341,7 @@ impl StreamDeck { Ok(send_feature_report(&self.device, buf.as_slice())?) } - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let mut buf = vec![0x43, 0x52, 0x54, 0x00, 0x00, 0x4c, 0x49, 0x47, 0x00, 0x00, percent]; buf.extend(vec![0u8; 512 - buf.len()]); @@ -368,7 +368,7 @@ impl StreamDeck { let key = if let Kind::Original = self.kind { flip_key_index(&self.kind, key) - } else if let Kind::Akp153 | Kind::Akp153E | Kind::MiraBoxHSV293S = self.kind { + } else if let Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::MiraBoxHSV293S = self.kind { elgato_to_ajazz153(&self.kind, key) } else if let Kind::Akp815 = self.kind { inverse_key_index(&self.kind, key) @@ -381,7 +381,7 @@ impl StreamDeck { } match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let mut buf = vec![ 0x43, 0x52, @@ -414,7 +414,7 @@ impl StreamDeck { Kind::Mini | Kind::MiniMk2 => vec![0x02, 0x01, page_number as u8, 0, if last_package { 1 } else { 0 }, key + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => vec![], + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => vec![], _ => vec![ 0x02, @@ -554,7 +554,7 @@ impl StreamDeck { pub fn clear_button_image(&self, key: u8) -> Result<(), StreamDeckError> { self.initialize()?; match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let key = if self.kind == Kind::Akp815 { inverse_key_index(&self.kind, key) } else { @@ -579,7 +579,7 @@ impl StreamDeck { pub fn clear_all_button_images(&self) -> Result<(), StreamDeckError> { self.initialize()?; match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => self.clear_button_image(0xff), + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => self.clear_button_image(0xff), _ => { for i in 0..self.kind.key_count() { self.clear_button_image(i)? @@ -601,7 +601,7 @@ impl StreamDeck { pub fn set_logo_image(&self, image: DynamicImage) -> Result<(), StreamDeckError> { self.initialize()?; match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => (), + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => (), _ => return Err(StreamDeckError::UnsupportedOperation), } @@ -676,13 +676,13 @@ impl StreamDeck { let image_report_length = match self.kind { Kind::Original => 8191, - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => 512, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => 512, _ => 1024, }; let image_report_header_length = match self.kind { Kind::Original | Kind::Mini | Kind::MiniMk2 => 16, - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => 0, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => 0, _ => 8, }; @@ -735,7 +735,7 @@ impl StreamDeck { pub fn sleep(&self) -> Result<(), StreamDeckError> { self.initialize()?; match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let mut buf = vec![0x43, 0x52, 0x54, 0x00, 0x00, 0x48, 0x41, 0x4e]; buf.extend(vec![0u8; 512 - buf.len()]); @@ -753,7 +753,7 @@ impl StreamDeck { pub fn keep_alive(&self) -> Result<(), StreamDeckError> { self.initialize()?; match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let mut buf = vec![0x43, 0x52, 0x54, 0x00, 0x00, 0x43, 0x4F, 0x4E, 0x4E, 0x45, 0x43, 0x54]; buf.extend(vec![0u8; 512 - buf.len()]); write_data(&self.device, buf.as_slice())?; @@ -768,7 +768,7 @@ impl StreamDeck { pub fn shutdown(&self) -> Result<(), StreamDeckError> { self.initialize()?; match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 => { let mut buf = vec![0x43, 0x52, 0x54, 0x00, 0x00, 0x43, 0x4c, 0x45, 0x00, 0x00, 0x44, 0x43]; buf.extend(vec![0u8; 512 - buf.len()]); write_data(&self.device, buf.as_slice())?; @@ -797,7 +797,7 @@ impl StreamDeck { } match self.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { let mut buf = vec![0x43, 0x52, 0x54, 0x00, 0x00, 0x53, 0x54, 0x50]; buf.extend(vec![0u8; 512 - buf.len()]); @@ -866,13 +866,13 @@ impl WriteImageParameters { pub fn for_key(kind: Kind, image_data_len: usize) -> Self { let image_report_length = match kind { Kind::Original => 8191, - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => 512, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => 512, _ => 1024, }; let image_report_header_length = match kind { Kind::Original | Kind::Mini | Kind::MiniMk2 => 16, - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => 0, + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => 0, _ => 8, }; @@ -1025,7 +1025,7 @@ impl DeviceStateReader { StreamDeckInput::ButtonStateChange(buttons) => { for (index, (their, mine)) in zip(buttons.iter(), my_states.buttons.iter()).enumerate() { match self.device.kind { - Kind::Akp153 | Kind::Akp153E | Kind::Akp815 | Kind::MiraBoxHSV293S => { + Kind::Akp153 | Kind::Akp153E | Kind::Akp153R | Kind::Akp815 | Kind::MiraBoxHSV293S => { if *their { updates.push(DeviceStateUpdate::ButtonDown(index as u8)); updates.push(DeviceStateUpdate::ButtonUp(index as u8));