mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2026-04-08 16:07:38 -04:00
Kraken V3: Cleanup and add additional devices from pcaps
This commit is contained in:
@@ -389,7 +389,9 @@ REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty Edition", Det
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty Black Edition", DetectRazerControllers, RAZER_VID, RAZER_KRAKEN_KITTY_BLACK_EDITION_PID, 0x01, 0x01, 0x03);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty Black Edition V2", DetectRazerKrakenControllers, RAZER_VID, RAZER_KRAKEN_KITTY_BLACK_EDITION_V2_PID, 0x03, 0x0C, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken Ultimate", DetectRazerKrakenControllers, RAZER_VID, RAZER_KRAKEN_ULTIMATE_PID, 0x03, 0x0C, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken V3 HyperSense", DetectRazerKrakenV3Controllers,RAZER_VID, RAZER_KRAKEN_V3_HYPERSENSE_PID, 0x03, 0x0C, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken V3 X", DetectRazerKrakenV3Controllers,RAZER_VID, RAZER_KRAKEN_V3_X_PID, 0x03, 0x0C, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken V3", DetectRazerKrakenV3Controllers,RAZER_VID, RAZER_KRAKEN_V3_PID, 0x03, 0x0C, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken V4 (Wired)", DetectRazerKrakenV4Controllers,RAZER_VID, RAZER_KRAKEN_V4_WIRED_PID, 0x05, 0xFF14, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken V4 (Wireless)", DetectRazerKrakenV4Controllers,RAZER_VID, RAZER_KRAKEN_V4_WIRELESS_PID, 0x05, 0xFF14, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Razer Kraken Kitty V3 Pro (Wired)", DetectRazerKrakenV4Controllers,RAZER_VID, RAZER_KRAKEN_KITTY_V3_PRO_WIRED_PID, 0x05, 0xFF14, 0x01);
|
||||
|
||||
@@ -7736,6 +7736,41 @@ static const razer_device kraken_kitty_black_v2_device =
|
||||
NULL
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------*\
|
||||
| Razer Kraken V3 HyperSense 1532:0533 |
|
||||
| |
|
||||
| Zone "Headset" |
|
||||
| Single |
|
||||
| 1 LED |
|
||||
\*-------------------------------------------------------------*/
|
||||
static const razer_zone kraken_v3_hs_zone =
|
||||
{
|
||||
"Headset",
|
||||
ZONE_TYPE_SINGLE,
|
||||
1,
|
||||
1
|
||||
};
|
||||
|
||||
static const razer_device kraken_v3_hs_device =
|
||||
{
|
||||
"Razer Kraken V3 HyperSense",
|
||||
RAZER_KRAKEN_V3_HYPERSENSE_PID,
|
||||
DEVICE_TYPE_HEADSET,
|
||||
RAZER_MATRIX_TYPE_NONE,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
{
|
||||
&kraken_v3_hs_zone,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
},
|
||||
NULL
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------*\
|
||||
| Razer Kraken V3 X 1532:0537 |
|
||||
| |
|
||||
@@ -7771,6 +7806,41 @@ static const razer_device kraken_v3_x_device =
|
||||
NULL
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------*\
|
||||
| Razer Kraken V3 1532:0549 |
|
||||
| |
|
||||
| Zone "Headset" |
|
||||
| Single |
|
||||
| 1 LED |
|
||||
\*-------------------------------------------------------------*/
|
||||
static const razer_zone kraken_v3_zone =
|
||||
{
|
||||
"Headset",
|
||||
ZONE_TYPE_SINGLE,
|
||||
1,
|
||||
1
|
||||
};
|
||||
|
||||
static const razer_device kraken_v3_device =
|
||||
{
|
||||
"Razer Kraken V3",
|
||||
RAZER_KRAKEN_V3_PID,
|
||||
DEVICE_TYPE_HEADSET,
|
||||
RAZER_MATRIX_TYPE_NONE,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
{
|
||||
&kraken_v3_zone,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
},
|
||||
NULL
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------*\
|
||||
| Razer Kraken V4 Wired 1532:056B |
|
||||
| |
|
||||
@@ -9112,7 +9182,9 @@ const razer_device* razer_device_list[] =
|
||||
&kraken_ultimate_device,
|
||||
&kraken_kitty_device,
|
||||
&kraken_kitty_black_v2_device,
|
||||
&kraken_v3_hs_device,
|
||||
&kraken_v3_x_device,
|
||||
&kraken_v3_device,
|
||||
&kraken_v4_wired_device,
|
||||
&kraken_v4_wireless_device,
|
||||
&kraken_kitty_v3_pro_wired_device,
|
||||
|
||||
@@ -225,7 +225,9 @@
|
||||
#define RAZER_KRAKEN_ULTIMATE_PID 0x0527
|
||||
#define RAZER_KRAKEN_V2_PID 0x0510
|
||||
#define RAZER_KRAKEN_KITTY_BLACK_EDITION_V2_PID 0x0560
|
||||
#define RAZER_KRAKEN_V3_HYPERSENSE_PID 0x0533
|
||||
#define RAZER_KRAKEN_V3_X_PID 0x0537
|
||||
#define RAZER_KRAKEN_V3_PID 0x0549
|
||||
#define RAZER_KRAKEN_V4_WIRED_PID 0x056B
|
||||
#define RAZER_KRAKEN_V4_WIRELESS_PID 0x056C
|
||||
#define RAZER_KRAKEN_KITTY_V3_PRO_WIRED_PID 0x0587
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_RazerKrakenV3.cpp |
|
||||
| |
|
||||
| RGBController for Razer devices with 9-byte report |
|
||||
| RGBController for Razer devices with 13-byte reports |
|
||||
| |
|
||||
| Greg Sandstrom (superstrom) 1 Nov 2025 |
|
||||
| |
|
||||
@@ -51,6 +51,20 @@ RGBController_RazerKrakenV3::RGBController_RazerKrakenV3(RazerKrakenV3Controller
|
||||
Direct.brightness = max_brightness;
|
||||
modes.push_back(Direct);
|
||||
|
||||
// V3 X does not support this mode.
|
||||
if(device_list[controller->GetDeviceIndex()]->pid == RAZER_KRAKEN_V3_HYPERSENSE_PID)
|
||||
{
|
||||
mode Breathing;
|
||||
Breathing.name = "Breathing";
|
||||
Breathing.value = RAZER_KRAKEN_V3_MODE_BREATHING;
|
||||
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Breathing.colors_min = 1;
|
||||
Breathing.colors_max = 2;
|
||||
Breathing.colors.resize(1);
|
||||
modes.push_back(Breathing);
|
||||
}
|
||||
|
||||
SetupZones();
|
||||
}
|
||||
|
||||
@@ -166,5 +180,10 @@ void RGBController_RazerKrakenV3::DeviceUpdateMode()
|
||||
controller->SetModeWave();
|
||||
controller->SetBrightness(modes[active_mode].brightness);
|
||||
break;
|
||||
|
||||
case RAZER_KRAKEN_V3_MODE_BREATHING:
|
||||
controller->SetModeBreathing(modes[active_mode].colors);
|
||||
controller->SetBrightness(modes[active_mode].brightness);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_RazerKrakenV3.h |
|
||||
| |
|
||||
| RGBController for Razer devices with 9-byte report |
|
||||
| RGBController for Razer devices with 13-byte reports |
|
||||
| |
|
||||
| Greg Sandstrom (superstrom) 1 Nov 2025 |
|
||||
| |
|
||||
@@ -18,6 +18,7 @@ enum
|
||||
{
|
||||
RAZER_KRAKEN_V3_MODE_DIRECT,
|
||||
RAZER_KRAKEN_V3_MODE_WAVE,
|
||||
RAZER_KRAKEN_V3_MODE_BREATHING,
|
||||
};
|
||||
|
||||
class RGBController_RazerKrakenV3 : public RGBController
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RazerKrakenV3Controller.cpp |
|
||||
| |
|
||||
| Driver for Razer devices with 9-byte report |
|
||||
| Driver for Razer devices with 13-byte reports |
|
||||
| |
|
||||
| Greg Sandstrom (superstrom) 1 Nov 2025 |
|
||||
| |
|
||||
@@ -92,74 +92,108 @@ unsigned char RazerKrakenV3Controller::GetMaxBrightness()
|
||||
|
||||
void RazerKrakenV3Controller::SetModeDirect()
|
||||
{
|
||||
unsigned char usb_buf[9];
|
||||
|
||||
memset(usb_buf, 0, sizeof(usb_buf));
|
||||
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// 4001000f0800000000
|
||||
usb_buf[0] = 0x40;
|
||||
usb_buf[1] = 0x01;
|
||||
usb_buf[3] = 0x0F;
|
||||
usb_buf[4] = 0x08;
|
||||
// 40010000080000000000000000
|
||||
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
|
||||
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE;
|
||||
report.arguments[1] = 0x0F;
|
||||
report.arguments[2] = RAZER_KRAKEN_V3_MODE_ID_DIRECT;
|
||||
|
||||
hid_write(dev, usb_buf, sizeof(usb_buf));
|
||||
hid_write(dev, (unsigned char*)&report, sizeof(report));
|
||||
}
|
||||
|
||||
void RazerKrakenV3Controller::SetDirect(RGBColor* colors)
|
||||
{
|
||||
unsigned char usb_buf[9];
|
||||
|
||||
memset(usb_buf, 0, sizeof(usb_buf));
|
||||
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
|
||||
|
||||
// how to get the number of leds?
|
||||
unsigned int led_count = device_list[device_index]->cols;
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// 400300ffffff000000
|
||||
usb_buf[0] = 0x40;
|
||||
usb_buf[1] = 0x03;
|
||||
// 400300ffffff00000000000000
|
||||
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
|
||||
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_COLOR;
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < led_count; led_idx++)
|
||||
{
|
||||
usb_buf[3 + (led_idx * 3)] = RGBGetRValue(colors[led_idx]);
|
||||
usb_buf[4 + (led_idx * 3)] = RGBGetGValue(colors[led_idx]);
|
||||
usb_buf[5 + (led_idx * 3)] = RGBGetBValue(colors[led_idx]);
|
||||
report.arguments[1 + (led_idx * 3)] = RGBGetRValue(colors[led_idx]);
|
||||
report.arguments[2 + (led_idx * 3)] = RGBGetGValue(colors[led_idx]);
|
||||
report.arguments[3 + (led_idx * 3)] = RGBGetBValue(colors[led_idx]);
|
||||
}
|
||||
|
||||
hid_write(dev, usb_buf, sizeof(usb_buf));
|
||||
hid_write(dev, (unsigned char*)&report, sizeof(report));
|
||||
}
|
||||
|
||||
void RazerKrakenV3Controller::SetBrightness(unsigned char brightness)
|
||||
{
|
||||
unsigned char usb_buf[24];
|
||||
|
||||
memset(usb_buf, 0, sizeof(usb_buf));
|
||||
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// 40020000ff00000000
|
||||
usb_buf[0] = 0x40;
|
||||
usb_buf[1] = 0x02;
|
||||
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
|
||||
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_BRIGHTNESS;
|
||||
|
||||
usb_buf[4] = brightness;
|
||||
report.arguments[2] = brightness;
|
||||
|
||||
hid_write(dev, usb_buf, sizeof(usb_buf));
|
||||
hid_write(dev, (unsigned char*)&report, sizeof(report));
|
||||
}
|
||||
|
||||
void RazerKrakenV3Controller::SetModeWave()
|
||||
{
|
||||
unsigned char usb_buf[9];
|
||||
|
||||
memset(usb_buf, 0, sizeof(usb_buf));
|
||||
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
// 4001000f0300000000
|
||||
usb_buf[0] = 0x40;
|
||||
usb_buf[1] = 0x01;
|
||||
usb_buf[3] = 0x0F;
|
||||
usb_buf[4] = 0x03;
|
||||
// 40010100030000000000000000
|
||||
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
|
||||
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE;
|
||||
report.arguments[1] = 0x0F;
|
||||
report.arguments[2] = RAZER_KRAKEN_V3_MODE_ID_WAVE;
|
||||
|
||||
hid_write(dev, usb_buf, sizeof(usb_buf));
|
||||
hid_write(dev, (unsigned char*)&report, sizeof(report));
|
||||
}
|
||||
|
||||
void RazerKrakenV3Controller::SetModeBreathing(std::vector<RGBColor> colors)
|
||||
{
|
||||
razer_kraken_v3_request_report report = razer_kraken_create_v3_report();
|
||||
|
||||
unsigned char led_count = colors.size();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2
|
||||
// 400101000101ff000000000000
|
||||
// 40010100010100ffff00000000
|
||||
// 40010100020200ff00ff000000
|
||||
report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
|
||||
report.command_id = RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE;
|
||||
report.arguments[0] = 0x01;
|
||||
report.arguments[2] = led_count; // normally this is where the MODE_ID goes....
|
||||
report.arguments[3] = led_count;
|
||||
for(unsigned int led_idx = 0; led_idx < led_count; led_idx++)
|
||||
{
|
||||
report.arguments[4 + (led_idx * 3)] = RGBGetRValue(colors[led_idx]);
|
||||
report.arguments[5 + (led_idx * 3)] = RGBGetGValue(colors[led_idx]);
|
||||
report.arguments[6 + (led_idx * 3)] = RGBGetBValue(colors[led_idx]);
|
||||
}
|
||||
|
||||
hid_write(dev, (unsigned char*)&report, sizeof(report));
|
||||
}
|
||||
|
||||
razer_kraken_v3_request_report RazerKrakenV3Controller::razer_kraken_create_v3_report()
|
||||
{
|
||||
razer_kraken_v3_request_report new_report;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Zero out the new report |
|
||||
\*---------------------------------------------------------*/
|
||||
memset(&new_report, 0, sizeof(razer_kraken_v3_request_report));
|
||||
|
||||
new_report.report_id = RAZER_KRAKEN_V3_REPORT_ID;
|
||||
|
||||
return new_report;
|
||||
}
|
||||
|
||||
razer_kraken_request_report RazerKrakenV3Controller::razer_kraken_create_report(unsigned char report_id, unsigned char destination, unsigned char length, unsigned short address)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RazerKrakenV3Controller.h |
|
||||
| |
|
||||
| Driver for Razer devices with 9-byte report |
|
||||
| Driver for Razer devices with 13-byte reports |
|
||||
| |
|
||||
| Greg Sandstrom (superstrom) 1 Nov 2025 |
|
||||
| |
|
||||
@@ -16,6 +16,28 @@
|
||||
#include "DeviceGuardManager.h"
|
||||
#include "RazerKrakenController.h"
|
||||
|
||||
#define RAZER_KRAKEN_V3_REPORT_ID 0x40
|
||||
|
||||
enum
|
||||
{
|
||||
RAZER_KRAKEN_V3_CMD_LIGHTING_SET_MODE = 0x01,
|
||||
RAZER_KRAKEN_V3_CMD_LIGHTING_SET_BRIGHTNESS = 0x02,
|
||||
RAZER_KRAKEN_V3_CMD_LIGHTING_SET_COLOR = 0x03,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
RAZER_KRAKEN_V3_MODE_ID_DIRECT = 0x08,
|
||||
RAZER_KRAKEN_V3_MODE_ID_WAVE = 0x03,
|
||||
};
|
||||
|
||||
PACK(struct razer_kraken_v3_request_report
|
||||
{
|
||||
unsigned char report_id; // usb_buf[0]
|
||||
unsigned char command_id; // usb_buf[1]
|
||||
unsigned char arguments[11]; // usb_buf[2...]
|
||||
});
|
||||
|
||||
class RazerKrakenV3Controller
|
||||
{
|
||||
public:
|
||||
@@ -35,6 +57,7 @@ public:
|
||||
|
||||
void SetModeDirect();
|
||||
void SetModeWave();
|
||||
void SetModeBreathing(std::vector<RGBColor> colors);
|
||||
|
||||
private:
|
||||
hid_device* dev;
|
||||
@@ -75,6 +98,8 @@ private:
|
||||
std::string razer_get_firmware();
|
||||
std::string razer_get_serial();
|
||||
|
||||
razer_kraken_v3_request_report razer_kraken_create_v3_report();
|
||||
|
||||
razer_kraken_request_report razer_kraken_create_report(unsigned char report_id, unsigned char destination, unsigned char length, unsigned short address);
|
||||
int razer_usb_receive(razer_kraken_response_report* report);
|
||||
int razer_usb_send(razer_kraken_request_report* report);
|
||||
|
||||
Reference in New Issue
Block a user