diff --git a/README.md b/README.md index 05cdc34..3c945b5 100644 --- a/README.md +++ b/README.md @@ -21,9 +21,7 @@ talking. This differs from a simple loopback via PulseAudio as you won't have an - Sidetone, Battery (for Wireless), LED on/off - Logitech G930 - Sidetone, Battery -- SteelSeries Arctis 1 - - Sidetone, Inactive time -- SteelSeries Arctis 1 for XBox +- SteelSeries Arctis 1, Arctis 1 for XBox - Sidetone, Battery, Inactive time - SteelSeries Arctis (7 and Pro) - Sidetone, Battery, Inactive time, Chat-Mix level, LED on/off (allows to turn off the blinking LED on the base-station) diff --git a/src/device_registry.c b/src/device_registry.c index ded0bc6..6b8c275 100644 --- a/src/device_registry.c +++ b/src/device_registry.c @@ -10,13 +10,12 @@ #include "devices/logitech_zone_wired.h" #include "devices/roccat_elo_7_1_air.h" #include "devices/steelseries_arctis_1.h" -#include "devices/steelseries_arctis_1_xbox.h" #include "devices/steelseries_arctis_7.h" #include "devices/steelseries_arctis_9.h" #include -#define NUMDEVICES 13 +#define NUMDEVICES 12 // array of pointers to device static struct device*(devicelist[NUMDEVICES]); @@ -32,10 +31,9 @@ void init_devices() arctis_7_init(&devicelist[6]); arctis_9_init(&devicelist[7]); gpro_init(&devicelist[8]); - arctis_1_xbox_init(&devicelist[9]); - zone_wired_init(&devicelist[10]); - elo71Air_init(&devicelist[11]); - g432_init(&devicelist[12]); + zone_wired_init(&devicelist[9]); + elo71Air_init(&devicelist[10]); + g432_init(&devicelist[11]); } 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 10f0cc5..af8caa0 100644 --- a/src/devices/CMakeLists.txt +++ b/src/devices/CMakeLists.txt @@ -11,8 +11,6 @@ set(SOURCE_FILES ${SOURCE_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/logitech_g533.h ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_1.c ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_1.h - ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_1_xbox.c - ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_1_xbox.h ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_7.c ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_7.h ${CMAKE_CURRENT_SOURCE_DIR}/steelseries_arctis_9.c diff --git a/src/devices/steelseries_arctis_1.c b/src/devices/steelseries_arctis_1.c index b492691..060ea58 100644 --- a/src/devices/steelseries_arctis_1.c +++ b/src/devices/steelseries_arctis_1.c @@ -9,12 +9,13 @@ static struct device device_arctis; -#define ID_ARCTIS_1 0x12b3 +#define ID_ARCTIS_1 0x12b3 +#define ID_ARCTIS_1_XBOX 0x12b6 -static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_1 }; +static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_1, ID_ARCTIS_1_XBOX }; static int arctis_1_send_sidetone(hid_device* device_handle, uint8_t num); -//static int arctis_1_request_battery(hid_device* device_handle); +static int arctis_1_request_battery(hid_device* device_handle); static int arctis_1_send_inactive_time(hid_device* device_handle, uint8_t num); static int arctis_1_save_state(hid_device* device_handle); @@ -28,9 +29,9 @@ void arctis_1_init(struct device** device) strncpy(device_arctis.device_name, "SteelSeries Arctis (1) Wireless", sizeof(device_arctis.device_name)); - device_arctis.capabilities = CAP_SIDETONE | CAP_INACTIVE_TIME; + device_arctis.capabilities = CAP_SIDETONE | CAP_BATTERY_STATUS | CAP_INACTIVE_TIME; device_arctis.send_sidetone = &arctis_1_send_sidetone; - //device_arctis.request_battery = &arctis_1_request_battery; + device_arctis.request_battery = &arctis_1_request_battery; device_arctis.send_inactive_time = &arctis_1_send_inactive_time; *device = &device_arctis; @@ -69,13 +70,12 @@ static int arctis_1_send_sidetone(hid_device* device_handle, uint8_t num) return ret; } -/*static int arctis_1_request_battery(hid_device* device_handle) +static int arctis_1_request_battery(hid_device* device_handle) { - int r = 0; // request battery status - unsigned char data_request[2] = { 0x06, 0x18 }; + unsigned char data_request[2] = { 0x06, 0x12 }; r = hid_write(device_handle, data_request, 2); @@ -90,13 +90,16 @@ static int arctis_1_send_sidetone(hid_device* device_handle, uint8_t num) if (r < 0) return r; - int bat = data_read[2]; + if (data_read[2] == 0x01) + return BATTERY_UNAVAILABLE; + + int bat = data_read[3]; if (bat > 100) return 100; return bat; -}*/ +} static int arctis_1_send_inactive_time(hid_device* device_handle, uint8_t num) { diff --git a/src/devices/steelseries_arctis_1_xbox.c b/src/devices/steelseries_arctis_1_xbox.c deleted file mode 100644 index 8a71c49..0000000 --- a/src/devices/steelseries_arctis_1_xbox.c +++ /dev/null @@ -1,125 +0,0 @@ -#include "../device.h" -#include "../utility.h" - -#include -#include -#include - -#include - -static struct device device_arctis; - -#define ID_ARCTIS_1_XBOX 0x12b6 - -static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_1_XBOX }; - -static int arctis_1_xbox_send_sidetone(hid_device* device_handle, uint8_t num); -static int arctis_1_xbox_request_battery(hid_device* device_handle); -static int arctis_1_xbox_send_inactive_time(hid_device* device_handle, uint8_t num); - -static int arctis_1_xbox_save_state(hid_device* device_handle); - -void arctis_1_xbox_init(struct device** device) -{ - device_arctis.idVendor = VENDOR_STEELSERIES; - device_arctis.idProductsSupported = PRODUCT_IDS; - device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); - device_arctis.idInterface = 0x03; - - strncpy(device_arctis.device_name, "SteelSeries Arctis (1) Wireless For XBox", sizeof(device_arctis.device_name)); - - device_arctis.capabilities = CAP_SIDETONE | CAP_INACTIVE_TIME | CAP_BATTERY_STATUS; - device_arctis.send_sidetone = &arctis_1_xbox_send_sidetone; - device_arctis.request_battery = &arctis_1_xbox_request_battery; - device_arctis.send_inactive_time = &arctis_1_xbox_send_inactive_time; - - *device = &device_arctis; -} - -static int arctis_1_xbox_send_sidetone(hid_device* device_handle, uint8_t num) -{ - int ret = -1; - - // the range of the Arctis 1 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); - - free(buf); - - if (ret >= 0) { - ret = arctis_1_xbox_save_state(device_handle); - } - - return ret; -} - -static int arctis_1_xbox_request_battery(hid_device* device_handle) -{ - int r = 0; - - // request battery status - unsigned char data_request[2] = { 0x06, 0x12 }; - - 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; - - if (data_read[2] == 0x01) - return BATTERY_UNAVAILABLE; - - int bat = data_read[3]; - - if (bat > 100) - return 100; - - return bat; -} - -static int arctis_1_xbox_send_inactive_time(hid_device* device_handle, uint8_t num) -{ - // as the value is in minutes, mapping to a different range does not make too much sense here - // the range of the Arctis 7 seems to be from 0 to 0x5A (90) - // num = map(num, 0, 128, 0x00, 0x5A); - - uint8_t data[31] = { 0x06, 0x51, num }; - - int ret = hid_write(device_handle, data, 31); - - if (ret >= 0) { - ret = arctis_1_xbox_save_state(device_handle); - } - - return ret; -} - -int arctis_1_xbox_save_state(hid_device* device_handle) -{ - uint8_t data[31] = { 0x06, 0x09 }; - - return hid_write(device_handle, data, 31); -} diff --git a/src/devices/steelseries_arctis_1_xbox.h b/src/devices/steelseries_arctis_1_xbox.h deleted file mode 100644 index 31eb3b1..0000000 --- a/src/devices/steelseries_arctis_1_xbox.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -void arctis_1_xbox_init(struct device** device);