Compare commits
80
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3e0f1a6a5 | ||
|
|
63b780ee80 | ||
|
|
b9068ccf68 | ||
|
|
58140eed82 | ||
|
|
7acaf2d12d | ||
|
|
717c257d8e | ||
|
|
c03d422b32 | ||
|
|
b3fa0c1b96 | ||
|
|
8a9fe3f5bb | ||
|
|
b60084be2e | ||
|
|
a5eb5a4d53 | ||
|
|
46d24fd9bc | ||
|
|
b15358582f | ||
|
|
81e0ea5cfa | ||
|
|
523bdb96f8 | ||
|
|
75302d7219 | ||
|
|
56256a8054 | ||
|
|
ed3d7894c8 | ||
|
|
dc14dff646 | ||
|
|
706e2ab30f | ||
|
|
3e494c884a | ||
|
|
31a09bc728 | ||
|
|
87b0b904c5 | ||
|
|
07e1f2bb2a | ||
|
|
fd1bc449ae | ||
|
|
1103a567da | ||
|
|
b420af5c42 | ||
|
|
d092f3b159 | ||
|
|
87af7c8dc2 | ||
|
|
1335a9b06c | ||
|
|
bf2a0fb8f1 | ||
|
|
657cc0d05d | ||
|
|
47eba889c2 | ||
|
|
7fed68ccf1 | ||
|
|
3e290907d5 | ||
|
|
999cbd2578 | ||
|
|
cf048edb6c | ||
|
|
a44f525078 | ||
|
|
88af06182a | ||
|
|
dd35cb8cbf | ||
|
|
cfc6081f9d | ||
|
|
8f701ee147 | ||
|
|
eb535f43c8 | ||
|
|
864ea220da | ||
|
|
a152927ec6 | ||
|
|
bc9c04c00b | ||
|
|
648f190e22 | ||
|
|
47044213fd | ||
|
|
da3f396a25 | ||
|
|
0dff37baa9 | ||
|
|
44c7b9fc07 | ||
|
|
bfba7e99d0 | ||
|
|
cd02ba5d39 | ||
|
|
bf03f70950 | ||
|
|
c789351977 | ||
|
|
bac9cffb27 | ||
|
|
544fd47756 | ||
|
|
206f211ccc | ||
|
|
de7a8df31d | ||
|
|
054e979fcf | ||
|
|
d3e06b9124 | ||
|
|
b0c517ab9f | ||
|
|
7325e83e8c | ||
|
|
c40967989a | ||
|
|
382b3e4d72 | ||
|
|
a8d46b32c2 | ||
|
|
72b7e5cf5b | ||
|
|
5903e7e7c5 | ||
|
|
1198d3ed3c | ||
|
|
d623e76d25 | ||
|
|
a1ff9c8e35 | ||
|
|
c3102bc724 | ||
|
|
a9dea96147 | ||
|
|
e5823a0e10 | ||
|
|
e5d3b76263 | ||
|
|
a757c04cf9 | ||
|
|
01c65c1d17 | ||
|
|
cfdd06e1f4 | ||
|
|
e2d0bee51a | ||
|
|
280df42267 |
+4
-5
@@ -11,6 +11,7 @@
|
||||
#include "ASRockGPUSMBusController.h"
|
||||
#include "LogManager.h"
|
||||
#include "RGBController_ASRockGPUSMBus.h"
|
||||
#include "i2c_amd_gpu.h"
|
||||
#include "i2c_smbus.h"
|
||||
#include "pci_ids.h"
|
||||
|
||||
@@ -18,15 +19,12 @@ DetectedControllers DetectASRockGPUSMBusControllers(i2c_smbus_interface* bus, ui
|
||||
{
|
||||
DetectedControllers detected_controllers;
|
||||
|
||||
LOG_DEBUG("[ASRock GPU] Checking GPU I2C bus for RGB controller at 0x%02X", address);
|
||||
|
||||
if(bus->i2c_smbus_write_quick(address, I2C_SMBUS_WRITE) < 0)
|
||||
if(bus->info.pci_vendor == AMD_GPU_VEN && !is_amd_gpu_i2c_bus(bus))
|
||||
{
|
||||
LOG_DEBUG("[ASRock GPU] No response at address 0x%02X", address);
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
LOG_DEBUG("[ASRock GPU] Device responded at 0x%02X, creating controller", address);
|
||||
LOG_DEBUG("[ASRock GPU] Checking GPU I2C bus for RGB controller at 0x%02X", address);
|
||||
|
||||
ASRockGPUSMBusController* controller = new ASRockGPUSMBusController(bus, address, name);
|
||||
|
||||
@@ -44,3 +42,4 @@ DetectedControllers DetectASRockGPUSMBusControllers(i2c_smbus_interface* bus, ui
|
||||
}
|
||||
|
||||
REGISTER_I2C_PCI_DETECTOR("ASRock Radeon RX 9070 XT Steel Legend", DetectASRockGPUSMBusControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, ASROCK_SUB_VEN, 0x5403, ASROCK_GPU_SMBUS_ADDRESS);
|
||||
REGISTER_I2C_PCI_DETECTOR("ASRock Radeon RX 9060 XT Steel Legend", DetectASRockGPUSMBusControllers, AMD_GPU_VEN, AMD_NAVI44_DEV, ASROCK_SUB_VEN, 0x5407, ASROCK_GPU_SMBUS_ADDRESS);
|
||||
|
||||
+11
@@ -11,6 +11,17 @@
|
||||
|
||||
#include "RGBController_ASRockGPUSMBus.h"
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name ASRock GPU SMBus
|
||||
@category GPU
|
||||
@type I2C
|
||||
@save :x:
|
||||
@direct :white_check_mark:
|
||||
@effects :x:
|
||||
@detectors DetectASRockGPUSMBusControllers
|
||||
@comment
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_ASRockGPUSMBus::RGBController_ASRockGPUSMBus(ASRockGPUSMBusController* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
|
||||
+5
-5
@@ -40,11 +40,11 @@ std::vector<unsigned char> AlienwareAW3423DWFController::GetReportResponse()
|
||||
|
||||
void AlienwareAW3423DWFController::PerformLogin()
|
||||
{
|
||||
unsigned char init_packet[64] =
|
||||
{
|
||||
0x40, 0xE1, 0x01
|
||||
};
|
||||
SendControlPacket(init_packet, 4);
|
||||
unsigned char init_packet[192] = {0x00};
|
||||
init_packet[0] = 0x40;
|
||||
init_packet[1] = 0xE1;
|
||||
init_packet[2] = 0x01;
|
||||
SendControlPacket(init_packet, 192);
|
||||
|
||||
std::vector<unsigned char> response = GetReportResponse();
|
||||
|
||||
|
||||
@@ -417,7 +417,7 @@ REGISTER_HID_DETECTOR ("ASUS Aura Addressable", DetectAs
|
||||
REGISTER_HID_DETECTOR ("ASUS Aura Addressable", DetectAsusAuraUSBAddressable, AURA_USB_VID, AURA_ADDRESSABLE_4_PID);
|
||||
REGISTER_HID_DETECTOR ("ASUS Aura Motherboard", DetectAsusAuraUSBMotherboards, AURA_USB_VID, AURA_MOTHERBOARD_1_PID);
|
||||
REGISTER_HID_DETECTOR ("ASUS Aura Motherboard", DetectAsusAuraUSBMotherboards, AURA_USB_VID, AURA_MOTHERBOARD_2_PID);
|
||||
REGISTER_HID_DETECTOR ("ASUS Aura Motherboard", DetectAsusAuraUSBMotherboards, AURA_USB_VID, AURA_MOTHERBOARD_3_PID);
|
||||
REGISTER_HID_DETECTOR_PU("ASUS Aura Motherboard", DetectAsusAuraUSBMotherboards, AURA_USB_VID, AURA_MOTHERBOARD_3_PID, 0xFF72, 0x00A1);
|
||||
REGISTER_HID_DETECTOR ("ASUS Aura Motherboard", DetectAsusAuraUSBMotherboards, AURA_USB_VID, AURA_MOTHERBOARD_4_PID);
|
||||
REGISTER_HID_DETECTOR ("ASUS Aura Motherboard", DetectAsusAuraUSBMotherboards, AURA_USB_VID, AURA_MOTHERBOARD_5_PID);
|
||||
|
||||
|
||||
@@ -22,9 +22,12 @@
|
||||
| Product ID |
|
||||
\*---------------------------------------------------------*/
|
||||
#define ASUS_ROG_STRIX_XG27AQDMG_PID 0x1BA3
|
||||
#define ASUS_ROG_STRIX_XG27ACDNG_PID 0x1BC9
|
||||
#define ASUS_ROG_STRIX_XG27UCG_PID 0x1BB4
|
||||
#define ASUS_ROG_SWIFT_PG32UCDM_PID 0x1B2B
|
||||
#define ASUS_ROG_SWIFT_PG32UCDMR_PID 0x1C9B
|
||||
#define ASUS_ROG_SWIFT_PG32UCDP_PID 0x1BCA
|
||||
#define ASUS_ROG_AURA_MONITOR_LIGHT_BAR_PID 0x1AC8
|
||||
|
||||
DetectedControllers DetectAsusMonitorControllers(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
@@ -45,7 +48,13 @@ DetectedControllers DetectAsusMonitorControllers(hid_device_info* info, const st
|
||||
}
|
||||
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG STRIX XG27AQDMG", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_STRIX_XG27AQDMG_PID, 1, 0xFF72, 0x00A1);
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG STRIX XG27ACDNG", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_STRIX_XG27ACDNG_PID, 1, 0xFF72, 0x00A1);
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG STRIX XG27UCG", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_STRIX_XG27UCG_PID, 1, 0xFF72, 0x00A1);
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG SWIFT PG32UCDM", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_SWIFT_PG32UCDM_PID, 1, 0xFF72, 0x00A1);
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG SWIFT PG32UCDMR", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_SWIFT_PG32UCDMR_PID, 1, 0xFF72, 0x00A1);
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG SWIFT PG32UCDP", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_SWIFT_PG32UCDP_PID, 1, 0xFF72, 0x00A1);
|
||||
/*---------------------------------------------------------*\
|
||||
| ALB01 exposes the Aura HID collection on interface 2. |
|
||||
\*---------------------------------------------------------*/
|
||||
REGISTER_HID_DETECTOR_IPU("Asus ROG Aura Monitor Light Bar", DetectAsusMonitorControllers, ASUS_VID, ASUS_ROG_AURA_MONITOR_LIGHT_BAR_PID, 2, 0xFF72, 0x00A1);
|
||||
|
||||
|
||||
@@ -335,7 +335,7 @@ void ClevoKeyboardController::SetEffect829x(unsigned char mode_value, const std:
|
||||
{
|
||||
for(size_t i = 0; i < colors.size() && i < 2; i++)
|
||||
{
|
||||
SendColorSlot829x(CLEVO_829X_CMD_SCAN_COLOR, CLEVO_829X_COLOR_SLOT_BASE + i, colors[i]);
|
||||
SendColorSlot829x(CLEVO_829X_CMD_SCAN_COLOR, CLEVO_829X_COLOR_SLOT_BASE + (unsigned char)i, colors[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,11 +13,6 @@
|
||||
#include "CMSmallARGBController.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
cm_small_argb_headers cm_small_argb_header_data[1] =
|
||||
{
|
||||
{ "CM Small ARGB", 0x01, true, 12 }
|
||||
};
|
||||
|
||||
CMSmallARGBController::CMSmallARGBController(hid_device* dev_handle, char *_path)
|
||||
{
|
||||
dev = dev_handle;
|
||||
@@ -92,6 +87,24 @@ std::string CMSmallARGBController::GetSerial()
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
std::string CMSmallARGBController::GetVersion()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| This device uses the serial value to determine the |
|
||||
| version. It does not report a proper unique serial. |
|
||||
\*-----------------------------------------------------*/
|
||||
std::string serial_string = GetSerial();
|
||||
|
||||
if(serial_string == CM_SMALL_ARGB_FW0012)
|
||||
{
|
||||
return("0012");
|
||||
}
|
||||
else
|
||||
{
|
||||
return("Unsupported");
|
||||
}
|
||||
}
|
||||
|
||||
std::string CMSmallARGBController::GetLocation()
|
||||
{
|
||||
return("HID: " + location);
|
||||
@@ -122,6 +135,11 @@ unsigned char CMSmallARGBController::GetLedSpeed()
|
||||
return(current_speed);
|
||||
}
|
||||
|
||||
unsigned char CMSmallARGBController::GetBrightness()
|
||||
{
|
||||
return(current_brightness);
|
||||
}
|
||||
|
||||
bool CMSmallARGBController::GetRandomColours()
|
||||
{
|
||||
return(bool_random);
|
||||
@@ -217,9 +235,9 @@ void CMSmallARGBController::SendUpdate()
|
||||
|
||||
hid_write(dev, buffer, buffer_size);
|
||||
|
||||
buffer[CM_SMALL_ARGB_COMMAND_BYTE] = 0x0b;
|
||||
buffer[CM_SMALL_ARGB_FUNCTION_BYTE] = (false) ? 0x01 : 0x02; //This controls custom mode TODO
|
||||
buffer[CM_SMALL_ARGB_ZONE_BYTE] = cm_small_argb_header_data[0].header;
|
||||
buffer[CM_SMALL_ARGB_COMMAND_BYTE] = 0x0B;
|
||||
buffer[CM_SMALL_ARGB_FUNCTION_BYTE] = 0x02;
|
||||
buffer[CM_SMALL_ARGB_ZONE_BYTE] = 0x01;
|
||||
buffer[CM_SMALL_ARGB_MODE_BYTE] = current_mode;
|
||||
buffer[CM_SMALL_ARGB_SPEED_BYTE] = current_speed;
|
||||
buffer[CM_SMALL_ARGB_COLOUR_INDEX_BYTE] = (bool_random) ? 0x00 : 0x10; //This looks to still be the colour index and controls random colours
|
||||
|
||||
@@ -39,16 +39,6 @@ enum
|
||||
CM_SMALL_ARGB_BLUE_BYTE = 11,
|
||||
};
|
||||
|
||||
struct cm_small_argb_headers
|
||||
{
|
||||
const char* name;
|
||||
unsigned char header;
|
||||
bool digital;
|
||||
unsigned int count;
|
||||
};
|
||||
|
||||
extern cm_small_argb_headers cm_small_argb_header_data[1];
|
||||
|
||||
enum
|
||||
{
|
||||
CM_SMALL_ARGB_MODE_SPECTRUM = 0x01, //Spectrum Mode
|
||||
@@ -71,6 +61,8 @@ enum
|
||||
CM_SMALL_ARGB_SPEED_FASTEST = 0x04, // Fastest speed
|
||||
};
|
||||
|
||||
#define CM_SMALL_ARGB_FW0012 std::string("A202104052336")
|
||||
|
||||
class CMSmallARGBController
|
||||
{
|
||||
public:
|
||||
@@ -80,12 +72,14 @@ public:
|
||||
std::string GetDeviceName();
|
||||
std::string GetSerial();
|
||||
std::string GetLocation();
|
||||
std::string GetVersion();
|
||||
|
||||
unsigned char GetMode();
|
||||
unsigned char GetLedRed();
|
||||
unsigned char GetLedGreen();
|
||||
unsigned char GetLedBlue();
|
||||
unsigned char GetLedSpeed();
|
||||
unsigned char GetBrightness();
|
||||
bool GetRandomColours();
|
||||
|
||||
void SetLedCount(int zone, int led_count);
|
||||
|
||||
+121
-51
@@ -27,22 +27,68 @@
|
||||
RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmallARGBController* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
unsigned char speed = controller->GetLedSpeed();
|
||||
|
||||
name = cm_small_argb_header_data[0].name;
|
||||
name = controller->GetDeviceName();
|
||||
vendor = "Cooler Master";
|
||||
type = DEVICE_TYPE_LEDSTRIP;
|
||||
description = controller->GetDeviceName();
|
||||
version = "2.0 for FW0012";
|
||||
description = "Cooler Master Small ARGB Controller Device";
|
||||
version = controller->GetVersion();
|
||||
serial = controller->GetSerial();
|
||||
location = controller->GetLocation();
|
||||
|
||||
if(serial >= CM_SMALL_ARGB_FW0012)
|
||||
SetupModes();
|
||||
SetupZones();
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Initialize the active mode to the device's current |
|
||||
| mode |
|
||||
\*-----------------------------------------------------*/
|
||||
int device_mode = controller->GetMode();
|
||||
|
||||
for(std::size_t mode_idx = 0; mode_idx < modes.size(); mode_idx++)
|
||||
{
|
||||
if(modes[mode_idx].value == device_mode)
|
||||
{
|
||||
active_mode = (int)mode_idx;
|
||||
|
||||
if((modes[mode_idx].flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) && (modes[mode_idx].colors.size() > 0))
|
||||
{
|
||||
modes[mode_idx].colors[0] = ToRGBColor(controller->GetLedRed(), controller->GetLedGreen(), controller->GetLedBlue());
|
||||
}
|
||||
|
||||
if(modes[mode_idx].flags & MODE_FLAG_HAS_SPEED)
|
||||
{
|
||||
modes[mode_idx].speed = controller->GetLedSpeed();
|
||||
}
|
||||
|
||||
if(modes[mode_idx].flags & MODE_FLAG_HAS_BRIGHTNESS)
|
||||
{
|
||||
modes[mode_idx].brightness = controller->GetBrightness();
|
||||
}
|
||||
|
||||
if(modes[mode_idx].flags & MODE_FLAG_HAS_RANDOM_COLOR)
|
||||
{
|
||||
modes[mode_idx].color_mode = controller->GetRandomColours() ? MODE_COLORS_RANDOM : MODE_COLORS_MODE_SPECIFIC;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_CMSmallARGBController::SetupModes()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| The Small ARGB only supports Direct mode from FW0012 |
|
||||
| onwards, older firmware does not accept direct mode |
|
||||
| packets |
|
||||
\*-----------------------------------------------------*/
|
||||
//if(serial >= CM_SMALL_ARGB_FW0012)
|
||||
{
|
||||
mode Direct;
|
||||
Direct.name = "Direct";
|
||||
Direct.value = CM_SMALL_ARGB_MODE_DIRECT;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_REQUIRES_ENTIRE_DEVICE;
|
||||
Direct.brightness_min = 0;
|
||||
Direct.brightness_max = CM_SMALL_ARGB_BRIGHTNESS_MAX;
|
||||
Direct.brightness = CM_SMALL_ARGB_BRIGHTNESS_MAX;
|
||||
@@ -69,7 +115,7 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
|
||||
Reload.speed_min = CM_SMALL_ARGB_SPEED_SLOWEST;
|
||||
Reload.speed_max = CM_SMALL_ARGB_SPEED_FASTEST;
|
||||
Reload.color_mode = MODE_COLORS_RANDOM;
|
||||
Reload.speed = speed;
|
||||
Reload.speed = CM_SMALL_ARGB_SPEED_NORMAL;
|
||||
modes.push_back(Reload);
|
||||
|
||||
mode Recoil;
|
||||
@@ -85,7 +131,7 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
|
||||
Recoil.speed_min = CM_SMALL_ARGB_SPEED_SLOWEST;
|
||||
Recoil.speed_max = CM_SMALL_ARGB_SPEED_FASTEST;
|
||||
Recoil.color_mode = MODE_COLORS_RANDOM;
|
||||
Recoil.speed = speed;
|
||||
Recoil.speed = CM_SMALL_ARGB_SPEED_NORMAL;
|
||||
modes.push_back(Recoil);
|
||||
|
||||
mode Breathing;
|
||||
@@ -101,7 +147,7 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
|
||||
Breathing.speed_min = CM_SMALL_ARGB_SPEED_SLOWEST;
|
||||
Breathing.speed_max = CM_SMALL_ARGB_SPEED_FASTEST;
|
||||
Breathing.color_mode = MODE_COLORS_RANDOM;
|
||||
Breathing.speed = speed;
|
||||
Breathing.speed = CM_SMALL_ARGB_SPEED_NORMAL;
|
||||
modes.push_back(Breathing);
|
||||
|
||||
mode Refill;
|
||||
@@ -117,7 +163,7 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
|
||||
Refill.speed_min = CM_SMALL_ARGB_SPEED_SLOWEST;
|
||||
Refill.speed_max = CM_SMALL_ARGB_SPEED_FASTEST;
|
||||
Refill.color_mode = MODE_COLORS_RANDOM;
|
||||
Refill.speed = speed;
|
||||
Refill.speed = CM_SMALL_ARGB_SPEED_NORMAL;
|
||||
modes.push_back(Refill);
|
||||
|
||||
mode Demo;
|
||||
@@ -130,7 +176,7 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
|
||||
Demo.speed_min = CM_SMALL_ARGB_SPEED_SLOWEST;
|
||||
Demo.speed_max = CM_SMALL_ARGB_SPEED_FASTEST;
|
||||
Demo.color_mode = MODE_COLORS_NONE;
|
||||
Demo.speed = speed;
|
||||
Demo.speed = CM_SMALL_ARGB_SPEED_NORMAL;
|
||||
modes.push_back(Demo);
|
||||
|
||||
mode Spectrum;
|
||||
@@ -143,39 +189,19 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
|
||||
Spectrum.speed_min = CM_SMALL_ARGB_SPEED_SLOWEST;
|
||||
Spectrum.speed_max = CM_SMALL_ARGB_SPEED_FASTEST;
|
||||
Spectrum.color_mode = MODE_COLORS_NONE;
|
||||
Spectrum.speed = speed;
|
||||
Spectrum.speed = CM_SMALL_ARGB_SPEED_NORMAL;
|
||||
modes.push_back(Spectrum);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Define Passthrough mode as requiring the entire |
|
||||
| device, it hands control over to the motherboard |
|
||||
\*-----------------------------------------------------*/
|
||||
mode PassThru;
|
||||
PassThru.name = "Pass Thru";
|
||||
PassThru.value = CM_SMALL_ARGB_MODE_PASSTHRU;
|
||||
PassThru.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE;
|
||||
PassThru.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(PassThru);
|
||||
|
||||
SetupZones();
|
||||
|
||||
int temp_mode = controller->GetMode();
|
||||
|
||||
for(int mode_idx = 0; mode_idx < (int)modes.size() ; mode_idx++)
|
||||
{
|
||||
if(temp_mode == modes[mode_idx].value)
|
||||
{
|
||||
active_mode = mode_idx;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (modes[active_mode].flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR)
|
||||
{
|
||||
modes[active_mode].colors[0] = ToRGBColor(controller->GetLedRed(), controller->GetLedGreen(), controller->GetLedBlue());
|
||||
}
|
||||
|
||||
modes[active_mode].color_mode = (controller->GetRandomColours()) ? MODE_COLORS_RANDOM : MODE_COLORS_MODE_SPECIFIC;
|
||||
|
||||
if (modes[active_mode].flags & MODE_FLAG_HAS_SPEED)
|
||||
{
|
||||
modes[active_mode].speed = controller->GetLedSpeed();
|
||||
}
|
||||
}
|
||||
|
||||
RGBController_CMSmallARGBController::~RGBController_CMSmallARGBController()
|
||||
@@ -248,7 +274,9 @@ void RGBController_CMSmallARGBController::SetupZones()
|
||||
{
|
||||
led new_led;
|
||||
new_led.name = zones[zone_idx].name;
|
||||
new_led.name.append(", LED " + std::to_string(lp_idx));
|
||||
new_led.name.append(", LED ");
|
||||
new_led.name.append(std::to_string(lp_idx + 1));
|
||||
new_led.value = (unsigned int)zone_idx;
|
||||
|
||||
leds.push_back(new_led);
|
||||
}
|
||||
@@ -261,7 +289,7 @@ void RGBController_CMSmallARGBController::DeviceConfigureZone(int zone_idx)
|
||||
{
|
||||
if((size_t)zone_idx < zones.size())
|
||||
{
|
||||
controller->SetLedCount(cm_small_argb_header_data[zone_idx].header, zones[zone_idx].leds_count);
|
||||
controller->SetLedCount(1, zones[zone_idx].leds_count);
|
||||
|
||||
SetupZones();
|
||||
}
|
||||
@@ -277,37 +305,79 @@ void RGBController_CMSmallARGBController::DeviceUpdateLEDs()
|
||||
|
||||
void RGBController_CMSmallARGBController::DeviceUpdateZoneLEDs(int zone)
|
||||
{
|
||||
if(serial >= CM_SMALL_ARGB_FW0012)
|
||||
/*-----------------------------------------------------*\
|
||||
| Only send direct packets while Direct mode is active. |
|
||||
| Direct mode is only offered on FW0012 and newer, so |
|
||||
| older firmware will never send direct packets here |
|
||||
\*-----------------------------------------------------*/
|
||||
if(modes[active_mode].value != CM_SMALL_ARGB_MODE_DIRECT)
|
||||
{
|
||||
controller->SetLedsDirect( zones[zone].colors, zones[zone].leds_count );
|
||||
return;
|
||||
}
|
||||
|
||||
controller->SetLedsDirect(zones[zone].colors, zones[zone].leds_count);
|
||||
}
|
||||
|
||||
void RGBController_CMSmallARGBController::DeviceUpdateSingleLED(int led)
|
||||
{
|
||||
DeviceUpdateZoneLEDs(led);
|
||||
/*-----------------------------------------------------*\
|
||||
| Map the LED back to its zone and update that zone |
|
||||
\*-----------------------------------------------------*/
|
||||
unsigned int zone_idx = leds[led].value;
|
||||
|
||||
UpdateZoneLEDs(zone_idx);
|
||||
}
|
||||
|
||||
void RGBController_CMSmallARGBController::SetCustomMode()
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| The small ARGB may not support "Direct" mode |
|
||||
| in which case this will select "Pass Thru" |
|
||||
\*-------------------------------------------------*/
|
||||
/*-----------------------------------------------------*\
|
||||
| Direct mode is only supported on FW0012 and newer |
|
||||
\*-----------------------------------------------------*/
|
||||
if(serial >= CM_SMALL_ARGB_FW0012)
|
||||
{
|
||||
active_mode = 0;
|
||||
/*-------------------------------------------------*\
|
||||
| Search the mode list for Direct mode |
|
||||
\*-------------------------------------------------*/
|
||||
for(std::size_t mode_idx = 0; mode_idx < modes.size(); mode_idx++)
|
||||
{
|
||||
if(modes[mode_idx].name == "Direct")
|
||||
{
|
||||
SetActiveMode((int)mode_idx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
active_mode = 7;
|
||||
/*-------------------------------------------------*\
|
||||
| Direct mode is unsupported by the firmware, |
|
||||
| fall back to Pass Thru |
|
||||
\*-------------------------------------------------*/
|
||||
for(std::size_t mode_idx = 0; mode_idx < modes.size(); mode_idx++)
|
||||
{
|
||||
if(modes[mode_idx].value == CM_SMALL_ARGB_MODE_PASSTHRU)
|
||||
{
|
||||
SetActiveMode((int)mode_idx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_CMSmallARGBController::DeviceUpdateMode()
|
||||
{
|
||||
bool random_colours = (modes[active_mode].color_mode == MODE_COLORS_RANDOM);
|
||||
RGBColor colour = (modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) ? modes[active_mode].colors[0] : 0;
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up mode parameters |
|
||||
\*-----------------------------------------------------*/
|
||||
bool random_colours = (modes[active_mode].color_mode == MODE_COLORS_RANDOM);
|
||||
RGBColor colour = 0;
|
||||
unsigned int speed = modes[active_mode].speed;
|
||||
unsigned int brightness = modes[active_mode].brightness;
|
||||
|
||||
controller->SetMode( modes[active_mode].value, modes[active_mode].speed, modes[active_mode].brightness, colour, random_colours);
|
||||
if(modes[active_mode].colors.size() > 0)
|
||||
{
|
||||
colour = modes[active_mode].colors[0];
|
||||
}
|
||||
|
||||
controller->SetMode(modes[active_mode].value, speed, brightness, colour, random_colours);
|
||||
}
|
||||
|
||||
+3
-4
@@ -18,7 +18,6 @@
|
||||
#define CM_SMALL_ARGB_MIN_LEDS 4
|
||||
#define CM_SMALL_ARGB_MAX_LEDS 48
|
||||
#define CM_SMALL_ARGB_BRIGHTNESS_MAX 0xFF
|
||||
#define CM_SMALL_ARGB_FW0012 "A202104052336"
|
||||
|
||||
class RGBController_CMSmallARGBController : public RGBController
|
||||
{
|
||||
@@ -26,7 +25,9 @@ public:
|
||||
RGBController_CMSmallARGBController(CMSmallARGBController* controller_ptr);
|
||||
~RGBController_CMSmallARGBController();
|
||||
|
||||
void SetupModes();
|
||||
void SetupZones();
|
||||
|
||||
void DeviceConfigureZone(int zone_idx);
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
@@ -35,9 +36,7 @@ public:
|
||||
|
||||
void SetCustomMode();
|
||||
void DeviceUpdateMode();
|
||||
private:
|
||||
void Init_Controller();
|
||||
int GetDeviceMode();
|
||||
|
||||
private:
|
||||
CMSmallARGBController* controller;
|
||||
};
|
||||
|
||||
@@ -327,9 +327,18 @@ DetectedControllers DetectCoolerMasterSmallARGB(hid_device_info* info, const std
|
||||
if(dev)
|
||||
{
|
||||
CMSmallARGBController* controller = new CMSmallARGBController(dev, info->path);
|
||||
RGBController_CMSmallARGBController* rgb_controller = new RGBController_CMSmallARGBController(controller);
|
||||
|
||||
detected_controllers.push_back(rgb_controller);
|
||||
if(controller->GetVersion() != "Unsupported")
|
||||
{
|
||||
RGBController_CMSmallARGBController* rgb_controller = new RGBController_CMSmallARGBController(controller);
|
||||
|
||||
detected_controllers.push_back(rgb_controller);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR("[CMSmallARGBController] Unsupported firmware version");
|
||||
delete controller;
|
||||
}
|
||||
}
|
||||
|
||||
return(detected_controllers);
|
||||
|
||||
@@ -26,6 +26,13 @@
|
||||
#define EVGA_X12_READ_DELAY_MS 5
|
||||
#define EVGA_X12_WRITE_ATTEMPTS 3
|
||||
|
||||
static const unsigned int EVGA_X12_LED_TO_FIRMWARE_SLOT[EVGA_X12_LED_COUNT] =
|
||||
{
|
||||
EVGA_X12_FIRMWARE_SLOT_HEAD_LEFT,
|
||||
EVGA_X12_FIRMWARE_SLOT_WHEEL,
|
||||
EVGA_X12_FIRMWARE_SLOT_LOGO,
|
||||
};
|
||||
|
||||
EVGAX12Controller::EVGAX12Controller(hid_device* dev_handle, const hid_device_info& info, const std::string& dev_name)
|
||||
{
|
||||
dev = dev_handle;
|
||||
@@ -73,7 +80,8 @@ EVGAX12LightingState EVGAX12Controller::GetLightingState()
|
||||
{
|
||||
for(unsigned int led_idx = 0; led_idx < EVGA_X12_LED_COUNT; led_idx++)
|
||||
{
|
||||
state.modes[led_idx] = packet[4 + led_idx];
|
||||
unsigned int firmware_slot = EVGA_X12_LED_TO_FIRMWARE_SLOT[led_idx];
|
||||
state.modes[led_idx] = packet[4 + firmware_slot];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,7 +91,8 @@ EVGAX12LightingState EVGAX12Controller::GetLightingState()
|
||||
{
|
||||
for(unsigned int led_idx = 0; led_idx < EVGA_X12_LED_COUNT; led_idx++)
|
||||
{
|
||||
unsigned int offset = 4 + (led_idx * 4);
|
||||
unsigned int firmware_slot = EVGA_X12_LED_TO_FIRMWARE_SLOT[led_idx];
|
||||
unsigned int offset = 4 + (firmware_slot * 4);
|
||||
state.brightness[led_idx] = packet[offset];
|
||||
state.colors[led_idx] = ToRGBColor(packet[offset + 1], packet[offset + 2], packet[offset + 3]);
|
||||
}
|
||||
@@ -109,7 +118,8 @@ bool EVGAX12Controller::SetModeReport(unsigned char mode)
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < EVGA_X12_LED_COUNT; led_idx++)
|
||||
{
|
||||
packet[4 + led_idx] = mode;
|
||||
unsigned int firmware_slot = EVGA_X12_LED_TO_FIRMWARE_SLOT[led_idx];
|
||||
packet[4 + firmware_slot] = mode;
|
||||
}
|
||||
|
||||
return(SendReport(packet));
|
||||
@@ -155,14 +165,19 @@ bool EVGAX12Controller::SetStaticReport(const std::vector<RGBColor>& colors, uns
|
||||
packet[2] = EVGA_X12_DIRECTION_SET;
|
||||
packet[3] = EVGA_X12_COMMAND_STATIC;
|
||||
|
||||
for(unsigned int firmware_slot = 0; firmware_slot < EVGA_X12_FIRMWARE_SLOT_COUNT; firmware_slot++)
|
||||
{
|
||||
packet[20 + firmware_slot] = EVGA_X12_START_WITH_PROFILE;
|
||||
}
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < EVGA_X12_LED_COUNT; led_idx++)
|
||||
{
|
||||
unsigned int offset = 4 + (led_idx * 4);
|
||||
unsigned int firmware_slot = EVGA_X12_LED_TO_FIRMWARE_SLOT[led_idx];
|
||||
unsigned int offset = 4 + (firmware_slot * 4);
|
||||
packet[offset] = brightness;
|
||||
packet[offset + 1] = RGBGetRValue(colors[led_idx]);
|
||||
packet[offset + 2] = RGBGetGValue(colors[led_idx]);
|
||||
packet[offset + 3] = RGBGetBValue(colors[led_idx]);
|
||||
packet[20 + led_idx] = EVGA_X12_START_WITH_PROFILE;
|
||||
}
|
||||
|
||||
for(unsigned int attempt = 0; attempt < EVGA_X12_WRITE_ATTEMPTS; attempt++)
|
||||
@@ -180,9 +195,9 @@ bool EVGAX12Controller::SetStaticReport(const std::vector<RGBColor>& colors, uns
|
||||
{
|
||||
bool matches = true;
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < EVGA_X12_LED_COUNT; led_idx++)
|
||||
for(unsigned int firmware_slot = 0; firmware_slot < EVGA_X12_FIRMWARE_SLOT_COUNT; firmware_slot++)
|
||||
{
|
||||
unsigned int offset = 4 + (led_idx * 4);
|
||||
unsigned int offset = 4 + (firmware_slot * 4);
|
||||
|
||||
if(std::memcmp(&packet[offset], &reply[offset], 4) != 0)
|
||||
{
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
|
||||
#define EVGA_X12_REPORT_ID 0x07
|
||||
#define EVGA_X12_REPORT_SIZE 40
|
||||
#define EVGA_X12_LED_COUNT 4
|
||||
#define EVGA_X12_LED_COUNT 3
|
||||
#define EVGA_X12_FIRMWARE_SLOT_COUNT 4
|
||||
#define EVGA_X12_BRIGHTNESS_MIN 0
|
||||
#define EVGA_X12_BRIGHTNESS_MAX 255
|
||||
|
||||
@@ -30,12 +31,16 @@ enum
|
||||
EVGA_X12_MODE_STATIC = 1,
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| HEAD_LEFT drives both physical side lights. HEAD_RIGHT |
|
||||
| is writable and readable, but has no physical emitter. |
|
||||
\*---------------------------------------------------------*/
|
||||
enum
|
||||
{
|
||||
EVGA_X12_LED_HEAD_LEFT = 0,
|
||||
EVGA_X12_LED_HEAD_RIGHT = 1,
|
||||
EVGA_X12_LED_WHEEL = 2,
|
||||
EVGA_X12_LED_LOGO = 3,
|
||||
EVGA_X12_FIRMWARE_SLOT_HEAD_LEFT = 0,
|
||||
EVGA_X12_FIRMWARE_SLOT_HEAD_RIGHT = 1,
|
||||
EVGA_X12_FIRMWARE_SLOT_WHEEL = 2,
|
||||
EVGA_X12_FIRMWARE_SLOT_LOGO = 3,
|
||||
};
|
||||
|
||||
struct EVGAX12LightingState
|
||||
|
||||
@@ -41,14 +41,14 @@ RGBController_EVGAX12::RGBController_EVGAX12(EVGAX12Controller* controller_ptr)
|
||||
Direct.brightness_max = EVGA_X12_BRIGHTNESS_MAX;
|
||||
Direct.brightness = EVGA_X12_BRIGHTNESS_MAX;
|
||||
Direct.color_mode = MODE_COLORS_PER_LED;
|
||||
direct_mode_index = modes.size();
|
||||
direct_mode_index = (unsigned int)modes.size();
|
||||
modes.push_back(Direct);
|
||||
|
||||
mode Off;
|
||||
Off.name = "Off";
|
||||
Off.value = EVGA_X12_MODE_OFF;
|
||||
Off.color_mode = MODE_COLORS_NONE;
|
||||
off_mode_index = modes.size();
|
||||
off_mode_index = (unsigned int)modes.size();
|
||||
modes.push_back(Off);
|
||||
|
||||
active_mode = direct_mode_index;
|
||||
@@ -98,8 +98,7 @@ void RGBController_EVGAX12::SetupZones()
|
||||
{
|
||||
const char* zone_names[EVGA_X12_LED_COUNT] =
|
||||
{
|
||||
"Left Head",
|
||||
"Right Head",
|
||||
"Side",
|
||||
"Scroll Wheel",
|
||||
"Logo",
|
||||
};
|
||||
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
/*---------------------------------------------------------*\
|
||||
/*---------------------------------------------------------*\
|
||||
| GigabyteRGBFusion2BlackwellGPUControllerDetect.cpp |
|
||||
| |
|
||||
| Detector for Gigabyte RGB Fusion 2 Blackwell GPU |
|
||||
@@ -139,6 +139,7 @@ REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS GeForce RTX 5090 D V2 MASTER ICE",
|
||||
/*---------------------------------------------------------*\
|
||||
| AMD GPUs |
|
||||
\*---------------------------------------------------------*/
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 9060 GAMING OC 8G", DetectGigabyteRGBFusion2BlackwellGamingLayoutGPUControllers, AMD_GPU_VEN, AMD_NAVI44_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX9060XT_GAMING_OC_8G_SUB_DEV, 0x75);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 9060 XT GAMING", DetectGigabyteRGBFusion2BlackwellGamingLayoutGPUControllers, AMD_GPU_VEN, AMD_NAVI44_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX9060XT_GAMING_16G_SUB_DEV, 0x75);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 9060 XT GAMING OC", DetectGigabyteRGBFusion2BlackwellGamingLayoutGPUControllers, AMD_GPU_VEN, AMD_NAVI44_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX9060XT_GAMING_OC_16G_SUB_DEV, 0x75);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS Radeon RX 9070 XT Elite", DetectGigabyteRGBFusion2BlackwellGamingLayoutGPUControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RX9070XT_ELITE_16G_SUB_DEV, 0x75);
|
||||
|
||||
+9
-3
@@ -52,8 +52,12 @@ bool TestForGigabyteRGBFusion2GPUController(i2c_smbus_interface* bus, unsigned c
|
||||
//Note that GeForce RTX 4080 Gigabyte AORUS MASTER 16G exposes two i2c bus with writable address 0x71 but one respond
|
||||
//0x00 0x00 0x00 0x00 so it should be the one controlling the LCD screen. So we skip this bus
|
||||
|
||||
//All seen responses start with 0xAB, so we check for this.
|
||||
if(res < 0 || data_readpkt[0] != 0xAB)
|
||||
//All seen responses start with 0xAB, so we check for this. A DDC/EDID
|
||||
//style bus can echo the written command byte back for every read, so an
|
||||
//all-0xAB response is a mirror, not a controller; every real controller
|
||||
//seen so far follows 0xAB with version bytes (see table above).
|
||||
if(res < 0 || data_readpkt[0] != 0xAB ||
|
||||
(data_readpkt[1] == 0xAB && data_readpkt[2] == 0xAB && data_readpkt[3] == 0xAB))
|
||||
{
|
||||
// Assemble C-string with respons for debugging
|
||||
std::string text = "";
|
||||
@@ -162,6 +166,7 @@ REGISTER_I2C_PCI_DETECTOR("Gigabyte GeForce RTX 4090 GAMING OC",
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS GeForce RTX 4090 MASTER", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX4090_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RTX4090_MASTER_24G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS GeForce RTX 5090 D MASTER", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX5090D_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RTX5090D_MASTER_32G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte GeForce RTX 5080 GAMING OC", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX5080_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RTX5080_GAMING_OC_16G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS GeForce RTX 5080 MASTER ICE", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX5080_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RTX5080_MASTER_ICE_16G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte GeForce RTX 5090 GAMING OC", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX5090D_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RTX5090_GAMING_OC_32G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS GeForce RTX 5090 MASTER", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX5090_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RTX5090_MASTER_32G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS GeForce RTX 5090 MASTER ICE", DetectGigabyteRGBFusion2GPUControllers, NVIDIA_VEN, NVIDIA_RTX5090_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RTX5090_MASTER_ICE_32G_SUB_DEV, 0x71);
|
||||
@@ -183,8 +188,9 @@ REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 7900 XT GAMING OC",
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 7900 XTX GAMING OC", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI31_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX7900XTX_GAMING_OC_24G_SUB_DEV, 0x62);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS Radeon RX 7900 XTX ELITE 24G", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI31_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RX7900XTX_ELITE_24G_SUB_DEV, 0x71);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS RX 6750 XT ELITE 12G", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI22_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RX_6750_XT_ELITE_12G_SUB_DEV, 0x70);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS RX 6900 XT MASTER rev 2.0", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI21_DEV2, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RX6900XT_MASTER_SUB_DEV, 0x70);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS RX 6900 XT MASTER rev 2.0", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI21_DEV2, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RX6900XT_MASTER_SUB_DEV, 0x70);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS RX 6900 XT EXTREME WATERFORCE WB", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI21_DEV2, GIGABYTE_SUB_VEN, GIGABYTE_RX6900XT_XTREME_WATERFORCE_WB_SUB_DEV, 0x70);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 9060 XT GAMING OC 8G", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI44_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX9060XT_GAMING_OC_8G_SUB_DEV, 0x73);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte AORUS Radeon RX 9070 XT Elite", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, GIGABYTE_SUB_VEN, GIGABYTE_AORUS_RX9070XT_ELITE_16G_SUB_DEV, 0x73);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 9070 XT GAMING OC", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX9070XT_GAMING_OC_16G_SUB_DEV, 0x73);
|
||||
REGISTER_I2C_PCI_DETECTOR("Gigabyte Radeon RX 9070 XT GAMING OC ICE", DetectGigabyteRGBFusion2GPUControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, GIGABYTE_SUB_VEN, GIGABYTE_RX9070XT_GAMING_OC_ICE_16G_SUB_DEV, 0x73);
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
| Gigabyte Fusion 2 USB Device layouts and |
|
||||
| and mapping to the device IDs stored on chip |
|
||||
| |
|
||||
| megadjc 31 Jul 2025 |
|
||||
| chrism 29 Aug 2025 |
|
||||
| megadjc 03 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
@@ -19,16 +19,16 @@
|
||||
static const gb_fusion2_zone common_d_led_zone =
|
||||
{
|
||||
HDR_D_LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_DLED_LEDS_MIN,
|
||||
RGBFUSION2_DLED_LEDS_MAX,
|
||||
"D_LED"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_gc_usb_d_led_zone =
|
||||
{
|
||||
LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_DLED_LEDS_MIN,
|
||||
RGBFUSION2_DLED_LEDS_MAX,
|
||||
"D_LED"
|
||||
};
|
||||
|
||||
@@ -36,48 +36,48 @@ static const gb_fusion2_zone common_gc_usb_d_led_zone =
|
||||
static const gb_fusion2_zone common_d_led1_zone =
|
||||
{
|
||||
HDR_D_LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_DLED_LEDS_MIN,
|
||||
RGBFUSION2_DLED_LEDS_MAX,
|
||||
"D_LED1"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_dled1_dled2_zone =
|
||||
{
|
||||
HDR_D_LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_DLED_LEDS_MIN,
|
||||
RGBFUSION2_DLED_LEDS_MAX,
|
||||
"D_LED1/D_LED2"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_argb_v2_1_zone =
|
||||
{
|
||||
HDR_D_LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_1"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone alt_argb_v2_1_zone =
|
||||
{
|
||||
LED3,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_1"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_argb_v2_1_3_zone =
|
||||
{
|
||||
HDR_D_LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_1/ARGB_V2_3"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_d_led2_zone =
|
||||
{
|
||||
HDR_D_LED2,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_DLED_LEDS_MIN,
|
||||
RGBFUSION2_DLED_LEDS_MAX,
|
||||
"D_LED2"
|
||||
};
|
||||
|
||||
@@ -85,47 +85,47 @@ static const gb_fusion2_zone common_d_led2_aux_zone =
|
||||
{
|
||||
HDR_D_LED2,
|
||||
2,
|
||||
1024,
|
||||
RGBFUSION2_DLED_LEDS_MAX,
|
||||
"D_LED2 + Aux"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_argb_v2_2_zone =
|
||||
{
|
||||
HDR_D_LED2,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_2"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone alt_argb_v2_2_zone =
|
||||
{
|
||||
LED4,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_2"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_argb_v2_3_1_zone =
|
||||
{
|
||||
HDR_D_LED1,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_3"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_argb_v2_3_zone =
|
||||
{
|
||||
HDR_D_LED3,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_3"
|
||||
};
|
||||
|
||||
static const gb_fusion2_zone common_argb_v2_4_zone =
|
||||
{
|
||||
HDR_D_LED4,
|
||||
0,
|
||||
1024,
|
||||
RGBFUSION2_57XX_LEDS_MIN,
|
||||
RGBFUSION2_57XX_LEDS_MAX,
|
||||
"ARGB_V2_4"
|
||||
};
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
| Gigabyte Fusion 2 USB Device layouts and |
|
||||
| and mapping to the device IDs stored on chip |
|
||||
| |
|
||||
| megadjc 31 Jul 2025 |
|
||||
| chrism 29 Aug 2025 |
|
||||
| megadjc 03 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
@@ -54,6 +54,8 @@ enum GB_FUSION2_LED_IDX
|
||||
HDR_D_LED4 = 8,
|
||||
HDR_D_LED3_ARGB = 0x62,
|
||||
HDR_D_LED4_ARGB = 0x63,
|
||||
ONBOARD1_ARGB = 0x64,
|
||||
ONBOARD2_ARGB = 0x65,
|
||||
};
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
| Driver for Gigabyte Aorus RGB Fusion 2 USB motherboard |
|
||||
| |
|
||||
| jackun 08 Jan 2020 |
|
||||
| megadjc 31 Jul 2025 |
|
||||
| megadjc 03 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
@@ -55,6 +55,27 @@ static LEDCount LedCountToEnum(unsigned int c)
|
||||
}
|
||||
}
|
||||
|
||||
static LEDCount LedCountFromEnum(uint8_t count){
|
||||
switch(count & 0x0F)
|
||||
{
|
||||
case LEDS_32:
|
||||
return LEDS_32;
|
||||
|
||||
case LEDS_64:
|
||||
return LEDS_64;
|
||||
|
||||
case LEDS_256:
|
||||
return LEDS_256;
|
||||
|
||||
case LEDS_512:
|
||||
return LEDS_512;
|
||||
|
||||
case LEDS_1024:
|
||||
default:
|
||||
return LEDS_1024;
|
||||
}
|
||||
}
|
||||
|
||||
RGBFusion2USBController::RGBFusion2USBController(hid_device* handle, const char* path, std::string mb_name, uint16_t pid): dev(handle), product_id(pid)
|
||||
{
|
||||
name = mb_name;
|
||||
@@ -96,9 +117,12 @@ bool RGBFusion2USBController::RefreshHardwareInfo()
|
||||
}
|
||||
|
||||
std::memcpy(&report, buffer, sizeof(IT8297Report));
|
||||
report_loaded = true;
|
||||
device_num = report.device_num;
|
||||
description = std::string(report.str_product, 28);
|
||||
|
||||
report_loaded = true;
|
||||
device_num = report.device_num;
|
||||
fw_id = report.fw_ver >> 24;
|
||||
description = std::string(report.str_product, 28);
|
||||
|
||||
if(std::string::iterator nul = std::find(description.begin(), description.end(), '\0');
|
||||
nul != description.end())
|
||||
{
|
||||
@@ -122,10 +146,12 @@ bool RGBFusion2USBController::RefreshHardwareInfo()
|
||||
chip_id = text;
|
||||
}
|
||||
|
||||
D_LED1_count = LedCountToEnum(report.curr_led_count_low & 0x0F);
|
||||
D_LED2_count = LedCountToEnum((report.curr_led_count_low >> 4) & 0x0F);
|
||||
D_LED3_count = LedCountToEnum(report.curr_led_count_high & 0x0F);
|
||||
D_LED4_count = LedCountToEnum((report.curr_led_count_high >> 4) & 0x0F);
|
||||
ARGB_count[0] = LedCountFromEnum(report.argb01_count & 0x0F);
|
||||
ARGB_count[1] = LedCountFromEnum((report.argb01_count >> 4) & 0x0F);
|
||||
ARGB_count[2] = LedCountFromEnum(report.argb23_count & 0x0F);
|
||||
ARGB_count[3] = LedCountFromEnum((report.argb23_count >> 4) & 0x0F);
|
||||
ARGB_count[4] = LedCountFromEnum(report.argb45_count & 0x0F);
|
||||
ARGB_count[5] = LedCountFromEnum((report.argb45_count >> 4) & 0x0F);
|
||||
|
||||
cal_data.dled[0] = report.cal_strip0;
|
||||
cal_data.dled[1] = report.cal_strip1;
|
||||
@@ -148,26 +174,26 @@ bool RGBFusion2USBController::RefreshHardwareInfo()
|
||||
std::memcpy(&cali, buffer2, sizeof(IT5711Calibration));
|
||||
cali_loaded = true;
|
||||
|
||||
cal_data.dled[2] = cali.cal_strip2;
|
||||
cal_data.dled[3] = cali.cal_strip3;
|
||||
cal_data.spare[2] = cali.cal_spare2;
|
||||
cal_data.spare[3] = cali.cal_spare3;
|
||||
cal_data.dled[2] = cali.cal_strip2;
|
||||
cal_data.dled[3] = cali.cal_strip3;
|
||||
cal_data.dled[4] = cali.cal_strip4;
|
||||
cal_data.dled[5] = cali.cal_strip5;
|
||||
}
|
||||
else
|
||||
{
|
||||
cal_data.dled[2] = 0;
|
||||
cal_data.dled[3] = 0;
|
||||
cal_data.spare[2] = 0;
|
||||
cal_data.spare[3] = 0;
|
||||
cali_loaded = false;
|
||||
cal_data.dled[2] = 0;
|
||||
cal_data.dled[3] = 0;
|
||||
cal_data.dled[4] = 0;
|
||||
cal_data.dled[5] = 0;
|
||||
cali_loaded = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cal_data.dled[2] = 0;
|
||||
cal_data.dled[3] = 0;
|
||||
cal_data.spare[2] = 0;
|
||||
cal_data.spare[3] = 0;
|
||||
cal_data.dled[2] = 0;
|
||||
cal_data.dled[3] = 0;
|
||||
cal_data.dled[4] = 0;
|
||||
cal_data.dled[5] = 0;
|
||||
}
|
||||
|
||||
return report_loaded;
|
||||
@@ -181,14 +207,16 @@ std::string RGBFusion2USBController::DecodeCalibrationBuffer(uint32_t value) con
|
||||
return out;
|
||||
}
|
||||
|
||||
uint8_t bo_b = value & 0xFF;
|
||||
uint8_t bo_g = (value >> 8 ) & 0xFF;
|
||||
uint8_t bo_r = (value >> 16) & 0xFF;
|
||||
uint8_t bo_b = value & 0xFF;
|
||||
uint8_t bo_g = (value >> 8 ) & 0xFF;
|
||||
uint8_t bo_r = (value >> 16) & 0xFF;
|
||||
uint8_t bo_reserved = (value >> 24) & 0xFF;
|
||||
|
||||
bool in_range = (bo_r < 3 && bo_g < 3 && bo_b < 3);
|
||||
bool distinct = (bo_r != bo_g && bo_r != bo_b && bo_g != bo_b);
|
||||
bool reserved_clear = (bo_reserved == 0);
|
||||
bool in_range = (bo_r < 3 && bo_g < 3 && bo_b < 3);
|
||||
bool distinct = (bo_r != bo_g && bo_r != bo_b && bo_g != bo_b);
|
||||
|
||||
if(in_range && distinct)
|
||||
if(reserved_clear && in_range && distinct)
|
||||
{
|
||||
out[bo_r] = 'R';
|
||||
out[bo_g] = 'G';
|
||||
@@ -196,7 +224,7 @@ std::string RGBFusion2USBController::DecodeCalibrationBuffer(uint32_t value) con
|
||||
return out;
|
||||
}
|
||||
|
||||
return "BAD";
|
||||
return "INVALID";
|
||||
}
|
||||
|
||||
uint32_t RGBFusion2USBController::EncodeCalibrationBuffer(const std::string& rgb_order)
|
||||
@@ -248,17 +276,31 @@ EncodedCalibration RGBFusion2USBController::GetCalibration(bool refresh_from_hw)
|
||||
|
||||
if(product_id == 0x5711)
|
||||
{
|
||||
out.dled[2] = DecodeCalibrationBuffer(cal_data.dled[2]);
|
||||
out.dled[3] = DecodeCalibrationBuffer(cal_data.dled[3]);
|
||||
out.spare[2] = DecodeCalibrationBuffer(cal_data.spare[2]);
|
||||
out.spare[3] = DecodeCalibrationBuffer(cal_data.spare[3]);
|
||||
if(cali_loaded)
|
||||
{
|
||||
out.dled[2] = DecodeCalibrationBuffer(cal_data.dled[2]);
|
||||
out.dled[3] = DecodeCalibrationBuffer(cal_data.dled[3]);
|
||||
out.dled[4] = DecodeCalibrationBuffer(cal_data.dled[4]);
|
||||
out.dled[5] = DecodeCalibrationBuffer(cal_data.dled[5]);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| CC61 was not available, so these values are |
|
||||
| unknown rather than OFF. |
|
||||
\*-------------------------------------------------*/
|
||||
out.dled[2] = "INVALID";
|
||||
out.dled[3] = "INVALID";
|
||||
out.dled[4] = "INVALID";
|
||||
out.dled[5] = "INVALID";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
out.dled[2] = "OFF";
|
||||
out.dled[3] = "OFF";
|
||||
out.spare[2] = "OFF";
|
||||
out.spare[3] = "OFF";
|
||||
out.dled[2] = "OFF";
|
||||
out.dled[3] = "OFF";
|
||||
out.dled[4] = "OFF";
|
||||
out.dled[5] = "OFF";
|
||||
}
|
||||
|
||||
return out;
|
||||
@@ -271,34 +313,72 @@ bool RGBFusion2USBController::SetCalibration(const EncodedCalibration& cal, bool
|
||||
return false;
|
||||
}
|
||||
|
||||
if(EncodeCalibrationBuffer(cal.dled[0]) == cal_data.dled[0]
|
||||
&& EncodeCalibrationBuffer(cal.dled[1]) == cal_data.dled[1]
|
||||
&& EncodeCalibrationBuffer(cal.mainboard) == cal_data.mainboard
|
||||
&& EncodeCalibrationBuffer(cal.spare[0]) == cal_data.spare[0]
|
||||
&& EncodeCalibrationBuffer(cal.spare[1]) == cal_data.spare[1]
|
||||
&& (product_id != 0x5711
|
||||
|| (EncodeCalibrationBuffer(cal.dled[2]) == cal_data.dled[2]
|
||||
&& EncodeCalibrationBuffer(cal.dled[3]) == cal_data.dled[3]
|
||||
&& EncodeCalibrationBuffer(cal.spare[2]) == cal_data.spare[2]
|
||||
&& EncodeCalibrationBuffer(cal.spare[3]) == cal_data.spare[3])))
|
||||
/*---------------------------------------------------------*\
|
||||
| A calibration write contains the complete calibration |
|
||||
| payload. Do not write from incomplete hardware state. |
|
||||
\*---------------------------------------------------------*/
|
||||
if(!report_loaded || (product_id == 0x5711 && !cali_loaded))
|
||||
{
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Preserve malformed/unavailable values rather than |
|
||||
| converting them to zero. Unknown strings are treated the |
|
||||
| same way so stale configuration cannot erase calibration. |
|
||||
\*---------------------------------------------------------*/
|
||||
auto encode_or_preserve = [&](const std::string& rgb_order, uint32_t current) -> uint32_t
|
||||
{
|
||||
std::string key = rgb_order;
|
||||
std::transform(key.begin(), key.end(), key.begin(),
|
||||
[](unsigned char c){ return char(std::toupper(c)); });
|
||||
|
||||
if(key == "INVALID" || key == "BAD" || key.empty())
|
||||
{
|
||||
return current;
|
||||
}
|
||||
|
||||
if(key == "OFF" || key == "0")
|
||||
{
|
||||
return 0u;
|
||||
}
|
||||
|
||||
if(GigabyteCalibrationsLookup.find(key) == GigabyteCalibrationsLookup.end())
|
||||
{
|
||||
return current;
|
||||
}
|
||||
|
||||
return EncodeCalibrationBuffer(key);
|
||||
};
|
||||
|
||||
CMD_0x33 desired;
|
||||
|
||||
desired.c.d_strip_c0 = EncodeCalibrationBuffer(cal.dled[0]);
|
||||
desired.c.d_strip_c1 = EncodeCalibrationBuffer(cal.dled[1]);
|
||||
desired.c.rgb_cali = EncodeCalibrationBuffer(cal.mainboard);
|
||||
desired.c.c_spare0 = EncodeCalibrationBuffer(cal.spare[0]);
|
||||
desired.c.c_spare1 = EncodeCalibrationBuffer(cal.spare[1]);
|
||||
desired.c.d_strip_c0 = encode_or_preserve(cal.dled[0], cal_data.dled[0]);
|
||||
desired.c.d_strip_c1 = encode_or_preserve(cal.dled[1], cal_data.dled[1]);
|
||||
desired.c.rgb_cali = encode_or_preserve(cal.mainboard, cal_data.mainboard);
|
||||
desired.c.c_spare0 = encode_or_preserve(cal.spare[0], cal_data.spare[0]);
|
||||
desired.c.c_spare1 = encode_or_preserve(cal.spare[1], cal_data.spare[1]);
|
||||
|
||||
if(product_id == 0x5711)
|
||||
{
|
||||
desired.c.d_strip_c2 = EncodeCalibrationBuffer(cal.dled[2]);
|
||||
desired.c.d_strip_c3 = EncodeCalibrationBuffer(cal.dled[3]);
|
||||
desired.c.c_spare2 = EncodeCalibrationBuffer(cal.spare[2]);
|
||||
desired.c.c_spare3 = EncodeCalibrationBuffer(cal.spare[3]);
|
||||
desired.c.d_strip_c2 = encode_or_preserve(cal.dled[2], cal_data.dled[2]);
|
||||
desired.c.d_strip_c3 = encode_or_preserve(cal.dled[3], cal_data.dled[3]);
|
||||
desired.c.d_strip_c4 = encode_or_preserve(cal.dled[4], cal_data.dled[4]);
|
||||
desired.c.d_strip_c5 = encode_or_preserve(cal.dled[5], cal_data.dled[5]);
|
||||
}
|
||||
|
||||
if(desired.c.d_strip_c0 == cal_data.dled[0]
|
||||
&& desired.c.d_strip_c1 == cal_data.dled[1]
|
||||
&& desired.c.rgb_cali == cal_data.mainboard
|
||||
&& desired.c.c_spare0 == cal_data.spare[0]
|
||||
&& desired.c.c_spare1 == cal_data.spare[1]
|
||||
&& (product_id != 0x5711
|
||||
|| (desired.c.d_strip_c2 == cal_data.dled[2]
|
||||
&& desired.c.d_strip_c3 == cal_data.dled[3]
|
||||
&& desired.c.d_strip_c4 == cal_data.dled[4]
|
||||
&& desired.c.d_strip_c5 == cal_data.dled[5])))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
int rc = SendPacket(desired.buffer);
|
||||
@@ -309,7 +389,7 @@ bool RGBFusion2USBController::SetCalibration(const EncodedCalibration& cal, bool
|
||||
|
||||
ResetController();
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
SaveCalState();
|
||||
SaveLightingStateToFlash();
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
|
||||
cal_data.dled[0] = desired.c.d_strip_c0;
|
||||
@@ -320,40 +400,70 @@ bool RGBFusion2USBController::SetCalibration(const EncodedCalibration& cal, bool
|
||||
|
||||
if(product_id == 0x5711)
|
||||
{
|
||||
cal_data.dled[2] = desired.c.d_strip_c2;
|
||||
cal_data.dled[3] = desired.c.d_strip_c3;
|
||||
cal_data.spare[2] = desired.c.c_spare2;
|
||||
cal_data.spare[3] = desired.c.c_spare3;
|
||||
cal_data.dled[2] = desired.c.d_strip_c2;
|
||||
cal_data.dled[3] = desired.c.d_strip_c3;
|
||||
cal_data.dled[4] = desired.c.d_strip_c4;
|
||||
cal_data.dled[5] = desired.c.d_strip_c5;
|
||||
}
|
||||
else
|
||||
{
|
||||
cal_data.dled[2] = 0u;
|
||||
cal_data.dled[3] = 0u;
|
||||
cal_data.spare[2] = 0u;
|
||||
cal_data.spare[3] = 0u;
|
||||
cal_data.dled[2] = 0u;
|
||||
cal_data.dled[3] = 0u;
|
||||
cal_data.dled[4] = 0u;
|
||||
cal_data.dled[5] = 0u;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void RGBFusion2USBController::SetLedCount(unsigned int c0, unsigned int c1, unsigned int c2, unsigned int c3)
|
||||
void RGBFusion2USBController::SetLedCount(
|
||||
unsigned int c0,
|
||||
unsigned int c1,
|
||||
unsigned int c2,
|
||||
unsigned int c3,
|
||||
unsigned int c4,
|
||||
unsigned int c5)
|
||||
{
|
||||
LEDCount new_d1 = LedCountToEnum(c0);
|
||||
LEDCount new_d2 = LedCountToEnum(c1);
|
||||
LEDCount new_d3 = LedCountToEnum(c2);
|
||||
LEDCount new_d4 = LedCountToEnum(c3);
|
||||
LEDCount new_count[6] =
|
||||
{
|
||||
LedCountToEnum(c0),
|
||||
LedCountToEnum(c1),
|
||||
LedCountToEnum(c2),
|
||||
LedCountToEnum(c3),
|
||||
LedCountToEnum(c4),
|
||||
LedCountToEnum(c5)
|
||||
};
|
||||
|
||||
if(new_d1 == D_LED1_count && new_d2 == D_LED2_count && new_d3 == D_LED3_count && new_d4 == D_LED4_count)
|
||||
bool changed = false;
|
||||
|
||||
for(unsigned int i = 0; i < 6; i++)
|
||||
{
|
||||
if(new_count[i] != ARGB_count[i])
|
||||
{
|
||||
changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!changed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
D_LED1_count = new_d1;
|
||||
D_LED2_count = new_d2;
|
||||
D_LED3_count = new_d3;
|
||||
D_LED4_count = new_d4;
|
||||
for(unsigned int i = 0; i < 6; i++)
|
||||
{
|
||||
ARGB_count[i] = new_count[i];
|
||||
}
|
||||
|
||||
SendCCReport(0x34, (new_d2 << 4) | new_d1, (new_d4 << 4) | new_d3);
|
||||
unsigned char buffer[FUSION2_USB_BUFFER_SIZE] = {0};
|
||||
|
||||
buffer[0] = report_id;
|
||||
buffer[1] = 0x34;
|
||||
buffer[2] = (new_count[1] << 4) | new_count[0];
|
||||
buffer[3] = (new_count[3] << 4) | new_count[2];
|
||||
buffer[4] = (new_count[5] << 4) | new_count[4];
|
||||
|
||||
SendPacket(buffer);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
@@ -371,7 +481,7 @@ bool RGBFusion2USBController::SetStripBuiltinEffectState(int hdr, bool enable)
|
||||
bitmask = 0x01;
|
||||
break;
|
||||
case 0x5711:
|
||||
bitmask = 0x01 | 0x02 | 0x08 | 0x10;
|
||||
bitmask = 0x01 | 0x02 | 0x08 | 0x10 | 0x20 | 0x40;
|
||||
break;
|
||||
default:
|
||||
bitmask = 0x01 | 0x02;
|
||||
@@ -395,6 +505,14 @@ bool RGBFusion2USBController::SetStripBuiltinEffectState(int hdr, bool enable)
|
||||
case HDR_D_LED4_ARGB:
|
||||
bitmask = 0x10;
|
||||
break;
|
||||
case LED10:
|
||||
case ONBOARD1_ARGB:
|
||||
bitmask = 0x20;
|
||||
break;
|
||||
case LED11:
|
||||
case ONBOARD2_ARGB:
|
||||
bitmask = 0x40;
|
||||
break;
|
||||
default:
|
||||
bitmask = 0x01;
|
||||
break;
|
||||
@@ -416,17 +534,17 @@ bool RGBFusion2USBController::SetStripBuiltinEffectState(int hdr, bool enable)
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Persist LED config data |
|
||||
| Enable LED Lighting Persistence |
|
||||
\*---------------------------------------------------------*/
|
||||
bool RGBFusion2USBController::SaveLEDState(bool e)
|
||||
bool RGBFusion2USBController::SetPersistentLightingEnabled(bool e)
|
||||
{
|
||||
return SendCCReport(0x47, e ? 1 : 0);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Persist calibration |
|
||||
| Save lighting state to flash |
|
||||
\*---------------------------------------------------------*/
|
||||
bool RGBFusion2USBController::SaveCalState()
|
||||
bool RGBFusion2USBController::SaveLightingStateToFlash()
|
||||
{
|
||||
return SendCCReport(0x5E, 0);
|
||||
}
|
||||
@@ -440,7 +558,7 @@ bool RGBFusion2USBController::EnableBeat(bool e)
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Set Lamp Array mode (MSDL) |
|
||||
| Set Lamp Array mode |
|
||||
\*---------------------------------------------------------*/
|
||||
bool RGBFusion2USBController::EnableLampArray(bool enable)
|
||||
{
|
||||
@@ -461,6 +579,11 @@ std::string RGBFusion2USBController::GetDeviceDescription()
|
||||
return(description);
|
||||
}
|
||||
|
||||
uint8_t RGBFusion2USBController::GetFWID()
|
||||
{
|
||||
return(fw_id);
|
||||
}
|
||||
|
||||
std::string RGBFusion2USBController::GetFWVersion()
|
||||
{
|
||||
return(version);
|
||||
@@ -512,6 +635,12 @@ void RGBFusion2USBController::SetStripColors(unsigned int hdr, RGBColor* colors,
|
||||
case HDR_D_LED4_ARGB:
|
||||
byteorder = cal_data.dled[3];
|
||||
break;
|
||||
case ONBOARD1_ARGB:
|
||||
byteorder = cal_data.dled[4];
|
||||
break;
|
||||
case ONBOARD2_ARGB:
|
||||
byteorder = cal_data.dled[5];
|
||||
break;
|
||||
default:
|
||||
byteorder = cal_data.dled[0];
|
||||
break;
|
||||
@@ -618,7 +747,7 @@ void RGBFusion2USBController::SetLEDEffect(int led, int mode, unsigned int speed
|
||||
pkt.e.effect_param0 = 7;
|
||||
break;
|
||||
case EFFECT_WAVE:
|
||||
pkt.e.period0 = (((speed + 1)^2) + (speed + 1) + 10) * 5 / 2;
|
||||
pkt.e.period0 = ((speed + 1) * (speed + 1) + (speed + 1) + 10) * 5 / 2;
|
||||
pkt.e.effect_param0 = 7;
|
||||
pkt.e.effect_param1 = 1;
|
||||
break;
|
||||
@@ -719,7 +848,8 @@ void RGBFusion2USBController::ResetController()
|
||||
| Check controller for gen2 ARGB support |
|
||||
| Checks for supported device number |
|
||||
| Then checks for supported controllers |
|
||||
| Then checks for supported feature bit (SaveLEDState) |
|
||||
| Then checks for supported feature bit |
|
||||
| (SetPersistentLighting) |
|
||||
| Finally checks for strip detection value. |
|
||||
\*---------------------------------------------------------*/
|
||||
bool RGBFusion2USBController::SupportsGen2() const
|
||||
@@ -829,10 +959,10 @@ bool RGBFusion2USBController::ScanGen2Strips(uint8_t enabled_headers)
|
||||
|
||||
dst.totalLeds = total_leds;
|
||||
|
||||
SetLedCount(0, 0, 0, 0);
|
||||
SetLedCount(0, 0, 0, 0, 0, 0);
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
|
||||
SaveLEDState(false);
|
||||
SetPersistentLightingEnabled(false);
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(20));
|
||||
}
|
||||
|
||||
@@ -842,7 +972,7 @@ bool RGBFusion2USBController::ScanGen2Strips(uint8_t enabled_headers)
|
||||
/*---------------------------------------------------------*\
|
||||
| Check controller for persistent state support |
|
||||
\*---------------------------------------------------------*/
|
||||
bool RGBFusion2USBController::SupportsSaveLEDState() const
|
||||
bool RGBFusion2USBController::SupportsSetPersistentLighting() const
|
||||
{
|
||||
return(report_loaded && (report.support_cmd_flag & 0x01));
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
| Driver for Gigabyte Aorus RGB Fusion 2 USB motherboard |
|
||||
| |
|
||||
| jackun 08 Jan 2020 |
|
||||
| megadjc 31 Jul 2025 |
|
||||
| megadjc 03 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
@@ -20,6 +20,14 @@
|
||||
#include "GigabyteFusion2USB_Devices.h"
|
||||
|
||||
#define FUSION2_USB_BUFFER_SIZE 64
|
||||
#define RGBFUSION2_DLED_LEDS_MIN 0
|
||||
#define RGBFUSION2_DLED_LEDS_MAX 1024
|
||||
|
||||
/*--------------------------------------------------------*\
|
||||
| IT57xx only supports 256 LED strings |
|
||||
\*--------------------------------------------------------*/
|
||||
#define RGBFUSION2_57XX_LEDS_MIN 0
|
||||
#define RGBFUSION2_57XX_LEDS_MAX 256
|
||||
|
||||
/*--------------------------------------------------------*\
|
||||
| Gen2 scan/info opcode base |
|
||||
@@ -73,8 +81,8 @@ struct LEDs
|
||||
\*---------------------------------------------------------*/
|
||||
struct CalibrationData
|
||||
{
|
||||
uint32_t dled[4] = {0, 0, 0, 0};
|
||||
uint32_t spare[4] = {0, 0, 0, 0};
|
||||
uint32_t dled[6] = {0, 0, 0, 0, 0, 0};
|
||||
uint32_t spare[2] = {0, 0};
|
||||
uint32_t mainboard = 0;
|
||||
};
|
||||
|
||||
@@ -83,8 +91,8 @@ struct CalibrationData
|
||||
\*---------------------------------------------------------*/
|
||||
struct EncodedCalibration
|
||||
{
|
||||
std::string dled[4];
|
||||
std::string spare[4];
|
||||
std::string dled[6];
|
||||
std::string spare[2];
|
||||
std::string mainboard;
|
||||
};
|
||||
|
||||
@@ -176,6 +184,12 @@ union PktRGB
|
||||
case HDR_D_LED4:
|
||||
header = HDR_D_LED4_ARGB;
|
||||
break;
|
||||
case LED10:
|
||||
header = ONBOARD1_ARGB;
|
||||
break;
|
||||
case LED11:
|
||||
header = ONBOARD2_ARGB;
|
||||
break;
|
||||
default:
|
||||
header = HDR_D_LED1_ARGB;
|
||||
break;
|
||||
@@ -271,9 +285,9 @@ struct IT8297Report
|
||||
uint8_t device_num;
|
||||
uint8_t strip_detect;
|
||||
uint32_t fw_ver;
|
||||
uint8_t curr_led_count_high;
|
||||
uint8_t curr_led_count_low;
|
||||
uint8_t strip_ctrl_length1;
|
||||
uint8_t argb01_count;
|
||||
uint8_t argb23_count;
|
||||
uint8_t argb45_count;
|
||||
uint8_t support_cmd_flag;
|
||||
char str_product[28];
|
||||
uint32_t cal_spare0;
|
||||
@@ -293,8 +307,8 @@ struct IT5711Calibration
|
||||
uint8_t reserved[3];
|
||||
uint32_t cal_strip2;
|
||||
uint32_t cal_strip3;
|
||||
uint32_t cal_spare2;
|
||||
uint32_t cal_spare3;
|
||||
uint32_t cal_strip4;
|
||||
uint32_t cal_strip5;
|
||||
uint8_t padding[44];
|
||||
};
|
||||
|
||||
@@ -315,8 +329,8 @@ union CMD_0x33
|
||||
uint32_t c_spare1 = 0;
|
||||
uint32_t d_strip_c2 = 0;
|
||||
uint32_t d_strip_c3 = 0;
|
||||
uint32_t c_spare2 = 0;
|
||||
uint32_t c_spare3 = 0;
|
||||
uint32_t d_strip_c4 = 0;
|
||||
uint32_t d_strip_c5 = 0;
|
||||
uint8_t reserved[25];
|
||||
} c;
|
||||
|
||||
@@ -336,14 +350,15 @@ public:
|
||||
|
||||
bool ApplyEffect(bool batch_commit = false);
|
||||
bool SetCalibration(const EncodedCalibration& cal, bool refresh_from_hw);
|
||||
void SetLedCount(unsigned int c0, unsigned int c1, unsigned int c2, unsigned int c3);
|
||||
void SetLedCount(unsigned int c0, unsigned int c1, unsigned int c2, unsigned int c3, unsigned int c4, unsigned int c5);
|
||||
void SetLEDEffect(int led, int mode, unsigned int speed, unsigned char brightness, bool random, uint32_t* color);
|
||||
bool SetStripBuiltinEffectState(int hdr, bool enable);
|
||||
void SetStripColors(unsigned int hdr, RGBColor * colors, unsigned int num_colors, int single_led = -1);
|
||||
bool SupportsGen2() const;
|
||||
bool ScanGen2Strips(uint8_t hdr_mask);
|
||||
bool SaveLEDState(bool enable);
|
||||
bool SupportsSaveLEDState() const;
|
||||
bool SupportsSetPersistentLighting() const;
|
||||
bool SetPersistentLightingEnabled(bool enable);
|
||||
bool SaveLightingStateToFlash();
|
||||
|
||||
EncodedCalibration GetCalibration(bool refresh_from_hw = false);
|
||||
std::string GetDeviceName();
|
||||
@@ -351,6 +366,7 @@ public:
|
||||
std::string GetDeviceDescription();
|
||||
std::string GetDeviceLocation();
|
||||
std::string GetFWVersion();
|
||||
uint8_t GetFWID();
|
||||
uint16_t GetProductID();
|
||||
std::string GetSerial();
|
||||
std::vector<Gen2StripInfo> ExportGen2Strips() const;
|
||||
@@ -363,13 +379,13 @@ private:
|
||||
uint32_t EncodeCalibrationBuffer(const std::string& rgb_order);
|
||||
bool RefreshHardwareInfo();
|
||||
void ResetController();
|
||||
bool SaveCalState();
|
||||
bool SendCCReport(uint8_t a, uint8_t b, uint8_t c = 0);
|
||||
bool SendReport(uint8_t id, uint8_t a, uint8_t b, uint8_t c = 0);
|
||||
int SendPacket(unsigned char* packet);
|
||||
|
||||
hid_device* dev;
|
||||
uint8_t device_num;
|
||||
uint8_t fw_id = 0;
|
||||
uint16_t product_id;
|
||||
uint32_t effect_zone_mask = 0;
|
||||
int mode;
|
||||
@@ -384,8 +400,5 @@ private:
|
||||
int report_id = 0xCC;
|
||||
bool report_loaded = false;
|
||||
bool cali_loaded = false;
|
||||
LEDCount D_LED1_count;
|
||||
LEDCount D_LED2_count;
|
||||
LEDCount D_LED3_count;
|
||||
LEDCount D_LED4_count;
|
||||
LEDCount ARGB_count[6];
|
||||
};
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
| motherboard |
|
||||
| |
|
||||
| jackun 08 Jan 2020 |
|
||||
| megadjc 31 Jul 2025 |
|
||||
| megadjc 03 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
||||
+608
-336
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@
|
||||
| motherboard |
|
||||
| |
|
||||
| jackun 08 Jan 2020 |
|
||||
| megadjc 31 Jul 2025 |
|
||||
| megadjc 03 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
@@ -13,35 +13,16 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include "RGBController.h"
|
||||
#include "GigabyteFusion2USB_Devices.h"
|
||||
#include "GigabyteRGBFusion2USBController.h"
|
||||
#include "SettingsManager.h"
|
||||
|
||||
#define RGBFUSION2_DIGITAL_LEDS_MIN 0
|
||||
#define RGBFUSION2_DIGITAL_LEDS_MAX 1024
|
||||
#define RGBFUSION2_BRIGHTNESS_MIN 0
|
||||
#define RGBFUSION2_BRIGHTNESS_MAX 255
|
||||
#define RGBFUSION2_SPEED_MIN 9
|
||||
#define RGBFUSION2_SPEED_MID 4
|
||||
#define RGBFUSION2_SPEED_MAX 0
|
||||
|
||||
#define GET_JSON_VAL_ELSE_OFF(obj, key) obj.contains(key) ? obj.at(key).get<std::string>() : std::string("OFF")
|
||||
|
||||
template<typename K, typename V>
|
||||
static std::map<V, K> reverse_map(const std::map<K, V>& map)
|
||||
{
|
||||
std::map<V, K> reversed_map;
|
||||
|
||||
for(const std::pair<K, V> entry : map)
|
||||
{
|
||||
reversed_map[entry.second] = entry.first;
|
||||
}
|
||||
|
||||
return reversed_map;
|
||||
}
|
||||
|
||||
class RGBController_RGBFusion2USB: public RGBController
|
||||
{
|
||||
public:
|
||||
@@ -59,14 +40,20 @@ public:
|
||||
void DeviceUpdateMode();
|
||||
void DeviceUpdateZoneMode(int zone);
|
||||
void DeviceSaveMode() override;
|
||||
void DeviceConfigureDevice() override;
|
||||
void DeviceUpdateDeviceSpecificConfiguration() override;
|
||||
|
||||
private:
|
||||
std::string detector_name;
|
||||
|
||||
RGBFusion2USBController* controller;
|
||||
uint8_t device_num;
|
||||
uint8_t fw_id = 0;
|
||||
RGBColor null_color = 0;
|
||||
bool supports_gen2 = 0;
|
||||
uint8_t gen2_enabled_headers = 0;
|
||||
bool entire_device_effect_active = false;
|
||||
bool persist_lighting_on_exit = false;
|
||||
/*---------------------------------------------------------*\
|
||||
| The intial value of device_index should point to the |
|
||||
| layout for the generic_device |
|
||||
@@ -75,6 +62,8 @@ private:
|
||||
uint16_t product_id = 0;
|
||||
uint32_t effects_mask = 0;
|
||||
void Init_Controller();
|
||||
void InitDeviceSpecificConfiguration();
|
||||
void ApplyDeviceSpecificConfiguration(bool setup_zones);
|
||||
int GetLED_Zone(int led_idx);
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
@@ -84,16 +73,4 @@ private:
|
||||
gb_fusion2_layout instance_zones{};
|
||||
std::vector<gb_fusion2_zone*> allocated_zones;
|
||||
|
||||
nlohmann::json WriteCalJsonFrom(
|
||||
const EncodedCalibration& src);
|
||||
void FillMissingWith(
|
||||
nlohmann::json& dst,
|
||||
const EncodedCalibration& fb);
|
||||
nlohmann::json BuildCustomLayoutJson(
|
||||
const gb_fusion2_device* layout,
|
||||
const RvrseLedHeaders& reverseLookup);
|
||||
void LoadCustomLayoutFromJson(
|
||||
const nlohmann::json& json_custom,
|
||||
const FwdLedHeaders& forwardLookup,
|
||||
gb_fusion2_device* layout);
|
||||
};
|
||||
|
||||
@@ -16,22 +16,45 @@
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
struct GoveeHardwareInfo
|
||||
/*---------------------------------------------------------*\
|
||||
| A device's zone shape is picked from this fixed set of |
|
||||
| known layouts rather than special-cased by SKU string, so |
|
||||
| adding a device that fits an existing shape is a one-line |
|
||||
| table entry rather than a new code path. |
|
||||
| |
|
||||
| LINEAR single strip, no matrix |
|
||||
| SERPENTINE matrix wired bottom-to-top, alternating |
|
||||
| scan direction each row (e.g. H6022) |
|
||||
| SPLIT_BARS two disconnected bars either side of a gap, |
|
||||
| e.g. two light bars flanking a monitor |
|
||||
\*---------------------------------------------------------*/
|
||||
enum GoveeZoneLayout
|
||||
{
|
||||
unsigned int led_count;
|
||||
unsigned int matrix_row_len; // 0 = linear
|
||||
bool supports_razer;
|
||||
GOVEE_ZONE_LINEAR,
|
||||
GOVEE_ZONE_SERPENTINE,
|
||||
GOVEE_ZONE_SPLIT_BARS,
|
||||
};
|
||||
|
||||
struct GoveeDeviceInfo
|
||||
{
|
||||
unsigned int led_count;
|
||||
GoveeZoneLayout layout;
|
||||
unsigned int matrix_row_len; // SERPENTINE only: LEDs per row
|
||||
unsigned int gap_columns; // SPLIT_BARS only: empty columns between the two bars
|
||||
bool supports_razer;
|
||||
};
|
||||
|
||||
const unsigned int GOVEE_FALLBACK_LED_COUNT = 1;
|
||||
#define GOVEE_MATRIX_LED_NONE 0xFFFFFFFF
|
||||
|
||||
static std::map<std::string, GoveeHardwareInfo> govee_hardware_info
|
||||
static std::map<std::string, GoveeDeviceInfo> govee_device_info
|
||||
{
|
||||
{ "H6022", { 132, 12, true } }, // Govee Smart Table Lamp 2
|
||||
{ "H612F", { 12, 0, true } }, // Govee Strip Light S (3m)
|
||||
{ "H619A", { 20, 0, true } }, // Govee RGBIC Led Strip Lights
|
||||
{ "H70B1", { 20, 0, true } }, // Govee LED Curtain Lights
|
||||
{ "H607C", { 174, 0, true } }, // Govee Floor Lamp 2
|
||||
{ "H6022", { 132, GOVEE_ZONE_SERPENTINE, 12, 0, true } }, // Govee Smart Table Lamp 2
|
||||
{ "H6046", { 20, GOVEE_ZONE_SPLIT_BARS, 0, 10, true } }, // Govee RGBIC Gaming Light Bars - two 10-LED bars, right then left
|
||||
{ "H612F", { 12, GOVEE_ZONE_LINEAR, 0, 0, true } }, // Govee Strip Light S (3m)
|
||||
{ "H619A", { 20, GOVEE_ZONE_LINEAR, 0, 0, true } }, // Govee RGBIC Led Strip Lights
|
||||
{ "H70B1", { 20, GOVEE_ZONE_LINEAR, 0, 0, true } }, // Govee LED Curtain Lights
|
||||
{ "H607C", { 174, GOVEE_ZONE_LINEAR, 0, 0, true } }, // Govee Floor Lamp 2
|
||||
};
|
||||
|
||||
enum
|
||||
@@ -98,10 +121,10 @@ RGBController_Govee::~RGBController_Govee()
|
||||
|
||||
void RGBController_Govee::SetupZones()
|
||||
{
|
||||
GoveeHardwareInfo hw = { GOVEE_FALLBACK_LED_COUNT, 0, false };
|
||||
GoveeDeviceInfo hw = { GOVEE_FALLBACK_LED_COUNT, GOVEE_ZONE_LINEAR, 0, 0, false };
|
||||
|
||||
std::map<std::string, GoveeHardwareInfo>::iterator it = govee_hardware_info.find(controller->GetSku());
|
||||
if(it != govee_hardware_info.end())
|
||||
std::map<std::string, GoveeDeviceInfo>::iterator it = govee_device_info.find(controller->GetSku());
|
||||
if(it != govee_device_info.end())
|
||||
{
|
||||
hw = it->second;
|
||||
razer_supported = hw.supports_razer;
|
||||
@@ -112,45 +135,90 @@ void RGBController_Govee::SetupZones()
|
||||
strip.leds_min = hw.led_count;
|
||||
strip.leds_max = hw.led_count;
|
||||
|
||||
if(hw.matrix_row_len == 0)
|
||||
switch(hw.layout)
|
||||
{
|
||||
strip.name = "Govee Strip";
|
||||
strip.type = ZONE_TYPE_LINEAR;
|
||||
}
|
||||
else
|
||||
{
|
||||
strip.name = "Govee Matrix";
|
||||
strip.type = ZONE_TYPE_MATRIX;
|
||||
|
||||
unsigned int width = hw.matrix_row_len;
|
||||
unsigned int height = hw.led_count / width;
|
||||
|
||||
strip.matrix_map.height = height;
|
||||
strip.matrix_map.width = width;
|
||||
strip.matrix_map.map.resize(hw.led_count);
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| On H6022, LEDs indexed bottom to top, alternating |
|
||||
| clockwise and counterclockwise for each row. |
|
||||
\*-------------------------------------------------*/
|
||||
for(unsigned int y = 0; y < height; y++)
|
||||
case GOVEE_ZONE_LINEAR:
|
||||
{
|
||||
/*---------------------------------------------*\
|
||||
| LEDs numbered bottom to top, opposite of |
|
||||
| matrix clockwise and counterclockwise for |
|
||||
| each row. |
|
||||
\*---------------------------------------------*/
|
||||
unsigned int led_y = (height - 1) - y;
|
||||
strip.name = "Govee Strip";
|
||||
strip.type = ZONE_TYPE_LINEAR;
|
||||
break;
|
||||
}
|
||||
|
||||
for(unsigned int x = 0; x < width; x++)
|
||||
case GOVEE_ZONE_SPLIT_BARS:
|
||||
{
|
||||
strip.name = "Light Bars";
|
||||
strip.type = ZONE_TYPE_MATRIX;
|
||||
|
||||
unsigned int bar_leds = hw.led_count / 2;
|
||||
unsigned int width = hw.gap_columns + 2;
|
||||
unsigned int height = bar_leds;
|
||||
|
||||
strip.matrix_map.Set(height, width, NULL);
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| The two bars stand either side of a monitor, so |
|
||||
| the left bar takes the first column and the right |
|
||||
| bar the last one. The columns between them are |
|
||||
| empty and represent the gap across the desk, |
|
||||
| which keeps horizontal effects moving at the same |
|
||||
| rate as they appear to the eye. |
|
||||
\*-------------------------------------------------*/
|
||||
for(unsigned int y = 0; y < height; y++)
|
||||
{
|
||||
/*-----------------------------------------*\
|
||||
| LED is right-to-left for even rows, |
|
||||
| including first one |
|
||||
\*-----------------------------------------*/
|
||||
unsigned int led_x = led_y & 1 ? x : (width - 1) - x;
|
||||
strip.matrix_map.map[y * width + x] = led_y * width + led_x;
|
||||
for(unsigned int x = 0; x < width; x++)
|
||||
{
|
||||
strip.matrix_map.map[(y * width) + x] = GOVEE_MATRIX_LED_NONE;
|
||||
}
|
||||
|
||||
strip.matrix_map.map[(y * width)] = bar_leds + y;
|
||||
strip.matrix_map.map[(y * width) + (width - 1)] = y;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case GOVEE_ZONE_SERPENTINE:
|
||||
default:
|
||||
{
|
||||
strip.name = "Govee Matrix";
|
||||
strip.type = ZONE_TYPE_MATRIX;
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| matrix_row_len is only meaningful for this layout |
|
||||
| - guard a table entry that forgets to set it so a |
|
||||
| bad row degrades to a single column instead of |
|
||||
| dividing by zero. |
|
||||
\*-------------------------------------------------*/
|
||||
unsigned int width = (hw.matrix_row_len > 0) ? hw.matrix_row_len : 1;
|
||||
unsigned int height = hw.led_count / width;
|
||||
|
||||
strip.matrix_map.height = height;
|
||||
strip.matrix_map.width = width;
|
||||
strip.matrix_map.map.resize(hw.led_count);
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| LEDs indexed bottom to top, alternating clockwise |
|
||||
| and counterclockwise for each row (e.g. H6022). |
|
||||
\*-------------------------------------------------*/
|
||||
for(unsigned int y = 0; y < height; y++)
|
||||
{
|
||||
/*---------------------------------------------*\
|
||||
| LEDs numbered bottom to top, opposite of |
|
||||
| matrix clockwise and counterclockwise for |
|
||||
| each row. |
|
||||
\*---------------------------------------------*/
|
||||
unsigned int led_y = (height - 1) - y;
|
||||
|
||||
for(unsigned int x = 0; x < width; x++)
|
||||
{
|
||||
/*-----------------------------------------*\
|
||||
| LED is right-to-left for even rows, |
|
||||
| including first one |
|
||||
\*-----------------------------------------*/
|
||||
unsigned int led_x = led_y & 1 ? x : (width - 1) - x;
|
||||
strip.matrix_map.map[y * width + x] = led_y * width + led_x;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
zones.push_back(strip);
|
||||
@@ -158,7 +226,25 @@ void RGBController_Govee::SetupZones()
|
||||
for(std::size_t led_idx = 0; led_idx < strip.leds_count; led_idx++)
|
||||
{
|
||||
led strip_led;
|
||||
strip_led.name = "Govee LED " + std::to_string(led_idx);
|
||||
|
||||
if(hw.layout == GOVEE_ZONE_SPLIT_BARS)
|
||||
{
|
||||
unsigned int bar_leds = hw.led_count / 2;
|
||||
|
||||
if(led_idx < bar_leds)
|
||||
{
|
||||
strip_led.name = "Right Bar LED " + std::to_string(led_idx + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
strip_led.name = "Left Bar LED " + std::to_string(led_idx - (bar_leds - 1));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
strip_led.name = "Govee LED " + std::to_string(led_idx);
|
||||
}
|
||||
|
||||
leds.push_back(strip_led);
|
||||
}
|
||||
|
||||
@@ -288,6 +374,23 @@ void RGBController_Govee::KeepaliveThread()
|
||||
{
|
||||
UpdateStatic(true);
|
||||
}
|
||||
else if(modes[active_mode].value == GOVEE_MODE_DIRECT)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Direct/per-LED mode has no other periodic refresh - |
|
||||
| SendRazerEnable() only fires once, at mode entry. |
|
||||
| Re-assert it here so a long gap between real updates |
|
||||
| (e.g. idle time between plugin-driven alerts) can't |
|
||||
| let the device's external-control session time out |
|
||||
| and fall back to its own firmware default. |
|
||||
\*-----------------------------------------------------*/
|
||||
if(razer_supported)
|
||||
{
|
||||
controller->SendRazerEnable();
|
||||
}
|
||||
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
}
|
||||
|
||||
std::this_thread::sleep_for(10s);
|
||||
|
||||
@@ -31,7 +31,7 @@ HIDLampArrayController::HIDLampArrayController(hid_device *dev_handle, const cha
|
||||
unsigned int pos = 0;
|
||||
unsigned char report_descriptor[HID_API_MAX_REPORT_DESCRIPTOR_SIZE];
|
||||
unsigned char report_id = 0;
|
||||
unsigned int size = hid_get_report_descriptor(dev, report_descriptor, sizeof(report_descriptor));
|
||||
int size = hid_get_report_descriptor(dev, report_descriptor, sizeof(report_descriptor));
|
||||
unsigned int usage = 0;
|
||||
unsigned char usage_page = 0;
|
||||
|
||||
@@ -40,7 +40,18 @@ HIDLampArrayController::HIDLampArrayController(hid_device *dev_handle, const cha
|
||||
\*-----------------------------------------------------*/
|
||||
std::unordered_map<unsigned int, unsigned int> usage_to_report_id;
|
||||
|
||||
while(pos < size)
|
||||
/*-----------------------------------------------------*\
|
||||
| A failed descriptor read returns -1; treated as a |
|
||||
| length it walks off the end of the buffer. |
|
||||
\*-----------------------------------------------------*/
|
||||
if(size < 0)
|
||||
{
|
||||
LampArray.LampCount = 0;
|
||||
LampArray.LampArrayKind = HID_LAMPARRAY_KIND_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
|
||||
while(pos < (unsigned int)size)
|
||||
{
|
||||
get_hid_item_size(report_descriptor, size, pos, &data_len, &key_size);
|
||||
|
||||
|
||||
@@ -83,6 +83,8 @@ RGBController_HIDLampArray::RGBController_HIDLampArray(HIDLampArrayController* c
|
||||
|
||||
RGBController_HIDLampArray::~RGBController_HIDLampArray()
|
||||
{
|
||||
Shutdown();
|
||||
|
||||
delete controller;
|
||||
}
|
||||
|
||||
@@ -334,8 +336,8 @@ void RGBController_HIDLampArray::SetupZones()
|
||||
columns.insert(controller->GetLamps()[lamp_idx].PositionXInMicrometers);
|
||||
}
|
||||
|
||||
new_zone.matrix_map.height = rows.size();
|
||||
new_zone.matrix_map.width = columns.size();
|
||||
new_zone.matrix_map.height = (unsigned int)rows.size();
|
||||
new_zone.matrix_map.width = (unsigned int)columns.size();
|
||||
new_zone.matrix_map.map.resize(rows.size() * columns.size());
|
||||
|
||||
memset(new_zone.matrix_map.map.data(), 0xFF, (new_zone.matrix_map.map.size() * sizeof(unsigned int)));
|
||||
@@ -346,7 +348,7 @@ void RGBController_HIDLampArray::SetupZones()
|
||||
size_t idx = std::distance(columns.begin(), columns.find(controller->GetLamps()[lamp_idx].PositionXInMicrometers));
|
||||
size_t idy = std::distance(rows.begin(), rows.find(controller->GetLamps()[lamp_idx].PositionYInMicrometers));
|
||||
|
||||
new_zone.matrix_map.map[idx + idy * new_zone.matrix_map.width] = lamp_idx;
|
||||
new_zone.matrix_map.map[idx + idy * new_zone.matrix_map.width] = (unsigned int)lamp_idx;
|
||||
}
|
||||
|
||||
zones.push_back(new_zone);
|
||||
@@ -371,7 +373,7 @@ void RGBController_HIDLampArray::SetupZones()
|
||||
|
||||
void RGBController_HIDLampArray::DeviceUpdateLEDs()
|
||||
{
|
||||
unsigned int leds_to_go = leds.size();
|
||||
unsigned int leds_to_go = (unsigned int)leds.size();
|
||||
|
||||
while(leds_to_go > 0)
|
||||
{
|
||||
@@ -387,7 +389,7 @@ void RGBController_HIDLampArray::DeviceUpdateLEDs()
|
||||
|
||||
for(unsigned int led_frame_idx = 0; led_frame_idx < leds_this_frame; led_frame_idx++)
|
||||
{
|
||||
unsigned short led_idx = (leds.size() - leds_to_go) + led_frame_idx;
|
||||
unsigned short led_idx = (unsigned short)((leds.size() - leds_to_go) + led_frame_idx);
|
||||
LampIds[led_frame_idx] = led_idx;
|
||||
UpdateColors[led_frame_idx].RedChannel = RGBGetRValue(colors[led_idx]);
|
||||
UpdateColors[led_frame_idx].GreenChannel = RGBGetGValue(colors[led_idx]);
|
||||
|
||||
@@ -20,9 +20,6 @@
|
||||
#include "LogitechG213Controller.h"
|
||||
#include "LogitechG600Controller.h"
|
||||
#include "LogitechG933Controller.h"
|
||||
#include "LogitechG810Controller.h"
|
||||
#include "LogitechGProKeyboardController.h"
|
||||
#include "LogitechG910Controller.h"
|
||||
#include "LogitechG815Controller.h"
|
||||
#include "LogitechG915Controller.h"
|
||||
#include "LogitechGLightsyncController.h"
|
||||
@@ -32,9 +29,6 @@
|
||||
#include "RGBController_LogitechG213.h"
|
||||
#include "RGBController_LogitechG600.h"
|
||||
#include "RGBController_LogitechG933.h"
|
||||
#include "RGBController_LogitechG810.h"
|
||||
#include "RGBController_LogitechGProKeyboard.h"
|
||||
#include "RGBController_LogitechG910.h"
|
||||
#include "RGBController_LogitechG815.h"
|
||||
#include "RGBController_LogitechG915.h"
|
||||
#include "RGBController_LogitechGLightsync.h"
|
||||
@@ -61,12 +55,6 @@ using namespace std::chrono_literals;
|
||||
| Keyboard product IDs |
|
||||
\*---------------------------------------------------------*/
|
||||
#define LOGITECH_G213_PID 0xC336
|
||||
#define LOGITECH_G512_PID 0xC342
|
||||
#define LOGITECH_G512_RGB_PID 0xC33C
|
||||
#define LOGITECH_G610_1_PID 0xC333
|
||||
#define LOGITECH_G610_2_PID 0xC338
|
||||
#define LOGITECH_G810_1_PID 0xC331
|
||||
#define LOGITECH_G810_2_PID 0xC337
|
||||
#define LOGITECH_G813_PID 0xC232
|
||||
#define LOGITECH_G815_PID 0xC33F
|
||||
#define LOGITECH_G915_WIRED_PID 0xC33E
|
||||
@@ -74,9 +62,6 @@ using namespace std::chrono_literals;
|
||||
#define LOGITECH_G915_RECEIVER_2_PID 0xC547
|
||||
#define LOGITECH_G915TKL_WIRED_PID 0xC343
|
||||
#define LOGITECH_G915TKL_RECEIVER_PID 0xC545
|
||||
#define LOGITECH_G910_ORION_SPARK_PID 0xC32B
|
||||
#define LOGITECH_G910_PID 0xC335
|
||||
#define LOGITECH_GPRO_KEYBOARD_1_PID 0xC339
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Mouse product IDs |
|
||||
@@ -172,112 +157,6 @@ DetectedControllers DetectLogitechKeyboardG213(hid_device_info* info, const std:
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
DetectedControllers DetectLogitechKeyboardG810(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Logitech keyboards use two different usages, one for |
|
||||
| 20-byte packets and one for 64-byte packets. Usage |
|
||||
| 0x0602 for 20 byte, usage 0x0604 for 64 byte, both |
|
||||
| are on usage page 0xFF43 |
|
||||
\*-----------------------------------------------------*/
|
||||
DetectedControllers detected_controllers;
|
||||
|
||||
hid_device* dev_usage_0x0602 = nullptr;
|
||||
hid_device* dev_usage_0x0604 = nullptr;
|
||||
hid_device_info* info_temp = info;
|
||||
|
||||
while(info_temp)
|
||||
{
|
||||
if(info_temp->vendor_id == info->vendor_id // constant LOGITECH_VID
|
||||
&& info_temp->product_id == info->product_id // NON-constant
|
||||
&& info_temp->interface_number == info->interface_number // constant 1
|
||||
&& info_temp->usage_page == info->usage_page) // constant 0xFF43
|
||||
{
|
||||
if(info_temp->usage == 0x0602)
|
||||
{
|
||||
dev_usage_0x0602 = hid_open_path(info_temp->path);
|
||||
}
|
||||
else if(info_temp->usage == 0x0604)
|
||||
{
|
||||
dev_usage_0x0604 = hid_open_path(info_temp->path);
|
||||
}
|
||||
}
|
||||
if(dev_usage_0x0602 && dev_usage_0x0604)
|
||||
{
|
||||
break;
|
||||
}
|
||||
info_temp = info_temp->next;
|
||||
}
|
||||
if(dev_usage_0x0602 && dev_usage_0x0604)
|
||||
{
|
||||
LogitechG810Controller* controller = new LogitechG810Controller(dev_usage_0x0602, dev_usage_0x0604, info->path, name);
|
||||
RGBController_LogitechG810* rgb_controller = new RGBController_LogitechG810(controller);
|
||||
|
||||
detected_controllers.push_back(rgb_controller);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not all of them could be opened, do some cleanup
|
||||
hid_close(dev_usage_0x0602);
|
||||
hid_close(dev_usage_0x0604);
|
||||
}
|
||||
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
DetectedControllers DetectLogitechKeyboardG910(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Logitech keyboards use two different usages, one for |
|
||||
| 20-byte packets and one for 64-byte packets. Usage |
|
||||
| 0x0602 for 20 byte, usage 0x0604 for 64 byte, both |
|
||||
| are on usage page 0xFF43 |
|
||||
\*-----------------------------------------------------*/
|
||||
DetectedControllers detected_controllers;
|
||||
|
||||
hid_device* dev_usage_0x0602 = nullptr;
|
||||
hid_device* dev_usage_0x0604 = nullptr;
|
||||
hid_device_info* info_temp = info;
|
||||
|
||||
while(info_temp)
|
||||
{
|
||||
if(info_temp->vendor_id == info->vendor_id // constant LOGITECH_VID
|
||||
&& info_temp->product_id == info->product_id // NON-constant
|
||||
&& info_temp->interface_number == info->interface_number // constant 1
|
||||
&& info_temp->usage_page == info->usage_page) // constant 0xFF43
|
||||
{
|
||||
if(info_temp->usage == 0x0602)
|
||||
{
|
||||
dev_usage_0x0602 = hid_open_path(info_temp->path);
|
||||
}
|
||||
else if(info_temp->usage == 0x0604)
|
||||
{
|
||||
dev_usage_0x0604 = hid_open_path(info_temp->path);
|
||||
}
|
||||
}
|
||||
if(dev_usage_0x0602 && dev_usage_0x0604)
|
||||
{
|
||||
break;
|
||||
}
|
||||
info_temp = info_temp->next;
|
||||
}
|
||||
if(dev_usage_0x0602 && dev_usage_0x0604)
|
||||
{
|
||||
LogitechG910Controller* controller = new LogitechG910Controller(dev_usage_0x0602, dev_usage_0x0604, info->path, name);
|
||||
RGBController_LogitechG910* rgb_controller = new RGBController_LogitechG910(controller);
|
||||
|
||||
detected_controllers.push_back(rgb_controller);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not all of them could be opened, do some cleanup
|
||||
hid_close(dev_usage_0x0602);
|
||||
hid_close(dev_usage_0x0604);
|
||||
}
|
||||
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
DetectedControllers DetectLogitechKeyboardG815(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
@@ -431,8 +310,9 @@ DetectedControllers DetectLogitechKeyboardG915Receiver2(hid_device_info* info, c
|
||||
{
|
||||
/*-----------------------------------------*\
|
||||
| G915 X family: the unified HID++ 2.0 |
|
||||
| controller handles it. Skip so the C547 |
|
||||
| detector claims it. |
|
||||
| controller handles it. Skip so the |
|
||||
| unified detector, registered after this |
|
||||
| one, claims it. |
|
||||
\*-----------------------------------------*/
|
||||
LOG_DEBUG("[LogitechControllerDetect] 0xC547 G915 X -> unified controller, skipping legacy");
|
||||
hid_close(dev);
|
||||
@@ -493,59 +373,6 @@ DetectedControllers DetectLogitechKeyboardG915Wired(hid_device_info* info, const
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
DetectedControllers DetectLogitechKeyboardGPro(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Logitech keyboards use two different usages, one for |
|
||||
| 20-byte packets and one for 64-byte packets. Usage |
|
||||
| 0x0602 for 20 byte, usage 0x0604 for 64 byte, both |
|
||||
| are on usage page 0xFF43 |
|
||||
\*-----------------------------------------------------*/
|
||||
DetectedControllers detected_controllers;
|
||||
|
||||
hid_device* dev_usage_0x0602 = nullptr;
|
||||
hid_device* dev_usage_0x0604 = nullptr;
|
||||
hid_device_info* info_temp = info;
|
||||
|
||||
while(info_temp)
|
||||
{
|
||||
if(info_temp->vendor_id == info->vendor_id // constant LOGITECH_VID
|
||||
&& info_temp->product_id == info->product_id // NON-constant
|
||||
&& info_temp->interface_number == info->interface_number // constant 1
|
||||
&& info_temp->usage_page == info->usage_page) // constant 0xFF43
|
||||
{
|
||||
if(info_temp->usage == 0x0602)
|
||||
{
|
||||
dev_usage_0x0602 = hid_open_path(info_temp->path);
|
||||
}
|
||||
else if(info_temp->usage == 0x0604)
|
||||
{
|
||||
dev_usage_0x0604 = hid_open_path(info_temp->path);
|
||||
}
|
||||
}
|
||||
if(dev_usage_0x0602 && dev_usage_0x0604)
|
||||
{
|
||||
break;
|
||||
}
|
||||
info_temp = info_temp->next;
|
||||
}
|
||||
if(dev_usage_0x0602 && dev_usage_0x0604)
|
||||
{
|
||||
LogitechGProKeyboardController* controller = new LogitechGProKeyboardController(dev_usage_0x0602, dev_usage_0x0604, name);
|
||||
RGBController_LogitechGProKeyboard* rgb_controller = new RGBController_LogitechGProKeyboard(controller);
|
||||
|
||||
detected_controllers.push_back(rgb_controller);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not all of them could be opened, do some cleanup
|
||||
hid_close(dev_usage_0x0602);
|
||||
hid_close(dev_usage_0x0604);
|
||||
}
|
||||
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Logitech Mice |
|
||||
\*---------------------------------------------------------*/
|
||||
@@ -998,6 +825,16 @@ static bool HIDPP20ClaimDevice(const std::string& device_id)
|
||||
return hidpp20_claimed_devices.insert(device_id).second;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Free the device claim when the device is unplugged |
|
||||
\*---------------------------------------------------------*/
|
||||
static bool HIDPP20UnclaimDevice(const std::string& device_id)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(hidpp20_registry_mutex);
|
||||
|
||||
return hidpp20_claimed_devices.erase(device_id);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Watchers own threads and a node handle, so they have to |
|
||||
| be stopped before the process exits. |
|
||||
@@ -1380,7 +1217,7 @@ static bool HIDPP20LookupTarget(const std::string& node_path, uint8_t index, HID
|
||||
| lighting; both leave the target on file, so a device |
|
||||
| that was asleep is built when its dongle reports it. |
|
||||
\*---------------------------------------------------------*/
|
||||
static RGBController_LogitechHIDPP20* HIDPP20BuildController(const HIDPP20BuildTarget& target)
|
||||
static RGBController_LogitechHIDPP20* HIDPP20BuildController(const HIDPP20BuildTarget& target, const std::string& device_id="")
|
||||
{
|
||||
HIDPP20BuildClaim claim(target.node_path, target.index);
|
||||
|
||||
@@ -1466,7 +1303,7 @@ static RGBController_LogitechHIDPP20* HIDPP20BuildController(const HIDPP20BuildT
|
||||
{
|
||||
controller->Initialize();
|
||||
|
||||
RGBController_LogitechHIDPP20* rgb_controller = new RGBController_LogitechHIDPP20(controller);
|
||||
RGBController_LogitechHIDPP20* rgb_controller = new RGBController_LogitechHIDPP20(controller, [device_id](){HIDPP20UnclaimDevice(device_id);});
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Reader and power threads from the start, so we |
|
||||
@@ -1569,7 +1406,7 @@ static DetectedControllers HIDPP20Create(hid_device_info* info, const std::strin
|
||||
|
||||
HIDPP20RecordTarget(target);
|
||||
|
||||
RGBController_LogitechHIDPP20* rgb_controller = HIDPP20BuildController(target);
|
||||
RGBController_LogitechHIDPP20* rgb_controller = HIDPP20BuildController(target, device_id);
|
||||
|
||||
if(rgb_controller != nullptr)
|
||||
{
|
||||
@@ -1684,29 +1521,6 @@ DetectedControllers DetectLogitechHIDPP20(hid_device_info* info, const std::stri
|
||||
return(detected);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------*\
|
||||
| Unified HID++ 2.0: generic detection. These run only for devices with no *enabled* VID/PID-specific detector, disabling a legacy |
|
||||
| controller in Settings hands its hardware over on the next detection. That is the migration path: no code change, and no risk to a |
|
||||
| device whose legacy controller stays enabled. |
|
||||
| |
|
||||
| The registrations cover every legacy transport signature: |
|
||||
| any interface, 0xFF00 usage 2 standard HID++ long report (modern keyboards/mice, receivers, G915 family, wired Lightspeed mice). |
|
||||
| Usage 2 is the collection we write to, on Windows, the only one that accepts our writes. |
|
||||
| any interface, 0xFF43 any usage keyboards (G213/G512/G610/G810/G813/G815/G910/G Pro), the G560 speaker, the |
|
||||
| G933 headset, and Bluetooth nodes. Not interface-keyed: a Bluetooth node |
|
||||
| reports interface -1, which is also HID_INTERFACE_ANY, so it can never match. |
|
||||
| interface 1, 0xFF00 any usage older mice whose HID++ collection is not the usage-2 one |
|
||||
| any interface, 0xFFA0 usage 1 Centurion (G522, PRO X 2) |
|
||||
| |
|
||||
| Not covered, deliberately: the G600 (page 0xFF80) and the X56 (own VID) are not HID++ 2.0. A matching non-HID++ node costs one failed |
|
||||
| probe, ProbeIdentity changes nothing on the device. Receivers are recognized at runtime: the device probe fails and the pairing table |
|
||||
| answers; paired slots follow the same enabled/disabled rule (hidpp20_legacy_wireless_pids). |
|
||||
\*-------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
REGISTER_HID_DETECTOR_PU_ONLY ("Logitech HID++ 2.0", DetectLogitechHIDPP20, 0xFF00, 2);
|
||||
REGISTER_HID_DETECTOR_P_ONLY ("Logitech HID++ 2.0", DetectLogitechHIDPP20, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP_ONLY ("Logitech HID++ 2.0", DetectLogitechHIDPP20, 1, 0xFF00);
|
||||
REGISTER_HID_DETECTOR_PU_ONLY ("Logitech HID++ 2.0", DetectLogitechHIDPP20, 0xFFA0, 1);
|
||||
|
||||
REGISTER_CUSTOM_UDEV_RULE(logitech_hidpp20, "Logitech HID++ 2.0", "SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"046d\", TAG+=\"uaccess\", TAG+=\"Logitech_HID_20\"\nSUBSYSTEM==\"usb\", ATTR{idVendor}==\"046d\", TAG+=\"uaccess\", TAG+=\"Logitech_HID_20\"");
|
||||
REGISTER_CUSTOM_UDEV_RULE(logitech_g560, "Logitech G560 Lightsync Speaker", "SUBSYSTEMS==\"usb|hidraw\", ATTRS{idVendor}==\"046d\", ATTRS{idProduct}==\"0a78\", TAG+=\"uaccess\", TAG+=\"Logitech_G560_Lightsync_Speaker\"");
|
||||
|
||||
@@ -1714,35 +1528,14 @@ REGISTER_CUSTOM_UDEV_RULE(logitech_g560, "Logitech G560 Lightsync Speaker", "SUB
|
||||
| Keyboards |
|
||||
\*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G213", DetectLogitechKeyboardG213, LOGITECH_VID, LOGITECH_G213_PID, 1, 0xFF43, 0x0602);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G512", DetectLogitechKeyboardG810, LOGITECH_VID, LOGITECH_G512_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G512 RGB", DetectLogitechKeyboardG810, LOGITECH_VID, LOGITECH_G512_RGB_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G610 Orion", DetectLogitechKeyboardG810, LOGITECH_VID, LOGITECH_G610_1_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G610 Orion", DetectLogitechKeyboardG810, LOGITECH_VID, LOGITECH_G610_2_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G810 Orion Spectrum", DetectLogitechKeyboardG810, LOGITECH_VID, LOGITECH_G810_1_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G810 Orion Spectrum", DetectLogitechKeyboardG810, LOGITECH_VID, LOGITECH_G810_2_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G813 RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardG815, LOGITECH_VID, LOGITECH_G813_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G815 RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardG815, LOGITECH_VID, LOGITECH_G815_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G910 Orion Spark", DetectLogitechKeyboardG910, LOGITECH_VID, LOGITECH_G910_ORION_SPARK_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G910 Orion Spectrum", DetectLogitechKeyboardG910, LOGITECH_VID, LOGITECH_G910_PID, 1, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech G Pro RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardGPro, LOGITECH_VID, LOGITECH_GPRO_KEYBOARD_1_PID, 1, 0xFF43);
|
||||
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G915 Wireless RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardG915, LOGITECH_VID, LOGITECH_G915_RECEIVER_PID, 2, 0xFF00, 2);
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G915 Wireless RGB Mechanical Gaming Keyboard (Receiver 2)", DetectLogitechKeyboardG915Receiver2, LOGITECH_VID, LOGITECH_G915_RECEIVER_2_PID, 2, 0xFF00, 2);
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G915 Wireless RGB Mechanical Gaming Keyboard (Wired)", DetectLogitechKeyboardG915Wired, LOGITECH_VID, LOGITECH_G915_WIRED_PID, 2, 0xFF00, 2);
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G915TKL Wireless RGB Mechanical Gaming Keyboard", DetectLogitechKeyboardG915, LOGITECH_VID, LOGITECH_G915TKL_RECEIVER_PID, 2, 0xFF00, 2);
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G915TKL Wireless RGB Mechanical Gaming Keyboard (Wired)", DetectLogitechKeyboardG915Wired, LOGITECH_VID, LOGITECH_G915TKL_WIRED_PID, 2, 0xFF00, 2);
|
||||
/*---------------------------------------------------------*\
|
||||
| C547 carve-out: the legacy G915 Receiver 2 registration |
|
||||
| above makes C547 a VID/PID-specific match, which |
|
||||
| suppresses the generic HID++ 2.0 detector for every C547 |
|
||||
| node, including receivers with non-G915 devices paired. |
|
||||
| This specific entry runs after the G915 detector |
|
||||
| (registration order); when that returns nothing, the |
|
||||
| unified pairing-table enumeration takes the receiver. |
|
||||
| Literal PID: the macro token-pastes the object name and |
|
||||
| LOGITECH_G915_RECEIVER_2_PID is already used above. |
|
||||
\*---------------------------------------------------------*/
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech HID++ 2.0 (C547 receiver)", DetectLogitechHIDPP20, LOGITECH_VID, 0xC547, 2, 0xFF00, 2);
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------------------*\
|
||||
| Mice |
|
||||
\*-------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
@@ -1973,3 +1766,31 @@ REGISTER_HID_DETECTOR_IPU("Logitech G733 Gaming Headset",
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G733 Gaming Headset", DetectLogitechWired, LOGITECH_VID, LOGITECH_G733_2_PID, 3, 0xFF43, 514);
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G733 Gaming Headset", DetectLogitechWired, LOGITECH_VID, LOGITECH_G733_3_PID, 3, 0xFF43, 514);
|
||||
REGISTER_HID_DETECTOR_IPU("Logitech G935 Gaming Headset", DetectLogitechWired, LOGITECH_VID, LOGITECH_G935_PID, 3, 0xFF43, 514);
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------------------------------------------*\
|
||||
| Unified HID++ 2.0. Keyed to the Logitech VID, so these are specific detectors and no generic detector runs on a Logitech node; |
|
||||
| HID LampArray in particular, which the official app publishes as a virtual device for older boards. Registered last on purpose: |
|
||||
| specific detectors run in registration order and the first to return a controller wins, so a legacy controller keeps its device |
|
||||
| while its detector is enabled, and disabling it in Settings hands the device over on the next detection. |
|
||||
| |
|
||||
| USB, every legacy transport signature: |
|
||||
| 0xFF00 usage 2 standard HID++ long report (modern keyboards/mice, receivers, G915 family, wired Lightspeed mice). |
|
||||
| Usage 2 is the collection we write to, on Windows, the only one that accepts our writes. |
|
||||
| 0xFF43 any usage keyboards (G213/G512/G610/G810/G813/G815/G910/G Pro), the G560 speaker, the G933 headset |
|
||||
| interface 1, 0xFF00 any usage older mice whose HID++ collection is not the usage-2 one. No bus key: an interface number |
|
||||
| only exists on USB. |
|
||||
| 0xFFA0 usage 1 Centurion (G522, PRO X 2) |
|
||||
| Bluetooth, which reports no interface number: |
|
||||
| 0xFF43 any usage G-series keyboards (G515) |
|
||||
| 0xFF00 usage 2 mice, the collection Solaar drives them on |
|
||||
| |
|
||||
| Not covered, deliberately: the G600 (page 0xFF80) and the X56 (own VID) are not HID++ 2.0. A matching non-HID++ node costs one failed |
|
||||
| probe, ProbeIdentity changes nothing on the device. Receivers are recognized at runtime: the device probe fails and the pairing table |
|
||||
| answers; paired slots follow the same enabled/disabled rule (hidpp20_legacy_wireless_pids). |
|
||||
\*-------------------------------------------------------------------------------------------------------------------------------------*/
|
||||
REGISTER_HID_DETECTOR_BPU("Logitech HID++ 2.0", DetectLogitechHIDPP20, LOGITECH_VID, HID_PID_ANY, HID_API_BUS_USB, 0xFF00, 2);
|
||||
REGISTER_HID_DETECTOR_BP ("Logitech HID++ 2.0", DetectLogitechHIDPP20, LOGITECH_VID, HID_PID_ANY, HID_API_BUS_USB, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_IP ("Logitech HID++ 2.0", DetectLogitechHIDPP20, LOGITECH_VID, HID_PID_ANY, 1, 0xFF00);
|
||||
REGISTER_HID_DETECTOR_BPU("Logitech HID++ 2.0", DetectLogitechHIDPP20, LOGITECH_VID, HID_PID_ANY, HID_API_BUS_USB, 0xFFA0, 1);
|
||||
REGISTER_HID_DETECTOR_BP ("Logitech HID++ 2.0", DetectLogitechHIDPP20, LOGITECH_VID, HID_PID_ANY, HID_API_BUS_BLUETOOTH, 0xFF43);
|
||||
REGISTER_HID_DETECTOR_BPU("Logitech HID++ 2.0", DetectLogitechHIDPP20, LOGITECH_VID, HID_PID_ANY, HID_API_BUS_BLUETOOTH, 0xFF00, 2);
|
||||
|
||||
@@ -1,198 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| LogitechG810Controller.cpp |
|
||||
| |
|
||||
| Driver for Logitech G810 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 11 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <cstring>
|
||||
#include "LogitechG810Controller.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
LogitechG810Controller::LogitechG810Controller(hid_device* dev_handle_0x11, hid_device* dev_handle_0x12, char* path, std::string dev_name)
|
||||
{
|
||||
dev_pkt_0x11 = dev_handle_0x11;
|
||||
dev_pkt_0x12 = dev_handle_0x12;
|
||||
location = path;
|
||||
name = dev_name;
|
||||
}
|
||||
|
||||
LogitechG810Controller::~LogitechG810Controller()
|
||||
{
|
||||
hid_close(dev_pkt_0x11);
|
||||
hid_close(dev_pkt_0x12);
|
||||
}
|
||||
|
||||
std::string LogitechG810Controller::GetLocationString()
|
||||
{
|
||||
return("HID: " + location);
|
||||
}
|
||||
|
||||
std::string LogitechG810Controller::GetNameString()
|
||||
{
|
||||
return(name);
|
||||
}
|
||||
|
||||
std::string LogitechG810Controller::GetSerialString()
|
||||
{
|
||||
wchar_t serial_string[128];
|
||||
int ret = hid_get_serial_number_string(dev_pkt_0x11, serial_string, 128);
|
||||
|
||||
if(ret != 0)
|
||||
{
|
||||
return("");
|
||||
}
|
||||
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
void LogitechG810Controller::Commit()
|
||||
{
|
||||
SendCommit();
|
||||
}
|
||||
|
||||
void LogitechG810Controller::SetDirect
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
)
|
||||
{
|
||||
SendDirectFrame(zone, frame_count, frame_data);
|
||||
}
|
||||
|
||||
void LogitechG810Controller::SetMode
|
||||
(
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
)
|
||||
{
|
||||
SendMode(LOGITECH_G810_ZONE_MODE_KEYBOARD, mode, speed, red, green, blue);
|
||||
SendMode(LOGITECH_G810_ZONE_MODE_LOGO, mode, speed, red, green, blue);
|
||||
|
||||
SendCommit();
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------*\
|
||||
| Private packet sending functions. |
|
||||
\*-------------------------------------------------------------------------------------------------*/
|
||||
|
||||
void LogitechG810Controller::SendCommit()
|
||||
{
|
||||
unsigned char usb_buf[20];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Commit packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x11;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0C;
|
||||
usb_buf[0x03] = 0x5D;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x11, usb_buf, 20);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
|
||||
void LogitechG810Controller::SendDirectFrame
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
)
|
||||
{
|
||||
unsigned char usb_buf[64];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Lighting Control packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x12;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0C;
|
||||
usb_buf[0x03] = 0x3D;
|
||||
usb_buf[0x05] = zone;
|
||||
usb_buf[0x07] = frame_count;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Copy in frame data |
|
||||
\*-----------------------------------------------------*/
|
||||
memcpy(&usb_buf[0x08], frame_data, frame_count * 4);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x12, usb_buf, 64);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
|
||||
void LogitechG810Controller::SendMode
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
)
|
||||
{
|
||||
unsigned char usb_buf[20];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Lighting Control packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x11;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0D;
|
||||
usb_buf[0x03] = 0x3D;
|
||||
usb_buf[0x04] = zone;
|
||||
|
||||
usb_buf[0x05] = mode;
|
||||
|
||||
usb_buf[0x06] = red;
|
||||
usb_buf[0x07] = green;
|
||||
usb_buf[0x08] = blue;
|
||||
|
||||
speed = 100 * speed;
|
||||
if(mode == LOGITECH_G810_MODE_CYCLE)
|
||||
{
|
||||
usb_buf[0x0B] = speed >> 8;
|
||||
usb_buf[0x0C] = speed & 0xFF;
|
||||
usb_buf[0x0D] = 0x64;
|
||||
}
|
||||
else if(mode == LOGITECH_G810_MODE_BREATHING)
|
||||
{
|
||||
usb_buf[0x09] = speed >> 8;
|
||||
usb_buf[0x0A] = speed & 0xFF;
|
||||
usb_buf[0x0C] = 0x64;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x11, usb_buf, 20);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| LogitechG810Controller.h |
|
||||
| |
|
||||
| Driver for Logitech G810 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 11 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <hidapi.h>
|
||||
#include "RGBController.h"
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_G810_ZONE_MODE_KEYBOARD = 0x00,
|
||||
LOGITECH_G810_ZONE_MODE_LOGO = 0x01,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_G810_ZONE_DIRECT_KEYBOARD = 0x01,
|
||||
LOGITECH_G810_ZONE_DIRECT_MEDIA = 0x02,
|
||||
LOGITECH_G810_ZONE_DIRECT_LOGO = 0x10,
|
||||
LOGITECH_G810_ZONE_DIRECT_INDICATORS = 0x40,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_G810_MODE_OFF = 0x00,
|
||||
LOGITECH_G810_MODE_STATIC = 0x01,
|
||||
LOGITECH_G810_MODE_BREATHING = 0x02,
|
||||
LOGITECH_G810_MODE_CYCLE = 0x03,
|
||||
LOGITECH_G810_MODE_WAVE = 0x04,
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------------------------*\
|
||||
| Speed is 1000 for fast and 20000 for slow. |
|
||||
| Values are multiplied by 100 later to give lots of GUI steps. |
|
||||
\*---------------------------------------------------------------------------------------------*/
|
||||
enum
|
||||
{
|
||||
LOGITECH_G810_SPEED_SLOWEST = 0xC8, /* Slowest speed */
|
||||
LOGITECH_G810_SPEED_NORMAL = 0x32, /* Normal speed */
|
||||
LOGITECH_G810_SPEED_FASTEST = 0x0A, /* Fastest speed */
|
||||
};
|
||||
|
||||
class LogitechG810Controller
|
||||
{
|
||||
public:
|
||||
LogitechG810Controller(hid_device* dev_handle_0x11, hid_device* dev_handle_0x12, char* path, std::string dev_name);
|
||||
~LogitechG810Controller();
|
||||
|
||||
std::string GetLocationString();
|
||||
std::string GetNameString();
|
||||
std::string GetSerialString();
|
||||
|
||||
void Commit();
|
||||
|
||||
void SetDirect
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
);
|
||||
|
||||
void SetMode
|
||||
(
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
);
|
||||
|
||||
private:
|
||||
hid_device* dev_pkt_0x11;
|
||||
hid_device* dev_pkt_0x12;
|
||||
std::string location;
|
||||
std::string name;
|
||||
|
||||
void SendDirectFrame
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
);
|
||||
|
||||
void SendMode
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
);
|
||||
|
||||
void SendCommit();
|
||||
};
|
||||
@@ -1,380 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_LogitechG810.cpp |
|
||||
| |
|
||||
| RGBController for Logitech G810 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 12 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "RGBControllerKeyNames.h"
|
||||
#include "RGBController_LogitechG810.h"
|
||||
|
||||
//0xFFFFFFFF indicates an unused entry in matrix
|
||||
#define NA 0xFFFFFFFF
|
||||
|
||||
static unsigned int matrix_map[7][23] =
|
||||
{ { 111, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 116, 114, 115, NA, 113, NA, 112, 110, NA, NA, NA },
|
||||
{ 37, NA, 54, 55, 56, 57, NA, 58, 59, 60, 61, NA, 62, 63, 64, 65, 66, 67, 68, 109, 108, 107, 106 },
|
||||
{ 49, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, 41, 42, 38, NA, 69, 70, 71, 79, 80, 81, 82 },
|
||||
{ 39, NA, 16, 22, 4, 17, NA, 19, 24, 20, 8, 14, 15, 43, 44, 45, 72, 73, 74, 91, 92, 93, 83 },
|
||||
{ 53, NA, 0, 18, 3, 5, NA, 6, 7, 9, 10, 11, 47, 48, 46, 36, NA, NA, NA, 88, 89, 90, NA },
|
||||
{ 99, 96, 25, 23, 2, 21, NA, 1, NA, 13, 12, 50, 51, 52, 103, NA, NA, 78, NA, 85, 86, 87, 84 },
|
||||
{ 98, 101, 100, NA, NA, NA, NA, 40, NA, NA, NA, NA, 104, 105, 97, 102, 76, 77, 75, 94, NA, 95, NA } };
|
||||
|
||||
static const char* zone_names[] =
|
||||
{
|
||||
ZONE_EN_KEYBOARD,
|
||||
};
|
||||
|
||||
static zone_type zone_types[] =
|
||||
{
|
||||
ZONE_TYPE_MATRIX,
|
||||
};
|
||||
|
||||
static const unsigned int zone_sizes[] =
|
||||
{
|
||||
117,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char * name;
|
||||
const unsigned char zone;
|
||||
const unsigned char idx;
|
||||
} led_type;
|
||||
|
||||
static const led_type led_names[] =
|
||||
{
|
||||
/* Key Label Zone, Index */
|
||||
{ KEY_EN_A, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x04 },
|
||||
{ KEY_EN_B, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x05 },
|
||||
{ KEY_EN_C, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x06 },
|
||||
{ KEY_EN_D, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x07 },
|
||||
{ KEY_EN_E, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x08 },
|
||||
{ KEY_EN_F, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x09 },
|
||||
{ KEY_EN_G, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x0A },
|
||||
{ KEY_EN_H, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x0B },
|
||||
{ KEY_EN_I, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x0C },
|
||||
{ KEY_EN_J, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x0D },
|
||||
{ KEY_EN_K, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x0E },
|
||||
{ KEY_EN_L, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x0F },
|
||||
{ KEY_EN_M, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x10 },
|
||||
{ KEY_EN_N, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x11 },
|
||||
{ KEY_EN_O, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x12 },
|
||||
{ KEY_EN_P, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x13 },
|
||||
{ KEY_EN_Q, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x14 },
|
||||
{ KEY_EN_R, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x15 },
|
||||
{ KEY_EN_S, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x16 },
|
||||
{ KEY_EN_T, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x17 },
|
||||
{ KEY_EN_U, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x18 },
|
||||
{ KEY_EN_V, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x19 },
|
||||
{ KEY_EN_W, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x1A },
|
||||
{ KEY_EN_X, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x1B },
|
||||
{ KEY_EN_Y, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x1C },
|
||||
{ KEY_EN_Z, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x1D },
|
||||
{ KEY_EN_1, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x1E },
|
||||
{ KEY_EN_2, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x1F },
|
||||
{ KEY_EN_3, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x20 },
|
||||
{ KEY_EN_4, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x21 },
|
||||
{ KEY_EN_5, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x22 },
|
||||
{ KEY_EN_6, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x23 },
|
||||
{ KEY_EN_7, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x24 },
|
||||
{ KEY_EN_8, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x25 },
|
||||
{ KEY_EN_9, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x26 },
|
||||
{ KEY_EN_0, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x27 },
|
||||
{ KEY_EN_ANSI_ENTER, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x28 },
|
||||
{ KEY_EN_ESCAPE, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x29 },
|
||||
{ KEY_EN_BACKSPACE, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x2A },
|
||||
{ KEY_EN_TAB, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x2B },
|
||||
{ KEY_EN_SPACE, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x2C },
|
||||
{ KEY_EN_MINUS, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x2D },
|
||||
{ KEY_EN_EQUALS, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x2E },
|
||||
{ KEY_EN_LEFT_BRACKET, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x2F },
|
||||
{ KEY_EN_RIGHT_BRACKET, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x30 },
|
||||
{ KEY_EN_ANSI_BACK_SLASH, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x31 },//ANSI only
|
||||
{ KEY_EN_POUND, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x32 },//ISO only
|
||||
{ KEY_EN_SEMICOLON, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x33 },
|
||||
{ KEY_EN_QUOTE, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x34 },
|
||||
{ KEY_EN_BACK_TICK, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x35 },
|
||||
{ KEY_EN_COMMA, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x36 },
|
||||
{ KEY_EN_PERIOD, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x37 },
|
||||
{ KEY_EN_FORWARD_SLASH, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x38 },
|
||||
{ KEY_EN_CAPS_LOCK, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x39 },
|
||||
{ KEY_EN_F1, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x3A },
|
||||
{ KEY_EN_F2, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x3B },
|
||||
{ KEY_EN_F3, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x3C },
|
||||
{ KEY_EN_F4, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x3D },
|
||||
{ KEY_EN_F5, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x3E },
|
||||
{ KEY_EN_F6, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x3F },
|
||||
{ KEY_EN_F7, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x40 },
|
||||
{ KEY_EN_F8, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x41 },
|
||||
{ KEY_EN_F9, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x42 },
|
||||
{ KEY_EN_F10, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x43 },
|
||||
{ KEY_EN_F11, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x44 },
|
||||
{ KEY_EN_F12, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x45 },
|
||||
{ KEY_EN_PRINT_SCREEN, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x46 },
|
||||
{ KEY_EN_SCROLL_LOCK, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x47 },
|
||||
{ KEY_EN_PAUSE_BREAK, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x48 },
|
||||
{ KEY_EN_INSERT, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x49 },
|
||||
{ KEY_EN_HOME, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x4A },
|
||||
{ KEY_EN_PAGE_UP, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x4B },
|
||||
{ KEY_EN_DELETE, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x4C },
|
||||
{ KEY_EN_END, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x4D },
|
||||
{ KEY_EN_PAGE_DOWN, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x4E },
|
||||
{ KEY_EN_RIGHT_ARROW, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x4F },
|
||||
{ KEY_EN_LEFT_ARROW, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x50 },
|
||||
{ KEY_EN_DOWN_ARROW, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x51 },
|
||||
{ KEY_EN_UP_ARROW, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x52 },
|
||||
{ KEY_EN_NUMPAD_LOCK, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x53 },
|
||||
{ KEY_EN_NUMPAD_DIVIDE, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x54 },
|
||||
{ KEY_EN_NUMPAD_TIMES, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x55 },
|
||||
{ KEY_EN_NUMPAD_MINUS, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x56 },
|
||||
{ KEY_EN_NUMPAD_PLUS, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x57 },
|
||||
{ KEY_EN_NUMPAD_ENTER, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x58 },
|
||||
{ KEY_EN_NUMPAD_1, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x59 },
|
||||
{ KEY_EN_NUMPAD_2, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x5A },
|
||||
{ KEY_EN_NUMPAD_3, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x5B },
|
||||
{ KEY_EN_NUMPAD_4, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x5C },
|
||||
{ KEY_EN_NUMPAD_5, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x5D },
|
||||
{ KEY_EN_NUMPAD_6, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x5E },
|
||||
{ KEY_EN_NUMPAD_7, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x5F },
|
||||
{ KEY_EN_NUMPAD_8, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x60 },
|
||||
{ KEY_EN_NUMPAD_9, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x61 },
|
||||
{ KEY_EN_NUMPAD_0, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x62 },
|
||||
{ KEY_EN_NUMPAD_PERIOD, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x63 },
|
||||
{ KEY_EN_ISO_BACK_SLASH, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x64 },//ISO only
|
||||
{ KEY_EN_MENU, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0x65 },
|
||||
{ KEY_EN_LEFT_CONTROL, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE0 },
|
||||
{ KEY_EN_LEFT_SHIFT, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE1 },
|
||||
{ KEY_EN_LEFT_ALT, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE2 },
|
||||
{ KEY_EN_LEFT_WINDOWS, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE3 },
|
||||
{ KEY_EN_RIGHT_CONTROL, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE4 },
|
||||
{ KEY_EN_RIGHT_SHIFT, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE5 },
|
||||
{ KEY_EN_RIGHT_ALT, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE6 },
|
||||
{ KEY_EN_RIGHT_WINDOWS, LOGITECH_G810_ZONE_DIRECT_KEYBOARD, 0xE7 },
|
||||
{ KEY_EN_MEDIA_NEXT, LOGITECH_G810_ZONE_DIRECT_MEDIA, 0xB5 },
|
||||
{ KEY_EN_MEDIA_PREVIOUS, LOGITECH_G810_ZONE_DIRECT_MEDIA, 0xB6 },
|
||||
{ KEY_EN_MEDIA_STOP, LOGITECH_G810_ZONE_DIRECT_MEDIA, 0xB7 },
|
||||
{ KEY_EN_MEDIA_PLAY_PAUSE, LOGITECH_G810_ZONE_DIRECT_MEDIA, 0xCD },
|
||||
{ KEY_EN_MEDIA_MUTE, LOGITECH_G810_ZONE_DIRECT_MEDIA, 0xE2 },
|
||||
{ "Logo", LOGITECH_G810_ZONE_DIRECT_LOGO, 0x01 },
|
||||
{ "Lighting", LOGITECH_G810_ZONE_DIRECT_INDICATORS, 0x01 },
|
||||
{ "Game Mode", LOGITECH_G810_ZONE_DIRECT_INDICATORS, 0x02 },
|
||||
{ "Caps Lock Indicator", LOGITECH_G810_ZONE_DIRECT_INDICATORS, 0x03 },
|
||||
{ "Scroll Lock Indicator", LOGITECH_G810_ZONE_DIRECT_INDICATORS, 0x04 },
|
||||
{ "Num Lock Indicator", LOGITECH_G810_ZONE_DIRECT_INDICATORS, 0x05 },
|
||||
};
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name Logitech G810
|
||||
@category Keyboard
|
||||
@type USB
|
||||
@save :robot:
|
||||
@direct :white_check_mark:
|
||||
@effects :white_check_mark:
|
||||
@detectors DetectLogitechKeyboardG810
|
||||
@comment
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_LogitechG810::RGBController_LogitechG810(LogitechG810Controller* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
|
||||
name = controller->GetNameString();
|
||||
vendor = "Logitech";
|
||||
type = DEVICE_TYPE_KEYBOARD;
|
||||
description = "Logitech Keyboard Device";
|
||||
location = controller->GetLocationString();
|
||||
serial = controller->GetSerialString();
|
||||
|
||||
mode Direct;
|
||||
Direct.name = "Direct";
|
||||
Direct.value = 0xFFFF;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
|
||||
Direct.color_mode = MODE_COLORS_PER_LED;
|
||||
modes.push_back(Direct);
|
||||
|
||||
mode Static;
|
||||
Static.name = "Static";
|
||||
Static.value = LOGITECH_G810_MODE_STATIC;
|
||||
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
Static.colors_min = 1;
|
||||
Static.colors_max = 1;
|
||||
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Static.colors.resize(1);
|
||||
modes.push_back(Static);
|
||||
|
||||
mode Off;
|
||||
Off.name = "Off";
|
||||
Off.value = LOGITECH_G810_MODE_OFF;
|
||||
Off.flags = 0;
|
||||
Off.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(Off);
|
||||
|
||||
mode Cycle;
|
||||
Cycle.name = "Cycle";
|
||||
Cycle.value = LOGITECH_G810_MODE_CYCLE;
|
||||
Cycle.flags = MODE_FLAG_HAS_SPEED;
|
||||
Cycle.color_mode = MODE_COLORS_NONE;
|
||||
Cycle.speed_min = LOGITECH_G810_SPEED_SLOWEST;
|
||||
Cycle.speed_max = LOGITECH_G810_SPEED_FASTEST;
|
||||
Cycle.speed = LOGITECH_G810_SPEED_NORMAL;
|
||||
modes.push_back(Cycle);
|
||||
|
||||
mode Breathing;
|
||||
Breathing.name = "Breathing";
|
||||
Breathing.value = LOGITECH_G810_MODE_BREATHING;
|
||||
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
|
||||
Breathing.colors_min = 1;
|
||||
Breathing.colors_max = 1;
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Breathing.colors.resize(1);
|
||||
Breathing.speed_min = LOGITECH_G810_SPEED_SLOWEST;
|
||||
Breathing.speed_max = LOGITECH_G810_SPEED_FASTEST;
|
||||
Breathing.speed = LOGITECH_G810_SPEED_NORMAL;
|
||||
modes.push_back(Breathing);
|
||||
|
||||
SetupZones();
|
||||
}
|
||||
|
||||
RGBController_LogitechG810::~RGBController_LogitechG810()
|
||||
{
|
||||
Shutdown();
|
||||
|
||||
delete controller;
|
||||
}
|
||||
|
||||
void RGBController_LogitechG810::SetupZones()
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Set up zones |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned int total_led_count = 0;
|
||||
for(unsigned int zone_idx = 0; zone_idx < 1; zone_idx++)
|
||||
{
|
||||
zone new_zone;
|
||||
new_zone.name = zone_names[zone_idx];
|
||||
new_zone.type = zone_types[zone_idx];
|
||||
new_zone.leds_min = zone_sizes[zone_idx];
|
||||
new_zone.leds_max = zone_sizes[zone_idx];
|
||||
new_zone.leds_count = zone_sizes[zone_idx];
|
||||
|
||||
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
|
||||
{
|
||||
new_zone.matrix_map.Set(7, 23, (unsigned int *)&matrix_map);
|
||||
}
|
||||
|
||||
zones.push_back(new_zone);
|
||||
|
||||
total_led_count += zone_sizes[zone_idx];
|
||||
}
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++)
|
||||
{
|
||||
led new_led;
|
||||
new_led.name = led_names[led_idx].name;
|
||||
new_led.value = ( led_names[led_idx].zone << 8 ) + led_names[led_idx].idx;
|
||||
leds.push_back(new_led);
|
||||
}
|
||||
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG810::DeviceUpdateLEDs()
|
||||
{
|
||||
#define MAX_FRAMES_PER_PACKET 0x0E
|
||||
|
||||
unsigned char frame_buf[MAX_FRAMES_PER_PACKET * 4];
|
||||
unsigned char frame_cnt = 0;
|
||||
unsigned char prev_zone = 0;
|
||||
unsigned char zone = 0;
|
||||
unsigned char idx = 0;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| TODO: Send packets with multiple LED frames |
|
||||
\*---------------------------------------------------------*/
|
||||
for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++)
|
||||
{
|
||||
zone = ( leds[led_idx].value >> 8 );
|
||||
idx = ( leds[led_idx].value & 0xFF );
|
||||
|
||||
if((zone != prev_zone) && (frame_cnt != 0))
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
frame_cnt = 0;
|
||||
}
|
||||
|
||||
frame_buf[(frame_cnt * 4) + 0] = idx;
|
||||
frame_buf[(frame_cnt * 4) + 1] = RGBGetRValue(colors[led_idx]);
|
||||
frame_buf[(frame_cnt * 4) + 2] = RGBGetGValue(colors[led_idx]);
|
||||
frame_buf[(frame_cnt * 4) + 3] = RGBGetBValue(colors[led_idx]);
|
||||
|
||||
frame_cnt++;
|
||||
prev_zone = zone;
|
||||
|
||||
if(frame_cnt == MAX_FRAMES_PER_PACKET)
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
frame_cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(frame_cnt != 0)
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
}
|
||||
|
||||
controller->Commit();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG810::DeviceUpdateZoneLEDs(int /*zone*/)
|
||||
{
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG810::DeviceUpdateSingleLED(int led)
|
||||
{
|
||||
unsigned char frame[4];
|
||||
unsigned char zone;
|
||||
unsigned char idx;
|
||||
|
||||
zone = ( leds[led].value >> 8 );
|
||||
idx = ( leds[led].value & 0xFF );
|
||||
|
||||
frame[0] = idx;
|
||||
frame[1] = RGBGetRValue(colors[led]);
|
||||
frame[2] = RGBGetGValue(colors[led]);
|
||||
frame[3] = RGBGetBValue(colors[led]);
|
||||
|
||||
controller->SetDirect(zone, 1, frame);
|
||||
controller->Commit();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG810::DeviceUpdateMode()
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Direct mode does not send a mode packet |
|
||||
| Call UpdateLEDs to send direct packet |
|
||||
\*---------------------------------------------------------*/
|
||||
if(active_mode == 0xFFFF)
|
||||
{
|
||||
UpdateLEDsInternal();
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned char red = 0;
|
||||
unsigned char grn = 0;
|
||||
unsigned char blu = 0;
|
||||
|
||||
if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC)
|
||||
{
|
||||
red = RGBGetRValue(modes[active_mode].colors[0]);
|
||||
grn = RGBGetGValue(modes[active_mode].colors[0]);
|
||||
blu = RGBGetBValue(modes[active_mode].colors[0]);
|
||||
}
|
||||
|
||||
controller->SetMode(modes[active_mode].value, modes[active_mode].speed, red, grn, blu);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_LogitechG810.h |
|
||||
| |
|
||||
| RGBController for Logitech G810 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 12 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RGBController.h"
|
||||
#include "LogitechG810Controller.h"
|
||||
|
||||
class RGBController_LogitechG810 : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_LogitechG810(LogitechG810Controller* controller_ptr);
|
||||
~RGBController_LogitechG810();
|
||||
|
||||
void SetupZones();
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
void DeviceUpdateZoneLEDs(int zone);
|
||||
void DeviceUpdateSingleLED(int led);
|
||||
|
||||
void DeviceUpdateMode();
|
||||
|
||||
private:
|
||||
LogitechG810Controller* controller;
|
||||
};
|
||||
@@ -1,198 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| LogitechG910Controller.cpp |
|
||||
| |
|
||||
| Driver for Logitech G910 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 11 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <cstring>
|
||||
#include "LogitechG910Controller.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
LogitechG910Controller::LogitechG910Controller(hid_device* dev_handle_0x11, hid_device* dev_handle_0x12, char* path, std::string dev_name)
|
||||
{
|
||||
dev_pkt_0x11 = dev_handle_0x11;
|
||||
dev_pkt_0x12 = dev_handle_0x12;
|
||||
location = path;
|
||||
name = dev_name;
|
||||
}
|
||||
|
||||
LogitechG910Controller::~LogitechG910Controller()
|
||||
{
|
||||
hid_close(dev_pkt_0x11);
|
||||
hid_close(dev_pkt_0x12);
|
||||
}
|
||||
|
||||
std::string LogitechG910Controller::GetNameString()
|
||||
{
|
||||
return(name);
|
||||
}
|
||||
|
||||
std::string LogitechG910Controller::GetLocationString()
|
||||
{
|
||||
return("HID: " + location);
|
||||
}
|
||||
|
||||
std::string LogitechG910Controller::GetSerialString()
|
||||
{
|
||||
wchar_t serial_string[128];
|
||||
int ret = hid_get_serial_number_string(dev_pkt_0x11, serial_string, 128);
|
||||
|
||||
if(ret != 0)
|
||||
{
|
||||
return("");
|
||||
}
|
||||
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
void LogitechG910Controller::Commit()
|
||||
{
|
||||
SendCommit();
|
||||
}
|
||||
|
||||
void LogitechG910Controller::SetDirect
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
)
|
||||
{
|
||||
SendDirectFrame(zone, frame_count, frame_data);
|
||||
}
|
||||
|
||||
void LogitechG910Controller::SetMode
|
||||
(
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
)
|
||||
{
|
||||
SendMode(LOGITECH_G910_ZONE_MODE_KEYBOARD, mode, speed, red, green, blue);
|
||||
SendMode(LOGITECH_G910_ZONE_MODE_LOGO, mode, speed, red, green, blue);
|
||||
|
||||
SendCommit();
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------*\
|
||||
| Private packet sending functions. |
|
||||
\*-------------------------------------------------------------------------------------------------*/
|
||||
|
||||
void LogitechG910Controller::SendCommit()
|
||||
{
|
||||
unsigned char usb_buf[20];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Commit packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x11;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0F;
|
||||
usb_buf[0x03] = 0x5F;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x11, usb_buf, 20);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
|
||||
void LogitechG910Controller::SendDirectFrame
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
)
|
||||
{
|
||||
unsigned char usb_buf[64];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Lighting Control packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x12;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0F;
|
||||
usb_buf[0x03] = 0x3F;
|
||||
usb_buf[0x05] = zone;
|
||||
usb_buf[0x07] = frame_count;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Copy in frame data |
|
||||
\*-----------------------------------------------------*/
|
||||
memcpy(&usb_buf[0x08], frame_data, frame_count * 4);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x12, usb_buf, 64);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
|
||||
void LogitechG910Controller::SendMode
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
)
|
||||
{
|
||||
unsigned char usb_buf[20];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Lighting Control packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x11;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x10;
|
||||
usb_buf[0x03] = 0x3B;
|
||||
usb_buf[0x04] = zone;
|
||||
|
||||
usb_buf[0x05] = mode;
|
||||
|
||||
usb_buf[0x06] = red;
|
||||
usb_buf[0x07] = green;
|
||||
usb_buf[0x08] = blue;
|
||||
|
||||
speed = 100 * speed;
|
||||
if(mode == LOGITECH_G910_MODE_CYCLE)
|
||||
{
|
||||
usb_buf[0x0B] = speed >> 8;
|
||||
usb_buf[0x0C] = speed & 0xFF;
|
||||
usb_buf[0x0D] = 0x64;
|
||||
}
|
||||
else if(mode == LOGITECH_G910_MODE_BREATHING)
|
||||
{
|
||||
usb_buf[0x09] = speed >> 8;
|
||||
usb_buf[0x0A] = speed & 0xFF;
|
||||
usb_buf[0x0C] = 0x64;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x11, usb_buf, 20);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| LogitechG910Controller.h |
|
||||
| |
|
||||
| Driver for Logitech G910 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 11 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <hidapi.h>
|
||||
#include "RGBController.h"
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_G910_ZONE_MODE_KEYBOARD = 0x00,
|
||||
LOGITECH_G910_ZONE_MODE_LOGO = 0x01,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_G910_ZONE_DIRECT_KEYBOARD = 0x01,
|
||||
LOGITECH_G910_ZONE_DIRECT_GKEYS = 0x04,
|
||||
LOGITECH_G910_ZONE_DIRECT_LOGO = 0x10,
|
||||
LOGITECH_G910_ZONE_DIRECT_INDICATORS = 0x40,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_G910_MODE_OFF = 0x00,
|
||||
LOGITECH_G910_MODE_STATIC = 0x01,
|
||||
LOGITECH_G910_MODE_BREATHING = 0x02,
|
||||
LOGITECH_G910_MODE_CYCLE = 0x03,
|
||||
LOGITECH_G910_MODE_WAVE = 0x04,
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------------------------*\
|
||||
| Speed is 1000 for fast and 20000 for slow. |
|
||||
| Values are multiplied by 100 later to give lots of GUI steps. |
|
||||
\*---------------------------------------------------------------------------------------------*/
|
||||
enum
|
||||
{
|
||||
LOGITECH_G910_SPEED_SLOWEST = 0xC8, /* Slowest speed */
|
||||
LOGITECH_G910_SPEED_NORMAL = 0x32, /* Normal speed */
|
||||
LOGITECH_G910_SPEED_FASTEST = 0x0A, /* Fastest speed */
|
||||
};
|
||||
|
||||
class LogitechG910Controller
|
||||
{
|
||||
public:
|
||||
LogitechG910Controller(hid_device* dev_handle_0x11, hid_device* dev_handle_0x12, char* path, std::string dev_name);
|
||||
~LogitechG910Controller();
|
||||
|
||||
std::string GetLocationString();
|
||||
std::string GetNameString();
|
||||
std::string GetSerialString();
|
||||
|
||||
void Commit();
|
||||
|
||||
void SetDirect
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
);
|
||||
|
||||
void SetMode
|
||||
(
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
);
|
||||
|
||||
private:
|
||||
hid_device* dev_pkt_0x11;
|
||||
hid_device* dev_pkt_0x12;
|
||||
std::string location;
|
||||
std::string name;
|
||||
|
||||
void SendDirectFrame
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
);
|
||||
|
||||
void SendMode
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
);
|
||||
|
||||
void SendCommit();
|
||||
};
|
||||
@@ -1,381 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_LogitechG910.cpp |
|
||||
| |
|
||||
| RGBController for Logitech G910 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 12 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "RGBControllerKeyNames.h"
|
||||
#include "RGBController_LogitechG910.h"
|
||||
|
||||
//0xFFFFFFFF indicates an unused entry in matrix
|
||||
#define NA 0xFFFFFFFF
|
||||
|
||||
static unsigned int matrix_map[8][24] =
|
||||
{ { NA, 111, 112, 113, 114, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA },
|
||||
{ 115, 37, NA, 54, 55, 56, 57, NA, 58, 59, 60, 61, NA, 62, 63, 64, 65, 66, 67, 68, NA, NA, NA, NA },
|
||||
{ 106, 49, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, 41, 42, 38, NA, 69, 70, 71, 79, 80, 81, 82 },
|
||||
{ 107, 39, NA, 16, 22, 4, 17, NA, 19, 24, 20, 8, 14, 15, 43, 44, 45, 72, 73, 74, 91, 92, 93, 83 },
|
||||
{ 108, 53, NA, 0, 18, 3, 5, NA, 6, 7, 9, 10, 11, 47, 48, 46, 36, NA, NA, NA, 88, 89, 90, NA },
|
||||
{ 109, 99, 96, 25, 23, 2, 21, NA, 1, NA, 13, 12, 50, 51, 52, 103, NA, NA, 78, NA, 85, 86, 87, 84 },
|
||||
{ 110, 98, 101, 100, NA, NA, NA, NA, 40, NA, NA, NA, NA, 104, 105, 97, 102, 76, 77, 75, 94, NA, 95, NA },
|
||||
{ NA, NA, NA, 116, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA } };
|
||||
|
||||
static const char* zone_names[] =
|
||||
{
|
||||
ZONE_EN_KEYBOARD,
|
||||
};
|
||||
|
||||
static zone_type zone_types[] =
|
||||
{
|
||||
ZONE_TYPE_MATRIX,
|
||||
};
|
||||
|
||||
static const unsigned int zone_sizes[] =
|
||||
{
|
||||
117,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char * name;
|
||||
const unsigned char zone;
|
||||
const unsigned char idx;
|
||||
} led_type;
|
||||
|
||||
static const led_type led_names[] =
|
||||
{
|
||||
/* Key Label Zone, Index */
|
||||
{ KEY_EN_A, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x04 },
|
||||
{ KEY_EN_B, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x05 },
|
||||
{ KEY_EN_C, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x06 },
|
||||
{ KEY_EN_D, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x07 },
|
||||
{ KEY_EN_E, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x08 },
|
||||
{ KEY_EN_F, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x09 },
|
||||
{ KEY_EN_G, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x0A },
|
||||
{ KEY_EN_H, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x0B },
|
||||
{ KEY_EN_I, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x0C },
|
||||
{ KEY_EN_J, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x0D },
|
||||
{ KEY_EN_K, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x0E },
|
||||
{ KEY_EN_L, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x0F },
|
||||
{ KEY_EN_M, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x10 },
|
||||
{ KEY_EN_N, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x11 },
|
||||
{ KEY_EN_O, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x12 },
|
||||
{ KEY_EN_P, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x13 },
|
||||
{ KEY_EN_Q, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x14 },
|
||||
{ KEY_EN_R, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x15 },
|
||||
{ KEY_EN_S, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x16 },
|
||||
{ KEY_EN_T, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x17 },
|
||||
{ KEY_EN_U, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x18 },
|
||||
{ KEY_EN_V, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x19 },
|
||||
{ KEY_EN_W, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x1A },
|
||||
{ KEY_EN_X, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x1B },
|
||||
{ KEY_EN_Y, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x1C },
|
||||
{ KEY_EN_Z, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x1D },
|
||||
{ KEY_EN_1, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x1E },
|
||||
{ KEY_EN_2, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x1F },
|
||||
{ KEY_EN_3, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x20 },
|
||||
{ KEY_EN_4, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x21 },
|
||||
{ KEY_EN_5, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x22 },
|
||||
{ KEY_EN_6, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x23 },
|
||||
{ KEY_EN_7, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x24 },
|
||||
{ KEY_EN_8, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x25 },
|
||||
{ KEY_EN_9, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x26 },
|
||||
{ KEY_EN_0, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x27 },
|
||||
{ KEY_EN_ANSI_ENTER, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x28 },
|
||||
{ KEY_EN_ESCAPE, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x29 },
|
||||
{ KEY_EN_BACKSPACE, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x2A },
|
||||
{ KEY_EN_TAB, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x2B },
|
||||
{ KEY_EN_SPACE, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x2C },
|
||||
{ KEY_EN_MINUS, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x2D },
|
||||
{ KEY_EN_EQUALS, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x2E },
|
||||
{ KEY_EN_LEFT_BRACKET, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x2F },
|
||||
{ KEY_EN_RIGHT_BRACKET, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x30 },
|
||||
{ KEY_EN_ANSI_BACK_SLASH, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x31 },//ANSI only
|
||||
{ KEY_EN_POUND, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x32 },//ISO only
|
||||
{ KEY_EN_SEMICOLON, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x33 },
|
||||
{ KEY_EN_QUOTE, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x34 },
|
||||
{ KEY_EN_BACK_TICK, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x35 },
|
||||
{ KEY_EN_COMMA, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x36 },
|
||||
{ KEY_EN_PERIOD, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x37 },
|
||||
{ KEY_EN_FORWARD_SLASH, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x38 },
|
||||
{ KEY_EN_CAPS_LOCK, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x39 },
|
||||
{ KEY_EN_F1, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x3A },
|
||||
{ KEY_EN_F2, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x3B },
|
||||
{ KEY_EN_F3, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x3C },
|
||||
{ KEY_EN_F4, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x3D },
|
||||
{ KEY_EN_F5, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x3E },
|
||||
{ KEY_EN_F6, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x3F },
|
||||
{ KEY_EN_F7, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x40 },
|
||||
{ KEY_EN_F8, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x41 },
|
||||
{ KEY_EN_F9, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x42 },
|
||||
{ KEY_EN_F10, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x43 },
|
||||
{ KEY_EN_F11, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x44 },
|
||||
{ KEY_EN_F12, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x45 },
|
||||
{ KEY_EN_PRINT_SCREEN, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x46 },
|
||||
{ KEY_EN_SCROLL_LOCK, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x47 },
|
||||
{ KEY_EN_PAUSE_BREAK, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x48 },
|
||||
{ KEY_EN_INSERT, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x49 },
|
||||
{ KEY_EN_HOME, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x4A },
|
||||
{ KEY_EN_PAGE_UP, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x4B },
|
||||
{ KEY_EN_DELETE, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x4C },
|
||||
{ KEY_EN_END, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x4D },
|
||||
{ KEY_EN_PAGE_DOWN, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x4E },
|
||||
{ KEY_EN_RIGHT_ARROW, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x4F },
|
||||
{ KEY_EN_LEFT_ARROW, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x50 },
|
||||
{ KEY_EN_DOWN_ARROW, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x51 },
|
||||
{ KEY_EN_UP_ARROW, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x52 },
|
||||
{ KEY_EN_NUMPAD_LOCK, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x53 },
|
||||
{ KEY_EN_NUMPAD_DIVIDE, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x54 },
|
||||
{ KEY_EN_NUMPAD_TIMES, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x55 },
|
||||
{ KEY_EN_NUMPAD_MINUS, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x56 },
|
||||
{ KEY_EN_NUMPAD_PLUS, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x57 },
|
||||
{ KEY_EN_NUMPAD_ENTER, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x58 },
|
||||
{ KEY_EN_NUMPAD_1, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x59 },
|
||||
{ KEY_EN_NUMPAD_2, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x5A },
|
||||
{ KEY_EN_NUMPAD_3, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x5B },
|
||||
{ KEY_EN_NUMPAD_4, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x5C },
|
||||
{ KEY_EN_NUMPAD_5, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x5D },
|
||||
{ KEY_EN_NUMPAD_6, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x5E },
|
||||
{ KEY_EN_NUMPAD_7, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x5F },
|
||||
{ KEY_EN_NUMPAD_8, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x60 },
|
||||
{ KEY_EN_NUMPAD_9, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x61 },
|
||||
{ KEY_EN_NUMPAD_0, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x62 },
|
||||
{ KEY_EN_NUMPAD_PERIOD, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x63 },
|
||||
{ KEY_EN_ISO_BACK_SLASH, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x64 },//ISO only
|
||||
{ KEY_EN_MENU, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0x65 },
|
||||
{ KEY_EN_LEFT_CONTROL, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE0 },
|
||||
{ KEY_EN_LEFT_SHIFT, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE1 },
|
||||
{ KEY_EN_LEFT_ALT, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE2 },
|
||||
{ KEY_EN_LEFT_WINDOWS, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE3 },
|
||||
{ KEY_EN_RIGHT_CONTROL, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE4 },
|
||||
{ KEY_EN_RIGHT_SHIFT, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE5 },
|
||||
{ KEY_EN_RIGHT_ALT, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE6 },
|
||||
{ KEY_EN_RIGHT_WINDOWS, LOGITECH_G910_ZONE_DIRECT_KEYBOARD, 0xE7 },
|
||||
{ "Key: G1", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x01 },
|
||||
{ "Key: G2", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x02 },
|
||||
{ "Key: G3", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x03 },
|
||||
{ "Key: G4", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x04 },
|
||||
{ "Key: G5", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x05 },
|
||||
{ "Key: G6", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x06 },
|
||||
{ "Key: G7", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x07 },
|
||||
{ "Key: G8", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x08 },
|
||||
{ "Key: G9", LOGITECH_G910_ZONE_DIRECT_GKEYS, 0x09 },
|
||||
{ "Logo", LOGITECH_G910_ZONE_DIRECT_LOGO, 0x01 },
|
||||
{ "Nameplate", LOGITECH_G910_ZONE_DIRECT_LOGO, 0x02 },
|
||||
};
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name Logitech G910
|
||||
@category Keyboard
|
||||
@type USB
|
||||
@save :robot:
|
||||
@direct :white_check_mark:
|
||||
@effects :white_check_mark:
|
||||
@detectors DetectLogitechKeyboardG910
|
||||
@comment
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_LogitechG910::RGBController_LogitechG910(LogitechG910Controller* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
|
||||
name = controller->GetNameString();
|
||||
vendor = "Logitech";
|
||||
type = DEVICE_TYPE_KEYBOARD;
|
||||
description = "Logitech Keyboard Device";
|
||||
location = controller->GetLocationString();
|
||||
serial = controller->GetSerialString();
|
||||
|
||||
mode Direct;
|
||||
Direct.name = "Direct";
|
||||
Direct.value = 0xFFFF;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
|
||||
Direct.color_mode = MODE_COLORS_PER_LED;
|
||||
modes.push_back(Direct);
|
||||
|
||||
mode Static;
|
||||
Static.name = "Static";
|
||||
Static.value = LOGITECH_G910_MODE_STATIC;
|
||||
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
Static.colors_min = 1;
|
||||
Static.colors_max = 1;
|
||||
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Static.colors.resize(1);
|
||||
modes.push_back(Static);
|
||||
|
||||
mode Off;
|
||||
Off.name = "Off";
|
||||
Off.value = LOGITECH_G910_MODE_OFF;
|
||||
Off.flags = 0;
|
||||
Off.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(Off);
|
||||
|
||||
mode Cycle;
|
||||
Cycle.name = "Cycle";
|
||||
Cycle.value = LOGITECH_G910_MODE_CYCLE;
|
||||
Cycle.flags = MODE_FLAG_HAS_SPEED;
|
||||
Cycle.color_mode = MODE_COLORS_NONE;
|
||||
Cycle.speed_min = LOGITECH_G910_SPEED_SLOWEST;
|
||||
Cycle.speed_max = LOGITECH_G910_SPEED_FASTEST;
|
||||
Cycle.speed = LOGITECH_G910_SPEED_NORMAL;
|
||||
modes.push_back(Cycle);
|
||||
|
||||
mode Breathing;
|
||||
Breathing.name = "Breathing";
|
||||
Breathing.value = LOGITECH_G910_MODE_BREATHING;
|
||||
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
|
||||
Breathing.colors_min = 1;
|
||||
Breathing.colors_max = 1;
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Breathing.colors.resize(1);
|
||||
Breathing.speed_min = LOGITECH_G910_SPEED_SLOWEST;
|
||||
Breathing.speed_max = LOGITECH_G910_SPEED_FASTEST;
|
||||
Breathing.speed = LOGITECH_G910_SPEED_NORMAL;
|
||||
modes.push_back(Breathing);
|
||||
|
||||
SetupZones();
|
||||
}
|
||||
|
||||
RGBController_LogitechG910::~RGBController_LogitechG910()
|
||||
{
|
||||
Shutdown();
|
||||
|
||||
delete controller;
|
||||
}
|
||||
|
||||
void RGBController_LogitechG910::SetupZones()
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Set up zones |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned int total_led_count = 0;
|
||||
for(unsigned int zone_idx = 0; zone_idx < 1; zone_idx++)
|
||||
{
|
||||
zone new_zone;
|
||||
new_zone.name = zone_names[zone_idx];
|
||||
new_zone.type = zone_types[zone_idx];
|
||||
new_zone.leds_min = zone_sizes[zone_idx];
|
||||
new_zone.leds_max = zone_sizes[zone_idx];
|
||||
new_zone.leds_count = zone_sizes[zone_idx];
|
||||
|
||||
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
|
||||
{
|
||||
new_zone.matrix_map.Set(8, 24, (unsigned int *)&matrix_map);
|
||||
}
|
||||
|
||||
zones.push_back(new_zone);
|
||||
|
||||
total_led_count += zone_sizes[zone_idx];
|
||||
}
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++)
|
||||
{
|
||||
led new_led;
|
||||
new_led.name = led_names[led_idx].name;
|
||||
new_led.value = ( led_names[led_idx].zone << 8 ) + led_names[led_idx].idx;
|
||||
leds.push_back(new_led);
|
||||
}
|
||||
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG910::DeviceUpdateLEDs()
|
||||
{
|
||||
#define MAX_FRAMES_PER_PACKET 0x0E
|
||||
|
||||
unsigned char frame_buf[MAX_FRAMES_PER_PACKET * 4];
|
||||
unsigned char frame_cnt = 0;
|
||||
unsigned char prev_zone = 0;
|
||||
unsigned char zone = 0;
|
||||
unsigned char idx = 0;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| TODO: Send packets with multiple LED frames |
|
||||
\*---------------------------------------------------------*/
|
||||
for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++)
|
||||
{
|
||||
zone = ( leds[led_idx].value >> 8 );
|
||||
idx = ( leds[led_idx].value & 0xFF );
|
||||
|
||||
if((zone != prev_zone) && (frame_cnt != 0))
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
frame_cnt = 0;
|
||||
}
|
||||
|
||||
frame_buf[(frame_cnt * 4) + 0] = idx;
|
||||
frame_buf[(frame_cnt * 4) + 1] = RGBGetRValue(colors[led_idx]);
|
||||
frame_buf[(frame_cnt * 4) + 2] = RGBGetGValue(colors[led_idx]);
|
||||
frame_buf[(frame_cnt * 4) + 3] = RGBGetBValue(colors[led_idx]);
|
||||
|
||||
frame_cnt++;
|
||||
prev_zone = zone;
|
||||
|
||||
if(frame_cnt == MAX_FRAMES_PER_PACKET)
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
frame_cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(frame_cnt != 0)
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
}
|
||||
|
||||
controller->Commit();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG910::DeviceUpdateZoneLEDs(int /*zone*/)
|
||||
{
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG910::DeviceUpdateSingleLED(int led)
|
||||
{
|
||||
unsigned char frame[4];
|
||||
unsigned char zone;
|
||||
unsigned char idx;
|
||||
|
||||
zone = ( leds[led].value >> 8 );
|
||||
idx = ( leds[led].value & 0xFF );
|
||||
|
||||
frame[0] = idx;
|
||||
frame[1] = RGBGetRValue(colors[led]);
|
||||
frame[2] = RGBGetGValue(colors[led]);
|
||||
frame[3] = RGBGetBValue(colors[led]);
|
||||
|
||||
controller->SetDirect(zone, 1, frame);
|
||||
controller->Commit();
|
||||
}
|
||||
|
||||
void RGBController_LogitechG910::DeviceUpdateMode()
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Direct mode does not send a mode packet |
|
||||
| Call UpdateLEDs to send direct packet |
|
||||
\*---------------------------------------------------------*/
|
||||
if(active_mode == 0xFFFF)
|
||||
{
|
||||
UpdateLEDsInternal();
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned char red = 0;
|
||||
unsigned char grn = 0;
|
||||
unsigned char blu = 0;
|
||||
|
||||
if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC)
|
||||
{
|
||||
red = RGBGetRValue(modes[active_mode].colors[0]);
|
||||
grn = RGBGetGValue(modes[active_mode].colors[0]);
|
||||
blu = RGBGetBValue(modes[active_mode].colors[0]);
|
||||
}
|
||||
|
||||
controller->SetMode(modes[active_mode].value, modes[active_mode].speed, red, grn, blu);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_LogitechG910.h |
|
||||
| |
|
||||
| RGBController for Logitech G910 Orion Spectrum |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 12 Jun 2020 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RGBController.h"
|
||||
#include "LogitechG910Controller.h"
|
||||
|
||||
class RGBController_LogitechG910 : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_LogitechG910(LogitechG910Controller* controller_ptr);
|
||||
~RGBController_LogitechG910();
|
||||
|
||||
void SetupZones();
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
void DeviceUpdateZoneLEDs(int zone);
|
||||
void DeviceUpdateSingleLED(int led);
|
||||
|
||||
void DeviceUpdateMode();
|
||||
|
||||
private:
|
||||
LogitechG910Controller* controller;
|
||||
};
|
||||
-192
@@ -1,192 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| LogitechGProController.cpp |
|
||||
| |
|
||||
| Driver for Logitech G Pro keyboard |
|
||||
| |
|
||||
| sanchezzzs 20 Oct 2021 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <cstring>
|
||||
#include "LogitechGProKeyboardController.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
LogitechGProKeyboardController::LogitechGProKeyboardController(hid_device* dev_handle_0x11, hid_device* dev_handle_0x12, std::string dev_name)
|
||||
{
|
||||
dev_pkt_0x11 = dev_handle_0x11;
|
||||
dev_pkt_0x12 = dev_handle_0x12;
|
||||
name = dev_name;
|
||||
}
|
||||
|
||||
LogitechGProKeyboardController::~LogitechGProKeyboardController()
|
||||
{
|
||||
hid_close(dev_pkt_0x11);
|
||||
hid_close(dev_pkt_0x12);
|
||||
}
|
||||
|
||||
std::string LogitechGProKeyboardController::GetNameString()
|
||||
{
|
||||
return(name);
|
||||
}
|
||||
|
||||
std::string LogitechGProKeyboardController::GetSerialString()
|
||||
{
|
||||
wchar_t serial_string[128];
|
||||
int ret = hid_get_serial_number_string(dev_pkt_0x11, serial_string, 128);
|
||||
|
||||
if(ret != 0)
|
||||
{
|
||||
return("");
|
||||
}
|
||||
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
void LogitechGProKeyboardController::Commit()
|
||||
{
|
||||
SendCommit();
|
||||
}
|
||||
|
||||
void LogitechGProKeyboardController::SetDirect
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
)
|
||||
{
|
||||
SendDirectFrame(zone, frame_count, frame_data);
|
||||
}
|
||||
|
||||
void LogitechGProKeyboardController::SetMode
|
||||
(
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
)
|
||||
{
|
||||
SendMode(LOGITECH_GPRO_ZONE_MODE_KEYBOARD, mode, speed, red, green, blue);
|
||||
SendMode(LOGITECH_GPRO_ZONE_MODE_LOGO, mode, speed, red, green, blue);
|
||||
|
||||
SendCommit();
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------------------------------*\
|
||||
| Private packet sending functions. |
|
||||
\*-------------------------------------------------------------------------------------------------*/
|
||||
|
||||
void LogitechGProKeyboardController::SendCommit()
|
||||
{
|
||||
unsigned char usb_buf[20];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Commit packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x11;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0C;
|
||||
usb_buf[0x03] = 0x5D;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x11, usb_buf, 20);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
|
||||
void LogitechGProKeyboardController::SendDirectFrame
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
)
|
||||
{
|
||||
unsigned char usb_buf[64];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Lighting Control packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x12;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0C;
|
||||
usb_buf[0x03] = 0x3D;
|
||||
usb_buf[0x05] = zone;
|
||||
usb_buf[0x07] = frame_count;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Copy in frame data |
|
||||
\*-----------------------------------------------------*/
|
||||
memcpy(&usb_buf[0x08], frame_data, frame_count * 4);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x12, usb_buf, 64);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
|
||||
void LogitechGProKeyboardController::SendMode
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
)
|
||||
{
|
||||
unsigned char usb_buf[20];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Zero out buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(usb_buf, 0x00, sizeof(usb_buf));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set up Lighting Control packet |
|
||||
\*-----------------------------------------------------*/
|
||||
usb_buf[0x00] = 0x11;
|
||||
usb_buf[0x01] = 0xFF;
|
||||
usb_buf[0x02] = 0x0D;
|
||||
usb_buf[0x03] = 0x3D;
|
||||
usb_buf[0x04] = zone;
|
||||
|
||||
usb_buf[0x05] = mode;
|
||||
|
||||
usb_buf[0x06] = red;
|
||||
usb_buf[0x07] = green;
|
||||
usb_buf[0x08] = blue;
|
||||
|
||||
speed = 100 * speed;
|
||||
if(mode == LOGITECH_GPRO_MODE_CYCLE)
|
||||
{
|
||||
usb_buf[0x0B] = speed >> 8;
|
||||
usb_buf[0x0C] = speed & 0xFF;
|
||||
usb_buf[0x0D] = 0x64;
|
||||
}
|
||||
else if(mode == LOGITECH_GPRO_MODE_BREATHING)
|
||||
{
|
||||
usb_buf[0x09] = speed >> 8;
|
||||
usb_buf[0x0A] = speed & 0xFF;
|
||||
usb_buf[0x0C] = 0x64;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Send packet |
|
||||
\*-----------------------------------------------------*/
|
||||
hid_write(dev_pkt_0x11, usb_buf, 20);
|
||||
hid_read(dev_pkt_0x11, usb_buf, 20);
|
||||
}
|
||||
-102
@@ -1,102 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| LogitechGProController.h |
|
||||
| |
|
||||
| Driver for Logitech G Pro keyboard |
|
||||
| |
|
||||
| sanchezzzs 20 Oct 2021 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <hidapi.h>
|
||||
#include "RGBController.h"
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_GPRO_ZONE_MODE_KEYBOARD = 0x00,
|
||||
LOGITECH_GPRO_ZONE_MODE_LOGO = 0x01,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD = 0x01,
|
||||
LOGITECH_GPRO_ZONE_DIRECT_MEDIA = 0x02,
|
||||
LOGITECH_GPRO_ZONE_DIRECT_LOGO = 0x10,
|
||||
LOGITECH_GPRO_ZONE_DIRECT_INDICATORS = 0x40,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
LOGITECH_GPRO_MODE_OFF = 0x00,
|
||||
LOGITECH_GPRO_MODE_STATIC = 0x01,
|
||||
LOGITECH_GPRO_MODE_BREATHING = 0x02,
|
||||
LOGITECH_GPRO_MODE_CYCLE = 0x03,
|
||||
LOGITECH_GPRO_MODE_WAVE = 0x04,
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------------------------------------------*\
|
||||
| Speed is 1000 for fast and 20000 for slow. |
|
||||
| Values are multiplied by 100 later to give lots of GUI steps. |
|
||||
\*---------------------------------------------------------------------------------------------*/
|
||||
enum
|
||||
{
|
||||
LOGITECH_GPRO_SPEED_SLOWEST = 0xC8, /* Slowest speed */
|
||||
LOGITECH_GPRO_SPEED_NORMAL = 0x32, /* Normal speed */
|
||||
LOGITECH_GPRO_SPEED_FASTEST = 0x0A, /* Fastest speed */
|
||||
};
|
||||
|
||||
class LogitechGProKeyboardController
|
||||
{
|
||||
public:
|
||||
LogitechGProKeyboardController(hid_device* dev_handle_0x11, hid_device* dev_handle_0x12, std::string dev_name);
|
||||
~LogitechGProKeyboardController();
|
||||
|
||||
std::string GetNameString();
|
||||
std::string GetSerialString();
|
||||
|
||||
void Commit();
|
||||
|
||||
void SetDirect
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
);
|
||||
|
||||
void SetMode
|
||||
(
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
);
|
||||
|
||||
private:
|
||||
hid_device* dev_pkt_0x11;
|
||||
hid_device* dev_pkt_0x12;
|
||||
std::string name;
|
||||
|
||||
void SendDirectFrame
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char frame_count,
|
||||
unsigned char * frame_data
|
||||
);
|
||||
|
||||
void SendMode
|
||||
(
|
||||
unsigned char zone,
|
||||
unsigned char mode,
|
||||
unsigned short speed,
|
||||
unsigned char red,
|
||||
unsigned char green,
|
||||
unsigned char blue
|
||||
);
|
||||
|
||||
void SendCommit();
|
||||
};
|
||||
-356
@@ -1,356 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_LogitechGPro.cpp |
|
||||
| |
|
||||
| RGBController for Logitech G Pro keyboard |
|
||||
| |
|
||||
| sanchezzzs 20 Oct 2021 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "RGBControllerKeyNames.h"
|
||||
#include "RGBController_LogitechGProKeyboard.h"
|
||||
|
||||
//0xFFFFFFFF indicates an unused entry in matrix
|
||||
#define NA 0xFFFFFFFF
|
||||
|
||||
static unsigned int matrix_map[7][19] =
|
||||
{ { 89, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 93, 92, NA, NA, 91, NA, 90 },
|
||||
{ 37, NA, 54, 55, 56, 57, NA, 58, 59, 60, 61, NA, 62, 63, 64, 65, 66, 67, 68 },
|
||||
{ 49, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, NA, 41, 42, 38, NA, 69, 70, 71 },
|
||||
{ 39, NA, 16, 22, 4, 17, NA, 19, 24, 20, 8, 14, 15, 43, 44, 45, 72, 73, 74 },
|
||||
{ 53, NA, 0, 18, 3, 5, NA, 6, 7, 9, 10, 11, 47, 48, 46, 36, NA, NA, NA },
|
||||
{ 82, 79, 25, 23, 2, 21, NA, 1, NA, 13, 12, 50, 51, 52, 86, NA, NA, 78, NA },
|
||||
{ 81, 84, 83, NA, NA, NA, NA, 40, NA, NA, NA, NA, 87, 88, 80, 85, 76, 77, 75 } };
|
||||
|
||||
static const char* zone_names[] =
|
||||
{
|
||||
ZONE_EN_KEYBOARD,
|
||||
};
|
||||
|
||||
static zone_type zone_types[] =
|
||||
{
|
||||
ZONE_TYPE_MATRIX,
|
||||
};
|
||||
|
||||
static const unsigned int zone_sizes[] =
|
||||
{
|
||||
94,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char * name;
|
||||
const unsigned char zone;
|
||||
const unsigned char idx;
|
||||
} led_type;
|
||||
|
||||
static const led_type led_names[] =
|
||||
{
|
||||
/* Key Label Zone, Index */
|
||||
{ KEY_EN_A, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x04 },//00
|
||||
{ KEY_EN_B, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x05 },
|
||||
{ KEY_EN_C, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x06 },
|
||||
{ KEY_EN_D, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x07 },
|
||||
{ KEY_EN_E, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x08 },
|
||||
{ KEY_EN_F, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x09 },
|
||||
{ KEY_EN_G, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x0A },
|
||||
{ KEY_EN_H, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x0B },
|
||||
{ KEY_EN_I, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x0C },
|
||||
{ KEY_EN_J, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x0D },
|
||||
{ KEY_EN_K, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x0E },//10
|
||||
{ KEY_EN_L, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x0F },
|
||||
{ KEY_EN_M, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x10 },
|
||||
{ KEY_EN_N, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x11 },
|
||||
{ KEY_EN_O, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x12 },
|
||||
{ KEY_EN_P, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x13 },
|
||||
{ KEY_EN_Q, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x14 },
|
||||
{ KEY_EN_R, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x15 },
|
||||
{ KEY_EN_S, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x16 },
|
||||
{ KEY_EN_T, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x17 },
|
||||
{ KEY_EN_U, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x18 },//20
|
||||
{ KEY_EN_V, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x19 },
|
||||
{ KEY_EN_W, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x1A },
|
||||
{ KEY_EN_X, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x1B },
|
||||
{ KEY_EN_Y, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x1C },
|
||||
{ KEY_EN_Z, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x1D },
|
||||
{ KEY_EN_1, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x1E },
|
||||
{ KEY_EN_2, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x1F },
|
||||
{ KEY_EN_3, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x20 },
|
||||
{ KEY_EN_4, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x21 },
|
||||
{ KEY_EN_5, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x22 },//30
|
||||
{ KEY_EN_6, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x23 },
|
||||
{ KEY_EN_7, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x24 },
|
||||
{ KEY_EN_8, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x25 },
|
||||
{ KEY_EN_9, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x26 },
|
||||
{ KEY_EN_0, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x27 },
|
||||
{ KEY_EN_ANSI_ENTER, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x28 },
|
||||
{ KEY_EN_ESCAPE, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x29 },
|
||||
{ KEY_EN_BACKSPACE, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x2A },
|
||||
{ KEY_EN_TAB, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x2B },
|
||||
{ KEY_EN_SPACE, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x2C },//40
|
||||
{ KEY_EN_MINUS, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x2D },
|
||||
{ KEY_EN_EQUALS, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x2E },
|
||||
{ KEY_EN_LEFT_BRACKET, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x2F },
|
||||
{ KEY_EN_RIGHT_BRACKET, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x30 },
|
||||
{ KEY_EN_ANSI_BACK_SLASH, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x31 },//ANSI only
|
||||
{ KEY_EN_POUND, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x32 },//ISO only
|
||||
{ KEY_EN_SEMICOLON, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x33 },
|
||||
{ KEY_EN_QUOTE, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x34 },
|
||||
{ KEY_EN_BACK_TICK, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x35 },
|
||||
{ KEY_EN_COMMA, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x36 },//50
|
||||
{ KEY_EN_PERIOD, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x37 },
|
||||
{ KEY_EN_FORWARD_SLASH, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x38 },
|
||||
{ KEY_EN_CAPS_LOCK, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x39 },
|
||||
{ KEY_EN_F1, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x3A },
|
||||
{ KEY_EN_F2, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x3B },
|
||||
{ KEY_EN_F3, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x3C },
|
||||
{ KEY_EN_F4, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x3D },
|
||||
{ KEY_EN_F5, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x3E },
|
||||
{ KEY_EN_F6, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x3F },
|
||||
{ KEY_EN_F7, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x40 },//60
|
||||
{ KEY_EN_F8, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x41 },
|
||||
{ KEY_EN_F9, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x42 },
|
||||
{ KEY_EN_F10, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x43 },
|
||||
{ KEY_EN_F11, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x44 },
|
||||
{ KEY_EN_F12, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x45 },
|
||||
{ KEY_EN_PRINT_SCREEN, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x46 },
|
||||
{ KEY_EN_SCROLL_LOCK, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x47 },
|
||||
{ KEY_EN_PAUSE_BREAK, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x48 },
|
||||
{ KEY_EN_INSERT, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x49 },
|
||||
{ KEY_EN_HOME, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x4A },//70
|
||||
{ KEY_EN_PAGE_UP, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x4B },
|
||||
{ KEY_EN_DELETE, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x4C },
|
||||
{ KEY_EN_END, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x4D },
|
||||
{ KEY_EN_PAGE_DOWN, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x4E },
|
||||
{ KEY_EN_RIGHT_ARROW, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x4F },
|
||||
{ KEY_EN_LEFT_ARROW, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x50 },
|
||||
{ KEY_EN_DOWN_ARROW, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x51 },
|
||||
{ KEY_EN_UP_ARROW, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x52 },
|
||||
{ KEY_EN_ISO_BACK_SLASH, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x64 },//ISO only
|
||||
{ KEY_EN_MENU, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0x65 },//80
|
||||
{ KEY_EN_LEFT_CONTROL, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE0 },
|
||||
{ KEY_EN_LEFT_SHIFT, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE1 },
|
||||
{ KEY_EN_LEFT_ALT, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE2 },
|
||||
{ KEY_EN_LEFT_WINDOWS, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE3 },
|
||||
{ KEY_EN_RIGHT_CONTROL, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE4 },
|
||||
{ KEY_EN_RIGHT_SHIFT, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE5 },
|
||||
{ KEY_EN_RIGHT_ALT, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE6 },
|
||||
{ KEY_EN_RIGHT_FUNCTION, LOGITECH_GPRO_ZONE_DIRECT_KEYBOARD, 0xE7 },
|
||||
{ "Logo", LOGITECH_GPRO_ZONE_DIRECT_LOGO, 0x01 },
|
||||
{ "Lighting", LOGITECH_GPRO_ZONE_DIRECT_INDICATORS, 0x01 },//90
|
||||
{ "Game Mode", LOGITECH_GPRO_ZONE_DIRECT_INDICATORS, 0x02 },
|
||||
{ "Caps Lock Indicator", LOGITECH_GPRO_ZONE_DIRECT_INDICATORS, 0x03 },
|
||||
{ "Scroll Lock Indicator", LOGITECH_GPRO_ZONE_DIRECT_INDICATORS, 0x04 },//93
|
||||
};
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name Logitech G Pro
|
||||
@category Keyboard
|
||||
@type USB
|
||||
@save :robot:
|
||||
@direct :white_check_mark:
|
||||
@effects :white_check_mark:
|
||||
@detectors DetectLogitechKeyboardGPro
|
||||
@comment
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_LogitechGProKeyboard::RGBController_LogitechGProKeyboard(LogitechGProKeyboardController* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
|
||||
name = controller->GetNameString();
|
||||
vendor = "Logitech";
|
||||
type = DEVICE_TYPE_KEYBOARD;
|
||||
description = "Logitech Keyboard Device";
|
||||
serial = controller->GetSerialString();
|
||||
|
||||
mode Direct;
|
||||
Direct.name = "Direct";
|
||||
Direct.value = 0xFFFF;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
|
||||
Direct.color_mode = MODE_COLORS_PER_LED;
|
||||
modes.push_back(Direct);
|
||||
|
||||
mode Static;
|
||||
Static.name = "Static";
|
||||
Static.value = LOGITECH_GPRO_MODE_STATIC;
|
||||
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
|
||||
Static.colors_min = 1;
|
||||
Static.colors_max = 1;
|
||||
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Static.colors.resize(1);
|
||||
modes.push_back(Static);
|
||||
|
||||
mode Off;
|
||||
Off.name = "Off";
|
||||
Off.value = LOGITECH_GPRO_MODE_OFF;
|
||||
Off.flags = 0;
|
||||
Off.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(Off);
|
||||
|
||||
mode Cycle;
|
||||
Cycle.name = "Cycle";
|
||||
Cycle.value = LOGITECH_GPRO_MODE_CYCLE;
|
||||
Cycle.flags = MODE_FLAG_HAS_SPEED;
|
||||
Cycle.color_mode = MODE_COLORS_NONE;
|
||||
Cycle.speed_min = LOGITECH_GPRO_SPEED_SLOWEST;
|
||||
Cycle.speed_max = LOGITECH_GPRO_SPEED_FASTEST;
|
||||
Cycle.speed = LOGITECH_GPRO_SPEED_NORMAL;
|
||||
modes.push_back(Cycle);
|
||||
|
||||
mode Breathing;
|
||||
Breathing.name = "Breathing";
|
||||
Breathing.value = LOGITECH_GPRO_MODE_BREATHING;
|
||||
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
|
||||
Breathing.colors_min = 1;
|
||||
Breathing.colors_max = 1;
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Breathing.colors.resize(1);
|
||||
Breathing.speed_min = LOGITECH_GPRO_SPEED_SLOWEST;
|
||||
Breathing.speed_max = LOGITECH_GPRO_SPEED_FASTEST;
|
||||
Breathing.speed = LOGITECH_GPRO_SPEED_NORMAL;
|
||||
modes.push_back(Breathing);
|
||||
|
||||
SetupZones();
|
||||
}
|
||||
|
||||
RGBController_LogitechGProKeyboard::~RGBController_LogitechGProKeyboard()
|
||||
{
|
||||
Shutdown();
|
||||
|
||||
delete controller;
|
||||
}
|
||||
|
||||
void RGBController_LogitechGProKeyboard::SetupZones()
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Set up zones |
|
||||
\*---------------------------------------------------------*/
|
||||
unsigned int total_led_count = 0;
|
||||
for(unsigned int zone_idx = 0; zone_idx < 1; zone_idx++)
|
||||
{
|
||||
zone new_zone;
|
||||
new_zone.name = zone_names[zone_idx];
|
||||
new_zone.type = zone_types[zone_idx];
|
||||
new_zone.leds_min = zone_sizes[zone_idx];
|
||||
new_zone.leds_max = zone_sizes[zone_idx];
|
||||
new_zone.leds_count = zone_sizes[zone_idx];
|
||||
|
||||
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
|
||||
{
|
||||
new_zone.matrix_map.Set(7, 19, (unsigned int *)&matrix_map);
|
||||
}
|
||||
|
||||
zones.push_back(new_zone);
|
||||
|
||||
total_led_count += zone_sizes[zone_idx];
|
||||
}
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < total_led_count; led_idx++)
|
||||
{
|
||||
led new_led;
|
||||
new_led.name = led_names[led_idx].name;
|
||||
new_led.value = ( led_names[led_idx].zone << 8 ) + led_names[led_idx].idx;
|
||||
leds.push_back(new_led);
|
||||
}
|
||||
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_LogitechGProKeyboard::DeviceUpdateLEDs()
|
||||
{
|
||||
#define MAX_FRAMES_PER_PACKET 0x0E
|
||||
|
||||
unsigned char frame_buf[MAX_FRAMES_PER_PACKET * 4];
|
||||
unsigned char frame_cnt = 0;
|
||||
unsigned char prev_zone = 0;
|
||||
unsigned char zone = 0;
|
||||
unsigned char idx = 0;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| TODO: Send packets with multiple LED frames |
|
||||
\*---------------------------------------------------------*/
|
||||
for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++)
|
||||
{
|
||||
zone = ( leds[led_idx].value >> 8 );
|
||||
idx = ( leds[led_idx].value & 0xFF );
|
||||
|
||||
if((zone != prev_zone) && (frame_cnt != 0))
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
frame_cnt = 0;
|
||||
}
|
||||
|
||||
frame_buf[(frame_cnt * 4) + 0] = idx;
|
||||
frame_buf[(frame_cnt * 4) + 1] = RGBGetRValue(colors[led_idx]);
|
||||
frame_buf[(frame_cnt * 4) + 2] = RGBGetGValue(colors[led_idx]);
|
||||
frame_buf[(frame_cnt * 4) + 3] = RGBGetBValue(colors[led_idx]);
|
||||
|
||||
frame_cnt++;
|
||||
prev_zone = zone;
|
||||
|
||||
if(frame_cnt == MAX_FRAMES_PER_PACKET)
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
frame_cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(frame_cnt != 0)
|
||||
{
|
||||
controller->SetDirect(prev_zone, frame_cnt, frame_buf);
|
||||
}
|
||||
|
||||
controller->Commit();
|
||||
}
|
||||
|
||||
void RGBController_LogitechGProKeyboard::DeviceUpdateZoneLEDs(int /*zone*/)
|
||||
{
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
|
||||
void RGBController_LogitechGProKeyboard::DeviceUpdateSingleLED(int led)
|
||||
{
|
||||
unsigned char frame[4];
|
||||
unsigned char zone;
|
||||
unsigned char idx;
|
||||
|
||||
zone = ( leds[led].value >> 8 );
|
||||
idx = ( leds[led].value & 0xFF );
|
||||
|
||||
frame[0] = idx;
|
||||
frame[1] = RGBGetRValue(colors[led]);
|
||||
frame[2] = RGBGetGValue(colors[led]);
|
||||
frame[3] = RGBGetBValue(colors[led]);
|
||||
|
||||
controller->SetDirect(zone, 1, frame);
|
||||
controller->Commit();
|
||||
}
|
||||
|
||||
void RGBController_LogitechGProKeyboard::DeviceUpdateMode()
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| Direct mode does not send a mode packet |
|
||||
| Call UpdateLEDs to send direct packet |
|
||||
\*---------------------------------------------------------*/
|
||||
if(active_mode == 0xFFFF)
|
||||
{
|
||||
UpdateLEDsInternal();
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned char red = 0;
|
||||
unsigned char grn = 0;
|
||||
unsigned char blu = 0;
|
||||
|
||||
if(modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC)
|
||||
{
|
||||
red = RGBGetRValue(modes[active_mode].colors[0]);
|
||||
grn = RGBGetGValue(modes[active_mode].colors[0]);
|
||||
blu = RGBGetBValue(modes[active_mode].colors[0]);
|
||||
}
|
||||
|
||||
controller->SetMode(modes[active_mode].value, modes[active_mode].speed, red, grn, blu);
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_LogitechGPro.h |
|
||||
| |
|
||||
| RGBController for Logitech G Pro keyboard |
|
||||
| |
|
||||
| sanchezzzs 20 Oct 2021 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "RGBController.h"
|
||||
#include "LogitechGProKeyboardController.h"
|
||||
|
||||
class RGBController_LogitechGProKeyboard : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_LogitechGProKeyboard(LogitechGProKeyboardController* controller_ptr);
|
||||
~RGBController_LogitechGProKeyboard();
|
||||
|
||||
void SetupZones();
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
void DeviceUpdateZoneLEDs(int zone);
|
||||
void DeviceUpdateSingleLED(int led);
|
||||
|
||||
void DeviceUpdateMode();
|
||||
|
||||
private:
|
||||
LogitechGProKeyboardController* controller;
|
||||
};
|
||||
+47
-92
@@ -922,23 +922,6 @@ bool LogitechHIDPP20Controller::PrefersShortFrame(size_t len) const
|
||||
#endif
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Outgoing frame as hex, for trace-level wire comparison. |
|
||||
\*---------------------------------------------------------*/
|
||||
static std::string hex_frame(const uint8_t* buf, size_t len)
|
||||
{
|
||||
std::string out;
|
||||
char byte[4];
|
||||
|
||||
for(size_t i = 0; i < len; i++)
|
||||
{
|
||||
snprintf(byte, sizeof(byte), "%02X ", buf[i]);
|
||||
out += byte;
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
int LogitechHIDPP20Controller::SendStandard
|
||||
(
|
||||
uint8_t feat_idx,
|
||||
@@ -1011,11 +994,6 @@ int LogitechHIDPP20Controller::SendStandard
|
||||
result = hid_write(dev, buf, msg_len);
|
||||
}
|
||||
|
||||
if(LogManager::get()->GetLogLevel() >= LL_TRACE)
|
||||
{
|
||||
LOG_TRACE("%s TX %s(result=%d)", LOG_TAG, hex_frame(buf, msg_len).c_str(), result);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| A collection with no short report rejects the 0x10 |
|
||||
| write (G560, G933). Resend as long and stay long. |
|
||||
@@ -1043,11 +1021,6 @@ int LogitechHIDPP20Controller::SendStandard
|
||||
result = hid_write(dev, buf, LOGITECH_LONG_MESSAGE_LEN);
|
||||
}
|
||||
|
||||
if(LogManager::get()->GetLogLevel() >= LL_TRACE)
|
||||
{
|
||||
LOG_TRACE("%s TX %s(result=%d)", LOG_TAG, hex_frame(buf, LOGITECH_LONG_MESSAGE_LEN).c_str(), result);
|
||||
}
|
||||
|
||||
if(result >= 0)
|
||||
{
|
||||
LOG_DEBUG("%s Short report rejected, using long frames", LOG_TAG);
|
||||
@@ -1199,9 +1172,6 @@ int LogitechHIDPP20Controller::ReadStandardDirect
|
||||
{
|
||||
if(response.device_index != device_index)
|
||||
{
|
||||
LOG_TRACE("%s ReadStandardDirect: dropping frame for index 0x%02X (ours 0x%02X)",
|
||||
LOG_TAG, response.device_index, device_index);
|
||||
|
||||
if(++drained > HIDPP20_READ_DRAIN_BUDGET)
|
||||
{
|
||||
LOG_DEBUG("%s ReadStandardDirect: drain budget (%d) exceeded",
|
||||
@@ -4829,18 +4799,9 @@ int LogitechHIDPP20Controller::ProcessOnePerKeyResponse(int timeout_ms, uint8_t
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Echo format unknown for this function, count |
|
||||
| it toward the group, and log the payload so a |
|
||||
| real run teaches us what the firmware echoes. |
|
||||
| it toward the group. |
|
||||
\*-------------------------------------------------*/
|
||||
frame_unmatched_acks[resp_func & 0xF0]++;
|
||||
|
||||
char hex[16 * 3 + 1];
|
||||
for(int b = 0; b < 16; b++)
|
||||
{
|
||||
snprintf(&hex[b * 3], 4, "%02X ", resp_data[b]);
|
||||
}
|
||||
LOG_TRACE("%s per-key ACK echo unmatched func=0x%02X data=[%s]",
|
||||
LOG_TAG, resp_func, hex);
|
||||
}
|
||||
|
||||
return 1;
|
||||
@@ -4902,11 +4863,6 @@ void LogitechHIDPP20Controller::SubmitPerKeyFrame(const std::vector<RGBColor>& f
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(pending_frame_mutex);
|
||||
|
||||
if(pending_frame_valid)
|
||||
{
|
||||
pending_frames_skipped++;
|
||||
}
|
||||
|
||||
pending_frame = frame;
|
||||
pending_frame_valid = true;
|
||||
}
|
||||
@@ -4919,7 +4875,6 @@ void LogitechHIDPP20Controller::SenderThreadFunc()
|
||||
while(sender_running.load())
|
||||
{
|
||||
std::vector<RGBColor> frame;
|
||||
uint32_t skipped = 0;
|
||||
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(pending_frame_mutex);
|
||||
@@ -4934,15 +4889,8 @@ void LogitechHIDPP20Controller::SenderThreadFunc()
|
||||
return;
|
||||
}
|
||||
|
||||
frame = std::move(pending_frame);
|
||||
pending_frame_valid = false;
|
||||
skipped = pending_frames_skipped;
|
||||
pending_frames_skipped = 0;
|
||||
}
|
||||
|
||||
if(skipped > 0)
|
||||
{
|
||||
LOG_TRACE("%s sender skipped %u stale frame(s)", LOG_TAG, skipped);
|
||||
frame = std::move(pending_frame);
|
||||
pending_frame_valid = false;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
@@ -5437,6 +5385,7 @@ PerKeyFrameResult LogitechHIDPP20Controller::PerKeyFrameEnd()
|
||||
if(lost > 0)
|
||||
{
|
||||
perkey_clean_frames = 0;
|
||||
perkey_acks_lost += lost;
|
||||
|
||||
if(perkey_window > HIDPP20_PERKEY_WINDOW_MIN)
|
||||
{
|
||||
@@ -5446,9 +5395,6 @@ PerKeyFrameResult LogitechHIDPP20Controller::PerKeyFrameEnd()
|
||||
{
|
||||
perkey_window = HIDPP20_PERKEY_WINDOW_MIN;
|
||||
}
|
||||
|
||||
LOG_DEBUG("%s %zu write ACK(s) lost, write window now %zu",
|
||||
LOG_TAG, lost, perkey_window);
|
||||
}
|
||||
}
|
||||
else if(perkey_window < HIDPP20_PERKEY_WINDOW_MAX &&
|
||||
@@ -5472,34 +5418,55 @@ PerKeyFrameResult LogitechHIDPP20Controller::PerKeyFrameEnd()
|
||||
DrainStaleResponses();
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Link quality. A lost ACK or an unfinished frame is |
|
||||
| the link's normal backpressure and the next frame |
|
||||
| resends what did not land, so single frames are not |
|
||||
| logged. Counts are summarized once per interval, |
|
||||
| and only when something was lost. |
|
||||
\*-----------------------------------------------------*/
|
||||
if(!result.attempted_zones.empty())
|
||||
{
|
||||
std::chrono::steady_clock::time_point frame_done = std::chrono::steady_clock::now();
|
||||
perkey_frames_seen++;
|
||||
|
||||
int send_ms = (int)std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
send_done - frame_first_write).count();
|
||||
int ack_ms = (int)std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
acks_done - send_done).count();
|
||||
int fe_ms = (int)std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
frame_done - acks_done).count();
|
||||
|
||||
if(complete)
|
||||
if(frame_aborted)
|
||||
{
|
||||
LOG_TRACE("%s frame committed: %zu zones, %zu packets (%zu echo-matched) "
|
||||
"send=%dms ack=%dms fe=%dms pred=%ums busy=%d win=%zu",
|
||||
LOG_TAG, result.attempted_zones.size(), frame_packets.size(),
|
||||
frame_exact_acks, send_ms, ack_ms, fe_ms, predicted_ms, busy_polls,
|
||||
perkey_window);
|
||||
perkey_frames_aborted++;
|
||||
}
|
||||
else
|
||||
else if(!complete)
|
||||
{
|
||||
LOG_DEBUG("%s frame %s: %zu/%zu zones acked (%zu packets, %zu echo-matched), "
|
||||
"frame_end=%d, send=%dms ack=%dms fe=%dms pred=%ums busy=%d win=%zu",
|
||||
LOG_TAG, frame_aborted ? "aborted" : "partial",
|
||||
result.acked_zones.size(), result.attempted_zones.size(),
|
||||
frame_packets.size(), frame_exact_acks,
|
||||
(int)result.frame_end_acked, send_ms, ack_ms, fe_ms, predicted_ms,
|
||||
busy_polls, perkey_window);
|
||||
perkey_frames_partial++;
|
||||
}
|
||||
|
||||
if(!result.frame_end_acked)
|
||||
{
|
||||
perkey_frames_no_end++;
|
||||
}
|
||||
|
||||
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
|
||||
|
||||
if(perkey_summary_time == std::chrono::steady_clock::time_point())
|
||||
{
|
||||
perkey_summary_time = now;
|
||||
}
|
||||
else if(now - perkey_summary_time >= std::chrono::seconds(HIDPP20_PERKEY_SUMMARY_S))
|
||||
{
|
||||
if(perkey_frames_partial > 0 || perkey_frames_aborted > 0 ||
|
||||
perkey_frames_no_end > 0 || perkey_acks_lost > 0)
|
||||
{
|
||||
LOG_DEBUG("%s per-key link, last %ds: %zu frames, %zu partial, %zu aborted, "
|
||||
"%zu without FrameEnd ack, %zu ACKs lost, window %zu",
|
||||
LOG_TAG, HIDPP20_PERKEY_SUMMARY_S, perkey_frames_seen,
|
||||
perkey_frames_partial, perkey_frames_aborted,
|
||||
perkey_frames_no_end, perkey_acks_lost, perkey_window);
|
||||
}
|
||||
|
||||
perkey_frames_seen = 0;
|
||||
perkey_frames_partial = 0;
|
||||
perkey_frames_aborted = 0;
|
||||
perkey_frames_no_end = 0;
|
||||
perkey_acks_lost = 0;
|
||||
perkey_summary_time = now;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5855,15 +5822,6 @@ void LogitechHIDPP20Controller::SetZoneEffect
|
||||
\*-----------------------------------------------------*/
|
||||
data[12] = persist ? 0x01 : 0x00;
|
||||
|
||||
LOG_DEBUG("%s SetEffect cluster=%u idx=%u id=0x%04X "
|
||||
"data=[%02X %02X %02X %02X %02X %02X %02X %02X "
|
||||
"%02X %02X %02X %02X %02X %02X %02X %02X]",
|
||||
LOG_TAG, cluster_idx, effect_idx, effect_id,
|
||||
data[0], data[1], data[2], data[3],
|
||||
data[4], data[5], data[6], data[7],
|
||||
data[8], data[9], data[10], data[11],
|
||||
data[12], data[13], data[14], data[15]);
|
||||
|
||||
blankFAPmessage response;
|
||||
SendAckedIntoFAP(caps.idx_rgb_effects, caps.fn_set_effect,
|
||||
data, 16, response);
|
||||
@@ -5951,9 +5909,6 @@ void LogitechHIDPP20Controller::SetHeadsetRGBHostmodeColors
|
||||
uint8_t frame_end[4] = { 0x01, 0x00, 0x00, 0x00 };
|
||||
SendAckedIntoFAP(caps.idx_headset_rgb_hostmode, FN_0620_FRAME_END,
|
||||
frame_end, sizeof(frame_end), response);
|
||||
|
||||
LOG_TRACE("%s 0x0620 wrote %zu zone(s) in %zu color group(s), FrameEnd[0x01]",
|
||||
LOG_TAG, zones.size(), groups.size());
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
|
||||
+12
-1
@@ -510,6 +510,7 @@ static constexpr size_t HIDPP20_PERKEY_WINDOW_MAX = 8;
|
||||
static constexpr size_t HIDPP20_PERKEY_WINDOW_MIN = 2;
|
||||
static constexpr uint16_t HIDPP20_PERKEY_ACK_WAIT_MS = 60;
|
||||
static constexpr uint16_t HIDPP20_PERKEY_ACK_TAIL_MS = 25;
|
||||
static constexpr int HIDPP20_PERKEY_SUMMARY_S = 60;
|
||||
static constexpr uint8_t HIDPP20_PERKEY_WINDOW_GROW_AFTER = 16;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
@@ -1243,6 +1244,17 @@ private:
|
||||
size_t perkey_window = HIDPP20_PERKEY_WINDOW_MAX;
|
||||
uint8_t perkey_clean_frames = 0;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Link quality counters, logged as one summary at most |
|
||||
| once per HIDPP20_PERKEY_SUMMARY_S. |
|
||||
\*-----------------------------------------------------*/
|
||||
size_t perkey_frames_seen = 0;
|
||||
size_t perkey_frames_partial = 0;
|
||||
size_t perkey_frames_aborted = 0;
|
||||
size_t perkey_frames_no_end = 0;
|
||||
size_t perkey_acks_lost = 0;
|
||||
std::chrono::steady_clock::time_point perkey_summary_time;
|
||||
|
||||
void ResetPerKeyFrameState();
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
@@ -1293,7 +1305,6 @@ private:
|
||||
std::condition_variable pending_frame_cv;
|
||||
std::vector<RGBColor> pending_frame;
|
||||
bool pending_frame_valid = false;
|
||||
uint32_t pending_frames_skipped = 0;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Callbacks |
|
||||
|
||||
+93
-32
@@ -329,6 +329,10 @@ static const std::map<uint16_t, std::string> hidpp20_extras_names =
|
||||
{ 182, "G3" },
|
||||
{ 183, "G4" },
|
||||
{ 184, "G5" },
|
||||
{ 185, "G6" },
|
||||
{ 186, "G7" },
|
||||
{ 187, "G8" },
|
||||
{ 188, "G9" },
|
||||
{ 210, "Logo" },
|
||||
};
|
||||
|
||||
@@ -423,9 +427,39 @@ static const keyboard_led proxrapid_top_strip[] =
|
||||
{ 0, 0, 13, 153, "Media Mute", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above F12 */
|
||||
};
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| G915 X Wired top strip and G-key column: INSERT_ROW adds |
|
||||
| row 0 above the F-row, the rest INSERT_SHIFT_RIGHT into |
|
||||
| it. G1-G5 insert at column 0 of the main rows; the unused |
|
||||
| key at the F-row's column 0 shifts that row right so it |
|
||||
| stays aligned with them. Zone ids hardware-probed on this |
|
||||
| board. Game Mode (above F5) is a non-RGB toggle, so none |
|
||||
| is listed. |
|
||||
\*---------------------------------------------------------*/
|
||||
static const keyboard_led g915x_strip_and_gkeys[] =
|
||||
{
|
||||
{ 0, 0, 0, 210, "Logo", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_ROW },
|
||||
{ 0, 1, 0, 0, KEY_EN_UNUSED, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* shift the F-row */
|
||||
{ 0, 2, 0, 180, "G1", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT },
|
||||
{ 0, 3, 0, 181, "G2", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT },
|
||||
{ 0, 4, 0, 182, "G3", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT },
|
||||
{ 0, 5, 0, 183, "G4", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT },
|
||||
{ 0, 6, 0, 184, "G5", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT },
|
||||
{ 0, 0, 3, 185, "G6", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above F1 */
|
||||
{ 0, 0, 4, 186, "G7", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above F2 */
|
||||
{ 0, 0, 5, 187, "G8", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above F3 */
|
||||
{ 0, 0, 6, 188, "G9", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above F4 */
|
||||
{ 0, 0, 8, 153, "Brightness", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above F6 */
|
||||
{ 0, 0, 18, 158, "Media Previous", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above Num Lock */
|
||||
{ 0, 0, 19, 155, "Media Play/Pause", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above Numpad / */
|
||||
{ 0, 0, 20, 157, "Media Next", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above Numpad * */
|
||||
{ 0, 0, 21, 156, "Media Mute", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT }, /* above Numpad - */
|
||||
};
|
||||
|
||||
static const KbLayoutEdit known_kb_layout_edits[] =
|
||||
{
|
||||
{ 0xC35B, proxrapid_top_strip, 5 }, /* PRO X RAPID */
|
||||
{ 0xC35B, proxrapid_top_strip, 5 }, /* PRO X RAPID */
|
||||
{ 0xC359, g915x_strip_and_gkeys, 16 }, /* G915 X Wired */
|
||||
};
|
||||
|
||||
static key_set FindKbLayoutEdit(uint16_t pid_wired, uint16_t pid_wireless)
|
||||
@@ -804,9 +838,10 @@ static const keyboard_led g512_top_strip[] =
|
||||
| legacy map: the media cluster above the numpad (on/off |
|
||||
| backlight, not RGB; the firmware still advertises media |
|
||||
| keyType 0x02, see the C32B quirk) and the four small |
|
||||
| mode keys left of G6, which nothing has identified yet. |
|
||||
| If firmware enumerates any of these they surface in |
|
||||
| Extras (suppression is off for this board). |
|
||||
| mode keys left of G6. Painting the advertised extras |
|
||||
| controls nothing (hardware-observed), so unclaimed ids |
|
||||
| are suppressed as phantoms; the plugin's Show Unmapped |
|
||||
| override surfaces them for auditing. |
|
||||
\*---------------------------------------------------------*/
|
||||
static const keyboard_led g910_side_strip[] =
|
||||
{
|
||||
@@ -831,15 +866,15 @@ static const keyboard_led g910_side_strip[] =
|
||||
\*---------------------------------------------------------*/
|
||||
static const Kb8080Strip known_kb_8080_strips[] =
|
||||
{
|
||||
{ 0xC331, true, g810_top_strip, 11, false }, /* G810 */
|
||||
{ 0xC337, true, g810_top_strip, 11, false }, /* G810 */
|
||||
{ 0xC333, true, g810_top_strip, 11, false }, /* G610 */
|
||||
{ 0xC338, true, g810_top_strip, 11, false }, /* G610 */
|
||||
{ 0xC331, true, g810_top_strip, 11, true }, /* G810 */
|
||||
{ 0xC337, true, g810_top_strip, 11, true }, /* G810 */
|
||||
{ 0xC333, true, g810_top_strip, 11, true }, /* G610 */
|
||||
{ 0xC338, true, g810_top_strip, 11, true }, /* G610 */
|
||||
{ 0xC342, true, g512_top_strip, 2, true }, /* G512 */
|
||||
{ 0xC33C, true, g512_top_strip, 2, true }, /* G512 RGB */
|
||||
{ 0xC32B, true, g910_side_strip, 11, false }, /* G910 Orion Spark */
|
||||
{ 0xC335, true, g910_side_strip, 11, false }, /* G910 */
|
||||
{ 0xC339, false, gpro_top_strip, 5, false }, /* G Pro */
|
||||
{ 0xC32B, true, g910_side_strip, 11, true }, /* G910 Orion Spark */
|
||||
{ 0xC335, true, g910_side_strip, 11, true }, /* G910 */
|
||||
{ 0xC339, false, gpro_top_strip, 5, true }, /* G Pro */
|
||||
};
|
||||
|
||||
static const Kb8080Strip* FindKb8080Strip(uint16_t pid_wired, uint16_t pid_wireless)
|
||||
@@ -855,9 +890,10 @@ static const Kb8080Strip* FindKb8080Strip(uint16_t pid_wired, uint16_t pid_wirel
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Controller* controller_ptr)
|
||||
RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Controller* controller_ptr, std::function<void ()> callback)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
shutdown_callback = callback;
|
||||
|
||||
const HIDPP20DeviceCapabilities& caps = controller->GetCapabilities();
|
||||
|
||||
@@ -988,6 +1024,27 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
{
|
||||
const HIDPP20ZoneCluster& cluster = caps.zone_clusters[0];
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Per-LED effect colors: multi-cluster devices |
|
||||
| whose only paint path is zone effects, one color |
|
||||
| per cluster. Per-key devices take a single mode |
|
||||
| color: the UI repaints per-key on any per-LED |
|
||||
| mode set, which overwrites the zone effect. |
|
||||
\*-------------------------------------------------*/
|
||||
const bool per_led_colors = (caps.zone_clusters.size() > 1)
|
||||
&& !caps.has_perkey
|
||||
&& !PerKey8080Capable();
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| 0x8070 keyboard firmware ignores the Cycle, Wave |
|
||||
| and Breathing intensity byte (G810/G910 |
|
||||
| hardware); the same slots drive brightness on |
|
||||
| the mice. No slider for a dead control; the wire |
|
||||
| still sends 100 in that slot. |
|
||||
\*-------------------------------------------------*/
|
||||
const bool effect_brightness = !(caps.rgb_feature_page == HIDPP20_FEAT_COLOR_LED_EFFECTS
|
||||
&& caps.device_type == LOGITECH_DEVICE_TYPE_KEYBOARD);
|
||||
|
||||
for(size_t i = 0; i < cluster.effects.size(); i++)
|
||||
{
|
||||
const HIDPP20Effect& fx = cluster.effects[i];
|
||||
@@ -1000,16 +1057,7 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
Static.name = "Static";
|
||||
Static.value = fx.index;
|
||||
|
||||
/*-------------------------------------*\
|
||||
| Multi-cluster devices (mice with |
|
||||
| logo/scroll/DPI) get per-LED colors |
|
||||
| so each zone can be painted |
|
||||
| independently in Static. Single- |
|
||||
| cluster devices (keyboards, single- |
|
||||
| zone mice) keep the single-color |
|
||||
| MODE_COLORS_MODE_SPECIFIC UX. |
|
||||
\*-------------------------------------*/
|
||||
if(caps.zone_clusters.size() > 1)
|
||||
if(per_led_colors)
|
||||
{
|
||||
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR;
|
||||
Static.color_mode = MODE_COLORS_PER_LED;
|
||||
@@ -1031,8 +1079,11 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
mode Cycle;
|
||||
Cycle.name = "Spectrum Cycle";
|
||||
Cycle.value = fx.index;
|
||||
Cycle.flags = MODE_FLAG_HAS_SPEED
|
||||
| MODE_FLAG_HAS_BRIGHTNESS;
|
||||
Cycle.flags = MODE_FLAG_HAS_SPEED;
|
||||
if(effect_brightness)
|
||||
{
|
||||
Cycle.flags |= MODE_FLAG_HAS_BRIGHTNESS;
|
||||
}
|
||||
Cycle.speed_min = HIDPP20_SPEED_SLIDER_MIN;
|
||||
Cycle.speed_max = HIDPP20_SPEED_SLIDER_MAX;
|
||||
Cycle.speed = 80; /* ~4.9s, lively medium */
|
||||
@@ -1056,11 +1107,7 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
Breathing.brightness_max = 100;
|
||||
Breathing.brightness = 100;
|
||||
|
||||
/*-------------------------------------*\
|
||||
| See Static above, multi- |
|
||||
| cluster gets per-LED colors. |
|
||||
\*-------------------------------------*/
|
||||
if(caps.zone_clusters.size() > 1)
|
||||
if(per_led_colors)
|
||||
{
|
||||
Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR
|
||||
| MODE_FLAG_HAS_SPEED
|
||||
@@ -1077,6 +1124,12 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Breathing.colors.resize(1);
|
||||
}
|
||||
|
||||
if(!effect_brightness)
|
||||
{
|
||||
Breathing.flags &= ~MODE_FLAG_HAS_BRIGHTNESS;
|
||||
}
|
||||
|
||||
modes.push_back(Breathing);
|
||||
break;
|
||||
}
|
||||
@@ -1096,7 +1149,7 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
Visualizer.speed_max = HIDPP20_SPEED_SLIDER_MAX;
|
||||
Visualizer.speed = 80; /* ~4.9s, near the 5s firmware default */
|
||||
|
||||
if(caps.zone_clusters.size() > 1)
|
||||
if(per_led_colors)
|
||||
{
|
||||
Visualizer.flags = MODE_FLAG_HAS_PER_LED_COLOR
|
||||
| MODE_FLAG_HAS_SPEED;
|
||||
@@ -1120,8 +1173,11 @@ RGBController_LogitechHIDPP20::RGBController_LogitechHIDPP20(LogitechHIDPP20Cont
|
||||
mode Wave;
|
||||
Wave.name = "Color Wave";
|
||||
Wave.value = fx.index;
|
||||
Wave.flags = MODE_FLAG_HAS_SPEED
|
||||
| MODE_FLAG_HAS_BRIGHTNESS;
|
||||
Wave.flags = MODE_FLAG_HAS_SPEED;
|
||||
if(effect_brightness)
|
||||
{
|
||||
Wave.flags |= MODE_FLAG_HAS_BRIGHTNESS;
|
||||
}
|
||||
Wave.speed_min = HIDPP20_SPEED_SLIDER_MIN;
|
||||
Wave.speed_max = HIDPP20_SPEED_SLIDER_MAX;
|
||||
Wave.speed = 80; /* ~4.9s, lively medium */
|
||||
@@ -1346,6 +1402,11 @@ RGBController_LogitechHIDPP20::~RGBController_LogitechHIDPP20()
|
||||
{
|
||||
controller->StopPowerManager();
|
||||
|
||||
if(shutdown_callback)
|
||||
{
|
||||
shutdown_callback();
|
||||
}
|
||||
|
||||
Shutdown();
|
||||
|
||||
delete controller;
|
||||
|
||||
+3
-1
@@ -15,7 +15,7 @@
|
||||
class RGBController_LogitechHIDPP20 : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_LogitechHIDPP20(LogitechHIDPP20Controller* controller_ptr);
|
||||
RGBController_LogitechHIDPP20(LogitechHIDPP20Controller* controller_ptr, std::function<void()> shutdown_callback);
|
||||
~RGBController_LogitechHIDPP20();
|
||||
|
||||
void SetupZones();
|
||||
@@ -116,4 +116,6 @@ private:
|
||||
| Parallel to led_to_zone_id; 0x8080 path only. |
|
||||
\*-----------------------------------------------------*/
|
||||
std::vector<std::pair<uint16_t, uint8_t>> led_to_keytype_keyid_8080;
|
||||
|
||||
std::function<void()> shutdown_callback;
|
||||
};
|
||||
|
||||
+10
-10
@@ -104,18 +104,18 @@ void MSIMotherboard112Controller::SetMode
|
||||
{
|
||||
zone_data->effect = mode;
|
||||
zone_data->speedAndBrightnessFlags = (brightness << 2) | (speed & 0x03);
|
||||
zone_data->colorFlags = BITSET(zone_data->colorFlags, !rainbow_color, 7u);
|
||||
zone_data->colorFlags = (rainbow_color ? 0 : MSI_COLOR_FLAG_USE_CUSTOM_COLOR);
|
||||
zone_data->padding = 0x00;
|
||||
|
||||
if(mode > MSI_MODE_DOUBLE_FLASHING)
|
||||
{
|
||||
zone_data->speedAndBrightnessFlags |= SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags |= SYNC_SETTING_ONBOARD;
|
||||
zone_data->speedAndBrightnessFlags |= MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags |= MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD;
|
||||
}
|
||||
else
|
||||
{
|
||||
zone_data->speedAndBrightnessFlags &= ~SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags &= ~SYNC_SETTING_ONBOARD;
|
||||
zone_data->speedAndBrightnessFlags &= ~MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags &= ~MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ void MSIMotherboard112Controller::SetMode
|
||||
{
|
||||
zone_data->effect = mode;
|
||||
zone_data->speedAndBrightnessFlags = (brightness << 2) | (speed & 0x03);
|
||||
zone_data->colorFlags = BITSET(zone_data->colorFlags, !rainbow_color, 7u);
|
||||
zone_data->colorFlags = (rainbow_color ? 0 : MSI_COLOR_FLAG_USE_CUSTOM_COLOR);
|
||||
zone_data->padding = 0x00;
|
||||
}
|
||||
}
|
||||
@@ -410,10 +410,10 @@ void MSIMotherboard112Controller::GetMode
|
||||
/*-----------------------------------------------------*\
|
||||
| Update pointers with data |
|
||||
\*-----------------------------------------------------*/
|
||||
mode = (MSI_MODE)zone_data->effect;
|
||||
speed = (MSI_SPEED)(zone_data->speedAndBrightnessFlags & 0x03);
|
||||
brightness = (MSI_BRIGHTNESS)((zone_data->speedAndBrightnessFlags >> 2) & 0x1F);
|
||||
rainbow_color = (zone_data->colorFlags & 0x80) == 0 ? true : false;
|
||||
mode = (MSI_MODE) zone_data->effect;
|
||||
speed = (MSI_SPEED) ((zone_data->speedAndBrightnessFlags >> MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
brightness = (MSI_BRIGHTNESS)((zone_data->speedAndBrightnessFlags >> MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK);
|
||||
rainbow_color = ((zone_data->colorFlags & MSI_COLOR_FLAG_USE_CUSTOM_COLOR) == 0 ? false : true);
|
||||
color = ToRGBColor(zone_data->color.R, zone_data->color.G, zone_data->color.B);
|
||||
}
|
||||
|
||||
|
||||
+14
-15
@@ -12,12 +12,9 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <bitset>
|
||||
#include "MSIMotherboard162Controller.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
#define BITSET(val, bit, pos) ((unsigned char)std::bitset<8>(val).set((pos), (bit)).to_ulong())
|
||||
|
||||
struct mystic_light_162_config
|
||||
{
|
||||
unsigned short pid; // PID of the board
|
||||
@@ -147,19 +144,20 @@ void MSIMotherboard162Controller::SetMode
|
||||
if (zone <= MSI_ZONE_ON_BOARD_LED_0)
|
||||
{
|
||||
zone_data->effect = mode;
|
||||
zone_data->speedAndBrightnessFlags = (brightness << 2) | (speed & 0x03);
|
||||
zone_data->colorFlags = BITSET(zone_data->colorFlags, !rainbow_color, 7u);
|
||||
zone_data->speedAndBrightnessFlags = ((brightness << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK)
|
||||
| ((speed << MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
zone_data->colorFlags = (rainbow_color ? 0 : MSI_COLOR_FLAG_USE_CUSTOM_COLOR);
|
||||
zone_data->padding = 0x00;
|
||||
|
||||
if(mode > MSI_MODE_DOUBLE_FLASHING)
|
||||
{
|
||||
zone_data->speedAndBrightnessFlags |= SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags |= SYNC_SETTING_ONBOARD;
|
||||
zone_data->speedAndBrightnessFlags |= MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags |= MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD;
|
||||
}
|
||||
else
|
||||
{
|
||||
zone_data->speedAndBrightnessFlags &= ~SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags &= ~SYNC_SETTING_ONBOARD;
|
||||
zone_data->speedAndBrightnessFlags &= ~MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
zone_data->colorFlags &= ~MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,8 +168,9 @@ void MSIMotherboard162Controller::SetMode
|
||||
if(zone_data != nullptr)
|
||||
{
|
||||
zone_data->effect = mode;
|
||||
zone_data->speedAndBrightnessFlags = (brightness << 2) | (speed & 0x03);
|
||||
zone_data->colorFlags = BITSET(zone_data->colorFlags, !rainbow_color, 7u);
|
||||
zone_data->speedAndBrightnessFlags = ((brightness << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK)
|
||||
| ((speed << MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
zone_data->colorFlags = (rainbow_color ? 0 : MSI_COLOR_FLAG_USE_CUSTOM_COLOR);
|
||||
zone_data->padding = 0x00;
|
||||
}
|
||||
}
|
||||
@@ -431,10 +430,10 @@ void MSIMotherboard162Controller::GetMode
|
||||
/*-----------------------------------------------------*\
|
||||
| Update pointers with data |
|
||||
\*-----------------------------------------------------*/
|
||||
mode = (MSI_MODE)zone_data->effect;
|
||||
speed = (MSI_SPEED)(zone_data->speedAndBrightnessFlags & 0x03);
|
||||
brightness = (MSI_BRIGHTNESS)((zone_data->speedAndBrightnessFlags >> 2) & 0x1F);
|
||||
rainbow_color = (zone_data->colorFlags & 0x80) == 0 ? true : false;
|
||||
mode = (MSI_MODE) zone_data->effect;
|
||||
speed = (MSI_SPEED) ((zone_data->speedAndBrightnessFlags >> MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
brightness = (MSI_BRIGHTNESS)((zone_data->speedAndBrightnessFlags >> MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK);
|
||||
rainbow_color = ((zone_data->colorFlags & MSI_COLOR_FLAG_USE_CUSTOM_COLOR) == 0 ? false : true);
|
||||
color = ToRGBColor(zone_data->color.R, zone_data->color.G, zone_data->color.B);
|
||||
}
|
||||
|
||||
|
||||
+448
-227
@@ -17,15 +17,13 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <bitset>
|
||||
#include <cstdio>
|
||||
#include "MSIMotherboard185Controller.h"
|
||||
#include "LogManager.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
|
||||
#define BITSET(val, bit, pos) ((unsigned char)std::bitset<8>(val).set((pos), (bit)).to_ulong())
|
||||
|
||||
#define SYNC_PER_LED_MODE_JRAINBOW_LED_COUNT 40
|
||||
#define SYNC_PER_LED_MODE_CORSAIR_LED_COUNT 120
|
||||
#define JRAINBOW1_MAX_LED_COUNT 200
|
||||
@@ -33,12 +31,13 @@ using namespace std::chrono_literals;
|
||||
#define JCORSAIR_MAX_LED_COUNT 240
|
||||
|
||||
#define MSI_DIRECT_MODE 0x25
|
||||
#define PER_LED_BASIC_SYNC_MODE (0x80 | SYNC_SETTING_ONBOARD | SYNC_SETTING_JPIPE1 | SYNC_SETTING_JPIPE2)
|
||||
#define PER_LED_FULL_SYNC_MODE (PER_LED_BASIC_SYNC_MODE | SYNC_SETTING_JRAINBOW1 | SYNC_SETTING_JRAINBOW2 | SYNC_SETTING_JCORSAIR)
|
||||
#define PER_LED_BASIC_SYNC_MODE (MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB | MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD | MSI_COLOR_FLAG_SYNC_SETTING_JPIPE1 | MSI_COLOR_FLAG_SYNC_SETTING_JPIPE2)
|
||||
#define PER_LED_FULL_SYNC_MODE (PER_LED_BASIC_SYNC_MODE | MSI_COLOR_FLAG_SYNC_SETTING_JRAINBOW1 | MSI_COLOR_FLAG_SYNC_SETTING_JRAINBOW2 | MSI_COLOR_FLAG_SYNC_SETTING_JCORSAIR)
|
||||
|
||||
struct mystic_light_185_config
|
||||
{
|
||||
unsigned short pid; // PID of the board
|
||||
const char* name; // DMI board name for filtering (nullptr = match any name)
|
||||
int numof_onboard_leds; // number of onboard leds
|
||||
int numof_pipe1_leds; // number of pipe 1 leds (used in per LED mode only)
|
||||
int numof_pipe2_leds; // number of pipe 2 leds (used in per LED mode only)
|
||||
@@ -257,101 +256,102 @@ const std::vector<MSI_ZONE> zones_set21 =
|
||||
|
||||
static const mystic_light_185_config board_configs[] =
|
||||
{
|
||||
{ 0x7B93, 6, 1, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MPG X570 GAMING PRO CARBON WIFI
|
||||
{ 0x7C34, 0, 1, 1, 1, &zones_set8, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MEG X570 GODLIKE
|
||||
{ 0x7C35, 0, 1, 0, 1, &zones_set9, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MEG X570 ACE
|
||||
{ 0x7C36, 6, 1, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // PRESTIGE X570 CREATION
|
||||
{ 0x7C37, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MPG X570 GAMING PLUS
|
||||
{ 0x7C56, 6, 0, 0, 1, &zones_set2, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550 GAMING PLUS
|
||||
{ 0x7C59, 0, 8, 0, 1, &zones_set9, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // CREATOR TRX40
|
||||
{ 0x7C60, 6, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // TRX40-A PRO
|
||||
{ 0x7C67, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B365M MORTAR
|
||||
{ 0x7C71, 6, 6, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z490 ACE
|
||||
{ 0x7C73, 6, 4, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z490 GAMING CARBON WIFI
|
||||
{ 0x7C75, 6, 0, 0, 1, &zones_set2, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z490 GAMING PLUS
|
||||
{ 0x7C76, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // MPG Z490M GAMING EDGE
|
||||
{ 0x7C77, 0, 0, 0, 0, &zones_set14, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z490I UNIFY
|
||||
{ 0x7C79, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z490 GAMING EDGE WIFI
|
||||
{ 0x7C80, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z490 TOMAHAWK
|
||||
{ 0x7C02, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B450 TOMAHAWK MAX
|
||||
{ 0x7C81, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B460 TOMAHAWK
|
||||
{ 0x7C82, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B460M MORTAR WIFI
|
||||
{ 0x7C83, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // B460M PRO-VDH WIFI
|
||||
{ 0x7C84, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MAG X570 TOMAHAWK WIFI
|
||||
{ 0x7C86, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // MPG B460I GAMING EDGE
|
||||
{ 0x7C87, 6, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B450M BAZOOKA MAX WIFI
|
||||
{ 0x7C90, 6, 4, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550 GAMING CARBON WIFI
|
||||
{ 0x7C91, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B550 TOMAHAWK
|
||||
{ 0x7C92, 6, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550I GAMING EDGE WIFI
|
||||
{ 0x7C94, 6, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B550M MORTAR
|
||||
{ 0x7C95, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B550M PRO-VDH WIFI
|
||||
{ 0x7C98, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // Z490 PLUS
|
||||
{ 0x7D03, 0, 15, 18, 1, &zones_set8, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z590 GODLIKE
|
||||
{ 0x7D06, 4, 4, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z590 GAMING FORCE
|
||||
{ 0x7D07, 4, 5, 0, 2, &zones_set7, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z590 GAMING EDGE WIFI
|
||||
{ 0x7D08, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z590 TOMAHAWK
|
||||
{ 0x7D09, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // Z590-A PRO WIFI
|
||||
{ 0x7D13, 6, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG B550 UNIFY
|
||||
{ 0x7D14, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // A520M PRO
|
||||
{ 0x7D15, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560 TOMAHAWK WIFI
|
||||
{ 0x7D17, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560M MORTAR
|
||||
{ 0x7D18, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560M PRO-VDH
|
||||
{ 0x7D19, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B560I GAMIING EDGE WIFI
|
||||
{ 0x7D20, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560M PRO
|
||||
{ 0x7D25, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z690-A WIFI DDR4
|
||||
{ 0x7D27, 6, 0, 0, 2, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z690 ACE
|
||||
{ 0x7D28, 6, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z690 UNIFY-X
|
||||
{ 0x7D29, 6, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z690I UNIFY
|
||||
{ 0x7D30, 6, 6, 0, 2, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z690 CARBON WIFI
|
||||
{ 0x7D31, 4, 8, 0, 2, &zones_set12, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG EDGE WIFI DDR4
|
||||
{ 0x7D32, 1, 0, 0, 1, &zones_set10, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z690 TOMAHAWK WIFI DDR4
|
||||
{ 0x7D33, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z790-VC WIFI
|
||||
{ 0x7D36, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z690-P DDR4
|
||||
{ 0x7D37, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B760M-VC WIFI (MS-7D37) - fans on JRAINBOW2
|
||||
{ 0x7D38, 0, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z590 UNIFY-X
|
||||
{ 0x7D40, 0, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B760i EDGE WIFI DDR4
|
||||
{ 0x7D41, 6, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B660M TOMAHAWK WIFI DDR4
|
||||
{ 0x7D42, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B660 MORTAR WIFI DDR4
|
||||
{ 0x7D43, 0, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B660M-A WIFI DDR4
|
||||
{ 0x7D46, 0, 1, 1, 0, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO H610M-G DDR4
|
||||
{ 0x7D50, 6, 12, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG X570S ACE MAX
|
||||
{ 0x7D51, 6, 0, 0, 2, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG X570S UNIFY-X MAX
|
||||
{ 0x7D52, 6, 14, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG X570S CARBON EK X
|
||||
{ 0x7D53, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG X570S EDGE MAX WIFI
|
||||
{ 0x7D54, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG X570S TOMAHAWK MAX WIFI
|
||||
{ 0x7D59, 0, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B660-A DDR4
|
||||
{ 0x7D67, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO X670-P WIFI
|
||||
{ 0x7D69, 9, 2, 4, 1, &zones_set15, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG X670E ACE
|
||||
{ 0x7D70, 0, 6, 0, 1, &zones_set9, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG X670E Carbon WIFI
|
||||
{ 0x7D73, 1, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B650I EDGE WIFI
|
||||
{ 0x7D74, 0, 6, 0, 1, &zones_set18, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B650 CARBON WIFI
|
||||
{ 0x7D75, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B650 TOMAHAWK WIFI
|
||||
{ 0x7D76, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B650M MORTAR WIFI
|
||||
{ 0x7D77, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B650M-A WIFI
|
||||
{ 0x7D78, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B650-P WIFI
|
||||
{ 0x7D86, 0, 18, 4, 1, &zones_set16, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z790 ACE
|
||||
{ 0x7D88, 0, 0, 0, 1, &zones_set20, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z790-S WIFI
|
||||
{ 0x7D89, 0, 6, 0, 1, &zones_set18, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z790 CARBON WIFI
|
||||
{ 0x7D90, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B760M BOMBER DDR4
|
||||
{ 0x7D91, 1, 0, 0, 1, &zones_set10, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z790 TOMAHAWK WIFI
|
||||
{ 0x7D93, 6, 0, 0, 1, &zones_set2, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // Z790 GAMING PRO WIFI
|
||||
{ 0x7D96, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B760 TOMAHAWK WIFI DDR5
|
||||
{ 0x7D97, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B660 MORTAR MAX WIFI DDR4
|
||||
{ 0x7D98, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B760-P WIFI DDR4
|
||||
{ 0x7D99, 6, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B760M-A WIFI DDR4
|
||||
{ 0x7E01, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B760M MORTAR MAX
|
||||
{ 0x7E03, 6, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z790I EDGE WIFI
|
||||
{ 0x7E06, 0, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z790-P WIFI DDR4
|
||||
{ 0x7E07, 0, 0, 0, 2, &zones_set10, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z790-A WIFI DDR4
|
||||
{ 0x7E09, 0, 0, 0, 0, &zones_set19, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B650M PROJECT ZERO
|
||||
{ 0x7E10, 0, 6, 0, 2, &zones_set17, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B650 EDGE WIFI
|
||||
{ 0x7E12, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG X670E TOMAHAWK WIFI
|
||||
{ 0x0076, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG X670E TOMAHAWK WIFI (Common PID)
|
||||
{ 0x7E16, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // X670E GAMING PLUS WIFI
|
||||
{ 0x7E24, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B650M GAMING PLUS WIFI
|
||||
{ 0x7E26, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B650 GAMING PLUS WIFI
|
||||
{ 0x7E27, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B650M-P
|
||||
{ 0x7E28, 6, 0, 0, 2, &zones_set21, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MSI PRO A620M-B (MS-7E28)
|
||||
{ 0x7B93, nullptr, 6, 1, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MPG X570 GAMING PRO CARBON WIFI
|
||||
{ 0x7C34, nullptr, 0, 1, 1, 1, &zones_set8, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MEG X570 GODLIKE
|
||||
{ 0x7C35, nullptr, 0, 1, 0, 1, &zones_set9, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MEG X570 ACE
|
||||
{ 0x7C36, nullptr, 6, 1, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // PRESTIGE X570 CREATION
|
||||
{ 0x7C37, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MPG X570 GAMING PLUS
|
||||
{ 0x7C56, "MSI B550-A PRO (MS-7C56)", 6, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550-A PRO
|
||||
{ 0x7C56, "MSI MPG B550 GAMING PLUS (MS-7C56)", 6, 0, 0, 1, &zones_set2, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550 GAMING PLUS
|
||||
{ 0x7C59, nullptr, 0, 8, 0, 1, &zones_set9, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // CREATOR TRX40
|
||||
{ 0x7C60, nullptr, 6, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // TRX40-A PRO
|
||||
{ 0x7C67, nullptr, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B365M MORTAR
|
||||
{ 0x7C71, nullptr, 6, 6, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z490 ACE
|
||||
{ 0x7C73, nullptr, 6, 4, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z490 GAMING CARBON WIFI
|
||||
{ 0x7C75, nullptr, 6, 0, 0, 1, &zones_set2, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z490 GAMING PLUS
|
||||
{ 0x7C76, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // MPG Z490M GAMING EDGE
|
||||
{ 0x7C77, nullptr, 0, 0, 0, 0, &zones_set14, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z490I UNIFY
|
||||
{ 0x7C79, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z490 GAMING EDGE WIFI
|
||||
{ 0x7C80, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z490 TOMAHAWK
|
||||
{ 0x7C02, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B450 TOMAHAWK MAX
|
||||
{ 0x7C81, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B460 TOMAHAWK
|
||||
{ 0x7C82, nullptr, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B460M MORTAR WIFI
|
||||
{ 0x7C83, nullptr, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // B460M PRO-VDH WIFI
|
||||
{ 0x7C84, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MAG X570 TOMAHAWK WIFI
|
||||
{ 0x7C86, nullptr, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_DISABLED }, // MPG B460I GAMING EDGE
|
||||
{ 0x7C87, nullptr, 6, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B450M BAZOOKA MAX WIFI
|
||||
{ 0x7C90, nullptr, 6, 4, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550 GAMING CARBON WIFI
|
||||
{ 0x7C91, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B550 TOMAHAWK
|
||||
{ 0x7C92, nullptr, 6, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B550I GAMING EDGE WIFI
|
||||
{ 0x7C94, nullptr, 6, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B550M MORTAR
|
||||
{ 0x7C95, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B550M PRO-VDH WIFI
|
||||
{ 0x7C98, nullptr, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // Z490 PLUS
|
||||
{ 0x7D03, nullptr, 0, 15, 18, 1, &zones_set8, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z590 GODLIKE
|
||||
{ 0x7D06, nullptr, 4, 4, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z590 GAMING FORCE
|
||||
{ 0x7D07, nullptr, 4, 5, 0, 2, &zones_set7, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z590 GAMING EDGE WIFI
|
||||
{ 0x7D08, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z590 TOMAHAWK
|
||||
{ 0x7D09, nullptr, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // Z590-A PRO WIFI
|
||||
{ 0x7D13, nullptr, 6, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG B550 UNIFY
|
||||
{ 0x7D14, nullptr, 6, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // A520M PRO
|
||||
{ 0x7D15, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560 TOMAHAWK WIFI
|
||||
{ 0x7D17, nullptr, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560M MORTAR
|
||||
{ 0x7D18, nullptr, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560M PRO-VDH
|
||||
{ 0x7D19, nullptr, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B560I GAMIING EDGE WIFI
|
||||
{ 0x7D20, nullptr, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B560M PRO
|
||||
{ 0x7D25, nullptr, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z690-A WIFI DDR4
|
||||
{ 0x7D27, nullptr, 6, 0, 0, 2, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z690 ACE
|
||||
{ 0x7D28, nullptr, 6, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z690 UNIFY-X
|
||||
{ 0x7D29, nullptr, 6, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z690I UNIFY
|
||||
{ 0x7D30, nullptr, 6, 6, 0, 2, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z690 CARBON WIFI
|
||||
{ 0x7D31, nullptr, 4, 8, 0, 2, &zones_set12, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG EDGE WIFI DDR4
|
||||
{ 0x7D32, nullptr, 1, 0, 0, 1, &zones_set10, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z690 TOMAHAWK WIFI DDR4
|
||||
{ 0x7D33, nullptr, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z790-VC WIFI
|
||||
{ 0x7D36, nullptr, 6, 0, 0, 2, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z690-P DDR4
|
||||
{ 0x7D37, nullptr, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B760M-VC WIFI (MS-7D37) - fans on JRAINBOW2
|
||||
{ 0x7D38, nullptr, 0, 0, 0, 1, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z590 UNIFY-X
|
||||
{ 0x7D40, nullptr, 0, 0, 0, 1, &zones_set5, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B760i EDGE WIFI DDR4
|
||||
{ 0x7D41, nullptr, 6, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B660M TOMAHAWK WIFI DDR4
|
||||
{ 0x7D42, nullptr, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B660 MORTAR WIFI DDR4
|
||||
{ 0x7D43, nullptr, 0, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B660M-A WIFI DDR4
|
||||
{ 0x7D46, nullptr, 0, 1, 1, 0, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO H610M-G DDR4
|
||||
{ 0x7D50, nullptr, 6, 12, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG X570S ACE MAX
|
||||
{ 0x7D51, nullptr, 6, 0, 0, 2, &zones_set1, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG X570S UNIFY-X MAX
|
||||
{ 0x7D52, nullptr, 6, 14, 0, 1, &zones_set3, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG X570S CARBON EK X
|
||||
{ 0x7D53, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG X570S EDGE MAX WIFI
|
||||
{ 0x7D54, nullptr, 6, 0, 0, 2, &zones_set0, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG X570S TOMAHAWK MAX WIFI
|
||||
{ 0x7D59, nullptr, 0, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B660-A DDR4
|
||||
{ 0x7D67, nullptr, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO X670-P WIFI
|
||||
{ 0x7D69, nullptr, 9, 2, 4, 1, &zones_set15, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG X670E ACE
|
||||
{ 0x7D70, nullptr, 0, 6, 0, 1, &zones_set9, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG X670E Carbon WIFI
|
||||
{ 0x7D73, nullptr, 1, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B650I EDGE WIFI
|
||||
{ 0x7D74, nullptr, 0, 6, 0, 1, &zones_set18, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B650 CARBON WIFI
|
||||
{ 0x7D75, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B650 TOMAHAWK WIFI
|
||||
{ 0x7D76, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B650M MORTAR WIFI
|
||||
{ 0x7D77, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B650M-A WIFI
|
||||
{ 0x7D78, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B650-P WIFI
|
||||
{ 0x7D86, nullptr, 0, 18, 4, 1, &zones_set16, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MEG Z790 ACE
|
||||
{ 0x7D88, nullptr, 0, 0, 0, 1, &zones_set20, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z790-S WIFI
|
||||
{ 0x7D89, nullptr, 0, 6, 0, 1, &zones_set18, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z790 CARBON WIFI
|
||||
{ 0x7D90, nullptr, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B760M BOMBER DDR4
|
||||
{ 0x7D91, nullptr, 1, 0, 0, 1, &zones_set10, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG Z790 TOMAHAWK WIFI
|
||||
{ 0x7D93, nullptr, 6, 0, 0, 1, &zones_set2, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // Z790 GAMING PRO WIFI
|
||||
{ 0x7D96, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B760 TOMAHAWK WIFI DDR5
|
||||
{ 0x7D97, nullptr, 6, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B660 MORTAR MAX WIFI DDR4
|
||||
{ 0x7D98, nullptr, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B760-P WIFI DDR4
|
||||
{ 0x7D99, nullptr, 6, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B760M-A WIFI DDR4
|
||||
{ 0x7E01, nullptr, 0, 0, 0, 1, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG B760M MORTAR MAX
|
||||
{ 0x7E03, nullptr, 6, 0, 0, 0, &zones_set6, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG Z790I EDGE WIFI
|
||||
{ 0x7E06, nullptr, 0, 0, 0, 2, &zones_set11, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z790-P WIFI DDR4
|
||||
{ 0x7E07, nullptr, 0, 0, 0, 2, &zones_set10, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO Z790-A WIFI DDR4
|
||||
{ 0x7E09, nullptr, 0, 0, 0, 0, &zones_set19, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B650M PROJECT ZERO
|
||||
{ 0x7E10, nullptr, 0, 6, 0, 2, &zones_set17, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MPG B650 EDGE WIFI
|
||||
{ 0x7E12, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG X670E TOMAHAWK WIFI
|
||||
{ 0x0076, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // MAG X670E TOMAHAWK WIFI (Common PID)
|
||||
{ 0x7E16, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // X670E GAMING PLUS WIFI
|
||||
{ 0x7E24, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B650M GAMING PLUS WIFI
|
||||
{ 0x7E26, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // B650 GAMING PLUS WIFI
|
||||
{ 0x7E27, nullptr, 0, 0, 0, 2, &zones_set13, MSIMotherboard185Controller::DIRECT_MODE_PER_LED }, // PRO B650M-P
|
||||
{ 0x7E28, nullptr, 6, 0, 0, 2, &zones_set21, MSIMotherboard185Controller::DIRECT_MODE_ZONE_BASED }, // MSI PRO A620M-B (MS-7E28)
|
||||
};
|
||||
|
||||
|
||||
@@ -365,24 +365,46 @@ Color* per_led_jrainbow1_sync;
|
||||
Color* per_led_jrainbow2_sync;
|
||||
Color* per_led_jcorsair_sync;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Static helper to check if a zone is supported by the |
|
||||
| given supported_zones vector |
|
||||
\*-----------------------------------------------------*/
|
||||
bool MSIMotherboard185Controller::IsZoneSupported(MSI_ZONE zone, const std::vector<MSI_ZONE>* supported_zones)
|
||||
{
|
||||
if(supported_zones == nullptr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return std::find(supported_zones->begin(), supported_zones->end(), zone) != supported_zones->end();
|
||||
}
|
||||
|
||||
MSIMotherboard185Controller::MSIMotherboard185Controller(hid_device* handle, const char* path, unsigned short pid, std::string dev_name)
|
||||
{
|
||||
dev = handle;
|
||||
location = path;
|
||||
name = dev_name;
|
||||
|
||||
if(dev)
|
||||
{
|
||||
ReadFwVersion();
|
||||
ReadSettings();
|
||||
}
|
||||
/*-----------------------------------------------------*\
|
||||
| Perform initial reads - get the controller's firmware |
|
||||
| version and then read the controller's active |
|
||||
| configuration data |
|
||||
\*-----------------------------------------------------*/
|
||||
ReadFwVersion();
|
||||
ReadConfigurationData();
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Common PID boards embed their virtual PID in the |
|
||||
| serial number, extract it |
|
||||
\*-----------------------------------------------------*/
|
||||
if(pid == MSI_USB_PID_COMMON)
|
||||
{
|
||||
std::string pidStr(GetSerial().substr(0, 4));
|
||||
pid = std::stoi(pidStr, nullptr, 16);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Determine if this board has mixed-mode support |
|
||||
\*-----------------------------------------------------*/
|
||||
mixed_mode_support = false;
|
||||
|
||||
if(pid >= 0x7D03)
|
||||
@@ -391,22 +413,57 @@ MSIMotherboard185Controller::MSIMotherboard185Controller(hid_device* handle, con
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Initialize save flag and some static settings |
|
||||
| The last byte of the packet is the save flag. This |
|
||||
| byte is stored as a zero in the data flash, but is |
|
||||
| set to 1 at the protocol level to tell the firmware |
|
||||
| to save the active configuration to flash. |
|
||||
\*-----------------------------------------------------*/
|
||||
data.save_data = 0;
|
||||
data.on_board_led.colorFlags = 0x80 | SYNC_SETTING_ONBOARD; // always enable onboard sync flag to have expected zone control
|
||||
configuration_data.save_data = 0;
|
||||
|
||||
configuration_data.on_board_led.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR | MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD; // always enable onboard sync flag to have expected zone control
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Search for the board configuration matching this |
|
||||
| board. |
|
||||
\*-----------------------------------------------------*/
|
||||
const mystic_light_185_config* board_config = nullptr;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| First pass: look for a config that matches both PID |
|
||||
| and board name (when name is specified in the config) |
|
||||
\*-----------------------------------------------------*/
|
||||
for(std::size_t i = 0; i < NUMOF_CONFIGS; ++i)
|
||||
{
|
||||
if(board_configs[i].pid == pid)
|
||||
if(board_configs[i].pid == pid && board_configs[i].name != nullptr)
|
||||
{
|
||||
board_config = &board_configs[i];
|
||||
break;
|
||||
if(name.find(board_configs[i].name) != std::string::npos)
|
||||
{
|
||||
board_config = &board_configs[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Second pass: fall back to PID-only match for entries |
|
||||
| without a name filter (backward compatible) |
|
||||
\*-----------------------------------------------------*/
|
||||
if(board_config == nullptr)
|
||||
{
|
||||
for(std::size_t i = 0; i < NUMOF_CONFIGS; ++i)
|
||||
{
|
||||
if(board_configs[i].pid == pid && board_configs[i].name == nullptr)
|
||||
{
|
||||
board_config = &board_configs[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Fill in the number of each zone type based on the |
|
||||
| board configuration |
|
||||
\*-----------------------------------------------------*/
|
||||
if(board_config != nullptr)
|
||||
{
|
||||
numof_onboard_leds = board_config->numof_onboard_leds;
|
||||
@@ -481,87 +538,53 @@ MSIMotherboard185Controller::MSIMotherboard185Controller(hid_device* handle, con
|
||||
| Set up per-LED switching message for synchronized |
|
||||
| mode. |
|
||||
\*-----------------------------------------------------*/
|
||||
memset(&enable_per_led_msg, 0, sizeof(enable_per_led_msg));
|
||||
enable_per_led_msg.j_rgb_1.speedAndBrightnessFlags = 0x08;
|
||||
enable_per_led_msg.j_rgb_1.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_rgb_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.j_pipe_1.speedAndBrightnessFlags = 0x2A;
|
||||
enable_per_led_msg.j_pipe_1.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_pipe_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.j_pipe_2.speedAndBrightnessFlags = 0x2A;
|
||||
enable_per_led_msg.j_pipe_2.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_pipe_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.j_rainbow_1.speedAndBrightnessFlags = 0x29;
|
||||
enable_per_led_msg.j_rainbow_1.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_rainbow_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.j_rainbow_1.cycle_or_led_num = 0x28;
|
||||
enable_per_led_msg.j_rainbow_2.speedAndBrightnessFlags = 0x29;
|
||||
enable_per_led_msg.j_rainbow_2.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_rainbow_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.j_rainbow_2.cycle_or_led_num = 0x28;
|
||||
enable_per_led_msg.j_corsair.fan_flags = 0x29;
|
||||
enable_per_led_msg.j_corsair.corsair_quantity = 0x00;
|
||||
enable_per_led_msg.j_corsair.padding[2] = 0x82;
|
||||
enable_per_led_msg.j_corsair.is_individual = 0x78;
|
||||
enable_per_led_msg.j_corsair_outerll120.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.j_corsair_outerll120.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_corsair_outerll120.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led.effect = MSI_DIRECT_MODE;
|
||||
enable_per_led_msg.on_board_led.speedAndBrightnessFlags = 0x29 | SYNC_SETTING_JRGB;
|
||||
enable_per_led_msg.on_board_led.speedAndBrightnessFlags = 0x29 | MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
enable_per_led_msg.on_board_led.colorFlags = PER_LED_FULL_SYNC_MODE;
|
||||
enable_per_led_msg.on_board_led_1.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_1.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_2.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_2.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_3.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_3.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_3.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_4.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_4.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_4.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_5.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_5.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_5.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_6.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_6.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_6.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_7.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_7.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_7.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_8.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_8.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_8.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.on_board_led_9.speedAndBrightnessFlags = 0x28;
|
||||
enable_per_led_msg.on_board_led_9.colorFlags = 0x80;
|
||||
enable_per_led_msg.on_board_led_9.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.j_rgb_2.speedAndBrightnessFlags = 0x2A;
|
||||
enable_per_led_msg.j_rgb_2.colorFlags = 0x80;
|
||||
enable_per_led_msg.j_rgb_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
enable_per_led_msg.save_data = 0;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Initialize zone based per LED data |
|
||||
\*-----------------------------------------------------*/
|
||||
zone_based_per_led_data.j_rgb_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.j_rgb_1.colorFlags = BITSET(zone_based_per_led_data.j_rgb_1.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.j_pipe_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.j_pipe_1.colorFlags = BITSET(zone_based_per_led_data.j_pipe_1.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.j_pipe_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.j_pipe_2.colorFlags = BITSET(zone_based_per_led_data.j_pipe_2.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.j_rainbow_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.j_rainbow_1.colorFlags = BITSET(zone_based_per_led_data.j_rainbow_1.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.j_rainbow_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.j_rainbow_2.colorFlags = BITSET(zone_based_per_led_data.j_rainbow_2.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led.colorFlags = BITSET(zone_based_per_led_data.on_board_led.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_1.colorFlags = BITSET(zone_based_per_led_data.on_board_led_1.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_2.colorFlags = BITSET(zone_based_per_led_data.on_board_led_2.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_3.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_3.colorFlags = BITSET(zone_based_per_led_data.on_board_led_3.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_4.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_4.colorFlags = BITSET(zone_based_per_led_data.on_board_led_4.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_5.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_5.colorFlags = BITSET(zone_based_per_led_data.on_board_led_5.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_6.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2 << 2;
|
||||
zone_based_per_led_data.on_board_led_6.colorFlags = BITSET(zone_based_per_led_data.on_board_led_6.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_7.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100;
|
||||
zone_based_per_led_data.on_board_led_7.colorFlags = BITSET(zone_based_per_led_data.on_board_led_7.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_8.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_8.colorFlags = BITSET(zone_based_per_led_data.on_board_led_8.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.on_board_led_9.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.on_board_led_9.colorFlags = BITSET(zone_based_per_led_data.on_board_led_9.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.j_rgb_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << 2;
|
||||
zone_based_per_led_data.j_rgb_2.colorFlags = BITSET(zone_based_per_led_data.j_rgb_2.colorFlags, true, 7u);
|
||||
zone_based_per_led_data.save_data = 0;
|
||||
|
||||
direct_mode = false;
|
||||
sync_direct_mode = true;
|
||||
direct_mode = false;
|
||||
direct_mode_configured = false;
|
||||
sync_direct_mode = true;
|
||||
}
|
||||
|
||||
MSIMotherboard185Controller::~MSIMotherboard185Controller()
|
||||
@@ -583,51 +606,83 @@ void MSIMotherboard185Controller::SetMode
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneData* zone_data = GetZoneData(data, zone);
|
||||
/*-----------------------------------------------------*\
|
||||
| Get the zone data pointer within the configuration |
|
||||
| data buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
ZoneData* zone_data = GetZoneData(configuration_data, zone);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Return if zone is invalid |
|
||||
\*-----------------------------------------------------*/
|
||||
if(zone_data == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Update the zone's mode and mode parameters |
|
||||
\*-----------------------------------------------------*/
|
||||
zone_data->effect = mode;
|
||||
zone_data->speedAndBrightnessFlags = (brightness << 2) | (speed & 0x03);
|
||||
zone_data->colorFlags = BITSET(zone_data->colorFlags, !rainbow_color, 7u);
|
||||
zone_data->speedAndBrightnessFlags = ((brightness << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK)
|
||||
| ((speed << MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
zone_data->colorFlags = (rainbow_color ? 0 : MSI_COLOR_FLAG_USE_CUSTOM_COLOR);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| J_RAINBOW_3 zone needs padding of 4 |
|
||||
\*-----------------------------------------------------*/
|
||||
zone == MSI_ZONE_J_RAINBOW_3 ? zone_data->padding = 4 : zone_data->padding = 0;
|
||||
|
||||
ZoneData* on_board_zone = GetZoneData(data, MSI_ZONE_ON_BOARD_LED_0);
|
||||
/*-----------------------------------------------------*\
|
||||
| Get the zone data pointer to the on-board LED 0 zone |
|
||||
\*-----------------------------------------------------*/
|
||||
ZoneData* on_board_zone = GetZoneData(configuration_data, MSI_ZONE_ON_BOARD_LED_0);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| If the zone is JRGB or JPIPE and the board has no |
|
||||
| onboard LEDs, set the onboard zone to this zone's |
|
||||
| settings |
|
||||
\*-----------------------------------------------------*/
|
||||
if(no_onboards && ((zone == MSI_ZONE_J_RGB_1) || (zone == MSI_ZONE_J_RGB_2) || (zone == MSI_ZONE_J_PIPE_1) || (zone == MSI_ZONE_J_PIPE_2)))
|
||||
{
|
||||
on_board_zone->effect = zone_data->effect;
|
||||
on_board_zone->speedAndBrightnessFlags = zone_data->speedAndBrightnessFlags;
|
||||
on_board_zone->colorFlags = zone_data->colorFlags;
|
||||
on_board_zone->colorFlags |= SYNC_SETTING_ONBOARD;
|
||||
on_board_zone->padding = 0x00;
|
||||
on_board_zone->effect = zone_data->effect;
|
||||
on_board_zone->speedAndBrightnessFlags = zone_data->speedAndBrightnessFlags;
|
||||
on_board_zone->colorFlags = zone_data->colorFlags;
|
||||
on_board_zone->colorFlags |= MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD;
|
||||
on_board_zone->padding = 0x00;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| For modes above MSI_MODE_LIGHTNING, set the onboard |
|
||||
| zone to sync with JRGB, JPIPE1, and JPIPE2 |
|
||||
\*-----------------------------------------------------*/
|
||||
if(mode > MSI_MODE_LIGHTNING)
|
||||
{
|
||||
on_board_zone->speedAndBrightnessFlags |= SYNC_SETTING_JRGB;
|
||||
on_board_zone->colorFlags |= (SYNC_SETTING_JPIPE1 | SYNC_SETTING_JPIPE2);
|
||||
on_board_zone->speedAndBrightnessFlags |= MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
on_board_zone->colorFlags |= (MSI_COLOR_FLAG_SYNC_SETTING_JPIPE1 | MSI_COLOR_FLAG_SYNC_SETTING_JPIPE2);
|
||||
}
|
||||
else
|
||||
{
|
||||
on_board_zone->speedAndBrightnessFlags &= ~SYNC_SETTING_JRGB;
|
||||
on_board_zone->colorFlags &= ~(SYNC_SETTING_JPIPE1 | SYNC_SETTING_JPIPE2);
|
||||
on_board_zone->speedAndBrightnessFlags &= ~MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB;
|
||||
on_board_zone->colorFlags &= ~(MSI_COLOR_FLAG_SYNC_SETTING_JPIPE1 | MSI_COLOR_FLAG_SYNC_SETTING_JPIPE2);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| For modes at or below MSI_MODE_LIGHTNING, set all |
|
||||
| onboard LED zones to match onboard LED zone 0 |
|
||||
\*-----------------------------------------------------*/
|
||||
if((zone == MSI_ZONE_ON_BOARD_LED_0) && (mode <= MSI_MODE_LIGHTNING))
|
||||
{
|
||||
for(int i = 0; i < numof_onboard_leds; ++i)
|
||||
{
|
||||
zone_data = GetZoneData(data, (MSI_ZONE)((int)MSI_ZONE_ON_BOARD_LED_1 + i));
|
||||
zone_data = GetZoneData(configuration_data, (MSI_ZONE)((int)MSI_ZONE_ON_BOARD_LED_1 + i));
|
||||
|
||||
if(zone_data != nullptr)
|
||||
{
|
||||
zone_data->effect = mode;
|
||||
zone_data->speedAndBrightnessFlags = (brightness << 2) | (speed & 0x03);
|
||||
zone_data->colorFlags = BITSET(zone_data->colorFlags, !rainbow_color, 7u);
|
||||
zone_data->speedAndBrightnessFlags = ((brightness << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK)
|
||||
| ((speed << MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
zone_data->colorFlags = (rainbow_color ? 0 : MSI_COLOR_FLAG_USE_CUSTOM_COLOR);
|
||||
zone_data->padding = 0x00;
|
||||
}
|
||||
}
|
||||
@@ -662,12 +717,33 @@ std::string MSIMotherboard185Controller::GetSerial()
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
bool MSIMotherboard185Controller::ReadSettings()
|
||||
bool MSIMotherboard185Controller::ReadConfigurationData()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Read packet from hardware, return true if successful |
|
||||
\*-----------------------------------------------------*/
|
||||
return (hid_get_feature_report(dev, (unsigned char*)&data, sizeof(data)) == sizeof data);
|
||||
int ret = hid_get_feature_report(dev, (unsigned char*)&configuration_data, sizeof(configuration_data));
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Log the configuration data in hex at TRACE level |
|
||||
\*-----------------------------------------------------*/
|
||||
if(LogManager::get()->GetLogLevel() >= LL_TRACE)
|
||||
{
|
||||
LOG_TRACE("[MSIMotherboard185Controller] Read configuration data packet (%zu bytes):", sizeof(configuration_data));
|
||||
for(size_t i = 0; i < sizeof(configuration_data); i += 16)
|
||||
{
|
||||
std::string hex_line = "";
|
||||
for(size_t j = i; j < i + 16 && j < sizeof(configuration_data); j++)
|
||||
{
|
||||
char buf[4];
|
||||
snprintf(buf, sizeof(buf), "%02X ", ((unsigned char*)&configuration_data)[j]);
|
||||
hex_line += buf;
|
||||
}
|
||||
LOG_TRACE(" %04zX: %s", i, hex_line.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
return(ret == sizeof configuration_data);
|
||||
}
|
||||
|
||||
bool MSIMotherboard185Controller::Update
|
||||
@@ -682,53 +758,109 @@ bool MSIMotherboard185Controller::Update
|
||||
{
|
||||
if(per_led_mode == DIRECT_MODE_PER_LED)
|
||||
{
|
||||
/*---------------------------------------------*\
|
||||
| Skip sending update if there are no LEDs |
|
||||
| configured |
|
||||
\*---------------------------------------------*/
|
||||
bool has_active_per_led_data = false;
|
||||
|
||||
if(!no_onboards)
|
||||
{
|
||||
has_active_per_led_data = true;
|
||||
}
|
||||
if(!no_jrainbow1)
|
||||
{
|
||||
has_active_per_led_data = true;
|
||||
}
|
||||
if(!no_jrainbow2)
|
||||
{
|
||||
has_active_per_led_data = true;
|
||||
}
|
||||
if(!no_jcorsair)
|
||||
{
|
||||
has_active_per_led_data = true;
|
||||
}
|
||||
|
||||
if(!has_active_per_led_data)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*---------------------------------------------*\
|
||||
| Ensure the enable per-LED mode message has |
|
||||
| been sent before sending the per-LED data |
|
||||
\*---------------------------------------------*/
|
||||
if(!direct_mode_configured)
|
||||
{
|
||||
if(!SelectPerLedProtocol())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(sync_direct_mode)
|
||||
{
|
||||
return (hid_send_feature_report(dev, (unsigned char*)&per_led_data_onboard_and_sync, sizeof(per_led_data_onboard_and_sync)) == sizeof(per_led_data_onboard_and_sync));
|
||||
return(hid_send_feature_report(dev, (unsigned char*)&per_led_data_onboard_and_sync, sizeof(per_led_data_onboard_and_sync)) == sizeof(per_led_data_onboard_and_sync));
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!no_jrainbow1)
|
||||
{
|
||||
(void)hid_send_feature_report(dev, (unsigned char*)&per_led_data_jrainbow1, sizeof(per_led_data_jrainbow1));
|
||||
hid_send_feature_report(dev, (unsigned char*)&per_led_data_jrainbow1, sizeof(per_led_data_jrainbow1));
|
||||
std::this_thread::sleep_for(13ms);
|
||||
}
|
||||
if(!no_jrainbow2)
|
||||
{
|
||||
(void)hid_send_feature_report(dev, (unsigned char*)&per_led_data_jrainbow2, sizeof(per_led_data_jrainbow2));
|
||||
hid_send_feature_report(dev, (unsigned char*)&per_led_data_jrainbow2, sizeof(per_led_data_jrainbow2));
|
||||
std::this_thread::sleep_for(13ms);
|
||||
}
|
||||
if(!no_jcorsair)
|
||||
{
|
||||
(void)hid_send_feature_report(dev, (unsigned char*)&per_led_data_jcorsair, sizeof(per_led_data_jcorsair));
|
||||
hid_send_feature_report(dev, (unsigned char*)&per_led_data_jcorsair, sizeof(per_led_data_jcorsair));
|
||||
std::this_thread::sleep_for(13ms);
|
||||
}
|
||||
return (hid_send_feature_report(dev, (unsigned char*)&per_led_data_onboard_and_sync, sizeof(per_led_data_onboard_and_sync)) == sizeof(per_led_data_onboard_and_sync));
|
||||
return(hid_send_feature_report(dev, (unsigned char*)&per_led_data_onboard_and_sync, sizeof(per_led_data_onboard_and_sync)) == sizeof(per_led_data_onboard_and_sync));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return (hid_send_feature_report(dev, (unsigned char*)&zone_based_per_led_data, sizeof(zone_based_per_led_data)) == sizeof(zone_based_per_led_data));
|
||||
return(hid_send_feature_report(dev, (unsigned char*)&configuration_data, sizeof(configuration_data)) == sizeof(configuration_data));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Save new state, read current state from board, |
|
||||
| send old state first, then new state. |
|
||||
| Windows Mystic Light sends two consecutive |
|
||||
| reports. |
|
||||
| Set the save flag |
|
||||
\*-------------------------------------------------*/
|
||||
FeaturePacket_185 new_data = data;
|
||||
memcpy((unsigned char*)&new_data, (unsigned char*)&data, sizeof(data));
|
||||
configuration_data.save_data = save;
|
||||
|
||||
ReadSettings();
|
||||
data.save_data = save;
|
||||
hid_send_feature_report(dev, (unsigned char*)&data, sizeof(data));
|
||||
/*-------------------------------------------------*\
|
||||
| Save a copy of the new configuration data |
|
||||
\*-------------------------------------------------*/
|
||||
FeaturePacket_185 new_configuration;
|
||||
|
||||
memcpy((unsigned char*)&data, (unsigned char*)&new_data, sizeof(data));
|
||||
data.save_data = save;
|
||||
return (hid_send_feature_report(dev, (unsigned char*)&data, sizeof(data)) == sizeof(data));
|
||||
memcpy((unsigned char*)&new_configuration, (unsigned char*)&configuration_data, sizeof(configuration_data));
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Read the existing configuration data |
|
||||
\*-------------------------------------------------*/
|
||||
ReadConfigurationData();
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| First, send a copy of the existing configuration |
|
||||
| data |
|
||||
\*-------------------------------------------------*/
|
||||
hid_send_feature_report(dev, (unsigned char*)&configuration_data, sizeof(configuration_data));
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Second, restore the new configuration data into |
|
||||
| the buffer and then send it. MSI software on |
|
||||
| Windows sends the old data followed by new data |
|
||||
| so this mimics that flow. |
|
||||
\*-------------------------------------------------*/
|
||||
memcpy((unsigned char*)&configuration_data, (unsigned char*)&new_configuration, sizeof(new_configuration));
|
||||
|
||||
return(hid_send_feature_report(dev, (unsigned char*)&configuration_data, sizeof(configuration_data)) == sizeof(configuration_data));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -748,13 +880,23 @@ void MSIMotherboard185Controller::SetZoneColor
|
||||
return;
|
||||
}
|
||||
|
||||
ZoneData* zone_data = GetZoneData(data, zone);
|
||||
/*-----------------------------------------------------*\
|
||||
| Get the zone data pointer within the configuration |
|
||||
| data buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
ZoneData* zone_data = GetZoneData(configuration_data, zone);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Return if zone is invalid |
|
||||
\*-----------------------------------------------------*/
|
||||
if(zone_data == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set the colors in the zone data |
|
||||
\*-----------------------------------------------------*/
|
||||
zone_data->color.R = red1;
|
||||
zone_data->color.G = grn1;
|
||||
zone_data->color.B = blu1;
|
||||
@@ -762,9 +904,14 @@ void MSIMotherboard185Controller::SetZoneColor
|
||||
zone_data->color2.G = grn2;
|
||||
zone_data->color2.B = blu2;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| If the zone is JRGB or JPIPE and the board has no |
|
||||
| onboard LEDs, set the onboard zone's colors to this |
|
||||
| zone's colors |
|
||||
\*-----------------------------------------------------*/
|
||||
if(no_onboards && ((zone == MSI_ZONE_J_RGB_1) || (zone == MSI_ZONE_J_RGB_2) || (zone == MSI_ZONE_J_PIPE_1) || (zone == MSI_ZONE_J_PIPE_2)))
|
||||
{
|
||||
ZoneData* on_board_zone = GetZoneData(data, MSI_ZONE_ON_BOARD_LED_0);
|
||||
ZoneData* on_board_zone = GetZoneData(configuration_data, MSI_ZONE_ON_BOARD_LED_0);
|
||||
|
||||
on_board_zone->color.R = red1;
|
||||
on_board_zone->color.G = grn1;
|
||||
@@ -774,11 +921,15 @@ void MSIMotherboard185Controller::SetZoneColor
|
||||
on_board_zone->color2.B = blu2;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set all onboard LED zones' colors to match onboard |
|
||||
| LED 0 |
|
||||
\*-----------------------------------------------------*/
|
||||
if(zone == MSI_ZONE_ON_BOARD_LED_0)
|
||||
{
|
||||
for(int i = 0; i < numof_onboard_leds; ++i)
|
||||
{
|
||||
zone_data = GetZoneData(data, (MSI_ZONE)((int)MSI_ZONE_ON_BOARD_LED_1 + i));
|
||||
zone_data = GetZoneData(configuration_data, (MSI_ZONE)((int)MSI_ZONE_ON_BOARD_LED_1 + i));
|
||||
|
||||
if(zone_data != nullptr)
|
||||
{
|
||||
@@ -802,6 +953,10 @@ void MSIMotherboard185Controller::SetLedColor
|
||||
unsigned char blu
|
||||
)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| If this board supports Per-LED direct mode, update |
|
||||
| the per-LED packet buffers |
|
||||
\*-----------------------------------------------------*/
|
||||
if(per_led_mode == DIRECT_MODE_PER_LED)
|
||||
{
|
||||
Color* zone_data = GetPerLedZoneData(zone);
|
||||
@@ -837,19 +992,32 @@ void MSIMotherboard185Controller::SetLedColor
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------*\
|
||||
| Otherwise, colors are set per zone. |
|
||||
\*-----------------------------------------------------*/
|
||||
else
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| The JRAINBOW and JPIPE zones have a single LED |
|
||||
| each at the RGBController layer, so index must be |
|
||||
| 0. |
|
||||
\*-------------------------------------------------*/
|
||||
if(((zone == MSI_ZONE_J_RAINBOW_1) || (zone == MSI_ZONE_J_RAINBOW_2) || (zone == MSI_ZONE_J_PIPE_1) || (zone == MSI_ZONE_J_PIPE_2)) && (index != 0))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| The onboard LEDs are treated as a single zone by |
|
||||
| the RGBController layer, so LED index is used to |
|
||||
| select which onboard LED zone in the |
|
||||
| configuration data to update with the given color.|
|
||||
\*-------------------------------------------------*/
|
||||
if(zone >= MSI_ZONE_ON_BOARD_LED_0)
|
||||
{
|
||||
zone = (MSI_ZONE)((int)zone + index + 1);
|
||||
}
|
||||
|
||||
ZoneData *zone_data = GetZoneData(zone_based_per_led_data, zone);
|
||||
ZoneData *zone_data = GetZoneData(configuration_data, zone);
|
||||
|
||||
if(zone_data == nullptr)
|
||||
{
|
||||
@@ -992,11 +1160,11 @@ RainbowZoneData *MSIMotherboard185Controller::GetRainbowZoneData
|
||||
switch(zone)
|
||||
{
|
||||
case MSI_ZONE_J_RAINBOW_1:
|
||||
return &data.j_rainbow_1;
|
||||
return &configuration_data.j_rainbow_1;
|
||||
case MSI_ZONE_J_RAINBOW_2:
|
||||
return &data.j_rainbow_2;
|
||||
return &configuration_data.j_rainbow_2;
|
||||
case MSI_ZONE_J_RAINBOW_3:
|
||||
return (RainbowZoneData*)&data.j_corsair;
|
||||
return (RainbowZoneData*)&configuration_data.j_corsair;
|
||||
case MSI_ZONE_J_CORSAIR:
|
||||
default:
|
||||
return nullptr;
|
||||
@@ -1087,14 +1255,14 @@ bool MSIMotherboard185Controller::ReadFwVersion()
|
||||
|
||||
MSI_MODE MSIMotherboard185Controller::GetMode()
|
||||
{
|
||||
if(data.on_board_led.effect == MSI_DIRECT_MODE)
|
||||
if(configuration_data.on_board_led.effect == MSI_DIRECT_MODE)
|
||||
{
|
||||
direct_mode = true;
|
||||
return MSI_MODE_DIRECT_DUMMY;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (MSI_MODE)data.j_rainbow_1.effect;
|
||||
return (MSI_MODE)configuration_data.j_rainbow_1.effect;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1109,9 +1277,10 @@ void MSIMotherboard185Controller::GetMode
|
||||
)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Get data for given zone |
|
||||
| Get the zone data pointer within the configuration |
|
||||
| data buffer |
|
||||
\*-----------------------------------------------------*/
|
||||
ZoneData *zone_data = GetZoneData(data, zone);
|
||||
ZoneData *zone_data = GetZoneData(configuration_data, zone);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Return if zone is invalid |
|
||||
@@ -1124,17 +1293,17 @@ void MSIMotherboard185Controller::GetMode
|
||||
/*-----------------------------------------------------*\
|
||||
| Update pointers with data |
|
||||
\*-----------------------------------------------------*/
|
||||
mode = (MSI_MODE)zone_data->effect;
|
||||
speed = (MSI_SPEED)(zone_data->speedAndBrightnessFlags & 0x03);
|
||||
brightness = (MSI_BRIGHTNESS)((zone_data->speedAndBrightnessFlags >> 2) & 0x1F);
|
||||
rainbow_color = (zone_data->colorFlags & 0x80) == 0 ? true : false;
|
||||
mode = (MSI_MODE) zone_data->effect;
|
||||
speed = (MSI_SPEED) ((zone_data->speedAndBrightnessFlags >> MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK);
|
||||
brightness = (MSI_BRIGHTNESS)((zone_data->speedAndBrightnessFlags >> MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT) & MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK);
|
||||
rainbow_color = ((zone_data->colorFlags & MSI_COLOR_FLAG_USE_CUSTOM_COLOR) == 0 ? false : true);
|
||||
color = ToRGBColor(zone_data->color.R, zone_data->color.G, zone_data->color.B);
|
||||
}
|
||||
|
||||
void MSIMotherboard185Controller::SetCycleCount
|
||||
void MSIMotherboard185Controller::SetZoneLEDCount
|
||||
(
|
||||
MSI_ZONE zone,
|
||||
unsigned char cycle_num
|
||||
unsigned char led_num
|
||||
)
|
||||
{
|
||||
RainbowZoneData *requested_zone = GetRainbowZoneData(zone);
|
||||
@@ -1144,7 +1313,7 @@ void MSIMotherboard185Controller::SetCycleCount
|
||||
return;
|
||||
}
|
||||
|
||||
requested_zone->cycle_or_led_num = cycle_num;
|
||||
requested_zone->cycle_or_led_num = led_num;
|
||||
SelectPerLedProtocol();
|
||||
}
|
||||
|
||||
@@ -1153,7 +1322,8 @@ void MSIMotherboard185Controller::SetDirectMode
|
||||
bool mode
|
||||
)
|
||||
{
|
||||
direct_mode = mode;
|
||||
direct_mode = mode;
|
||||
direct_mode_configured = false;
|
||||
SelectPerLedProtocol();
|
||||
}
|
||||
|
||||
@@ -1212,9 +1382,8 @@ size_t MSIMotherboard185Controller::GetMaxDirectLeds
|
||||
}
|
||||
}
|
||||
|
||||
void MSIMotherboard185Controller::SelectPerLedProtocol()
|
||||
bool MSIMotherboard185Controller::SelectPerLedProtocol()
|
||||
{
|
||||
|
||||
unsigned char jrainbow1_size = 0;
|
||||
unsigned char jrainbow2_size = 0;
|
||||
unsigned char jrainbow3_size = 0;
|
||||
@@ -1281,9 +1450,61 @@ void MSIMotherboard185Controller::SelectPerLedProtocol()
|
||||
|
||||
if(direct_mode)
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Initialize configuration data for direct mode. |
|
||||
| This sets up brightness and color flags for all |
|
||||
| zones, which is only done when actually entering |
|
||||
| direct mode to preserve the state read from the |
|
||||
| controller for normal (non-direct) mode |
|
||||
| operation. |
|
||||
\*-------------------------------------------------*/
|
||||
configuration_data.j_rgb_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.j_rgb_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.j_pipe_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.j_pipe_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.j_pipe_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.j_pipe_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.j_rainbow_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.j_rainbow_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.j_rainbow_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.j_rainbow_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_1.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_1.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_3.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_3.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_4.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_4.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_5.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_5.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_6.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_6.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_7.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_7.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_8.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_8.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.on_board_led_9.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.on_board_led_9.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.j_rgb_2.speedAndBrightnessFlags = MSI_BRIGHTNESS_LEVEL_100 << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT;
|
||||
configuration_data.j_rgb_2.colorFlags = MSI_COLOR_FLAG_USE_CUSTOM_COLOR;
|
||||
configuration_data.save_data = 0;
|
||||
|
||||
if(per_led_mode == DIRECT_MODE_PER_LED)
|
||||
{
|
||||
hid_send_feature_report(dev, (unsigned char*)&enable_per_led_msg, sizeof(enable_per_led_msg));
|
||||
if(hid_send_feature_report(dev, (unsigned char*)&enable_per_led_msg, sizeof(enable_per_led_msg)) != sizeof(enable_per_led_msg))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
direct_mode_configured = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
+16
-6
@@ -77,10 +77,10 @@ public:
|
||||
unsigned char blu
|
||||
);
|
||||
|
||||
void SetCycleCount
|
||||
void SetZoneLEDCount
|
||||
(
|
||||
MSI_ZONE zone,
|
||||
unsigned char cycle_num
|
||||
unsigned char led_num
|
||||
);
|
||||
|
||||
bool Update
|
||||
@@ -121,13 +121,21 @@ private:
|
||||
std::string version_APROM;
|
||||
std::string version_LDROM;
|
||||
|
||||
FeaturePacket_185 data;
|
||||
/*-----------------------------------------------------*\
|
||||
| Configuration Data, mirrors the configuration block |
|
||||
| stored in the microcontroller's data flash |
|
||||
\*-----------------------------------------------------*/
|
||||
FeaturePacket_185 configuration_data;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Per-LED Direct Mode packet buffers for each zone |
|
||||
\*-----------------------------------------------------*/
|
||||
FeaturePacket_PerLED_185 per_led_data_onboard_and_sync;
|
||||
FeaturePacket_PerLED_185 per_led_data_jrainbow1;
|
||||
FeaturePacket_PerLED_185 per_led_data_jrainbow2;
|
||||
FeaturePacket_PerLED_185 per_led_data_jcorsair;
|
||||
FeaturePacket_185 zone_based_per_led_data;
|
||||
bool direct_mode;
|
||||
bool direct_mode_configured;
|
||||
bool sync_direct_mode;
|
||||
bool no_onboards;
|
||||
bool no_jrainbow1;
|
||||
@@ -141,7 +149,7 @@ private:
|
||||
const std::vector<MSI_ZONE>* supported_zones;
|
||||
DIRECT_MODE per_led_mode;
|
||||
|
||||
bool ReadSettings();
|
||||
bool ReadConfigurationData();
|
||||
bool ReadFwVersion();
|
||||
ZoneData* GetZoneData
|
||||
(
|
||||
@@ -153,5 +161,7 @@ private:
|
||||
(
|
||||
MSI_ZONE zone
|
||||
);
|
||||
void SelectPerLedProtocol();
|
||||
bool SelectPerLedProtocol();
|
||||
static bool IsZoneSupported(MSI_ZONE zone, const std::vector<MSI_ZONE>* supported_zones);
|
||||
};
|
||||
|
||||
|
||||
+130
-80
@@ -119,6 +119,59 @@ int RGBController_MSIMotherboard185::GetDeviceMode()
|
||||
return 0;
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::SetupModes()
|
||||
{
|
||||
constexpr unsigned int COMMON = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
|
||||
constexpr unsigned int MODE_SPECIFIC_ONLY = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_MANUAL_SAVE;
|
||||
constexpr unsigned int RANDOM_ONLY = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
|
||||
|
||||
if(controller->GetSupportedDirectMode() != MSIMotherboard185Controller::DIRECT_MODE_DISABLED)
|
||||
{
|
||||
SetupMode("Direct", MSI_MODE_DIRECT_DUMMY, MODE_FLAG_HAS_PER_LED_COLOR);
|
||||
}
|
||||
|
||||
SetupMode("Static", MSI_MODE_STATIC, MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_MANUAL_SAVE);
|
||||
// SetupMode("Off", MSI_MODE_DISABLE, 0);
|
||||
SetupMode("Breathing", MSI_MODE_BREATHING, MODE_SPECIFIC_ONLY);
|
||||
SetupMode("Flashing", MSI_MODE_FLASHING, COMMON);
|
||||
SetupMode("Double flashing", MSI_MODE_DOUBLE_FLASHING, COMMON);
|
||||
SetupMode("Lightning", MSI_MODE_LIGHTNING, MODE_SPECIFIC_ONLY);
|
||||
// SetupMode("MSI Marquee", MSI_MODE_MSI_MARQUEE, COMMON);
|
||||
SetupMode("Meteor", MSI_MODE_METEOR, COMMON);
|
||||
// SetupMode("Water drop", MSI_MODE_WATER_DROP, COMMON);
|
||||
// SetupMode("MSI Rainbow", MSI_MODE_MSI_RAINBOW, RANDOM_ONLY);
|
||||
// SetupMode("Pop", MSI_MODE_POP, COMMON);
|
||||
// SetupMode("Rap", MSI_MODE_RAP, COMMON);
|
||||
// SetupMode("Jazz", MSI_MODE_JAZZ, COMMON);
|
||||
// SetupMode("Play", MSI_MODE_PLAY, COMMON);
|
||||
// SetupMode("Movie", MSI_MODE_MOVIE, COMMON);
|
||||
SetupMode("Color ring", MSI_MODE_COLOR_RING, RANDOM_ONLY);
|
||||
SetupMode("Planetary", MSI_MODE_PLANETARY, RANDOM_ONLY);
|
||||
SetupMode("Double meteor", MSI_MODE_DOUBLE_METEOR, RANDOM_ONLY);
|
||||
SetupMode("Energy", MSI_MODE_ENERGY, RANDOM_ONLY);
|
||||
SetupMode("Blink", MSI_MODE_BLINK, COMMON);
|
||||
SetupMode("Clock", MSI_MODE_CLOCK, RANDOM_ONLY);
|
||||
SetupMode("Color pulse", MSI_MODE_COLOR_PULSE, COMMON);
|
||||
SetupMode("Color shift", MSI_MODE_COLOR_SHIFT, RANDOM_ONLY);
|
||||
SetupMode("Color wave", MSI_MODE_COLOR_WAVE, COMMON);
|
||||
SetupMode("Marquee", MSI_MODE_MARQUEE, MODE_SPECIFIC_ONLY);
|
||||
// SetupMode("Rainbow", MSI_MODE_RAINBOW, COMMON);
|
||||
SetupMode("Rainbow wave", MSI_MODE_RAINBOW_WAVE, RANDOM_ONLY);
|
||||
SetupMode("Visor", MSI_MODE_VISOR, COMMON);
|
||||
// SetupMode("JRainbow", MSI_MODE_JRAINBOW, COMMON);
|
||||
SetupMode("Rainbow flashing", MSI_MODE_RAINBOW_FLASHING, RANDOM_ONLY);
|
||||
// SetupMode("Rainbow double flashing", MSI_MODE_RAINBOW_DOUBLE_FLASHING, COMMON);
|
||||
// SetupMode("Random", MSI_MODE_RANDOM, COMMON);
|
||||
// SetupMode("Fan control", MSI_MODE_FAN_CONTROL, COMMON);
|
||||
// SetupMode("Off 2", MSI_MODE_DISABLE_2, COMMON);
|
||||
// SetupMode("Color ring flashing", MSI_MODE_COLOR_RING_FLASHING, COMMON);
|
||||
SetupMode("Color ring double flashing", MSI_MODE_COLOR_RING_DOUBLE_FLASHING, RANDOM_ONLY);
|
||||
SetupMode("Stack", MSI_MODE_STACK, COMMON);
|
||||
// SetupMode("Corsair Que", MSI_MODE_CORSAIR_QUE, COMMON);
|
||||
SetupMode("Fire", MSI_MODE_FIRE, RANDOM_ONLY);
|
||||
// SetupMode("Lava", MSI_MODE_LAVA, COMMON);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::SetupZones()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
@@ -227,7 +280,7 @@ void RGBController_MSIMotherboard185::SetupZones()
|
||||
last_resizable_zone = zd->zone_type;
|
||||
}
|
||||
|
||||
controller->SetCycleCount(zone_description[zone_idx]->zone_type, zones[zone_idx].leds_count);
|
||||
controller->SetZoneLEDCount(zone_description[zone_idx]->zone_type, zones[zone_idx].leds_count);
|
||||
|
||||
if((zones[zone_idx].flags & ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE_EFFECTS_ONLY) == 0)
|
||||
{
|
||||
@@ -267,6 +320,11 @@ void RGBController_MSIMotherboard185::DeviceConfigureZone(int zone_idx)
|
||||
|
||||
void RGBController_MSIMotherboard185::DeviceUpdateLEDs()
|
||||
{
|
||||
if((modes[active_mode].value == MSI_MODE_DIRECT_DUMMY) && !controller->IsDirectModeActive())
|
||||
{
|
||||
controller->SetDirectMode(true);
|
||||
}
|
||||
|
||||
for(std::size_t zone_idx = 0; zone_idx < zones.size(); ++zone_idx)
|
||||
{
|
||||
for(int led_idx = zones[zone_idx].leds_count - 1; led_idx >= 0; led_idx--)
|
||||
@@ -274,16 +332,23 @@ void RGBController_MSIMotherboard185::DeviceUpdateLEDs()
|
||||
UpdateLed((int)zone_idx, led_idx);
|
||||
}
|
||||
}
|
||||
controller->Update((modes[active_mode].flags & MODE_FLAG_AUTOMATIC_SAVE) != 0);
|
||||
|
||||
controller->Update(false);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::DeviceUpdateZoneLEDs(int zone)
|
||||
{
|
||||
if((modes[active_mode].value == MSI_MODE_DIRECT_DUMMY) && !controller->IsDirectModeActive())
|
||||
{
|
||||
controller->SetDirectMode(true);
|
||||
}
|
||||
|
||||
for(int led_idx = zones[zone].leds_count - 1; led_idx >= 0; led_idx--)
|
||||
{
|
||||
UpdateLed(zone, led_idx);
|
||||
}
|
||||
controller->Update((modes[active_mode].flags & MODE_FLAG_AUTOMATIC_SAVE) != 0);
|
||||
|
||||
controller->Update(false);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::DeviceUpdateSingleLED
|
||||
@@ -291,6 +356,11 @@ void RGBController_MSIMotherboard185::DeviceUpdateSingleLED
|
||||
int led
|
||||
)
|
||||
{
|
||||
if((modes[active_mode].value == MSI_MODE_DIRECT_DUMMY) && !controller->IsDirectModeActive())
|
||||
{
|
||||
controller->SetDirectMode(true);
|
||||
}
|
||||
|
||||
int zone_index = IndexOfZoneForType((MSI_ZONE)leds[led].value);
|
||||
|
||||
if(zone_index == -1)
|
||||
@@ -301,7 +371,8 @@ void RGBController_MSIMotherboard185::DeviceUpdateSingleLED
|
||||
|
||||
int led_index = led - zones[zone_index].start_idx;
|
||||
UpdateLed(zone_index, led_index);
|
||||
controller->Update((modes[active_mode].flags & MODE_FLAG_AUTOMATIC_SAVE) != 0);
|
||||
|
||||
controller->Update(false);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::DeviceUpdateMode()
|
||||
@@ -313,66 +384,45 @@ void RGBController_MSIMotherboard185::DeviceUpdateMode()
|
||||
else
|
||||
{
|
||||
controller->SetDirectMode(false);
|
||||
DeviceUpdateLEDs();
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Set mode configuration for all zones |
|
||||
\*-------------------------------------------------*/
|
||||
for(std::size_t zone_idx = 0; zone_idx < zones.size(); ++zone_idx)
|
||||
{
|
||||
if(zones[zone_idx].leds_count > 0)
|
||||
{
|
||||
bool random = modes[active_mode].color_mode == MODE_COLORS_RANDOM;
|
||||
MSI_MODE mode = (MSI_MODE)modes[active_mode].value;
|
||||
MSI_SPEED speed = (MSI_SPEED)modes[active_mode].speed;
|
||||
MSI_BRIGHTNESS brightness = (MSI_BRIGHTNESS)modes[active_mode].brightness;
|
||||
|
||||
controller->SetMode((MSI_ZONE)zones[zone_idx].leds[0].value, mode, speed, brightness, random);
|
||||
|
||||
/*-----------------------------------------*\
|
||||
| Set mode-specific colors if available |
|
||||
\*-----------------------------------------*/
|
||||
if(modes[active_mode].flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR)
|
||||
{
|
||||
unsigned char red = 0, grn = 0, blu = 0;
|
||||
if(modes[active_mode].colors.size() > 0)
|
||||
{
|
||||
red = RGBGetRValue(modes[active_mode].colors[0]);
|
||||
grn = RGBGetGValue(modes[active_mode].colors[0]);
|
||||
blu = RGBGetBValue(modes[active_mode].colors[0]);
|
||||
}
|
||||
controller->SetZoneColor((MSI_ZONE)zones[zone_idx].leds[0].value, red, grn, blu, red, grn, blu);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
controller->Update(false);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::DeviceSaveMode()
|
||||
{
|
||||
controller->Update(true);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::SetupModes()
|
||||
{
|
||||
constexpr unsigned int PER_LED_ONLY = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE;
|
||||
constexpr unsigned int RANDOM_ONLY = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
|
||||
constexpr unsigned int COMMON = RANDOM_ONLY | MODE_FLAG_HAS_PER_LED_COLOR;
|
||||
|
||||
if(controller->GetSupportedDirectMode() != MSIMotherboard185Controller::DIRECT_MODE_DISABLED)
|
||||
{
|
||||
SetupMode("Direct", MSI_MODE_DIRECT_DUMMY, MODE_FLAG_HAS_PER_LED_COLOR);
|
||||
}
|
||||
|
||||
SetupMode("Static", MSI_MODE_STATIC, MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE);
|
||||
// SetupMode("Off", MSI_MODE_DISABLE, 0);
|
||||
SetupMode("Breathing", MSI_MODE_BREATHING, PER_LED_ONLY);
|
||||
SetupMode("Flashing", MSI_MODE_FLASHING, COMMON);
|
||||
SetupMode("Double flashing", MSI_MODE_DOUBLE_FLASHING, COMMON);
|
||||
SetupMode("Lightning", MSI_MODE_LIGHTNING, PER_LED_ONLY);
|
||||
// SetupMode("MSI Marquee", MSI_MODE_MSI_MARQUEE, COMMON);
|
||||
SetupMode("Meteor", MSI_MODE_METEOR, COMMON);
|
||||
// SetupMode("Water drop", MSI_MODE_WATER_DROP, COMMON);
|
||||
// SetupMode("MSI Rainbow", MSI_MODE_MSI_RAINBOW, RANDOM_ONLY);
|
||||
// SetupMode("Pop", MSI_MODE_POP, COMMON);
|
||||
// SetupMode("Rap", MSI_MODE_RAP, COMMON);
|
||||
// SetupMode("Jazz", MSI_MODE_JAZZ, COMMON);
|
||||
// SetupMode("Play", MSI_MODE_PLAY, COMMON);
|
||||
// SetupMode("Movie", MSI_MODE_MOVIE, COMMON);
|
||||
SetupMode("Color ring", MSI_MODE_COLOR_RING, RANDOM_ONLY);
|
||||
SetupMode("Planetary", MSI_MODE_PLANETARY, RANDOM_ONLY);
|
||||
SetupMode("Double meteor", MSI_MODE_DOUBLE_METEOR, RANDOM_ONLY);
|
||||
SetupMode("Energy", MSI_MODE_ENERGY, RANDOM_ONLY);
|
||||
SetupMode("Blink", MSI_MODE_BLINK, COMMON);
|
||||
SetupMode("Clock", MSI_MODE_CLOCK, RANDOM_ONLY);
|
||||
SetupMode("Color pulse", MSI_MODE_COLOR_PULSE, COMMON);
|
||||
SetupMode("Color shift", MSI_MODE_COLOR_SHIFT, RANDOM_ONLY);
|
||||
SetupMode("Color wave", MSI_MODE_COLOR_WAVE, COMMON);
|
||||
SetupMode("Marquee", MSI_MODE_MARQUEE, PER_LED_ONLY);
|
||||
// SetupMode("Rainbow", MSI_MODE_RAINBOW, COMMON);
|
||||
SetupMode("Rainbow wave", MSI_MODE_RAINBOW_WAVE, RANDOM_ONLY);
|
||||
SetupMode("Visor", MSI_MODE_VISOR, COMMON);
|
||||
// SetupMode("JRainbow", MSI_MODE_JRAINBOW, COMMON);
|
||||
SetupMode("Rainbow flashing", MSI_MODE_RAINBOW_FLASHING, RANDOM_ONLY);
|
||||
// SetupMode("Rainbow double flashing", MSI_MODE_RAINBOW_DOUBLE_FLASHING, COMMON);
|
||||
// SetupMode("Random", MSI_MODE_RANDOM, COMMON);
|
||||
// SetupMode("Fan control", MSI_MODE_FAN_CONTROL, COMMON);
|
||||
// SetupMode("Off 2", MSI_MODE_DISABLE_2, COMMON);
|
||||
// SetupMode("Color ring flashing", MSI_MODE_COLOR_RING_FLASHING, COMMON);
|
||||
SetupMode("Color ring double flashing", MSI_MODE_COLOR_RING_DOUBLE_FLASHING, RANDOM_ONLY);
|
||||
SetupMode("Stack", MSI_MODE_STACK, COMMON);
|
||||
// SetupMode("Corsair Que", MSI_MODE_CORSAIR_QUE, COMMON);
|
||||
SetupMode("Fire", MSI_MODE_FIRE, RANDOM_ONLY);
|
||||
// SetupMode("Lava", MSI_MODE_LAVA, COMMON);
|
||||
controller->Update(true);
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::UpdateLed
|
||||
@@ -389,19 +439,6 @@ void RGBController_MSIMotherboard185::UpdateLed
|
||||
{
|
||||
controller->SetLedColor((MSI_ZONE)(zones[zone].leds[led].value), led, red, grn, blu);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(led == 0)
|
||||
{
|
||||
bool random = modes[active_mode].color_mode == MODE_COLORS_RANDOM;
|
||||
MSI_MODE mode = (MSI_MODE)modes[active_mode].value;
|
||||
MSI_SPEED speed = (MSI_SPEED)modes[active_mode].speed;
|
||||
MSI_BRIGHTNESS brightness = (MSI_BRIGHTNESS)modes[active_mode].brightness;
|
||||
|
||||
controller->SetMode((MSI_ZONE)zones[zone].leds[led].value, mode, speed, brightness, random);
|
||||
controller->SetZoneColor((MSI_ZONE)zones[zone].leds[led].value, red, grn, blu, red, grn, blu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_MSIMotherboard185::SetupMode
|
||||
@@ -420,6 +457,14 @@ void RGBController_MSIMotherboard185::SetupMode
|
||||
{
|
||||
Mode.color_mode = MODE_COLORS_PER_LED;
|
||||
}
|
||||
else if(flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR)
|
||||
{
|
||||
Mode.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Mode.colors_min = 1;
|
||||
Mode.colors_max = 1;
|
||||
Mode.colors.resize(1);
|
||||
Mode.colors[0] = ToRGBColor(255, 255, 255);
|
||||
}
|
||||
else
|
||||
{
|
||||
Mode.color_mode = MODE_COLORS_RANDOM;
|
||||
@@ -497,19 +542,24 @@ void RGBController_MSIMotherboard185::GetDeviceConfig()
|
||||
{
|
||||
modes[i].brightness = brightness;
|
||||
}
|
||||
if(rainbow)
|
||||
if(modes[i].flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR))
|
||||
{
|
||||
if(modes[i].flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR))
|
||||
if(rainbow && (modes[i].flags & MODE_FLAG_HAS_RANDOM_COLOR))
|
||||
{
|
||||
if(rainbow)
|
||||
modes[i].color_mode = MODE_COLORS_RANDOM;
|
||||
}
|
||||
else if(modes[i].flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR)
|
||||
{
|
||||
modes[i].color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
if(modes[i].colors.size() > 0)
|
||||
{
|
||||
modes[i].color_mode = MODE_COLORS_RANDOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
modes[i].color_mode = MODE_COLORS_PER_LED;
|
||||
modes[i].colors[0] = color;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
modes[i].color_mode = MODE_COLORS_PER_LED;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
+4
-2
@@ -75,6 +75,7 @@ static const std::string board_names[] =
|
||||
"MSI PRO Z890-P WIFI (MS-7E34)",
|
||||
"MSI B850 GAMING PLUS WIFI PZ (MS-7E75)",
|
||||
"MSI MAG X870E TOMAHAWK MAX WIFI PZ (MS-7E84)",
|
||||
"MSI PRO B850M-A WIFI PZ (MS-7E78)",
|
||||
};
|
||||
|
||||
static const mystic_light_761_config board_configs[] =
|
||||
@@ -107,6 +108,7 @@ static const mystic_light_761_config board_configs[] =
|
||||
{ &(board_names[25]), 0, 0, 0, 1, &zone_set1, MSIMotherboard761Controller::DIRECT_MODE_ZONE_BASED }, // MSI PRO Z890-P WIFI (MS-7E34)
|
||||
{ &(board_names[26]), 0, 0, 0, 1, &zone_set1, MSIMotherboard761Controller::DIRECT_MODE_ZONE_BASED }, // MSI B850 GAMING PLUS WIFI PZ (MS-7E75)
|
||||
{ &(board_names[27]), 0, 0, 0, 1, &zone_set1, MSIMotherboard761Controller::DIRECT_MODE_ZONE_BASED }, // MSI MAG X870E TOMAHAWK MAX WIFI PZ (MS-7E84)
|
||||
{ &(board_names[28]), 0, 0, 0, 1, &zone_set1, MSIMotherboard761Controller::DIRECT_MODE_ZONE_BASED }, // MSI PRO B850M-A WIFI PZ (MS-7E78)
|
||||
};
|
||||
|
||||
enum MSI_ZONE setup_map [] =
|
||||
@@ -591,10 +593,10 @@ void MSIMotherboard761Controller::GetMode
|
||||
color = ToRGBColor(zone_data->color.R, zone_data->color.G, zone_data->color.B);
|
||||
}
|
||||
|
||||
void MSIMotherboard761Controller::SetCycleCount
|
||||
void MSIMotherboard761Controller::SetZoneLEDCount
|
||||
(
|
||||
MSI_ZONE /*zone*/,
|
||||
unsigned char /*cycle_num*/
|
||||
unsigned char /*led_num*/
|
||||
)
|
||||
{
|
||||
return;
|
||||
|
||||
+2
-2
@@ -75,10 +75,10 @@ public:
|
||||
unsigned char blu
|
||||
);
|
||||
|
||||
void SetCycleCount
|
||||
void SetZoneLEDCount
|
||||
(
|
||||
MSI_ZONE zone,
|
||||
unsigned char cycle_num
|
||||
unsigned char led_num
|
||||
);
|
||||
|
||||
bool Update
|
||||
|
||||
+1
-1
@@ -210,7 +210,7 @@ void RGBController_MSIMotherboard761::SetupZones()
|
||||
last_resizable_zone = zd->zone_type;
|
||||
}
|
||||
|
||||
controller->SetCycleCount(zone_description[zone_idx]->zone_type, zones[zone_idx].leds_count);
|
||||
controller->SetZoneLEDCount(zone_description[zone_idx]->zone_type, zones[zone_idx].leds_count);
|
||||
|
||||
if((zones[zone_idx].flags & ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE_EFFECTS_ONLY) == 0)
|
||||
{
|
||||
|
||||
@@ -122,13 +122,22 @@ enum MSI_BRIGHTNESS
|
||||
#define NUMOF_PER_LED_MODE_LEDS 240
|
||||
#define NUM_LEDS_761 720
|
||||
|
||||
#define SYNC_SETTING_ONBOARD 0x01
|
||||
#define SYNC_SETTING_JRAINBOW1 0x02
|
||||
#define SYNC_SETTING_JRAINBOW2 0x04
|
||||
#define SYNC_SETTING_JCORSAIR 0x08
|
||||
#define SYNC_SETTING_JPIPE1 0x10
|
||||
#define SYNC_SETTING_JPIPE2 0x20
|
||||
#define SYNC_SETTING_JRGB 0x80
|
||||
/*---------------------------------------------------------*\
|
||||
| Flag bitfield bit definitions |
|
||||
| Note that the sync flags split across the two fields |
|
||||
\*---------------------------------------------------------*/
|
||||
#define MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT 0
|
||||
#define MSI_SPEED_BRIGHTNESS_FLAG_SPEED_MASK (0x03 << MSI_SPEED_BRIGHTNESS_FLAG_SPEED_SHIFT)
|
||||
#define MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT 2
|
||||
#define MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_MASK (0x1F << MSI_SPEED_BRIGHTNESS_FLAG_BRIGHTNESS_SHIFT)
|
||||
#define MSI_SPEED_BRIGHTNESS_FLAG_SYNC_SETTING_JRGB (1 << 7)
|
||||
#define MSI_COLOR_FLAG_SYNC_SETTING_ONBOARD (1 << 0)
|
||||
#define MSI_COLOR_FLAG_SYNC_SETTING_JRAINBOW1 (1 << 1)
|
||||
#define MSI_COLOR_FLAG_SYNC_SETTING_JRAINBOW2 (1 << 2)
|
||||
#define MSI_COLOR_FLAG_SYNC_SETTING_JCORSAIR (1 << 3)
|
||||
#define MSI_COLOR_FLAG_SYNC_SETTING_JPIPE1 (1 << 4)
|
||||
#define MSI_COLOR_FLAG_SYNC_SETTING_JPIPE2 (1 << 5)
|
||||
#define MSI_COLOR_FLAG_USE_CUSTOM_COLOR (1 << 7)
|
||||
|
||||
struct Color
|
||||
{
|
||||
|
||||
-2
@@ -68,8 +68,6 @@ RGBController_NVIDIAIlluminationV1::RGBController_NVIDIAIlluminationV1(NVIDIAIll
|
||||
Static.value = NVIDIA_ILLUMINATION_DIRECT;
|
||||
Static.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_PER_LED_COLOR;
|
||||
Static.color_mode = MODE_COLORS_PER_LED;
|
||||
Static.colors_min = 1;
|
||||
Static.colors_max = 1;
|
||||
Static.brightness_min = 0;
|
||||
Static.brightness = 100;
|
||||
Static.brightness_max = 100;
|
||||
|
||||
@@ -55,15 +55,12 @@ enum
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Bounds for the device-list read-until-response loop. |
|
||||
| Neither value comes from a measurement against real |
|
||||
| hardware - it's a reasonable default at the same scale |
|
||||
| hid_read_timeout() is used elsewhere in this codebase |
|
||||
| (10-100ms per read). 1s total worst-case is enough to |
|
||||
| absorb a slow reply without hanging forever if the |
|
||||
| device never answers correctly at all. |
|
||||
| Tested against Smart Device V2, required between 100-200 |
|
||||
| ms to detect attached devices, so 1000ms was chosen to |
|
||||
| provide an ample buffer on top of that. |
|
||||
\*---------------------------------------------------------*/
|
||||
#define NZXT_HUE_2_DEVICE_LIST_READ_TIMEOUT_MS 50
|
||||
#define NZXT_HUE_2_DEVICE_LIST_MAX_RETRIES 20
|
||||
#define NZXT_HUE_2_DEVICE_LIST_READ_TIMEOUT_MS 1000
|
||||
#define NZXT_HUE_2_DEVICE_LIST_MAX_RETRIES 10
|
||||
|
||||
enum
|
||||
{
|
||||
|
||||
@@ -26,13 +26,17 @@ QMKKeychronController::QMKKeychronController(hid_device* dev_handle, const char
|
||||
/*-----------------------------------------------------*\
|
||||
| Initialize controller fields |
|
||||
\*-----------------------------------------------------*/
|
||||
dev = dev_handle;
|
||||
location = path;
|
||||
kc_protocol_version = 0;
|
||||
kc_rgb_protocol_version = 0;
|
||||
number_leds = 0;
|
||||
supported_features = 0;
|
||||
via_protocol_version = 0;
|
||||
dev = dev_handle;
|
||||
location = path;
|
||||
kc_dongle_firmware_version = "";
|
||||
kc_firmware_version = "";
|
||||
kc_protocol_version = 0;
|
||||
kc_rgb_protocol_version = 0;
|
||||
number_leds = 0;
|
||||
supported_features = 0;
|
||||
via_protocol_version = 0;
|
||||
wireless_device_pid = 0;
|
||||
wireless_device_vid = 0;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Read product string |
|
||||
@@ -82,6 +86,22 @@ QMKKeychronController::QMKKeychronController(hid_device* dev_handle, const char
|
||||
serial = StringUtils::wstring_to_string(serial_string);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| If the device is a Keychron wireless dongle that |
|
||||
| supports wireless RGB control, probe the attached |
|
||||
| keyboard's information |
|
||||
\*-----------------------------------------------------*/
|
||||
CmdGetWirelessDeviceInfo(&wireless_device_vid, &wireless_device_pid);
|
||||
|
||||
if(wireless_device_vid != 0 && wireless_device_pid != 0)
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Wireless keyboard detected, update dev_pid to use |
|
||||
| the keyboard's PID instead of the dongle's PID |
|
||||
\*-------------------------------------------------*/
|
||||
dev_pid = wireless_device_pid;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Get VIA protocol version |
|
||||
\*-----------------------------------------------------*/
|
||||
@@ -95,7 +115,27 @@ QMKKeychronController::QMKKeychronController(hid_device* dev_handle, const char
|
||||
/*-----------------------------------------------------*\
|
||||
| Get Keychron firmware version |
|
||||
\*-----------------------------------------------------*/
|
||||
kc_firmware_version = CmdGetKeychronFirmwareVersion();
|
||||
std::string initial_firmware = CmdGetKeychronFirmwareVersion();
|
||||
|
||||
if(wireless_device_vid != 0 && wireless_device_pid != 0)
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| For wireless connections: |
|
||||
| - The initial firmware is the dongle's version |
|
||||
| - Query the keyboard's firmware via wireless |
|
||||
\*-------------------------------------------------*/
|
||||
kc_dongle_firmware_version = initial_firmware;
|
||||
kc_firmware_version = CmdGetWirelessKeyboardFirmwareVersion();
|
||||
}
|
||||
else
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| For wired connections: |
|
||||
| - Use the firmware version directly |
|
||||
| - No dongle firmware to display |
|
||||
\*-------------------------------------------------*/
|
||||
kc_firmware_version = initial_firmware;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Get supported Keychron features |
|
||||
@@ -159,18 +199,29 @@ QMKKeychronController::QMKKeychronController(hid_device* dev_handle, const char
|
||||
/*-----------------------------------------------------*\
|
||||
| Apply matrix corrections |
|
||||
\*-----------------------------------------------------*/
|
||||
const std::vector<qmk_rgb_matrix_led_info> raw_led_info = led_info;
|
||||
|
||||
for(unsigned int patch_idx = 0; patch_idx < KEYCHRON_PATCH_COUNT; patch_idx++)
|
||||
{
|
||||
if(dev_pid == keychron_patches[patch_idx]->pid)
|
||||
{
|
||||
for(unsigned int patch_entry_idx = 0; patch_entry_idx < keychron_patches[patch_idx]->num_entries; patch_entry_idx++)
|
||||
for(unsigned int patch_entry_idx = 0;
|
||||
patch_entry_idx < keychron_patches[patch_idx]->num_entries;
|
||||
patch_entry_idx++)
|
||||
{
|
||||
const keychron_patch_entry& patch_entry = keychron_patches[patch_idx]->patch[patch_entry_idx];
|
||||
const keychron_patch_entry& patch_entry =
|
||||
keychron_patches[patch_idx]->patch[patch_entry_idx];
|
||||
|
||||
if(patch_entry.led_idx < led_info.size())
|
||||
for(unsigned int led_idx = 0; led_idx < raw_led_info.size(); led_idx++)
|
||||
{
|
||||
led_info[patch_entry.led_idx].row = patch_entry.row;
|
||||
led_info[patch_entry.led_idx].col = patch_entry.col;
|
||||
if(raw_led_info[led_idx].valid &&
|
||||
raw_led_info[led_idx].row == patch_entry.source_row &&
|
||||
raw_led_info[led_idx].col == patch_entry.source_col)
|
||||
{
|
||||
led_info[led_idx].row = patch_entry.row;
|
||||
led_info[led_idx].col = patch_entry.col;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,10 +260,27 @@ std::string QMKKeychronController::GetVersion()
|
||||
/*-----------------------------------------------------*\
|
||||
| Format multi-line version text |
|
||||
\*-----------------------------------------------------*/
|
||||
return("VIA: " + std::to_string(via_protocol_version) + "\r\n" +
|
||||
"Keychron: " + std::to_string(kc_protocol_version) + "\r\n" +
|
||||
"Keychron RGB: " + std::to_string(kc_rgb_protocol_version) + "\r\n" +
|
||||
"Keychron FW: " + kc_firmware_version);
|
||||
std::string result = "VIA: " + std::to_string(via_protocol_version) + "\r\n" +
|
||||
"Keychron: " + std::to_string(kc_protocol_version) + "\r\n" +
|
||||
"Keychron RGB: " + std::to_string(kc_rgb_protocol_version) + "\r\n";
|
||||
|
||||
if(!kc_dongle_firmware_version.empty())
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Wireless - show both dongle and keyboard |
|
||||
\*-------------------------------------------------*/
|
||||
result += "Dongle FW: " + kc_dongle_firmware_version + "\r\n" +
|
||||
"Keyboard FW: " + kc_firmware_version;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| Wired - show keyboard only |
|
||||
\*-------------------------------------------------*/
|
||||
result += "Keychron FW: " + kc_firmware_version;
|
||||
}
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
bool QMKKeychronController::GetSupported()
|
||||
@@ -429,6 +497,68 @@ void QMKKeychronController::CmdGetViaProtocolVersion
|
||||
*via_protocol_version = ((*via_protocol_version & 0x00FF) << 8) | ((*via_protocol_version & 0xFF00) >> 8);
|
||||
}
|
||||
|
||||
void QMKKeychronController::CmdGetWirelessDeviceInfo
|
||||
(
|
||||
unsigned short* wireless_vid,
|
||||
unsigned short* wireless_pid
|
||||
)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Query wireless keyboard information via dongle |
|
||||
| This allows the controller to identify the actual |
|
||||
| keyboard's USB VID/PID instead of the dongle's |
|
||||
\*-----------------------------------------------------*/
|
||||
unsigned char response[10] = { 0 };
|
||||
|
||||
*wireless_vid = 0;
|
||||
*wireless_pid = 0;
|
||||
|
||||
if(ViaSendCommand(KC_WIRELESS_DEVICE_INFO, NULL, 0, response, sizeof(response)) <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Response format: |
|
||||
| Byte 0: Status (0x01 = connected/valid) |
|
||||
| Bytes 1-2: VID (little-endian) |
|
||||
| Bytes 3-4: PID (little-endian) |
|
||||
| Bytes 5+: Additional info |
|
||||
\*-----------------------------------------------------*/
|
||||
if(response[0] != 0x01)
|
||||
{
|
||||
/*-------------------------------------------------*\
|
||||
| No wireless keyboard connected |
|
||||
\*-------------------------------------------------*/
|
||||
return;
|
||||
}
|
||||
|
||||
*wireless_vid = response[1] | (response[2] << 8);
|
||||
*wireless_pid = response[3] | (response[4] << 8);
|
||||
}
|
||||
|
||||
std::string QMKKeychronController::CmdGetWirelessKeyboardFirmwareVersion()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Query wireless keyboard firmware version via dongle |
|
||||
| Similar to CmdGetKeychronFirmwareVersion but for |
|
||||
| the connected wireless keyboard instead of the dongle |
|
||||
\*-----------------------------------------------------*/
|
||||
char response[30] = { 0 };
|
||||
|
||||
if(ViaSendCommand(KC_WIRELESS_FIRMWARE_VERSION, NULL, 0, (unsigned char*)response, sizeof(response)) <= 0)
|
||||
{
|
||||
return("");
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Ensure response null termination |
|
||||
\*-----------------------------------------------------*/
|
||||
response[29] = 0;
|
||||
|
||||
return(std::string(response));
|
||||
}
|
||||
|
||||
void QMKKeychronController::CmdSaveMode()
|
||||
{
|
||||
ViaSendCommandSub(KC_KEYCHRON_RGB, KEYCHRON_RGB_SAVE, NULL, 0, NULL, 0);
|
||||
|
||||
@@ -47,7 +47,9 @@ enum
|
||||
KC_KEYCHRON_RGB = 0xA8,
|
||||
KC_ANALOG_MATRIX = 0xA9,
|
||||
KC_WIRELESS_DFU = 0xAA,
|
||||
KC_FACTORY_TEST = 0xAB
|
||||
KC_FACTORY_TEST = 0xAB,
|
||||
KC_WIRELESS_DEVICE_INFO = 0xB2,
|
||||
KC_WIRELESS_FIRMWARE_VERSION = 0xB3
|
||||
};
|
||||
|
||||
enum KeychronKCRGBCommand
|
||||
@@ -151,6 +153,7 @@ public:
|
||||
|
||||
private:
|
||||
hid_device* dev;
|
||||
std::string kc_dongle_firmware_version;
|
||||
std::string kc_firmware_version;
|
||||
unsigned char kc_protocol_version;
|
||||
unsigned short kc_rgb_protocol_version;
|
||||
@@ -163,6 +166,8 @@ private:
|
||||
unsigned short supported_features;
|
||||
std::string vendor;
|
||||
unsigned short via_protocol_version;
|
||||
unsigned short wireless_device_pid;
|
||||
unsigned short wireless_device_vid;
|
||||
|
||||
unsigned short CmdGetKeycode(unsigned char layer, unsigned char row, unsigned char col);
|
||||
std::string CmdGetKeychronFirmwareVersion();
|
||||
@@ -172,6 +177,8 @@ private:
|
||||
void CmdGetNumberLEDs(unsigned short* number_leds);
|
||||
void CmdGetSupportFeature(unsigned short* supported_features);
|
||||
void CmdGetViaProtocolVersion(unsigned short* via_protocol_version);
|
||||
void CmdGetWirelessDeviceInfo(unsigned short* wireless_vid, unsigned short* wireless_pid);
|
||||
std::string CmdGetWirelessKeyboardFirmwareVersion();
|
||||
void CmdSaveMode();
|
||||
void CmdSendLEDs(unsigned char start_index, unsigned char number_leds, RGBColor* color_data);
|
||||
void CmdSetBrightness(unsigned char brightness);
|
||||
|
||||
@@ -52,4 +52,4 @@ DetectedControllers DetectQMKKeychronControllers(hid_device_info* info, const st
|
||||
return(detected_controllers);
|
||||
}
|
||||
|
||||
REGISTER_HID_DETECTOR_IPU("Keychron RGB", DetectQMKKeychronControllers, KEYCHRON_VID, HID_PID_ANY, 1, KEYCHRON_QMK_USAGE_PAGE, KEYCHRON_QMK_USAGE);
|
||||
REGISTER_HID_DETECTOR_PU("Keychron RGB QMK/ZMK Keyboard", DetectQMKKeychronControllers, KEYCHRON_VID, HID_PID_ANY, KEYCHRON_QMK_USAGE_PAGE, KEYCHRON_QMK_USAGE);
|
||||
|
||||
+5844
-3910
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,13 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| QMKKechronController_Devices.h |
|
||||
| QMKKeychronController_Devices.h |
|
||||
| |
|
||||
| Keychron device IDs and matrix correction data |
|
||||
| Keychron device IDs and matrix correction data |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
| Generated from canonical PID/name inventory and |
|
||||
| hand-corrected raw-to-display matrix layout data. |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
@@ -12,244 +15,444 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| Keychron product IDs |
|
||||
\*---------------------------------------------------------*/
|
||||
#define KEYCHRON_C1_PRO_8K_PID 0x0521
|
||||
#define KEYCHRON_C2_PRO_8K_PID 0x0522
|
||||
#define KEYCHRON_C3_PRO_8K_JIS_PID 0x0532
|
||||
#define KEYCHRON_K1_MAX_PID 0x0A10
|
||||
#define KEYCHRON_K1_MAX_ISO_PID 0x0A11
|
||||
#define KEYCHRON_K1_MAX_JIS_PID 0x0A12
|
||||
#define KEYCHRON_K1_V6_JIS_PID 0x0D12
|
||||
#define KEYCHRON_K10_HE_PID 0x0EA0
|
||||
#define KEYCHRON_K10_HE_ISO_PID 0x0EA1
|
||||
#define KEYCHRON_K10_MAX_PID 0x0AA0
|
||||
#define KEYCHRON_K10_MAX_ISO_PID 0x0AA1
|
||||
#define KEYCHRON_K10_MAX_JIS_PID 0x0AA2
|
||||
#define KEYCHRON_K10_ULTRA_8K_ISO_16A3_PID 0x16A3
|
||||
#define KEYCHRON_K10_V2_ISO_PID 0x0DA1
|
||||
#define KEYCHRON_K10_V2_JIS_PID 0x0DA2
|
||||
#define KEYCHRON_K10X_PID 0x0DA0
|
||||
#define KEYCHRON_K11_MAX_ISO_KNOB_PID 0x0AB4
|
||||
#define KEYCHRON_K11_MAX_JIS_KNOB_PID 0x0AB5
|
||||
#define KEYCHRON_K11_MAX_KNOB_PID 0x0AB3
|
||||
#define KEYCHRON_K13_MAX_PID 0x0AD0
|
||||
#define KEYCHRON_K13_MAX_ISO_PID 0x0AD1
|
||||
#define KEYCHRON_K13_MAX_JIS_PID 0x0AD2
|
||||
#define KEYCHRON_K15_MAX_ISO_KNOB_PID 0x0AF1
|
||||
#define KEYCHRON_K15_MAX_JIS_KNOB_PID 0x0AF2
|
||||
#define KEYCHRON_K15_MAX_KNOB_PID 0x0AF0
|
||||
#define KEYCHRON_K17_MAX_ISO_KNOB_PID 0x0A01
|
||||
#define KEYCHRON_K17_MAX_JIS_KNOB_PID 0x0A02
|
||||
#define KEYCHRON_K17_MAX_KNOB_PID 0x0A00
|
||||
#define KEYCHRON_K1X_ISO_PID 0x0D11
|
||||
#define KEYCHRON_K1X_US_PID 0x0D10
|
||||
#define KEYCHRON_K2_HE_ANSI_PID 0x0E20
|
||||
#define KEYCHRON_K2_HE_ISO_PID 0x0E21
|
||||
#define KEYCHRON_K2_HE_JIS_PID 0x0E22
|
||||
#define KEYCHRON_K2_MAX_PID 0x0A20
|
||||
#define KEYCHRON_K2_MAX_ISO_PID 0x0A21
|
||||
#define KEYCHRON_K2_MAX_JIS_PID 0x0A22
|
||||
#define KEYCHRON_K2_V3_ISO_PID 0x0D21
|
||||
#define KEYCHRON_K2X_PID 0x0D20
|
||||
#define KEYCHRON_K3_MAX_PID 0x0A30
|
||||
#define KEYCHRON_K3_MAX_ISO_PID 0x0A31
|
||||
#define KEYCHRON_K3_MAX_JIS_PID 0x0A32
|
||||
#define KEYCHRON_K3_V3_ISO_PID 0x0D31
|
||||
#define KEYCHRON_K3_V3_JIS_PID 0x0D32
|
||||
#define KEYCHRON_K3X_PID 0x0D30
|
||||
#define KEYCHRON_K4_HE_PID 0x0E40
|
||||
#define KEYCHRON_K4_HE_ISO_PID 0x0E41
|
||||
#define KEYCHRON_K4_HE_JIS_PID 0x0E42
|
||||
#define KEYCHRON_K4_MAX_ANSI_PID 0x0A40
|
||||
#define KEYCHRON_K4X_JIS_PID 0x0D42
|
||||
#define KEYCHRON_K5_MAX_PID 0x0A50
|
||||
#define KEYCHRON_K5_MAX_ISO_PID 0x0A51
|
||||
#define KEYCHRON_K5_MAX_JIS_0A52_PID 0x0A52
|
||||
#define KEYCHRON_K5X_ISO_PID 0x0D51
|
||||
#define KEYCHRON_K6_HE_PID 0x0E60
|
||||
#define KEYCHRON_K7_MAX_PID 0x0A70
|
||||
#define KEYCHRON_K7_MAX_ISO_PID 0x0A71
|
||||
#define KEYCHRON_K7_MAX_JIS_PID 0x0A72
|
||||
#define KEYCHRON_K7_MAX_JIS_V2_PID 0x0A76
|
||||
#define KEYCHRON_K8_HE_PID 0x0E80
|
||||
#define KEYCHRON_K8_HE_ISO_PID 0x0E81
|
||||
#define KEYCHRON_K8_HE_JIS_RBG_PID 0x0E82
|
||||
#define KEYCHRON_K8_MAX_PID 0x0A80
|
||||
#define KEYCHRON_K8_MAX_ISO_PID 0x0A81
|
||||
#define KEYCHRON_K8_MAX_JIS_PID 0x0A82
|
||||
#define KEYCHRON_K8_V2_PID 0x0D80
|
||||
#define KEYCHRON_K8_V2_JIS_PID 0x0D82
|
||||
#define KEYCHRON_K9_MAX_PID 0x0A90
|
||||
#define KEYCHRON_C0_HE_8K_PID 0x1500
|
||||
#define KEYCHRON_C1_PRO_8K_ISO_PID 0x051D
|
||||
#define KEYCHRON_C1_PRO_8K_JIS_PID 0x051E
|
||||
#define KEYCHRON_C2_PRO_ISO_8K_PID 0x052D
|
||||
#define KEYCHRON_C3_PRO_8K_PID 0x0530
|
||||
#define KEYCHRON_C3_PRO_ISO_8K_PID 0x0531
|
||||
#define KEYCHRON_J1_PID 0x0405
|
||||
#define KEYCHRON_J2_PID 0x0406
|
||||
#define KEYCHRON_J2_ANSI_KNOB_PID 0x0456
|
||||
#define KEYCHRON_J2_HE_8K_ANSI_PID 0x0416
|
||||
#define KEYCHRON_J3_SE_KNOB_PID 0x042D
|
||||
#define KEYCHRON_J4_PID 0x0408
|
||||
#define KEYCHRON_J4_ANSI_PID 0x0457
|
||||
#define KEYCHRON_J5_PID 0x0409
|
||||
#define KEYCHRON_J5_ANSI_KNOB_PID 0x0453
|
||||
#define KEYCHRON_K0_MAX_PID 0x0A06
|
||||
#define KEYCHRON_K1_ULTRA_8K_KNOB_PID 0x1610
|
||||
#define KEYCHRON_K10_ULTRA_8K_PID 0x16A0
|
||||
#define KEYCHRON_K10_ULTRA_8K_ISO_16A1_PID 0x16A1
|
||||
#define KEYCHRON_K2_ULTRA_8K_ANSI_PID 0x1620
|
||||
#define KEYCHRON_K2_ULTRA_8K_ISO_PID 0x1621
|
||||
#define KEYCHRON_K2_V3_JIS_PID 0x0D22
|
||||
#define KEYCHRON_K3_HE_PID 0x0E30
|
||||
#define KEYCHRON_K3_HE_ISO_PID 0x0E31
|
||||
#define KEYCHRON_K3_MAX_SE_PID 0x0D3B
|
||||
#define KEYCHRON_K3_ULTRA_8K_ANSI_PID 0x1630
|
||||
#define KEYCHRON_K3_ULTRA_8K_ISO_PID 0x1631
|
||||
#define KEYCHRON_K4_MAX_ISO_PID 0x0A41
|
||||
#define KEYCHRON_K4_MAX_JIS_PID 0x0A42
|
||||
#define KEYCHRON_K4_ULTRA_8K_PID 0x1640
|
||||
#define KEYCHRON_K4_V3_PID 0x0D40
|
||||
#define KEYCHRON_K4_V3_ISO_PID 0x0D41
|
||||
#define KEYCHRON_K5_MAX_JIS_0A58_PID 0x0A58
|
||||
#define KEYCHRON_K5_ULTRA_8K_KNOB_ANSI_PID 0x1650
|
||||
#define KEYCHRON_K5_ULTRA_8K_KNOB_ISO_PID 0x1651
|
||||
#define KEYCHRON_K5_V2_PID 0x0D50
|
||||
#define KEYCHRON_K5_V2_JIS_PID 0x0D52
|
||||
#define KEYCHRON_K6_HE_ISO_PID 0x0E61
|
||||
#define KEYCHRON_K8_ULTRA_8K_ANSI_PID 0x1680
|
||||
#define KEYCHRON_K8_ULTRA_8K_ISO_PID 0x1681
|
||||
#define KEYCHRON_K8_V2_ISO_PID 0x0D81
|
||||
#define KEYCHRON_Q0_HE_V2_KNOB_PID 0x0B01
|
||||
#define KEYCHRON_Q1_HE_PID 0x0B14
|
||||
#define KEYCHRON_Q1_HE_8K_ANSI_PID 0x1010
|
||||
#define KEYCHRON_Q1_HE_8K_ISO_KNOB_PID 0x1011
|
||||
#define KEYCHRON_Q1_HE_ANSI_V2_SILENT_PID 0x0B15
|
||||
#define KEYCHRON_Q1_HE_DAYZ_PID 0x0B13
|
||||
#define KEYCHRON_Q1_ULTRA_8K_ANSI_PID 0x1210
|
||||
#define KEYCHRON_Q11_ULTRA_8K_KNOB_PID 0x12B0
|
||||
#define KEYCHRON_Q11_ULTRA_8K_KNOB_ISO_PID 0x12B2
|
||||
#define KEYCHRON_Q12_HE_ISO_KNOB_PID 0x0BC1
|
||||
#define KEYCHRON_Q12_HE_KNOB_PID 0x0BC0
|
||||
#define KEYCHRON_Q13_MAX_JIS_KNOB_PID 0x08D2
|
||||
#define KEYCHRON_Q13_ULTRA_8K_KNOB_PID 0x12D0
|
||||
#define KEYCHRON_Q16_HE_8K_10F3_PID 0x10F3
|
||||
#define KEYCHRON_Q16_HE_8K_10F6_PID 0x10F6
|
||||
#define KEYCHRON_Q16_HE_8K_ISO_PID 0x10F4
|
||||
#define KEYCHRON_Q2_HE_8K_PID 0x1020
|
||||
#define KEYCHRON_Q3_HE_8K_PID 0x1030
|
||||
#define KEYCHRON_Q3_HE_8K_ANSI_PID 0x1033
|
||||
#define KEYCHRON_Q3_HE_8K_ISO_PID 0x1031
|
||||
#define KEYCHRON_Q3_HE_8K_JIS_PID 0x1032
|
||||
#define KEYCHRON_Q3_HE_JIS_KNOB_PID 0x0B32
|
||||
#define KEYCHRON_Q3_ULTRA_8K_KNOB_ISO_PID 0x1231
|
||||
#define KEYCHRON_Q5_HE_8K_1050_PID 0x1050
|
||||
#define KEYCHRON_Q5_HE_8K_1053_PID 0x1053
|
||||
#define KEYCHRON_Q5_ULTRA_8K_KNOB_PID 0x1250
|
||||
#define KEYCHRON_Q5_ULTRA_8K_KNOB_ANSI_PID 0x1253
|
||||
#define KEYCHRON_Q6_HE_8K_1060_PID 0x1060
|
||||
#define KEYCHRON_Q6_HE_8K_1063_PID 0x1063
|
||||
#define KEYCHRON_Q6_HE_8K_ISO_PID 0x1061
|
||||
#define KEYCHRON_Q6_HE_8K_JIS_PID 0x1062
|
||||
#define KEYCHRON_Q6_HE_ANSI_KNOB_0B60_PID 0x0B60
|
||||
#define KEYCHRON_Q6_HE_ANSI_KNOB_0B63_PID 0x0B63
|
||||
#define KEYCHRON_Q6_HE_ISO_KNOB_PID 0x0B61
|
||||
#define KEYCHRON_Q6_HE_JIS_KNOB_PID 0x0B62
|
||||
#define KEYCHRON_Q6_HE_V2_ANSI_KNOB_SILENT_PID 0x0B64
|
||||
#define KEYCHRON_Q6_ULTRA_8K_ANSI_PID 0x1260
|
||||
#define KEYCHRON_Q6_ULTRA_8K_KNOB_ISO_PID 0x1261
|
||||
#define KEYCHRON_V1_8K_ANSI_KNOB_PID 0x0F10
|
||||
#define KEYCHRON_V1_ULTRA_8K_0C10_PID 0x0C10
|
||||
#define KEYCHRON_V1_ULTRA_8K_0C14_PID 0x0C14
|
||||
#define KEYCHRON_V1_ULTRA_8K_ISO_PID 0x0C11
|
||||
#define KEYCHRON_V1_ULTRA_8K_JIS_PID 0x0C12
|
||||
#define KEYCHRON_V1_ULTRA_SE_KNOB_ANSI_PID 0x0C13
|
||||
#define KEYCHRON_V10_ULTRA_8K_KNOB_PID 0x0CA0
|
||||
#define KEYCHRON_V2_MAX_JIS_KNOB_PID 0x0922
|
||||
#define KEYCHRON_V2_ULTRA_8K_PID 0x0C20
|
||||
#define KEYCHRON_V3_ULTRA_8K_PID 0x0C30
|
||||
#define KEYCHRON_V3_ULTRA_8K_KNOB_ISO_PID 0x0C31
|
||||
#define KEYCHRON_V3_ULTRA_8K_KNOB_JIS_PID 0x0C32
|
||||
#define KEYCHRON_V5_8K_ANSI_KNOB_0F50_PID 0x0F50
|
||||
#define KEYCHRON_V5_8K_ANSI_KNOB_0F53_PID 0x0F53
|
||||
#define KEYCHRON_V5_ULTRA_ANSI_PID 0x0C50
|
||||
#define KEYCHRON_V6_8K_ANSI_KNOB_PID 0x0F60
|
||||
#define KEYCHRON_V6_8K_ISO_KNOB_PID 0x0F61
|
||||
#define KEYCHRON_V6_ULTRA_ANSI_PID 0x0C60
|
||||
#define KEYCHRON_Q0_HE_KNOB_PID 0x0B00
|
||||
#define KEYCHRON_Q0_MAX_KNOB_PID 0x0800
|
||||
#define KEYCHRON_Q1_HE_8K_JIS_PID 0x1012
|
||||
#define KEYCHRON_Q1_HE_ISO_PID 0x0B11
|
||||
#define KEYCHRON_Q1_HE_JIS_PID 0x0B12
|
||||
#define KEYCHRON_Q1_HE_KNOB_PID 0x0B10
|
||||
#define KEYCHRON_Q1_MAX_ISO_KNOB_PID 0x0811
|
||||
#define KEYCHRON_Q1_MAX_JIS_KNOB_PID 0x0812
|
||||
#define KEYCHRON_Q1_MAX_KNOB_PID 0x0810
|
||||
#define KEYCHRON_Q10_MAX_ISO_KNOB_PID 0x08A1
|
||||
#define KEYCHRON_Q10_MAX_JIS_PID 0x08A2
|
||||
#define KEYCHRON_Q10_MAX_KNOB_PID 0x08A0
|
||||
#define KEYCHRON_Q12_MAX_ISO_KNOB_PID 0x08C4
|
||||
#define KEYCHRON_Q12_MAX_JIS_KNOB_PID 0x08C5
|
||||
#define KEYCHRON_Q12_MAX_KNOB_PID 0x08C3
|
||||
#define KEYCHRON_Q13_MAX_KNOB_PID 0x08D0
|
||||
#define KEYCHRON_Q14_MAX_KNOB_PID 0x08E0
|
||||
#define KEYCHRON_Q15_MAX_KNOB_PID 0x08F0
|
||||
#define KEYCHRON_Q2_HE_KNOB_PID 0x0B20
|
||||
#define KEYCHRON_Q2_MAX_ISO_KNOB_PID 0x0821
|
||||
#define KEYCHRON_Q2_MAX_JIS_KNOB_PID 0x0822
|
||||
#define KEYCHRON_Q2_MAX_KNOB_PID 0x0820
|
||||
#define KEYCHRON_Q3_HE_PID 0x0B30
|
||||
#define KEYCHRON_Q3_HE_ISO_KNOB_PID 0x0B31
|
||||
#define KEYCHRON_Q3_MAX_ISO_KNOB_PID 0x0831
|
||||
#define KEYCHRON_Q3_MAX_JIS_KNOB_PID 0x0832
|
||||
#define KEYCHRON_Q3_MAX_KNOB_PID 0x0830
|
||||
#define KEYCHRON_Q3_ULTRA_PID 0x1230
|
||||
#define KEYCHRON_Q4_HE_PID 0x0B40
|
||||
#define KEYCHRON_Q5_HE_ISO_KNOB_PID 0x0B51
|
||||
#define KEYCHRON_Q5_HE_JIS_KNOB_PID 0x0B52
|
||||
#define KEYCHRON_Q5_HE_KNOB_PID 0x0B50
|
||||
#define KEYCHRON_Q5_MAX_ISO_KNOB_PID 0x0851
|
||||
#define KEYCHRON_Q5_MAX_JIS_KNOB_PID 0x0852
|
||||
#define KEYCHRON_Q5_MAX_KNOB_PID 0x0850
|
||||
#define KEYCHRON_Q6_HE_VERSION2_ISO_PID 0x0B65
|
||||
#define KEYCHRON_Q6_MAX_ISO_KNOB_PID 0x0861
|
||||
#define KEYCHRON_Q6_MAX_JIS_KNOB_PID 0x0862
|
||||
#define KEYCHRON_Q6_MAX_KNOB_PID 0x0860
|
||||
#define KEYCHRON_Q60_MAX_PID 0x08C0
|
||||
#define KEYCHRON_Q65_MAX_KNOB_PID 0x08B0
|
||||
#define KEYCHRON_Q8_MAX_KNOB_PID 0x0880
|
||||
#define KEYCHRON_V0_ULTRA_ANSI_PID 0x0C00
|
||||
#define KEYCHRON_V1_MAX_ISO_KNOB_PID 0x0914
|
||||
#define KEYCHRON_V1_MAX_JIS_KNOB_PID 0x0915
|
||||
#define KEYCHRON_V1_MAX_KNOB_PID 0x0913
|
||||
#define KEYCHRON_V10_MAX_ISO_KNOB_PID 0x09A1
|
||||
#define KEYCHRON_V10_MAX_US_KNOB_PID 0x09A0
|
||||
#define KEYCHRON_V2_MAX_ISO_KNOB_PID 0x0921
|
||||
#define KEYCHRON_V2_MAX_KNOB_PID 0x0920
|
||||
#define KEYCHRON_V3_8K_KNOB_PID 0x0F30
|
||||
#define KEYCHRON_V3_MAX_ISO_KNOB_PID 0x0934
|
||||
#define KEYCHRON_V3_MAX_JIS_KNOB_PID 0x0935
|
||||
#define KEYCHRON_V3_MAX_KNOB_PID 0x0933
|
||||
#define KEYCHRON_V4_MAX_PID 0x0940
|
||||
#define KEYCHRON_V4_MAX_ISO_PID 0x0941
|
||||
#define KEYCHRON_V5_MAX_ISO_KNOB_PID 0x0951
|
||||
#define KEYCHRON_V5_MAX_JIS_KNOB_PID 0x0952
|
||||
#define KEYCHRON_V5_MAX_KNOB_PID 0x0950
|
||||
#define KEYCHRON_V6_MAX_ISO_KNOB_PID 0x0961
|
||||
#define KEYCHRON_V6_MAX_JIS_KNOB_PID 0x0962
|
||||
#define KEYCHRON_V6_MAX_KNOB_PID 0x0960
|
||||
#define KEYCHRON_V8_MAX_ISO_KNOB_PID 0x0981
|
||||
#define KEYCHRON_V8_MAX_KNOB_PID 0x0980
|
||||
#define KEYCHRON_Q1V2_ANSI_0106_PID 0x0106
|
||||
#define KEYCHRON_Q1V2_ANSI_0107_PID 0x0107
|
||||
#define KEYCHRON_Q1V2_ISO_0108_PID 0x0108
|
||||
#define KEYCHRON_Q1V2_ISO_0109_PID 0x0109
|
||||
#define KEYCHRON_Q1V2_JIS_010A_PID 0x010A
|
||||
#define KEYCHRON_Q1V2_JIS_010B_PID 0x010B
|
||||
#define KEYCHRON_Q2_ANSI_0110_PID 0x0110
|
||||
#define KEYCHRON_Q2_ANSI_0111_PID 0x0111
|
||||
#define KEYCHRON_Q2_ISO_0112_PID 0x0112
|
||||
#define KEYCHRON_Q2_ISO_0113_PID 0x0113
|
||||
#define KEYCHRON_Q3_ANSI_0120_PID 0x0120
|
||||
#define KEYCHRON_Q3_ANSI_0121_PID 0x0121
|
||||
#define KEYCHRON_Q3_ISO_0122_PID 0x0122
|
||||
#define KEYCHRON_Q3_ISO_0123_PID 0x0123
|
||||
#define KEYCHRON_Q0_PID 0x0130
|
||||
#define KEYCHRON_Q0_PLUS_PID 0x0131
|
||||
#define KEYCHRON_Q4_ANSI_PID 0x0140
|
||||
#define KEYCHRON_Q4_ISO_PID 0x0142
|
||||
#define KEYCHRON_Q5_ANSI_0150_PID 0x0150
|
||||
#define KEYCHRON_Q5_ANSI_0151_PID 0x0151
|
||||
#define KEYCHRON_Q5_ISO_0152_PID 0x0152
|
||||
#define KEYCHRON_Q5_ISO_0153_PID 0x0153
|
||||
#define KEYCHRON_Q6_ANSI_0160_PID 0x0160
|
||||
#define KEYCHRON_Q6_ANSI_0161_PID 0x0161
|
||||
#define KEYCHRON_Q6_ISO_PID 0x0162
|
||||
#define KEYCHRON_Q6_ANSI_0163_PID 0x0163
|
||||
#define KEYCHRON_Q7_ANSI_PID 0x0170
|
||||
#define KEYCHRON_Q7_ISO_PID 0x0172
|
||||
#define KEYCHRON_Q8_ANSI_0180_PID 0x0180
|
||||
#define KEYCHRON_Q8_ANSI_0181_PID 0x0181
|
||||
#define KEYCHRON_Q8_ISO_0182_PID 0x0182
|
||||
#define KEYCHRON_Q8_ISO_0183_PID 0x0183
|
||||
#define KEYCHRON_Q10_ANSI_PID 0x01A1
|
||||
#define KEYCHRON_Q10_ISO_PID 0x01A3
|
||||
#define KEYCHRON_Q65_ANSI_PID 0x01B1
|
||||
#define KEYCHRON_Q60_ANSI_PID 0x01C0
|
||||
#define KEYCHRON_Q12_ANSI_PID 0x01D1
|
||||
#define KEYCHRON_Q12_ISO_PID 0x01D3
|
||||
#define KEYCHRON_K1_PRO_ISO_RGB_PID 0x0211
|
||||
#define KEYCHRON_K2_PRO_RGB_PID 0x0220
|
||||
#define KEYCHRON_K3_PRO_0230_PID 0x0230
|
||||
#define KEYCHRON_K3_PRO_0231_PID 0x0231
|
||||
#define KEYCHRON_K4_PRO_ANSI_RGB_PID 0x0240
|
||||
#define KEYCHRON_K5_PRO_ANSI_RGB_PID 0x0250
|
||||
#define KEYCHRON_K5_PRO_ISO_RGB_PID 0x0251
|
||||
#define KEYCHRON_K6_PRO_RGB_PID 0x0260
|
||||
#define KEYCHRON_K6_PRO_ISO_RGB_PID 0x0261
|
||||
#define KEYCHRON_K7_PRO_RGB_PID 0x0270
|
||||
#define KEYCHRON_K7_PRO_ISO_RGB_PID 0x0271
|
||||
#define KEYCHRON_K8_PRO_RGB_PID 0x0280
|
||||
#define KEYCHRON_K8_PRO_JIS_RGB_PID 0x0282
|
||||
#define KEYCHRON_K10_PRO_ANSI_RGB_PID 0x02A0
|
||||
#define KEYCHRON_K10_PRO_ISO_RGB_PID 0x02A1
|
||||
#define KEYCHRON_K10_PRO_JIS_RGB_PID 0x02A2
|
||||
#define KEYCHRON_V1_ANSI_0310_PID 0x0310
|
||||
#define KEYCHRON_V1_ANSI_0311_PID 0x0311
|
||||
#define KEYCHRON_V1_ISO_0312_PID 0x0312
|
||||
#define KEYCHRON_V1_ISO_0313_PID 0x0313
|
||||
#define KEYCHRON_V1_BR_PID 0x0317
|
||||
#define KEYCHRON_V2_ANSI_0320_PID 0x0320
|
||||
#define KEYCHRON_V2_ANSI_0321_PID 0x0321
|
||||
#define KEYCHRON_V2_ISO_PID 0x0323
|
||||
#define KEYCHRON_V2_BR_PID 0x0327
|
||||
#define KEYCHRON_V3_ANSI_0330_PID 0x0330
|
||||
#define KEYCHRON_V3_ANSI_0331_PID 0x0331
|
||||
#define KEYCHRON_V3_ISO_0332_PID 0x0332
|
||||
#define KEYCHRON_V3_ISO_0333_PID 0x0333
|
||||
#define KEYCHRON_V3_BR_PID 0x0337
|
||||
#define KEYCHRON_V4_ANSI_PID 0x0340
|
||||
#define KEYCHRON_V4_ISO_PID 0x0342
|
||||
#define KEYCHRON_V5_ANSI_0350_PID 0x0350
|
||||
#define KEYCHRON_V5_ANSI_0351_PID 0x0351
|
||||
#define KEYCHRON_V5_ISO_0352_PID 0x0352
|
||||
#define KEYCHRON_V5_ISO_0353_PID 0x0353
|
||||
#define KEYCHRON_V6_ANSI_0360_PID 0x0360
|
||||
#define KEYCHRON_V6_ANSI_0361_PID 0x0361
|
||||
#define KEYCHRON_V6_ISO_0362_PID 0x0362
|
||||
#define KEYCHRON_V6_ISO_0363_PID 0x0363
|
||||
#define KEYCHRON_V6_BR_PID 0x0367
|
||||
#define KEYCHRON_V7_ANSI_PID 0x0370
|
||||
#define KEYCHRON_V7_ISO_PID 0x0372
|
||||
#define KEYCHRON_V8_ANSI_PID 0x0381
|
||||
#define KEYCHRON_V10_ANSI_PID 0x03A1
|
||||
#define KEYCHRON_V10_ISO_PID 0x03A3
|
||||
#define KEYCHRON_P1_HE_DAYZ_PID 0x0402
|
||||
#define KEYCHRON_P1_HE_DAYZ_ISO_PID 0x0403
|
||||
#define KEYCHRON_J1_PID 0x0405
|
||||
#define KEYCHRON_J2_PID 0x0406
|
||||
#define KEYCHRON_J4_PID 0x0408
|
||||
#define KEYCHRON_J5_PID 0x0409
|
||||
#define KEYCHRON_Z6_ULTRA_PID 0x040A
|
||||
#define KEYCHRON_J3_HE_ANSI_PID 0x040C
|
||||
#define KEYCHRON_P6_ULTRA_8K_PID 0x040D
|
||||
#define KEYCHRON_J9_PID 0x0412
|
||||
#define KEYCHRON_J9_ISO_PID 0x0413
|
||||
#define KEYCHRON_J9_JIS_PID 0x0414
|
||||
#define KEYCHRON_J2_HE_8K_ANSI_PID 0x0416
|
||||
#define KEYCHRON_J8_HE_8K_ANSI_PID 0x0417
|
||||
#define KEYCHRON_J8_HE_8K_ISO_PID 0x0418
|
||||
#define KEYCHRON_J8_HE_8K_JIS_PID 0x0419
|
||||
#define KEYCHRON_KEYCHERON_J7_PID 0x041A
|
||||
#define KEYCHRON_J14_HE_PID 0x041B
|
||||
#define KEYCHRON_J12_HE_PID 0x041C
|
||||
#define KEYCHRON_Z6_75_ULTRA_8K_RGB_PID 0x041D
|
||||
#define KEYCHRON_J5_HE_ANSI_PID 0x041E
|
||||
#define KEYCHRON_J4_HE_ANSI_PID 0x041F
|
||||
#define KEYCHRON_P6_ULTRA_8K_ISO_PID 0x0420
|
||||
#define KEYCHRON_J15_HE_RGB_PID 0x0429
|
||||
#define KEYCHRON_X3_ANSI_RGB_PID 0x042A
|
||||
#define KEYCHRON_J9_ULTRA_8K_ANSI_PID 0x042B
|
||||
#define KEYCHRON_J3_SE_PID 0x042D
|
||||
#define KEYCHRON_Z5_98_ULTRA_8K_ANSI_PID 0x042E
|
||||
#define KEYCHRON_V1_HE_ANSI_PID 0x042F
|
||||
#define KEYCHRON_C3_PRO_8K_ANSI_0437_PID 0x0437
|
||||
#define KEYCHRON_C3_MAX_ANSI_PID 0x043A
|
||||
#define KEYCHRON_V6_HE_ANSI_PID 0x0441
|
||||
#define KEYCHRON_Z11_ULTRA_L_PID 0x0442
|
||||
#define KEYCHRON_Z11_ULTRA_R_PID 0x0443
|
||||
#define KEYCHRON_J5_TMR_ANSI_0445_PID 0x0445
|
||||
#define KEYCHRON_J5_HE_8K_ISO_PID 0x0446
|
||||
#define KEYCHRON_J2_ULTRA_8K_ANSI_PID 0x0447
|
||||
#define KEYCHRON_J5_ULTRA_8K_PID 0x0448
|
||||
#define KEYCHRON_J2_TMR_PID 0x0449
|
||||
#define KEYCHRON_J5_TMR_ANSI_044B_PID 0x044B
|
||||
#define KEYCHRON_J11_ULTRA_8K_044C_PID 0x044C
|
||||
#define KEYCHRON_Z5_75_ULTRA_8K_ANSI_PID 0x044D
|
||||
#define KEYCHRON_J3_ULTRA_8K_ANSI_PID 0x044E
|
||||
#define KEYCHRON_J11_ULTRA_8K_044F_PID 0x044F
|
||||
#define KEYCHRON_J10_ULTRA_8K_ANSI_0451_PID 0x0451
|
||||
#define KEYCHRON_J10_ULTRA_8K_ANSI_0452_PID 0x0452
|
||||
#define KEYCHRON_J5_ANSI_PID 0x0453
|
||||
#define KEYCHRON_J2_ANSI_PID 0x0456
|
||||
#define KEYCHRON_J4_ANSI_RGB_PID 0x0457
|
||||
#define KEYCHRON_J6_ANSI_PID 0x0458
|
||||
#define KEYCHRON_EX75_HE_8K_ANSI_PID 0x045A
|
||||
#define KEYCHRON_EX67_HE_8K_ANSI_PID 0x045B
|
||||
#define KEYCHRON_EX99_HE_8K_ANSI_PID 0x045C
|
||||
#define KEYCHRON_KEYCHROON_J3_TMR_045E_PID 0x045E
|
||||
#define KEYCHRON_KEYCHROON_J3_TMR_045F_PID 0x045F
|
||||
#define KEYCHRON_C75_TMR_8K_JIS_PID 0x0460
|
||||
#define KEYCHRON_J6_ULTRA_8K_ANSI_PID 0x0461
|
||||
#define KEYCHRON_Z6_87_ULTRA_8K_PID 0x0462
|
||||
#define KEYCHRON_CM2_H1_ANSI_PID 0x0463
|
||||
#define KEYCHRON_F4_HE_8K_PID 0x0464
|
||||
#define KEYCHRON_J6_FULL_SIZE_8K_PID 0x0467
|
||||
#define KEYCHRON_J2_TKL_8K_PID 0x0468
|
||||
#define KEYCHRON_J5_ULTRA_8K_ISO_PID 0x0469
|
||||
#define KEYCHRON_J8_PID 0x046B
|
||||
#define KEYCHRON_F4_PRO_8K_PID 0x046C
|
||||
#define KEYCHRON_CARBON_68_HE_8K_PID 0x0472
|
||||
#define KEYCHRON_F6_HE_8K_PID 0x0476
|
||||
#define KEYCHRON_J6_FULL_SIZE_8K_ISO_PID 0x0478
|
||||
#define KEYCHRON_Z7_MAX_ANSI_RGB_PID 0x0479
|
||||
#define KEYCHRON_C1_PRO_8K_ISO_RGB_PID 0x051D
|
||||
#define KEYCHRON_C1_PRO_8K_JIS_RGB_PID 0x051E
|
||||
#define KEYCHRON_C1_PRO_8K_ANSI_RGB_PID 0x0521
|
||||
#define KEYCHRON_C2_PRO_8K_ANSI_RGB_PID 0x0522
|
||||
#define KEYCHRON_C2_PRO_8K_ISO_RGB_PID 0x052D
|
||||
#define KEYCHRON_C3_PRO_8K_ANSI_0530_PID 0x0530
|
||||
#define KEYCHRON_C3_PRO_8K_ISO_RGB_PID 0x0531
|
||||
#define KEYCHRON_C3_PRO_8K_JIS_PID 0x0532
|
||||
#define KEYCHRON_C3_PRO_8K_ABTN2_PID 0x0536
|
||||
#define KEYCHRON_C4_PRO_JIS_RGB_PID 0x0542
|
||||
#define KEYCHRON_Q1_PRO_ANSI_PID 0x0610
|
||||
#define KEYCHRON_Q1_PRO_ISO_PID 0x0611
|
||||
#define KEYCHRON_Q2_PRO_ANSI_PID 0x0620
|
||||
#define KEYCHRON_Q2_PRO_ISO_PID 0x0621
|
||||
#define KEYCHRON_Q3_PRO_PID 0x0630
|
||||
#define KEYCHRON_Q3_PRO_ANSI_PID 0x0633
|
||||
#define KEYCHRON_Q3_PRO_ISO_PID 0x0634
|
||||
#define KEYCHRON_Q4_PRO_ANSI_RGB_PID 0x0640
|
||||
#define KEYCHRON_Q5_PRO_ANSI_PID 0x0650
|
||||
#define KEYCHRON_Q5_PRO_ISO_PID 0x0651
|
||||
#define KEYCHRON_Q6_PRO_ANSI_PID 0x0660
|
||||
#define KEYCHRON_Q6_PRO_ISO_PID 0x0661
|
||||
#define KEYCHRON_Q8_PRO_ANSI_PID 0x0680
|
||||
#define KEYCHRON_Q10_PRO_ANSI_PID 0x06A0
|
||||
#define KEYCHRON_Q0_MAX_PID 0x0800
|
||||
#define KEYCHRON_Q1_MAX_ANSI_PID 0x0810
|
||||
#define KEYCHRON_Q1_MAX_ISO_PID 0x0811
|
||||
#define KEYCHRON_Q1_MAX_JIS_PID 0x0812
|
||||
#define KEYCHRON_Q2_MAX_ANSI_PID 0x0820
|
||||
#define KEYCHRON_Q2_MAX_ISO_PID 0x0821
|
||||
#define KEYCHRON_Q3_MAX_ANSI_PID 0x0830
|
||||
#define KEYCHRON_Q3_MAX_ISO_PID 0x0831
|
||||
#define KEYCHRON_Q5_MAX_ANSI_PID 0x0850
|
||||
#define KEYCHRON_Q5_MAX_ISO_PID 0x0851
|
||||
#define KEYCHRON_Q5_MAX_JIS_PID 0x0852
|
||||
#define KEYCHRON_Q6_MAX_ANSI_PID 0x0860
|
||||
#define KEYCHRON_Q6_MAX_ISO_PID 0x0861
|
||||
#define KEYCHRON_Q8_MAX_ANSI_PID 0x0880
|
||||
#define KEYCHRON_Q10_MAX_ANSI_PID 0x08A0
|
||||
#define KEYCHRON_Q10_MAX_ISO_PID 0x08A1
|
||||
#define KEYCHRON_Q65_MAX_ANSI_PID 0x08B0
|
||||
#define KEYCHRON_Q11_ULTRA_8K_R_PID 0x08BA
|
||||
#define KEYCHRON_Q60_MAX_PID 0x08C0
|
||||
#define KEYCHRON_Q12_MAX_ANSI_PID 0x08C3
|
||||
#define KEYCHRON_Q12_MAX_ISO_PID 0x08C4
|
||||
#define KEYCHRON_Q13_MAX_ANSI_PID 0x08D0
|
||||
#define KEYCHRON_Q13_MAX_JIS_PID 0x08D2
|
||||
#define KEYCHRON_Q14_MAX_ANSI_PID 0x08E0
|
||||
#define KEYCHRON_Q15_MAX_ANSI_PID 0x08F0
|
||||
#define KEYCHRON_V1_MAX_ANSI_PID 0x0913
|
||||
#define KEYCHRON_V2_ULTRA_ISO_PID 0x0914
|
||||
#define KEYCHRON_V1_MAX_JIS_PID 0x0915
|
||||
#define KEYCHRON_V2_MAX_ANSI_PID 0x0920
|
||||
#define KEYCHRON_V2_MAX_ISO_PID 0x0921
|
||||
#define KEYCHRON_V2_MAX_JIS_PID 0x0922
|
||||
#define KEYCHRON_V3_MAX_ANSI_PID 0x0933
|
||||
#define KEYCHRON_V3_MAX_ISO_PID 0x0934
|
||||
#define KEYCHRON_V3_MAX_JIS_PID 0x0935
|
||||
#define KEYCHRON_V4_MAX_ANSI_PID 0x0940
|
||||
#define KEYCHRON_V5_MAX_ANSI_PID 0x0950
|
||||
#define KEYCHRON_V5_MAX_ISO_PID 0x0951
|
||||
#define KEYCHRON_V5_MAX_JIS_PID 0x0952
|
||||
#define KEYCHRON_V6_MAX_ANSI_PID 0x0960
|
||||
#define KEYCHRON_V6_MAX_ISO_PID 0x0961
|
||||
#define KEYCHRON_V6_MAX_JIS_PID 0x0962
|
||||
#define KEYCHRON_V8_MAX_ANSI_PID 0x0980
|
||||
#define KEYCHRON_V10_MAX_ANSI_PID 0x09A0
|
||||
#define KEYCHRON_V10_MAX_ISO_PID 0x09A1
|
||||
#define KEYCHRON_K17_MAX_ANSI_RGB_PID 0x0A00
|
||||
#define KEYCHRON_K17_MAX_ISO_RGB_PID 0x0A01
|
||||
#define KEYCHRON_K0_MAX_RGB_PID 0x0A06
|
||||
#define KEYCHRON_K17_MAX_JIS_RGB_PID 0x0A07
|
||||
#define KEYCHRON_K0_MAX_PID 0x0A09
|
||||
#define KEYCHRON_K1_MAX_ANSI_RGB_PID 0x0A10
|
||||
#define KEYCHRON_K1_MAX_ISO_RGB_PID 0x0A11
|
||||
#define KEYCHRON_K1_MAX_JIS_RGB_0A12_PID 0x0A12
|
||||
#define KEYCHRON_K1_MAX_JIS_RGB_0A16_PID 0x0A16
|
||||
#define KEYCHRON_K2_MAX_ANSI_RGB_PID 0x0A20
|
||||
#define KEYCHRON_K2_MAX_ISO_RGB_PID 0x0A21
|
||||
#define KEYCHRON_K2_MAX_JIS_RGB_PID 0x0A22
|
||||
#define KEYCHRON_K3_MAX_ANSI_RGB_0A30_PID 0x0A30
|
||||
#define KEYCHRON_K3_MAX_ISO_RGB_PID 0x0A31
|
||||
#define KEYCHRON_K3_MAX_JIS_RGB_0A32_PID 0x0A32
|
||||
#define KEYCHRON_K3_MAX_JIS_RGB_0A39_PID 0x0A39
|
||||
#define KEYCHRON_K3_MAX_JIS_RGB_0A3B_PID 0x0A3B
|
||||
#define KEYCHRON_K3_MAX_ANSI_RGB_0A3F_PID 0x0A3F
|
||||
#define KEYCHRON_K4_MAX_ANSI_RGB_PID 0x0A40
|
||||
#define KEYCHRON_K4_MAX_ISO_RGB_PID 0x0A41
|
||||
#define KEYCHRON_K4_MAX_JIS_RGB_PID 0x0A42
|
||||
#define KEYCHRON_K5_MAX_ANSI_RGB_PID 0x0A50
|
||||
#define KEYCHRON_K5_MAX_ISO_RGB_PID 0x0A51
|
||||
#define KEYCHRON_K5_MAX_JIS_RGB_0A52_PID 0x0A52
|
||||
#define KEYCHRON_K5_MAX_JIS_RGB_0A58_PID 0x0A58
|
||||
#define KEYCHRON_K7_MAX_ANSI_RGB_PID 0x0A70
|
||||
#define KEYCHRON_K7_MAX_ISO_RGB_PID 0x0A71
|
||||
#define KEYCHRON_K7_MAX_V2_JIS_RGB_PID 0x0A76
|
||||
#define KEYCHRON_K8_MAX_ANSI_RGB_PID 0x0A80
|
||||
#define KEYCHRON_K8_MAX_ISO_RGB_PID 0x0A81
|
||||
#define KEYCHRON_K9_MAX_ANSI_RGB_PID 0x0A90
|
||||
#define KEYCHRON_K10_MAX_ANSI_RGB_PID 0x0AA0
|
||||
#define KEYCHRON_K10_MAX_ISO_RGB_PID 0x0AA1
|
||||
#define KEYCHRON_K10_MAX_JIS_RGB_PID 0x0AA2
|
||||
#define KEYCHRON_K10_MAX_US_V2_RGB_PID 0x0AAC
|
||||
#define KEYCHRON_K11_MAX_ANSI_RGB_PID 0x0AB3
|
||||
#define KEYCHRON_K11_MAX_ISO_RGB_PID 0x0AB4
|
||||
#define KEYCHRON_K11_MAX_JIS_RGB_PID 0x0AB5
|
||||
#define KEYCHRON_K13_MAX_ANSI_RGB_PID 0x0AD0
|
||||
#define KEYCHRON_K13_MAX_ISO_RGB_PID 0x0AD1
|
||||
#define KEYCHRON_K13_MAX_JIS_RGB_PID 0x0AD2
|
||||
#define KEYCHRON_K15_MAX_ANSI_RGB_PID 0x0AF0
|
||||
#define KEYCHRON_K15_MAX_ISO_RGB_PID 0x0AF1
|
||||
#define KEYCHRON_K15_MAX_JIS_RGB_PID 0x0AF2
|
||||
#define KEYCHRON_Q0_HE_PID 0x0B00
|
||||
#define KEYCHRON_Q1_HE_ANSI_PID 0x0B10
|
||||
#define KEYCHRON_Q1_HE_ISO_PID 0x0B11
|
||||
#define KEYCHRON_Q1_HE_JIS_PID 0x0B12
|
||||
#define KEYCHRON_Q1_HE_PID 0x0B14
|
||||
#define KEYCHRON_Q1_HE_V2_SILENT_ANSI_PID 0x0B15
|
||||
#define KEYCHRON_Q2_HE_ANSI_PID 0x0B20
|
||||
#define KEYCHRON_Q3_HE_ANSI_PID 0x0B30
|
||||
#define KEYCHRON_Q3_HE_ISO_PID 0x0B31
|
||||
#define KEYCHRON_Q3_HE_JIS_PID 0x0B32
|
||||
#define KEYCHRON_Q4_HE_ANSI_PID 0x0B40
|
||||
#define KEYCHRON_Q5_HE_ANSI_PID 0x0B50
|
||||
#define KEYCHRON_Q5_HE_ISO_PID 0x0B51
|
||||
#define KEYCHRON_Q5_HE_JIS_PID 0x0B52
|
||||
#define KEYCHRON_Q6_HE_ANSI_0B60_PID 0x0B60
|
||||
#define KEYCHRON_Q6_HE_ISO_PID 0x0B61
|
||||
#define KEYCHRON_Q6_HE_JIS_PID 0x0B62
|
||||
#define KEYCHRON_Q6_HE_ANSI_0B63_PID 0x0B63
|
||||
#define KEYCHRON_Q6_HE_V2_SILENT_ANSI_PID 0x0B64
|
||||
#define KEYCHRON_Q12_HE_ANSI_PID 0x0BC0
|
||||
#define KEYCHRON_Q12_HE_ISO_PID 0x0BC1
|
||||
#define KEYCHRON_V0_ULTRA_8K_ANSI_PID 0x0C00
|
||||
#define KEYCHRON_V1_ULTRA_8K_ANSI_PID 0x0C10
|
||||
#define KEYCHRON_V1_ULTRA_8K_ISO_PID 0x0C11
|
||||
#define KEYCHRON_V1_ULTRA_8K_JIS_PID 0x0C12
|
||||
#define KEYCHRON_V1_ULTRA_SE_ANSI_PID 0x0C13
|
||||
#define KEYCHRON_V1_ULTRA_8K_PID 0x0C14
|
||||
#define KEYCHRON_V2_ULTRA_8K_PID 0x0C20
|
||||
#define KEYCHRON_V3_ULTRA_8K_ANSI_PID 0x0C30
|
||||
#define KEYCHRON_V3_ULTRA_8K_ISO_RGB_PID 0x0C31
|
||||
#define KEYCHRON_V3_ULTRA_8K_JIS_PID 0x0C32
|
||||
#define KEYCHRON_V5_ULTRA_8K_ANSI_PID 0x0C50
|
||||
#define KEYCHRON_V5_ULTRA_ISO_PID 0x0C51
|
||||
#define KEYCHRON_V5_ULTRA_JIS_PID 0x0C52
|
||||
#define KEYCHRON_V6_ULTRA_8K_ANSI_PID 0x0C60
|
||||
#define KEYCHRON_V6_ULTRA_ISO_PID 0x0C61
|
||||
#define KEYCHRON_V6_ULTRA_8K_JIS_PID 0x0C62
|
||||
#define KEYCHRON_V6_ULTRA_SE_ANSI_PID 0x0C63
|
||||
#define KEYCHRON_V10_ULTRA_8K_ANSI_PID 0x0CA0
|
||||
#define KEYCHRON_K1_V6_ANSI_RGB_PID 0x0D10
|
||||
#define KEYCHRON_K1_V6_ISO_RGB_PID 0x0D11
|
||||
#define KEYCHRON_K1_V6_JIS_RGB_PID 0x0D12
|
||||
#define KEYCHRON_K2_V3_ANSI_RGB_PID 0x0D20
|
||||
#define KEYCHRON_K2_V3_ISO_RGB_PID 0x0D21
|
||||
#define KEYCHRON_K2_V3_JIS_RGB_PID 0x0D22
|
||||
#define KEYCHRON_K3_V3_ANSI_RGB_PID 0x0D30
|
||||
#define KEYCHRON_K3_V3_ISO_RGB_PID 0x0D31
|
||||
#define KEYCHRON_K3_V3_JIS_RGB_PID 0x0D32
|
||||
#define KEYCHRON_K3_MAX_SE_RGB_PID 0x0D3B
|
||||
#define KEYCHRON_K4_V3_ANSI_RGB_PID 0x0D40
|
||||
#define KEYCHRON_K4_V3_ISO_RGB_PID 0x0D41
|
||||
#define KEYCHRON_K5_V2_ANSI_RGB_PID 0x0D50
|
||||
#define KEYCHRON_K5_V2_ISO_RGB_PID 0x0D51
|
||||
#define KEYCHRON_K5_V2_JIS_RGB_PID 0x0D52
|
||||
#define KEYCHRON_K6X_US_RGB_PID 0x0D60
|
||||
#define KEYCHRON_K8_V2_ANSI_RGB_PID 0x0D80
|
||||
#define KEYCHRON_K10_V2_ANSI_RGB_PID 0x0DA0
|
||||
#define KEYCHRON_K2_HE_ANSI_RGB_PID 0x0E20
|
||||
#define KEYCHRON_K2_HE_ISO_RGB_PID 0x0E21
|
||||
#define KEYCHRON_K2_HE_JIS_RGB_PID 0x0E22
|
||||
#define KEYCHRON_K2_HE_BR_RGB_PID 0x0E23
|
||||
#define KEYCHRON_K2_HE_V2_SILENT_ANSI_PID 0x0E25
|
||||
#define KEYCHRON_K2_HE_V2_ISO_PID 0x0E26
|
||||
#define KEYCHRON_K3_HE_PID 0x0E30
|
||||
#define KEYCHRON_K3_HE_ISO_PID 0x0E31
|
||||
#define KEYCHRON_K3_HE_JIS_PID 0x0E32
|
||||
#define KEYCHRON_K4_HE_ANSI_PID 0x0E40
|
||||
#define KEYCHRON_K4_HE_ISO_PID 0x0E41
|
||||
#define KEYCHRON_K4_HE_JIS_PID 0x0E42
|
||||
#define KEYCHRON_K6_HE_ANSI_PID 0x0E60
|
||||
#define KEYCHRON_K6_HE_ISO_RGB_PID 0x0E61
|
||||
#define KEYCHRON_K8_HE_ANSI_PID 0x0E80
|
||||
#define KEYCHRON_K8_HE_ISO_RGB_PID 0x0E81
|
||||
#define KEYCHRON_K8_HE_JIS_PID 0x0E82
|
||||
#define KEYCHRON_K10_HE_ANSI_PID 0x0EA0
|
||||
#define KEYCHRON_K10_HE_ISO_0EA1_PID 0x0EA1
|
||||
#define KEYCHRON_K10_HE_JIS_PID 0x0EA2
|
||||
#define KEYCHRON_K10_HE_PID 0x0EA3
|
||||
#define KEYCHRON_K10_HE_ISO_0EA4_PID 0x0EA4
|
||||
#define KEYCHRON_K10_HE_ABNT2_PID 0x0EA5
|
||||
#define KEYCHRON_K10_HE_V2_ANSI_RGB_PID 0x0EA6
|
||||
#define KEYCHRON_K10_HE_V3_ANSI_RGB_PID 0x0EA7
|
||||
#define KEYCHRON_V1_8K_ANSI_PID 0x0F10
|
||||
#define KEYCHRON_V1_8K_ISO_PID 0x0F11
|
||||
#define KEYCHRON_V3_8K_ANSI_PID 0x0F30
|
||||
#define KEYCHRON_V3_8K_ISO_PID 0x0F31
|
||||
#define KEYCHRON_V5_8K_ANSI_0F50_PID 0x0F50
|
||||
#define KEYCHRON_V5_8K_ISO_PID 0x0F51
|
||||
#define KEYCHRON_V5_8K_ANSI_0F53_PID 0x0F53
|
||||
#define KEYCHRON_V6_8K_ANSI_PID 0x0F60
|
||||
#define KEYCHRON_V6_8K_ISO_PID 0x0F61
|
||||
#define KEYCHRON_Q19_HE_8K_PID 0x1005
|
||||
#define KEYCHRON_Q1_HE_8K_ANSI_1010_PID 0x1010
|
||||
#define KEYCHRON_Q1_HE_8K_ISO_RGB_PID 0x1011
|
||||
#define KEYCHRON_Q1_HE_8K_JIS_PID 0x1012
|
||||
#define KEYCHRON_Q1_HE_8K_ABNT2_PID 0x1013
|
||||
#define KEYCHRON_Q1_HE_MARBLE_8K_ANSI_PID 0x1014
|
||||
#define KEYCHRON_Q1_SE_8K_ANSI_PID 0x1015
|
||||
#define KEYCHRON_Q1_HE_8K_ANSI_1016_PID 0x1016
|
||||
#define KEYCHRON_Q2_HE_8K_PID 0x1020
|
||||
#define KEYCHRON_Q3_HE_8K_PID 0x1030
|
||||
#define KEYCHRON_Q3_HE_8K_ISO_PID 0x1031
|
||||
#define KEYCHRON_Q3_HE_8K_JIS_PID 0x1032
|
||||
#define KEYCHRON_Q5_HE_8K_PID 0x1050
|
||||
#define KEYCHRON_Q6_HE_8K_PID 0x1060
|
||||
#define KEYCHRON_Q6_HE_8K_ISO_PID 0x1061
|
||||
#define KEYCHRON_Q6_HE_8K_JIS_PID 0x1062
|
||||
#define KEYCHRON_Q16_HE_8K_PID 0x10F3
|
||||
#define KEYCHRON_Q16_HE_8K_ISO_PID 0x10F4
|
||||
#define KEYCHRON_Q1_ULTRA_8K_ANSI_1210_PID 0x1210
|
||||
#define KEYCHRON_Q1_ULTRA_8K_ISO_PID 0x1211
|
||||
#define KEYCHRON_Q1_ULTRA_8K_JIS_PID 0x1212
|
||||
#define KEYCHRON_Q1_ULTRA_8K_ANSI_1213_PID 0x1213
|
||||
#define KEYCHRON_Q3_ULTRA_8K_ANSI_PID 0x1230
|
||||
#define KEYCHRON_Q3_ULTRA_8K_ISO_RGB_PID 0x1231
|
||||
#define KEYCHRON_Q3_ULTRA_8K_JIS_RGB_PID 0x1232
|
||||
#define KEYCHRON_Q5_ULTRA_8K_PID 0x1250
|
||||
#define KEYCHRON_Q5_ULTRA_8K_ISO_PID 0x1251
|
||||
#define KEYCHRON_Q5_ULTRA_8K_JIS_PID 0x1252
|
||||
#define KEYCHRON_Q5_ULTRA_8K_ANSI_PID 0x1253
|
||||
#define KEYCHRON_Q6_ULTRA_8K_ANSI_PID 0x1260
|
||||
#define KEYCHRON_Q6_ULTRA_8K_ISO_RGB_PID 0x1261
|
||||
#define KEYCHRON_Q6_ULTRA_8K_JIS_RGB_PID 0x1262
|
||||
#define KEYCHRON_Q13_ULTRA_8K_RGB_PID 0x12D0
|
||||
#define KEYCHRON_K6_ULTRA_ZMK_ANSI_PID 0x1360
|
||||
#define KEYCHRON_K6_ULTRA_ZMK_JIS_PID 0x1362
|
||||
#define KEYCHRON_K10_PRO_SS_ZMK_RGB_PID 0x13A9
|
||||
#define KEYCHRON_K10_ULTRA_SE_ANSI_PID 0x13AA
|
||||
#define KEYCHRON_R3_ANSI_RGB_1430_PID 0x1430
|
||||
#define KEYCHRON_R3_JIS_RGB_PID 0x1432
|
||||
#define KEYCHRON_R3_ANSI_RGB_1433_PID 0x1433
|
||||
#define KEYCHRON_R5_ANSI_RGB_PID 0x1450
|
||||
#define KEYCHRON_R6_ANSI_RGB_1460_PID 0x1460
|
||||
#define KEYCHRON_R6_ANSI_RGB_1463_PID 0x1463
|
||||
#define KEYCHRON_C3_HE_8K_JIS_PID 0x1532
|
||||
#define KEYCHRON_C4_HE_8K_ANSI_1540_PID 0x1540
|
||||
#define KEYCHRON_C4_HE_8K_ANSI_1541_PID 0x1541
|
||||
#define KEYCHRON_K1_ULTRA_8K_PID 0x1610
|
||||
#define KEYCHRON_K1_ULTRA_8K_ISO_RGB_PID 0x1611
|
||||
#define KEYCHRON_K2_ULTRA_8K_ANSI_PID 0x1620
|
||||
#define KEYCHRON_K2_ULTRA_8K_ISO_PID 0x1621
|
||||
#define KEYCHRON_K2_ULTRA_8K_JIS_PID 0x1622
|
||||
#define KEYCHRON_K3_ULTRA_8K_ANSI_PID 0x1630
|
||||
#define KEYCHRON_K3_ULTRA_8K_ISO_PID 0x1631
|
||||
#define KEYCHRON_K3_ULTRA_8K_JIS_1632_PID 0x1632
|
||||
#define KEYCHRON_K3_ULTRA_8K_JIS_1634_PID 0x1634
|
||||
#define KEYCHRON_K4_ULTRA_8K_RGB_PID 0x1640
|
||||
#define KEYCHRON_K4_ULTRA_8K_ISO_1641_PID 0x1641
|
||||
#define KEYCHRON_K4_ULTRA_8K_JIS_PID 0x1642
|
||||
#define KEYCHRON_K4_ULTRA_8K_ISO_1643_PID 0x1643
|
||||
#define KEYCHRON_K5_ULTRA_8K_ANSI_PID 0x1650
|
||||
#define KEYCHRON_K5_ULTRA_8K_ISO_PID 0x1651
|
||||
#define KEYCHRON_K5_ULTRA_8K_ABNT2_PID 0x1653
|
||||
#define KEYCHRON_K8_ULTRA_8K_ANSI_PID 0x1680
|
||||
#define KEYCHRON_K8_ULTRA_8K_ISO_PID 0x1681
|
||||
#define KEYCHRON_K8_ULTRA_8K_JIS_PID 0x1682
|
||||
#define KEYCHRON_K10_ULTRA_8K_RGB_PID 0x16A0
|
||||
#define KEYCHRON_K10_ULTRA_8K_ISO_PID 0x16A1
|
||||
#define KEYCHRON_K10_ULTRA_8K_JIS_PID 0x16A2
|
||||
#define KEYCHRON_K10_ULTRA_8K_ISO_RGB_PID 0x16A3
|
||||
#define KEYCHRON_Q12_HE_PID 0xD014
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Keychron Patch Types |
|
||||
| |
|
||||
| LED index is assumed to match Launcher layout_index. |
|
||||
| row/col are the corrected visual matrix position. |
|
||||
| source_row/source_col identify a key by the raw matrix |
|
||||
| position reported by the firmware. row/col specify the |
|
||||
| corrected visual matrix position used by OpenRGB. |
|
||||
\*---------------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
unsigned int led_idx;
|
||||
unsigned int source_row;
|
||||
unsigned int source_col;
|
||||
unsigned int row;
|
||||
unsigned int col;
|
||||
} keychron_patch_entry;
|
||||
@@ -262,7 +465,7 @@ typedef struct
|
||||
} keychron_patch;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| List of all Keychron matrix patches |
|
||||
| List of Keychron matrix patches requiring correction |
|
||||
\*---------------------------------------------------------*/
|
||||
extern const keychron_patch* const keychron_patches[];
|
||||
extern const unsigned int KEYCHRON_PATCH_COUNT;
|
||||
|
||||
@@ -343,8 +343,45 @@ void RGBController_RealtekARGB::SetupZones()
|
||||
for(int grp_num : valid_grp)
|
||||
{
|
||||
argb_num = controller->get_argb_num(grp_num);
|
||||
zones[idx].name = "strip " + std::to_string(idx + 1);
|
||||
zones[idx].type = ZONE_TYPE_LINEAR;
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Set zone flags for manual configurability |
|
||||
\*-------------------------------------------------*/
|
||||
if(first_run)
|
||||
{
|
||||
zones[idx].flags = ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE
|
||||
| ZONE_FLAG_MANUALLY_CONFIGURABLE_NAME
|
||||
| ZONE_FLAG_MANUALLY_CONFIGURABLE_TYPE
|
||||
| ZONE_FLAG_MANUALLY_CONFIGURABLE_MATRIX_MAP
|
||||
| ZONE_FLAG_MANUALLY_CONFIGURABLE_SEGMENTS;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Set zone name if not manually configured |
|
||||
\*-------------------------------------------------*/
|
||||
if(!(zones[idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_NAME))
|
||||
{
|
||||
zones[idx].name = "ARGB Strip " + std::to_string(idx + 1);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Set zone type if not manually configured |
|
||||
\*-------------------------------------------------*/
|
||||
if(!(zones[idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE))
|
||||
{
|
||||
zones[idx].type = ZONE_TYPE_LINEAR;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Set matrix map if not manually configured |
|
||||
\*-------------------------------------------------*/
|
||||
if(!(zones[idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_MATRIX_MAP))
|
||||
{
|
||||
zones[idx].matrix_map.width = 0;
|
||||
zones[idx].matrix_map.height = 0;
|
||||
zones[idx].matrix_map.map.resize(0);
|
||||
}
|
||||
|
||||
if(fix_grps & (0x1 << grp_num))
|
||||
{
|
||||
zones[idx].leds_count = argb_num;
|
||||
@@ -369,7 +406,7 @@ void RGBController_RealtekARGB::SetupZones()
|
||||
for(unsigned int led_idx = 0; led_idx < zones[idx].leds_count; led_idx++)
|
||||
{
|
||||
led myled;
|
||||
myled.name = zones[idx].name + " led_";
|
||||
myled.name = zones[idx].name + ", LED ";
|
||||
myled.name.append(std::to_string(led_idx + 1));
|
||||
leds.push_back(myled);
|
||||
}
|
||||
@@ -378,6 +415,14 @@ void RGBController_RealtekARGB::SetupZones()
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::DeviceConfigureZone(int zone_idx)
|
||||
{
|
||||
if((size_t)zone_idx < zones.size())
|
||||
{
|
||||
SetupZones();
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_RealtekARGB::ResizeZone(int zone, int new_size)
|
||||
{
|
||||
int fix_grps = controller->get_fix_grps();
|
||||
|
||||
@@ -23,6 +23,8 @@ public:
|
||||
void SetupModes();
|
||||
void SetupZones();
|
||||
|
||||
void DeviceConfigureZone(int zone_idx);
|
||||
|
||||
void ResizeZone(int zone, int new_size);
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
|
||||
@@ -95,7 +95,7 @@ unsigned int ValveSteamMachineController::GetBrightness()
|
||||
|
||||
if(out[0] <= 255)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -124,7 +124,7 @@ unsigned int ValveSteamMachineController::GetDelay()
|
||||
|
||||
if(out[0] <= 20)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -203,7 +203,7 @@ unsigned int ValveSteamMachineController::GetBreathOffset()
|
||||
|
||||
if(out[0] <= 255)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -232,7 +232,7 @@ unsigned int ValveSteamMachineController::GetBreathLevel()
|
||||
|
||||
if(out[0] <= 255)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -261,7 +261,7 @@ unsigned int ValveSteamMachineController::GetPatrolNum()
|
||||
|
||||
if(out[0] <= 255)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -290,7 +290,7 @@ unsigned int ValveSteamMachineController::GetColorShift()
|
||||
|
||||
if(out[0] <= 255)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -361,7 +361,7 @@ unsigned int ValveSteamMachineController::GetBrightnessStartup()
|
||||
|
||||
if(out[0] <= 255)
|
||||
{
|
||||
return(out[0]);
|
||||
return((unsigned int)out[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -381,7 +381,7 @@ void ValveSteamMachineController::SetLEDColor(unsigned int led_idx, RGBColor col
|
||||
/*-----------------------------------------------------*\
|
||||
| Reverse order of LEDs |
|
||||
\*-----------------------------------------------------*/
|
||||
led_idx = (GetLEDCount() - 1) - led_idx;
|
||||
led_idx = (unsigned int)((GetLEDCount() - 1) - led_idx);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set LED color |
|
||||
@@ -489,7 +489,7 @@ void ValveSteamMachineController::SetEnabled(bool enabled)
|
||||
/*-----------------------------------------------------*\
|
||||
| Set enabled |
|
||||
\*-----------------------------------------------------*/
|
||||
ULONG64 in[1] = {enabled ? 1 : 0};
|
||||
ULONG64 in[1] = {enabled ? (ULONG64)1 : (ULONG64)0};
|
||||
ULONG64 out[1];
|
||||
SIZE_T return_size;
|
||||
HRESULT status;
|
||||
|
||||
+71
-49
@@ -115,6 +115,8 @@ bool BasicHIDBlock::compare(hid_device_info* info)
|
||||
|| (usage == info->usage))
|
||||
&& ((interface == HID_INTERFACE_ANY)
|
||||
|| (interface == info->interface_number))
|
||||
&& ((bus == HID_BUS_ANY)
|
||||
|| (bus == (int)info->bus_type))
|
||||
);
|
||||
}
|
||||
|
||||
@@ -260,10 +262,11 @@ void DetectionManager::RegisterI2CBusDetector(I2CBusDetectorFunction detector)
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController Detector Registration Functions |
|
||||
\*---------------------------------------------------------*/
|
||||
void DetectionManager::RegisterDeviceDetector(std::string name, DeviceDetectorFunction detector)
|
||||
void DetectionManager::RegisterDeviceDetector(std::string name, DeviceDetectorFunction detector, bool enabled_by_default)
|
||||
{
|
||||
device_detector_strings.push_back(name);
|
||||
device_detectors.push_back(detector);
|
||||
device_detector_default_enabled.push_back(enabled_by_default);
|
||||
}
|
||||
|
||||
void DetectionManager::RegisterDynamicDetector(std::string name, DynamicDetectorFunction detector)
|
||||
@@ -272,17 +275,19 @@ void DetectionManager::RegisterDynamicDetector(std::string name, DynamicDetector
|
||||
dynamic_detectors.push_back(detector);
|
||||
}
|
||||
|
||||
void DetectionManager::RegisterHIDDeviceDetector(std::string name, HIDDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage)
|
||||
void DetectionManager::RegisterHIDDeviceDetector(std::string name, HIDDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage, bool enabled_by_default, int bus)
|
||||
{
|
||||
HIDDeviceDetectorBlock block;
|
||||
|
||||
block.name = name;
|
||||
block.vid = vid;
|
||||
block.pid = pid;
|
||||
block.function = detector;
|
||||
block.interface = interface;
|
||||
block.usage_page = usage_page;
|
||||
block.usage = usage;
|
||||
block.name = name;
|
||||
block.vid = vid;
|
||||
block.pid = pid;
|
||||
block.function = detector;
|
||||
block.interface = interface;
|
||||
block.usage_page = usage_page;
|
||||
block.usage = usage;
|
||||
block.bus = bus;
|
||||
block.enabled_by_default = enabled_by_default;
|
||||
|
||||
if(block.vid == HID_VID_ANY && block.pid == HID_PID_ANY)
|
||||
{
|
||||
@@ -294,17 +299,19 @@ void DetectionManager::RegisterHIDDeviceDetector(std::string name, HIDDeviceDete
|
||||
}
|
||||
}
|
||||
|
||||
void DetectionManager::RegisterHIDWrappedDeviceDetector(std::string name, HIDWrappedDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage)
|
||||
void DetectionManager::RegisterHIDWrappedDeviceDetector(std::string name, HIDWrappedDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage, bool enabled_by_default, int bus)
|
||||
{
|
||||
HIDWrappedDeviceDetectorBlock block;
|
||||
|
||||
block.name = name;
|
||||
block.vid = vid;
|
||||
block.pid = pid;
|
||||
block.function = detector;
|
||||
block.interface = interface;
|
||||
block.usage_page = usage_page;
|
||||
block.usage = usage;
|
||||
block.name = name;
|
||||
block.vid = vid;
|
||||
block.pid = pid;
|
||||
block.function = detector;
|
||||
block.interface = interface;
|
||||
block.usage_page = usage_page;
|
||||
block.usage = usage;
|
||||
block.bus = bus;
|
||||
block.enabled_by_default = enabled_by_default;
|
||||
|
||||
if(block.vid == HID_VID_ANY && block.pid == HID_PID_ANY)
|
||||
{
|
||||
@@ -316,35 +323,38 @@ void DetectionManager::RegisterHIDWrappedDeviceDetector(std::string name, HIDWra
|
||||
}
|
||||
}
|
||||
|
||||
void DetectionManager::RegisterI2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector)
|
||||
void DetectionManager::RegisterI2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector, bool enabled_by_default)
|
||||
{
|
||||
i2c_device_detector_strings.push_back(name);
|
||||
i2c_device_detectors.push_back(detector);
|
||||
i2c_device_detector_default_enabled.push_back(enabled_by_default);
|
||||
}
|
||||
|
||||
void DetectionManager::RegisterI2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type)
|
||||
void DetectionManager::RegisterI2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type, bool enabled_by_default)
|
||||
{
|
||||
I2CDRAMDeviceDetectorBlock block;
|
||||
|
||||
block.name = name;
|
||||
block.function = detector;
|
||||
block.jedec_id = jedec_id;
|
||||
block.dram_type = dram_type;
|
||||
block.name = name;
|
||||
block.function = detector;
|
||||
block.jedec_id = jedec_id;
|
||||
block.dram_type = dram_type;
|
||||
block.enabled_by_default = enabled_by_default;
|
||||
|
||||
i2c_dram_device_detectors.push_back(block);
|
||||
}
|
||||
|
||||
void DetectionManager::RegisterI2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr)
|
||||
void DetectionManager::RegisterI2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr, bool enabled_by_default)
|
||||
{
|
||||
I2CPCIDeviceDetectorBlock block;
|
||||
|
||||
block.name = name;
|
||||
block.function = detector;
|
||||
block.ven_id = ven_id;
|
||||
block.dev_id = dev_id;
|
||||
block.subven_id = subven_id;
|
||||
block.subdev_id = subdev_id;
|
||||
block.i2c_addr = i2c_addr;
|
||||
block.name = name;
|
||||
block.function = detector;
|
||||
block.ven_id = ven_id;
|
||||
block.dev_id = dev_id;
|
||||
block.subven_id = subven_id;
|
||||
block.subdev_id = subdev_id;
|
||||
block.i2c_addr = i2c_addr;
|
||||
block.enabled_by_default = enabled_by_default;
|
||||
|
||||
i2c_pci_device_detectors.push_back(block);
|
||||
}
|
||||
@@ -1443,7 +1453,7 @@ void DetectionManager::RunHIDDetector(hid_device_info* current_hid_device, json&
|
||||
const char* manu_name = StringUtils::wchar_to_char(current_hid_device->manufacturer_string);
|
||||
const char* prod_name = StringUtils::wchar_to_char(current_hid_device->product_string);
|
||||
|
||||
LOG_DEBUG("[%s] %04X:%04X U=%04X P=0x%04X I=%d - %-25s - %s", DETECTIONMANAGER, current_hid_device->vendor_id, current_hid_device->product_id, current_hid_device->usage, current_hid_device->usage_page, current_hid_device->interface_number, manu_name, prod_name);
|
||||
LOG_DEBUG("[%s] %04X:%04X U=%04X P=0x%04X I=%d B=%d - %-25s - %s", DETECTIONMANAGER, current_hid_device->vendor_id, current_hid_device->product_id, current_hid_device->usage, current_hid_device->usage_page, current_hid_device->interface_number, (int)current_hid_device->bus_type, manu_name, prod_name);
|
||||
}
|
||||
|
||||
detection_string = "";
|
||||
@@ -1559,7 +1569,7 @@ void DetectionManager::RunHIDWrappedDetector(const hidapi_wrapper* wrapper, hid_
|
||||
const char* manu_name = StringUtils::wchar_to_char(current_hid_device->manufacturer_string);
|
||||
const char* prod_name = StringUtils::wchar_to_char(current_hid_device->product_string);
|
||||
|
||||
LOG_DEBUG("[%s] %04X:%04X U=%04X P=0x%04X I=%d - %-25s - %s", DETECTIONMANAGER, current_hid_device->vendor_id, current_hid_device->product_id, current_hid_device->usage, current_hid_device->usage_page, current_hid_device->interface_number, manu_name, prod_name);
|
||||
LOG_DEBUG("[%s] %04X:%04X U=%04X P=0x%04X I=%d B=%d - %-25s - %s", DETECTIONMANAGER, current_hid_device->vendor_id, current_hid_device->product_id, current_hid_device->usage, current_hid_device->usage_page, current_hid_device->interface_number, (int)current_hid_device->bus_type, manu_name, prod_name);
|
||||
}
|
||||
|
||||
detection_string = "";
|
||||
@@ -1807,7 +1817,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = i2c_device_detector_default_enabled[i2c_detector_idx];
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1822,7 +1832,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = i2c_dram_device_detectors[i2c_detector_idx].enabled_by_default;
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1837,7 +1847,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = i2c_pci_device_detectors[i2c_pci_detector_idx].enabled_by_default;
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1852,7 +1862,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = hid_generic_detectors[hid_detector_idx].enabled_by_default;
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1867,7 +1877,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = hid_specific_detectors[hid_detector_idx].enabled_by_default;
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1882,7 +1892,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = hid_wrapped_generic_detectors[hid_wrapped_detector_idx].enabled_by_default;
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1897,7 +1907,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = hid_wrapped_specific_detectors[hid_wrapped_detector_idx].enabled_by_default;
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -1912,7 +1922,7 @@ void DetectionManager::UpdateDetectorSettings()
|
||||
|
||||
if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)))
|
||||
{
|
||||
detector_settings["detectors"][detection_string] = true;
|
||||
detector_settings["detectors"][detection_string] = device_detector_default_enabled[detector_idx];
|
||||
save_settings = true;
|
||||
}
|
||||
}
|
||||
@@ -2324,37 +2334,37 @@ bool DetectionManager::WriteUdevRules(FILE* output_file)
|
||||
/*-----------------------------------------------------*\
|
||||
| Group detectors by name to avoid duplicate headers |
|
||||
\*-----------------------------------------------------*/
|
||||
std::map<std::string, std::vector<std::pair<uint16_t, uint16_t>>> detector_groups;
|
||||
std::map<std::string, std::vector<std::pair<int, int>>> detector_groups;
|
||||
|
||||
for(std::size_t detector_idx = 0; detector_idx < hid_specific_detectors.size(); detector_idx++)
|
||||
{
|
||||
HIDDeviceDetectorBlock& detector = hid_specific_detectors[detector_idx];
|
||||
|
||||
if(detector.vid == HID_VID_ANY || detector.pid == HID_PID_ANY)
|
||||
if(detector.vid == HID_VID_ANY && detector.pid == HID_PID_ANY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
detector_groups[detector.name].push_back({(uint16_t)detector.vid, (uint16_t)detector.pid});
|
||||
detector_groups[detector.name].push_back({detector.vid, detector.pid});
|
||||
}
|
||||
|
||||
for(std::size_t detector_idx = 0; detector_idx < hid_wrapped_specific_detectors.size(); detector_idx++)
|
||||
{
|
||||
HIDWrappedDeviceDetectorBlock& detector = hid_wrapped_specific_detectors[detector_idx];
|
||||
|
||||
if(detector.vid == HID_VID_ANY || detector.pid == HID_PID_ANY)
|
||||
if(detector.vid == HID_VID_ANY && detector.pid == HID_PID_ANY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string group_name = detector.name;
|
||||
detector_groups[group_name].push_back({(uint16_t)detector.vid, (uint16_t)detector.pid});
|
||||
detector_groups[group_name].push_back({detector.vid, detector.pid});
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Write grouped HID device rules |
|
||||
\*-----------------------------------------------------*/
|
||||
for(const std::pair<const std::string, std::vector<std::pair<uint16_t, uint16_t>>>& group : detector_groups)
|
||||
for(const std::pair<const std::string, std::vector<std::pair<int, int>>>& group : detector_groups)
|
||||
{
|
||||
fprintf(output_file, "#---------------------------------------------------------------#\n");
|
||||
fprintf(output_file, "# %s\n", group.first.c_str());
|
||||
@@ -2362,9 +2372,21 @@ bool DetectionManager::WriteUdevRules(FILE* output_file)
|
||||
|
||||
std::string device_name_tag = UdevDeviceNameToTag(group.first);
|
||||
|
||||
for(const std::pair<uint16_t, uint16_t>& vid_pid : group.second)
|
||||
for(const std::pair<int, int>& vid_pid : group.second)
|
||||
{
|
||||
fprintf(output_file, "SUBSYSTEMS==\"usb|hidraw\", ATTRS{idVendor}==\"%04x\", ATTRS{idProduct}==\"%04x\", TAG+=\"uaccess\", TAG+=\"%s\"\n", vid_pid.first, vid_pid.second, device_name_tag.c_str());
|
||||
fprintf(output_file, "SUBSYSTEMS==\"usb|hidraw\", ");
|
||||
|
||||
if(vid_pid.first >= 0)
|
||||
{
|
||||
fprintf(output_file, "ATTRS{idVendor}==\"%04x\", ", vid_pid.first);
|
||||
}
|
||||
|
||||
if(vid_pid.second >= 0)
|
||||
{
|
||||
fprintf(output_file, "ATTRS{idProduct}==\"%04x\", ", vid_pid.second);
|
||||
}
|
||||
|
||||
fprintf(output_file, "TAG+=\"uaccess\", TAG+=\"%s\"\n", device_name_tag.c_str());
|
||||
}
|
||||
fprintf(output_file, "\n");
|
||||
}
|
||||
|
||||
+108
-56
@@ -42,6 +42,7 @@ using json = nlohmann::json;
|
||||
#define HID_INTERFACE_ANY -1
|
||||
#define HID_USAGE_ANY -1
|
||||
#define HID_USAGE_PAGE_ANY -1
|
||||
#define HID_BUS_ANY -1
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| Detector Function Types |
|
||||
@@ -70,6 +71,8 @@ public:
|
||||
int interface;
|
||||
int usage_page;
|
||||
int usage;
|
||||
int bus;
|
||||
bool enabled_by_default;
|
||||
|
||||
bool compare(hid_device_info* info);
|
||||
bool matching_id(hid_device_info* info);
|
||||
@@ -96,6 +99,7 @@ typedef struct
|
||||
uint16_t subven_id;
|
||||
uint16_t subdev_id;
|
||||
uint8_t i2c_addr;
|
||||
bool enabled_by_default;
|
||||
} I2CPCIDeviceDetectorBlock;
|
||||
|
||||
typedef struct
|
||||
@@ -104,6 +108,7 @@ typedef struct
|
||||
I2CDRAMDeviceDetectorFunction function;
|
||||
uint16_t jedec_id;
|
||||
uint8_t dram_type;
|
||||
bool enabled_by_default;
|
||||
} I2CDRAMDeviceDetectorBlock;
|
||||
|
||||
typedef struct
|
||||
@@ -171,13 +176,13 @@ public:
|
||||
/*-----------------------------------------------------*\
|
||||
| RGBController Detector Registration Functions |
|
||||
\*-----------------------------------------------------*/
|
||||
void RegisterDeviceDetector(std::string name, DeviceDetectorFunction detector);
|
||||
void RegisterDeviceDetector(std::string name, DeviceDetectorFunction detector, bool enabled_by_default = true);
|
||||
void RegisterDynamicDetector(std::string name, DynamicDetectorFunction detector);
|
||||
void RegisterHIDDeviceDetector(std::string name, HIDDeviceDetectorFunction detector, int vid, int pid, int interface = HID_INTERFACE_ANY, int usage_page = HID_USAGE_PAGE_ANY, int usage = HID_USAGE_ANY);
|
||||
void RegisterHIDWrappedDeviceDetector(std::string name, HIDWrappedDeviceDetectorFunction detector, int vid, int pid, int interface = HID_INTERFACE_ANY, int usage_page = HID_USAGE_PAGE_ANY, int usage = HID_USAGE_ANY);
|
||||
void RegisterI2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector);
|
||||
void RegisterI2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type);
|
||||
void RegisterI2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr);
|
||||
void RegisterHIDDeviceDetector(std::string name, HIDDeviceDetectorFunction detector, int vid, int pid, int interface = HID_INTERFACE_ANY, int usage_page = HID_USAGE_PAGE_ANY, int usage = HID_USAGE_ANY, bool enabled_by_default = true, int bus = HID_BUS_ANY);
|
||||
void RegisterHIDWrappedDeviceDetector(std::string name, HIDWrappedDeviceDetectorFunction detector, int vid, int pid, int interface = HID_INTERFACE_ANY, int usage_page = HID_USAGE_PAGE_ANY, int usage = HID_USAGE_ANY, bool enabled_by_default = true, int bus = HID_BUS_ANY);
|
||||
void RegisterI2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector, bool enabled_by_default = true);
|
||||
void RegisterI2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type, bool enabled_by_default = true);
|
||||
void RegisterI2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr, bool enabled_by_default = true);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Pre-Detection Hook Function Registration Function |
|
||||
@@ -250,9 +255,11 @@ private:
|
||||
\*-----------------------------------------------------*/
|
||||
std::vector<DeviceDetectorFunction> device_detectors;
|
||||
std::vector<std::string> device_detector_strings;
|
||||
std::vector<bool> device_detector_default_enabled;
|
||||
std::vector<I2CBusDetectorFunction> i2c_bus_detectors;
|
||||
std::vector<I2CDeviceDetectorFunction> i2c_device_detectors;
|
||||
std::vector<std::string> i2c_device_detector_strings;
|
||||
std::vector<bool> i2c_device_detector_default_enabled;
|
||||
std::vector<I2CDRAMDeviceDetectorBlock> i2c_dram_device_detectors;
|
||||
std::vector<I2CPCIDeviceDetectorBlock> i2c_pci_device_detectors;
|
||||
std::vector<HIDDeviceDetectorBlock> hid_generic_detectors;
|
||||
@@ -402,36 +409,36 @@ private:
|
||||
class DeviceDetector
|
||||
{
|
||||
public:
|
||||
DeviceDetector(std::string name, DeviceDetectorFunction detector)
|
||||
DeviceDetector(std::string name, DeviceDetectorFunction detector, bool enabled_by_default = true)
|
||||
{
|
||||
DetectionManager::get()->RegisterDeviceDetector(name, detector);
|
||||
DetectionManager::get()->RegisterDeviceDetector(name, detector, enabled_by_default);
|
||||
}
|
||||
};
|
||||
|
||||
class I2CDeviceDetector
|
||||
{
|
||||
public:
|
||||
I2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector)
|
||||
I2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector, bool enabled_by_default = true)
|
||||
{
|
||||
DetectionManager::get()->RegisterI2CDeviceDetector(name, detector);
|
||||
DetectionManager::get()->RegisterI2CDeviceDetector(name, detector, enabled_by_default);
|
||||
}
|
||||
};
|
||||
|
||||
class I2CDRAMDeviceDetector
|
||||
{
|
||||
public:
|
||||
I2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type)
|
||||
I2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type, bool enabled_by_default = true)
|
||||
{
|
||||
DetectionManager::get()->RegisterI2CDRAMDeviceDetector(name, detector, jedec_id, dram_type);
|
||||
DetectionManager::get()->RegisterI2CDRAMDeviceDetector(name, detector, jedec_id, dram_type, enabled_by_default);
|
||||
}
|
||||
};
|
||||
|
||||
class I2CPCIDeviceDetector
|
||||
{
|
||||
public:
|
||||
I2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr)
|
||||
I2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr, bool enabled_by_default = true)
|
||||
{
|
||||
DetectionManager::get()->RegisterI2CPCIDeviceDetector(name, detector, ven_id, dev_id, subven_id, subdev_id, i2c_addr);
|
||||
DetectionManager::get()->RegisterI2CPCIDeviceDetector(name, detector, ven_id, dev_id, subven_id, subdev_id, i2c_addr, enabled_by_default);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -447,18 +454,18 @@ public:
|
||||
class HIDDeviceDetector
|
||||
{
|
||||
public:
|
||||
HIDDeviceDetector(std::string name, HIDDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage)
|
||||
HIDDeviceDetector(std::string name, HIDDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage, bool enabled_by_default = true, int bus = HID_BUS_ANY)
|
||||
{
|
||||
DetectionManager::get()->RegisterHIDDeviceDetector(name, detector, vid, pid, interface, usage_page, usage);
|
||||
DetectionManager::get()->RegisterHIDDeviceDetector(name, detector, vid, pid, interface, usage_page, usage, enabled_by_default, bus);
|
||||
}
|
||||
};
|
||||
|
||||
class HIDWrappedDeviceDetector
|
||||
{
|
||||
public:
|
||||
HIDWrappedDeviceDetector(std::string name, HIDWrappedDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage)
|
||||
HIDWrappedDeviceDetector(std::string name, HIDWrappedDeviceDetectorFunction detector, int vid, int pid, int interface, int usage_page, int usage, bool enabled_by_default = true, int bus = HID_BUS_ANY)
|
||||
{
|
||||
DetectionManager::get()->RegisterHIDWrappedDeviceDetector(name, detector, vid, pid, interface, usage_page, usage);
|
||||
DetectionManager::get()->RegisterHIDWrappedDeviceDetector(name, detector, vid, pid, interface, usage_page, usage, enabled_by_default, bus);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -497,43 +504,88 @@ public:
|
||||
/*---------------------------------------------------------*\
|
||||
| Detector Registration Macros |
|
||||
\*---------------------------------------------------------*/
|
||||
#define REGISTER_DETECTOR(name, func) static DeviceDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_I2C_DETECTOR(name, func) static I2CDeviceDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_I2C_DRAM_DETECTOR(name, func, jedec_id, dram_type) static I2CDRAMDeviceDetector device_detector_obj_##func##jedec_id(name, func, jedec_id, dram_type)
|
||||
#define REGISTER_I2C_PCI_DETECTOR(name, func, ven, dev, subven, subdev, addr) static I2CPCIDeviceDetector device_detector_obj_##ven##dev##subven##subdev##addr##func(name, func, ven, dev, subven, subdev, addr)
|
||||
#define REGISTER_I2C_BUS_DETECTOR(func) static I2CBusDetector device_detector_obj_##func(func)
|
||||
#define REGISTER_HID_DETECTOR(name, func, vid, pid) static HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_I(name, func, vid, pid, interface) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_IP(name, func, vid, pid, interface, page) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_P(name, func, vid, pid, page) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_PU(name, func, vid, pid, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_I_ONLY(name, func, interface) static HIDDeviceDetector device_detector_obj_##interface(name, func, HID_VID_ANY, HID_PID_ANY, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_IP_ONLY(name, func, interface, page) static HIDDeviceDetector device_detector_obj_##interface##_##page(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_IPU_ONLY(name, func, interface, page, usage) static HIDDeviceDetector device_detector_obj_##interface##_##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_P_ONLY(name, func, page) static HIDDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_PU_ONLY(name, func, page, usage) static HIDDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR(name, func, vid, pid) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_I(name, func, vid, pid, interface) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_PU(name, func, vid, pid, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_I_ONLY(name, func, interface) static HIDWrappedDeviceDetector device_detector_obj_##interface(name, func, HID_VID_ANY, HID_PID_ANY, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IP_ONLY(name, func, interface, page) static HIDWrappedDeviceDetector device_detector_obj_##interface##_##page(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IPU_ONLY(name, func, interface, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##interface##_##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_P_ONLY(name, func, page) static HIDWrappedDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_PU_ONLY(name, func, page, usage) static HIDWrappedDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_DYNAMIC_DETECTOR(name, func) static DynamicDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_PRE_DETECTION_HOOK(func) static PreDetectionHook device_detector_obj_##func(func)
|
||||
#define REGISTER_DETECTOR(name, func) static DeviceDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_DETECTOR_DISABLED(name, func) static DeviceDetector device_detector_obj_##func(name, func, false)
|
||||
#define REGISTER_I2C_DETECTOR(name, func) static I2CDeviceDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_I2C_DETECTOR_DISABLED(name, func) static I2CDeviceDetector device_detector_obj_##func(name, func, false)
|
||||
#define REGISTER_I2C_DRAM_DETECTOR(name, func, jedec_id, dram_type) static I2CDRAMDeviceDetector device_detector_obj_##func##jedec_id(name, func, jedec_id, dram_type)
|
||||
#define REGISTER_I2C_DRAM_DETECTOR_DISABLED(name, func, jedec_id, dram_type) static I2CDRAMDeviceDetector device_detector_obj_##func##jedec_id(name, func, jedec_id, dram_type, false)
|
||||
#define REGISTER_I2C_PCI_DETECTOR(name, func, ven, dev, subven, subdev, addr) static I2CPCIDeviceDetector device_detector_obj_##ven##dev##subven##subdev##addr##func(name, func, ven, dev, subven, subdev, addr)
|
||||
#define REGISTER_I2C_PCI_DETECTOR_DISABLED(name, func, ven, dev, subven, subdev, addr) static I2CPCIDeviceDetector device_detector_obj_##ven##dev##subven##subdev##addr##func(name, func, ven, dev, subven, subdev, addr, false)
|
||||
#define REGISTER_I2C_BUS_DETECTOR(func) static I2CBusDetector device_detector_obj_##func(func)
|
||||
#define REGISTER_HID_DETECTOR(name, func, vid, pid) static HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_DISABLED(name, func, vid, pid) static HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_I(name, func, vid, pid, interface) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_I_DISABLED(name, func, vid, pid, interface) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_IP(name, func, vid, pid, interface, page) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_IP_DISABLED(name, func, vid, pid, interface, page) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_IPU_DISABLED(name, func, vid, pid, interface, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage, false)
|
||||
#define REGISTER_HID_DETECTOR_P(name, func, vid, pid, page) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_P_DISABLED(name, func, vid, pid, page) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_PU(name, func, vid, pid, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_PU_DISABLED(name, func, vid, pid, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage, false)
|
||||
#define REGISTER_HID_DETECTOR_I_ONLY(name, func, interface) static HIDDeviceDetector device_detector_obj_##interface(name, func, HID_VID_ANY, HID_PID_ANY, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_I_ONLY_DISABLED(name, func, interface) static HIDDeviceDetector device_detector_obj_##interface(name, func, HID_VID_ANY, HID_PID_ANY, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_IP_ONLY(name, func, interface, page) static HIDDeviceDetector device_detector_obj_##interface##_##page(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_IP_ONLY_DISABLED(name, func, interface, page) static HIDDeviceDetector device_detector_obj_##interface##_##page(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_IPU_ONLY(name, func, interface, page, usage) static HIDDeviceDetector device_detector_obj_##interface##_##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_IPU_ONLY_DISABLED(name, func, interface, page, usage) static HIDDeviceDetector device_detector_obj_##interface##_##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, usage, false)
|
||||
#define REGISTER_HID_DETECTOR_P_ONLY(name, func, page) static HIDDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_DETECTOR_P_ONLY_DISABLED(name, func, page) static HIDDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_DETECTOR_PU_ONLY(name, func, page, usage) static HIDDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_DETECTOR_PU_ONLY_DISABLED(name, func, page, usage) static HIDDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage, false)
|
||||
#define REGISTER_HID_DETECTOR_B(name, func, vid, pid, bus) static HIDDeviceDetector device_detector_obj_##vid##pid##_##bus(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, true, bus)
|
||||
#define REGISTER_HID_DETECTOR_BP(name, func, vid, pid, bus, page) static HIDDeviceDetector device_detector_obj_##vid##pid##_##bus##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY, true, bus)
|
||||
#define REGISTER_HID_DETECTOR_BPU(name, func, vid, pid, bus, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##_##bus##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage, true, bus)
|
||||
#define REGISTER_HID_DETECTOR_B_ONLY(name, func, bus) static HIDDeviceDetector device_detector_obj_##bus(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, true, bus)
|
||||
#define REGISTER_HID_DETECTOR_BP_ONLY(name, func, bus, page) static HIDDeviceDetector device_detector_obj_##bus##__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY, true, bus)
|
||||
#define REGISTER_HID_DETECTOR_BPU_ONLY(name, func, bus, page, usage) static HIDDeviceDetector device_detector_obj_##bus##__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage, true, bus)
|
||||
#define REGISTER_HID_DETECTOR_B_DISABLED(name, func, vid, pid, bus) static HIDDeviceDetector device_detector_obj_##vid##pid##_##bus(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false, bus)
|
||||
#define REGISTER_HID_DETECTOR_BP_DISABLED(name, func, vid, pid, bus, page) static HIDDeviceDetector device_detector_obj_##vid##pid##_##bus##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false, bus)
|
||||
#define REGISTER_HID_DETECTOR_BPU_DISABLED(name, func, vid, pid, bus, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##_##bus##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage, false, bus)
|
||||
#define REGISTER_HID_DETECTOR_B_ONLY_DISABLED(name, func, bus) static HIDDeviceDetector device_detector_obj_##bus(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false, bus)
|
||||
#define REGISTER_HID_DETECTOR_BP_ONLY_DISABLED(name, func, bus, page) static HIDDeviceDetector device_detector_obj_##bus##__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false, bus)
|
||||
#define REGISTER_HID_DETECTOR_BPU_ONLY_DISABLED(name, func, bus, page, usage) static HIDDeviceDetector device_detector_obj_##bus##__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage, false, bus)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR(name, func, vid, pid) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_DISABLED(name, func, vid, pid) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_I(name, func, vid, pid, interface) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_I_DISABLED(name, func, vid, pid, interface) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IPU_DISABLED(name, func, vid, pid, interface, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_PU(name, func, vid, pid, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_PU_DISABLED(name, func, vid, pid, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_I_ONLY(name, func, interface) static HIDWrappedDeviceDetector device_detector_obj_##interface(name, func, HID_VID_ANY, HID_PID_ANY, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_I_ONLY_DISABLED(name, func, interface) static HIDWrappedDeviceDetector device_detector_obj_##interface(name, func, HID_VID_ANY, HID_PID_ANY, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IP_ONLY(name, func, interface, page) static HIDWrappedDeviceDetector device_detector_obj_##interface##_##page(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IP_ONLY_DISABLED(name, func, interface, page) static HIDWrappedDeviceDetector device_detector_obj_##interface##_##page(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IPU_ONLY(name, func, interface, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##interface##_##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_IPU_ONLY_DISABLED(name, func, interface, page, usage) static HIDWrappedDeviceDetector device_detector_obj_##interface##_##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, interface, page, usage, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_P_ONLY(name, func, page) static HIDWrappedDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_P_ONLY_DISABLED(name, func, page) static HIDWrappedDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_PU_ONLY(name, func, page, usage) static HIDWrappedDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_HID_WRAPPED_DETECTOR_PU_ONLY_DISABLED(name, func, page, usage) static HIDWrappedDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage, false)
|
||||
#define REGISTER_DYNAMIC_DETECTOR(name, func) static DynamicDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_PRE_DETECTION_HOOK(func) static PreDetectionHook device_detector_obj_##func(func)
|
||||
|
||||
#define REGISTER_DYNAMIC_I2C_DETECTOR(name, func) I2CDeviceDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_DYNAMIC_I2C_DRAM_DETECTOR(name, func, jedec_id, dram_type) I2CDRAMDeviceDetector device_detector_obj_##func(name, func, jedec_id, dram_type)
|
||||
#define REGISTER_DYNAMIC_I2C_PCI_DETECTOR(name, func, ven, dev, subven, subdev, addr) I2CPCIDeviceDetector device_detector_obj_##ven##dev##subven##subdev##addr##func(name, func, ven, dev, subven, subdev, addr)
|
||||
#define REGISTER_DYNAMIC_I2C_BUS_DETECTOR(func) I2CBusDetector device_detector_obj_##func(func)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR(name, func, vid, pid) HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_I(name, func, vid, pid, interface) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_IP(name, func, vid, pid, interface, page) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_P(name, func, vid, pid, page) HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_PU(name, func, vid, pid, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_DYNAMIC_I2C_DETECTOR(name, func) I2CDeviceDetector device_detector_obj_##func(name, func)
|
||||
#define REGISTER_DYNAMIC_I2C_DETECTOR_DISABLED(name, func) I2CDeviceDetector device_detector_obj_##func(name, func, false)
|
||||
#define REGISTER_DYNAMIC_I2C_DRAM_DETECTOR(name, func, jedec_id, dram_type) I2CDRAMDeviceDetector device_detector_obj_##func(name, func, jedec_id, dram_type)
|
||||
#define REGISTER_DYNAMIC_I2C_DRAM_DETECTOR_DISABLED(name, func, jedec_id, dram_type) I2CDRAMDeviceDetector device_detector_obj_##func(name, func, jedec_id, dram_type, false)
|
||||
#define REGISTER_DYNAMIC_I2C_PCI_DETECTOR(name, func, ven, dev, subven, subdev, addr) I2CPCIDeviceDetector device_detector_obj_##ven##dev##subven##subdev##addr##func(name, func, ven, dev, subven, subdev, addr)
|
||||
#define REGISTER_DYNAMIC_I2C_PCI_DETECTOR_DISABLED(name, func, ven, dev, subven, subdev, addr) I2CPCIDeviceDetector device_detector_obj_##ven##dev##subven##subdev##addr##func(name, func, ven, dev, subven, subdev, addr, false)
|
||||
#define REGISTER_DYNAMIC_I2C_BUS_DETECTOR(func) I2CBusDetector device_detector_obj_##func(func)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR(name, func, vid, pid) HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_DISABLED(name, func, vid, pid) HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_I(name, func, vid, pid, interface) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_I_DISABLED(name, func, vid, pid, interface) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY, false)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_IP(name, func, vid, pid, interface, page) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_IP_DISABLED(name, func, vid, pid, interface, page) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_IPU_DISABLED(name, func, vid, pid, interface, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage, false)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_P(name, func, vid, pid, page) HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_P_DISABLED(name, func, vid, pid, page) HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_PU(name, func, vid, pid, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
|
||||
#define REGISTER_DYNAMIC_HID_DETECTOR_PU_DISABLED(name, func, vid, pid, page, usage) HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage, false)
|
||||
|
||||
#define REGISTER_CUSTOM_UDEV_RULE(id, name, rule) static CustomUdevRule device_detector_obj_##id(name, rule)
|
||||
#define REGISTER_CUSTOM_UDEV_RULE(id, name, rule) static CustomUdevRule device_detector_obj_##id(name, rule)
|
||||
|
||||
+6
-2
@@ -46,7 +46,7 @@ using namespace std::chrono_literals;
|
||||
| while ensuring we don't access out of bounds |
|
||||
\*---------------------------------------------------------*/
|
||||
#define COPY_DATA_FIELD(data_ptr, data_start, field) \
|
||||
if((unsigned)(data_ptr + sizeof(field) - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + sizeof(field) - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
memcpy(&field, data_ptr, sizeof(field)); \
|
||||
data_ptr += sizeof(field); \
|
||||
@@ -57,7 +57,7 @@ using namespace std::chrono_literals;
|
||||
} \
|
||||
|
||||
#define COPY_STRING_FIELD(data_ptr, data_start, length, field) \
|
||||
if((unsigned)(data_ptr + length - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + length - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
field.assign((char *)data_ptr, length); \
|
||||
field = StringUtils::remove_null_terminating_chars(field); \
|
||||
@@ -2233,6 +2233,8 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, unsigned
|
||||
\*-------------------------------------------------*/
|
||||
else
|
||||
{
|
||||
existing_controller->AccessMutex.lock();
|
||||
|
||||
existing_controller->active_mode = new_controller->active_mode;
|
||||
existing_controller->modes.clear();
|
||||
existing_controller->modes = new_controller->modes;
|
||||
@@ -2244,6 +2246,8 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, unsigned
|
||||
existing_controller->zones = new_controller->zones;
|
||||
existing_controller->SetupColors();
|
||||
|
||||
existing_controller->AccessMutex.unlock();
|
||||
|
||||
delete new_controller;
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -49,7 +49,7 @@ using namespace std::chrono_literals;
|
||||
| while ensuring we don't access out of bounds |
|
||||
\*---------------------------------------------------------*/
|
||||
#define COPY_DATA_FIELD(data_ptr, data_start, field) \
|
||||
if((unsigned)(data_ptr + sizeof(field) - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + sizeof(field) - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
memcpy(&field, data_ptr, sizeof(field)); \
|
||||
data_ptr += sizeof(field); \
|
||||
@@ -60,7 +60,7 @@ using namespace std::chrono_literals;
|
||||
} \
|
||||
|
||||
#define COPY_STRING_FIELD(data_ptr, data_start, length, field) \
|
||||
if((unsigned)(data_ptr + length - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + length - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
field.assign((char *)data_ptr, length); \
|
||||
field = StringUtils::remove_null_terminating_chars(field); \
|
||||
@@ -72,7 +72,7 @@ using namespace std::chrono_literals;
|
||||
} \
|
||||
|
||||
#define COPY_DATA_FIELD_UNLOCK(data_ptr, data_start, field, controller) \
|
||||
if((unsigned)(data_ptr + sizeof(field) - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + sizeof(field) - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
memcpy(&field, data_ptr, sizeof(field)); \
|
||||
data_ptr += sizeof(field); \
|
||||
@@ -2662,7 +2662,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_AddSegment(NetworkCl
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size_pkt != data_size)
|
||||
{
|
||||
LOG_ERROR("[%s] AddSegment packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] AddSegment packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -2719,7 +2719,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_ClearSegments(Networ
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size != sizeof(zone_idx))
|
||||
{
|
||||
LOG_ERROR("[%s] ClearSegments packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] ClearSegments packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -2787,7 +2787,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_ConfigureZone(Networ
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size_pkt != data_size)
|
||||
{
|
||||
LOG_ERROR("[%s] ConfigureZone packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] ConfigureZone packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -2847,7 +2847,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_ResizeZone(NetworkCl
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size != (sizeof(zone_idx) + sizeof(new_size)))
|
||||
{
|
||||
LOG_ERROR("[%s] ResizeZone packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] ResizeZone packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -2922,7 +2922,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_ConfigureDevice(Netw
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size_pkt != data_size)
|
||||
{
|
||||
LOG_ERROR("[%s] ConfigureDevice packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] ConfigureDevice packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -3127,7 +3127,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateLEDs(NetworkCl
|
||||
\*-----------------------------------------------------*/
|
||||
if(!(legacy_workaround_enabled && (client_info->client_protocol_version <= 4)) && (data_size_pkt != data_size))
|
||||
{
|
||||
LOG_ERROR("[%s] UpdateLEDs packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] UpdateLEDs packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -3198,7 +3198,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateSaveMode(Netwo
|
||||
\*-----------------------------------------------------*/
|
||||
if(!(legacy_workaround_enabled && (client_info->client_protocol_version <= 4)) && (data_size_pkt != data_size))
|
||||
{
|
||||
LOG_ERROR("[%s] UpdateSaveMode packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] UpdateSaveMode packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -3290,7 +3290,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateSingleLED(Netw
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size != (sizeof(led_idx) + sizeof(RGBColor)))
|
||||
{
|
||||
LOG_ERROR("[%s] UpdateSingleLED packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] UpdateSingleLED packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -3385,7 +3385,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateZoneLEDs(Netwo
|
||||
\*-----------------------------------------------------*/
|
||||
if(!(legacy_workaround_enabled && (client_info->client_protocol_version <= 4)) && (data_size_pkt != data_size))
|
||||
{
|
||||
LOG_ERROR("[%s] UpdateZoneLEDs packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] UpdateZoneLEDs packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
@@ -3486,7 +3486,7 @@ NetPacketStatus NetworkServer::ProcessRequest_RGBController_UpdateZoneMode(Netwo
|
||||
\*-----------------------------------------------------*/
|
||||
if(data_size_pkt != data_size)
|
||||
{
|
||||
LOG_ERROR("[%s] UpdateZoneMode packet has invalid size. Packet size: %d", data_size, NETWORKSERVER);
|
||||
LOG_ERROR("[%s] UpdateZoneMode packet has invalid size. Packet size: %d", NETWORKSERVER, data_size);
|
||||
|
||||
return(NET_PACKET_STATUS_ERROR_INVALID_DATA);
|
||||
}
|
||||
|
||||
@@ -166,6 +166,7 @@ HEADERS +=
|
||||
Colors.h \
|
||||
dependencies/ColorWheel/ColorWheel.h \
|
||||
dependencies/json/nlohmann/json.hpp \
|
||||
fair_mutex.h \
|
||||
JsonUtils.h \
|
||||
LogManager.h \
|
||||
NetworkClient.h \
|
||||
|
||||
+45
-18
@@ -676,6 +676,15 @@ bool ProfileManager::SaveProfile(std::string profile_name)
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Preserve plugin data when no plugin manager is |
|
||||
| available to refresh it. |
|
||||
\*-------------------------------------------------*/
|
||||
if(existing_profile_json.contains("plugins"))
|
||||
{
|
||||
profile_json["plugins"] = existing_profile_json["plugins"];
|
||||
}
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Get plugin profile data if the plugin manager is |
|
||||
| available. If updating existing profile, only |
|
||||
@@ -696,7 +705,7 @@ bool ProfileManager::SaveProfile(std::string profile_name)
|
||||
|
||||
for(unsigned int plugin_idx = 0; plugin_idx < plugin_manager->GetPluginCount(); plugin_idx++)
|
||||
{
|
||||
if(profile_json["plugins"].contains(plugin_manager->GetPluginName(plugin_idx)))
|
||||
if(existing_profile_json["plugins"].contains(plugin_manager->GetPluginName(plugin_idx)))
|
||||
{
|
||||
plugins_to_save.push_back(plugin_manager->GetPluginName(plugin_idx));
|
||||
}
|
||||
@@ -879,6 +888,16 @@ bool ProfileManager::SaveProfileFromPlugin(std::string profile_name, std::string
|
||||
|
||||
bool ProfileManager::SaveConfiguration()
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| A local client shares the configuration file with the |
|
||||
| local server, and the server saves it when it handles |
|
||||
| the request, so the client must not write over it |
|
||||
\*-----------------------------------------------------*/
|
||||
if(ResourceManager::get()->IsLocalClient())
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Get the list of controllers from the resource manager |
|
||||
\*-----------------------------------------------------*/
|
||||
@@ -898,33 +917,41 @@ bool ProfileManager::SaveConfiguration()
|
||||
profile_json["profile_version"] = OPENRGB_PROFILE_VERSION;
|
||||
profile_json["profile_name"] = "Controller Configuration";
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Remote and virtual controllers are not saved, and |
|
||||
| they are not evidence that a saved controller is |
|
||||
| still present |
|
||||
\*-----------------------------------------------------*/
|
||||
std::vector<RGBController *> local_controllers;
|
||||
|
||||
for(std::size_t controller_index = 0; controller_index < controllers.size(); controller_index++)
|
||||
{
|
||||
if(controllers[controller_index]->GetFlags() & CONTROLLER_FLAG_REMOTE
|
||||
|| controllers[controller_index]->GetFlags() & CONTROLLER_FLAG_VIRTUAL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
local_controllers.push_back(controllers[controller_index]);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Write controller data for each controller |
|
||||
\*-----------------------------------------------------*/
|
||||
std::size_t new_saved_controller_index = 0;
|
||||
|
||||
for(std::size_t controller_index = 0; controller_index < controllers.size(); controller_index++)
|
||||
for(std::size_t controller_index = 0; controller_index < local_controllers.size(); controller_index++)
|
||||
{
|
||||
bool save_controller = false;
|
||||
|
||||
/*-------------------------------------------------*\
|
||||
| Ignore remote and virtual controllers when saving |
|
||||
| configuration |
|
||||
\*-------------------------------------------------*/
|
||||
if(controllers[controller_index]->GetFlags() & CONTROLLER_FLAG_REMOTE
|
||||
|| controllers[controller_index]->GetFlags() & CONTROLLER_FLAG_VIRTUAL)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if(controllers[controller_index]->GetFlags() & CONTROLLER_FLAGS_MANUALLY_CONFIGURED)
|
||||
if(local_controllers[controller_index]->GetFlags() & CONTROLLER_FLAGS_MANUALLY_CONFIGURED)
|
||||
{
|
||||
save_controller = true;
|
||||
}
|
||||
|
||||
for(unsigned int zone_index = 0; zone_index < controllers[controller_index]->GetZoneCount(); zone_index++)
|
||||
for(unsigned int zone_index = 0; zone_index < local_controllers[controller_index]->GetZoneCount(); zone_index++)
|
||||
{
|
||||
if(controllers[controller_index]->GetZoneFlags(zone_index) & ZONE_FLAGS_MANUALLY_CONFIGURED)
|
||||
if(local_controllers[controller_index]->GetZoneFlags(zone_index) & ZONE_FLAGS_MANUALLY_CONFIGURED)
|
||||
{
|
||||
save_controller = true;
|
||||
break;
|
||||
@@ -937,7 +964,7 @@ bool ProfileManager::SaveConfiguration()
|
||||
| Read the controller data for this controller |
|
||||
| into the profile json if manually configured |
|
||||
\*---------------------------------------------*/
|
||||
profile_json["controllers"][new_saved_controller_index] = RGBController::GetDeviceDescriptionJSON(controllers[controller_index]);
|
||||
profile_json["controllers"][new_saved_controller_index] = RGBController::GetDeviceDescriptionJSON(local_controllers[controller_index]);
|
||||
new_saved_controller_index++;
|
||||
}
|
||||
}
|
||||
@@ -951,9 +978,9 @@ bool ProfileManager::SaveConfiguration()
|
||||
{
|
||||
bool found = false;
|
||||
|
||||
for(std::size_t controller_index = 0; controller_index < controllers.size(); controller_index++)
|
||||
for(std::size_t controller_index = 0; controller_index < local_controllers.size(); controller_index++)
|
||||
{
|
||||
if(RGBController::CompareControllers(manually_configured_rgb_controllers[old_saved_controller_index], controllers[controller_index]))
|
||||
if(RGBController::CompareControllers(manually_configured_rgb_controllers[old_saved_controller_index], local_controllers[controller_index]))
|
||||
{
|
||||
found = true;
|
||||
break;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
| while ensuring we don't access out of bounds |
|
||||
\*---------------------------------------------------------*/
|
||||
#define COPY_DATA_FIELD(data_ptr, data_start, field) \
|
||||
if((unsigned)(data_ptr + sizeof(field) - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + sizeof(field) - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
memcpy(&field, data_ptr, sizeof(field)); \
|
||||
data_ptr += sizeof(field); \
|
||||
@@ -32,7 +32,7 @@
|
||||
} \
|
||||
|
||||
#define COPY_DATA_FIELD_UNLOCK(data_ptr, data_start, field, controller) \
|
||||
if((unsigned)(data_ptr + sizeof(field) - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + sizeof(field) - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
memcpy(&field, data_ptr, sizeof(field)); \
|
||||
data_ptr += sizeof(field); \
|
||||
@@ -44,7 +44,7 @@
|
||||
} \
|
||||
|
||||
#define COPY_STRING_FIELD(data_ptr, data_start, length, field) \
|
||||
if((unsigned)(data_ptr + length - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + length - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
field.assign((char *)data_ptr, length); \
|
||||
field = StringUtils::remove_null_terminating_chars(field); \
|
||||
@@ -56,7 +56,7 @@
|
||||
} \
|
||||
|
||||
#define COPY_STRING_FIELD_UNLOCK(data_ptr, data_start, length, field, controller) \
|
||||
if((unsigned)(data_ptr + length - data_start) <= (unsigned)data_size) \
|
||||
if((size_t)(data_ptr + length - data_start) <= (size_t)data_size) \
|
||||
{ \
|
||||
field.assign((char *)data_ptr, length); \
|
||||
field = StringUtils::remove_null_terminating_chars(field); \
|
||||
@@ -1507,13 +1507,12 @@ void RGBController::SetCustomMode()
|
||||
&& ((modes[mode_idx].color_mode == MODE_COLORS_PER_LED)
|
||||
|| (modes[mode_idx].color_mode == MODE_COLORS_MODE_SPECIFIC)))
|
||||
{
|
||||
active_mode = mode_idx;
|
||||
SetActiveMode(mode_idx);
|
||||
UpdateMode();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UpdateMode();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
@@ -4721,13 +4720,15 @@ bool RGBController::SetModeValuesFromMode(mode& destination, mode& source)
|
||||
&& (destination.brightness_min == source.brightness_min)
|
||||
&& (((destination.brightness_max >= destination.brightness_min) && (source.brightness >= destination.brightness_min) && (source.brightness <= destination.brightness_max))
|
||||
|| ((destination.brightness_max <= destination.brightness_min) && (source.brightness <= destination.brightness_min) && (source.brightness >= destination.brightness_max)))
|
||||
&& ((((destination.flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR)) == 0) && (source.color_mode == MODE_COLORS_NONE))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_PER_LED_COLOR) && (source.color_mode == MODE_COLORS_PER_LED))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) && (source.color_mode == MODE_COLORS_MODE_SPECIFIC))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_RANDOM_COLOR) && (source.color_mode == MODE_COLORS_RANDOM)))
|
||||
&& (destination.colors_max == source.colors_max)
|
||||
&& (destination.colors_min == source.colors_min)
|
||||
&& ((source.colors.size() >= destination.colors_min) && (source.colors.size() <= destination.colors_max))
|
||||
&& ((((destination.flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR)) == 0) && (source.color_mode == MODE_COLORS_NONE))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_PER_LED_COLOR) && (source.color_mode == MODE_COLORS_PER_LED))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) && (source.color_mode == MODE_COLORS_MODE_SPECIFIC))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_RANDOM_COLOR) && (source.color_mode == MODE_COLORS_RANDOM)))
|
||||
&& (((destination.flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) == 0)
|
||||
|| ((destination.colors_max == source.colors_max)
|
||||
&& (destination.colors_min == source.colors_min)
|
||||
&& (source.colors.size() >= destination.colors_min)
|
||||
&& (source.colors.size() <= destination.colors_max)))
|
||||
&& ((((destination.flags & (MODE_FLAG_HAS_DIRECTION_HV | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD)) == 0) && (source.direction == 0))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_HV) && ((source.direction == MODE_DIRECTION_HORIZONTAL) || (source.direction == MODE_DIRECTION_VERTICAL)))
|
||||
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_LR) && ((source.direction == MODE_DIRECTION_LEFT) || (source.direction == MODE_DIRECTION_RIGHT)))
|
||||
|
||||
@@ -421,7 +421,7 @@ void OptionHelp()
|
||||
help_text += "--startminimized Starts the GUI minimized to tray. Implies --gui, even if not specified\n";
|
||||
help_text += "--client [IP]:[Port] Starts an SDK client on the given IP:Port (assumes port 6742 if not specified)\n";
|
||||
help_text += "--server Starts the SDK's server\n";
|
||||
help_text += "--server-host Sets the SDK's server host. Default: 0.0.0.0 (all network interfaces)\n";
|
||||
help_text += "--server-host Sets the SDK's server host. Default: 127.0.0.1\n";
|
||||
help_text += "--server-port Sets the SDK's server port. Default: 6742 (1024-65535)\n";
|
||||
help_text += "-l, --list-devices Displays a simple list of active devices\n";
|
||||
help_text += "-ld --list-detailed Displays a detailed list of active devices\n";
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
+116
@@ -0,0 +1,116 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| fair_mutex.h |
|
||||
| |
|
||||
| Fair (FIFO) mutex for serialising I2C/SMBus transfers |
|
||||
| Services callers in the order they lock the mutex |
|
||||
| |
|
||||
| Adam Honse (CalcProgrammer1) 02 Sep 2026 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| fair_mutex |
|
||||
| |
|
||||
| A fair (FIFO) mutex that services lock requests in the |
|
||||
| order they are received, preventing any single caller |
|
||||
| from monopolising the mutex at the expense of callers |
|
||||
| that have been waiting longer. |
|
||||
| |
|
||||
| This is implemented as a ticket lock: every caller draws |
|
||||
| a sequentially-increasing ticket number and then waits |
|
||||
| until that ticket is at the head of the queue. An |
|
||||
| internal std::mutex guards the ticket counters; a |
|
||||
| std::condition_variable wakes all waiters when a ticket |
|
||||
| reaches the front of the queue. |
|
||||
| |
|
||||
| The class satisfies the BasicLockable requirements |
|
||||
| (lock / unlock) so it can be used with std::lock_guard |
|
||||
| and std::unique_lock, or with direct lock() / unlock() |
|
||||
| calls. |
|
||||
\*---------------------------------------------------------*/
|
||||
class fair_mutex
|
||||
{
|
||||
public:
|
||||
fair_mutex() = default;
|
||||
~fair_mutex() = default;
|
||||
|
||||
fair_mutex(const fair_mutex&) = delete;
|
||||
fair_mutex& operator=(const fair_mutex&) = delete;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Acquire the mutex. |
|
||||
| |
|
||||
| Draws the next ticket and blocks until that ticket |
|
||||
| becomes the one being served, guaranteeing FIFO |
|
||||
| ordering among all waiting threads. |
|
||||
\*-----------------------------------------------------*/
|
||||
void lock()
|
||||
{
|
||||
std::unique_lock<std::mutex> lock(internal_mutex);
|
||||
|
||||
const unsigned int ticket = next_ticket++;
|
||||
|
||||
while(ticket != serving)
|
||||
{
|
||||
cv.wait(lock);
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Release the mutex. |
|
||||
| |
|
||||
| Increments the "serving" counter so that the next |
|
||||
| ticket in the queue becomes eligible to proceed, then |
|
||||
| wakes all waiting threads. |
|
||||
\*-----------------------------------------------------*/
|
||||
void unlock()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(internal_mutex);
|
||||
|
||||
serving++;
|
||||
cv.notify_all();
|
||||
}
|
||||
|
||||
private:
|
||||
/*-----------------------------------------------------*\
|
||||
| Guards the ticket counters. This is only held for |
|
||||
| very brief critical sections (incrementing the |
|
||||
| counters) so it does not interfere with the fairness |
|
||||
| of the outer mutex. |
|
||||
\*-----------------------------------------------------*/
|
||||
std::mutex internal_mutex;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Sleeps waiters until their ticket reaches the front |
|
||||
| of the queue. notify_all() is used so that the |
|
||||
| correct waiter always wakes up regardless of the |
|
||||
| implementation's condition variable scheduling. |
|
||||
\*-----------------------------------------------------*/
|
||||
std::condition_variable cv;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Sequentially-assigned ticket number. Incremented |
|
||||
| atomically (under internal_mutex) each time a thread |
|
||||
| calls lock(). |
|
||||
| |
|
||||
| Wrapped unsigned arithmetic is safe here: the FIFO |
|
||||
| property is preserved even on wrap-around, and the |
|
||||
| probability of approaching 2^32 acquisitions is |
|
||||
| negligible for this use case. |
|
||||
\*-----------------------------------------------------*/
|
||||
unsigned int next_ticket = 0;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| The ticket number currently being served. A waiter |
|
||||
| whose ticket equals this value is permitted to |
|
||||
| proceed. |
|
||||
\*-----------------------------------------------------*/
|
||||
unsigned int serving = 0;
|
||||
};
|
||||
@@ -70,7 +70,7 @@ s32 set_sleep_mode(HANDLE pawnio_handle, s32 sleep_mode)
|
||||
return(status ? -EIO : 0);
|
||||
}
|
||||
|
||||
i2c_smbus_pawnio::i2c_smbus_pawnio(HANDLE handle, std::string name)
|
||||
i2c_smbus_pawnio::i2c_smbus_pawnio(HANDLE handle, std::string name, unsigned int index)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Store bus information |
|
||||
@@ -115,7 +115,7 @@ i2c_smbus_pawnio::i2c_smbus_pawnio(HANDLE handle, std::string name)
|
||||
name_str[7] = (char)((out[0] & 0xFF00000000000000) >> 56);
|
||||
name_str[8] = 0;
|
||||
|
||||
strncpy(this->info.device_name, name_str, 512 );
|
||||
snprintf(this->info.device_name, 512, "PawnIO SMBus %s %d", name_str, index);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
@@ -379,7 +379,7 @@ bool i2c_smbus_pawnio_detect()
|
||||
{
|
||||
bus_detected = true;
|
||||
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "i801");
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "i801", 0);
|
||||
DetectionManager::get()->RegisterI2CBus(bus);
|
||||
}
|
||||
|
||||
@@ -395,7 +395,7 @@ bool i2c_smbus_pawnio_detect()
|
||||
\*-------------------------------------------------*/
|
||||
piix4_port_sel(pawnio_handle, 0);
|
||||
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "piix4");
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "piix4_0", 0);
|
||||
DetectionManager::get()->RegisterI2CBus(bus);
|
||||
}
|
||||
|
||||
@@ -411,7 +411,7 @@ bool i2c_smbus_pawnio_detect()
|
||||
\*-------------------------------------------------*/
|
||||
piix4_port_sel(pawnio_handle, 1);
|
||||
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "piix4");
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "piix4_1", 1);
|
||||
DetectionManager::get()->RegisterI2CBus(bus);
|
||||
}
|
||||
|
||||
@@ -422,7 +422,7 @@ bool i2c_smbus_pawnio_detect()
|
||||
{
|
||||
bus_detected = true;
|
||||
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "NCT6793");
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "NCT6793", 0);
|
||||
DetectionManager::get()->RegisterI2CBus(bus);
|
||||
}
|
||||
|
||||
@@ -435,7 +435,7 @@ bool i2c_smbus_pawnio_detect()
|
||||
|
||||
imc_index_sel(pawnio_handle, 0);
|
||||
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "Intel Skylake IMC");
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "SkylakeIMC_0", 0);
|
||||
DetectionManager::get()->RegisterI2CBus(bus);
|
||||
}
|
||||
|
||||
@@ -448,7 +448,7 @@ bool i2c_smbus_pawnio_detect()
|
||||
|
||||
imc_index_sel(pawnio_handle, 1);
|
||||
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "Intel Skylake IMC");
|
||||
bus = new i2c_smbus_pawnio(pawnio_handle, "SkylakeIMC_1", 1);
|
||||
DetectionManager::get()->RegisterI2CBus(bus);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ class i2c_smbus_pawnio : public i2c_smbus_interface
|
||||
{
|
||||
public:
|
||||
static std::unordered_map<std::string, int> using_handle;
|
||||
i2c_smbus_pawnio(HANDLE handle, std::string name);
|
||||
i2c_smbus_pawnio(HANDLE handle, std::string name, unsigned int index);
|
||||
~i2c_smbus_pawnio();
|
||||
|
||||
static HRESULT start_pawnio(std::string filename, PHANDLE phandle);
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
|
||||
#include "fair_mutex.h"
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned short u16;
|
||||
typedef unsigned int u32;
|
||||
@@ -118,7 +120,7 @@ public:
|
||||
virtual s32 i2c_xfer(u8 addr, char read_write, int* size, u8* data) = 0;
|
||||
|
||||
private:
|
||||
std::mutex i2c_smbus_xfer_mutex;
|
||||
fair_mutex i2c_smbus_xfer_mutex;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -608,6 +608,7 @@
|
||||
#define GIGABYTE_GTX1070_G1_GAMING_8G_SUB_DEV 0x3772
|
||||
#define GIGABYTE_GTX1070TI_GAMING_SUB_DEV 0x3794
|
||||
#define GIGABYTE_GTX1080_G1_GAMING_SUB_DEV 0x3702
|
||||
#define GIGABYTE_GTX1080_8G_SUB_DEV 0x377D
|
||||
#define GIGABYTE_GTX1080TI_SUB_DEV 0x3752
|
||||
#define GIGABYTE_GTX1080TI_GAMING_OC_SUB_DEV 0x374C
|
||||
#define GIGABYTE_GTX1080TI_GAMING_OC_BLACK_SUB_DEV 0x377A
|
||||
@@ -759,6 +760,7 @@
|
||||
#define GIGABYTE_RX6900XT_GAMING_OC_SUB_DEV 0x232C
|
||||
#define GIGABYTE_RX9060XT_GAMING_16G_SUB_DEV 0x2434
|
||||
#define GIGABYTE_RX9060XT_GAMING_OC_16G_SUB_DEV 0x2429
|
||||
#define GIGABYTE_RX9060XT_GAMING_OC_8G_SUB_DEV 0x2430
|
||||
#define GIGABYTE_AORUS_RX9070XT_ELITE_16G_SUB_DEV 0x2426
|
||||
#define GIGABYTE_RX9070XT_GAMING_OC_16G_SUB_DEV 0x2424
|
||||
#define GIGABYTE_RX9070_GAMING_OC_16G_SUB_DEV 0x2425
|
||||
|
||||
@@ -24,6 +24,16 @@ OpenRGBDeviceEditorDialog::OpenRGBDeviceEditorDialog(RGBController *dev, QWidget
|
||||
QDialog(parent),
|
||||
ui(new Ui::OpenRGBDeviceEditorDialog)
|
||||
{
|
||||
/*-----------------------------------------------------*\
|
||||
| Type to track ordering |
|
||||
\*-----------------------------------------------------*/
|
||||
typedef struct
|
||||
{
|
||||
int order;
|
||||
std::string key;
|
||||
std::reference_wrapper<nlohmann::json> value;
|
||||
} ordered_configurations_t;
|
||||
|
||||
ui->setupUi(this);
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
@@ -73,10 +83,49 @@ OpenRGBDeviceEditorDialog::OpenRGBDeviceEditorDialog(RGBController *dev, QWidget
|
||||
| Loop through the schema and create an entry for |
|
||||
| each setting |
|
||||
\*-------------------------------------------------*/
|
||||
std::vector<ordered_configurations_t> configuration_entries;
|
||||
|
||||
for(nlohmann::json::iterator json_iterator = configuration_schema.begin(); json_iterator != configuration_schema.end(); json_iterator++)
|
||||
{
|
||||
nlohmann::json schema_entry = json_iterator.value();
|
||||
OpenRGBDynamicSettingsWidget* item_widget = new OpenRGBDynamicSettingsWidget(json_iterator.key(), schema_entry, configuration_value);
|
||||
int order = -1;
|
||||
|
||||
if(json_iterator.value().contains("order"))
|
||||
{
|
||||
order = json_iterator.value()["order"];
|
||||
}
|
||||
|
||||
ordered_configurations_t configuration_entry = {order, json_iterator.key(), json_iterator.value()};
|
||||
|
||||
if((order < 0) || (configuration_entries.size() == 0))
|
||||
{
|
||||
configuration_entries.push_back(configuration_entry);
|
||||
}
|
||||
else
|
||||
{
|
||||
bool added = false;
|
||||
|
||||
for(std::size_t configuration_idx = 0; configuration_idx < configuration_entries.size(); configuration_idx++)
|
||||
{
|
||||
if((configuration_entries[configuration_idx].order > order) || (configuration_entries[configuration_idx].order < 0))
|
||||
{
|
||||
configuration_entries.insert(configuration_entries.begin() + configuration_idx, configuration_entry);
|
||||
added = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!added)
|
||||
{
|
||||
configuration_entries.push_back(configuration_entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------*\
|
||||
| Create UI elements for each configuration entry |
|
||||
\*-----------------------------------------------------*/
|
||||
for(std::size_t configuration_idx = 0; configuration_idx < configuration_entries.size(); configuration_idx++)
|
||||
{
|
||||
OpenRGBDynamicSettingsWidget* item_widget = new OpenRGBDynamicSettingsWidget(configuration_entries[configuration_idx].key, configuration_entries[configuration_idx].value, configuration_value);
|
||||
|
||||
item_widget->SetCallback(Callback, this);
|
||||
ui->ScrollAreaDeviceConfigurationLayout->addWidget(item_widget);
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
<width>750</width>
|
||||
<height>496</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -67,8 +67,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>368</width>
|
||||
<height>172</height>
|
||||
<width>718</width>
|
||||
<height>316</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="ScrollAreaDeviceConfigurationLayout"/>
|
||||
|
||||
@@ -160,7 +160,7 @@ void OpenRGBDevicePage::SetCustomMode(unsigned char red, unsigned char green, un
|
||||
{
|
||||
for(std::size_t i = 0; i < device->GetModeColorsCount(device->GetActiveMode()); i++)
|
||||
{
|
||||
device->SetModeColor(device->GetActiveMode(), i, color);
|
||||
device->SetModeColor(device->GetActiveMode(), (unsigned int)i, color);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -573,7 +573,7 @@ void OpenRGBDevicePage::UpdateLEDList()
|
||||
\*-----------------------------------------*/
|
||||
for(std::size_t led_idx = 0; led_idx < leds_in_zone; led_idx++)
|
||||
{
|
||||
ui->LEDBox->addItem(device->GetLEDName(device->GetZoneStartIndex(selected_zone) + led_idx).c_str());
|
||||
ui->LEDBox->addItem(device->GetLEDName(device->GetZoneStartIndex(selected_zone) + (unsigned int)led_idx).c_str());
|
||||
}
|
||||
|
||||
/*-----------------------------------------*\
|
||||
@@ -627,7 +627,7 @@ void OpenRGBDevicePage::UpdateLEDList()
|
||||
\*-----------------------------------------*/
|
||||
for(std::size_t led_idx = 0; led_idx < device->GetZoneSegmentLEDsCount(selected_zone, selected_segment); led_idx++)
|
||||
{
|
||||
ui->LEDBox->addItem(device->GetLEDName(device->GetZoneStartIndex(selected_zone) + device->GetZoneSegmentStartIndex(selected_zone, selected_segment) + led_idx).c_str());
|
||||
ui->LEDBox->addItem(device->GetLEDName(device->GetZoneStartIndex(selected_zone) + device->GetZoneSegmentStartIndex(selected_zone, selected_segment) + (unsigned int)led_idx).c_str());
|
||||
}
|
||||
|
||||
/*-----------------------------------------*\
|
||||
|
||||
@@ -149,6 +149,14 @@ OpenRGBDialog::OpenRGBDialog(QWidget *parent) : QMainWindow(parent), ui(new Ui::
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
#ifdef __APPLE__
|
||||
/*-----------------------------------------------------*\
|
||||
| Apply Qt Fusion theme on MacOS, as the MacOS as the |
|
||||
| default theme does not handle vertical tabs well |
|
||||
\*-----------------------------------------------------*/
|
||||
QApplication::setStyle(QStyleFactory::create("Fusion"));
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Set window icon |
|
||||
\*-----------------------------------------------------*/
|
||||
@@ -1362,7 +1370,7 @@ void OpenRGBDialog::UpdateDevicesList()
|
||||
}
|
||||
|
||||
bool found = true;
|
||||
base_tab = controllers.size();
|
||||
base_tab = (unsigned int)controllers.size();
|
||||
|
||||
while(found)
|
||||
{
|
||||
|
||||
@@ -255,14 +255,14 @@ OpenRGBProfileEditorDialog::OpenRGBProfileEditorDialog(std::string name, QWidget
|
||||
|
||||
if(profile_json.contains("plugins"))
|
||||
{
|
||||
if(profile_json["plugins"].contains(plugin_manager->GetPluginName(plugin_idx)))
|
||||
if(profile_json["plugins"].contains(plugin_manager->GetPluginName((unsigned int)plugin_idx)))
|
||||
{
|
||||
state = Qt::Checked;
|
||||
}
|
||||
}
|
||||
|
||||
new_item->setIcon(0, QIcon(QPixmap::fromImage(plugin_manager->ActivePlugins[plugin_idx].info.Icon)));
|
||||
new_item->setText(1, QString::fromStdString(plugin_manager->GetPluginName(plugin_idx)));
|
||||
new_item->setText(1, QString::fromStdString(plugin_manager->GetPluginName((unsigned int)plugin_idx)));
|
||||
new_item->setCheckState(2, state);
|
||||
|
||||
ui->TreeWidgetPlugins->addTopLevelItem(new_item);
|
||||
|
||||
@@ -771,7 +771,7 @@ void OpenRGBZoneEditorDialog::on_ImportConfigurationButton_clicked()
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
catch(...)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,12 +160,12 @@
|
||||
<message>
|
||||
<location filename="../../DetectionManager.cpp" line="48"/>
|
||||
<source><h2>Warning:</h2><p>One or more I2C/SMBus interfaces failed to initialize.</p><p>Depending on which interfaces failed to initialize, some RGB DRAM modules, some motherboards' onboard RGB lighting, and RGB graphics cards may not be available in OpenRGB.</p><p>On Windows, this is usually caused by a failure to load the PawnIO driver.</p><p>For OpenRGB to access these devices, you must install PawnIO from <a href='https://pawnio.eu/'>https://pawnio.eu</a> and run OpenRGB as administrator or as a system service.</p><p>If you are not using any of the devices listed above, you can safely ignore this message.</p></source>
|
||||
<translation><h2>Avviso:</h2><p>Uno o più interfacce I2C/SMBus non sono riuscite ad inizializzarsi.</p><p>Dipendentemente da quali interfacce non sono riuscite ad inizializzarsi, alcuni moduli DRAM RGB, l'illuminazione RGB integrata su alcune schede madri e le schede video RGB potrebbero non essere disponibili in OpenRGB.</p><p>Su Windows, questo è generalmente causato da un fallimento nel caricare il driver PawnIO.</p><p>Per permettere a OpenRGB di accedere a questi dispositivi, è necessario installare PawnIO da <a href='https://pawnio.eu/'>https://pawnio.eu</a> e avviare OpenRGB come amministratore o come servizio di sistema.</p><p>Se non si utilizzano nessuno dei dispositivi elencati sopra, è possibile ignorare questo messaggio in sicurezza.</p></translation>
|
||||
<translation><h2>Avviso:</h2><p>Una o più interfacce I2C/SMBus non sono riuscite ad inizializzarsi.</p><p>Dipendentemente da quali interfacce non sono riuscite ad inizializzarsi, alcuni moduli DRAM RGB, l'illuminazione RGB integrata su alcune schede madri e le schede video RGB potrebbero non essere disponibili in OpenRGB.</p><p>Su Windows, questo è generalmente causato da un fallimento nel caricare il driver PawnIO.</p><p>Per permettere a OpenRGB di accedere a questi dispositivi, è necessario installare PawnIO da <a href='https://pawnio.eu/'>https://pawnio.eu</a> ed eseguire OpenRGB come amministratore o come servizio di sistema.</p><p>Se non stai utilizzando nessuno dei dispositivi sopra elencati, puoi ignorare questo messaggio in sicurezza.</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../DetectionManager.cpp" line="55"/>
|
||||
<source><h2>Warning:</h2><p>One or more I2C/SMBus interfaces failed to initialize.</p><p>Depending on which interfaces failed to initialize, some RGB DRAM modules, some motherboards' onboard RGB lighting, and RGB graphics cards may not be available in OpenRGB.</p><p>On Linux, this is usually because the i2c-dev module is not loaded.</p><p>For OpenRGB to access these devices, you must load the i2c-dev module along with the correct I2C driver module for your motherboard. This is usually i2c-piix4 for AMD systems and i2c-i801 for Intel systems.</p><p>If you are not using any of the devices listed above, you can safely ignore this message.</p></source>
|
||||
<translation><h2>Avviso:</h2><p>Uno o più interfacce I2C/SMBus non sono riuscite ad inizializzarsi.</p><p>Dipendentemente da quali interfacce non sono riuscite ad inizializzarsi, alcuni moduli RGB DRAM, alcune luci RGB integrate sulla scheda madre e schede video RGB potrebbero non essere disponibili in OpenRGB.</p><p>Su Linux, ciò accade di solito perché il modulo i2c-dev non è caricato.</p><p>Per permettere a OpenRGB di accedere a questi dispositivi, devi caricare il modulo i2c-dev insieme al modulo corretto del driver I2C per la tua scheda madre. Questo è di solito i2c-piix4 per i sistemi AMD e i2c-i801 per i sistemi Intel.</p><p>Se non stai utilizzando nessuno dei dispositivi elencati sopra, puoi ignorare sicuramente questo messaggio.</translation>
|
||||
<translation><h2>Avviso:</h2><p>Una o più interfacce I2C/SMBus non sono riuscite ad inizializzarsi.</p><p>Dipendentemente da quali interfacce non sono riuscite ad inizializzarsi, alcuni moduli DRAM RGB, alcune luci RGB integrate sulla scheda madre e schede video RGB potrebbero non essere disponibili in OpenRGB.</p><p>Su Linux, ciò accade di solito perché il modulo i2c-dev non è caricato.</p><p>Per permettere a OpenRGB di accedere a questi dispositivi, devi caricare il modulo i2c-dev insieme al modulo corretto del driver I2C per la tua scheda madre. Questo è di solito i2c-piix4 per i sistemi AMD e i2c-i801 per i sistemi Intel.</p><p>Se non stai utilizzando nessuno dei dispositivi sopra elencati, puoi ignorare questo messaggio in sicurezza.</p></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../DetectionManager.cpp" line="64"/>
|
||||
@@ -1070,7 +1070,7 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBLogConsolePage/OpenRGBLogConsolePage.ui" line="39"/>
|
||||
<source>Log Level:</source>
|
||||
<translation>Livello registro</translation>
|
||||
<translation>Livello registro:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBLogConsolePage/OpenRGBLogConsolePage.ui" line="32"/>
|
||||
|
||||
+29
-28
@@ -132,17 +132,17 @@
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/DebugSettingsEntry/DebugSettingsEntry.ui" line="69"/>
|
||||
<source>Single</source>
|
||||
<translation>Однородная область</translation>
|
||||
<translation>Зона с одним светодиодом</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/DebugSettingsEntry/DebugSettingsEntry.ui" line="76"/>
|
||||
<source>Resizable</source>
|
||||
<translation>Размер изменяем</translation>
|
||||
<translation>Зона изменяемого размера</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/DebugSettingsEntry/DebugSettingsEntry.ui" line="83"/>
|
||||
<source>Underglow</source>
|
||||
<translation>Подсветка</translation>
|
||||
<translation>Нижняя подсветка клавиатуры</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/DebugSettingsEntry/DebugSettingsEntry.ui" line="93"/>
|
||||
@@ -152,7 +152,7 @@
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/DebugSettingsEntry/DebugSettingsEntry.ui" line="100"/>
|
||||
<source>Layout:</source>
|
||||
<translation>Макет:</translation>
|
||||
<translation>Раскладка (для клавиатур):</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -301,7 +301,7 @@
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/LIFXSettingsEntry/LIFXSettingsEntry.ui" line="35"/>
|
||||
<source>Multizone</source>
|
||||
<translation>Многоцентровый</translation>
|
||||
<translation>Multizone</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/LIFXSettingsEntry/LIFXSettingsEntry.ui" line="42"/>
|
||||
@@ -316,7 +316,7 @@
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/LIFXSettingsEntry/LIFXSettingsEntry.ui" line="62"/>
|
||||
<source>Extended Multizone</source>
|
||||
<translation>Расширенный многозонный</translation>
|
||||
<translation>Extended Multizone</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -977,7 +977,7 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="686"/>
|
||||
<source>Plugins</source>
|
||||
<translation>Подключаемые модули</translation>
|
||||
<translation>Плагины</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="720"/>
|
||||
@@ -1150,43 +1150,44 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.ui" line="27"/>
|
||||
<source>Install Plugin</source>
|
||||
<translation>Установить подключаемый модуль</translation>
|
||||
<translatorcomment>We do NOT reinterpret "Plugin" as "подключаемый модуль"!!! "Плагин" is short and more widely understood</translatorcomment>
|
||||
<translation>Установить плагин</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.ui" line="37"/>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="164"/>
|
||||
<source>Remove Plugin</source>
|
||||
<translation>Удалить подключаемый модуль</translation>
|
||||
<translation>Удалить плагин</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.ui" line="44"/>
|
||||
<source><html><head/><body>Looking for plugins? See the official list at <a href="https://openrgb.org/plugins.html">OpenRGB.org</a></body></html></source>
|
||||
<translation><html><head/><body>Посмотрите список подключаемых модулей на официальном сайте <a href="https://openrgb.org/plugins.html">OpenRGB.org</a></body></html></translation>
|
||||
<translation><html><head/><body>Больше плагинов вы можете найти на официальном сайте: <a href="https://openrgb.org/plugins.html">OpenRGB.org</a></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="89"/>
|
||||
<source>Install OpenRGB Plugin</source>
|
||||
<translation>Установить подключаемый модуль OpenRGB</translation>
|
||||
<translation>Установить плагин OpenRGB</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="89"/>
|
||||
<source>Plugin files (*.dll *.dylib *.so *.so.*)</source>
|
||||
<translation>Файлы подключаемых модулей (*.dll *.dylib *.so; *.so.*)</translation>
|
||||
<translation>Файлы плагинов (*.dll *.dylib *.so; *.so.*)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="126"/>
|
||||
<source>Replace Plugin</source>
|
||||
<translation>Заменить подключаемый модуль</translation>
|
||||
<translation>Заменить плагин</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="126"/>
|
||||
<source>A plugin with this filename is already installed. Are you sure you want to replace this plugin?</source>
|
||||
<translation>Подключаемый модуль с таким названием уже существует. Заменить установленный подключаемый модуль?</translation>
|
||||
<translation>Плагин с таким названием уже существует. Заменить установленный плагин?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="164"/>
|
||||
<source>Are you sure you want to remove this plugin?</source>
|
||||
<translation>Удалить подключаемый модуль?</translation>
|
||||
<translation>Удалить плагин?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBPluginsPage/OpenRGBPluginsPage.cpp" line="224"/>
|
||||
@@ -1692,7 +1693,7 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBZoneInitializationDialog/OpenRGBZoneInitializationDialog.ui" line="39"/>
|
||||
<source><html><head/><body><p>One or more manually configurable zones have not been configured. Manually configurable zones are most commonly used for addressable RGB headers where the number of LEDs in the connected device(s) cannot be detected automatically.</p><p>Please enter the number of LEDs in each zone below.</p><p>For more information about calcuating the correct size, please check <a href="https://openrgb.org/resize.html"><span style=" text-decoration: underline; color:#0000ff;">this link.</span></a></p></body></html></source>
|
||||
<translation><html><head/><body><p>Один или несколько вручную настраиваемых зон не настроены. Вручную настраиваемые зоны чаще всего используются для адресуемых RGB заголовков, где количество светодиодов в подключенных устройствах нельзя определить автоматически.</p><p>Пожалуйста, введите количество светодиодов в каждой зоне ниже.</p><p>Для получения дополнительной информации о расчете правильного размера, пожалуйста, проверьте <a href="https://openrgb.org/resize.html"><span style=" text-decoration: underline; color:#0000ff;">этот ссылка.</span></a></p></body></html></translation>
|
||||
<translation><html><head/><body><p>Один или несколько вручную настраиваемых зон не настроены. Вручную настраиваемые зоны это чаще всего адресные разъёмы ARGB, где количество светодиодов в подключенных устройствах нельзя определить автоматически.</p><p>Пожалуйста, введите количество светодиодов в каждой зоне ниже.</p><p>Подробную информацию можно посмотреть <a href="https://openrgb.org/resize.html"><span style=" text-decoration: underline; color:#0000ff;">по этой ссылке</span></a>.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBZoneInitializationDialog/OpenRGBZoneInitializationDialog.ui" line="49"/>
|
||||
@@ -1821,12 +1822,12 @@
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/QMKORGBSettingsEntry/QMKORGBSettingsEntry.ui" line="48"/>
|
||||
<source>USB PID:</source>
|
||||
<translation>Идентификатор PID USB:</translation>
|
||||
<translation>USB PID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/QMKORGBSettingsEntry/QMKORGBSettingsEntry.ui" line="55"/>
|
||||
<source>USB VID:</source>
|
||||
<translation>USB VID: </translation>
|
||||
<translation>USB VID:</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@@ -1844,7 +1845,7 @@
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/QMKVialRGBSettingsEntry/QMKVialRGBSettingsEntry.ui" line="48"/>
|
||||
<source>USB PID:</source>
|
||||
<translation>Идентификатор PID USB:</translation>
|
||||
<translation>USB PID:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ManualDevicesSettingsPage/QMKVialRGBSettingsEntry/QMKVialRGBSettingsEntry.ui" line="55"/>
|
||||
@@ -1970,27 +1971,27 @@
|
||||
<message>
|
||||
<location filename="../../ResourceManager.cpp" line="250"/>
|
||||
<source>Serve All Controllers</source>
|
||||
<translation>Сервировать все контроллеры</translation>
|
||||
<translation>Показывать все контроллеры</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../ResourceManager.cpp" line="252"/>
|
||||
<source>Include controllers provided by client connections and plugins</source>
|
||||
<translation>Включать контроллеры, предоставляемые клиентскими соединениями и плагинами</translation>
|
||||
<translation>Показывать в том числе контроллеры с других серверов SDK и из плагинов</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../ResourceManager.cpp" line="254"/>
|
||||
<source>Default Host</source>
|
||||
<translation>Значение по умолчанию</translation>
|
||||
<translation>Хост по умолчанию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../ResourceManager.cpp" line="258"/>
|
||||
<source>Default Port</source>
|
||||
<translation>Рабочий порт по умолчанию</translation>
|
||||
<translation>Порт по умолчанию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../ResourceManager.cpp" line="264"/>
|
||||
<source>Legacy Workaround</source>
|
||||
<translation>Устаревший обходной путь</translation>
|
||||
<translation>Костыль для устаревших клиентов</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../ResourceManager.cpp" line="266"/>
|
||||
@@ -2035,12 +2036,12 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="221"/>
|
||||
<source>Numerical Labels</source>
|
||||
<translation>Цифровые метки</translation>
|
||||
<translation>Нумерованные подписи</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="222"/>
|
||||
<source>Display numerical labels for otherwise non-labeled LEDs in the LED view</source>
|
||||
<translation>Отображать числовые метки для светодиодов, которые иначе не имеют меток, в представлении светодиодов</translation>
|
||||
<translation>Отображать номера для светодиодов, которые иначе не имеют подписей на LED View</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="234"/>
|
||||
@@ -2070,7 +2071,7 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="195"/>
|
||||
<source>Monochrome Tray Icon</source>
|
||||
<translation>Отображение значка в системном лотке в оттенках серого</translation>
|
||||
<translation>Значок в трее в оттенках серого</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="244"/>
|
||||
@@ -2105,7 +2106,7 @@
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="275"/>
|
||||
<source>SMBus Sleep Mode (restart required)</source>
|
||||
<translation>Режим сна SMBus (требуется перезагрузка)</translation>
|
||||
<translation>Режим сна SMBus (потребуется перезапуск)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../OpenRGBDialog/OpenRGBDialog.cpp" line="284"/>
|
||||
|
||||
+21
-4
@@ -115,6 +115,21 @@ XML_FILE+=" <UI>\r\n"
|
||||
XML_FILE+=" <UIRef Id='WixUI_InstallDir'/>\r\n"
|
||||
XML_FILE+=" <UIRef Id='WixUI_ErrorProgressText'/>\r\n"
|
||||
XML_FILE+="\r\n"
|
||||
XML_FILE+=" <Dialog Id='WarningDialog' Width='370' Height='270' Title='!(loc.InstallDirDlg_Title)'>\r\n"
|
||||
XML_FILE+=" <Control Id='Next' Type='PushButton' X='236' Y='243' Width='56' Height='17' Default='yes' Text='!(loc.WixUINext)' />\r\n"
|
||||
XML_FILE+=" <Control Id='Back' Type='PushButton' X='180' Y='243' Width='56' Height='17' Text='!(loc.WixUIBack)' />\r\n"
|
||||
XML_FILE+=" <Control Id='Cancel' Type='PushButton' X='304' Y='243' Width='56' Height='17' Cancel='yes' Text='!(loc.WixUICancel)'>\r\n"
|
||||
XML_FILE+=" <Publish Event='SpawnDialog' Value='CancelDlg' />\r\n"
|
||||
XML_FILE+=" </Control>\r\n"
|
||||
XML_FILE+=" <Control Id='Description' Type='Text' X='25' Y='23' Width='280' Height='15' Transparent='yes' NoPrefix='yes' Text='Use at your own risk' />\r\n"
|
||||
XML_FILE+=" <Control Id='Title' Type='Text' X='15' Y='6' Width='200' Height='15' Transparent='yes' NoPrefix='yes' Text='WARNING!' />\r\n"
|
||||
XML_FILE+=" <Control Id='BannerBitmap' Type='Bitmap' X='0' Y='0' Width='370' Height='44' TabSkip='no' Text='!(loc.InstallDirDlgBannerBitmap)' />\r\n"
|
||||
XML_FILE+=" <Control Id='BannerLine' Type='Line' X='0' Y='44' Width='373' Height='0' />\r\n"
|
||||
XML_FILE+=" <Control Id='BottomLine' Type='Line' X='0' Y='234' Width='373' Height='0' />\r\n"
|
||||
XML_FILE+=" <Control Id='MainText' Type='Text' X='40' Y='60' Width='300' Height='40' Text='This project interacts directly with hardware using reverse engineered protocols. While we do our best to make sure we're sending the right data, there is always some risk in sending data to hardware when we don't understand exactly how that hardware works.' />\r\n"
|
||||
XML_FILE+=" <Control Id='SecondText' Type='Text' X='40' Y='100' Width='300' Height='40' Text='There have been issues in the past with certain hardware getting damaged/bricked and we have either disabled or fixed the offending code. That said, with OpenRGB always changing and the landscape of RGB devices being of widely varying quality, we can't guarantee it won't happen again. By installing and using OpenRGB you accept this risk.' />\r\n"
|
||||
XML_FILE+=" </Dialog>\r\n"
|
||||
XML_FILE+="\r\n"
|
||||
XML_FILE+=" <Dialog Id='PawnIODialog' Width='370' Height='270' Title='!(loc.InstallDirDlg_Title)'>\r\n"
|
||||
XML_FILE+=" <Control Id='Next' Type='PushButton' X='236' Y='243' Width='56' Height='17' Default='yes' Text='!(loc.WixUINext)' />\r\n"
|
||||
XML_FILE+=" <Control Id='Back' Type='PushButton' X='180' Y='243' Width='56' Height='17' Text='!(loc.WixUIBack)' />\r\n"
|
||||
@@ -151,18 +166,20 @@ XML_FILE+=" <Publish Property='WixUI_InstallMode' Value='Inst
|
||||
XML_FILE+=" <Publish Event='SetInstallLevel' Value='2'>2</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Event='NewDialog' Value='VerifyReadyDlg'>1</Publish>\r\n"
|
||||
XML_FILE+=" </Control>\r\n"
|
||||
XML_FILE+=" <Control Id='TypicalText' Type='Text' X='40' Y='160' Width='300' Height='40' Text='Installing OpenRGB without registering as a system service means nothing runs automatically in the background by default. Accessing devices through PawnIO will require running OpenRGB as administrator.' />\r\n"
|
||||
XML_FILE+=" <Control Id='TypicalButton' Type='PushButton' X='40' Y='200' Width='200' Height='17' ToolTip='Does not register OpenRGB as a system service. Accessing certain devices will require running the application as administrator.' Text='Do not Install System Service'>\r\n"
|
||||
XML_FILE+=" <Control Id='TypicalText' Type='Text' X='40' Y='140' Width='300' Height='40' Text='Installing OpenRGB without registering as a system service means nothing runs automatically in the background by default. Accessing devices through PawnIO will require running OpenRGB as administrator.' />\r\n"
|
||||
XML_FILE+=" <Control Id='TypicalButton' Type='PushButton' X='40' Y='180' Width='200' Height='17' ToolTip='Does not register OpenRGB as a system service. Accessing certain devices will require running the application as administrator.' Text='Do not Install System Service'>\r\n"
|
||||
XML_FILE+=" <Publish Property='WixUI_InstallMode' Value='InstallTypical'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Event='SetInstallLevel' Value='1'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Event='NewDialog' Value='VerifyReadyDlg'>1</Publish>\r\n"
|
||||
XML_FILE+=" </Control>\r\n"
|
||||
XML_FILE+=" </Dialog>\r\n"
|
||||
XML_FILE+="\r\n"
|
||||
XML_FILE+=" <Publish Dialog='InstallDirDlg' Control='Next' Event='NewDialog' Value='PawnIODialog' Order='5'>WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID=\"1\"</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='InstallDirDlg' Control='Next' Event='NewDialog' Value='WarningDialog' Order='5'>WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID=\"1\"</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='VerifyReadyDlg' Control='Back' Event='NewDialog' Value='ServiceDialog' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='WarningDialog' Control='Next' Event='NewDialog' Value='PawnIODialog' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='WarningDialog' Control='Back' Event='NewDialog' Value='InstallDirDlg' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='PawnIODialog' Control='Next' Event='NewDialog' Value='ServiceDialog' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='PawnIODialog' Control='Back' Event='NewDialog' Value='InstallDirDlg' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='PawnIODialog' Control='Back' Event='NewDialog' Value='WarningDialog' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='ServiceDialog' Control='Next' Event='NewDialog' Value='VerifyReadyDlg' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" <Publish Dialog='ServiceDialog' Control='Back' Event='NewDialog' Value='PawnIODialog' Order='2'>1</Publish>\r\n"
|
||||
XML_FILE+=" </UI>\r\n"
|
||||
|
||||
Reference in New Issue
Block a user