|
| 1 | +#include "../device.h" |
| 2 | + |
| 3 | +#include <hidapi.h> |
| 4 | +#include <stdio.h> |
| 5 | +#include <string.h> |
| 6 | + |
| 7 | +#define MSG_SIZE 64 |
| 8 | + |
| 9 | +#define ID_ARCTIS_NOVA_3P_WIRELESS 0x2269 |
| 10 | + |
| 11 | +static struct device device_arctis; |
| 12 | + |
| 13 | +static const uint16_t PRODUCT_IDS[] = { ID_ARCTIS_NOVA_3P_WIRELESS }; |
| 14 | +static const uint8_t SAVE_DATA[MSG_SIZE] = { 0x09 }; // Command to save settings to headset |
| 15 | + |
| 16 | +static int arctis_nova_3p_wireless_send_sidetone(hid_device* device_handle, uint8_t num); |
| 17 | + |
| 18 | +void arctis_nova_3p_wireless_init(struct device** device) |
| 19 | +{ |
| 20 | + device_arctis.idVendor = VENDOR_STEELSERIES; |
| 21 | + device_arctis.idProductsSupported = PRODUCT_IDS; |
| 22 | + device_arctis.numIdProducts = sizeof(PRODUCT_IDS) / sizeof(PRODUCT_IDS[0]); |
| 23 | + |
| 24 | + strncpy(device_arctis.device_name, "SteelSeries Arctis Nova 3P Wireless", sizeof(device_arctis.device_name)); |
| 25 | + |
| 26 | + device_arctis.capabilities = B(CAP_SIDETONE); |
| 27 | + // 0xc (3), 0xffc0 (4), 0xff00 (4) |
| 28 | + device_arctis.capability_details[CAP_SIDETONE] = (struct capability_detail) { .usagepage = 0xffc0, .usageid = 0x1, .interface = 4 }; |
| 29 | + |
| 30 | + device_arctis.send_sidetone = &arctis_nova_3p_wireless_send_sidetone; |
| 31 | + // device_arctis.send_equalizer_preset = &arctis_nova_3_send_equalizer_preset; |
| 32 | + // device_arctis.send_equalizer = &arctis_nova_3_send_equalizer; |
| 33 | + // device_arctis.send_microphone_mute_led_brightness = &arctis_nova_3_send_microphone_mute_led_brightness; |
| 34 | + // device_arctis.send_microphone_volume = &arctis_nova_3_send_microphone_volume; |
| 35 | + |
| 36 | + *device = &device_arctis; |
| 37 | +} |
| 38 | + |
| 39 | +static int arctis_nova_3p_wireless_send_sidetone(hid_device* device_handle, uint8_t num) |
| 40 | +{ |
| 41 | + // This headset supports 11 levels of sidetone volume (0x0 to 0xa), |
| 42 | + // mapping a full range of 0-128 input values. |
| 43 | + if (num < 12) { |
| 44 | + num = 0x0; |
| 45 | + } else if (num < 24) { |
| 46 | + num = 0x1; |
| 47 | + } else if (num < 36) { |
| 48 | + num = 0x2; |
| 49 | + } else if (num < 48) { |
| 50 | + num = 0x3; |
| 51 | + } else if (num < 60) { |
| 52 | + num = 0x4; |
| 53 | + } else if (num < 72) { |
| 54 | + num = 0x5; |
| 55 | + } else if (num < 84) { |
| 56 | + num = 0x6; |
| 57 | + } else if (num < 96) { |
| 58 | + num = 0x7; |
| 59 | + } else if (num < 107) { |
| 60 | + num = 0x8; |
| 61 | + } else if (num < 118) { |
| 62 | + num = 0x9; |
| 63 | + } else { // num is 118 or greater (up to 128) |
| 64 | + num = 0xa; |
| 65 | + } |
| 66 | + |
| 67 | + uint8_t data[MSG_SIZE] = { 0x39, num }; |
| 68 | + hid_send_feature_report(device_handle, data, MSG_SIZE); |
| 69 | + |
| 70 | + return hid_send_feature_report(device_handle, SAVE_DATA, MSG_SIZE); |
| 71 | +} |
0 commit comments