Add Nollie 1, 8, 16 & 32 OS2 Firmware support

This commit is contained in:
Barry H 2025-08-18 14:03:18 +08:00 committed by Adam Honse
parent 676547b8b0
commit cd6831ccbe
5 changed files with 49 additions and 19 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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);

View file

@ -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);
}

View file

@ -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};
};