From 06f4851ddc2b9cbba343710b11dd191e60e76f41 Mon Sep 17 00:00:00 2001 From: morg Date: Mon, 21 Feb 2022 13:34:59 +0000 Subject: [PATCH] Add NVIDIA ESA support - Closes #2236 --- 60-openrgb.rules | 5 + .../NvidiaESAController.cpp | 68 +++++++++++ .../NvidiaESAController/NvidiaESAController.h | 35 ++++++ .../NvidiaESAControllerDetect.cpp | 29 +++++ .../RGBController_NvidiaESA.cpp | 106 ++++++++++++++++++ .../RGBController_NvidiaESA.h | 31 +++++ OpenRGB.pro | 9 +- 7 files changed, 281 insertions(+), 2 deletions(-) create mode 100644 Controllers/NvidiaESAController/NvidiaESAController.cpp create mode 100644 Controllers/NvidiaESAController/NvidiaESAController.h create mode 100644 Controllers/NvidiaESAController/NvidiaESAControllerDetect.cpp create mode 100644 Controllers/NvidiaESAController/RGBController_NvidiaESA.cpp create mode 100644 Controllers/NvidiaESAController/RGBController_NvidiaESA.h diff --git a/60-openrgb.rules b/60-openrgb.rules index cd931860..b3d559c5 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -506,6 +506,11 @@ SUBSYSTEMS=="usb", ATTR{idVendor}=="1462", ATTR{idProduct}=="3fa4", TAG+="uacces #---------------------------------------------------------------# SUBSYSTEMS=="usb", ATTR{idVendor}=="1770", ATTR{idProduct}=="ff00", TAG+="uaccess" +#---------------------------------------------------------------# +# Nvidia ESA Devices # +#---------------------------------------------------------------# +SUBSYSTEMS=="usb", ATTR{idVendor}=="0955", ATTR{idProduct}=="000a", TAG+="uaccess" + #---------------------------------------------------------------# # NZXT Hue+ # #---------------------------------------------------------------# diff --git a/Controllers/NvidiaESAController/NvidiaESAController.cpp b/Controllers/NvidiaESAController/NvidiaESAController.cpp new file mode 100644 index 00000000..d879699d --- /dev/null +++ b/Controllers/NvidiaESAController/NvidiaESAController.cpp @@ -0,0 +1,68 @@ +/*-----------------------------------------*\ +| NvidiaESAController.cpp | +| | +| Driver for Nvidia ESA lighting | +| controller | +| | +| Guimard Morgan (morg) 2/18/2022 | +\*-----------------------------------------*/ +#include "NvidiaESAController.h" +#include + +NvidiaESAController::NvidiaESAController(hid_device* dev_handle, const hid_device_info& info) +{ + dev = dev_handle; + location = info.path; + version = ""; + + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + serial_number = ""; + } + else + { + std::wstring return_wstring = serial_string; + serial_number = std::string(return_wstring.begin(), return_wstring.end()); + } + +} + +NvidiaESAController::~NvidiaESAController() +{ + hid_close(dev); +} + +std::string NvidiaESAController::GetDeviceLocation() +{ + return("HID: " + location); +} + +std::string NvidiaESAController::GetSerialString() +{ + return(serial_number); +} + +std::string NvidiaESAController::GetFirmwareVersion() +{ + return(version); +} + +void NvidiaESAController::SetZoneColor(unsigned int zone_idx, RGBColor color) +{ + unsigned char red = 0x0F - 0x0F * RGBGetRValue(color) / 255.0; + unsigned char grn = 0x0F - 0x0F * RGBGetGValue(color) / 255.0; + unsigned char blu = 0x0F - 0x0F * RGBGetBValue(color) / 255.0; + + unsigned char usb_buf[4]; + + usb_buf[0x00] = 0x42 + zone_idx; + + usb_buf[0x01] = red; + usb_buf[0x02] = grn; + usb_buf[0x03] = blu; + + hid_write(dev, usb_buf, 4); +} diff --git a/Controllers/NvidiaESAController/NvidiaESAController.h b/Controllers/NvidiaESAController/NvidiaESAController.h new file mode 100644 index 00000000..73f45619 --- /dev/null +++ b/Controllers/NvidiaESAController/NvidiaESAController.h @@ -0,0 +1,35 @@ +/*-----------------------------------------*\ +| NvidiaESAController.h | +| | +| Driver for Nvidia ESA lighting | +| controller - header file | +| | +| Guimard Morgan (morg) 2/18/2022 | +\*-----------------------------------------*/ +#pragma once + +#include "RGBController.h" +#include +#include + + +class NvidiaESAController +{ +public: + NvidiaESAController(hid_device* dev_handle, const hid_device_info& info); + ~NvidiaESAController(); + + std::string GetSerialString(); + std::string GetDeviceLocation(); + std::string GetFirmwareVersion(); + + void SetZoneColor(unsigned int zone_idx, RGBColor color); + +protected: + hid_device* dev; + +private: + std::string location; + std::string serial_number; + std::string version; +}; diff --git a/Controllers/NvidiaESAController/NvidiaESAControllerDetect.cpp b/Controllers/NvidiaESAController/NvidiaESAControllerDetect.cpp new file mode 100644 index 00000000..edc36b41 --- /dev/null +++ b/Controllers/NvidiaESAController/NvidiaESAControllerDetect.cpp @@ -0,0 +1,29 @@ +#include "Detector.h" +#include "NvidiaESAController.h" +#include "RGBController.h" +#include "RGBController_NvidiaESA.h" + +/*---------------------------------------------------------*\ +| NVIDIA ESA vendor ID | +\*---------------------------------------------------------*/ +#define NVIDIA_ESA_VID 0x0955 + +/*---------------------------------------------------------*\ +| NVIDIA ESA product ID | +\*---------------------------------------------------------*/ +#define NVIDIA_ESA_DELL_XPS_730X_PID 0x000A + +void DetectNvidiaESAControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + NvidiaESAController* controller = new NvidiaESAController(dev, *info); + RGBController_NvidiaESA* rgb_controller = new RGBController_NvidiaESA(controller); + rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + +REGISTER_HID_DETECTOR_PU("Nvidia ESA - Dell XPS 730x", DetectNvidiaESAControllers, NVIDIA_ESA_VID, NVIDIA_ESA_DELL_XPS_730X_PID, 0xFFDE, 0x02); diff --git a/Controllers/NvidiaESAController/RGBController_NvidiaESA.cpp b/Controllers/NvidiaESAController/RGBController_NvidiaESA.cpp new file mode 100644 index 00000000..716cea25 --- /dev/null +++ b/Controllers/NvidiaESAController/RGBController_NvidiaESA.cpp @@ -0,0 +1,106 @@ +/*-----------------------------------------*\ +| RGBController_NvidiaESA.cpp | +| | +| Generic RGB Interface for OpenRGB | +| Nvidia ESA USB Driver | +| | +| Guimard Morgan (morg) 2/18/2022 | +\*-----------------------------------------*/ + +#include "RGBController_NvidiaESA.h" + +#include +#include + +RGBController_NvidiaESA::RGBController_NvidiaESA(NvidiaESAController* controller_ptr) +{ + controller = controller_ptr; + name = "Nvidia ESA USB Device"; + vendor = "NVIDIA"; + type = DEVICE_TYPE_MOTHERBOARD; + description = name; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + version = controller->GetFirmwareVersion(); + + mode Static; + Static.name = "Static"; + Static.value = 0x00; + Static.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE; + Static.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Static); + + SetupZones(); +} + +RGBController_NvidiaESA::~RGBController_NvidiaESA() +{ + delete controller; +} + +void RGBController_NvidiaESA::SetupZones() +{ + std::vector zone_names = + { + "Front Drive Bays", // 0x42 + "Front USB", // 0x43 + "Rear", // 0x44 + "Internal", // 0x45 + "Front Audio" // 0x46 + }; + + for(const std::string& zone_name: zone_names) + { + zone new_zone; + + new_zone.name = zone_name; + new_zone.type = ZONE_TYPE_LINEAR; + new_zone.leds_min = 1; + new_zone.leds_max = 1; + new_zone.leds_count = 1; + new_zone.matrix_map = nullptr; + + zones.emplace_back(new_zone); + + led new_led; + new_led.name = "LED"; + leds.push_back(new_led); + } + + SetupColors(); +} + +void RGBController_NvidiaESA::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_NvidiaESA::DeviceUpdateLEDs() +{ + for(unsigned int zone = 0; zone < zones.size(); zone++) + { + UpdateZoneLEDs(zone); + } +} + +void RGBController_NvidiaESA::UpdateZoneLEDs(int zone) +{ + controller->SetZoneColor(zone, zones[zone].colors[0]); +} + +void RGBController_NvidiaESA::UpdateSingleLED(int /*led*/) +{ + UpdateZoneLEDs(0); +} + +void RGBController_NvidiaESA::SetCustomMode() +{ + active_mode = 0; +} + +void RGBController_NvidiaESA::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/Controllers/NvidiaESAController/RGBController_NvidiaESA.h b/Controllers/NvidiaESAController/RGBController_NvidiaESA.h new file mode 100644 index 00000000..36024f65 --- /dev/null +++ b/Controllers/NvidiaESAController/RGBController_NvidiaESA.h @@ -0,0 +1,31 @@ +/*-----------------------------------------*\ +| RGBController_NvidiaESA.h | +| | +| Generic RGB Interface for OpenRGB | +| Nvidia ESA RGB USB Driver | +| | +| Guimard Morgan (morg) 2/18/2022 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "NvidiaESAController.h" + +class RGBController_NvidiaESA : public RGBController +{ +public: + RGBController_NvidiaESA(NvidiaESAController* controller_ptr); + ~RGBController_NvidiaESA(); + + void SetupZones(); + void ResizeZone(int zone, int new_size); + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + void DeviceUpdateMode(); + void SetCustomMode(); + +private: + NvidiaESAController* controller; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index d23da8c6..f74d330b 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -306,7 +306,7 @@ HEADERS += Controllers/ENESMBusController/ENESMBusController.h \ Controllers/ENESMBusController/RGBController_ENESMBus.h \ Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface.h \ - Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h \ + Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.h \ Controllers/EspurnaController/EspurnaController.h \ Controllers/EspurnaController/RGBController_Espurna.h \ Controllers/EVGAGP102GPUController/EVGAGP102Controller.h \ @@ -416,6 +416,8 @@ HEADERS += Controllers/MSIOptixController/RGBController_MSIOptix.h \ Controllers/MSIRGBController/MSIRGBController.h \ Controllers/MSIRGBController/RGBController_MSIRGB.h \ + Controllers/NvidiaESAController/NvidiaESAController.h \ + Controllers/NvidiaESAController/RGBController_NvidiaESA.h \ Controllers/NZXTHue2Controller/NZXTHue2Controller.h \ Controllers/NZXTHue2Controller/RGBController_NZXTHue2.h \ Controllers/NZXTHuePlusController/NZXTHuePlusController.h \ @@ -715,7 +717,7 @@ SOURCES += Controllers/ENESMBusController/ENESMBusController.cpp \ Controllers/ENESMBusController/ENESMBusControllerDetect.cpp \ Controllers/ENESMBusController/RGBController_ENESMBus.cpp \ - Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp \ + Controllers/ENESMBusController/ENESMBusInterface/ENESMBusInterface_i2c_smbus.cpp \ Controllers/EspurnaController/EspurnaController.cpp \ Controllers/EspurnaController/EspurnaControllerDetect.cpp \ Controllers/EspurnaController/RGBController_Espurna.cpp \ @@ -855,6 +857,9 @@ SOURCES += Controllers/MSIRGBController/MSIRGBController.cpp \ Controllers/MSIRGBController/MSIRGBControllerDetect.cpp \ Controllers/MSIRGBController/RGBController_MSIRGB.cpp \ + Controllers/NvidiaESAController/NvidiaESAController.cpp \ + Controllers/NvidiaESAController/NvidiaESAControllerDetect.cpp \ + Controllers/NvidiaESAController/RGBController_NvidiaESA.cpp \ Controllers/NZXTHue2Controller/NZXTHue2Controller.cpp \ Controllers/NZXTHue2Controller/NZXTHue2ControllerDetect.cpp \ Controllers/NZXTHue2Controller/RGBController_NZXTHue2.cpp \