From effa243adb2bacd7b796cf561e6d73dbdd82a75a Mon Sep 17 00:00:00 2001 From: Felipe Cavalcanti Date: Fri, 14 Aug 2020 19:43:20 -0300 Subject: [PATCH] Adding support for CPU Cooler Gigabyte Aorus ATC800 --- 60-openrgb.rules | 5 + .../ATC800Controller.cpp | 116 ++++++++++++++ .../ATC800Controller.h | 59 ++++++++ .../AorusCPUCoolerControllerDetect.cpp | 87 +++++++++++ OpenRGB.pro | 6 + RGBController/RGBController_AorusATC800.cpp | 142 ++++++++++++++++++ RGBController/RGBController_AorusATC800.h | 32 ++++ 7 files changed, 447 insertions(+) create mode 100644 Controllers/AorusCPUCoolerController/ATC800Controller.cpp create mode 100644 Controllers/AorusCPUCoolerController/ATC800Controller.h create mode 100644 Controllers/AorusCPUCoolerController/AorusCPUCoolerControllerDetect.cpp create mode 100644 RGBController/RGBController_AorusATC800.cpp create mode 100644 RGBController/RGBController_AorusATC800.h diff --git a/60-openrgb.rules b/60-openrgb.rules index 28ab25b2..00984a6a 100644 --- a/60-openrgb.rules +++ b/60-openrgb.rules @@ -19,6 +19,11 @@ KERNEL=="hidraw*", SUBSYSTEM=="hidraw", TAG+="uaccess" #---------------------------------------------------------------# SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0051", TAG+="uaccess" +#---------------------------------------------------------------# +# Aorus Devices # +#---------------------------------------------------------------# +SUBSYSTEMS=="usb", ATTR{idVendor}=="1044", ATTR{idProduct}=="7a42", TAG+="uaccess" + #---------------------------------------------------------------# # ASUS Aura Core Devices # #---------------------------------------------------------------# diff --git a/Controllers/AorusCPUCoolerController/ATC800Controller.cpp b/Controllers/AorusCPUCoolerController/ATC800Controller.cpp new file mode 100644 index 00000000..89e12bf5 --- /dev/null +++ b/Controllers/AorusCPUCoolerController/ATC800Controller.cpp @@ -0,0 +1,116 @@ +/*-----------------------------------------*\ +| ATC800Controller.cpp | +| | +| Driver for Aorus ATC800 CPU Cooler | +| | +| | +| Felipe Cavalcanti 08/13/2020 | +\*-----------------------------------------*/ + +#include "ATC800Controller.h" + +#include + +ATC800Controller::ATC800Controller(hid_device* dev_handle) +{ + dev = dev_handle; +} + +ATC800Controller::~ATC800Controller() +{ + hid_close(dev); +} + +void ATC800Controller::SendCoolerMode + ( + unsigned char mode, + unsigned short speed, + unsigned char channel, + unsigned char red, + unsigned char green, + unsigned char blue + ) +{ + unsigned char usb_buf[9]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(usb_buf, 0x00, sizeof(usb_buf)); + + /*-----------------------------------------------------*\ + | Set up Lighting Control packet | + \*-----------------------------------------------------*/ + if (channel == AORUS_ATC800_TOP_ZONE) + { + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xbe; + usb_buf[0x08] = 0xcc; + + hid_send_feature_report(dev, usb_buf, 9); + memset(usb_buf, 0x00, sizeof(usb_buf)); + + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xc9; + usb_buf[0x02] = mode; + usb_buf[0x03] = 0x3c; + usb_buf[0x04] = 0x02; + usb_buf[0x05] = 0x00; + usb_buf[0x06] = 0x00; + + hid_send_feature_report(dev, usb_buf, 9); + memset(usb_buf, 0x00, sizeof(usb_buf)); + + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xbc; + usb_buf[0x02] = red; + usb_buf[0x03] = green; + usb_buf[0x04] = blue; + + hid_send_feature_report(dev, usb_buf, 9); + memset(usb_buf, 0x00, sizeof(usb_buf)); + + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xb6; + } + else if (channel == AORUS_ATC800_FANS_ZONE) + { + hid_send_feature_report(dev, usb_buf, 9); + memset(usb_buf, 0x00, sizeof(usb_buf)); + + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xc9; + usb_buf[0x02] = mode; + usb_buf[0x03] = 0x3c; + usb_buf[0x04] = 0x02; + usb_buf[0x05] = 0x00; + usb_buf[0x06] = 0x01; + + hid_send_feature_report(dev, usb_buf, 9); + memset(usb_buf, 0x00, sizeof(usb_buf)); + + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xb0; + usb_buf[0x02] = mode; + usb_buf[0x03] = red; + usb_buf[0x04] = green; + usb_buf[0x05] = blue; + + usb_buf[0x06] = red; + + usb_buf[0x07] = green; + usb_buf[0x08] = blue; + + for(int i = 0xb0; i <= 0xb3; i++) + { + usb_buf[0x01] = i; //zone b0->b3 + hid_send_feature_report(dev, usb_buf, 9); + } + } + + memset(usb_buf, 0x00, sizeof(usb_buf)); + usb_buf[0x00] = 0x00; + usb_buf[0x01] = 0xb6; + + hid_send_feature_report(dev, usb_buf, 9); +} diff --git a/Controllers/AorusCPUCoolerController/ATC800Controller.h b/Controllers/AorusCPUCoolerController/ATC800Controller.h new file mode 100644 index 00000000..f796c55d --- /dev/null +++ b/Controllers/AorusCPUCoolerController/ATC800Controller.h @@ -0,0 +1,59 @@ +/*-----------------------------------------*\ +| ATC800Controller.h | +| | +| Definitions and types for ATC800 CPU | +| Cooler | +| | +| Felipe Cavalcanti 08/13/2020 | +\*-----------------------------------------*/ + +#include "RGBController.h" + +#include +#include + +#pragma once + +enum +{ + AORUS_ATC800_MODE_OFF = 0x00, + AORUS_ATC800_MODE_STATIC = 0x01, + AORUS_ATC800_MODE_PULSE = 0x02, + AORUS_ATC800_MODE_FLASHING = 0x04, + AORUS_ATC800_MODE_DOUBLE_FLASH = 0x05, +}; + +enum +{ + AORUS_ATC800_SPEED_SLOWEST = 0x00, /* Slowest speed */ + AORUS_ATC800_SPEED_SLOW = 0x01, /* Slow speed */ + AORUS_ATC800_SPEED_NORMAL = 0x02, /* Normal speed */ + AORUS_ATC800_SPEED_FAST = 0x03, /* Fast speed */ + AORUS_ATC800_SPEED_FASTEST = 0x04, /* Fastest speed */ +}; + +enum +{ + AORUS_ATC800_FANS_ZONE = 0, + AORUS_ATC800_TOP_ZONE = 1 +}; + +class ATC800Controller +{ +public: + ATC800Controller(hid_device* dev_handle); + ~ATC800Controller(); + + void SendCoolerMode + ( + unsigned char mode, + unsigned short speed, + unsigned char channel, + unsigned char red, + unsigned char green, + unsigned char blue + ); + +private: + hid_device* dev; +}; diff --git a/Controllers/AorusCPUCoolerController/AorusCPUCoolerControllerDetect.cpp b/Controllers/AorusCPUCoolerController/AorusCPUCoolerControllerDetect.cpp new file mode 100644 index 00000000..8561280a --- /dev/null +++ b/Controllers/AorusCPUCoolerController/AorusCPUCoolerControllerDetect.cpp @@ -0,0 +1,87 @@ +#include "Detector.h" +#include "RGBController.h" +#include "ATC800Controller.h" +#include "RGBController_AorusATC800.h" +#include +#include + +/*-----------------------------------------------------*\ +| Vendor ID | +\*-----------------------------------------------------*/ +#define HOLTEK_VID 0x1044 + +/*-----------------------------------------------------*\ +| Controller product ids | +\*-----------------------------------------------------*/ +#define ATC_800_CONTROLLER_PID 0x7A42 + +typedef struct +{ + unsigned short usb_vid; + unsigned short usb_pid; + char usb_interface; + device_type type; + const char * name; +} device; + +#define NUM_DEVICES (sizeof(device_list) / sizeof(device_list[ 0 ])) + +static const device device_list[] = +{ + { HOLTEK_VID, ATC_800_CONTROLLER_PID, 0, DEVICE_TYPE_KEYBOARD, "Aorus ATC800 CPU Cooler" }, +}; + +/******************************************************************************************\ +* * +* DetectAorusCPUCoolerControllers * +* * +* Tests the USB address to see if a Aorus RGB CPU Cooler exists there. * +* * +\******************************************************************************************/ + +void DetectAorusCPUCoolerControllers(std::vector& rgb_controllers) +{ + hid_init(); + + for(int device_idx = 0; device_idx < NUM_DEVICES; device_idx++) + { + hid_device_info* info = hid_enumerate(device_list[device_idx].usb_vid, device_list[device_idx].usb_pid); + + while(info) + { + if((info->vendor_id == device_list[device_idx].usb_vid) + &&(info->product_id == device_list[device_idx].usb_pid) +#ifdef USE_HID_USAGE + &&(info->interface_number == device_list[device_idx].usb_interface) + &&(info->usage_page == 0xFF01) + &&(info->usage == 1)) +#else + &&(info->interface_number == device_list[device_idx].usb_interface)) +#endif + { + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + switch(device_list[device_idx].usb_pid) + { + case ATC_800_CONTROLLER_PID: + { + ATC800Controller* controller = new ATC800Controller(dev); + + RGBController_AorusATC800* rgb_controller = new RGBController_AorusATC800(controller); + + rgb_controller->name = device_list[device_idx].name; + rgb_controllers.push_back(rgb_controller); + } + break; + } + } + } + info = info->next; + } + hid_free_enumeration(info); + } +} + +REGISTER_DETECTOR("Aorus CPU Coolers", DetectAorusCPUCoolerControllers); diff --git a/OpenRGB.pro b/OpenRGB.pro index 1084bd85..2a89cc35 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -47,6 +47,7 @@ INCLUDEPATH += \ net_port/ \ serial_port/ \ super_io/ \ + Controllers/AorusCPUCoolerController/ \ Controllers/AMDWraithPrismController/ \ Controllers/AuraUSBController/ \ Controllers/AuraCoreController/ \ @@ -117,6 +118,7 @@ HEADERS += \ serial_port/serial_port.h \ super_io/super_io.h \ Controllers/AMDWraithPrismController/AMDWraithPrismController.h \ + Controllers/AorusCPUCoolerController/ATC800Controller.h \ Controllers/AuraUSBController/AuraUSBController.h \ Controllers/AuraUSBController/AuraAddressableController.h \ Controllers/AuraUSBController/AuraMainboardController.h \ @@ -171,6 +173,7 @@ HEADERS += \ Controllers/ThermaltakeRiingController/ThermaltakeRiingController.h \ RGBController/RGBController.h \ RGBController/RGBController_AMDWraithPrism.h \ + RGBController/RGBController_AorusATC800.h \ RGBController/RGBController_AuraUSB.h \ RGBController/RGBController_AuraCore.h \ RGBController/RGBController_AuraGPU.h \ @@ -254,6 +257,8 @@ SOURCES += \ super_io/super_io.cpp \ Controllers/AMDWraithPrismController/AMDWraithPrismController.cpp \ Controllers/AMDWraithPrismController/AMDWraithPrismControllerDetect.cpp \ + Controllers/AorusCPUCoolerController/ATC800Controller.cpp \ + Controllers/AorusCPUCoolerController/AorusCPUCoolerControllerDetect.cpp \ Controllers/AuraUSBController/AuraUSBController.cpp \ Controllers/AuraUSBController/AuraAddressableController.cpp \ Controllers/AuraUSBController/AuraMainboardController.cpp \ @@ -350,6 +355,7 @@ SOURCES += \ RGBController/RGBController.cpp \ RGBController/E131ControllerDetect.cpp \ RGBController/RGBController_AMDWraithPrism.cpp \ + RGBController/RGBController_AorusATC800.cpp \ RGBController/RGBController_AuraUSB.cpp \ RGBController/RGBController_AuraCore.cpp \ RGBController/RGBController_AuraGPU.cpp \ diff --git a/RGBController/RGBController_AorusATC800.cpp b/RGBController/RGBController_AorusATC800.cpp new file mode 100644 index 00000000..77a458f6 --- /dev/null +++ b/RGBController/RGBController_AorusATC800.cpp @@ -0,0 +1,142 @@ +/*-----------------------------------------*\ +| RGBController_AorusATC800.cpp | +| | +| Generic RGB Interface Aorus ATC800 CPU | +| Cooler | +| | +| Felipe Cavalcanti 08/13/2020 | +\*-----------------------------------------*/ + +#include "RGBController_AorusATC800.h" + +RGBController_AorusATC800::RGBController_AorusATC800(ATC800Controller* cooler_ptr) +{ + cooler = cooler_ptr; + + name = "Aorus ATC800 CPU Cooler"; + type = DEVICE_TYPE_COOLER; + description = "Aorus ATC800 CPU Cooler"; + + mode Static; + Static.name = "Static"; + Static.value = AORUS_ATC800_MODE_STATIC; + Static.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Static.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Static); + + mode Off; + Off.name = "Off"; + Off.value = AORUS_ATC800_MODE_OFF; + Off.flags = 0; + Off.color_mode = MODE_COLORS_NONE; + modes.push_back(Off); + + mode Flashing; + Flashing.name = "Flashing"; + Flashing.value = AORUS_ATC800_MODE_FLASHING; + Flashing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Flashing.color_mode = MODE_COLORS_PER_LED; + Flashing.speed_min = AORUS_ATC800_SPEED_SLOWEST; + Flashing.speed_max = AORUS_ATC800_SPEED_FASTEST; + Flashing.speed = AORUS_ATC800_SPEED_NORMAL; + modes.push_back(Flashing); + + mode DoubleFlashing; + DoubleFlashing.name = "Double Flashing"; + DoubleFlashing.value = AORUS_ATC800_MODE_DOUBLE_FLASH; + DoubleFlashing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + DoubleFlashing.color_mode = MODE_COLORS_PER_LED; + DoubleFlashing.speed_min = AORUS_ATC800_SPEED_SLOWEST; + DoubleFlashing.speed_max = AORUS_ATC800_SPEED_FASTEST; + DoubleFlashing.speed = AORUS_ATC800_SPEED_NORMAL; + modes.push_back(DoubleFlashing); + + mode Pulsing; + Pulsing.name = "Pulsing"; + Pulsing.value = AORUS_ATC800_MODE_PULSE; + Pulsing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR; + Pulsing.color_mode = MODE_COLORS_PER_LED; + Pulsing.speed_min = AORUS_ATC800_SPEED_SLOWEST; + Pulsing.speed_max = AORUS_ATC800_SPEED_FASTEST; + Pulsing.speed = AORUS_ATC800_SPEED_NORMAL; + modes.push_back(Pulsing); + + SetupZones(); +} + +void RGBController_AorusATC800::SetupZones() +{ + zone atc800_cpu_fans_zone; + atc800_cpu_fans_zone.name = "Fan"; + atc800_cpu_fans_zone.type = ZONE_TYPE_SINGLE; + atc800_cpu_fans_zone.leds_min = 1; + atc800_cpu_fans_zone.leds_max = 1; + atc800_cpu_fans_zone.leds_count = 1; + atc800_cpu_fans_zone.matrix_map = NULL; + zones.push_back(atc800_cpu_fans_zone); + + led atc800_fan_led; + atc800_fan_led.name = "Fan"; + leds.push_back(atc800_fan_led); + + zone atc800_top_zone; + atc800_top_zone.name = "Top"; + atc800_top_zone.type = ZONE_TYPE_SINGLE; + atc800_top_zone.leds_min = 1; + atc800_top_zone.leds_max = 1; + atc800_top_zone.leds_count = 1; + atc800_top_zone.matrix_map = NULL; + zones.push_back(atc800_top_zone); + + led atc800_top_led; + atc800_top_led.name = "Top"; + leds.push_back(atc800_top_led); + + SetupColors(); +} + +void RGBController_AorusATC800::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_AorusATC800::DeviceUpdateLEDs() +{ + UpdateZoneLEDs(0); + UpdateZoneLEDs(1); +} + +void RGBController_AorusATC800::UpdateZoneLEDs(int zone) +{ + unsigned char mode = modes[active_mode].value; + unsigned char red = RGBGetRValue(colors[zone]); + unsigned char grn = RGBGetGValue(colors[zone]); + unsigned char blu = RGBGetBValue(colors[zone]); + + if (mode == AORUS_ATC800_MODE_OFF) + { + mode = 1; + red = 0; + grn = 0; + blu = 0; + } + + cooler->SendCoolerMode(mode, modes[active_mode].speed, zone, red, grn, blu); +} + +void RGBController_AorusATC800::UpdateSingleLED(int led) +{ + UpdateZoneLEDs(led); +} + +void RGBController_AorusATC800::SetCustomMode() +{ + +} + +void RGBController_AorusATC800::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/RGBController/RGBController_AorusATC800.h b/RGBController/RGBController_AorusATC800.h new file mode 100644 index 00000000..47ef52b7 --- /dev/null +++ b/RGBController/RGBController_AorusATC800.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_AorusATC800.h | +| | +| Generic RGB Interface for Aorus ATC 800 | +| CPU Cooler | +| | +| Felipe Cavalcanti 08/13/2020 | +\*-----------------------------------------*/ + +#pragma once +#include "RGBController.h" +#include "ATC800Controller.h" + +class RGBController_AorusATC800 : public RGBController +{ +public: + RGBController_AorusATC800(ATC800Controller* logitech_ptr); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void SetCustomMode(); + void DeviceUpdateMode(); + +private: + ATC800Controller* cooler; +};