OpenRGB/Controllers/JGINYUEInternalUSBController/JGINYUEInternalUSBController.cpp

271 lines
7.9 KiB
C++

/*-----------------------------------------*\
| JGINYUEInternalUSBController.cpp |
| |
| Driver for JGINYUE internal USB |
| lighting controller |
| |
| Tong R (tcr020) 2023/08/09 |
| Liu ShiMeng(Moon dream stars) 2003/08/09|
| |
| Dongguan Yonghang Electronic |
| Technology Co., Ltd |
\*-----------------------------------------*/
#include <cstring>
#include <string>
#include <stdio.h>
#include "RGBController.h"
#include "ResourceManager.h"
#include "SettingsManager.h"
#include "JGINYUEInternalUSBController.h"
#include "dependencies/dmiinfo.h"
#define JGINYUE_USB_GENERAL_COMMAND_HEADER 0x01
#define JGINYUE_USB_LED_STRIPE_SET_COMMAND_HEADER 0x05
#define JGINYUE_USB_MODE_SET_COMMAND_HEADER 0x06
#define JGINYUE_USB_PER_LED_SET_COMMAND_HEADER 0x04
#define JGINYUE_USB_GET_FW_VERSION 0xA0
#define JGINYUE_USB_GET_FW_REPLY 0x5A
#define JGINYUE_RG_DEFAULT 0x01
#define JGINYUE_RG_SWAP 0x00
using namespace std::chrono_literals;
JGINYUEInternalUSBController::JGINYUEInternalUSBController(hid_device* dev_handle, const char* path)
{
DMIInfo dmi;
dev = dev_handle;
location = path;
device_name = "JGINYUE " + dmi.getMainboard();
Init_device(device_config);
}
JGINYUEInternalUSBController::~JGINYUEInternalUSBController()
{
hid_close(dev);
}
unsigned int JGINYUEInternalUSBController::GetZoneCount()
{
return(JGINYUE_MAX_ZONES);
}
std::string JGINYUEInternalUSBController::GetDeviceLocation()
{
return("HID:" + location);
}
std::string JGINYUEInternalUSBController::GetDeviceName()
{
return(device_name);
}
std::string JGINYUEInternalUSBController::GetSerialString()
{
return("");
}
std::string JGINYUEInternalUSBController::GetDeviceFWVersion()
{
unsigned char usb_buf[16];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = JGINYUE_USB_GENERAL_COMMAND_HEADER;
usb_buf[0x01] = JGINYUE_USB_GET_FW_VERSION;
hid_write(dev, usb_buf, 16);
hid_read(dev, usb_buf, 16);
if((usb_buf[0x00] != JGINYUE_USB_GENERAL_COMMAND_HEADER) || (usb_buf[0x01] != JGINYUE_USB_GET_FW_REPLY))
{
return("");
}
std::string Major_version = std::to_string(usb_buf[0x02]);
std::string Minor_version = std::to_string(usb_buf[0x03]);
return(Major_version + "." + Minor_version);
}
void JGINYUEInternalUSBController::Init_device(AreaConfiguration* ptr_device_cfg)
{
for(int index_config = 1; index_config <= JGINYUE_MAX_ZONES; index_config++)
{
ptr_device_cfg[index_config].Brightness = JGINYUE_USB_BRIGHTNESS_DEFAULT;
ptr_device_cfg[index_config].Color_B = 0xFF;
ptr_device_cfg[index_config].Color_G = 0xFF;
ptr_device_cfg[index_config].Color_R = 0xFF;
ptr_device_cfg[index_config].RG_Swap = JGINYUE_RG_DEFAULT;
ptr_device_cfg[index_config].Speed = JGINYUE_USB_SPEED_DEFAULT;
ptr_device_cfg[index_config].LED_numbers = 0;
ptr_device_cfg[index_config].Mode_active = JGINYUE_USB_MODE_STATIC;
}
}
void JGINYUEInternalUSBController::WriteZoneMode
(
unsigned char zone,
unsigned char mode,
RGBColor rgb,
unsigned char speed,
unsigned char brightness,
unsigned char direction
)
{
int Active_zone;
unsigned char usb_buf[65];
switch(zone)
{
case 0x01:
Active_zone = 1;
break;
case 0x02:
Active_zone = 2;
break;
default:
Active_zone = 1;
return;
break;
}
device_config[Active_zone].Mode_active = mode;
device_config[Active_zone].Direct_Mode_control = 0x00;
device_config[Active_zone].Speed = speed;
device_config[Active_zone].Brightness = brightness;
device_config[Active_zone].Direction = direction;
device_config[Active_zone].Color_B = RGBGetBValue(rgb);
device_config[Active_zone].Color_G = RGBGetGValue(rgb);
device_config[Active_zone].Color_R = RGBGetRValue(rgb);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = JGINYUE_USB_LED_STRIPE_SET_COMMAND_HEADER;
usb_buf[0x01] = zone;
usb_buf[0x02] = device_config[Active_zone].LED_numbers;
usb_buf[0x03] = device_config[Active_zone].RG_Swap;
usb_buf[0x04] = device_config[Active_zone].Direction;
usb_buf[0x05] = device_config[Active_zone].Direct_Mode_control;
hid_write(dev, usb_buf, 16);
std::this_thread::sleep_for(5ms);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = JGINYUE_USB_MODE_SET_COMMAND_HEADER;
usb_buf[0x01] = zone;
usb_buf[0x02] = device_config[Active_zone].Mode_active;
usb_buf[0x03] = device_config[Active_zone].Color_R;
usb_buf[0x04] = device_config[Active_zone].Color_G;
usb_buf[0x05] = device_config[Active_zone].Color_B;
usb_buf[0x06] = device_config[Active_zone].Brightness;
usb_buf[0x07] = device_config[Active_zone].Speed;
hid_write(dev, usb_buf, 16);
}
void JGINYUEInternalUSBController::DirectLEDControl
(
RGBColor* colors,
unsigned char zone
)
{
int Active_zone;
unsigned char usb_buf[302];
switch(zone)
{
case 0x01:
Active_zone = 1;
break;
case 0x02:
Active_zone = 2;
break;
default:
Active_zone = 1;
return;
break;
}
device_config[Active_zone].Mode_active =JGINYUE_USB_MODE_DIRECT;
device_config[Active_zone].Direct_Mode_control =0x01;
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = JGINYUE_USB_LED_STRIPE_SET_COMMAND_HEADER;
usb_buf[0x01] = zone;
usb_buf[0x02] = device_config[Active_zone].LED_numbers;
usb_buf[0x03] = device_config[Active_zone].RG_Swap;
usb_buf[0x04] = device_config[Active_zone].Direction;
usb_buf[0x05] = device_config[Active_zone].Direct_Mode_control;
hid_write(dev, usb_buf, 16);
std::this_thread::sleep_for(5ms);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = JGINYUE_USB_PER_LED_SET_COMMAND_HEADER;
usb_buf[0x01] = zone;
for(unsigned int color_idx = 0; color_idx < device_config[Active_zone].LED_numbers; color_idx++)
{
usb_buf[color_idx * 3 + 2] = RGBGetRValue(colors[color_idx]);
usb_buf[color_idx * 3 + 3] = RGBGetGValue(colors[color_idx]);
usb_buf[color_idx * 3 + 4] = RGBGetBValue(colors[color_idx]);
}
hid_send_feature_report(dev, usb_buf, 302);
}
void JGINYUEInternalUSBController::Area_resize(unsigned char led_numbers, unsigned char zone)
{
unsigned char usb_buf[65];
int Active_zone;
switch(zone)
{
case 0x01:
Active_zone = 1;
break;
case 0x02:
Active_zone = 2;
break;
default:
Active_zone = 1;
return;
break;
}
device_config[Active_zone].LED_numbers = led_numbers;
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = JGINYUE_USB_LED_STRIPE_SET_COMMAND_HEADER;
usb_buf[0x01] = zone;
usb_buf[0x02] = device_config[Active_zone].LED_numbers;
usb_buf[0x03] = device_config[Active_zone].RG_Swap;
usb_buf[0x04] = device_config[Active_zone].Direction;
usb_buf[0x05] = device_config[Active_zone].Direct_Mode_control;
hid_write(dev, usb_buf, 16);
}
void JGINYUEInternalUSBController::SetRGSwap(unsigned char RGSwap)
{
if((RGSwap != 0x00) && (RGSwap != 0x01))
{
return;
}
for(int index_config=1; index_config <=JGINYUE_MAX_ZONES; index_config++)
{
device_config[index_config].RG_Swap = RGSwap;
}
}