From 7eb5b6e178b572a7d332c6921565153bfff5dde7 Mon Sep 17 00:00:00 2001 From: Farrell Hayman Date: Sun, 4 Aug 2019 20:57:10 +0100 Subject: [PATCH 1/9] Add battery support for SteelSeries Arctis 7 (Pre-2019) --- src/devices/steelseries_arctis7.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/devices/steelseries_arctis7.c b/src/devices/steelseries_arctis7.c index bf78a26..15ae991 100644 --- a/src/devices/steelseries_arctis7.c +++ b/src/devices/steelseries_arctis7.c @@ -4,10 +4,12 @@ #include #include #include +#include static struct device device_arctis7; static int arctis7_send_sidetone(hid_device *device_handle, uint8_t num); +static int arctis7_request_battery(hid_device *device_handle); void arctis7_init(struct device** device) { @@ -17,8 +19,9 @@ void arctis7_init(struct device** device) strcpy(device_arctis7.device_name, "SteelSeries Arctis 7"); - device_arctis7.capabilities = CAP_SIDETONE; + device_arctis7.capabilities = CAP_SIDETONE | CAP_BATTERY_STATUS; device_arctis7.send_sidetone = &arctis7_send_sidetone; + device_arctis7.request_battery = &arctis7_request_battery; *device = &device_arctis7; } @@ -55,3 +58,25 @@ static int arctis7_send_sidetone(hid_device *device_handle, uint8_t num) return ret; } + +static int arctis7_request_battery(hid_device *device_handle) +{ + + int r = 0; + + // request battery status + unsigned char data_request[2] = {0x06, 0x18}; + + r = hid_write(device_handle, data_request, 2); + + if (r < 0) return r; + + // read battery status + unsigned char data_read[8]; + + r = hid_read(device_handle, data_read, 8); + + if (r < 0) return r; + + return data_read[2]; +} From 44e539a3726f7e3d613c1d64f5da1082f441c615 Mon Sep 17 00:00:00 2001 From: James Johnstone Date: Sun, 4 Aug 2019 22:40:52 +0100 Subject: [PATCH 2/9] Adding support for 2019 Arctis 7 variant. --- src/device_registry.c | 6 +- src/devices/CMakeLists.txt | 2 + src/devices/steelseries_arctis7_2019.c | 82 +++++++++++++++++++++++ src/devices/steelseries_arctis7_2019.h | 3 + udev/50-steelseries-arctis-7-2019.rules | 1 + udev/50-steelseries-arctis-pro-2019.rules | 2 +- 6 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 src/devices/steelseries_arctis7_2019.c create mode 100644 src/devices/steelseries_arctis7_2019.h create mode 100644 udev/50-steelseries-arctis-7-2019.rules diff --git a/src/device_registry.c b/src/device_registry.c index 7dd04a6..7b569ef 100644 --- a/src/device_registry.c +++ b/src/device_registry.c @@ -8,12 +8,13 @@ #include "devices/logitech_g633.h" #include "devices/logitech_g930.h" #include "devices/steelseries_arctis7.h" +#include "devices/steelseries_arctis7_2019.h" #include "devices/steelseries_arctispro_2019.h" #include -#define NUMDEVICES 9 +#define NUMDEVICES 10 // array of pointers to device static struct device *(devicelist[NUMDEVICES]); @@ -27,7 +28,8 @@ void init_devices() g633_init(&devicelist[5]); g930_init(&devicelist[6]); arctis7_init(&devicelist[7]); - arctispro_2019_init(&devicelist[8]); + arctis7_2019_init(&devicelist[8]); + arctispro_2019_init(&devicelist[9]); } int get_device(struct device* device_found, uint16_t idVendor, uint16_t idProduct) diff --git a/src/devices/CMakeLists.txt b/src/devices/CMakeLists.txt index 5781a05..e652a0a 100644 --- a/src/devices/CMakeLists.txt +++ b/src/devices/CMakeLists.txt @@ -15,6 +15,8 @@ set(SOURCE_FILES ${SOURCE_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/logitech_g633.h ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis7.c ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis7.h + ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis7_2019.c + ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis7_2019.h ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctispro_2019.c ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctispro_2019.h PARENT_SCOPE) diff --git a/src/devices/steelseries_arctis7_2019.c b/src/devices/steelseries_arctis7_2019.c new file mode 100644 index 0000000..1e9bfe7 --- /dev/null +++ b/src/devices/steelseries_arctis7_2019.c @@ -0,0 +1,82 @@ +#include "../device.h" +#include "../utility.h" + +#include +#include +#include +#include + +static struct device device_arctis7_2019; + +static int arctis7_2019_send_sidetone(hid_device *device_handle, uint8_t num); +static int arctis7_2019_request_battery(hid_device *device_handle); + +void arctis7_2019_init(struct device** device) +{ + device_arctis7_2019.idVendor = VENDOR_STEELSERIES; + device_arctis7_2019.idProduct = 0x12ad; + device_arctis7_2019.idInterface = 0x05; + + strcpy(device_arctis7_2019.device_name, "SteelSeries Arctis 7"); + + device_arctis7_2019.capabilities = CAP_SIDETONE | CAP_BATTERY_STATUS; + device_arctis7_2019.send_sidetone = &arctis7_2019_send_sidetone; + device_arctis7_2019.request_battery = &arctis7_2019_request_battery; + + *device = &device_arctis7_2019; +} + +static int arctis7_2019_send_sidetone(hid_device *device_handle, uint8_t num) +{ + int ret = -1; + + // the range of the Arctis 7 seems to be from 0 to 0x12 (18) + num = map(num, 0, 128, 0x00, 0x12); + + unsigned char *buf = calloc(31, 1); + + if (!buf) + { + return ret; + } + + const unsigned char data_on[5] = {0x06, 0x35, 0x01, 0x00, num}; + const unsigned char data_off[2] = {0x06, 0x35}; + + if (num) + { + memmove(buf, data_on, sizeof(data_on)); + } + else + { + memmove(buf, data_off, sizeof(data_off)); + } + + ret = hid_write(device_handle, buf, 31); + + SAFE_FREE(buf); + + return ret; +} + +static int arctis7_2019_request_battery(hid_device *device_handle) +{ + + int r = 0; + + // request battery status + unsigned char data_request[2] = {0x06, 0x18}; + + r = hid_write(device_handle, data_request, 2); + + if (r < 0) return r; + + // read battery status + unsigned char data_read[8]; + + r = hid_read(device_handle, data_read, 8); + + if (r < 0) return r; + + return data_read[2]; +} diff --git a/src/devices/steelseries_arctis7_2019.h b/src/devices/steelseries_arctis7_2019.h new file mode 100644 index 0000000..5b6b5a6 --- /dev/null +++ b/src/devices/steelseries_arctis7_2019.h @@ -0,0 +1,3 @@ +#pragma once + +void arctis7_2019_init(struct device** device); diff --git a/udev/50-steelseries-arctis-7-2019.rules b/udev/50-steelseries-arctis-7-2019.rules new file mode 100644 index 0000000..986a8e6 --- /dev/null +++ b/udev/50-steelseries-arctis-7-2019.rules @@ -0,0 +1 @@ +SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1260", MODE="0666" diff --git a/udev/50-steelseries-arctis-pro-2019.rules b/udev/50-steelseries-arctis-pro-2019.rules index 0dec57e..8410f36 100644 --- a/udev/50-steelseries-arctis-pro-2019.rules +++ b/udev/50-steelseries-arctis-pro-2019.rules @@ -1 +1 @@ -SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1252", MODE="0666" +SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12ad", MODE="0666" From ccd8e11452dd9f2eff197c6c58d28f114d9e463e Mon Sep 17 00:00:00 2001 From: James Johnstone Date: Sun, 4 Aug 2019 23:47:06 +0100 Subject: [PATCH 3/9] Correcting error in udev rules. --- udev/50-steelseries-arctis-7-2019.rules | 2 +- udev/50-steelseries-arctis-pro-2019.rules | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/udev/50-steelseries-arctis-7-2019.rules b/udev/50-steelseries-arctis-7-2019.rules index 986a8e6..1593d26 100644 --- a/udev/50-steelseries-arctis-7-2019.rules +++ b/udev/50-steelseries-arctis-7-2019.rules @@ -1 +1 @@ -SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1260", MODE="0666" +SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="12ad", MODE="0666" diff --git a/udev/50-steelseries-arctis-pro-2019.rules b/udev/50-steelseries-arctis-pro-2019.rules index 8410f36..0dec57e 100644 --- a/udev/50-steelseries-arctis-pro-2019.rules +++ b/udev/50-steelseries-arctis-pro-2019.rules @@ -1 +1 @@ -SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12ad", MODE="0666" +SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1252", MODE="0666" From 60b482ed79f034b6a744455cc25faeb91741d494 Mon Sep 17 00:00:00 2001 From: raiscan Date: Mon, 5 Aug 2019 15:03:18 +0100 Subject: [PATCH 4/9] Remove unnecessary stdio.h include --- src/devices/steelseries_arctis7_2019.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/devices/steelseries_arctis7_2019.c b/src/devices/steelseries_arctis7_2019.c index 1e9bfe7..1e55258 100644 --- a/src/devices/steelseries_arctis7_2019.c +++ b/src/devices/steelseries_arctis7_2019.c @@ -4,7 +4,6 @@ #include #include #include -#include static struct device device_arctis7_2019; From 1e18179f854412fd4972716889185c4e9ad07201 Mon Sep 17 00:00:00 2001 From: raiscan Date: Mon, 5 Aug 2019 15:03:44 +0100 Subject: [PATCH 5/9] Remove unnecessary stdio.h include --- src/devices/steelseries_arctis7.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/devices/steelseries_arctis7.c b/src/devices/steelseries_arctis7.c index 15ae991..707aab0 100644 --- a/src/devices/steelseries_arctis7.c +++ b/src/devices/steelseries_arctis7.c @@ -4,7 +4,6 @@ #include #include #include -#include static struct device device_arctis7; From 97d78578110ffabf65336973fcf10706ad5acfff Mon Sep 17 00:00:00 2001 From: James Johnstone Date: Mon, 5 Aug 2019 21:21:40 +0100 Subject: [PATCH 6/9] Updating README.md to include updates for SteelSeries Arctis 7. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3765d9..1a4b8a7 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,12 @@ talking. This differs from a simple loopback via PulseAudio as you won't have an - Logitech G533 - Logitech G430 (Last working on macOS in commit 41be99379f) - SteelSeries Arctis 7 +- SteelSeries Arctis 7 (2019 Revision) - SteelSeries Arctis Pro 2019 Edition ### Other Features -Corsair Void (Pro) also supports checking of the battery. +Corsair Void (Pro) and both versions of SteelSeries Arctis 7 also support checking of the battery. For more features (like getting battery percentage of other devices, or settings LEDs etc. of specific devices), the protocol of the respective headset must be analyzed further. This can be done by capturing the USB traffic and analyzing it with WireShark or USBlyzer. From 669aac0fc63ba4f2f3c64662765c4a98fce28916 Mon Sep 17 00:00:00 2001 From: Farrell Hayman Date: Mon, 5 Aug 2019 21:53:20 +0100 Subject: [PATCH 7/9] Fix 50-steelseries-arctis-7.rules (#3) Fix 50-steelseries-arctis-7.rules UDev rule, According to Udev versions used in Ubuntu 19.04. Previous version did not work. --- udev/50-steelseries-arctis-7.rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/udev/50-steelseries-arctis-7.rules b/udev/50-steelseries-arctis-7.rules index 986a8e6..2fb450c 100644 --- a/udev/50-steelseries-arctis-7.rules +++ b/udev/50-steelseries-arctis-7.rules @@ -1 +1 @@ -SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="1260", MODE="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1260", MODE="0666" From 2128b7844976c527fe1af68d8303e075286b3037 Mon Sep 17 00:00:00 2001 From: Farrell Hayman Date: Wed, 7 Aug 2019 10:31:34 +0100 Subject: [PATCH 8/9] Fix 50-steelseries-arctis-7-2019.rules Fix 50-steelseries-arctis-7-2019.rules (in line with the changes made for non-2019) --- udev/50-steelseries-arctis-7-2019.rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/udev/50-steelseries-arctis-7-2019.rules b/udev/50-steelseries-arctis-7-2019.rules index 1593d26..2c242a7 100644 --- a/udev/50-steelseries-arctis-7-2019.rules +++ b/udev/50-steelseries-arctis-7-2019.rules @@ -1 +1 @@ -SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTR{idVendor}=="1038", ATTR{idProduct}=="12ad", MODE="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12ad", MODE="0666" From 400a0337c5f401d5f328bdac429aaf3a33097dba Mon Sep 17 00:00:00 2001 From: Farrell Hayman Date: Wed, 7 Aug 2019 10:48:28 +0100 Subject: [PATCH 9/9] Cap Arctis7 battery readout to 100% if over (due to inaccurate battery measurement) --- src/devices/steelseries_arctis7.c | 6 +++++- src/devices/steelseries_arctis7_2019.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/devices/steelseries_arctis7.c b/src/devices/steelseries_arctis7.c index 707aab0..11cf5f8 100644 --- a/src/devices/steelseries_arctis7.c +++ b/src/devices/steelseries_arctis7.c @@ -77,5 +77,9 @@ static int arctis7_request_battery(hid_device *device_handle) if (r < 0) return r; - return data_read[2]; + int bat = data_read[2]; + + if (bat > 100) return 100; + + return bat; } diff --git a/src/devices/steelseries_arctis7_2019.c b/src/devices/steelseries_arctis7_2019.c index 1e55258..3fff720 100644 --- a/src/devices/steelseries_arctis7_2019.c +++ b/src/devices/steelseries_arctis7_2019.c @@ -77,5 +77,9 @@ static int arctis7_2019_request_battery(hid_device *device_handle) if (r < 0) return r; - return data_read[2]; + int bat = data_read[2]; + + if (bat > 100) return 100; + + return bat; }