From 9abf121514055c50037b2084cae8fd672c726026 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Fri, 21 Apr 2023 21:31:59 -0500 Subject: [PATCH] Initial commit for AOC Mouse --- .../AOCMouseController/AOCMouseController.cpp | 120 ++++++++++++++++++ .../AOCMouseController/AOCMouseController.h | 33 +++++ .../AOCMouseControllerDetect.cpp | 34 +++++ .../RGBController_AOCMouse.cpp | 104 +++++++++++++++ .../RGBController_AOCMouse.h | 32 +++++ OpenRGB.pro | 6 + 6 files changed, 329 insertions(+) create mode 100644 Controllers/AOCMouseController/AOCMouseController.cpp create mode 100644 Controllers/AOCMouseController/AOCMouseController.h create mode 100644 Controllers/AOCMouseController/AOCMouseControllerDetect.cpp create mode 100644 Controllers/AOCMouseController/RGBController_AOCMouse.cpp create mode 100644 Controllers/AOCMouseController/RGBController_AOCMouse.h diff --git a/Controllers/AOCMouseController/AOCMouseController.cpp b/Controllers/AOCMouseController/AOCMouseController.cpp new file mode 100644 index 000000000..68d194e36 --- /dev/null +++ b/Controllers/AOCMouseController/AOCMouseController.cpp @@ -0,0 +1,120 @@ +/*-----------------------------------------*\ +| AOCMouseController.cpp | +| | +| Driver for AOC Mouse lighting controller | +| | +| Adam Honse (CalcProgrammer1) 4/20/2023 | +\*-----------------------------------------*/ + +#include "AOCMouseController.h" + +#include + +AOCMouseController::AOCMouseController(hid_device* dev_handle, const char* path) +{ + dev = dev_handle; + location = path; +} + +AOCMouseController::~AOCMouseController() +{ + hid_close(dev); +} + +std::string AOCMouseController::GetDeviceLocation() +{ + return("HID " + location); +} + +std::string AOCMouseController::GetSerialString() +{ + wchar_t serial_string[128]; + int ret = hid_get_serial_number_string(dev, serial_string, 128); + + if(ret != 0) + { + return(""); + } + + std::wstring return_wstring = serial_string; + std::string return_string(return_wstring.begin(), return_wstring.end()); + + return(return_string); +} + +/*-------------------------------------------------------------------------------------------------*\ +| Private packet sending functions. | +\*-------------------------------------------------------------------------------------------------*/ + +void AOCMouseController::SendDirect + ( + RGBColor* color_data + ) +{ + unsigned char buf[60]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(buf, 0x00, sizeof(buf)); + + /*-----------------------------------------------------*\ + | Set up packet | + \*-----------------------------------------------------*/ + buf[0x00] = 0x20; + buf[0x01] = 0x03; + buf[0x02] = 0x01; + buf[0x04] = 0x02; + buf[0x05] = 0x02; + buf[0x06] = 0x01; + buf[0x07] = 0x01; + buf[0x08] = 0x02; + buf[0x09] = 0xFF; + buf[0x0D] = 0x01; + buf[0x0E] = 0x03; + buf[0x0F] = 0xFF; + buf[0x10] = 0x7F; + buf[0x13] = 0x01; + buf[0x14] = 0x04; + buf[0x17] = 0xFF; + buf[0x19] = 0x01; + buf[0x1A] = 0x05; + buf[0x1C] = 0xFF; + buf[0x1F] = 0x01; + buf[0x20] = 0x06; + buf[0x21] = 0xFF; + buf[0x23] = 0xFF; + buf[0x25] = 0x01; + buf[0x26] = 0x07; + buf[0x27] = 0xFF; + buf[0x28] = 0xFF; + buf[0x2C] = 0x0A; + buf[0x2D] = 0x0A; + buf[0x30] = 0x14; + buf[0x31] = 0x08; + buf[0x3A] = 0x32; + buf[0x3B] = 0x32; + + /*-----------------------------------------------------*\ + | Copy in color | + \*-----------------------------------------------------*/ + buf[0x33] = RGBGetRValue(color_data[0]); + buf[0x34] = RGBGetGValue(color_data[0]); + buf[0x35] = RGBGetBValue(color_data[0]); + + buf[0x36] = RGBGetRValue(color_data[1]); + buf[0x37] = RGBGetGValue(color_data[1]); + buf[0x38] = RGBGetBValue(color_data[1]); + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + int ret = hid_send_feature_report(dev, buf, 60); + const wchar_t * errval = hid_error(dev); + + if(ret) + { + int a = 0; + a++; + } +} diff --git a/Controllers/AOCMouseController/AOCMouseController.h b/Controllers/AOCMouseController/AOCMouseController.h new file mode 100644 index 000000000..c2ac01ea8 --- /dev/null +++ b/Controllers/AOCMouseController/AOCMouseController.h @@ -0,0 +1,33 @@ +/*-----------------------------------------*\ +| AOCMouseController.h | +| | +| Definitions and types for AOC mouse | +| lighting controller | +| | +| Adam Honse (CalcProgrammer1) 4/20/2023 | +\*-----------------------------------------*/ + +#include "RGBController.h" +#include +#include + +#pragma once + +class AOCMouseController +{ +public: + AOCMouseController(hid_device* dev_handle, const char* path); + ~AOCMouseController(); + + std::string GetDeviceLocation(); + std::string GetSerialString(); + + void SendDirect + ( + RGBColor* color_data + ); + +private: + hid_device* dev; + std::string location; +}; diff --git a/Controllers/AOCMouseController/AOCMouseControllerDetect.cpp b/Controllers/AOCMouseController/AOCMouseControllerDetect.cpp new file mode 100644 index 000000000..d07c15f20 --- /dev/null +++ b/Controllers/AOCMouseController/AOCMouseControllerDetect.cpp @@ -0,0 +1,34 @@ +#include "Detector.h" +#include "AOCMouseController.h" +#include "RGBController.h" +#include "RGBController_AOCMouse.h" + +/*-----------------------------------------------------*\ +| AOC Mousemat IDs | +\*-----------------------------------------------------*/ +#define AOC_VID 0x3938 +#define AOC_GM500_PID 0x1179 + +/******************************************************************************************\ +* * +* DetectAOCMouseControllers * +* * +* Tests the USB address to see if an AOC Mouse controller exists there. * +* * +\******************************************************************************************/ + +void DetectAOCMouseControllers(hid_device_info* info, const std::string& name) +{ + hid_device* dev = hid_open_path(info->path); + + if(dev) + { + AOCMouseController* controller = new AOCMouseController(dev, info->path); + RGBController_AOCMouse* rgb_controller = new RGBController_AOCMouse(controller); + rgb_controller->name = name; + + ResourceManager::get()->RegisterRGBController(rgb_controller); + } +} + +REGISTER_HID_DETECTOR_IPU("AOC GM500", DetectAOCMouseControllers, AOC_VID, AOC_GM500_PID, 1, 0xFF19, 0xFF19); diff --git a/Controllers/AOCMouseController/RGBController_AOCMouse.cpp b/Controllers/AOCMouseController/RGBController_AOCMouse.cpp new file mode 100644 index 000000000..fb74360eb --- /dev/null +++ b/Controllers/AOCMouseController/RGBController_AOCMouse.cpp @@ -0,0 +1,104 @@ +/*-----------------------------------------*\ +| RGBController_AOCMouse.cpp | +| | +| Generic RGB Interface for AOC mouse | +| | +| Adam Honse (CalcProgrammer1) 4/20/2023 | +\*-----------------------------------------*/ + +#include "RGBController_AOCMouse.h" + +/**------------------------------------------------------------------*\ + @name AOC Mouse + @category Mouse + @type USB + @save :x: + @direct :white_check_mark: + @effects :x: + @detectors DetectAOCMouseControllers + @comment +\*-------------------------------------------------------------------*/ + +RGBController_AOCMouse::RGBController_AOCMouse(AOCMouseController* controller_ptr) +{ + controller = controller_ptr; + + name = "AOC Mouse Device"; + vendor = "AOC"; + type = DEVICE_TYPE_MOUSE; + description = "AOC Mouse Device"; + location = controller->GetDeviceLocation(); + serial = controller->GetSerialString(); + + mode Direct; + Direct.name = "Direct"; + Direct.value = 0xFFFF; + Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR; + Direct.color_mode = MODE_COLORS_PER_LED; + modes.push_back(Direct); + + SetupZones(); +}; + +RGBController_AOCMouse::~RGBController_AOCMouse() +{ + delete controller; +} + +void RGBController_AOCMouse::SetupZones() +{ + zone logo_zone; + logo_zone.name = "Logo"; + logo_zone.type = ZONE_TYPE_SINGLE; + logo_zone.leds_min = 1; + logo_zone.leds_max = 1; + logo_zone.leds_count = 1; + logo_zone.matrix_map = NULL; + zones.push_back(logo_zone); + + led logo_led; + logo_led.name = "Logo"; + leds.push_back(logo_led); + + zone scroll_wheel_zone; + scroll_wheel_zone.name = "Scroll Wheel"; + scroll_wheel_zone.type = ZONE_TYPE_SINGLE; + scroll_wheel_zone.leds_min = 1; + scroll_wheel_zone.leds_max = 1; + scroll_wheel_zone.leds_count = 1; + scroll_wheel_zone.matrix_map = NULL; + zones.push_back(scroll_wheel_zone); + + led scroll_wheel_led; + scroll_wheel_led.name = "Scroll Wheel"; + leds.push_back(scroll_wheel_led); + + SetupColors(); +} + +void RGBController_AOCMouse::ResizeZone(int /*zone*/, int /*new_size*/) +{ + /*---------------------------------------------------------*\ + | This device does not support resizing zones | + \*---------------------------------------------------------*/ +} + +void RGBController_AOCMouse::DeviceUpdateLEDs() +{ + controller->SendDirect(&colors[0]); +} + +void RGBController_AOCMouse::UpdateZoneLEDs(int /*zone*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_AOCMouse::UpdateSingleLED(int /*led*/) +{ + DeviceUpdateLEDs(); +} + +void RGBController_AOCMouse::DeviceUpdateMode() +{ + DeviceUpdateLEDs(); +} diff --git a/Controllers/AOCMouseController/RGBController_AOCMouse.h b/Controllers/AOCMouseController/RGBController_AOCMouse.h new file mode 100644 index 000000000..3193d31d7 --- /dev/null +++ b/Controllers/AOCMouseController/RGBController_AOCMouse.h @@ -0,0 +1,32 @@ +/*-----------------------------------------*\ +| RGBController_AOCMouse.h | +| | +| Generic RGB Interface for AOC mouse | +| | +| Adam Honse (CalcProgrammer1) 4/20/2023 | +\*-----------------------------------------*/ + +#pragma once + +#include "RGBController.h" +#include "AOCMouseController.h" + +class RGBController_AOCMouse : public RGBController +{ +public: + RGBController_AOCMouse(AOCMouseController* controller_ptr); + ~RGBController_AOCMouse(); + + void SetupZones(); + + void ResizeZone(int zone, int new_size); + + void DeviceUpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + + void DeviceUpdateMode(); + +private: + AOCMouseController* controller; +}; diff --git a/OpenRGB.pro b/OpenRGB.pro index 0adad3336..153e1777f 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -83,6 +83,7 @@ INCLUDEPATH += Controllers/AlienwareController/ \ Controllers/AlienwareKeyboardController/ \ Controllers/AMDWraithPrismController/ \ + Controllers/AOCMouseController/ \ Controllers/AOCMousematController/ \ Controllers/ASRockPolychromeUSBController/ \ Controllers/ASRockSMBusController/ \ @@ -274,6 +275,8 @@ HEADERS += Controllers/AMDWraithPrismController/RGBController_AMDWraithPrism.h \ Controllers/AnnePro2Controller/AnnePro2Controller.h \ Controllers/AnnePro2Controller/RGBController_AnnePro2.h \ + Controllers/AOCMouseController/AOCMouseController.h \ + Controllers/AOCMouseController/RGBController_AOCMouse.h \ Controllers/AOCMousematController/AOCMousematController.h \ Controllers/AOCMousematController/RGBController_AOCMousemat.h \ Controllers/ASRockPolychromeUSBController/ASRockPolychromeUSBController.h \ @@ -830,6 +833,9 @@ SOURCES += Controllers/AnnePro2Controller/AnnePro2Controller.cpp \ Controllers/AnnePro2Controller/AnnePro2ControllerDetect.cpp \ Controllers/AnnePro2Controller/RGBController_AnnePro2.cpp \ + Controllers/AOCMouseController/AOCMouseController.cpp \ + Controllers/AOCMouseController/AOCMouseControllerDetect.cpp \ + Controllers/AOCMouseController/RGBController_AOCMouse.cpp \ Controllers/AOCMousematController/AOCMousematController.cpp \ Controllers/AOCMousematController/AOCMousematControllerDetect.cpp \ Controllers/AOCMousematController/RGBController_AOCMousemat.cpp \