From 53ccbd62114791c2eb98d89eb1bdbac272dcddbe Mon Sep 17 00:00:00 2001 From: Barry H Date: Thu, 23 Nov 2023 02:31:16 +0000 Subject: [PATCH] add nollie28 #3735 --- .../NollieController/NollieController.cpp | 53 ++++++++++++- .../NollieController/NollieController.h | 3 +- .../NollieControllerDetect.cpp | 3 + .../NollieController/RGBController_Nollie.cpp | 74 +++++++++++++------ .../NollieController/RGBController_Nollie.h | 15 +++- 5 files changed, 123 insertions(+), 25 deletions(-) diff --git a/Controllers/NollieController/NollieController.cpp b/Controllers/NollieController/NollieController.cpp index 35be7606..e945595f 100644 --- a/Controllers/NollieController/NollieController.cpp +++ b/Controllers/NollieController/NollieController.cpp @@ -7,6 +7,7 @@ \*-----------------------------------------*/ #include "NollieController.h" +#include "RGBController_Nollie.h" #include using namespace std::chrono_literals; @@ -55,7 +56,34 @@ void NollieController::SetMos(bool mos) void NollieController::SetChannelLEDs(unsigned char channel, RGBColor* colors, unsigned int num_colors) { - SendPacket(channel,&colors[0], num_colors); + if(usb_pid == NOLLIE32_PID || usb_pid == NOLLIE16_PID) + { + SendPacket(channel,&colors[0], num_colors); + } + else + { + unsigned int num_packets = (num_colors / 21) + ((num_colors % 21) > 0); + unsigned int color_idx = 0; + + for(unsigned int packet_idx = 0; packet_idx < num_packets; packet_idx++) + { + unsigned int colors_in_packet = 21; + if(num_colors - color_idx < colors_in_packet) + { + colors_in_packet = num_colors - color_idx; + } + SendPacketFS(channel,packet_idx,&colors[color_idx], colors_in_packet); + color_idx += colors_in_packet; + } + } +} + +void NollieController::SendUpdate() +{ + unsigned char usb_buf[65] ; + memset(usb_buf, 0x00, sizeof(usb_buf)); + usb_buf[1] = 0xff; + hid_write(dev, usb_buf, 65); } void NollieController::SendPacket(unsigned char channel,RGBColor* colors,unsigned int num_colors) @@ -84,3 +112,26 @@ void NollieController::SendPacket(unsigned char channel,RGBColor* colors,unsigne hid_write(dev, usb_buf, 1025); } +void NollieController::SendPacketFS(unsigned char channel,unsigned char packet_id,RGBColor* colors,unsigned int num_colors) +{ + unsigned char usb_buf[65]; + unsigned int packet_interval; + if (GetUSBPID() == NOLLIE28_12_PID) + { + packet_interval = 2; + } + else + { + packet_interval = 25; + } + memset(usb_buf, 0x00, sizeof(usb_buf)); + usb_buf[0x00] = 0x00; + usb_buf[0x01] = packet_id + channel * packet_interval; + for(unsigned int color_idx = 0; color_idx < num_colors; color_idx++) + { + 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]); + } + hid_write(dev, usb_buf, 65); +} diff --git a/Controllers/NollieController/NollieController.h b/Controllers/NollieController/NollieController.h index 3795ba41..b3b8a491 100644 --- a/Controllers/NollieController/NollieController.h +++ b/Controllers/NollieController/NollieController.h @@ -10,7 +10,6 @@ #include #include #include - #pragma once class NollieController @@ -21,10 +20,12 @@ public: std::string GetSerialString(); unsigned short GetUSBPID(); void SetMos(bool mos); + void SendUpdate(); void SetChannelLEDs(unsigned char channel, RGBColor * colors, unsigned int num_colors); private: hid_device* dev; std::string location; unsigned short usb_pid; void SendPacket(unsigned char channel,RGBColor * colors,unsigned int num_colors); + void SendPacketFS(unsigned char channel,unsigned char packet_id,RGBColor * colors,unsigned int num_colors); }; diff --git a/Controllers/NollieController/NollieControllerDetect.cpp b/Controllers/NollieController/NollieControllerDetect.cpp index 3eaf2750..50604557 100644 --- a/Controllers/NollieController/NollieControllerDetect.cpp +++ b/Controllers/NollieController/NollieControllerDetect.cpp @@ -36,3 +36,6 @@ void DetectNollieControllers(hid_device_info* info, const std::string& name) REGISTER_HID_DETECTOR("Nollie 32CH", DetectNollieControllers, NOLLIE32_VID, NOLLIE32_PID); REGISTER_HID_DETECTOR("Nollie 16CH", DetectNollieControllers, NOLLIE16_VID, NOLLIE16_PID); +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); diff --git a/Controllers/NollieController/RGBController_Nollie.cpp b/Controllers/NollieController/RGBController_Nollie.cpp index 8a9a8ca8..958e5433 100644 --- a/Controllers/NollieController/RGBController_Nollie.cpp +++ b/Controllers/NollieController/RGBController_Nollie.cpp @@ -43,6 +43,7 @@ void RGBController_Nollie::SetupZones() { bool first_run = false; unsigned int channels_num = 0; + unsigned int ch_led_num = 0; if(zones.size() == 0) { first_run = true; @@ -52,13 +53,23 @@ void RGBController_Nollie::SetupZones() switch(controller->GetUSBPID()) { case NOLLIE32_PID: - channels_num = 32; + channels_num = NOLLIE32_CHANNELS_NUM; + ch_led_num = NOLLIE_HS_CH_LED_NUM; channel_index = ch32; break; - default: - channels_num = 16; + case NOLLIE16_PID: + channels_num = NOLLIE16_CHANNELS_NUM; + ch_led_num = NOLLIE_HS_CH_LED_NUM; channel_index = ch16; break; + case NOLLIE28_12_PID: + channels_num = NOLLIE28_12_CHANNELS_NUM; + ch_led_num = NOLLIE_12_CH_LED_NUM; + break; + default: + channels_num = NOLLIE8_CHANNELS_NUM; + ch_led_num = NOLLIE_FS_CH_LED_NUM; + break; } zones.resize(channels_num); for(unsigned int channel_idx = 0; channel_idx < channels_num; channel_idx++) @@ -93,7 +104,7 @@ void RGBController_Nollie::SetupZones() } zones[channel_idx].type = ZONE_TYPE_LINEAR; zones[channel_idx].leds_min = 0; - zones[channel_idx].leds_max = NOLLIE_CHANNELS_LED_NUM; + zones[channel_idx].leds_max = ch_led_num; if(first_run) { @@ -124,13 +135,16 @@ void RGBController_Nollie::ResizeZone(int zone, int new_size) /*-----------------------------------------------------*\ | Set whether MOS is enabled or not | \*-----------------------------------------------------*/ - if(zone == 26 && new_size >20) + if(controller->GetUSBPID() == NOLLIE32_PID) { - controller->SetMos(false); - } - else if(zone == 26) - { - controller->SetMos(true); + if(zone == NOLLIE32_MOS_TRIGGER_CH && new_size > NOLLIE32_MOS_TRIGGER_LED) + { + controller->SetMos(false); + } + else if(zone == NOLLIE32_MOS_TRIGGER_CH) + { + controller->SetMos(true); + } } if((size_t) zone >= zones.size()) @@ -148,26 +162,42 @@ void RGBController_Nollie::ResizeZone(int zone, int new_size) void RGBController_Nollie::DeviceUpdateLEDs() { - std::vector ChSort; - for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) + unsigned int DevPid = controller->GetUSBPID(); + if(DevPid == NOLLIE32_PID || DevPid == NOLLIE16_PID) { - unsigned int channel = channel_index[zone_idx]; - if(zones[zone_idx].leds_count > 0) + std::vector ChSort; + for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) { - ChSort.push_back(channel); + unsigned int channel = channel_index[zone_idx]; + if(zones[zone_idx].leds_count > 0) + { + ChSort.push_back(channel); + } + else if(channel == 15 || channel == 31) + { + ChSort.push_back(channel); + } } - else if(channel == 15 || channel == 31) + std::sort(ChSort.begin(), ChSort.end()); + for(std::size_t i = 0; i < ChSort.size(); i++) { - ChSort.push_back(channel); + int* ptr = std::find(channel_index, channel_index + 32, ChSort[i]); + int zone_idx = ptr - channel_index; + controller->SetChannelLEDs(ChSort[i], zones[zone_idx].colors, zones[zone_idx].leds_count); } } - std::sort(ChSort.begin(), ChSort.end()); - for (std::size_t i = 0; i < ChSort.size(); i++) + else { - int* ptr = std::find(channel_index, channel_index + 32, ChSort[i]); - int zone_idx = ptr - channel_index; - controller->SetChannelLEDs(ChSort[i], zones[zone_idx].colors, zones[zone_idx].leds_count); + for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) + { + if(zones[zone_idx].leds_count > 0) + { + controller->SetChannelLEDs(zone_idx, zones[zone_idx].colors, zones[zone_idx].leds_count); + } + } + controller->SendUpdate(); } + } void RGBController_Nollie::UpdateZoneLEDs(int zone) diff --git a/Controllers/NollieController/RGBController_Nollie.h b/Controllers/NollieController/RGBController_Nollie.h index 44c91fba..3aaaf417 100644 --- a/Controllers/NollieController/RGBController_Nollie.h +++ b/Controllers/NollieController/RGBController_Nollie.h @@ -11,7 +11,9 @@ #include "RGBController.h" #include "NollieController.h" -#define NOLLIE_CHANNELS_LED_NUM 256 +#define NOLLIE_HS_CH_LED_NUM 256 +#define NOLLIE_FS_CH_LED_NUM 525 +#define NOLLIE_12_CH_LED_NUM 42 #define NOLLIE32_CHANNELS_NUM 32 #define NOLLIE32_PID 0x4714 @@ -21,6 +23,17 @@ #define NOLLIE16_PID 0x4716 #define NOLLIE16_VID 0x3061 +#define NOLLIE28_12_CHANNELS_NUM 12 +#define NOLLIE28_12_VID 0x16D2 +#define NOLLIE28_12_PID 0x1616 +#define NOLLIE28_L1_PID 0x1617 +#define NOLLIE28_L2_PID 0x1618 + +#define NOLLIE8_CHANNELS_NUM 8 + +#define NOLLIE32_MOS_TRIGGER_CH 26 +#define NOLLIE32_MOS_TRIGGER_LED 20 + class RGBController_Nollie : public RGBController { public: