Add some DRGBController device IDs

This commit is contained in:
Zhi Yan 2025-04-02 01:36:41 +00:00 committed by Adam Honse
parent c5d5209154
commit 8088f81eff
5 changed files with 171 additions and 37 deletions

View file

@ -20,6 +20,63 @@ DRGBController::DRGBController(hid_device* dev_handle, const char* path, unsigne
dev = dev_handle;
location = path;
device_pid = pid;
/*-----------------------------------------------------*\
| Initialize controller |
\*-----------------------------------------------------*/
InitController();
/*-----------------------------------------------------*\
| Exit hardware effects. Start a thread to continuously|
| send a keepalive packet every 500ms |
\*-----------------------------------------------------*/
keepalive_thread_run = 1;
keepalive_thread = new std::thread(&DRGBController::KeepaliveThread, this);
}
DRGBController::~DRGBController()
{
keepalive_thread_run = 0;
keepalive_thread->join();
delete keepalive_thread;
hid_close(dev);
}
void DRGBController::KeepaliveThread()
{
unsigned char sleep_buf[65];
sleep_buf[0] = 0x65;
while(keepalive_thread_run.load())
{
if((std::chrono::steady_clock::now() - last_commit_time) > std::chrono::seconds(1))
{
SendPacketFS(sleep_buf, 1, 0);
}
std::this_thread::sleep_for(500ms);
}
}
void DRGBController::InitController()
{
/*-----------------------------------------------------*\
| Get version |
\*-----------------------------------------------------*/
unsigned char cmd_data[65];
cmd_data[0]=0x00;
cmd_data[1]=0x02;
cmd_data[2]=0x00;
hid_write(dev, cmd_data, 65);
hid_read(dev, cmd_data, 6);
version[0] = cmd_data[1];
version[1] = cmd_data[2];
version[2] = cmd_data[3];
version[3] = cmd_data[4];
}
std::string DRGBController::GetFirmwareString()
{
return "v"+std::to_string(version[0]) + "." + std::to_string(version[1]) + "." + std::to_string(version[2]) + "." + std::to_string(version[3]);
}
std::string DRGBController::GetLocationString()
@ -80,17 +137,30 @@ void DRGBController::SendPacket(unsigned char* colors, unsigned int buf_packets
}
}
void DRGBController::SendPacketFS(unsigned char* colors, unsigned int buf_packets , bool Array)
void DRGBController::SendPacketFS(unsigned char* colors, unsigned int buf_packets , unsigned int Array)
{
unsigned char usb_buf[65];
unsigned int buf_idx = 0;
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = 0x00;
if(Array)
if(Array == 0x64)
{
for(unsigned int i = 0; i < buf_packets; i++)
{
usb_buf[1] = i == buf_packets - 1 ? 200 + i : 100 + i;
usb_buf[1] = i == buf_packets - 1 ? Array + 100 + i : Array + i;
buf_idx = i*63;
for(unsigned int k=0;k<63;k++)
{
usb_buf[k+2] = colors[buf_idx + k];
}
hid_write(dev, usb_buf, 65);
}
}
else if(Array == 0x47)
{
for(unsigned int i = 0; i < buf_packets; i++)
{
usb_buf[1] = i == buf_packets - 1 ? Array + 92 + i : Array + i;
buf_idx = i*63;
for(unsigned int k=0;k<63;k++)
{

View file

@ -15,6 +15,7 @@
#include <vector>
#include <hidapi.h>
#include "RGBController.h"
#include "DeviceGuardManager.h"
#define DRGB_V4_ONE_PACKAGE_SIZE 316
#define DRGB_V4_PACKAGE_SIZE 340
@ -25,14 +26,23 @@ class DRGBController
{
public:
DRGBController(hid_device* dev_handle, const char* path, unsigned short pid);
~DRGBController();
void KeepaliveThread();
void InitController();
std::string GetFirmwareString();
std::string GetLocationString();
std::string GetSerialString();
unsigned short GetDevicePID();
void SetChannelLEDs(unsigned char channel, RGBColor * colors, unsigned int num_colors);
void SendPacket(unsigned char* colors,unsigned int buf_packets ,unsigned int LEDtotal);
void SendPacketFS(unsigned char* colors,unsigned int buf_packets ,bool Array);
void SendPacketFS(unsigned char* colors,unsigned int buf_packets ,unsigned int Array);
private:
hid_device* dev;
std::string location;
std::thread* keepalive_thread;
std::atomic<bool> keepalive_thread_run;
std::chrono::time_point<std::chrono::steady_clock> last_commit_time;
unsigned char version[4] = {0, 0, 0,0};
DeviceGuardManager* guard_manager_ptr;
unsigned short device_pid;
};

View file

@ -37,9 +37,16 @@ REGISTER_HID_DETECTOR("DRGB SIG V4F", DetectDRGBControllers, DRGBV4_VID, DRGB_SI
REGISTER_HID_DETECTOR("DRGB LED", DetectDRGBControllers, DRGBV3_VID, DRGB_LED_V3_PID);
REGISTER_HID_DETECTOR("DRGB Ultra V3", DetectDRGBControllers, DRGBV3_VID, DRGB_Ultra_V3_PID);
REGISTER_HID_DETECTOR("DRGB CORE V3", DetectDRGBControllers, DRGBV3_VID, DRGB_CORE_V3_PID);
REGISTER_HID_DETECTOR("DRGB ELITE", DetectDRGBControllers, DRGBV3_VID, DRGB_ELITE_PID);
REGISTER_HID_DETECTOR("NEEDMAX 10 ELITE", DetectDRGBControllers, DRGBV3_VID, DM_10_PID);
REGISTER_HID_DETECTOR("JPU ELITE", DetectDRGBControllers, DRGBV3_VID, JPU_12_PID);
REGISTER_HID_DETECTOR("DRGB LED Controller", DetectDRGBControllers, DRGBV2_VID, DRGB_LED_PID);
REGISTER_HID_DETECTOR("DRGB ULTRA", DetectDRGBControllers, DRGBV2_VID, DRGB_ULTRA_PID);
REGISTER_HID_DETECTOR("DRGB SIG AB", DetectDRGBControllers, DRGBV2_VID, DRGB_SIG_AB_PID);
REGISTER_HID_DETECTOR("DRGB SIG CD", DetectDRGBControllers, DRGBV2_VID, DRGB_SIG_CD_PID);
REGISTER_HID_DETECTOR("DRGB Strimer Controller", DetectDRGBControllers, DRGBV2_VID, DRGB_Strimer_PID);
REGISTER_HID_DETECTOR("YICO 8 ELITE", DetectDRGBControllers, YICO_VID, YICO_8_PID);
REGISTER_HID_DETECTOR("YICO 08 ELITE", DetectDRGBControllers, YICO_VID, YICO_08_PID);
REGISTER_HID_DETECTOR("YICO 08 ELITE", DetectDRGBControllers, YICO_VID, YICO_08_1_PID);

View file

@ -32,6 +32,7 @@ RGBController_DRGB::RGBController_DRGB(DRGBController* controller_ptr)
vendor = "DRGB";
description = "DRGB Controller Device";
type = DEVICE_TYPE_LEDSTRIP;
version = controller->GetFirmwareString();
location = controller->GetLocationString();
serial = controller->GetSerialString();
@ -103,6 +104,21 @@ void RGBController_DRGB::SetupZones()
NUM_Channel_led = 256;
Version = 3;
break;
case DRGB_ELITE_PID:
NUM_CHANNELS = 8;
NUM_Channel_led = 132;
Version = 1;
break;
case DM_10_PID:
NUM_CHANNELS = 10;
NUM_Channel_led = 132;
Version = 1;
break;
case JPU_12_PID:
NUM_CHANNELS = 12;
NUM_Channel_led = 60;
Version = 1;
break;
case DRGB_LED_PID:
NUM_CHANNELS = 8;
@ -129,13 +145,29 @@ void RGBController_DRGB::SetupZones()
NUM_Channel_led = 256;
Version = 2;
break;
case YICO_8_PID:
NUM_CHANNELS = 8;
NUM_Channel_led = 256;
Version = 3;
break;
case YICO_08_PID:
NUM_CHANNELS = 8;
NUM_Channel_led = 256;
Version = 3;
break;
case YICO_08_1_PID:
NUM_CHANNELS = 8;
NUM_Channel_led = 132;
Version = 3;
break;
}
zones.resize(NUM_CHANNELS);
for(unsigned int channel_idx = 0; channel_idx < NUM_CHANNELS; channel_idx++)
{
char ch_idx_string[2];
char ch_idx_string[4];
if(NUM_CHANNELS == 6)
{
if(channel_idx==0)
@ -159,6 +191,11 @@ void RGBController_DRGB::SetupZones()
zones[channel_idx].name = "Channel D";
}
}
else if(NUM_CHANNELS == 10 || NUM_CHANNELS == 12)
{
snprintf(ch_idx_string, 4, "%d", channel_idx+1 );
zones[channel_idx].name = "Channel ";
}
else if(channel_idx<8)
{
snprintf(ch_idx_string, 2, "%d", channel_idx + 1);
@ -223,37 +260,6 @@ void RGBController_DRGB::SetupZones()
SetupColors();
/*-----------------------------------------------------*\
| Turn off hardware effects |
\*-----------------------------------------------------*/
if(Version > 2)
{
unsigned char HWLData[64] = {0};
HWLData[0] = 0x35;
HWLData[4] = 0x00;
HWLData[5] = 0x01;
HWLData[6] = 0x01;
HWLData[7] = 0x00;
HWLData[8] = 0x00;
HWLData[9] = 0xFF;
HWLData[10] = 0x00;
HWLData[11] = 0x00;
HWLData[12] = 0x00;
HWLData[13] = 0xFF;
HWLData[14] = 0x00;
HWLData[20] = 0xF0;
HWLData[21] = 0x00;
if(Version == 4)
{
controller->SendPacketFS(&HWLData[0], 1,0);
}
else if(Version == 3)
{
controller->SendPacketFS(&HWLData[0], 1,0);
}
}
}
void RGBController_DRGB::ResizeZone(int zone, int new_size)
@ -336,7 +342,7 @@ void RGBController_DRGB::DeviceUpdateLEDs()
}
unsigned int col_packets = (led_index / DRGB_V3_PACKAGE_SIZE) + ((led_index % DRGB_V3_PACKAGE_SIZE) > 0);
controller->SendPacketFS(&ArrayData[0], 1,0);
controller->SendPacketFS(&RGBData[0], col_packets,1);
controller->SendPacketFS(&RGBData[0], col_packets,0x64);
break;
}
@ -369,6 +375,39 @@ void RGBController_DRGB::DeviceUpdateLEDs()
}
}
break;
case 1:
{
unsigned int led_index = 0;
unsigned char RGBData[1801*3] = {0};
unsigned char ArrayData[64] = {0};
ArrayData[0] = 0x46;
ArrayData[1] = 0xBB;
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
unsigned char LEDnum = zones[zone_idx].leds_count;
unsigned int HighCount = (LEDnum & 0xFFFF)>>8;
unsigned int LowCount = LEDnum & 0xFF;
ArrayData[zone_idx * 2 + 2] = HighCount;
ArrayData[zone_idx * 2 + 3] = LowCount;
for(unsigned int i=0; i<LEDnum;i++)
{
unsigned int RGBcolors = zones[zone_idx].colors[i];
RGBData[led_index * 3] = RGBcolors & 0xFF;
RGBData[led_index * 3 +1] = (RGBcolors >> 8) & 0xFF;
RGBData[led_index * 3 +2] = (RGBcolors >> 16) & 0xFF;
led_index++;
}
if(led_index>1800)
{
break;
}
}
unsigned int col_packets = (led_index / DRGB_V3_PACKAGE_SIZE) + ((led_index % DRGB_V3_PACKAGE_SIZE) > 0);
controller->SendPacketFS(&ArrayData[0], 1,0);
controller->SendPacketFS(&RGBData[0], col_packets,0x47);
break;
}
}
}

View file

@ -24,6 +24,9 @@
#define DRGB_LED_V3_PID 0x1209
#define DRGB_Ultra_V3_PID 0x1221
#define DRGB_CORE_V3_PID 0x1226
#define DRGB_ELITE_PID 0x1408
#define DM_10_PID 0x1410
#define JPU_12_PID 0x1412
#define DRGBV2_VID 0x2023
#define DRGB_LED_PID 0x1208
@ -32,6 +35,11 @@
#define DRGB_SIG_CD_PID 0x1211
#define DRGB_Strimer_PID 0x1215
#define YICO_VID 0x1368
#define YICO_8_PID 0x6077
#define YICO_08_PID 0x6078
#define YICO_08_1_PID 0x6079
class RGBController_DRGB : public RGBController
{
public: