diff --git a/Controllers/DRGBController/DRGBController.cpp b/Controllers/DRGBController/DRGBController.cpp index fbd64f4f..9aaddc14 100644 --- a/Controllers/DRGBController/DRGBController.cpp +++ b/Controllers/DRGBController/DRGBController.cpp @@ -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++) { diff --git a/Controllers/DRGBController/DRGBController.h b/Controllers/DRGBController/DRGBController.h index 52c8438d..19c368d7 100644 --- a/Controllers/DRGBController/DRGBController.h +++ b/Controllers/DRGBController/DRGBController.h @@ -15,6 +15,7 @@ #include #include #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 keepalive_thread_run; + std::chrono::time_point last_commit_time; + unsigned char version[4] = {0, 0, 0,0}; + DeviceGuardManager* guard_manager_ptr; unsigned short device_pid; }; diff --git a/Controllers/DRGBController/DRGBControllerDetect.cpp b/Controllers/DRGBController/DRGBControllerDetect.cpp index b16ddfa5..9aea3cb0 100644 --- a/Controllers/DRGBController/DRGBControllerDetect.cpp +++ b/Controllers/DRGBController/DRGBControllerDetect.cpp @@ -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); diff --git a/Controllers/DRGBController/RGBController_DRGB.cpp b/Controllers/DRGBController/RGBController_DRGB.cpp index d58c763e..bec688a0 100644 --- a/Controllers/DRGBController/RGBController_DRGB.cpp +++ b/Controllers/DRGBController/RGBController_DRGB.cpp @@ -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> 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; + } } } diff --git a/Controllers/DRGBController/RGBController_DRGB.h b/Controllers/DRGBController/RGBController_DRGB.h index fafb4ae6..b2f5f4e6 100644 --- a/Controllers/DRGBController/RGBController_DRGB.h +++ b/Controllers/DRGBController/RGBController_DRGB.h @@ -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: