Add some DRGBController device IDs
This commit is contained in:
parent
c5d5209154
commit
8088f81eff
5 changed files with 171 additions and 37 deletions
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue