From 257e9ca8678cf0aac346b445e56fe2ff17522b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AF=BA=E8=AF=BA?= <2777618756@qq.com> Date: Thu, 2 Apr 2026 00:21:37 +0000 Subject: [PATCH] Add Nollie controller OS2.1 --- .../NollieController/NollieController.cpp | 11 ++-- .../NollieControllerDetect.cpp | 8 ++- .../NollieController/NollieDevices.cpp | 50 +++++++++++++++++++ Controllers/NollieController/NollieDevices.h | 7 +++ .../NollieController/RGBController_Nollie.cpp | 5 +- 5 files changed, 75 insertions(+), 6 deletions(-) diff --git a/Controllers/NollieController/NollieController.cpp b/Controllers/NollieController/NollieController.cpp index f06d8a29b..b3c6548b8 100644 --- a/Controllers/NollieController/NollieController.cpp +++ b/Controllers/NollieController/NollieController.cpp @@ -1,4 +1,4 @@ -/*---------------------------------------------------------*\ +/*---------------------------------------------------------*\ | NollieController.cpp | | | | Driver for Nollie | @@ -136,7 +136,8 @@ void NollieController::SetMos(bool mos) void NollieController::SetChannelLEDs(unsigned char channel, RGBColor* colors, unsigned int num_colors) { - if(usb_pid == NOLLIE32_PID || usb_pid == NOLLIE16_PID) + if(usb_pid == NOLLIE32_PID || usb_pid == NOLLIE16_PID + || usb_pid == NOLLIE32_OS2_1_PID || usb_pid == NOLLIE16_OS2_1_PID) { SendPacket(channel,&colors[0], num_colors); } @@ -216,9 +217,12 @@ void NollieController::SendPacketFS(unsigned char channel,unsigned char packet_i packet_interval = 2; break; case NOLLIE8_PID: + case NOLLIE8_OS2_1_PID: + case PRISM8_OS2_1_PID: packet_interval = 6; break; case NOLLIE1_PID: + case NOLLIE1_OS2_1_PID: packet_interval = 30; break; default: @@ -233,7 +237,8 @@ void NollieController::SendPacketFS(unsigned char channel,unsigned char packet_i usb_buf[0x02 + (color_idx * 3)] = RGBGetRValue(colors[color_idx]); usb_buf[0x03 + (color_idx * 3)] = RGBGetGValue(colors[color_idx]); usb_buf[0x04 + (color_idx * 3)] = RGBGetBValue(colors[color_idx]); - if(dev_pid == NOLLIE8_PID || dev_pid == NOLLIE1_PID ) + if(dev_pid == NOLLIE8_PID || dev_pid == NOLLIE1_PID + || dev_pid == NOLLIE8_OS2_1_PID || dev_pid == NOLLIE1_OS2_1_PID || dev_pid == PRISM8_OS2_1_PID) { usb_buf[0x02 + (color_idx * 3)] = RGBGetGValue(colors[color_idx]); usb_buf[0x03 + (color_idx * 3)] = RGBGetRValue(colors[color_idx]); diff --git a/Controllers/NollieController/NollieControllerDetect.cpp b/Controllers/NollieController/NollieControllerDetect.cpp index 424368c6a..acad90c7c 100644 --- a/Controllers/NollieController/NollieControllerDetect.cpp +++ b/Controllers/NollieController/NollieControllerDetect.cpp @@ -1,4 +1,4 @@ -/*---------------------------------------------------------*\ +/*---------------------------------------------------------*\ | NollieControllerDetect.cpp | | | | Detector for Nollie | @@ -44,3 +44,9 @@ REGISTER_HID_DETECTOR("Nollie 32_OS2", DetectNollieControllers, NOLLIERGBOS_2_VI 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); +/* OS2_1 composite device: RGB HID on interface 2 (1/8 CH) or 0 (16/32 CH) */ +REGISTER_HID_DETECTOR_I("Nollie 32_OS2_1", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE32_OS2_1_PID, 0); +REGISTER_HID_DETECTOR_I("Nollie 16_OS2_1", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE16_OS2_1_PID, 0); +REGISTER_HID_DETECTOR_I("Nollie 8_OS2_1", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE8_OS2_1_PID, 2); +REGISTER_HID_DETECTOR_I("Prism8 8_OS2_1", DetectNollieControllers, NOLLIERGBOS_2_VID, PRISM8_OS2_1_PID, 2); +REGISTER_HID_DETECTOR_I("Nollie 1_OS2_1", DetectNollieControllers, NOLLIERGBOS_2_VID, NOLLIE1_OS2_1_PID, 2); diff --git a/Controllers/NollieController/NollieDevices.cpp b/Controllers/NollieController/NollieDevices.cpp index dd6b7b3c9..00a45fb72 100644 --- a/Controllers/NollieController/NollieDevices.cpp +++ b/Controllers/NollieController/NollieDevices.cpp @@ -121,6 +121,51 @@ static const nollie_device nollie1_os2 = dflt }; +static const nollie_device nollie32_os2_1 = +{ + NOLLIERGBOS_2_VID, + NOLLIE32_OS2_1_PID, + 32, + NOLLIE_HS_CH_LED_NUM, + ch32 +}; + +static const nollie_device nollie16_os2_1 = +{ + NOLLIERGBOS_2_VID, + NOLLIE16_OS2_1_PID, + 16, + NOLLIE_HS_CH_LED_NUM, + n16 +}; + +static const nollie_device nollie8_os2_1 = +{ + NOLLIERGBOS_2_VID, + NOLLIE8_OS2_1_PID, + 8, + 126, + dflt +}; + +static const nollie_device prism8_os2_1 = +{ + NOLLIERGBOS_2_VID, + PRISM8_OS2_1_PID, + 8, + 126, + dflt +}; + +static const nollie_device nollie1_os2_1 = +{ + NOLLIERGBOS_2_VID, + NOLLIE1_OS2_1_PID, + 1, + 630, + dflt +}; + /*---------------------------------------------------------*\ | Nollie Device List | \*---------------------------------------------------------*/ @@ -137,6 +182,11 @@ static const nollie_device* device_list[] = &nollie16_os2, &nollie8_os2, &nollie1_os2, + &nollie32_os2_1, + &nollie16_os2_1, + &nollie8_os2_1, + &prism8_os2_1, + &nollie1_os2_1, }; const unsigned int NOLLIE_NUM_DEVICES = (sizeof(device_list) / sizeof(device_list[ 0 ])); diff --git a/Controllers/NollieController/NollieDevices.h b/Controllers/NollieController/NollieDevices.h index 0a572cfe6..b86481c22 100644 --- a/Controllers/NollieController/NollieDevices.h +++ b/Controllers/NollieController/NollieDevices.h @@ -34,6 +34,13 @@ #define NOLLIE28_L1_PID 0x1617 #define NOLLIE28_L2_PID 0x1618 +/* OS2_1 USB layout (interface 2 for 1/8 CH, 0 for 16/32 CH); same HID protocol */ +#define NOLLIE1_OS2_1_PID 0x2A01 +#define NOLLIE8_OS2_1_PID 0x2A08 +#define PRISM8_OS2_1_PID 0x2C08 +#define NOLLIE16_OS2_1_PID 0x2A16 +#define NOLLIE32_OS2_1_PID 0x2A32 + /*---------------------------------------------------------*\ | Common Nollie LED counts | \*---------------------------------------------------------*/ diff --git a/Controllers/NollieController/RGBController_Nollie.cpp b/Controllers/NollieController/RGBController_Nollie.cpp index e1c8906de..2e2a17e36 100644 --- a/Controllers/NollieController/RGBController_Nollie.cpp +++ b/Controllers/NollieController/RGBController_Nollie.cpp @@ -1,4 +1,4 @@ -/*---------------------------------------------------------*\ +/*---------------------------------------------------------*\ | RGBController_Nollie.cpp | | | | RGBController for Nollie | @@ -156,7 +156,8 @@ void RGBController_Nollie::DeviceConfigureZone(int zone_idx) void RGBController_Nollie::DeviceUpdateLEDs() { unsigned int DevPid = controller->GetUSBPID(); - if(DevPid == NOLLIE32_PID || DevPid == NOLLIE16_PID) + if(DevPid == NOLLIE32_PID || DevPid == NOLLIE16_PID + || DevPid == NOLLIE32_OS2_1_PID || DevPid == NOLLIE16_OS2_1_PID) { const int* channel_index = controller->GetChannelIndex(); std::vector ChSort;