add nollie28 #3735
This commit is contained in:
parent
9ffd853ae4
commit
53ccbd6211
5 changed files with 123 additions and 25 deletions
|
|
@ -7,6 +7,7 @@
|
|||
\*-----------------------------------------*/
|
||||
|
||||
#include "NollieController.h"
|
||||
#include "RGBController_Nollie.h"
|
||||
#include <cstring>
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@
|
|||
#include <chrono>
|
||||
#include <vector>
|
||||
#include <hidapi/hidapi.h>
|
||||
|
||||
#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);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<int> 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<int> 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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue