diff --git a/Controllers/NollieController/NollieController.cpp b/Controllers/NollieController/NollieController.cpp index 05097f7e..b6a4184e 100644 --- a/Controllers/NollieController/NollieController.cpp +++ b/Controllers/NollieController/NollieController.cpp @@ -15,11 +15,12 @@ using namespace std::chrono_literals; -NollieController::NollieController(hid_device* dev_handle, const char* path, unsigned short pid, std::string dev_name) +NollieController::NollieController(hid_device* dev_handle, const char* path, unsigned short vid, unsigned short pid, std::string dev_name) { dev = dev_handle; location = path; name = dev_name; + usb_vid = vid; usb_pid = pid; } @@ -51,6 +52,11 @@ unsigned short NollieController::GetUSBPID() return(usb_pid); } +unsigned short NollieController::GetUSBVID() +{ + return(usb_vid); +} + void NollieController::InitChLEDs(int *led_num_list,int ch_num) { unsigned char usb_buf[65]; @@ -108,32 +114,41 @@ void NollieController::SendUpdate() void NollieController::SendPacket(unsigned char channel,RGBColor* colors,unsigned int num_colors) { - unsigned char usb_buf[1025]; memset(usb_buf, 0x00, sizeof(usb_buf)); usb_buf[1] = channel; usb_buf[2] = 0; usb_buf[3] = num_colors / 256; usb_buf[4] = num_colors % 256; - if(!num_colors) + if(num_colors) { - hid_write(dev, usb_buf, 1025); - return; - } - for(unsigned int color_idx = 0; color_idx < num_colors; color_idx++) - { - usb_buf[0x05 + (color_idx * 3)] = RGBGetGValue(colors[color_idx]); - usb_buf[0x06 + (color_idx * 3)] = RGBGetRValue(colors[color_idx]); - usb_buf[0x07 + (color_idx * 3)] = RGBGetBValue(colors[color_idx]); + for(unsigned int color_idx = 0; color_idx < num_colors; color_idx++) + { + usb_buf[0x05 + (color_idx * 3)] = RGBGetGValue(colors[color_idx]); + usb_buf[0x06 + (color_idx * 3)] = RGBGetRValue(colors[color_idx]); + usb_buf[0x07 + (color_idx * 3)] = RGBGetBValue(colors[color_idx]); + } } + /*-----------------------------------------------------*\ | Send packet | \*-----------------------------------------------------*/ - hid_write(dev, usb_buf, 1025); - if(channel == NOLLIE32_FLAG1_CHANNEL || channel == NOLLIE32_FLAG2_CHANNEL) + if(channel == NOLLIE32_FLAG1_CHANNEL) { + usb_buf[2] = 1; + hid_write(dev, usb_buf, 1025); std::this_thread::sleep_for(std::chrono::milliseconds(8)); } + else if(channel == NOLLIE32_FLAG2_CHANNEL) + { + usb_buf[2] = 2; + hid_write(dev, usb_buf, 1025); + std::this_thread::sleep_for(std::chrono::milliseconds(8)); + } + else + { + hid_write(dev, usb_buf, 1025); + } } void NollieController::SendPacketFS(unsigned char channel,unsigned char packet_id,RGBColor* colors,unsigned int num_colors) diff --git a/Controllers/NollieController/NollieController.h b/Controllers/NollieController/NollieController.h index 86ed420e..12149d97 100644 --- a/Controllers/NollieController/NollieController.h +++ b/Controllers/NollieController/NollieController.h @@ -22,6 +22,8 @@ #define NOLLIE_HS_CH_LED_NUM 256 #define NOLLIE_FS_CH_LED_NUM 525 +#define NOLLIERGBOS_2_VID 0x16D5 + #define NOLLIE32_CHANNELS_NUM 32 #define NOLLIE32_PID 0x4714 #define NOLLIE32_VID 0x3061 @@ -52,11 +54,12 @@ class NollieController { public: - NollieController(hid_device* dev_handle, const char* path, unsigned short pid, std::string dev_name); + NollieController(hid_device* dev_handle, const char* path, unsigned short vid, unsigned short pid, std::string dev_name); std::string GetLocationString(); std::string GetNameString(); std::string GetSerialString(); + unsigned short GetUSBVID(); unsigned short GetUSBPID(); void SetMos(bool mos); @@ -68,6 +71,7 @@ private: hid_device* dev; std::string location; std::string name; + unsigned short usb_vid; unsigned short usb_pid; void SendPacket(unsigned char channel,RGBColor * colors,unsigned int num_colors); diff --git a/Controllers/NollieController/NollieControllerDetect.cpp b/Controllers/NollieController/NollieControllerDetect.cpp index cec260d4..ac8e5ecc 100644 --- a/Controllers/NollieController/NollieControllerDetect.cpp +++ b/Controllers/NollieController/NollieControllerDetect.cpp @@ -25,7 +25,7 @@ void DetectNollieControllers(hid_device_info* info, const std::string& name) std::wstring product_str(product); - NollieController* controller = new NollieController(dev, info->path,info->product_id, name); + NollieController* controller = new NollieController(dev, info->path, info->vendor_id, info->product_id, name); RGBController_Nollie* rgb_controller = new RGBController_Nollie(controller); ResourceManager::get()->RegisterRGBController(rgb_controller); @@ -40,3 +40,8 @@ REGISTER_HID_DETECTOR("Nollie 1CH", DetectNollieControllers, NOLLIE1_VID, NOLLIE REGISTER_HID_DETECTOR("Nollie 28 12", DetectNollieControllers, NOLLIE28_12_VID, NOLLIE28_12_PID); REGISTER_HID_DETECTOR("Nollie 28 L1", DetectNollieControllers, NOLLIE28_12_VID, NOLLIE28_L1_PID); REGISTER_HID_DETECTOR("Nollie 28 L2", DetectNollieControllers, NOLLIE28_12_VID, NOLLIE28_L2_PID); +//Nollie OS2 Firmware +REGISTER_HID_DETECTOR("Nollie 32_OS2", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE32_PID); +REGISTER_HID_DETECTOR("Nollie 16_OS2", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE16_PID); +REGISTER_HID_DETECTOR("Nollie 8_OS2", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE8_PID); +REGISTER_HID_DETECTOR("Nollie 1_OS2", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE1_PID); diff --git a/Controllers/NollieController/RGBController_Nollie.cpp b/Controllers/NollieController/RGBController_Nollie.cpp index fc697249..61dcb44e 100644 --- a/Controllers/NollieController/RGBController_Nollie.cpp +++ b/Controllers/NollieController/RGBController_Nollie.cpp @@ -72,6 +72,8 @@ void RGBController_Nollie::SetupZones() channels_num = NOLLIE16_CHANNELS_NUM; ch_led_num = NOLLIE_HS_CH_LED_NUM; channel_index = ch16; + if (controller->GetUSBVID() == NOLLIERGBOS_2_VID) + channel_index = n16; break; case NOLLIE28_12_PID: channels_num = NOLLIE28_12_CHANNELS_NUM; @@ -152,9 +154,9 @@ void RGBController_Nollie::SetupZones() void RGBController_Nollie::ResizeZone(int zone, int new_size) { /*-----------------------------------------------------*\ - | Set whether MOS is enabled or not | + | Set whether MOS is enabled or not | \*-----------------------------------------------------*/ - if(controller->GetUSBPID() == NOLLIE32_PID) + if(controller->GetUSBVID() == NOLLIE32_VID && NOLLIE32_PID == controller->GetUSBPID()) { if(zone == NOLLIE32_MOS_TRIGGER_CH && new_size > NOLLIE32_MOS_TRIGGER_LED) { @@ -165,8 +167,11 @@ void RGBController_Nollie::ResizeZone(int zone, int new_size) controller->SetMos(true); } } - // Nollie1 needs to report the number of LEDs - if(controller->GetUSBPID() == NOLLIE1_PID) + + /*-----------------------------------------------------*\ + | Nollie1 needs to report the number of LEDs | + \*-----------------------------------------------------*/ + if(controller->GetUSBVID() == NOLLIE1_VID && controller->GetUSBPID() == NOLLIE1_PID) { controller->InitChLEDs(&new_size,NOLLIE1_CHANNELS_NUM); } diff --git a/Controllers/NollieController/RGBController_Nollie.h b/Controllers/NollieController/RGBController_Nollie.h index 31a0478c..5fbafa7a 100644 --- a/Controllers/NollieController/RGBController_Nollie.h +++ b/Controllers/NollieController/RGBController_Nollie.h @@ -38,4 +38,5 @@ private: int ch32[32] = {5, 4, 3, 2, 1, 0, 15, 14, 26, 27, 28, 29, 30, 31, 8, 9, 19, 18, 17, 16, 7, 6, 25, 24, 23, 22, 21, 20, 13, 12, 11, 10}; int ch16[32] = {19, 18, 17, 16, 24, 25, 26, 27, 20, 21, 22, 23, 31, 30, 29, 28, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + int n16[16] = {3, 2, 1, 0, 8, 9, 10, 11, 4, 5, 6, 7, 15, 14, 13, 12}; };