Compare commits

...
Author SHA1 Message Date
Adam Honse 5617baf459 Add ignore parameter for schema entries that should be ignored by the UI and allowed regardless of content by settings validator 2026-09-16 11:59:42 -05:00
DJMalachite 2c37d4eebb [Quadcast 2 S] Edit RGBController_HyperXMicrophoneV2.cpp to fix reversed matrix map 2026-09-16 07:43:17 -05:00
Matthew Uniack 08a9f83ff4 Add PID for Corsair Sabre RGB Optical mouse (0x1B32) 2026-09-15 12:07:28 -05:00
Nicolas Wendling 1cee73e125 Add alternate subsystem device ID for Sapphire Radeon RX 9070 XT Nitro+ 2026-09-15 12:02:24 -05:00
Yoann Laissus 6f027de52b Fix layout on Gigabyte RTX 5090 XTREME WATERFORCE non WB version 2026-09-15 11:59:50 -05:00
Daniel Clark 94e7b03a50 update the led10 and led 11 zone count routine to handle new cases. 2026-09-15 11:41:11 -05:00
Adam Honse ec13cda548 Correct rc names and mark as development in AppStream manifest 2026-09-15 11:33:31 -05:00
Adam Honse de580d736c Clean up unnecessary and broken Debian dependencies 2026-09-15 11:31:50 -05:00
Adam Honse d42ed48ae1 Always reply to plugin list even if plugin manager is null 2026-09-15 11:29:32 -05:00
Adam Honse 384e1faa56 Change suffix back to git after 1.0 release 2026-09-14 17:28:04 -05:00
Adam Honse 81bbe18a84 OpenRGB version 1.0 2026-09-11 18:06:58 -05:00
Adam Honse 8eb30ba840 Fix warnings in RGBController_PalitGPUv2 2026-09-11 18:02:20 -05:00
Adam Honse f01ab516df Filter out i2c entries that are non-numeric, my PC has a /sys/bus/i2c/devices/i2c-ITE8800:00 that was failing 2026-09-11 17:57:42 -05:00
Adam Honse 0440478acb Protect against out of bounds memory type, replaces !3598 2026-09-11 17:21:29 -05:00
Denilson Martins 6bb57b8822 MSI 7E76 (MSI B840M GAMING WIFI6E) 2026-09-11 15:02:29 -05:00
Adam Honse 954027f087 Update WIX configuration to ensure default INSTALLLEVEL is 2 (service installation) and fix cut off text 2026-09-11 11:50:57 -05:00
OfotViking 243889d818 Add support for Gainward GeForce RTX 4090 Phantom 2026-09-11 10:07:00 -05:00
Adam Honse f69213db02 Palit GPU Cleanup - Merge Palit, Gainward, and PNY - V1 and V2 2026-09-11 10:07:00 -05:00
Jonathan Arellano f4173ed72f Gigabyte RGB Fusion 2 USB: apply once per zone update, not per LED 2026-09-11 09:05:09 -05:00
Jonathan Arellano 69226884cb Device page: coalesce rapid colour-wheel updates instead of queueing 2026-09-11 09:04:17 -05:00
Adam Honse 728846f668 Update screenshot 2026-09-10 20:34:04 -05:00
Adam Honse f6cfac8eef Update Debian dependencies 2026-09-10 20:23:02 -05:00
Adam Honse 9a4857ac33 Update Debian and Fedora package dependencies 2026-09-10 19:09:47 -05:00
Adam Honse 45a6c93bb3 Use 1 second TCP connection timeout for local client autoconnect 2026-09-10 13:11:01 -05:00
RedBlackAka 77285e308a Update German and Norwegian translations for 1.0 final 2026-09-10 07:25:56 -05:00
Adam Honse 84fb7d18d0 Fix warning in RGBController_Alienware.cpp 2026-09-09 21:14:08 -05:00
brenmous e161314090 Add support for MSI B850MPOWER 2026-09-09 23:26:10 +10:00
Adam Honse 0ff7f0fcd6 Fix missing handling of new zone types and fall back to legacy types for older protocols 2026-09-09 01:04:52 -05:00
Adam Honse e6ea038ac8 Update prepare-artifacts.py 2026-09-09 00:25:48 -05:00
Adam Honse 6be0193788 Add an AutoStart implementation that uses the FreeDesktop Background portal for Flatpak builds 2026-09-09 00:02:22 -05:00
Adam Honse 8963586ead Fix removing settings tab plugin, fixes #5844 2026-09-08 21:51:13 -05:00
Adam Honse 9ac50bd646 Add firmware read timeout in Corsair Lighting Node controller to prevent lockup, fixes #5838 2026-09-08 21:22:38 -05:00
Adam Honse fde019d920 Skip DPMST i2c interfaces 2026-09-08 20:13:22 -05:00
Adam Honse 2b24d0a2e9 Add firmware version check to MSIMotherboard185Controller 2026-09-08 19:59:04 -05:00
Vangel Dior afb654aa55 Added support for Gainward GeForce RTX 5080 Phoenix 2026-09-08 16:44:07 -05:00
Aman Ali 82ae818712 Add PNY GeForce RTX 3060 XLR8 Revel EPIC-X LHR (196E:138F) 2026-09-08 04:01:52 -07:00
Adam Yearout 6ac47cc4f3 HID LampArray: fix keyboard usage mappings 2026-09-08 00:43:17 -05:00
vectorseven 1e1b26e062 macOS: initialize macUSPCIO in SMBus detectors
Ensure macOS SMBus detectors initialize the macUSPCIO connection before attempting detection instead of relying on the cached connection status.

InitMacUSPCIODriver() is idempotent, so this preserves the normal startup path while allowing the detectors to establish the required connection when needed.

Also update the failure messages to report initialization failure rather than incorrectly assuming macUSPCIO is not loaded.
2026-09-08 00:42:35 -05:00
Adam Honse aaa7cb0886 Clean up MSI flags handling and add comments 2026-09-08 00:41:38 -05:00
JAO1988 a42352c867 Added MSI MAG X870E GAMING MAX WIFI motherboard 2026-09-07 22:14:01 -05:00
Michael Updike 1da6a652fd Fix Clevo ITE8291 keyboard LED value/key positional mismatch 2026-09-06 15:45:52 -05:00
jpage77 4f63756e15 RazerController: Add support for Huntsman V3 HE Magnetic Mini 2026-09-06 13:25:31 -05:00
Vangel Dior f72e99225d Fixd hid_error dlsym typo in libusb HID wrapper 2026-09-06 13:23:21 -05:00
Venatrix “Joe” Ritz 93b374ad9f TurtleBeachKP7: name the LEDs and split into three zones 2026-09-06 02:00:50 -05:00
Noocktall Klown S. (NKlownS) 2319f5c20d AlienwareController: add support, zone mapping, direction and EEPROM save for Dell G15 5520/5530 (AW-ELC) 2026-09-06 01:59:31 -05:00
JAO1988 7523e11eb5 Added ASRock Radeon RX 9070 XT Taichi 16GB OC 2026-09-06 01:55:18 -05:00
Adam Honse 523bdb96f8 Fix a crash from Apply All Devices 2026-09-05 18:38:34 -05:00
J-Man 75302d7219 Add ASUS ROG STRIX XG27ACDNG RGB detection 2026-09-05 16:51:15 -05:00
Venatrix “Joe” Ritz 56256a8054 NetworkServer: fix reversed format arguments in invalid-size log calls 2026-09-05 13:48:55 -05:00
Adam Honse ed3d7894c8 Update Realtek ARGB controller to the new configuration system 2026-09-04 21:48:39 -05:00
Daniel Clark dc14dff646 Fix reset to default in device specific settings for gigabyte motherboard usb controllers. 2026-09-04 21:11:28 -05:00
Adam Honse 706e2ab30f Make device editor the same size as zone editor 2026-09-04 19:50:09 -05:00
Ken Sanislo 3e494c884a Keep saved device configuration when controllers are remote 2026-09-04 19:40:03 -05:00
Daniel Clark 31a09bc728 Move Gigabyte USB Controller settings to Device Specific Settings. 2026-09-04 19:29:47 -05:00
Adam Honse 87b0b904c5 Add ordering support to device-specific configuration user interface 2026-09-04 19:28:27 -05:00
Ken Sanislo 07e1f2bb2a Logitech HID++ 2.0: drop the per-frame wire logs 2026-09-04 15:21:36 -05:00
Daniel Clark fd1bc449ae Update Gigabyte Motherboard USB RGB Controller 2026-09-04 09:31:50 -05:00
Adam Honse 1103a567da Keep plugin data from existing profile when saving over an existing profile, fixes #5837 2026-09-04 00:15:32 -05:00
Delnegend b420af5c42 ASRock GPU: Add Radeon RX 9060 XT Steel Legend and fix Windows ADL detection 2026-09-03 23:44:02 -05:00
Adam Honse d092f3b159 Remove colors_min/max from per-LED mode in NVIDIA Illumination controller, fixes #5836 2026-09-03 20:30:53 -05:00
Adam Honse 87af7c8dc2 Fix issues in mode set validity check - correct duplicate HAS_PERE_LED_COLOR, fix with MODE_SPECIFIC_COLOR, only check colors_min/max if mode specific color, fixes #5836 2026-09-03 20:30:07 -05:00
John Sideserf 1335a9b06c Add Gigabyte AORUS RTX 5080 MASTER ICE (0x418C) at 0x71, reject echo-bus probe responses 2026-09-03 18:46:28 -05:00
Ken Sanislo bf2a0fb8f1 HID LampArray: stop on a failed report descriptor read
hid_get_report_descriptor returns -1 on failure and the length was
stored unsigned, so the descriptor walk ran past the end of the stack
buffer. Windows reconstructs the descriptor from preparsed data and can
fail where Linux returns the kernel's copy. A failed read now leaves the
device with no lamps, the same as a descriptor with missing reports.
2026-09-03 11:11:36 -05:00
Piotr Kochan 657cc0d05d MSI 761-byte: add PRO B850M-A WIFI PZ 2026-09-03 07:13:35 -05:00
Valtekken 47eba889c2 Minor fixes for the Italian translation 2026-09-03 08:02:10 +00:00
Adam Honse 7fed68ccf1 Try notifying all to prevent lockups 2026-09-02 19:29:50 -05:00
Adam Honse 3e290907d5 Implement fair_mutex in i2c_smbus so that i2c controllers are given access to the bus in a more fair manner, which should help with high frame rates on slow buses 2026-09-02 19:12:26 -05:00
Ken Sanislo 999cbd2578 Logitech HID++ 2.0: place the G915 X top strip and G-keys 2026-09-02 14:45:04 -05:00
danielminter cf048edb6c Narrow the 0b05:19af Aura motherboard detector to its real usage page 2026-09-02 09:28:07 -05:00
Ken Sanislo a44f525078 Logitech HID++ 2.0: key the detector to the Logitech VID and the bus 2026-09-02 09:25:21 -05:00
Dmitry Kychanov 88af06182a Fix russian translations 2026-09-01 22:59:44 -05:00
Adam Honse dd35cb8cbf Update Keychron QMK controller to pull keyboard's real firmware version when connected over wireless dongle, display both dongle and keyboard version 2026-09-01 22:58:22 -05:00
Adam Honse cfc6081f9d Update Keychron QMK controller to pull keyboard's real VID when connected over wireless dongle (at least for ZMK keyboards that support full control over the wireless link) 2026-09-01 22:56:23 -05:00
Dmitry Kychanov 8f701ee147 Fix hotplugging in Logitech HID++ by using a lambda callback to un-list used IDs 2026-09-01 22:30:23 -05:00
Gent Semaj eb535f43c8 Fix AW3423DWF E_PIPE on init for newer firmware 2026-09-01 21:58:40 -05:00
JAO1988 864ea220da Added Gigabyte GTX 1080 8G Rev 2 and RX9060XT GPUs 2026-09-01 20:12:56 -04:00
Adam Honse a152927ec6 Fix warning in OpenRGBDialog.cpp 2026-09-01 11:42:11 -05:00
Adam Honse bc9c04c00b Fix warning in OpenRGBZoneEditorDialog.cpp 2026-09-01 11:41:26 -05:00
Adam Honse 648f190e22 Fix warnings in OpenRGBProfileEditorDialog.cpp 2026-09-01 11:39:09 -05:00
Adam Honse 47044213fd Fix warnings in OpenRGBDevicePage.cpp 2026-09-01 11:38:13 -05:00
Adam Honse da3f396a25 Fix warnings in ValveSteamMachineController_Windows.cpp 2026-09-01 11:36:32 -05:00
Adam Honse 0dff37baa9 Fix warnings in RGBController_EVGAX12.cpp 2026-09-01 11:32:59 -05:00
Adam Honse 44c7b9fc07 Fix warnings in RGBController_HIDLampArray.cpp 2026-09-01 11:31:28 -05:00
Adam Honse bfba7e99d0 Fix warning in RGBController_GigabyteRGBFusion2USB.cpp 2026-09-01 11:29:37 -05:00
Adam Honse cd02ba5d39 Fix warning in ClevoKeyboardController.cpp 2026-09-01 11:28:43 -05:00
Adam Honse bf03f70950 Use Fusion theme on MacOS 2026-09-01 11:24:25 -05:00
Daniel Clark c789351977 Fixes Keychron Patch Layouts (hopefully) 2026-09-01 07:43:58 -05:00
Ken Sanislo bac9cffb27 Logitech HID++ 2.0: fix effect modes, brightness and phantom LEDs on per-key keyboards 2026-09-01 07:30:40 -05:00
Adam Honse 544fd47756 Add some sanity checking around the per-LED direct mode in MSIMotherboard185Controller. Ensure the enable per-LED 185-byte packet gets sent before the large per-LED packets, skip sending packets if there are no LEDs configured 2026-09-01 00:53:59 -05:00
Adam Honse 206f211ccc More MSI installer cleanups 2026-08-31 22:57:16 -05:00
Adam Honse de7a8df31d Add the ability to register detectors that are disabled by default 2026-08-31 22:53:07 -05:00
Adam Honse 054e979fcf Fix missing text 2026-08-31 22:34:18 -05:00
Adam Honse d3e06b9124 Update CM Small ARGB name 2026-08-31 22:30:15 -05:00
Adam Honse b0c517ab9f Update CMSmallARGBController to match the changes made to CMARGBController 2026-08-31 22:17:14 -05:00
Adam Honse 7325e83e8c Clean up formatting on warning installer page 2026-08-31 21:46:18 -05:00
Adam Honse c40967989a MSI controller renames 2026-08-31 21:13:13 -05:00
Adam Honse 382b3e4d72 More MSI installer fixes 2026-08-31 21:12:42 -05:00
Adam Honse a8d46b32c2 Add Warning to installer 2026-08-31 20:36:32 -05:00
Venatrix “Joe” Ritz 72b7e5cf5b Govee: refresh Direct/Razer mode in KeepaliveThread 2026-08-31 12:31:30 -05:00
Venatrix “Joe” Ritz 5903e7e7c5 Govee: add H6046 RGBIC Gaming Light Bars support 2026-08-31 11:47:20 -05:00
Mathias Grün-Drebes 1198d3ed3c Fix use-after-free in RGBController_HIDLampArray destructor 2026-08-31 11:14:25 -05:00
homelab black d623e76d25 Fix server-host help message to show correct default IP 2026-08-31 00:52:11 -05:00
Adam Honse a1ff9c8e35 Update naming of PawnIO SMBus interfaces and add index field so that multiple buses can be distinguished 2026-08-30 21:21:09 -05:00
Adam Honse c3102bc724 Ignore interface check on Keychron QMK controller's detector as the Ultra series wireless dongles use interface 2 2026-08-30 16:40:36 -05:00
Richard van Liessum a9dea96147 Add Asus ROG Aura Monitor Light Bar and PG32UCDP support 2026-08-30 14:59:15 -05:00
Adam Honse e5823a0e10 Update udev generation to generate udev rules for PID-only and VID-only USB HID detectors 2026-08-30 02:30:45 -05:00
Adam Honse e5d3b76263 Fix issues with SetCustomMode generic implementation, it was not updating mode after setting 2026-08-30 02:04:47 -05:00
Adam Honse a757c04cf9 Fix the Keychron Q2 knob layout 2026-08-30 01:46:40 -05:00
Adam Honse 01c65c1d17 Fix the Keychron Q6 Ultra 8K layout 2026-08-30 01:43:33 -05:00
Adam Honse cfdd06e1f4 Update NZXT device list read timeout as the initial implementation was much too short for Smart Device V2 to fully detect 2026-08-30 01:02:40 -05:00
Adam Honse e2d0bee51a Update PawnIO Modules to release 0.2.11. The existing LedsValve.bin was already from this release 2026-08-30 00:12:10 -05:00
QuickMythril 280df42267 Fix EVGA X12 physical zone mapping 2026-08-30 00:01:11 -05:00
Adam Honse 1538936758 Initial driver for PawnIO-based Windows controller for Valve Steam Machine 2026-08-29 23:36:39 -05:00
Adam Honse 255cfcf422 Initialize active profile tracking variables and don't try loading active profile if no profile is active 2026-08-29 17:42:33 -05:00
Adam Honse c029bb2b1d Clean up detector entries that no longer exist when running detection 2026-08-29 15:10:23 -05:00
Devin Christensen e958e0132e Fix udev rule generation for Glorious Model O/O-/D Wireless mice 2026-08-29 01:08:50 -05:00
Adam Honse 51daeed585 Clean up REGISTER_DUMMY_DETECTOR lines that are no longer relevant after udev rework 2026-08-29 01:07:33 -05:00
Luca Cesarano 60e4309eec Improve Govee LAN mode support 2026-08-29 00:56:04 -05:00
Adam Honse 31247bacd4 Cleaner fix for plugin null check 2026-08-29 00:39:17 -05:00
Adam Honse 2c23fd6ace Revert "Fix skip_generic_detectors scope and a headless-server plugin-list crash"
This reverts commit d9a726d97f.
2026-08-29 00:34:40 -05:00
Hanjjog-ui Gamyeong 61fcdd1a1c Add legacy probe for Gigabyte GAMING OC RTX 5080 2026-08-28 19:30:31 -05:00
Adam Honse dc0e9b2fd3 SDK6 PROTOCOL CHANGE: Update missing timestamp field to Log Message packet on server side, type is actually 32-bit so update documentation, fix issue where log console was enabled based on local settings rather than remote settings 2026-08-28 19:00:10 -05:00
Adam Honse c90eafbe72 Save default server settings to configuration file if they don't exist already 2026-08-28 12:03:56 -05:00
Daniel Clark b087a65f3c Update Keychron Controller 2026-08-28 00:01:06 -05:00
Venatrix “Joe” Ritz c31c6088ac NZXTHue2Controller: Add friendly zone/LED naming for Kraken coolers and add read retry safeguard 2026-08-27 23:59:56 -05:00
Zoin Zoin b14342d9ee Add proper HiDPI rendering for color controls 2026-08-27 23:58:02 -05:00
Gökhan Jantz 849e725b11 Initial commit for Corsair Ironclaw Wireless SE 2026-08-27 18:19:24 -05:00
Rickey Bartlett b23da372ad AlienwareController: fix stack buffer overflow with >25 zones 2026-08-27 18:18:36 -05:00
Venatrix “Joe” Ritz a96b5e0f1a Add support for Turtle Beach Command Series KP7 keypad 2026-08-27 18:17:26 -05:00
Zoin Zoin 6315c79afa Improve Skydimo SK0L32 serial device support 2026-08-27 18:15:00 -05:00
Adam Honse ee8d24bac6 Rename migrated legacy profile files with .bak extension to prevent them from being re-migrated on every startup 2026-08-27 11:31:51 -05:00
Mathias Grün-Drebes d9a726d97f Fix skip_generic_detectors scope and a headless-server plugin-list crash 2026-08-27 07:41:58 -05:00
Adam Honse 1a55da8ac4 Clean up dead code in OpenRGBDevicePage 2026-08-27 00:06:47 -05:00
Adam Honse 5c8baf47f8 Add missing condition in per-zone mode sanity check to handle active mode -1 (follow device mode) 2026-08-26 20:16:33 -05:00
Adam Honse 249c22082d Fix multi-line comment warning in RGBController_AcerNitroHidLed.cpp 2026-08-26 19:25:28 -05:00
Adam Honse 02237aeb4d Fix warning in main_FreeBSD_Linux_MacOS.cpp 2026-08-26 19:18:09 -05:00
Adam Honse 5d7090b5fd Fix warnings in DetectionManager.cpp 2026-08-26 19:17:26 -05:00
Adam Honse f70c3bf8d4 Fix warning in SteelSeriesRival5Controller.cpp 2026-08-26 19:16:18 -05:00
Adam Honse dc0d2e2d2f Fix warnings in HIDLampArrayController.cpp 2026-08-26 19:15:11 -05:00
Adam Honse fa91a11964 Fix multi-line comment warning in RGBController_AcerNitroHidKeyboard.cpp 2026-08-26 19:12:55 -05:00
Adam Honse ecf0bfc847 Update MacOS and Linux AutoStart implementations to properly escape special characters in paths 2026-08-26 18:48:46 -05:00
Adam Honse 41b7087e20 Update Windows AutoStart implementation to allow non-ASCII paths 2026-08-26 18:48:46 -05:00
Alexander Skakov 046a1bae65 Add MSI RTX 4090 Suprim X Classic support 2026-08-26 18:46:36 -05:00
Adam Honse a9a1856b9c Prevent asynchronous mode update issues when setting mode 2026-08-26 16:42:27 -05:00
Adam Honse d7f452e542 Fix UI issue related to REQUIRES_ENTIRE_DEVICE flag when building per-zone modes list 2026-08-26 12:04:10 -05:00
MX1D 799113942c Add full support for Lenovo Legion K500 2026-08-26 00:00:06 -05:00
Aidan Stewart 206ef9aca5 Add support for MSI Raider 18 HX AI A2XWIG laptop 2026-08-25 23:55:29 -05:00
Jason Greathouse 603714f749 Enable Corsair header on MSI 7D70 (MPG X670E Carbon WIFI) 2026-08-25 22:21:09 -05:00
Adam Honse 49e1687141 Adjust button position in MSI 2026-08-25 18:55:30 -05:00
Adam Honse 6d07573fff Update UdevRules.md 2026-08-25 18:24:18 -05:00
JAO1988 2a0222bde1 Added AORUS 2080TI 11G 2026-08-25 18:10:22 -05:00
Jefte Puente 725d0ec1f5 Corsair M75 Wireless: add device support 2026-08-25 18:09:58 -05:00
Adam Honse f14b6cb49d Adjust spacing on installer 2026-08-25 18:08:47 -05:00
Adam Honse 2b60e9ac37 Make system service the default install on Windows 2026-08-25 17:03:53 -05:00
Jefte Puente 693332ff50 Fix SaveProfile carrying forward the wrong controller 2026-08-25 12:07:56 -05:00
Adam Honse a678f3bb25 Ignore files that are not shared libraries when scanning for plugins 2026-08-25 11:11:45 -05:00
Guilherme Santiago b80ac45d99 Kingston Fury DDR5: accept modules with unreadable signature (#4981) 2026-08-25 08:59:59 -05:00
Devar 20a8bc611b Add ASUS ROG ASTRAL RTX 5090 BTF GPU variant (SPID 0x8A5A) 2026-08-24 23:49:08 -05:00
Soldier Alexander 77a474b993 Fix MSI 761 direct mode bounds check comparing a byte offset against an LED count 2026-08-24 20:39:40 -05:00
Adam Honse 853074d80c Update metadata with 1.0rc3 Hotfix 1 2026-08-24 20:32:34 -05:00
Adam Honse 5df989c7a0 Update udev dialog message and update translations 2026-08-24 20:27:45 -05:00
Adam Honse f3b9f1c3fd Add --print-udev-rules for printing rules to stdout 2026-08-24 18:51:10 -05:00
Adam Honse 061bae9546 Remove udev rules and readme from AppImage CI 2026-08-24 18:09:28 -05:00
Adam Honse 679635afd9 Remove udev references in AppImage and artifacts scripts 2026-08-24 11:15:34 -05:00
Adam Honse 7854c491f7 Remove udev rules from the build process now that the rules are generated dynamically from the executable 2026-08-24 11:01:35 -05:00
Adam Honse 9695f9d00b Update upstream CI rules to run pipelines for tagged commits 2026-08-23 15:42:34 -05:00
Merih Bulut b26df0f67e Add support for Corsair K70 RGB PRO Optomechanical (1B1C:1BC6) 2026-08-23 12:57:48 -05:00
Adam Honse 88fa92fd8d Update Fedora packaging to use openrgb binary's generated udev rules in place of the build udev rules from build-udev-rules.sh 2026-08-23 01:24:28 -05:00
Adam Honse 430501408b Update Debian packaging to use openrgb binary's generated udev rules in place of the built udev rules from build-udev-rules.sh 2026-08-23 01:19:02 -05:00
Adam Honse 19d3f8884e Don't detect devices before and exit immediately after generating udev rules 2026-08-23 00:40:39 -05:00
Thomas Xu 3b4a66096a Added Gigabyte GeForce RTX 4060 Ti AERO OC 16G GPU 2026-08-22 12:17:49 -05:00
Raman b93fe2a058 Add Colorful iGame RTX 3060 Ultra W OC 12G 2503:1501 detector 2026-08-21 14:01:35 -05:00
Diego Ortiz 7332c6a7ea Add Gigabyte Z390 DESIGNARE-CF Ambient LED support 2026-08-21 12:50:00 -05:00
Adam Honse d91dae8f15 Update to Qt6 dependency as removing it broke build 2026-08-20 23:00:09 -05:00
Junguo Song 02979dc209 Initial commit for ZOTAC GAMING GeForce RTX 5090 D SOLID OC 2026-08-20 22:37:03 -05:00
Adam Honse c1cbbfc207 Remove outdated Qt dependency in Fedora build 2026-08-20 22:33:52 -05:00
Wiktor Max 2631b5c0b2 Add Gigabyte RX 9070 GAMING OC detection (at 0x75) 2026-08-20 22:31:59 -05:00
Adam Honse 5795280b49 Use Trixie for AppImage and Supported Devices CI targets, update Fedora target to 44 and update naming convention to match Debian targets 2026-08-20 11:43:39 -05:00
Adam Honse 2b834c9ee4 Put OpenRGB version and git commit in udev rules header 2026-08-20 11:32:43 -05:00
Adam Honse 444a748411 More updates to match the behavior of the build-udev-rules.sh script 2026-08-20 10:38:57 -05:00
Adam Honse 58238c048b Add custom udev rules everywhere a dummy detector was used 2026-08-20 10:38:57 -05:00
Adam Honse c5befc354b Add framework for registering custom udev rules 2026-08-20 10:38:57 -05:00
Adam Honse 33854f8886 Build udev from DetectionManager 2026-08-20 10:37:46 -05:00
Adam Honse 8121ee29f4 Clean up the CLI code 2026-08-19 23:53:28 -05:00
Richard Harris 15b784f6c6 Fix startup crash and other issues in VialRGB controller 2026-08-19 22:42:22 -05:00
Ken Sanislo 2df162408e Logitech HID++ 2.0: detect and drive devices over Bluetooth 2026-08-19 22:38:14 -05:00
Ken Sanislo 10d06298ce Logitech HID++ 2.0: read the whole Centurion feature set 2026-08-19 22:35:19 -05:00
QuickMythril eebe4dd0dd Initial commit for EVGA X12 Gaming Mouse 2026-08-19 13:43:54 -05:00
Adam Honse 0459df64c1 Add missing display name fields in SDK protocol documentation 2026-08-19 12:21:28 -05:00
Adam Honse b635f0c2fd Block signals when updating the mode colors spin box in UpdateLEDList 2026-08-18 22:36:00 -05:00
Ryan Black 770e40596e Corsair Strafe MK.2: add PID 0x1B48 to K70 MK2 group (fixes 4-year unresponsive-keyboard bug) 2026-08-18 22:23:24 -05:00
Adrian Tworzydlo 2e990ba3ce Add PowerColor Red Devil RX 7900 XTX support (V2 driver) 2026-08-18 22:22:27 -05:00
Ken Sanislo ea5d7c6c4c Logitech HID++ 2.0: read the power source on the device's broadcast 2026-08-18 22:09:52 -05:00
Ken Sanislo 779514a6fc Fix Logitech HID++ 2.0: key both collections of one Windows interface together 2026-08-18 22:08:17 -05:00
smbd f027b7a312 Add Palit RTX 3090 Ti GameRock support 2026-08-18 19:10:51 -05:00
Ken Sanislo da31501087 Fix LogitechHIDPP20Controller probe negative cache 2026-08-18 19:10:18 -05:00
Ken Sanislo 140aa96aff Fix/macos hid open nonexclusive 2026-08-18 19:01:53 -05:00
Adam Honse 671f0a66f5 Exit after listing profiles 2026-08-18 18:46:00 -05:00
Adam Honse 5b1e782b9b Update CLI description to match about in UI 2026-08-18 18:35:30 -05:00
Adam Honse b222dfeceb Clean up help text some more 2026-08-18 18:30:22 -05:00
Adam Honse 5db5678c1d Add -lp/--list-profiles command line options, clean up help text, and clear active profile on CLI device changes 2026-08-18 18:22:43 -05:00
Adam Honse 433cbc1837 Rework -l/--list-devices to just print a simple list, add -ld/--list-detailed for the full detailed list 2026-08-18 17:37:47 -05:00
Adam Honse bf99c32e72 Remove warning that triggered during normal operation 2026-08-18 17:25:52 -05:00
Adam Honse c2ec44c0b7 Ignore empty matrix maps when getting zone/segment descriptions 2026-08-18 11:01:56 -05:00
Adam Honse 550fa1046e Fix logic around denying setting or modifying local settings from the server 2026-08-17 19:37:55 -05:00
Adam Honse cf910d2616 Implement profile loading on service shutdown 2026-08-17 19:36:05 -05:00
Adam Honse 2d32510008 Create Startup directory if it doesn't exist on Windows 2026-08-17 16:47:33 -05:00
RomanG1337 4d8fd55206 Add support for GameSir Nova 2 Lite controller 2026-08-17 11:38:57 -05:00
Ken Sanislo c852af2a2c Logitech HID++ 2.0: VID-generic detection, protocol fixes and device support 2026-08-16 23:27:46 -05:00
Daniel Clark ae22e1e8ea Add Asus PG32UCDMR 2026-08-16 23:20:45 -05:00
Adam Honse 02620313f6 Adjust DetectionManager to allow specific VID, any PID detectors but still separate generic detectors into their own category 2026-08-16 19:34:42 -05:00
Adam Honse bbccdc2de0 Fix typo in Windows startup file 2026-08-16 18:43:21 -05:00
Adam Honse bc54e18e48 Clean up Creative Sound Blaster controllers 2026-08-16 18:41:23 -05:00
Adam Honse 8e4859688d Make zones in DDP, E1.31, and Serial LED strip manually configurable except for size, as this is defined in the manual configuration 2026-08-16 18:36:41 -05:00
Adam Honse 967bb51313 More settings schema filter fixes, allow registering a schema key that ignores filtering as Detectors needs this 2026-08-16 18:05:08 -05:00
Adam Honse 51d46849fb Pass from_server flags down from JsonString functions into Set/ModifySettings 2026-08-16 17:36:34 -05:00
Adam Honse 74bb119a05 Add an option to automatically load a profile on background service startup 2026-08-16 17:33:55 -05:00
Daniel Clark ae038bc8e9 Update DetectionManger to handle generic wildcards in safe mode. 2026-08-16 16:33:11 -05:00
Adam Honse 433788cc49 Add PNY RTX 5070Ti Epic-X ARGB non-OC 2026-08-16 14:42:37 -05:00
Buu342 5e6d627f51 Fix for LEDs without an assigned key not being properly represented in QMK Firmware 2026-08-15 19:51:28 -05:00
Adam Honse f9897ef99a Implement settings schema filtering
* Filter settings that have a registered schema so that only keys matching the schema get saved
  * Allow settings that do not have a registered schema (manually added devices, device-specific, plugins, client)
  * Update schema registration to allow marking a settings group as local only, which means it modifies the local instance's settings, not the remote
  * Deny setting local only settings when the update comes from the network server
2026-08-15 17:41:29 -05:00
Adam Honse 5c1a2c4d13 Attempt to build against mbedtls3 path by default and fall back to mbedtls path if it doesn't exist, fixes build on distros that have moved mbedtls 3.x to the /usr/include/mbedtls3 path 2026-08-14 11:33:40 -05:00
John Monteiro f987bc3199 Add support for Gigabyte B360 AORUS GAMING 3 WIFI-CF 2026-08-14 01:02:04 -05:00
Irturijus 0c1a73accc Add ASUS ROG Strix G18 G814JIR support 2026-08-12 18:23:40 -05:00
Adam Honse 1fb75b66dd Limit maximum SDK packet size to 8MB 2026-08-12 18:17:51 -05:00
Adam Honse 790e1485f6 Remove minimum width check when determining compact tab mode as it doesn't handle scaling above 100% properly and the manual configuration exists now 2026-08-11 20:00:22 -05:00
Adam Honse 400faabb21 Improve scroll wheel behavior in Plugins settings page 2026-08-11 19:58:57 -05:00
Rogue Turtle 684b74ca9e Added support for 75% Sinowealth10c-based keyboards with indices bigger than the keyboard size 2026-08-10 12:31:02 -05:00
Tony McDowell 6069a3c0cb RazerController: update HID detection for Razer Blackwidow V4 standard. 2026-08-10 12:16:03 -05:00
Adam Honse 606f5f6c86 Updates Flapak plugin support and building Flatpak in GitLab CI 2026-08-09 16:13:10 -05:00
Adam Honse bfccc1a95d Check /run/host paths when looking for udev rules, as this is the only way to mount these host-side paths on Flatpak 2026-08-08 15:45:39 -05:00
Chalenged e33a56001a Fix TUF Gaming K3 GEN II Miku Edition layout 2026-08-07 15:17:07 -05:00
Titan 0afc4c752f Skyloong GK68HE Pro Support 2026-08-07 11:27:18 -05:00
Adam Honse 834fc6a8f7 Use device type to set zone name in HID LampArray controller 2026-08-07 11:17:36 -05:00
Adam Honse da824ccfa8 Update hidapi-hotplug Windows dependencies to hidapi-hotplug-0.15.0 tag 2026-08-06 23:17:43 -05:00
Adam Honse 2c397c5110 Call DeviceUpdateLEDs from Zone/Single functions 2026-08-06 22:00:22 -05:00
Jannik Vogel 4a4f04825c Fix crash due to bad lamp count in DeviceUpdateLEDs 2026-08-06 21:59:36 -05:00
Adam Honse 2ac41813fa Add autonomous mode as a selectable mode 2026-08-06 21:57:25 -05:00
saad-script 422414737b rework report id parsing to be more consistent 2026-08-06 21:57:25 -05:00
Adam Honse d45d9a31be Units are in micrometers not millimeters 2026-08-06 21:57:25 -05:00
Adam Honse 5f297a62ba Get vendor and device names from HID descriptors 2026-08-06 21:57:25 -05:00
Adam Honse 7605c14d89 Switch to PU ONLY detector 2026-08-06 21:57:25 -05:00
Adam Honse bad23f7574 Use HID serial number 2026-08-06 21:57:25 -05:00
Adam Honse ee4886512b Determine device type from LampArray kind 2026-08-06 21:57:25 -05:00
Werner Sembach 8a87befeda Dynamically parse report IDs 2026-08-06 21:57:25 -05:00
Werner Sembach 44b37c57c1 Prepare LampArray report IDs being parsed dynamically 2026-08-06 21:57:25 -05:00
Werner Sembach 0b59ccfb42 Properly setup key names 2026-08-06 21:57:25 -05:00
Werner Sembach 3c8f05982e Automatically create matrix 2026-08-06 21:57:25 -05:00
Werner Sembach a7a6b241e0 Add meta information for udev rule to be generated automatically 2026-08-06 21:57:25 -05:00
Adam Honse d6de563178 Rework to use only a single hid_device and DetectionManager API 2026-08-06 21:57:25 -05:00
Adam Honse ee62b14384 Multi update packet working for proof of concept direct mode 2026-08-06 21:57:25 -05:00
Adam Honse 712df22b95 Implement getting lamp attributes for each lamp and disabling autonomous mode, work on multi update 2026-08-06 21:57:25 -05:00
Adam Honse a0d063e78f Begin implementing the HID LampArray protocol for Arduino test device 2026-08-06 21:57:25 -05:00
Adam Honse 5a2712750b Initial commit for HID LampArray Controller 2026-08-06 21:57:25 -05:00
Adam Honse 320f755e5e Update super_io_pawnio.cpp to add logging and update ioctls 2026-08-06 20:47:05 -05:00
Adam Honse f1d4a7c045 Add logging to MSI-RGB motherboard detection 2026-08-06 19:38:48 -05:00
Adam Honse 710f97bb62 Fix LpcIO.bin name in superio_pawnio so that Super IO access initializes in Windows 2026-08-06 18:51:14 -05:00
Adam Honse 454344185c MSI Motherboard Cleanup - Rename Mystic Light to Motherboard, move MSI Mystic Light 64 to keyboard as it is a keyboard, do some code cleanup 2026-08-06 17:20:17 -05:00
Kyle Finter b25250db7b New Keyboard layout for Corsair K70 LUX RGB 2026-08-06 08:35:47 -05:00
Yousif Ragab 009156994e Add support for Gigabyte AORUS RX 6900 XT MASTER rev 2.0 2026-08-06 08:31:13 -05:00
Aiden Corbin 6f21dd884c Add GALAX GeForce RTX 3070 1-Click OC 2026-08-06 07:18:49 -05:00
Adam Honse 5dfa33320e Split detector file for Asus Aura Core 2026-08-06 00:05:10 -05:00
Adam Honse 2147291c52 Split detector file for Alienware monitors and organize into folders 2026-08-06 00:01:52 -05:00
Rui Guilherme e971c619b1 Add support for Redragon M711-FPS-1 Cobra FPS 2026-08-05 20:32:02 -03:00
LittleQuartZ 6e832b337f Add PowerColor Red Devil RX 6700 XT support 2026-08-05 20:02:48 +07:00
Raulkong898 6ec5a955df Add Keychron J2 HE 8K support to QMKKeychronController 2026-08-05 01:59:28 -05:00
Adam Honse 71cd411ffc Fix active profile initialization during initial local client connection as well as local client reconnections 2026-08-05 01:20:06 -05:00
Adam Honse 1be9097852 Do not reinitialize client flags upon disconnect, this prevented local client from being re-requested upon local server restart 2026-08-05 00:25:38 -05:00
Adam Honse a8a848a259 More local client cleanup in the UI - don't show the save or rescan buttons for local client 2026-08-05 00:02:27 -05:00
Ken Sanislo 15d008a169 OpenRGBClientInfoPage: disable the disconnect button for the local client
Commit amended to adjust comment and tooltip by Adam Honse <[email protected]>
2026-08-04 23:40:41 -05:00
Adam Honse 2e09228568 SDK6 PROTOCOL CHANGE: Add client and server hostname set packets 2026-08-04 11:52:54 -05:00
Adam Honse bfaef77719 API5 PLUGIN CHANGE: Add function for plugins to save profiles, add RGBController static functions to plugin API 2026-08-03 22:58:02 -05:00
Adam Honse 02d0e16a72 Clean up SteelSeriesApexBaseController 2026-08-03 21:33:23 -05:00
Alessandro Di Ronza 6ebf3573af Add illumination brightness control to the Apex keyboards 2026-08-03 21:24:43 -05:00
Barry H 5aef451e81 Add edifier halo pixelbar 2026-08-03 20:59:57 -05:00
Adam Honse 1880961afa Royuan keyboard controller cleanup 2026-08-03 20:41:15 -05:00
Maylton Fernandes fb5a723193 Consolidate ROYUAN keyboard protocol support 2026-08-03 20:32:40 -05:00
Maylton Fernandes 88002a4abf Add Akko Multi-modes Keyboard-B RGB support 2026-08-03 20:32:40 -05:00
Maylton Fernandes 289dbc675a Add Akko Multi-modes Keyboard-B RGB support 2026-08-03 20:32:40 -05:00
Daniel Clark bcfaa7e8a7 fix Z490 Vision D layout 2026-08-03 16:50:05 -05:00
Adam Honse bf62ead713 Migrate controller manual configurations (zone sizes) from legacy sizes.ors 2026-08-03 16:46:19 -05:00
Adam Honse 8a7cda7495 Rework profile migration, match new function style for reading the legacy file into a controller list, handle migration after local client connection so that profiles can upload to server 2026-08-02 23:47:57 -05:00
Adiker 84cf974d70 ProfileManager: migrate legacy binary profiles to JSON 2026-08-02 18:03:34 -05:00
Lord258 afc54314b5 Add support for Nanoleaf Lines (NL59) 2026-08-02 17:20:22 -05:00
Valentin Lobstein bd8db75106 Add ITE 829x (PID 0x8910) per-key RGB keyboard support + diagonal direction core support 2026-08-02 15:45:01 -05:00
Valentin Lobstein 9da692b12f SDK6 PROTOCOL CHANGE: Add diagonal direction support to OpenRGB core 2026-08-02 14:13:19 -05:00
Andrew Ingram 4ee39b0dc8 Add SteelSeries Rival 5 support 2026-08-02 00:23:32 -05:00
Norman Rasmussen 286514b509 Skip plugin entries that are incompatible during duplicate plugin detection 2026-08-01 19:01:51 -05:00
Diogo Trindade c7140baa33 Fix device IDs in worker thread acknowledgements 2026-08-01 18:56:59 +01:00
Ken Sanislo 2a9889b194 NetworkClient: break the listener/GUI deadlock structurally 2026-08-01 11:16:20 -05:00
Norman Rasmussen 2afbd64c8e Release internal locks in RGBController_Virtual before calling functions that will call back into public APIs 2026-07-31 14:23:36 -05:00
Adam Honse 8be6aba43a SDK6 PROTOCOL CHANGE - Change from 32-bit to 16-bit device/bus/port count size on the device info network packets for consistency with other array packets 2026-07-31 11:45:51 -05:00
Maylton Fernandes 565f1dad74 Add ASRock RX 9070 XT Steel Legend RGB support 2026-07-31 10:19:59 -05:00
aestheticjmack 67a81f219d Add SteelSeries Aerox 3 Wireless Gen 2 support 2026-07-31 07:58:14 -05:00
Adam Honse ccd103a29f Enable systemd hardening in openrgb.service 2026-07-30 23:04:03 -05:00
Adam Honse c5d088b69d SDK6 PROTOCOL CHANGE - Flip order of active mode and mode count in zone description for consistency 2026-07-30 22:43:56 -05:00
Adam Honse 6362054368 Don't attempt auto connect when started in server mode 2026-07-30 22:29:42 -05:00
Adam Honse 2dab17f5dc Error out if setting RGBController description parsing fails in NetworkClient 2026-07-30 19:14:49 -05:00
Justo Enriquez c545305825 Fix Gigabyte Radeon RX 9070 XT not detected by Blackwell GPU controller 2026-07-30 18:59:19 -05:00
Adam Honse 578c81784b Fixups around hiding/unhiding controllers, create a new function that only handles showing and hiding for SignalUpdate callbacks, fix pointer dereference in NetworkServer, fix same-thread method invoke 2026-07-30 18:49:06 -05:00
Adam Honse 1cd9b63c3e Fix errors in updating device list when hidden devices exist 2026-07-30 16:49:59 -05:00
Ken Sanislo 7b1817a0b8 ResourceManager/GUI: leave client mode cleanly on primary disconnect
Two problems surfaced once disconnect stopped crashing.

Disconnecting the automatic local connection left auto_connection_client
pointing at the freed client and auto_connection_active still true.
RescanDevices and GetDetectionPercent/String trust those, so a rescan
afterward called into freed memory and aborted (std::system_error from
send_in_progress.lock() on a destroyed mutex). Clear the pointer and the
flag in the teardown when the removed client is the auto connection.

onDetectionEnded never lowered the detection view; only the progress
handler did, at 100 percent. A real detection reaches 100, but a client
teardown borrows DETECTION_STARTED/COMPLETE to make plugins release the
controllers and sends no progress, so the "detecting devices" overlay
stuck on after a disconnect until Cancel. Lower it unconditionally when
the sequence ends.
2026-07-29 23:36:02 -07:00
Ken Sanislo fb0e4f3ad9 Tear down lost and closed client connections safely
When a connection dropped, the listener thread deleted all of that
server's controllers immediately, before anything else was notified, so
the GUI, ResourceManager, and plugins kept dereferencing freed
controllers. Clicking Disconnect had the same problem and also ran the
teardown inline on the GUI thread, where UpdateDeviceList's
DEVICE_LIST_UPDATED is a BlockingQueuedConnection back to that thread,
so the device pages were not torn down before the controllers were
freed and a later queued onDetectionEnded dereferenced them.

Neither path frees controllers inline now. NetworkClient moves them to
an orphaned list and a dedicated teardown thread frees them: plugins
are warned first, then the same DETECTION_STARTED, UpdateDeviceList,
DETECTION_COMPLETE sequence a rescan runs tears down the device pages
that still reference the controllers, and only then are they freed, so
a controller always outlives its page. Both the connection-loss path
and the disconnect button queue to that thread, so the blocking handler
runs on the GUI thread while the controllers are still alive, and
StopClient's join stays off the GUI and listener threads.
2026-07-29 23:36:02 -07:00
Adrian Liunardo 09a5b414b6 Add support for iGame GeForce RTX 4070 Ultra W OC-V 2026-07-30 00:28:59 -05:00
Shalev e5dc869c9b Add ASUS TUF GeForce RTX 5060 Ti Gaming OC support 2026-07-29 17:05:21 -05:00
Ken Sanislo 2687ff57aa NetworkClient: initialize client_active and profilemanager_thread
StopClient guards profilemanager_thread and nulls it after the delete,
but nothing ever set it, so destroying a client that never started
read an uninitialized pointer. client_active was unset until
StartClient and is read on the same path.
2026-07-29 11:25:06 -05:00
Ken Sanislo 52138b4cbd NetworkServer: initialize profilemanager_thread
StopServer guards the pointer and nulls it after the delete, but
nothing ever set it, so destroying a server that never started read an
uninitialized pointer.
2026-07-29 11:25:06 -05:00
Ken Sanislo b3a2cccfed NetworkServer: per-client send thread for SignalUpdate notifications
RGBController_UpdateCallback sent the SignalUpdate packet synchronously
via SendRequest_RGBController_SignalUpdate, which runs inside
RGBController::SignalUpdate. A blocking send there (slow client) keeps
SignalCalls > 0, so WaitSignalCalls -- the callback drain that
Unregister/ClearCallbacks/Shutdown run while tearing callbacks down on a
rescan -- waits forever. That is the client/server rescan deadlock.

Each client now owns an outbound queue and a dedicated send thread. The
signal path builds the packet (brief AccessMutex, as before) and queues
it; the client's own thread does the blocking send. A slow client backs
up only its own queue and blocks only its own thread, so the signal path
and the callback drain are never blocked.

UPDATELEDS packets coalesce per controller (a newer frame replaces the
pending one), so a stalled client's queue stays bounded to one packet
per controller instead of growing without bound; non-coalescable events
fall back to a hard cap with drop-oldest. The client destructor stops
the thread with shutdown(SD_BOTH), which unblocks an in-flight send, so
the join at teardown cannot hang. A queue entry owns its packet header
and data buffer; the send thread frees the buffer after the send, so
there is no copy and the packet outlives the controller safely.

Follow-up: the send still takes the shared send_in_progress, so a slow
client can still stall sends to others; routing response sends through
the same per-client path would make that a per-client lock.

net_port: add SD_BOTH (SHUT_RDWR) for the POSIX socket shims.
2026-07-29 11:25:06 -05:00
someone-ua 15a8abf2c9 Detect AppImage path in AutoStart::GetExePath() 2026-07-29 07:20:01 -05:00
Daniel Clark d16b474aa8 Fix X870E Aorus Xtreme AI Top Layout and fix fixed linear zone layout mapping. 2026-07-29 07:15:31 -05:00
Marek Pokropiński 760758230a Initial support for Acer Nitro 16s 2026-07-28 08:38:25 -05:00
Adam Honse 358fc7b007 Implement a response queue to prevent a NetworkClient deadlock when multiple packets are waited on 2026-07-27 23:33:40 -05:00
Alessandro Di Ronza 069eeccb60 CLI: return a device list again, and print the version 2026-07-27 17:27:54 -05:00
Alessandro Di Ronza da77b63bea Fix SteelSeries Apex 9 lighting by using the correct direct report size 2026-07-27 17:23:28 -05:00
Adam Honse 791d8820d6 Get active effect and active settings during Valve Steam Machine initialization 2026-07-26 23:18:15 -05:00
Ken Sanislo 05fbe381dd MSIMonitorController: idle the control pipe between feature reports 2026-07-26 22:07:33 -05:00
isJuhn 3b2466ba10 Fix use after free in NetworkClient and NetworkServer 2026-07-26 22:03:43 -05:00
Ken Sanislo acc7fa6754 Invoke resource manager callbacks outside the callback mutex 2026-07-26 17:47:18 -05:00
Adam Honse 394a5c8eb0 Replace thread-local SignalUpdateDepth with SignalCalls per controller. Fixes an issue where callbacks that performed an unregister or clear operation on a separate thread would still deadlock, as is the case in Visual Map Plugin. Cleaned up comments 2026-07-26 01:29:34 -05:00
Adam Honse ac6d89b611 Bundle Qt6OpenGL and Qt6Core5Compat libraries and adjust LD_LIBRARY_PATH in AppImage to fix plugins using the system qt6 libraries 2026-07-25 21:37:03 -05:00
Ilya Miller 46cdd6fbe1 OpenRGBDevicePage: keep the color selection when applying a color 2026-07-25 13:28:38 -05:00
Adam Honse 14d543b9e4 Initial commit for Linux-only controller for Valve Steam Machine using
the leds-valve kernel module and sysfs interface
2026-07-25 01:16:11 -05:00
Ilya Miller 8a831cef04 Add Dark Project KD104A support to the Keyrox Classic driver 2026-07-24 13:53:06 -05:00
Ken Sanislo 9fd79b1ad2 RGBController_Virtual: signal update when description is replaced 2026-07-24 13:22:00 -05:00
Daniel Clark c9c37a4576 Add GC-USB dongle, per zone effects, Gen2 Zones, and Updated MB Layouts 2026-07-22 22:47:25 -05:00
Ken Sanislo fe53d90664 RGBController: fix callback list race and dangling device-page callback on rescan 2026-07-22 21:59:30 -05:00
Adam Honse 8e8a9c8e05 Split Alienware keyboard controller detect file into individual controllers 2026-07-22 19:08:23 -05:00
Adam Honse dafc6e9cbc Split Bloody/A4Tech detector file into individual files per controller 2026-07-22 11:37:15 -05:00
Bernd Loecke 68b113bf86 Add MSI MAG X870E TOMAHAWK MAX WIFI PZ support 2026-07-22 07:42:41 -05:00
Ken Sanislo eb5d8b579c MSIMysticLight761: restore resizable JAF/JARGB zones 2026-07-22 07:41:30 -05:00
Adam Honse 56df76dbfc Split HyperX keyboard detector file into individual detector files 2026-07-22 00:42:16 -05:00
Adam Honse 878f32fccf Split Holtek detector file into individual detector files for A1FA Mousemat and A070 Mouse 2026-07-21 23:50:13 -05:00
Adam Honse 63828313bd Split EVGAUSBControllerDetect into individual keyboard and mouse files 2026-07-21 23:34:06 -05:00
homelab black 31992acad1 Fix layout regression for KEY_EN_ESCAPE and KEY_JP_EJ 2026-07-21 22:44:15 +09:00
HNParda bd41ba3b5c Added Support for Gigabyte RX 6700 XT Eagle 12G 2026-07-21 00:15:58 -05:00
Adam Honse b9309c61e1 Split EVision keyboard files into folders and split the shared detector file 2026-07-21 00:14:12 -05:00
Ken Sanislo 7fc8aea930 MSIMonitorController: 0x72 layout support (MPG 322URX QD-OLED + siblings) 2026-07-20 23:22:02 -05:00
Ken Sanislo b35e119325 DetectionManager: controller lifecycle and thread-safe registration 2026-07-19 02:04:46 -05:00
eldiablo 8fb790358f Add support for SteelSeries Arctis Nova 3 headset 2026-07-18 18:54:38 -05:00
Ken Sanislo 39c6dbf361 DeviceView: add F13-F15 and Number Pad = device-view labels 2026-07-18 13:01:25 -05:00
John Hamlin 9d189d5b9b Add support for MSI B850 GAMING PLUS WIFI PZ (MS-7E75) motherboard 2026-07-17 19:07:39 -05:00
Adam Honse 9e5c63cc64 Add second sub-dev for MSI RTX4070Ti Super Gaming White X Slim 2026-07-17 18:54:54 -05:00
Adam Honse b664f35e17 Fix potential out of bounds reference in ASRockPolychromeUSB controller when zone size is 0 2026-07-17 17:17:39 -05:00
Filip Machałowski 381e3ac70c Add support for PowerColor Red Devil RX 9070 2026-07-17 13:19:35 +02:00
Stella e3225d93c4 Add support for Colorful iGAME RTX 5070Ti Ultra W OC 16GB 2026-07-17 00:14:57 -05:00
Andrey 1b3480bf8a Replace ADL2_ADAPTER_PRIMARY_GET function usage with adapter_index in i2c_smbus_amdadl 2026-07-16 08:17:16 -05:00
RedBlackAka a6bea17df2 Add Nvidia RTX 2080 Ti Cyperpunk 2077 Edition 2026-07-16 04:10:41 +02:00
Adam Honse 28d73d74bc Delete hidden pages if their controller no longer exists 2026-07-14 21:45:18 -05:00
Adam Honse cf383cacdd Use a blocking connection when updating the device list to prevent accessing deleted controllers 2026-07-14 21:45:18 -05:00
Adam Honse d9b0995b44 Run RescanDevices in a background thread to avoid locking the UI thread and causing a deadlock in the plugins 2026-07-14 21:45:18 -05:00
Ken Sanislo 79eb758a52 Logitech HID++ 2.0: restore COUNT fill for the keyboard matrix map 2026-07-14 21:45:18 -05:00
Daniel Clark 75463b8772 Fix K5 V2 layout and add ANSI Enter Expansion 2026-07-14 21:45:18 -05:00
Barry H 5da92fca4e Added all Skydimo Serial and HID devices 2026-07-14 21:42:42 -05:00
Darren You d11be2aa0b Initial commit for Colorful iGame GeForce RTX 4090 Neptune OC-V 2026-07-13 00:17:06 -05:00
Adam Honse 285a7bce4e Implement a matrix patching system in the Keychron QMK controller to apply keyboard-specific patches to correct for misplaced LEDs 2026-07-12 16:25:07 -05:00
Adam Honse 21009cdc45 Don't send RGBController packets that are too new for the current protocol in NetworkClient 2026-07-11 14:20:43 -05:00
Adam Honse a0cee2ce2b Maintain a list of created virtual controllers in the OpenRGBPluginAPI object and only allow registering virtual controllers that exist in this list 2026-07-11 14:20:38 -05:00
Joseph E ba33ff0c35 Steelseries Apex 9 merge into Apex controller + enable onboard mode 2026-07-11 00:11:45 -05:00
compguy284 795616e62d Fix Corsair keyboard cold-boot detection by retrying firmware info read 2026-07-10 17:55:23 -05:00
Adam Honse baa033ff7f Add Keychron Q0 HE 2026-07-10 15:40:35 -05:00
Eder Sanchez 33ec03d129 NetworkServer: reject SDK index == element count (off-by-one)
The SDK LED/zone update handlers checked the client-supplied index with '>'
instead of '>=', so an index equal to the element count passed the check and
reached an out-of-bounds access:

- UpdateSingleLED: out-of-bounds write to colors[led_idx]
- UpdateZoneLEDs / UpdateZoneMode: out-of-bounds read/write on zones[zone_idx]

UpdateMode had the same off-by-one (currently harmless due to a later check),
fixed for consistency. The num_colors check stays '>' since num_colors ==
leds_count is a valid "all LEDs" request.
2026-07-10 14:44:44 -05:00
Eder Sanchez a0d5a985f0 ZOTAC Blackwell GPU: fix firmware-version read
ReadVersion() issued a register-less block read, so the device returned a
status byte (0x01) instead of the version string. Read register 0xF0 (a
32-byte ASCII board string), as the vendor tool does, and validate it.

- fixes the empty/garbage firmware version in the log and GUI
- closes an out-of-bounds read (unbounded std::string over a 32-byte buffer)
- tested on RTX 5080 AMP Extreme INFINITY: now reads "N762A-2008e"
2026-07-10 13:42:01 -05:00
Adam Honse 1275fe816b Make tray icon menus translatable 2026-07-10 13:00:12 -05:00
homelab black d4e1ed5245 Controllers: RoccatVulcan: Add Japanese (JIS) layout support for Vulcan II Max 2026-07-10 00:14:02 -05:00
Marius Huecker b833a43490 Add Gainward RTX 4080 Phantom GS 2026-07-08 20:16:38 -05:00
Adam Honse 94295c52ba Dynamically set DeviceView minimum height based on height of contents to avoid devices with a lot of segments/zones getting squished 2026-07-08 20:05:21 -05:00
Adam Honse f32aa29ecd Put Device View in a QScrollArea so it can be scrolled if it is too large to fit in the window 2026-07-08 11:03:31 -05:00
Adam Honse 623fdfe522 DetectionManager fixes and optimizations 2026-07-07 23:01:39 -05:00
Adam Honse a122ccdc37 Add network packet for requesting USB serial ports 2026-07-07 21:00:46 -05:00
Dmitry K 74219e502a [next] Add function to retrieve ALL USB-attached COM ports 2026-07-07 21:00:36 -05:00
Dmitry K 73cd84f43c [next] Fix memory leak in serial port detection 2026-07-07 17:13:59 -05:00
Adam Honse f5a8ecc3f4 Rework RGBController functions that return vector counts to use unsigned int instead of std::size_t, to be consistent with the size used in the network protocol and to fix warnings 2026-07-07 17:13:59 -05:00
Adam Honse 86a6a130e7 Add network packet for getting list of serial ports 2026-07-07 17:13:59 -05:00
Adam Honse 703afac049 Update OpenRGB SDK Wireshark Dissector 2026-07-07 17:13:59 -05:00
Adam Honse 2d0ebb7279 Update RGBController API documentation 2026-07-07 17:13:59 -05:00
Adam Honse d9b51e4a02 Update SDK documentation and add a server flag to indicate if the server supports the device info requests 2026-07-07 17:13:45 -05:00
Adam Honse 387fed4f79 Add network request for requesting list of USB devices in local client mode 2026-07-07 01:35:35 -05:00
Adam Honse df0137c2b0 Add network request for requesting list of HID devices in local client mode 2026-07-07 01:35:35 -05:00
Adam Honse 7c059fa3e3 Fix RGBController callback registration in NetworkServer 2026-07-07 01:35:35 -05:00
Adam Honse 1a62db7246 Fixes for V6+ client on V5- server 2026-07-07 01:35:35 -05:00
Adam Honse 3a0b93c774 Remove mode::value and led::value accessors, remove these fields from protocol version 6 and newer. These should be internal use only, but are still accessed for protocol 5 and earlier for backwards compatibility. 2026-07-07 01:35:35 -05:00
Adam Honse 1afe65d206 Move CompareControllers to RGBController 2026-07-07 01:35:35 -05:00
Adam Honse 962754f379 Perform validity checking on received modes when UpdateMode/UpdateZoneMode/SaveMode are called from a network client 2026-07-07 01:35:35 -05:00
Adam Honse e69c9eedae Add display name fields to controller and zone instead of editing the existing name field 2026-07-07 01:35:35 -05:00
Adam Honse 9182d1e566 Add ConfigureDevice and the ability to configure device name 2026-07-07 01:35:35 -05:00
Adam Honse 893de3f076 Add SetHidden SDK packet 2026-07-07 01:35:35 -05:00
Adam Honse 4f1c623093 Use RGBControllerInterface for plugin API 2026-07-07 01:35:35 -05:00
Adam Honse 7846d22bd8 Add another thread in NetworkClient for handling ProfileManager requests outside of the main listener thread, to avoid deadlocking the waiting receivers 2026-07-07 01:35:35 -05:00
Adam Honse 68ae9ef9d5 Update translation files and fix some translation related issues 2026-07-07 01:35:35 -05:00
Adam Honse 44641ca8a6 NetworkClient cleanup and internal API standardization 2026-07-07 01:35:35 -05:00
Adam Honse 152f16b31c NetworkServer cleanup and internal API standardization 2026-07-07 01:35:35 -05:00
Adam Honse b87f7150fc Add indication of standalone or local client mode to about page 2026-07-07 01:35:35 -05:00
Adam Honse 831a7cf5eb Implement network request to get list of I2C buses so that the Get Hardware IDs dialog works in local client mode 2026-07-07 01:35:35 -05:00
Adam Honse f99843a550 Add option to force compact tabs and option to move tabs from left to top 2026-07-07 01:35:35 -05:00
Adam Honse 35217bce51 More LogManager cleanup, default to a log file count of 10, fix bug in log rotation 2026-07-07 01:35:35 -05:00
Adam Honse 00077347b4 Log manager SDK protocol 2026-07-07 01:35:35 -05:00
Adam Honse b2c9ace9c8 Log Console Updates 2026-07-07 01:35:35 -05:00
Adam Honse fd7dbd618d LogManager cleanup 2026-07-07 01:35:35 -05:00
Adam Honse 103b5f27bb Settings Rework
* Add JSON string configuration field to RGBController to store device-specific configurations
    * This JSON string holds both configuration and schema
    * Add settings schema tracking to SettingsManager
    * Implement dynamic settings widget that generates a settings UI based on a JSON schema
    * Implement SettingsManager callback for notifying of settings changes and settings schema updates
    * Always enable Entire Device zone option and use it to enable Edit Device
    * Rename SaveSizes to SaveConfiguration in ProfileManager and Sizes.json to Configuration.json
    * Add zone flag for indicating that a zone's geometry may change, informing profile manager to ignore this check
    * Remove Theme setting and Theme Manager, as this didn't work on most setups anyways and Qt6 has proper Windows dark theming
2026-07-07 01:35:35 -05:00
Dmitry Kychanov 71c1ffe91c Fix losing software info upon changing language [next] 2026-07-07 01:35:35 -05:00
Dmitry Kychanov 0154f3c5dc Fix device tabs not applying compact mode when hotplugging 2026-07-07 01:35:35 -05:00
Adam Honse 60bc375345 Close SDK connection if magic value is not correctly received 2026-07-07 01:35:35 -05:00
Adam Honse 5a2dca1ced Implement size verification on RGBController set description functions 2026-07-07 01:35:35 -05:00
Adam Honse c80f3be283 Clean up zone initialization dialog 2026-07-07 01:35:35 -05:00
Adam Honse 52f757ced2 Require local client permission for DeleteProfile, SaveProfile, UploadProfile, SetSettings, and SaveSettings operations, some general cleanup 2026-07-07 01:35:35 -05:00
Adam Honse 156b7d0f89 Sanitize profile filenames 2026-07-07 01:35:35 -05:00
Adam Honse 69a8c84b4d Add RescanDevices to plugin API 2026-07-07 01:35:35 -05:00
Adam Honse d30f3a5f03 Implement segment groups in zone editor 2026-07-07 01:35:35 -05:00
Adam Honse 2868f61766 Rework server initialization
* Only create server instance if server is actually needed
    * Pass initial server host and port through ResourceManager
    * Allow setting default server host and port in Server settings
2026-07-07 01:35:35 -05:00
stephen iacovelli 5d1c990b18 Sort profiles list alphabetically 2026-07-07 01:35:35 -05:00
Adam Honse e6eeb906b8 Organize OpenRGBSettingsPage with Group Boxes 2026-07-07 01:35:35 -05:00
Kasslim ea00807a06 Correct spelling Busses -> Buses
Commits merged by Adam Honse <[email protected]>
2026-07-07 01:35:35 -05:00
诺诺 95b1133395 Add Nollie controller OS2.1 2026-07-07 01:35:35 -05:00
Adam Honse d56a9133ab Initial implementation of OpenRGB SDK protocol Wireshark dissector 2026-07-07 01:35:34 -05:00
Adam Honse 8c96bf03f5 Add ACK to network packets processed by NetworkServer 2026-07-07 01:35:34 -05:00
Adam Honse 79e546fa43 Only update device view when RGBController::UpdateLEDs signal is sent to OpenRGBDevicePage, fix device view not refreshing if multiple LEDs are selected 2026-07-07 01:35:34 -05:00
Adam Honse baed37ecc7 Don't emit selection update on mouse click event to avoid sending unnecessary events, also only send one type of event per mouse release event. Fix LED box not being updated 2026-07-07 01:35:34 -05:00
Adam Honse c0be211236 Have dummy controller shut down its background thread immediately during constructor to save resources 2026-07-07 01:35:34 -05:00
Adam Honse 55506f984e DeviceView code cleanup, formatting, commenting 2026-07-07 01:35:34 -05:00
Adam Honse d03ca67ae5 Fix selecting LEDs in device view 2026-07-07 01:35:34 -05:00
Adam Honse b7f8eeb034 TabLabel sets its own tooltip so all tabs have a tooltip rather than just devices 2026-07-07 01:35:34 -05:00
Adam Honse e8e0362d85 Resize tabs when width is small 2026-07-07 01:35:34 -05:00
Adam Honse e9f430d8ed Rework adding segments with ConfigureZone 2026-07-07 01:35:34 -05:00
Adam Honse a306cf815b Zone and Segment type updates
* Add zone flags to indicate if fields are manually configurable and if they have been manually configured
  * Add flags field to segment type
  * Add segment flags for group start and group member
  * Add color mode support flags to zone (RGB, RBG, GRB, GBR, BRG, BGR)
  * Add color mode enum to zone
  * Update zone and segment description functions to support new fields
  * Rename the effects-only configurable size flag
  * Remove zone type and matrix map configuration from E1.31 manual configuration, use zone editor instead
  * Rework DeviceResizeZone to DeviceConfigureZone
  * Rework most ARGB controllers to allow zone customizations
  * Rework DRGBController to define devices in DRGBDevices list (similar to RazerDevices)
  * Rework NollieController to define devices in NollieDevices list (similar to RazerDevices)
2026-07-07 01:35:34 -05:00
Adam Honse 7c0eba1dc3 Add matrix map automatic generation to matrix map editor 2026-07-07 01:35:34 -05:00
Adam Honse 5d20744653 RGBController API changes and segment configuration updates
* Make the Get/Set RGBControler descriptor functions static
  * Add functions for getting the matrix_map_type for zone and segment matrix maps
  * Rename zone resize dialog to zone editor dialog
  * Add additional segment types
  * Add option to import segments configuration from JSON file in zone editor dialog
  * Update device view to be able to display matrix segment types
  * Add matrix map editor dialog for creating/editing segment matrix maps
  * Add option to export segments configuration to JSON file in zone editor dialog
2026-07-07 01:35:34 -05:00
Adam Honse 7e74c295a3 When updating existing profile without profile editor dialog, keep saved states for unavailable controllers, base color, and only update plugins already part of the existing profile 2026-07-07 01:35:34 -05:00
Adam Honse d145ee38e7 When saving sizes/manual configuration, keep any existing controllers that are not currently available 2026-07-07 01:35:34 -05:00
Adam Honse 0a39673b9d Rework how manual configuration (previously sizes) are loaded to newly detected controllers, load active profile to newly detected controllers 2026-07-07 01:35:34 -05:00
Adam Honse 6e93443034 Profile editor dialog 2026-07-07 01:35:34 -05:00
Adam Honse cb71627d29 Rework API interface passed into plugins from ResourceManagerInterface to OpenRGBPluginAPIInterface 2026-07-07 01:35:34 -05:00
Adam Honse 35f10dfb48 [next] Active profile tracking 2026-07-07 01:35:34 -05:00
Adam Honse 04ef7a2c28 Apply profiles server-side rather than client-side, signal active profile update, forward loaded profile to local client for plugins 2026-07-07 01:35:34 -05:00
Adam Honse a58e79ba71 Split HID and wrapped HID detector lists into specific detectors (with exact VID/PID matching) and generic detectors (with only IPU matching) and prioritize specific detectors when detecting HID devices 2026-07-07 01:35:34 -05:00
Adam Honse 3a74c85be8 Move RGBController base destructor functionality into RGBController::Shutdown() so that update thread can be stopped before deleting the controller. Shutdown() must be called in every RGBController implementation before deleting the controller. Also some fixes to the NetworkServer to avoid deadlocking and disconnect issues 2026-07-07 01:35:34 -05:00
Adam Honse 6e71cd39b9 Add detectors for filtering on IPU only (no VID/PID) 2026-07-07 01:35:34 -05:00
Adam Honse 248668ea7d Drop support for old hidapi versions that don't support usage information 2026-07-07 01:35:34 -05:00
Adam Honse 496a7a3609 Add some validity checks to mode setters and getters in RGBController 2026-07-07 01:35:34 -05:00
Adam Honse 112b6a2b9b [next] SDK v6: Implement client and server flags to indicate capabilities and... 2026-07-07 01:35:34 -05:00
Adam Honse 7c38dad1ab SDK documentation updates 2026-07-07 01:35:34 -05:00
Adam Honse cd1c9c705b Expose LogManager in ResourceManager so that plugins can use it 2026-07-07 01:35:34 -05:00
Adam Honse b7f68379c2 Update NetworkClient to use log manager and use common name constant in server logs 2026-07-07 01:35:34 -05:00
Adam Honse 43c0fea3be Use std::string.assign when setting strings in the SDK protocol and description handlers so that string size limit is enforced, then strip out null terminators 2026-07-07 01:35:34 -05:00
Adam Honse 39f112bb98 Add optional HID device hotplug support (requires https://gitlab.com/OpenRGBDevelopers/hidapi-hotplug) 2026-07-07 01:35:34 -05:00
Adam Honse 3d113dab3c SDK v6: Use unique IDs for identifying RGBControllers in SDK protocol 2026-07-07 01:35:34 -05:00
Adam Honse 92f397544b Rework list handling in ResourceManager by having NetworkClient own its own list rather than sharing ResourceManager's list 2026-07-07 01:35:34 -05:00
Adam Honse fe4ca34528 Move HID detector calls to RunHIDDetector/RunHIDWrappedDetector functions and return controller list from detector functions 2026-07-07 01:35:34 -05:00
Adam Honse 464ef419e7 Detection progress SDK integration, NetworkClient callback rework 2026-07-07 01:35:34 -05:00
Adam Honse 30e35eb44c Split out detection system from ResourceManager into DetectionManager
* Split detection system out into its own class, DetectionManager
    * Clean up ResourceManger's many callbacks into just two, one for detection and one general purpose
2026-07-07 01:35:34 -05:00
Adam Honse b92a8996e9 SDK Version 6 Updates
* SDK Protocol
    * Server sends its name to client
    * ProfileManager
      * Rename existing profile commands
      * Add Upload Profile, Download Profile, and Get Active Profile commands
    * SettingsManager
      * Add Get, Set, and Save Settings commands
    * Add zone::active_mode, zone::mode fields for zone-specific modes
    * Add NET_PACKET_ID_RGBCONTROLLER_UPDATEZONEMODE packet for updating zone modes
    * Add segment::matrix_map to segment packet
    * Add NET_PACKET_ID_RGBCONTROLLER_SIGNALUPDATE packet for passing SignalUpdate signal from server to clients
  * NetworkServer
    * Formatting cleanup
    * Use per-controller threads for handling NetworkServer controller-specific packets to avoid delays from controller mutexes
  * NetworkClient
    * Formatting cleanup
  * RGBController
    * Clean up and modularize descriptor functions
2026-07-07 01:35:34 -05:00
Adam Honse c887ea94ff Rework Profiles to use JSON format
* Update OpenRGB Plugin Interface to include functions for loading/saving profile JSON data into OpenRGB profiles
    * Update ProfileManager to handle auto-load profiles (Exit, Open, Resume, Suspend) and move their settings to ProfileManager section
    * Update ProfileManager to store profiles in "profiles" folder in .json format
    * Update ProfileManager to store size profile in sizes.json
    * Update ProfileManager to perform device UpdateMode/UpdateColors when loading profile
    * Code cleanup of ProfileManager and profile-related code
2026-07-07 01:35:34 -05:00
Adam Honse 25a753b97a RGBController API Overhaul
* Reorganize and clean up RGBController API functions
    * Add functions to get protected RGBController member values
    * Make NetworkClient, ProfileManager, and ResourceManager friend classes so they can access protected members
    * Protected previously-public RGBController members
        * Information strings (name, vendor, description, version, serial location)
        * Device type
        * Active mode
        * Flags
        * LEDs vector
        * LED alternate names vector
        * Modes vector
        * Colors vector
        * Zones vector
    * Add CONTROLLER_FLAG_HIDDEN to allow plugins to hide controllers from control GUI
    * Add update reason codes to RGBController update callback and signal updates on more RGBController events
    * Add loop zone types and segmented zone type
    * Add matrix map field to segments
    * Rework matrix_map_type from using pointers to vector to prevent memory leaks
    * Rework KeyboardLayoutManager to return new matrix_map_type
    * Add access mutex to RGBController API
    * Add per-zone modes ot RGBController API
    * Add JSON description functions to RGBController API
2026-07-07 01:35:34 -05:00
Adam Honse a86ab2955a Move plugin SDK integration from callback into plugin API and PluginManager 2026-07-07 01:35:34 -05:00
Adam Honse 259e05360e Update Plugin API to 5 and SDK Protocol to 6 2026-07-07 01:35:33 -05:00
Adam Honse 36b4f52cbc Update default builds to Qt6
* Update Debian packages to use Qt6
  * Update Fedora packages to use Qt6
  * Update default AppImage builds to use Qt6
  * Update default Windows builds to use Qt6
  * Update default MacOS builds to use Qt6
2026-07-07 01:35:33 -05:00
Adam Honse ee6343900b Revert "Nollie 2.1 firmware for Master"
This reverts commit 07e7feca56.
2026-07-07 01:35:33 -05:00
Adam Honse 3818398d86 Handle differences in supported features protocol packet between Keychron QMK and ZMK 2026-07-07 01:34:16 -05:00
Adam Honse 0973f6149b Add Keychron Ultra 8K (ZMK) keyboards to Keychron QMK controller as they implement the same protocol 2026-07-07 01:22:02 -05:00
Adam Honse 1e1fb09821 Fix up mode setup in QMK Keychron controller 2026-07-05 17:20:39 -05:00
Adam Honse dfe099fe9b Fix warning in LogitechControllerDetect.cpp 2026-07-04 15:10:48 -05:00
Adam Honse 3b6450f188 Fix warnings in MSILaptopController.cpp 2026-07-04 13:42:17 -05:00
Adam Honse 971a2cc300 Fix warnings in QMKKeychronController 2026-07-04 13:41:57 -05:00
Adam Honse 6b8db478fb Fix Qt6 warning in SuspendResume_Linux_FreeBSD.cpp and clean up includes in SuspendResume files 2026-06-30 01:49:20 -05:00
Adam Honse 3932a9614c Minor cleanups and warning fixes 2026-06-29 18:08:48 -05:00
Adam Honse 4dde4fffe3 Fix unused variable warning in CorsairCommanderCoreController.cpp 2026-06-29 14:40:29 -05:00
Adam Honse 57d38be688 Fix unused variable warnings in CorsairDRAMController.cpp 2026-06-29 14:39:30 -05:00
Adam Honse b79522a955 Fix unused variable warning in NanoleafScanningThread.cpp 2026-06-29 14:10:20 -05:00
Adam Honse 94333ff2f1 Fix QChar warning in Qt6 builds from OpenRGBPluginList.cpp 2026-06-29 14:08:41 -05:00
Adam Honse d3f4bfe192 Fix warning in OpenRGBSystemInfoPage.cpp 2026-06-29 14:05:04 -05:00
Adam Honse d130e64f69 Add 1.0rc3 to releases in metainfo 2026-06-28 23:43:10 -05:00
Adam Honse f7e9cddae9 Change suffix back to get after 1.0rc3 release candidate 2026-06-28 23:40:32 -05:00
1388 changed files with 123876 additions and 60566 deletions
+123 -67
View File
@@ -14,9 +14,9 @@
# run only if manually started to save CI minutes if #
# GitLab hosted runners #
# * For commits to the CalcProgrammer1/OpenRGB repository, #
# automatically run all jobs on the default branch, #
# otherwise run them if the source is part of a merge #
# request #
# automatically run all jobs on the default branch or #
# tag builds, otherwise run them if the source is part #
# of a merge request #
#-----------------------------------------------------------#
.downstream_rules:
rules:
@@ -26,7 +26,7 @@
.upstream_rules:
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB" && ($CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_PIPELINE_SOURCE == "merge_request_event")'
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB" && ($CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG || $CI_PIPELINE_SOURCE == "merge_request_event")'
when: on_success
- !reference [.downstream_rules, rules]
@@ -51,7 +51,7 @@ before_script:
# Supported Devices Build Target #
#-----------------------------------------------------------#
"Supported Devices":
image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-amd64
image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:trixie-amd64
tags:
- linux
- amd64
@@ -71,10 +71,10 @@ before_script:
- !reference [.upstream_rules, rules]
#-----------------------------------------------------------#
# OpenRGB Common Appimage Build Steps #
# OpenRGB Common AppImage Build Steps #
#-----------------------------------------------------------#
.hidden_appimage_script: &appimage_script_steps
image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-${TGT_ARCH}
image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:trixie-${TGT_ARCH}
tags:
- linux
- ${TGT_ARCH}
@@ -87,8 +87,6 @@ before_script:
name: "${CI_PROJECT_NAME}_Linux_${TGT_NAME}_${CI_COMMIT_SHORT_SHA}"
paths:
- OpenRGB-${TGT_PATH}.AppImage
- 60-openrgb.rules
- README.md
expire_in: 30 days
rules:
@@ -100,19 +98,19 @@ before_script:
"Linux i386 AppImage":
variables:
TGT_ARCH: "i386"
TGT_QT: ""
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}"
TGT_PATH: "${TGT_ARCH}"
<<: *appimage_script_steps
#-----------------------------------------------------------#
# Linux (AppImage) Qt6 i386 Build Target #
# Linux (AppImage) Qt5 i386 Build Target #
#-----------------------------------------------------------#
"Linux i386 AppImage Qt6":
"Linux i386 AppImage Qt5":
variables:
TGT_ARCH: "i386"
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}_${TGT_QT^}"
TGT_QT: ""
TGT_NAME: "${TGT_ARCH}_qt5"
TGT_PATH: "${TGT_ARCH}"
<<: *appimage_script_steps
@@ -122,7 +120,7 @@ before_script:
"Linux amd64 AppImage":
variables:
TGT_ARCH: "amd64"
TGT_QT: ""
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}"
TGT_PATH: "x86_64"
<<: *appimage_script_steps
@@ -137,13 +135,13 @@ before_script:
- "saas-linux-small-amd64"
#-----------------------------------------------------------#
# Linux (AppImage) Qt6 amd64 Build Target #
# Linux (AppImage) Qt5 amd64 Build Target #
#-----------------------------------------------------------#
"Linux amd64 AppImage Qt6":
"Linux amd64 AppImage Qt5":
variables:
TGT_ARCH: "amd64"
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}_${TGT_QT^}"
TGT_QT: ""
TGT_NAME: "${TGT_ARCH}_qt5"
TGT_PATH: "x86_64"
<<: *appimage_script_steps
@@ -153,19 +151,19 @@ before_script:
"Linux armhf AppImage":
variables:
TGT_ARCH: "armhf"
TGT_QT: ""
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}"
TGT_PATH: "${TGT_ARCH}"
<<: *appimage_script_steps
#-----------------------------------------------------------#
# Linux (AppImage) Qt6 armhf Build Target #
# Linux (AppImage) Qt5 armhf Build Target #
#-----------------------------------------------------------#
"Linux armhf AppImage Qt6":
"Linux armhf AppImage Qt5":
variables:
TGT_ARCH: "armhf"
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}_${TGT_QT^}"
TGT_QT: ""
TGT_NAME: "${TGT_ARCH}_qt5"
TGT_PATH: "${TGT_ARCH}"
<<: *appimage_script_steps
@@ -175,19 +173,19 @@ before_script:
"Linux arm64 AppImage":
variables:
TGT_ARCH: "arm64"
TGT_QT: ""
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}"
TGT_PATH: "${TGT_ARCH}"
<<: *appimage_script_steps
#-----------------------------------------------------------#
# Linux (AppImage) Qt6 arm64 Build Target #
# Linux (AppImage) Qt5 arm64 Build Target #
#-----------------------------------------------------------#
"Linux arm64 AppImage Qt6":
"Linux arm64 AppImage Qt5":
variables:
TGT_ARCH: "arm64"
TGT_QT: "qt6"
TGT_NAME: "${TGT_ARCH}_${TGT_QT^}"
TGT_QT: ""
TGT_NAME: "${TGT_ARCH}_qt5"
TGT_PATH: "${TGT_ARCH}"
<<: *appimage_script_steps
@@ -290,13 +288,16 @@ before_script:
<<: *debian_script_steps
#-----------------------------------------------------------#
# Linux (.rpm, F43) 64-bit Build Target #
# Linux (.rpm) Fedora 44 amd64 Build Target #
#-----------------------------------------------------------#
"Linux 64 F43 rpm":
image: fedora:43
"Linux amd64 .rpm (Fedora 44)":
image: fedora:44
stage: build
script:
- dnf install rpmdevtools dnf-plugins-core libcurl-devel qt5-qtbase-devel git -y
- dnf install rpmdevtools dnf-plugins-core libcurl-devel qt6-qtbase-devel git wget -y
- 'wget -O hidapi-hotplug.zip https://gitlab.com/OpenRGBDevelopers/hidapi-hotplug/-/jobs/artifacts/master/download?job=Linux+64+F43+rpm'
- unzip hidapi-hotplug.zip
- dnf install ./*.rpm -y
- rpmdev-setuptree
- ./scripts/build-package-files.sh fedora/OpenRGB.spec
- cp fedora/OpenRGB.spec /root/rpmbuild/SPECS
@@ -309,7 +310,7 @@ before_script:
- cd ${CI_PROJECT_DIR}
artifacts:
name: "${CI_PROJECT_NAME}_Linux_64_rpm_${CI_COMMIT_SHORT_SHA}"
name: "${CI_PROJECT_NAME}_Linux_amd64_rpm_${CI_COMMIT_SHORT_SHA}"
paths:
- openrgb*.rpm
expire_in: 30 days
@@ -317,6 +318,44 @@ before_script:
rules:
- !reference [.upstream_rules, rules]
#-----------------------------------------------------------#
# OpenRGB Common Flatpak Build Steps #
#-----------------------------------------------------------#
.hidden_flatpak_script: &flatpak_script_steps
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.10
stage: build
tags:
- linux
- ${TGT_ARCH}
script:
- flatpak-builder --user --disable-rofiles-fuse --repo=build/repo build/flatpak-build flatpak/org.openrgb.OpenRGB.yaml
- flatpak build-bundle build/repo org.openrgb.OpenRGB.flatpak org.openrgb.OpenRGB
artifacts:
name: "${CI_PROJECT_NAME}_Linux_${TGT_ARCH}_Flatpak_${CI_COMMIT_SHORT_SHA}"
paths:
- org.openrgb.OpenRGB.flatpak
expire_in: 30 days
rules:
- !reference [.upstream_rules, rules]
#-----------------------------------------------------------#
# Linux Flatpak amd64 Build Target #
#-----------------------------------------------------------#
"Linux amd64 Flatpak":
variables:
TGT_ARCH: "amd64"
<<: *flatpak_script_steps
#-----------------------------------------------------------#
# Linux Flatpak arm64 Build Target #
#-----------------------------------------------------------#
"Linux arm64 Flatpak":
variables:
TGT_ARCH: "arm64"
<<: *flatpak_script_steps
#-----------------------------------------------------------#
# Debian i386 Bookworm test #
#-----------------------------------------------------------#
@@ -324,10 +363,14 @@ before_script:
image: i386/debian:bookworm
stage: test
script:
- apt update
- DEBIAN_FRONTEND=noninteractive apt update
- DEBIAN_FRONTEND=noninteractive apt install -y unzip curl
- 'curl -o hidapi-hotplug.zip -L https://gitlab.com/OpenRGBDevelopers/hidapi-hotplug/-/jobs/artifacts/master/download?job=Linux+i386+.deb+%28Debian+Bookworm%29'
- unzip hidapi-hotplug.zip
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./libhidapi-hotplug*.deb
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*i386.deb
- openrgb --version
- apt remove -y openrgb
- DEBIAN_FRONTEND=noninteractive apt remove -y openrgb
dependencies:
- "Linux i386 .deb (Debian Bookworm)"
needs:
@@ -342,10 +385,14 @@ before_script:
image: amd64/debian:bookworm
stage: test
script:
- apt update
- DEBIAN_FRONTEND=noninteractive apt update
- DEBIAN_FRONTEND=noninteractive apt install -y unzip curl
- 'curl -o hidapi-hotplug.zip -L https://gitlab.com/OpenRGBDevelopers/hidapi-hotplug/-/jobs/artifacts/master/download?job=Linux+amd64+.deb+%28Debian+Bookworm%29'
- unzip hidapi-hotplug.zip
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./libhidapi-hotplug*.deb
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*amd64.deb
- openrgb --version
- apt remove -y openrgb
- DEBIAN_FRONTEND=noninteractive apt remove -y openrgb
dependencies:
- "Linux amd64 .deb (Debian Bookworm)"
needs:
@@ -360,10 +407,14 @@ before_script:
image: ubuntu:noble
stage: test
script:
- apt update
- DEBIAN_FRONTEND=noninteractive apt update
- DEBIAN_FRONTEND=noninteractive apt install -y unzip curl
- 'curl -o hidapi-hotplug.zip -L https://gitlab.com/OpenRGBDevelopers/hidapi-hotplug/-/jobs/artifacts/master/download?job=Linux+amd64+.deb+%28Debian+Bookworm%29'
- unzip hidapi-hotplug.zip
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./libhidapi-hotplug*.deb
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*amd64.deb
- openrgb --version
- apt remove -y openrgb
- DEBIAN_FRONTEND=noninteractive apt remove -y openrgb
dependencies:
- "Linux amd64 .deb (Debian Bookworm)"
needs:
@@ -372,19 +423,23 @@ before_script:
- !reference [.upstream_rules, rules]
#-----------------------------------------------------------#
# Fedora 64 v43 test #
# Fedora amd64 44 test #
#-----------------------------------------------------------#
"Fedora 64 v43":
image: fedora:43
"Fedora 64 44":
image: fedora:44
stage: test
script:
- dnf install unzip wget -y
- 'wget -O hidapi-hotplug.zip https://gitlab.com/OpenRGBDevelopers/hidapi-hotplug/-/jobs/artifacts/master/download?job=Linux+64+F43+rpm'
- unzip hidapi-hotplug.zip
- dnf install ./*.rpm -y
- dnf5 -y install ./openrgb*64.rpm
- openrgb --version
- dnf5 -y remove openrgb
dependencies:
- "Linux 64 F43 rpm"
- "Linux amd64 .rpm (Fedora 44)"
needs:
- "Linux 64 F43 rpm"
- "Linux amd64 .rpm (Fedora 44)"
rules:
- !reference [.upstream_rules, rules]
@@ -397,7 +452,7 @@ before_script:
stage: build
script:
- $ErrorActionPreference = "SilentlyContinue" ; Set-MpPreference -DisableRealtimeMonitoring $true ; $ErrorActionPreference = "Stop"
- scripts\build-windows.bat 5.15.0 2019 32
- scripts\build-windows.bat 6.8.3 2022 32
artifacts:
name: "${CI_PROJECT_NAME}_Windows_32_${CI_COMMIT_SHORT_SHA}"
paths:
@@ -410,17 +465,17 @@ before_script:
- !reference [.upstream_rules, rules]
#-----------------------------------------------------------#
# Windows (32-bit) Qt6 Build Target #
# Windows (32-bit) Qt5 Build Target #
#-----------------------------------------------------------#
"Windows 32 Qt6":
"Windows 32 Qt5":
extends:
- .shared_windows_runners
stage: build
script:
- $ErrorActionPreference = "SilentlyContinue" ; Set-MpPreference -DisableRealtimeMonitoring $true ; $ErrorActionPreference = "Stop"
- scripts\build-windows.bat 6.8.3 2022 32
- scripts\build-windows.bat 5.15.0 2019 32
artifacts:
name: "${CI_PROJECT_NAME}_Windows_32_Qt6_${CI_COMMIT_SHORT_SHA}"
name: "${CI_PROJECT_NAME}_Windows_32_Qt5_${CI_COMMIT_SHORT_SHA}"
paths:
- 'OpenRGB Windows 32-bit'
exclude:
@@ -439,7 +494,7 @@ before_script:
stage: build
script:
- $ErrorActionPreference = "SilentlyContinue" ; Set-MpPreference -DisableRealtimeMonitoring $true ; $ErrorActionPreference = "Stop"
- scripts\build-windows.bat 5.15.0 2019 64
- scripts\build-windows.bat 6.8.3 2022 64
artifacts:
name: "${CI_PROJECT_NAME}_Windows_64_${CI_COMMIT_SHORT_SHA}"
paths:
@@ -470,17 +525,17 @@ before_script:
- "saas-windows-medium-amd64"
#-----------------------------------------------------------#
# Windows (64-bit) Qt6 Build Target #
# Windows (64-bit) Qt5 Build Target #
#-----------------------------------------------------------#
"Windows 64 Qt6 Base":
"Windows 64 Qt5 Base":
extends:
- .shared_windows_runners
stage: build
script:
- $ErrorActionPreference = "SilentlyContinue" ; Set-MpPreference -DisableRealtimeMonitoring $true ; $ErrorActionPreference = "Stop"
- scripts\build-windows.bat 6.8.3 2022 64
- scripts\build-windows.bat 5.15.0 2019 64
artifacts:
name: "${CI_PROJECT_NAME}_Windows_64_Qt6_${CI_COMMIT_SHORT_SHA}"
name: "${CI_PROJECT_NAME}_Windows_64_Qt5_${CI_COMMIT_SHORT_SHA}"
paths:
- 'OpenRGB Windows 64-bit'
exclude:
@@ -491,13 +546,14 @@ before_script:
- if: $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_PIPELINE_SOURCE == "push"
when: never
"Windows 64 Qt6":
extends: "Windows 64 Qt6 Base"
"Windows 64 Qt5":
extends: "Windows 64 Qt5 Base"
rules:
- !reference [.upstream_rules, rules]
"Windows 64 Qt6 (Downstream)":
extends: "Windows 64 Qt6 Base"
"Windows 64 Qt5 (Downstream)":
extends: "Windows 64 Qt5 Base"
before_script:
- git clone https://gitlab.com/OpenRGBDevelopers/OpenRGB-Qt-Packages
- cd OpenRGB-Qt-Packages
@@ -516,7 +572,7 @@ before_script:
- macos
stage: build
script:
- ./scripts/build-macos.sh qt5 arm
- ./scripts/build-macos.sh qt6 arm
artifacts:
name: "${CI_PROJECT_NAME}_MacOS_ARM64_${CI_COMMIT_SHORT_SHA}"
@@ -527,15 +583,15 @@ before_script:
rules:
- !reference [.upstream_rules, rules]
"MacOS ARM64 Qt6":
"MacOS ARM64 Qt5":
tags:
- macos
stage: build
script:
- ./scripts/build-macos.sh qt6 arm
- ./scripts/build-macos.sh qt5 arm
artifacts:
name: "${CI_PROJECT_NAME}_MacOS_ARM64_Qt6_${CI_COMMIT_SHORT_SHA}"
name: "${CI_PROJECT_NAME}_MacOS_Qt5_ARM64_${CI_COMMIT_SHORT_SHA}"
paths:
- OpenRGB.app
expire_in: 30 days
@@ -548,7 +604,7 @@ before_script:
- macos
stage: build
script:
- ./scripts/build-macos.sh qt5 intel
- ./scripts/build-macos.sh qt6 intel
artifacts:
name: "${CI_PROJECT_NAME}_MacOS_Intel_${CI_COMMIT_SHORT_SHA}"
@@ -559,15 +615,15 @@ before_script:
rules:
- !reference [.upstream_rules, rules]
"MacOS Intel Qt6":
"MacOS Intel Qt5":
tags:
- macos
stage: build
script:
- ./scripts/build-macos.sh qt6 intel
- ./scripts/build-macos.sh qt5 intel
artifacts:
name: "${CI_PROJECT_NAME}_MacOS_Intel_Qt6_${CI_COMMIT_SHORT_SHA}"
name: "${CI_PROJECT_NAME}_MacOS_Intel_Qt5_${CI_COMMIT_SHORT_SHA}"
paths:
- OpenRGB.app
expire_in: 30 days
+158
View File
@@ -0,0 +1,158 @@
/*---------------------------------------------------------*\
| AutoStart-Flatpak.cpp |
| |
| Autostart implementation for Linux via Flatpak Portal |
| |
| Adam Honse <[email protected]> 04 Sep 2026 |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "AutoStart-Flatpak.h"
#include <gio/gio.h>
AutoStart::AutoStart(std::string name)
{
InitAutoStart(name);
}
void AutoStart::InitAutoStart(std::string name)
{
app_name = name;
}
bool AutoStart::CallBackgroundPortal(bool enable, const AutoStartInfo& autostart_info)
{
GError* error = nullptr;
GDBusConnection* connection = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, &error);
if(!connection)
{
if(error)
{
g_error_free(error);
}
return false;
}
/*-----------------------------------------------------*\
| FreeDesktop Background Portal parameters |
\*-----------------------------------------------------*/
const char* bus_name = "org.freedesktop.portal.Desktop";
const char* object_path = "/org/freedesktop/portal/desktop";
const char* interface_name = "org.freedesktop.portal.Background";
const char* method_name = "RequestBackground";
/*-----------------------------------------------------*\
| Build the options dictionary (vardict) required by |
| the Portal |
\*-----------------------------------------------------*/
GVariantBuilder options_builder;
g_variant_builder_init(&options_builder, G_VARIANT_TYPE_VARDICT);
/*-----------------------------------------------------*\
| Reason shown to the user in the system settings / |
| permission prompt |
\*-----------------------------------------------------*/
std::string reason_str = "Allow " + app_name + " to launch automatically at startup.";
g_variant_builder_add(&options_builder, "{sv}", "reason", g_variant_new_string(reason_str.c_str()));
/*-----------------------------------------------------*\
| Toggle the autostart feature state |
\*-----------------------------------------------------*/
g_variant_builder_add(&options_builder, "{sv}", "autostart", g_variant_new_boolean(enable));
if(enable)
{
/*-------------------------------------------------*\
| Pass command-line arguments to the background |
| request |
\*-------------------------------------------------*/
GVariantBuilder arg_builder;
g_variant_builder_init(&arg_builder, G_VARIANT_TYPE("as"));
/*-------------------------------------------------*\
| Add the primary executable path inside the |
| Flatpak sandbox |
\*-------------------------------------------------*/
g_variant_builder_add(&arg_builder, "s", GetExePath().c_str());
/*-------------------------------------------------*\
| Append any additional arguments provided by |
| OpenRGB's autostart config |
\*-------------------------------------------------*/
if(!autostart_info.args.empty())
{
g_variant_builder_add(&arg_builder, "s", autostart_info.args.c_str());
}
GVariant* commandline_args = g_variant_builder_end(&arg_builder);
g_variant_builder_add(&options_builder, "{sv}", "commandline", commandline_args);
}
/*-----------------------------------------------------*\
| An empty string window handle is used since this is a |
| background configuration request |
\*-----------------------------------------------------*/
const char* parent_window = "";
GVariant* options = g_variant_builder_end(&options_builder);
/*-----------------------------------------------------*\
| Bundle parameters: (s a{sv}) -> Parent window handle, |
| Options dictionary |
\*-----------------------------------------------------*/
GVariant* parameters = g_variant_new("(s@a{sv})", parent_window, options);
GVariant* reply;
reply = g_dbus_connection_call_sync(connection, bus_name, object_path, interface_name, method_name, parameters, G_VARIANT_TYPE("(o)"), G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &error);
g_object_unref(connection);
if(error)
{
g_error_free(error);
return false;
}
if(reply)
{
g_variant_unref(reply);
return true;
}
return false;
}
bool AutoStart::EnableAutoStart(AutoStartInfo autostart_info)
{
return CallBackgroundPortal(true, autostart_info);
}
bool AutoStart::DisableAutoStart()
{
return CallBackgroundPortal(false);
}
bool AutoStart::IsAutoStartEnabled()
{
/*-----------------------------------------------------*\
| The FreeDesktop Background Portal does not provide a |
| stateless status getter. Sandbox permissions are |
| securely managed and persisted internally by the |
| host's portal service. To implement a true state |
| track here, OpenRGB will need to manage a local |
| boolean flag inside its own configuration files (e.g. |
| OpenRGB.json). |
\*-----------------------------------------------------*/
return false;
}
std::string AutoStart::GetExePath()
{
/*-----------------------------------------------------*\
| Flatpak applications always run from this specific |
| exported path hierarchy |
\*-----------------------------------------------------*/
return "/app/bin/openrgb";
}
+31
View File
@@ -0,0 +1,31 @@
/*---------------------------------------------------------*\
| AutoStart-Flatpak.h |
| |
| Autostart implementation for Linux via Flatpak Portal |
| |
| Adam Honse <[email protected]> 04 Sep 2026 |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#pragma once
#include <string>
#include "AutoStart.h"
class AutoStart : public AutoStartInterface
{
public:
AutoStart(std::string name);
bool DisableAutoStart();
bool EnableAutoStart(AutoStartInfo autostart_info);
bool IsAutoStartEnabled();
std::string GetExePath();
private:
void InitAutoStart(std::string name);
bool CallBackgroundPortal(bool enable, const AutoStartInfo& autostart_info = {});
std::string app_name;
};
+81 -2
View File
@@ -119,6 +119,21 @@ bool AutoStart::IsAutoStartEnabled()
std::string AutoStart::GetExePath()
{
/*-----------------------------------------------------*\
| When running from an AppImage, the AppImage runtime |
| sets the APPIMAGE environment variable to the path of |
| the AppImage file itself. /proc/self/exe would |
| instead point at the extracted binary inside the |
| temporary squashfs mount, which disappears once the |
| AppImage is closed, so prefer APPIMAGE when it is set |
\*-----------------------------------------------------*/
const char* appimage_path = getenv("APPIMAGE");
if(appimage_path != NULL)
{
return(std::string(appimage_path));
}
/*-----------------------------------------------------*\
| Create the OpenRGB executable path |
\*-----------------------------------------------------*/
@@ -134,6 +149,64 @@ std::string AutoStart::GetExePath()
| Private Methods |
\*---------------------------------------------------------*/
/*---------------------------------------------------------*\
| Escape a single argument for use in a .desktop Exec= |
| field, per the Desktop Entry Specification. |
| |
| Reserved characters must be escaped by wrapping the whole |
| argument in double quotes and backslash-escaping the |
| quote/backquote/backslash/dollar characters, and any |
| literal '%' must be doubled to '%%'. |
\*---------------------------------------------------------*/
static std::string DesktopExecEscape(const std::string& arg)
{
static const std::string reserved = " \t\n\"'`\\><~|&;$*?#()%";
bool needs_quotes = false;
for(char c : arg)
{
if(reserved.find(c) != std::string::npos)
{
needs_quotes = true;
break;
}
}
std::string escaped;
if(needs_quotes)
{
escaped += '"';
}
for(char c : arg)
{
switch(c)
{
case '"':
case '`':
case '\\':
case '$':
escaped += '\\';
escaped += c;
break;
case '%':
escaped += "%%";
break;
default:
escaped += c;
break;
}
}
if(needs_quotes)
{
escaped += '"';
}
return(escaped);
}
std::string AutoStart::GenerateDesktopFile(AutoStartInfo autostart_info)
{
/*-----------------------------------------------------*\
@@ -154,11 +227,17 @@ std::string AutoStart::GenerateDesktopFile(AutoStartInfo autostart_info)
/*-----------------------------------------------------*\
| Add the executable path and arguments |
\*-----------------------------------------------------*/
fileContents << "Exec=" << autostart_info.path;
fileContents << "Exec=" << DesktopExecEscape(autostart_info.path);
if (autostart_info.args != "")
{
fileContents << " " << autostart_info.args;
std::istringstream arg_parser(autostart_info.args);
std::string arg;
while(arg_parser >> arg)
{
fileContents << " " << DesktopExecEscape(arg);
}
}
fileContents << std::endl;
+41 -2
View File
@@ -137,6 +137,43 @@ std::string AutoStart::GetExePath()
| Private Methods |
\*---------------------------------------------------------*/
/*---------------------------------------------------------*\
| Escape a string for embedding inside an XML element |
| (used by the .plist generator) to avoid producing |
| malformed property list files. |
\*---------------------------------------------------------*/
static std::string XmlEscape(const std::string& input)
{
std::string escaped;
for(char c : input)
{
switch(c)
{
case '&':
escaped += "&amp;";
break;
case '<':
escaped += "&lt;";
break;
case '>':
escaped += "&gt;";
break;
case '"':
escaped += "&quot;";
break;
case '\'':
escaped += "&apos;";
break;
default:
escaped += c;
break;
}
}
return(escaped);
}
std::string AutoStart::GenerateLaunchAgentFile(AutoStartInfo autostart_info)
{
/*-----------------------------------------------------*\
@@ -153,7 +190,8 @@ std::string AutoStart::GenerateLaunchAgentFile(AutoStartInfo autostart_info)
fileContents << " <string>org.openrgb</string>" << std::endl;
fileContents << " <key>ProgramArguments</key>" << std::endl;
fileContents << " <array>" << std::endl;
fileContents << " <string>" << autostart_info.path << "</string>" << std::endl;
fileContents << " <string>" << XmlEscape(autostart_info.path) << "</string>"
<< std::endl;
if(autostart_info.args != "")
{
@@ -162,7 +200,8 @@ std::string AutoStart::GenerateLaunchAgentFile(AutoStartInfo autostart_info)
while(arg_parser >> arg)
{
fileContents << " <string>" << arg << "</string>" << std::endl;
fileContents << " <string>" << XmlEscape(arg) << "</string>"
<< std::endl;
}
}
+34 -32
View File
@@ -12,6 +12,7 @@
#include <shlobj.h>
#include "AutoStart-Windows.h"
#include "LogManager.h"
#include "StringUtils.h"
#include "filesystem.h"
#include "windows.h"
@@ -71,11 +72,11 @@ bool AutoStart::EnableAutoStart(AutoStartInfo autostart_info)
HRESULT result;
IShellLinkW* shellLink = NULL;
std::wstring exepathw = utf8_decode(autostart_info.path);
std::wstring argumentsw = utf8_decode(autostart_info.args);
std::wstring startupfilepathw = utf8_decode(autostart_file);
std::wstring descriptionw = utf8_decode(autostart_info.desc);
std::wstring iconw = utf8_decode(autostart_info.path);
std::wstring exepathw = StringUtils::string_to_wstring(autostart_info.path);
std::wstring argumentsw = StringUtils::string_to_wstring(autostart_info.args);
std::wstring startupfilepathw = StringUtils::string_to_wstring(autostart_file);
std::wstring descriptionw = StringUtils::string_to_wstring(autostart_info.desc);
std::wstring iconw = StringUtils::string_to_wstring(autostart_info.path);
result = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_ALL, IID_IShellLinkW, (void**)&shellLink);
@@ -150,11 +151,16 @@ std::string AutoStart::GetExePath()
/*-----------------------------------------------------*\
| Create the OpenRGB executable path |
\*-----------------------------------------------------*/
char exepath[MAX_PATH] = "";
wchar_t exepath[MAX_PATH] = L"";
DWORD count = GetModuleFileNameA(NULL, exepath, MAX_PATH);
DWORD count = GetModuleFileNameW(NULL, exepath, MAX_PATH);
return(std::string(exepath, (count > 0) ? count : 0));
if(count == 0)
{
return(std::string());
}
return(StringUtils::wstring_to_string(std::wstring(exepath, count)));
}
/*---------------------------------------------------------*\
@@ -164,43 +170,39 @@ std::string AutoStart::GetExePath()
void AutoStart::InitAutoStart(std::string name)
{
char startMenuPath[MAX_PATH];
wchar_t startMenuPath[MAX_PATH];
autostart_name = name;
/*-----------------------------------------------------*\
| Get startup applications path |
\*-----------------------------------------------------*/
HRESULT result = SHGetFolderPathA(NULL, CSIDL_PROGRAMS, NULL, 0, startMenuPath);
HRESULT result = SHGetFolderPathW(NULL, CSIDL_PROGRAMS, NULL, 0, startMenuPath);
if(SUCCEEDED(result))
{
autostart_file = std::string(startMenuPath);
std::string autostart_dir = StringUtils::wstring_to_string(startMenuPath);
autostart_dir += "\\Startup\\";
autostart_file += "\\Startup\\" + autostart_name + ".lnk";
/*-------------------------------------------------*\
| Create the directory if it doesn't exist |
\*-------------------------------------------------*/
std::error_code ec;
bool success = true;
if(!filesystem::exists(autostart_dir))
{
success = filesystem::create_directories(autostart_dir, ec);
}
if(success)
{
autostart_file = autostart_dir + autostart_name + ".lnk";
}
}
else
{
autostart_file.clear();
}
}
/*---------------------------------------------------------*\
| Convert an UTF8 string to a wide Unicode String |
| (from wmi.cpp) |
\*---------------------------------------------------------*/
std::wstring AutoStart::utf8_decode(const std::string& str)
{
if(str.empty())
{
return std::wstring();
}
int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int) str.size(), nullptr, 0);
std::wstring wstrTo(size_needed, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], (int) str.size(), &wstrTo[0], size_needed);
return(wstrTo);
}
-1
View File
@@ -24,5 +24,4 @@ public:
private:
void InitAutoStart(std::string name);
std::wstring utf8_decode(const std::string& str);
};
+6
View File
@@ -40,9 +40,15 @@ protected:
#include "AutoStart-Windows.h"
#endif
#ifdef FLATPAK_BUILD
#include "AutoStart-Flatpak.h"
#endif
#ifdef __linux__
#ifndef FLATPAK_BUILD
#include "AutoStart-Linux.h"
#endif
#endif
#ifdef __APPLE__
#include "AutoStart-MacOS.h"
@@ -1,61 +0,0 @@
/*---------------------------------------------------------*\
| A4TechDetector.cpp |
| |
| Detector for A4Tech Devices |
| |
| Chris M (Dr_No) 30 Jun 2022 |
| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
/*-----------------------------------------------------*\
| OpenRGB includes |
\*-----------------------------------------------------*/
#include <hidapi.h>
#include "Detector.h"
/*-----------------------------------------------------*\
| A4 Tech specific includes |
\*-----------------------------------------------------*/
#include "RGBController_BloodyMouse.h"
#include "RGBController_BloodyB820R.h"
/*-----------------------------------------------------*\
| A4 Tech USB vendor ID |
\*-----------------------------------------------------*/
#define A4_TECH_VID 0x09DA
void DetectA4TechMouseControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
BloodyMouseController* controller = new BloodyMouseController(dev, info->path, info->product_id, name);
RGBController_BloodyMouse* rgb_controller = new RGBController_BloodyMouse(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
void DetectBloodyB820R(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
BloodyB820RController* controller = new BloodyB820RController(dev, info->path, name);
RGBController_BloodyB820R* rgb_controller = new RGBController_BloodyB820R(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
REGISTER_HID_DETECTOR_IPU("Bloody W60 Pro", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_W60_PRO_PID, 2, 0xFF33, 0x0529);
REGISTER_HID_DETECTOR_IPU("Bloody W70 Max", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_W70_MAX_PID, 2, 0xFF33, 0x0518);
REGISTER_HID_DETECTOR_IPU("Bloody W90 Max", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_W90_MAX_PID, 2, 0xFF33, 0x053D);
REGISTER_HID_DETECTOR_IPU("Bloody W90 Pro", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_W90_PRO_PID, 2, 0xFF33, 0x054D);
REGISTER_HID_DETECTOR_IPU("Bloody MP 50RS", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_MP_50RS_PID, 2, 0xFFF2, 0x6009);
REGISTER_HID_DETECTOR_IPU("Bloody B820R", DetectBloodyB820R, A4_TECH_VID, BLOODY_B820R_PID, 2, 0xFF52, 0x0210);
@@ -0,0 +1,40 @@
/*---------------------------------------------------------*\
| BloodyB820RControllerDetect.cpp |
| |
| Detector for Bloody B820R Devices |
| |
| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "BloodyB820RController.h"
#include "DetectionManager.h"
#include "RGBController_BloodyB820R.h"
/*---------------------------------------------------------*\
| A4 Tech USB vendor ID |
\*---------------------------------------------------------*/
#define A4_TECH_VID 0x09DA
DetectedControllers DetectBloodyB820R(hid_device_info* info, const std::string& name)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
BloodyB820RController* controller = new BloodyB820RController(dev, info->path, name);
RGBController_BloodyB820R* rgb_controller = new RGBController_BloodyB820R(controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("Bloody B820R", DetectBloodyB820R, A4_TECH_VID, BLOODY_B820R_PID, 2, 0xFF52, 0x0210);
@@ -173,6 +173,8 @@ RGBController_BloodyB820R::RGBController_BloodyB820R(BloodyB820RController *cont
RGBController_BloodyB820R::~RGBController_BloodyB820R()
{
Shutdown();
delete controller;
}
@@ -187,11 +189,7 @@ void RGBController_BloodyB820R::SetupZones()
KB_zone.leds_min = BLOODY_B820R_KEYCOUNT;
KB_zone.leds_max = BLOODY_B820R_KEYCOUNT;
KB_zone.leds_count = BLOODY_B820R_KEYCOUNT;
KB_zone.matrix_map = new matrix_map_type;
KB_zone.matrix_map->height = 6;
KB_zone.matrix_map->width = 21;
KB_zone.matrix_map->map = (unsigned int *)&matrix_map;
KB_zone.matrix_map.Set(6, 21, (unsigned int *)&matrix_map);
zones.push_back(KB_zone);
/*-------------------------------------------------*\
@@ -214,20 +212,12 @@ void RGBController_BloodyB820R::SetupZones()
SetupColors();
}
void RGBController_BloodyB820R::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_BloodyB820R::DeviceUpdateLEDs()
{
controller->SetLEDDirect(colors);
}
void RGBController_BloodyB820R::UpdateZoneLEDs(int zone)
void RGBController_BloodyB820R::DeviceUpdateZoneLEDs(int zone)
{
std::vector<RGBColor> colour;
@@ -239,7 +229,7 @@ void RGBController_BloodyB820R::UpdateZoneLEDs(int zone)
controller->SetLEDDirect(colour);
}
void RGBController_BloodyB820R::UpdateSingleLED(int led)
void RGBController_BloodyB820R::DeviceUpdateSingleLED(int led)
{
std::vector<RGBColor> colour;
colour.push_back(colors[led]);
@@ -22,11 +22,10 @@ public:
~RGBController_BloodyB820R();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -0,0 +1,44 @@
/*---------------------------------------------------------*\
| BloodyMouseControllerDetect.cpp |
| |
| Detector for Bloody Mouse Devices |
| |
| Chris M (Dr_No) 30 Jun 2022 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "BloodyMouseController.h"
#include "DetectionManager.h"
#include "RGBController_BloodyMouse.h"
/*---------------------------------------------------------*\
| A4 Tech USB vendor ID |
\*---------------------------------------------------------*/
#define A4_TECH_VID 0x09DA
DetectedControllers DetectBloodyMouseControllers(hid_device_info* info, const std::string& name)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
BloodyMouseController* controller = new BloodyMouseController(dev, info->path, info->product_id, name);
RGBController_BloodyMouse* rgb_controller = new RGBController_BloodyMouse(controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("Bloody W60 Pro", DetectBloodyMouseControllers, A4_TECH_VID, BLOODY_W60_PRO_PID, 2, 0xFF33, 0x0529);
REGISTER_HID_DETECTOR_IPU("Bloody W70 Max", DetectBloodyMouseControllers, A4_TECH_VID, BLOODY_W70_MAX_PID, 2, 0xFF33, 0x0518);
REGISTER_HID_DETECTOR_IPU("Bloody W90 Max", DetectBloodyMouseControllers, A4_TECH_VID, BLOODY_W90_MAX_PID, 2, 0xFF33, 0x053D);
REGISTER_HID_DETECTOR_IPU("Bloody W90 Pro", DetectBloodyMouseControllers, A4_TECH_VID, BLOODY_W90_PRO_PID, 2, 0xFF33, 0x054D);
REGISTER_HID_DETECTOR_IPU("Bloody MP 50RS", DetectBloodyMouseControllers, A4_TECH_VID, BLOODY_MP_50RS_PID, 2, 0xFFF2, 0x6009);
@@ -89,6 +89,8 @@ RGBController_BloodyMouse::RGBController_BloodyMouse(BloodyMouseController *cont
RGBController_BloodyMouse::~RGBController_BloodyMouse()
{
Shutdown();
delete controller;
}
@@ -134,7 +136,6 @@ void RGBController_BloodyMouse::SetupZones()
new_zone.leds_max = new_zone.leds_min;
new_zone.leds_count = new_zone.leds_min;
new_zone.type = bool_single ? ZONE_TYPE_SINGLE : ZONE_TYPE_LINEAR;
new_zone.matrix_map = NULL;
zones.push_back(new_zone);
for(unsigned int lp_idx = 0; lp_idx < zones[zone_idx].leds_count; lp_idx++)
@@ -160,13 +161,6 @@ void RGBController_BloodyMouse::SetupZones()
SetupColors();
}
void RGBController_BloodyMouse::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_BloodyMouse::DeviceUpdateLEDs()
{
std::vector<RGBColor> colour;
@@ -179,12 +173,12 @@ void RGBController_BloodyMouse::DeviceUpdateLEDs()
controller->SetLedsDirect(colour);
}
void RGBController_BloodyMouse::UpdateZoneLEDs(int /*zone*/)
void RGBController_BloodyMouse::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_BloodyMouse::UpdateSingleLED(int /*led*/)
void RGBController_BloodyMouse::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
@@ -30,11 +30,10 @@ public:
~RGBController_BloodyMouse();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -7,8 +7,8 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "AMBXController.h"
#include "DetectionManager.h"
#include "RGBController.h"
#include "RGBController_AMBX.h"
@@ -18,66 +18,60 @@
#include <libusb.h>
#endif
/******************************************************************************************\
* *
* DetectAMBXControllers *
* *
* Detect Philips amBX Gaming devices *
* *
\******************************************************************************************/
void DetectAMBXControllers()
DetectedControllers DetectAMBXControllers()
{
libusb_context* ctx = NULL;
DetectedControllers detected_controllers;
libusb_context* ctx = NULL;
if(libusb_init(&ctx) < 0)
if(libusb_init(&ctx) >= 0)
{
return;
}
libusb_device** devs;
ssize_t num_devs = libusb_get_device_list(ctx, &devs);
libusb_device** devs;
ssize_t num_devs = libusb_get_device_list(ctx, &devs);
if(num_devs <= 0)
{
libusb_exit(ctx);
return;
}
for(ssize_t i = 0; i < num_devs; i++)
{
libusb_device* dev = devs[i];
libusb_device_descriptor desc;
if(libusb_get_device_descriptor(dev, &desc) != 0)
if(num_devs > 0)
{
continue;
for(ssize_t i = 0; i < num_devs; i++)
{
libusb_device* dev = devs[i];
libusb_device_descriptor desc;
if(libusb_get_device_descriptor(dev, &desc) != 0)
{
continue;
}
if(desc.idVendor == AMBX_VID && desc.idProduct == AMBX_PID)
{
uint8_t bus = libusb_get_bus_number(dev);
uint8_t address = libusb_get_device_address(dev);
char device_path[32];
snprintf(device_path, sizeof(device_path), "%d-%d", bus, address);
// Use the AMBXController to handle opening and initializing
AMBXController* controller = new AMBXController(device_path);
if(controller->IsInitialized())
{
RGBController_AMBX* rgb_controller = new RGBController_AMBX(controller);
detected_controllers.push_back(rgb_controller);
}
else
{
delete controller;
}
}
}
libusb_free_device_list(devs, 1);
libusb_exit(ctx);
}
if(desc.idVendor == AMBX_VID && desc.idProduct == AMBX_PID)
else
{
uint8_t bus = libusb_get_bus_number(dev);
uint8_t address = libusb_get_device_address(dev);
char device_path[32];
snprintf(device_path, sizeof(device_path), "%d-%d", bus, address);
// Use the AMBXController to handle opening and initializing
AMBXController* controller = new AMBXController(device_path);
if(controller->IsInitialized())
{
RGBController_AMBX* rgb_controller = new RGBController_AMBX(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
else
{
delete controller;
}
libusb_exit(ctx);
}
}
libusb_free_device_list(devs, 1);
libusb_exit(ctx);
return(detected_controllers);
}
REGISTER_DETECTOR("Philips amBX", DetectAMBXControllers);
@@ -44,6 +44,8 @@ RGBController_AMBX::RGBController_AMBX(AMBXController* controller_ptr)
RGBController_AMBX::~RGBController_AMBX()
{
Shutdown();
delete controller;
}
@@ -56,7 +58,6 @@ void RGBController_AMBX::SetupZones()
side_lights_zone.leds_min = 2;
side_lights_zone.leds_max = 2;
side_lights_zone.leds_count = 2;
side_lights_zone.matrix_map = NULL;
zones.push_back(side_lights_zone);
zone wallwasher_zone;
@@ -65,7 +66,6 @@ void RGBController_AMBX::SetupZones()
wallwasher_zone.leds_min = 3;
wallwasher_zone.leds_max = 3;
wallwasher_zone.leds_count = 3;
wallwasher_zone.matrix_map = NULL;
zones.push_back(wallwasher_zone);
// Set up LEDs
@@ -97,11 +97,6 @@ void RGBController_AMBX::SetupZones()
SetupColors();
}
void RGBController_AMBX::ResizeZone(int /*zone*/, int /*new_size*/)
{
// This device does not support resizing zones
}
void RGBController_AMBX::DeviceUpdateLEDs()
{
if(!controller->IsInitialized())
@@ -121,7 +116,7 @@ void RGBController_AMBX::DeviceUpdateLEDs()
controller->SetLEDColors(led_values, led_colors, static_cast<unsigned int>(leds.size()));
}
void RGBController_AMBX::UpdateZoneLEDs(int zone)
void RGBController_AMBX::DeviceUpdateZoneLEDs(int zone)
{
if(!controller->IsInitialized())
{
@@ -156,7 +151,7 @@ void RGBController_AMBX::UpdateZoneLEDs(int zone)
controller->SetLEDColors(led_values, led_colors, zone_size);
}
void RGBController_AMBX::UpdateSingleLED(int led)
void RGBController_AMBX::DeviceUpdateSingleLED(int led)
{
if(!controller->IsInitialized())
{
@@ -19,11 +19,10 @@ public:
~RGBController_AMBX();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -10,8 +10,8 @@
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "Detector.h"
#include "AMDWraithPrismController.h"
#include "DetectionManager.h"
#include "RGBController_AMDWraithPrism.h"
/*---------------------------------------------------------*\
@@ -24,25 +24,22 @@
\*---------------------------------------------------------*/
#define AMD_WRAITH_PRISM_PID 0x0051
/******************************************************************************************\
* *
* DetectAMDWraithPrismControllers *
* *
* Tests the USB address to see if an AMD Wraith Prism controller exists there. *
* *
\******************************************************************************************/
void DetectAMDWraithPrismControllers(hid_device_info* info, const std::string&)
DetectedControllers DetectAMDWraithPrismControllers(hid_device_info* info, const std::string&)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AMDWraithPrismController* controller = new AMDWraithPrismController(dev, info->path);
RGBController_AMDWraithPrism* rgb_controller = new RGBController_AMDWraithPrism(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IP("AMD Wraith Prism", DetectAMDWraithPrismControllers, AMD_WRAITH_PRISM_VID, AMD_WRAITH_PRISM_PID, 1, 0xFF00);
@@ -132,6 +132,8 @@ RGBController_AMDWraithPrism::RGBController_AMDWraithPrism(AMDWraithPrismControl
RGBController_AMDWraithPrism::~RGBController_AMDWraithPrism()
{
Shutdown();
delete controller;
}
@@ -154,7 +156,6 @@ void RGBController_AMDWraithPrism::SetupZones()
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);
zone fan_zone;
@@ -163,7 +164,6 @@ void RGBController_AMDWraithPrism::SetupZones()
fan_zone.leds_min = 1;
fan_zone.leds_max = 1;
fan_zone.leds_count = 1;
fan_zone.matrix_map = NULL;
zones.push_back(fan_zone);
zone ring_zone;
@@ -172,7 +172,6 @@ void RGBController_AMDWraithPrism::SetupZones()
ring_zone.leds_min = 15;
ring_zone.leds_max = 15;
ring_zone.leds_count = 15;
ring_zone.matrix_map = NULL;
zones.push_back(ring_zone);
/*-----------------------------------------------------*\
@@ -205,13 +204,6 @@ void RGBController_AMDWraithPrism::SetupZones()
SetupColors();
}
void RGBController_AMDWraithPrism::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*-----------------------------------------------------*\
| This device does not support resizing zones |
\*-----------------------------------------------------*/
}
void RGBController_AMDWraithPrism::DeviceUpdateLEDs()
{
if(modes[active_mode].color_mode == MODE_COLORS_PER_LED)
@@ -271,12 +263,12 @@ void RGBController_AMDWraithPrism::DeviceUpdateLEDs()
}
}
void RGBController_AMDWraithPrism::UpdateZoneLEDs(int /*zone*/)
void RGBController_AMDWraithPrism::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AMDWraithPrism::UpdateSingleLED(int /*led*/)
void RGBController_AMDWraithPrism::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
@@ -22,11 +22,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -31,7 +31,7 @@ AOCKeyboardController::~AOCKeyboardController()
std::string AOCKeyboardController::GetDeviceLocation()
{
return("HID " + location);
return("HID: " + location);
}
std::string AOCKeyboardController::GetDeviceName()
@@ -9,36 +9,33 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "DetectionManager.h"
#include "AOCKeyboardController.h"
#include "RGBController_AOCKeyboard.h"
/*-----------------------------------------------------*\
| AOC Keyboard IDs |
\*-----------------------------------------------------*/
/*---------------------------------------------------------*\
| AOC Keyboard IDs |
\*---------------------------------------------------------*/
#define AOC_VID 0x3938
#define AOC_GK500_PID 0x1178
#define AOC_GK500_PID_2 0x1229
/******************************************************************************************\
* *
* DetectAOCKeyboardControllers *
* *
* Tests the USB address to see if an AOC Keyboard controller exists there. *
* *
\******************************************************************************************/
void DetectAOCKeyboardControllers(hid_device_info* info, const std::string& name)
DetectedControllers DetectAOCKeyboardControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AOCKeyboardController* controller = new AOCKeyboardController(dev, info->path, name);
RGBController_AOCKeyboard* rgb_controller = new RGBController_AOCKeyboard(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_PU("AOC GK500", DetectAOCKeyboardControllers, AOC_VID, AOC_GK500_PID, 0xFF19, 0xFF19);
@@ -257,35 +257,25 @@ RGBController_AOCKeyboard::RGBController_AOCKeyboard(AOCKeyboardController* cont
RGBController_AOCKeyboard::~RGBController_AOCKeyboard()
{
Shutdown();
delete controller;
}
void RGBController_AOCKeyboard::SetupZones()
{
KeyboardLayoutManager new_kb(KEYBOARD_LAYOUT_ANSI_QWERTY, KEYBOARD_SIZE_FULL, aoc_keyboard_offset_values);
/*---------------------------------------------------------*\
| Create the keyboard zone usiung Keyboard Layout Manager |
\*---------------------------------------------------------*/
zone new_zone;
new_zone.name = ZONE_EN_KEYBOARD;
new_zone.type = ZONE_TYPE_MATRIX;
KeyboardLayoutManager new_kb(KEYBOARD_LAYOUT_ANSI_QWERTY, KEYBOARD_SIZE_FULL, aoc_keyboard_offset_values);
matrix_map_type * new_map = new matrix_map_type;
new_zone.matrix_map = new_map;
new_zone.matrix_map->height = new_kb.GetRowCount();
new_zone.matrix_map->width = new_kb.GetColumnCount();
new_zone.matrix_map->map = new unsigned int[new_map->height * new_map->width];
new_zone.leds_count = new_kb.GetKeyCount();
new_zone.leds_min = new_zone.leds_count;
new_zone.leds_max = new_zone.leds_count;
/*---------------------------------------------------------*\
| Matrix map still uses declared zone rows and columns |
| as the packet structure depends on the matrix map |
\*---------------------------------------------------------*/
new_kb.GetKeyMap(new_map->map, KEYBOARD_MAP_FILL_TYPE_COUNT, new_map->height, new_map->width);
new_zone.name = ZONE_EN_KEYBOARD;
new_zone.type = ZONE_TYPE_MATRIX;
new_zone.leds_count = new_kb.GetKeyCount();
new_zone.leds_min = new_zone.leds_count;
new_zone.leds_max = new_zone.leds_count;
new_zone.matrix_map = new_kb.GetKeyMap(KEYBOARD_MAP_FILL_TYPE_COUNT);
/*---------------------------------------------------------*\
| Create LEDs for the Matrix zone |
@@ -305,13 +295,6 @@ void RGBController_AOCKeyboard::SetupZones()
SetupColors();
}
void RGBController_AOCKeyboard::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AOCKeyboard::DeviceUpdateLEDs()
{
if(modes[active_mode].value == AOC_KEYBOARD_MODE_CUSTOM)
@@ -331,12 +314,12 @@ void RGBController_AOCKeyboard::DeviceUpdateLEDs()
}
}
void RGBController_AOCKeyboard::UpdateZoneLEDs(int /*zone*/)
void RGBController_AOCKeyboard::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AOCKeyboard::UpdateSingleLED(int /*led*/)
void RGBController_AOCKeyboard::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
@@ -22,11 +22,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -27,7 +27,7 @@ AOCMouseController::~AOCMouseController()
std::string AOCMouseController::GetDeviceLocation()
{
return("HID " + location);
return("HID: " + location);
}
std::string AOCMouseController::GetDeviceName()
@@ -9,35 +9,32 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "DetectionManager.h"
#include "AOCMouseController.h"
#include "RGBController_AOCMouse.h"
/*-----------------------------------------------------*\
| AOC Mouse IDs |
\*-----------------------------------------------------*/
/*---------------------------------------------------------*\
| AOC Mouse 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)
DetectedControllers DetectAOCMouseControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AOCMouseController* controller = new AOCMouseController(dev, info->path, name);
RGBController_AOCMouse* rgb_controller = new RGBController_AOCMouse(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("AOC GM500", DetectAOCMouseControllers, AOC_VID, AOC_GM500_PID, 1, 0xFF19, 0xFF19);
@@ -123,6 +123,8 @@ RGBController_AOCMouse::RGBController_AOCMouse(AOCMouseController* controller_pt
RGBController_AOCMouse::~RGBController_AOCMouse()
{
Shutdown();
delete controller;
}
@@ -134,7 +136,6 @@ void RGBController_AOCMouse::SetupZones()
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;
@@ -147,7 +148,6 @@ void RGBController_AOCMouse::SetupZones()
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;
@@ -157,24 +157,17 @@ void RGBController_AOCMouse::SetupZones()
SetupColors();
}
void RGBController_AOCMouse::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AOCMouse::DeviceUpdateLEDs()
{
DeviceUpdateMode();
}
void RGBController_AOCMouse::UpdateZoneLEDs(int /*zone*/)
void RGBController_AOCMouse::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AOCMouse::UpdateSingleLED(int /*led*/)
void RGBController_AOCMouse::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
@@ -22,11 +22,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -27,7 +27,7 @@ AOCMousematController::~AOCMousematController()
std::string AOCMousematController::GetDeviceLocation()
{
return("HID " + location);
return("HID: " + location);
}
std::string AOCMousematController::GetDeviceName()
@@ -9,35 +9,32 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "DetectionManager.h"
#include "AOCMousematController.h"
#include "RGBController_AOCMousemat.h"
/*-----------------------------------------------------*\
| AOC Mousemat IDs |
\*-----------------------------------------------------*/
/*---------------------------------------------------------*\
| AOC Mousemat IDs |
\*---------------------------------------------------------*/
#define AOC_VID 0x3938
#define AOC_AMM700_PID 0x1162
/******************************************************************************************\
* *
* DetectAOCMousematControllers *
* *
* Tests the USB address to see if an AOC Mousemat controller exists there. *
* *
\******************************************************************************************/
void DetectAOCMousematControllers(hid_device_info* info, const std::string& name)
DetectedControllers DetectAOCMousematControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AOCMousematController* controller = new AOCMousematController(dev, info->path, name);
RGBController_AOCMousemat* rgb_controller = new RGBController_AOCMousemat(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("AOC AGON AMM700", DetectAOCMousematControllers, AOC_VID, AOC_AMM700_PID, 1, 0xFF19, 0xFF19);
@@ -113,6 +113,8 @@ RGBController_AOCMousemat::RGBController_AOCMousemat(AOCMousematController* cont
RGBController_AOCMousemat::~RGBController_AOCMousemat()
{
Shutdown();
delete controller;
}
@@ -124,7 +126,6 @@ void RGBController_AOCMousemat::SetupZones()
mousemat_zone.leds_min = 1;
mousemat_zone.leds_max = 1;
mousemat_zone.leds_count = 1;
mousemat_zone.matrix_map = NULL;
zones.push_back(mousemat_zone);
led mousemat_led;
@@ -134,24 +135,17 @@ void RGBController_AOCMousemat::SetupZones()
SetupColors();
}
void RGBController_AOCMousemat::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AOCMousemat::DeviceUpdateLEDs()
{
DeviceUpdateMode();
}
void RGBController_AOCMousemat::UpdateZoneLEDs(int /*zone*/)
void RGBController_AOCMousemat::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AOCMousemat::UpdateSingleLED(int /*led*/)
void RGBController_AOCMousemat::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
@@ -22,11 +22,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -11,12 +11,12 @@
\*---------------------------------------------------------*/
#include <cstring>
#include "RGBController.h"
#include "ResourceManager.h"
#include "SettingsManager.h"
#include "StringUtils.h"
#include "ASRockPolychromeUSBController.h"
#include "dmiinfo.h"
#include "ResourceManager.h"
#include "RGBController.h"
#include "SettingsManager.h"
#include "StringUtils.h"
#define POLYCHROME_USB_READ_ZONE_CONFIG 0x11
#define POLYCHROME_USB_READ_HEADER 0x14
@@ -191,7 +191,7 @@ void PolychromeUSBController::SetDeviceInfo()
WriteRGSwap(rgswap_final[0], rgswap_final[1], rgswap_final[2], rgswap_final[3], rgswap_final[4], rgswap_final[5], rgswap_final[6], rgswap_final[7]);
}
void PolychromeUSBController::ResizeZone(int zone, int new_size)
void PolychromeUSBController::SetZoneSize(int zone, int new_size)
{
unsigned char zonecfg[POLYCHROME_USB_ZONE_MAX_NUM];
@@ -135,7 +135,7 @@ public:
unsigned int configsize
);
void ResizeZone(int zone, int new_size);
void SetZoneSize(int zone, int new_size);
void SetRGSwap(bool reset);
protected:
@@ -11,8 +11,8 @@
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "Detector.h"
#include "ASRockPolychromeUSBController.h"
#include "DetectionManager.h"
#include "RGBController_ASRockPolychromeUSB.h"
/*---------------------------------------------------------*\
@@ -26,16 +26,22 @@
#define ASROCK_MOTHERBOARD_1_PID 0x01A2
#define ASROCK_DESKMINI_ADDRESSABLE_LED_STRIP_PID 0x01A6
void DetectPolychromeUSBControllers(hid_device_info* info, const std::string& /*name*/)
DetectedControllers DetectPolychromeUSBControllers(hid_device_info* info, const std::string& /*name*/)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
PolychromeUSBController* controller = new PolychromeUSBController(dev, info->path);
RGBController_PolychromeUSB* rgb_controller = new RGBController_PolychromeUSB(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR("ASRock Polychrome USB", DetectPolychromeUSBControllers, ASROCK_VID, ASROCK_MOTHERBOARD_1_PID);
@@ -185,8 +185,25 @@ RGBController_PolychromeUSB::RGBController_PolychromeUSB(PolychromeUSBController
SetupZones();
}
RGBController_PolychromeUSB::~RGBController_PolychromeUSB()
{
Shutdown();
delete controller;
}
void RGBController_PolychromeUSB::SetupZones()
{
/*-----------------------------------------------------*\
| Only set LED count on the first run |
\*-----------------------------------------------------*/
bool first_run = false;
if(zones.size() == 0)
{
first_run = true;
}
/*-------------------------------------------------*\
| Clear any existing color/LED configuration |
\*-------------------------------------------------*/
@@ -197,40 +214,65 @@ void RGBController_PolychromeUSB::SetupZones()
/*-------------------------------------------------*\
| Set zones and leds |
\*-------------------------------------------------*/
for(unsigned int channel_idx = 0; channel_idx < zones.size(); channel_idx++)
for(std::size_t channel_idx = 0; channel_idx < zones.size(); channel_idx++)
{
PolychromeDeviceInfo device_info = controller->GetPolychromeDevices()[channel_idx];
zones[channel_idx].type = ZONE_TYPE_LINEAR;
if(device_info.device_type== PolychromeDeviceType::ADDRESSABLE)
{
zones[channel_idx].name = polychrome_USB_zone_names[device_info.zone_type];
zones[channel_idx].leds_min = 0;
zones[channel_idx].leds_max = ASROCK_ADDRESSABLE_MAX_LEDS;
zones[channel_idx].leds_count = device_info.num_leds;
zones[channel_idx].leds_min = 0;
zones[channel_idx].leds_max = ASROCK_ADDRESSABLE_MAX_LEDS;
if(first_run)
{
zones[channel_idx].flags = ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE
| ZONE_FLAG_MANUALLY_CONFIGURABLE_NAME
| ZONE_FLAG_MANUALLY_CONFIGURABLE_TYPE
| ZONE_FLAG_MANUALLY_CONFIGURABLE_MATRIX_MAP
| ZONE_FLAG_MANUALLY_CONFIGURABLE_SEGMENTS;
}
if(!(zones[channel_idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_NAME))
{
zones[channel_idx].name = polychrome_USB_zone_names[device_info.zone_type];
}
if(!(zones[channel_idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_SIZE))
{
zones[channel_idx].leds_count = device_info.num_leds;
}
if(!(zones[channel_idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE))
{
zones[channel_idx].type = ZONE_TYPE_LINEAR;
}
if(!(zones[channel_idx].flags & ZONE_FLAG_MANUALLY_CONFIGURED_MATRIX_MAP))
{
zones[channel_idx].matrix_map.width = 0;
zones[channel_idx].matrix_map.height = 0;
zones[channel_idx].matrix_map.map.resize(0);
}
}
else if(device_info.device_type==PolychromeDeviceType::FIXED)
{
zones[channel_idx].name = polychrome_USB_zone_names[device_info.zone_type];
zones[channel_idx].leds_min = device_info.num_leds;
zones[channel_idx].leds_max = device_info.num_leds;
zones[channel_idx].leds_count = device_info.num_leds;
zones[channel_idx].name = polychrome_USB_zone_names[device_info.zone_type];
zones[channel_idx].type = ZONE_TYPE_LINEAR;
zones[channel_idx].leds_min = device_info.num_leds;
zones[channel_idx].leds_max = device_info.num_leds;
zones[channel_idx].leds_count = device_info.num_leds;
}
for(unsigned int led_ch_idx = 0; led_ch_idx < zones[channel_idx].leds_count; led_ch_idx++)
{
led new_led;
new_led.name = zones[channel_idx].name;
new_led.name.append(", LED ");
new_led.name.append(std::to_string(led_ch_idx + 1));
new_led.value = channel_idx;
new_led.value = (unsigned int)channel_idx;
leds.push_back(new_led);
}
zones[channel_idx].matrix_map = NULL;
}
SetupColors();
@@ -273,10 +315,14 @@ void RGBController_PolychromeUSB::SetupZones()
}
}
void RGBController_PolychromeUSB::ResizeZone(int zone, int new_size)
void RGBController_PolychromeUSB::DeviceConfigureZone(int zone_idx)
{
zones[zone].leds_count = (unsigned char) new_size;
controller->ResizeZone(zones_info[zone].zone, new_size);
if((size_t)zone_idx < zones.size())
{
controller->SetZoneSize(zones_info[zone_idx].zone, zones[zone_idx].leds_count);
SetupZones();
}
}
void RGBController_PolychromeUSB::DeviceUpdateLEDs()
@@ -288,9 +334,14 @@ void RGBController_PolychromeUSB::DeviceUpdateLEDs()
}
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
if(zones[zone_idx].leds_count == 0)
{
continue;
}
unsigned char set_mode = zones_info[zone_idx].mode;
if (set_mode>modes.size())
if(set_mode>modes.size())
{
set_mode = active_mode;
}
@@ -299,8 +350,13 @@ void RGBController_PolychromeUSB::DeviceUpdateLEDs()
}
}
void RGBController_PolychromeUSB::UpdateZoneLEDs(int zone)
void RGBController_PolychromeUSB::DeviceUpdateZoneLEDs(int zone)
{
if(zones[zone].leds_count == 0)
{
return;
}
unsigned char set_mode=zones_info[zone].mode;
if(set_mode > modes.size())
@@ -308,20 +364,25 @@ void RGBController_PolychromeUSB::UpdateZoneLEDs(int zone)
set_mode = active_mode;
}
controller->WriteZone(zone, set_mode, zones_info[zone].speed, zones[zone].colors[0], false);
controller->WriteZone((unsigned char)zone, set_mode, zones_info[zone].speed, zones[zone].colors[0], false);
}
void RGBController_PolychromeUSB::UpdateSingleLED(int led)
void RGBController_PolychromeUSB::DeviceUpdateSingleLED(int led)
{
unsigned int channel = leds[led].value;
unsigned char set_mode = zones_info[channel].mode;
if(zones[channel].leds_count == 0)
{
return;
}
if(set_mode > modes.size())
{
set_mode = active_mode;
}
controller->WriteZone(channel, set_mode, zones_info[channel].speed, zones[channel].colors[0], false);
controller->WriteZone((unsigned char)channel, set_mode, zones_info[channel].speed, zones[channel].colors[0], false);
}
unsigned char RGBController_PolychromeUSB::GetDeviceMode(unsigned char zone)
@@ -19,14 +19,15 @@ class RGBController_PolychromeUSB : public RGBController
{
public:
RGBController_PolychromeUSB(PolychromeUSBController* controller_ptr);
~RGBController_PolychromeUSB();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceConfigureZone(int zone_idx);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -36,7 +36,7 @@ ASRockASRRGBSMBusController::~ASRockASRRGBSMBusController()
std::string ASRockASRRGBSMBusController::GetDeviceLocation()
{
std::string return_string(bus->device_name);
std::string return_string(bus->info.device_name);
char addr[5];
snprintf(addr, 5, "0x%02X", dev);
return_string.append(", address ");
@@ -113,6 +113,8 @@ RGBController_ASRockASRRGBSMBus::RGBController_ASRockASRRGBSMBus(ASRockASRRGBSMB
RGBController_ASRockASRRGBSMBus::~RGBController_ASRockASRRGBSMBus()
{
Shutdown();
delete controller;
}
@@ -135,7 +137,6 @@ void RGBController_ASRockASRRGBSMBus::SetupZones()
new_zone->leds_min = 1;
new_zone->leds_max = 1;
new_zone->leds_count = 1;
new_zone->matrix_map = NULL;
/*---------------------------------------------------------*\
| Push new zone to zones vector |
@@ -160,27 +161,20 @@ void RGBController_ASRockASRRGBSMBus::SetupZones()
SetupColors();
}
void RGBController_ASRockASRRGBSMBus::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_ASRockASRRGBSMBus::DeviceUpdateLEDs()
{
for(unsigned int led = 0; led < colors.size(); led++)
{
UpdateSingleLED(led);
DeviceUpdateSingleLED(led);
}
}
void RGBController_ASRockASRRGBSMBus::UpdateZoneLEDs(int /*zone*/)
void RGBController_ASRockASRRGBSMBus::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_ASRockASRRGBSMBus::UpdateSingleLED(int led)
void RGBController_ASRockASRRGBSMBus::DeviceUpdateSingleLED(int led)
{
unsigned char red = RGBGetRValue(colors[led]);
unsigned char grn = RGBGetGValue(colors[led]);
@@ -22,11 +22,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -0,0 +1,199 @@
/*---------------------------------------------------------*\
| ASRockGPUSMBusController.cpp |
| |
| Driver for ASRock GPU RGB controllers |
| |
| Based on SignalRGB ASRock GPU.js plugin |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "ASRockGPUSMBusController.h"
#include "LogManager.h"
#include <chrono>
#include <cstdio>
#include <cstring>
#include <thread>
using namespace std::chrono_literals;
ASRockGPUSMBusController::ASRockGPUSMBusController(i2c_smbus_interface* bus, asrock_gpu_dev_id dev, std::string name)
{
this->bus = bus;
this->dev = dev;
this->device_name = name;
this->num_channels = 0;
memset(enabled_channels, 0, sizeof(enabled_channels));
memset(led_counts, 0, sizeof(led_counts));
}
ASRockGPUSMBusController::~ASRockGPUSMBusController()
{
}
std::string ASRockGPUSMBusController::GetDeviceLocation()
{
std::string return_string(bus->info.device_name);
char addr[5];
snprintf(addr, 5, "0x%02X", dev);
return_string.append(", address ");
return_string.append(addr);
return("I2C: " + return_string);
}
std::string ASRockGPUSMBusController::GetDeviceName()
{
return(device_name);
}
bool ASRockGPUSMBusController::WriteBlock(uint8_t command, uint8_t subcommand, const uint8_t* data, uint8_t len)
{
/*-----------------------------------------------------*\
| SignalRGB packet format |
| [command, 0, subcommand, data...] |
| Uses pure I2C rather than SMBus |
\*-----------------------------------------------------*/
uint8_t packet[12];
memset(packet, 0, sizeof(packet));
packet[0] = command;
packet[1] = 0x00;
packet[2] = subcommand;
if(data != nullptr && len > 0)
{
uint8_t copy_len = (len > 9) ? 9 : len;
memcpy(&packet[3], data, copy_len);
}
int size = 12;
int result = bus->i2c_write_block(dev, size, packet);
if(result < 0)
{
LOG_DEBUG("[ASRock GPU] Write block failed: %d", result);
return(false);
}
return(true);
}
bool ASRockGPUSMBusController::ReadBlock(uint8_t* response, uint8_t len)
{
memset(response, 0, len);
int size = len;
int result = bus->i2c_read_block(dev, &size, response);
if(result < 0)
{
LOG_DEBUG("[ASRock GPU] Read block failed: %d", result);
return(false);
}
return(true);
}
bool ASRockGPUSMBusController::DetectChannels()
{
/*-----------------------------------------------------*\
| Get enabled channels |
| Command 0x14, subcommand 0x01 |
\*-----------------------------------------------------*/
if(!WriteBlock(0x14, 0x01, nullptr, 0))
{
LOG_WARNING("[ASRock GPU] Failed to request enabled channels");
return(false);
}
std::this_thread::sleep_for(20ms);
uint8_t response[I2C_SMBUS_BLOCK_MAX];
if(!ReadBlock(response, sizeof(response)))
{
LOG_WARNING("[ASRock GPU] Failed to read enabled channels");
return(false);
}
LOG_TRACE("[ASRock GPU] Enabled channels response: %02X %02X %02X %02X %02X %02X", response[0], response[1], response[2], response[3], response[4], response[5]);
/*-----------------------------------------------------*\
| Response format |
| Bytes 4-5 contain the channel bitmap |
\*-----------------------------------------------------*/
uint16_t channel_bits = response[4] | (response[5] << 8);
LOG_TRACE("[ASRock GPU] Channel bits: 0x%04X", channel_bits);
/*-----------------------------------------------------*\
| Get LED counts |
| Command 0x14, subcommand 0x02 |
\*-----------------------------------------------------*/
if(!WriteBlock(0x14, 0x02, nullptr, 0))
{
LOG_WARNING("[ASRock GPU] Failed to request LED counts");
return(false);
}
std::this_thread::sleep_for(20ms);
if(!ReadBlock(response, sizeof(response)))
{
LOG_WARNING("[ASRock GPU] Failed to read LED counts");
return(false);
}
num_channels = 0;
for(int i = 0; i < 16; i++)
{
if(channel_bits & (1 << i))
{
enabled_channels[num_channels] = i;
led_counts[num_channels] = response[4 + i];
const char* name = "Unknown";
if(i == ASROCK_GPU_CHANNEL_ARGB_HEADER)
{
name = "ARGB Header";
}
else if(i == ASROCK_GPU_CHANNEL_TOP_SIDE)
{
name = "Top Side";
}
else if(i == ASROCK_GPU_CHANNEL_FAN)
{
name = "Fan";
}
LOG_DEBUG("[ASRock GPU] Channel %d (%s) active with %d LEDs", i, name, response[4 + i]);
num_channels++;
}
}
LOG_DEBUG("[ASRock GPU] Found %d active channels", num_channels);
return(num_channels > 0);
}
void ASRockGPUSMBusController::SetChannelColor(uint8_t channel_idx, uint8_t red, uint8_t green, uint8_t blue)
{
/*-----------------------------------------------------*\
| SignalRGB color packet |
| Command 0x10, subcommand is the channel index |
\*-----------------------------------------------------*/
uint8_t data[8] =
{
0x01, // Mode: direct/static
red,
green,
blue,
0x80, // Brightness
0xFF, // Effect speed
0x00, // Effect direction
0x1A // Unknown constant
};
if(!WriteBlock(0x10, channel_idx, data, sizeof(data)))
{
LOG_WARNING("[ASRock GPU] Failed to set color for channel %d", channel_idx);
}
}
@@ -0,0 +1,55 @@
/*---------------------------------------------------------*\
| ASRockGPUSMBusController.h |
| |
| Driver for ASRock GPU RGB controllers |
| |
| Based on SignalRGB ASRock GPU.js plugin |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#pragma once
#include <string>
#include "i2c_smbus.h"
typedef uint8_t asrock_gpu_dev_id;
#define ASROCK_GPU_CONTROLLER_NAME "ASRock GPU SMBus Controller"
#define ASROCK_GPU_SMBUS_ADDRESS 0x36
/*-----------------------------------------------------*\
| ASRock GPU Channel Names (from SignalRGB) |
\*-----------------------------------------------------*/
enum
{
ASROCK_GPU_CHANNEL_ARGB_HEADER = 3,
ASROCK_GPU_CHANNEL_TOP_SIDE = 6,
ASROCK_GPU_CHANNEL_FAN = 7,
};
class ASRockGPUSMBusController
{
public:
ASRockGPUSMBusController(i2c_smbus_interface* bus, asrock_gpu_dev_id dev, std::string name);
~ASRockGPUSMBusController();
std::string GetDeviceLocation();
std::string GetDeviceName();
void SetChannelColor(uint8_t channel_idx, uint8_t red, uint8_t green, uint8_t blue);
bool DetectChannels();
uint8_t enabled_channels[16];
uint8_t led_counts[16];
uint8_t num_channels;
private:
i2c_smbus_interface* bus;
asrock_gpu_dev_id dev;
std::string device_name;
bool WriteBlock(uint8_t command, uint8_t subcommand, const uint8_t* data, uint8_t len);
bool ReadBlock(uint8_t* response, uint8_t len);
};
@@ -0,0 +1,46 @@
/*---------------------------------------------------------*\
| ASRockGPUSMBusControllerDetect.cpp |
| |
| Detector for ASRock GPU RGB controllers |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "DetectionManager.h"
#include "ASRockGPUSMBusController.h"
#include "LogManager.h"
#include "RGBController_ASRockGPUSMBus.h"
#include "i2c_amd_gpu.h"
#include "i2c_smbus.h"
#include "pci_ids.h"
DetectedControllers DetectASRockGPUSMBusControllers(i2c_smbus_interface* bus, uint8_t address, const std::string& name)
{
DetectedControllers detected_controllers;
if(bus->info.pci_vendor == AMD_GPU_VEN && !is_amd_gpu_i2c_bus(bus))
{
return(detected_controllers);
}
LOG_DEBUG("[ASRock GPU] Checking GPU I2C bus for RGB controller at 0x%02X", address);
ASRockGPUSMBusController* controller = new ASRockGPUSMBusController(bus, address, name);
if(controller->DetectChannels())
{
detected_controllers.push_back(new RGBController_ASRockGPUSMBus(controller));
}
else
{
LOG_WARNING("[ASRock GPU] No active channels found, device not registered");
delete controller;
}
return(detected_controllers);
}
REGISTER_I2C_PCI_DETECTOR("ASRock Radeon RX 9070 XT Steel Legend", DetectASRockGPUSMBusControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, ASROCK_SUB_VEN, 0x5403, ASROCK_GPU_SMBUS_ADDRESS);
REGISTER_I2C_PCI_DETECTOR("ASRock Radeon RX 9070 XT Taichi 16GB OC", DetectASRockGPUSMBusControllers, AMD_GPU_VEN, AMD_NAVI48_DEV, ASROCK_SUB_VEN, 0x5401, ASROCK_GPU_SMBUS_ADDRESS);
REGISTER_I2C_PCI_DETECTOR("ASRock Radeon RX 9060 XT Steel Legend", DetectASRockGPUSMBusControllers, AMD_GPU_VEN, AMD_NAVI44_DEV, ASROCK_SUB_VEN, 0x5407, ASROCK_GPU_SMBUS_ADDRESS);
@@ -0,0 +1,138 @@
/*---------------------------------------------------------*\
| RGBController_ASRockGPUSMBus.cpp |
| |
| RGBController for ASRock GPU RGB controllers |
| |
| Based on SignalRGB ASRock GPU.js plugin |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "RGBController_ASRockGPUSMBus.h"
/**------------------------------------------------------------------*\
@name ASRock GPU SMBus
@category GPU
@type I2C
@save :x:
@direct :white_check_mark:
@effects :x:
@detectors DetectASRockGPUSMBusControllers
@comment
\*-------------------------------------------------------------------*/
RGBController_ASRockGPUSMBus::RGBController_ASRockGPUSMBus(ASRockGPUSMBusController* controller_ptr)
{
controller = controller_ptr;
name = controller->GetDeviceName();
vendor = "ASRock";
type = DEVICE_TYPE_GPU;
description = "ASRock GPU RGB Controller";
location = controller->GetDeviceLocation();
mode Direct;
Direct.name = "Direct";
Direct.value = 0;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
SetupZones();
}
RGBController_ASRockGPUSMBus::~RGBController_ASRockGPUSMBus()
{
delete controller;
}
void RGBController_ASRockGPUSMBus::SetupZones()
{
/*-----------------------------------------------------*\
| Set up zones - one zone per channel |
\*-----------------------------------------------------*/
for(unsigned int i = 0; i < controller->num_channels; i++)
{
uint8_t channel_idx = controller->enabled_channels[i];
zone new_zone;
new_zone.type = ZONE_TYPE_SINGLE;
new_zone.leds_min = 1;
new_zone.leds_max = 1;
new_zone.leds_count = 1;
/*-----------------------------------------------------*\
| Channel names from SignalRGB |
\*-----------------------------------------------------*/
if(channel_idx == ASROCK_GPU_CHANNEL_ARGB_HEADER)
{
new_zone.name = "ARGB Header";
}
else if(channel_idx == ASROCK_GPU_CHANNEL_TOP_SIDE)
{
new_zone.name = "Top Side";
}
else if(channel_idx == ASROCK_GPU_CHANNEL_FAN)
{
new_zone.name = "Fan";
}
else
{
new_zone.name = "Channel " + std::to_string(channel_idx);
}
zones.push_back(new_zone);
/*-----------------------------------------------------*\
| Set up LED for this zone |
\*-----------------------------------------------------*/
led new_led;
new_led.name = new_zone.name;
leds.push_back(new_led);
}
SetupColors();
}
void RGBController_ASRockGPUSMBus::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*-----------------------------------------------------*\
| This device does not support resizing zones |
\*-----------------------------------------------------*/
}
void RGBController_ASRockGPUSMBus::DeviceUpdateLEDs()
{
for(unsigned int i = 0; i < controller->num_channels; i++)
{
uint8_t channel_idx = controller->enabled_channels[i];
RGBColor color = colors[i];
controller->SetChannelColor(channel_idx,
RGBGetRValue(color),
RGBGetGValue(color),
RGBGetBValue(color));
}
}
void RGBController_ASRockGPUSMBus::UpdateZoneLEDs(int zone)
{
uint8_t channel_idx = controller->enabled_channels[zone];
RGBColor color = colors[zone];
controller->SetChannelColor(channel_idx,
RGBGetRValue(color),
RGBGetGValue(color),
RGBGetBValue(color));
}
void RGBController_ASRockGPUSMBus::UpdateSingleLED(int led)
{
UpdateZoneLEDs(led);
}
void RGBController_ASRockGPUSMBus::DeviceUpdateMode()
{
DeviceUpdateLEDs();
}
@@ -1,9 +1,9 @@
/*---------------------------------------------------------*\
| RGBController_PalitGPU.h |
| RGBController_ASRockGPUSMBus.h |
| |
| RGBController for Palit GPU |
| RGBController for ASRock GPU RGB controllers |
| |
| Manatsawin Hanmongkolchai 11 Apr 2023 |
| Based on SignalRGB ASRock GPU.js plugin |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
@@ -12,12 +12,13 @@
#pragma once
#include "RGBController.h"
#include "PalitGPUController.h"
#include "ASRockGPUSMBusController.h"
class RGBController_PalitGPU : public RGBController
class RGBController_ASRockGPUSMBus : public RGBController
{
public:
RGBController_PalitGPU(PalitGPUController* controller_ptr);
RGBController_ASRockGPUSMBus(ASRockGPUSMBusController* controller_ptr);
~RGBController_ASRockGPUSMBus();
void SetupZones();
void ResizeZone(int zone, int new_size);
@@ -29,5 +30,5 @@ public:
void DeviceUpdateMode();
private:
PalitGPUController* controller;
ASRockGPUSMBusController* controller;
};
@@ -36,7 +36,7 @@ ASRockPolychromeV1SMBusController::~ASRockPolychromeV1SMBusController()
std::string ASRockPolychromeV1SMBusController::GetDeviceLocation()
{
std::string return_string(bus->device_name);
std::string return_string(bus->info.device_name);
char addr[5];
snprintf(addr, 5, "0x%02X", dev);
return_string.append(", address ");
@@ -230,6 +230,8 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
RGBController_ASRockPolychromeV1SMBus::~RGBController_ASRockPolychromeV1SMBus()
{
Shutdown();
delete controller;
}
@@ -267,7 +269,6 @@ void RGBController_ASRockPolychromeV1SMBus::SetupZones()
new_zone->leds_min = 1;
new_zone->leds_max = 1;
new_zone->leds_count = 1;
new_zone->matrix_map = NULL;
if(zone_idx == POLYCHROME_V1_ZONE_ADDRESSABLE)
{
@@ -297,10 +298,9 @@ void RGBController_ASRockPolychromeV1SMBus::SetupZones()
SetupColors();
}
void RGBController_ASRockPolychromeV1SMBus::ResizeZone(int zone, int new_size)
void RGBController_ASRockPolychromeV1SMBus::DeviceConfigureZone(int zone_idx)
{
LOG_TRACE("[%s] ResizeZone(%02X, %02X)", name.c_str(), zone, new_size);
controller-> SetARGBSize(new_size & 0xFF);
controller-> SetARGBSize(zones[zone_idx].leds_count & 0xFF);
zones[POLYCHROME_V1_ZONE_ADDRESSABLE].leds_count = 1;
}
@@ -309,19 +309,19 @@ void RGBController_ASRockPolychromeV1SMBus::DeviceUpdateLEDs()
LOG_TRACE("[%s] DeviceUpdateLEDs()", name.c_str());
for (uint8_t zone_idx = 0; zone_idx < zoneIndexMap.size(); zone_idx++)
{
UpdateSingleLED(zone_idx);
DeviceUpdateSingleLED(zone_idx);
}
}
void RGBController_ASRockPolychromeV1SMBus::UpdateZoneLEDs(int /*zone*/)
void RGBController_ASRockPolychromeV1SMBus::DeviceUpdateZoneLEDs(int /*zone*/)
{
LOG_TRACE("[%s] UpdateZoneLEDs()", name.c_str());
LOG_TRACE("[%s] DeviceUpdateZoneLEDs()", name.c_str());
DeviceUpdateLEDs();
}
void RGBController_ASRockPolychromeV1SMBus::UpdateSingleLED(int zone)
void RGBController_ASRockPolychromeV1SMBus::DeviceUpdateSingleLED(int zone)
{
LOG_TRACE("[%s] UpdateSingleLED(%02X)", name.c_str(), zone);
LOG_TRACE("[%s] DeviceUpdateSingleLED(%02X)", name.c_str(), zone);
uint8_t red = RGBGetRValue(colors[zone]);
uint8_t grn = RGBGetGValue(colors[zone]);
@@ -338,7 +338,7 @@ void RGBController_ASRockPolychromeV1SMBus::DeviceUpdateMode()
for(uint8_t zone_idx = 0; zone_idx < zoneIndexMap.size(); zone_idx++)
{
controller->SetMode(zoneIndexMap[zone_idx], modes[active_mode].value, modes[active_mode].speed);
UpdateSingleLED(zone_idx);
DeviceUpdateSingleLED(zone_idx);
}
}
else
@@ -23,11 +23,11 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceConfigureZone(int zone_idx);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -37,7 +37,7 @@ ASRockPolychromeV2SMBusController::~ASRockPolychromeV2SMBusController()
std::string ASRockPolychromeV2SMBusController::GetDeviceLocation()
{
std::string return_string(bus->device_name);
std::string return_string(bus->info.device_name);
char addr[5];
snprintf(addr, 5, "0x%02X", dev);
return_string.append(", address ");
@@ -185,6 +185,8 @@ RGBController_ASRockPolychromeV2SMBus::RGBController_ASRockPolychromeV2SMBus(ASR
RGBController_ASRockPolychromeV2SMBus::~RGBController_ASRockPolychromeV2SMBus()
{
Shutdown();
delete controller;
}
@@ -229,8 +231,6 @@ void RGBController_ASRockPolychromeV2SMBus::SetupZones()
new_zone->type = ZONE_TYPE_SINGLE;
}
new_zone->matrix_map = NULL;
/*---------------------------------------------------------*\
| Push new zone to zones vector |
\*---------------------------------------------------------*/
@@ -238,7 +238,6 @@ void RGBController_ASRockPolychromeV2SMBus::SetupZones()
}
}
unsigned int led_count = 0;
/*---------------------------------------------------------*\
| Set up LEDs |
\*---------------------------------------------------------*/
@@ -268,8 +267,6 @@ void RGBController_ASRockPolychromeV2SMBus::SetupZones()
\*---------------------------------------------------------*/
leds.push_back(*new_led);
led_count++;
if(zone_idx == POLYCHROME_V2_ZONE_ADDRESSABLE)
{
break;
@@ -281,7 +278,7 @@ void RGBController_ASRockPolychromeV2SMBus::SetupZones()
SetupColors();
}
void RGBController_ASRockPolychromeV2SMBus::ResizeZone(int /*zone*/, int /*new_size*/)
void RGBController_ASRockPolychromeV2SMBus::DeviceConfigureZone(int /*zone_idx*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
@@ -292,16 +289,16 @@ void RGBController_ASRockPolychromeV2SMBus::DeviceUpdateLEDs()
{
for(unsigned int led = 0; led < colors.size(); led++)
{
UpdateSingleLED(led);
DeviceUpdateSingleLED(led);
}
}
void RGBController_ASRockPolychromeV2SMBus::UpdateZoneLEDs(int /*zone*/)
void RGBController_ASRockPolychromeV2SMBus::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_ASRockPolychromeV2SMBus::UpdateSingleLED(int led)
void RGBController_ASRockPolychromeV2SMBus::DeviceUpdateSingleLED(int led)
{
unsigned char red = RGBGetRValue(colors[led]);
unsigned char grn = RGBGetGValue(colors[led]);
@@ -23,11 +23,11 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceConfigureZone(int zone_idx);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -11,7 +11,7 @@
\*---------------------------------------------------------*/
#include <vector>
#include "Detector.h"
#include "DetectionManager.h"
#include "ASRockASRRGBSMBusController.h"
#include "ASRockPolychromeV1SMBusController.h"
#include "ASRockPolychromeV2SMBusController.h"
@@ -22,15 +22,6 @@
#include "i2c_smbus.h"
#include "pci_ids.h"
/*******************************************************************************************\
* *
* TestForPolychromeSMBusController *
* *
* Tests the given address to see if an ASRock RGB controller exists there. *
* First does a quick write to test for a response *
* *
\*******************************************************************************************/
#define ASROCK_DETECTOR_NAME "ASRock SMBus Detectector"
#define VENDOR_NAME "ASRock"
#define SMBUS_ADDRESS 0x6A
@@ -67,7 +58,7 @@ bool TestForPolychromeSMBusController(i2c_smbus_interface* bus, uint8_t address)
return(pass);
} /* TestForPolychromeController() */
}
uint16_t GetFirmwareVersion(i2c_smbus_interface* bus, uint8_t address)
{
@@ -94,64 +85,54 @@ uint16_t GetFirmwareVersion(i2c_smbus_interface* bus, uint8_t address)
}
}
/******************************************************************************************\
* *
* DetectPolychromeControllers *
* *
* Detect ASRock Polychrome RGB SMBus controllers on the enumerated I2C busses at *
* address 0x6A. *
* *
* bus - pointer to i2c_smbus_interface where Polychrome device is connected *
* dev - I2C address of Polychrome device *
* *
\******************************************************************************************/
void DetectASRockSMBusControllers(std::vector<i2c_smbus_interface*>& busses)
DetectedControllers DetectASRockSMBusControllers(std::vector<i2c_smbus_interface*>& buses)
{
for(unsigned int bus = 0; bus < busses.size(); bus++)
DetectedControllers detected_controllers;
for(unsigned int bus = 0; bus < buses.size(); bus++)
{
IF_MOBO_SMBUS(busses[bus]->pci_vendor, busses[bus]->pci_device)
IF_MOBO_SMBUS(buses[bus]->info.pci_vendor, buses[bus]->info.pci_device)
{
if(busses[bus]->pci_subsystem_vendor == ASROCK_SUB_VEN)
if(buses[bus]->info.pci_subsystem_vendor == ASROCK_SUB_VEN)
{
LOG_DEBUG(SMBUS_CHECK_DEVICE_MESSAGE_EN, ASROCK_DETECTOR_NAME, bus, VENDOR_NAME, SMBUS_ADDRESS);
// Check for Polychrome controller at 0x6A
if(TestForPolychromeSMBusController(busses[bus], SMBUS_ADDRESS))
if(TestForPolychromeSMBusController(buses[bus], SMBUS_ADDRESS))
{
LOG_DEBUG("[%s] Detected a device at address 0x%02X, testing for a known controller", ASROCK_DETECTOR_NAME, SMBUS_ADDRESS);
u16_to_u8 version;
version.u16 = GetFirmwareVersion(busses[bus], SMBUS_ADDRESS);
version.u16 = GetFirmwareVersion(buses[bus], SMBUS_ADDRESS);
switch (version.msb)
switch(version.msb)
{
case ASROCK_TYPE_ASRLED:
{
LOG_DEBUG("[%s] Found a ASR RGB LED Controller", ASROCK_DETECTOR_NAME);
ASRockASRRGBSMBusController* controller = new ASRockASRRGBSMBusController(busses[bus], SMBUS_ADDRESS);
ASRockASRRGBSMBusController* controller = new ASRockASRRGBSMBusController(buses[bus], SMBUS_ADDRESS);
controller-> fw_version = version.u16;
RGBController_ASRockASRRGBSMBus* rgb_controller = new RGBController_ASRockASRRGBSMBus(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
break;
case ASROCK_TYPE_POLYCHROME_V1:
{
LOG_DEBUG("[%s] Found a Polychrome v1 Controller", ASROCK_DETECTOR_NAME);
ASRockPolychromeV1SMBusController* controller = new ASRockPolychromeV1SMBusController(busses[bus], SMBUS_ADDRESS);
ASRockPolychromeV1SMBusController* controller = new ASRockPolychromeV1SMBusController(buses[bus], SMBUS_ADDRESS);
controller-> fw_version = version.u16;
RGBController_ASRockPolychromeV1SMBus* rgb_controller = new RGBController_ASRockPolychromeV1SMBus(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
break;
case ASROCK_TYPE_POLYCHROME_V2:
{
LOG_DEBUG("[%s] Found a Polychrome v2 Controller", ASROCK_DETECTOR_NAME);
ASRockPolychromeV2SMBusController* controller = new ASRockPolychromeV2SMBusController(busses[bus], SMBUS_ADDRESS);
ASRockPolychromeV2SMBusController* controller = new ASRockPolychromeV2SMBusController(buses[bus], SMBUS_ADDRESS);
controller-> fw_version = version.u16;
RGBController_ASRockPolychromeV2SMBus* rgb_controller = new RGBController_ASRockPolychromeV2SMBus(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
break;
@@ -172,6 +153,7 @@ void DetectASRockSMBusControllers(std::vector<i2c_smbus_interface*>& busses)
}
}
} /* DetectSMBusPolychromeControllers() */
return(detected_controllers);
}
REGISTER_I2C_DETECTOR("ASRock Motherboard SMBus Controllers", DetectASRockSMBusControllers);
@@ -0,0 +1,50 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidKeyboard.cpp |
| |
| Detector for Acer Nitro HID Keyboard |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <vector>
#include "DetectionManager.h"
#include "AcerNitroHidKeyboardController.h"
#include "RGBController_AcerNitroHidKeyboard.h"
#include "RGBController_AcerNitroHidLed.h"
/*---------------------------------------------------------*\
| HID vendor and product IDs for ENEK EC in Acer Nitro |
\*---------------------------------------------------------*/
#define ACER_ENEC_VID 0x0CF2
#define ACER_ENEC_PID 0x5130
#define ACER_ENEC_USAGE_PAGE 0xFF5A
#define ACER_ENEC_USAGE 0x01
DetectedControllers DetectAcerHIDControllers(hid_device_info* info, const std::string&)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
/*-------------------------------------------------*\
| Controller is shared between keyboard and onboard |
| led |
\*-------------------------------------------------*/
std::shared_ptr<AcerNitroHidKeyboardController> controller = std::make_shared<AcerNitroHidKeyboardController>(dev, info->path);
RGBController_AcerNitroHidKeyboard* rgb_kb_controller = new RGBController_AcerNitroHidKeyboard(controller);
RGBController_AcerNitroHidLed* rgb_led_controller = new RGBController_AcerNitroHidLed(controller);
detected_controllers.push_back(rgb_kb_controller);
detected_controllers.push_back(rgb_led_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_PU("AcerNitroHidKeyboardController", DetectAcerHIDControllers, ACER_ENEC_VID, ACER_ENEC_PID, ACER_ENEC_USAGE_PAGE, ACER_ENEC_USAGE);
@@ -0,0 +1,80 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidKeyboard.cpp |
| |
| Driver for Acer Nitro Keyboard |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "AcerNitroHidKeyboardController.h"
AcerNitroHidKeyboardController::AcerNitroHidKeyboardController(hid_device *dev_handle, const char *path)
{
this->location = path;
this->dev = dev_handle;
device_name = "Acer Nitro HID Keyboard";
}
AcerNitroHidKeyboardController::~AcerNitroHidKeyboardController()
{
if(dev)
{
hid_close(dev);
}
}
std::string AcerNitroHidKeyboardController::GetLocation() const
{
return("HID: " + location);
}
std::string AcerNitroHidKeyboardController::GetDeviceName() const
{
return(device_name);
}
void AcerNitroHidKeyboardController::SetLEDs(const std::vector<RGBColor>& colors, unsigned char brightness, unsigned char device_id)
{
std::lock_guard<std::mutex> guard(device_mutex);
for(unsigned int led_idx = 0; (led_idx < colors.size()) && (led_idx < ACER_HID_NUM_ZONES); led_idx++)
{
/*-------------------------------------------------*\
| Convert colors to RGB format |
\*-------------------------------------------------*/
unsigned char r = RGBGetRValue(colors[led_idx]);
unsigned char g = RGBGetGValue(colors[led_idx]);
unsigned char b = RGBGetBValue(colors[led_idx]);
/*-------------------------------------------------*\
| Send packet |
\*-------------------------------------------------*/
unsigned char zone_select = (unsigned char)(1<<led_idx);
unsigned char packet[ACER_HID_PACKET_SIZE] = {0xA4, device_id, ACER_HID_MODE_STATIC, brightness, 0, 1, r, g, b, zone_select, 0};
hid_send_feature_report(dev, packet, ACER_HID_PACKET_SIZE);
}
}
void AcerNitroHidKeyboardController::SetAllLEDs(const RGBColor &color, unsigned char brightness, unsigned char speed, unsigned char direction, unsigned char mode, unsigned char device_id)
{
std::lock_guard<std::mutex> guard(device_mutex);
/*-----------------------------------------------------*\
| Convert color to RGB format |
\*-----------------------------------------------------*/
unsigned char r = RGBGetRValue(color);
unsigned char g = RGBGetGValue(color);
unsigned char b = RGBGetBValue(color);
/*-----------------------------------------------------*\
| Send packet |
| Zone select = All zones |
\*-----------------------------------------------------*/
unsigned char zone_select = 0x0F;
unsigned char packet[ACER_HID_PACKET_SIZE] = {0xA4, device_id, mode, brightness, speed, direction, r, g, b, zone_select, 0};
hid_send_feature_report(dev, packet, ACER_HID_PACKET_SIZE);
}
@@ -0,0 +1,56 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidKeyboard.cpp |
| |
| Driver for Acer Nitro Keyboard |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#pragma once
enum
{
ACER_HID_MODE_DIRECT = 1,
ACER_HID_MODE_STATIC = 2,
ACER_HID_MODE_BREATHING = 4,
ACER_HID_MODE_NEON = 5,
ACER_HID_MODE_OPMODE = 6,
ACER_HID_MODE_WAVE = 7,
ACER_HID_MODE_SHIFTING = 8,
ACER_HID_MODE_ZOOM = 9,
ACER_HID_MODE_METEOR = 10,
ACER_HID_MODE_TWINKLING = 11,
};
#define ACER_HID_NAME_BUFFER_SIZE 255
#define ACER_HID_NUM_ZONES 4
#define ACER_HID_PACKET_SIZE 11
#include <mutex>
#include <string>
#include <vector>
#include <hidapi.h>
#include "RGBControllerInterface.h"
class AcerNitroHidKeyboardController
{
public:
AcerNitroHidKeyboardController(hid_device *dev_handle, const char *path);
~AcerNitroHidKeyboardController();
std::string GetDeviceName() const;
std::string GetSerial() const;
std::string GetLocation() const;
void SetLEDs(const std::vector<RGBColor> &colors, unsigned char brightness, unsigned char device_id);
void SetAllLEDs(const RGBColor &color, unsigned char brightness, unsigned char speed, unsigned char direction, unsigned char mode, unsigned char device_id);
private:
hid_device *dev;
std::string device_name;
std::string location;
std::mutex device_mutex;
};
@@ -0,0 +1,231 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidKeyboard.cpp |
| |
| RGBController for Acer Nitro HID Keyboard |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "RGBController_AcerNitroHidKeyboard.h"
/**------------------------------------------------------------------*\
@name Acer Nitro HID Keyboard
@category Laptop
@type HID
@save :x:
@direct :white_check_mark:
@effects :white_check_mark:
@detectors DetectAcerHIDControllers
@comment
\*-------------------------------------------------------------------*/
RGBController_AcerNitroHidKeyboard::RGBController_AcerNitroHidKeyboard(std::shared_ptr<AcerNitroHidKeyboardController> controller)
{
this->controller = controller;
device_id = 0x21;
name = "Acer Nitro HID Keyboard";
vendor = "Acer";
type = DEVICE_TYPE_LAPTOP;
description = "Acer Nitro HID Keyboard Device";
location = controller->GetLocation();
mode Direct;
Direct.name = "Direct";
Direct.value = ACER_HID_MODE_DIRECT;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS ;
Direct.color_mode = MODE_COLORS_PER_LED;
Direct.brightness_min = 0;
Direct.brightness_max = 100;
Direct.brightness = 100;
modes.push_back(Direct);
mode Static;
Static.name = "Static";
Static.value = ACER_HID_MODE_STATIC;
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
Static.brightness_min = 0;
Static.brightness_max = 100;
Static.brightness = 100;
Static.colors_min = 1;
Static.colors_max = 1;
Static.colors.resize(1);
Static.speed = 0;
modes.push_back(Static);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = ACER_HID_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.brightness_min = 0;
Breathing.brightness_max = 100;
Breathing.brightness = 100;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.speed_min = 1;
Breathing.speed_max = 9;
Breathing.speed = 4;
Breathing.colors.resize(1);
modes.push_back(Breathing);
mode Neon;
Neon.name = "Neon";
Neon.value = ACER_HID_MODE_NEON;
Neon.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Neon.color_mode = MODE_COLORS_NONE;
Neon.brightness_min = 0;
Neon.brightness_max = 100;
Neon.brightness = 100;
Neon.speed_min = 1;
Neon.speed_max = 9;
Neon.speed = 4;
modes.push_back(Neon);
mode Wave;
Wave.name = "Wave";
Wave.value = ACER_HID_MODE_WAVE;
Wave.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
Wave.color_mode = MODE_COLORS_NONE;
Wave.brightness_min = 0;
Wave.brightness_max = 100;
Wave.brightness = 100;
Wave.speed_min = 1;
Wave.speed_max = 9;
Wave.speed = 4;
Wave.direction = 0;
modes.push_back(Wave);
mode Shifting;
Shifting.name = "Shifting";
Shifting.value = ACER_HID_MODE_SHIFTING;
Shifting.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Shifting.color_mode = MODE_COLORS_NONE;
Shifting.brightness_min = 0;
Shifting.brightness_max = 100;
Shifting.brightness = 100;
Shifting.speed_min = 1;
Shifting.speed_max = 9;
Shifting.speed = 4;
modes.push_back(Shifting);
mode Zoom;
Zoom.name = "Zoom";
Zoom.value = ACER_HID_MODE_ZOOM;
Zoom.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Zoom.color_mode = MODE_COLORS_NONE;
Zoom.brightness_min = 0;
Zoom.brightness_max = 100;
Zoom.brightness = 100;
Zoom.speed_min = 1;
Zoom.speed_max = 9;
Zoom.speed = 4;
modes.push_back(Zoom);
mode Meteor;
Meteor.name = "Meteor";
Meteor.value = ACER_HID_MODE_METEOR;
Meteor.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Meteor.color_mode = MODE_COLORS_NONE;
Meteor.brightness_min = 0;
Meteor.brightness_max = 100;
Meteor.brightness = 100;
Meteor.speed_min = 1;
Meteor.speed_max = 9;
Meteor.speed = 4;
modes.push_back(Meteor);
mode Twinkling;
Twinkling.name = "Twinkling";
Twinkling.value = ACER_HID_MODE_TWINKLING;
Twinkling.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Twinkling.color_mode = MODE_COLORS_NONE;
Twinkling.brightness_min = 0;
Twinkling.brightness_max = 100;
Twinkling.brightness = 100;
Twinkling.colors_min = 1;
Twinkling.colors_max = 1;
Twinkling.speed_min = 1;
Twinkling.speed_max = 9;
Twinkling.speed = 4;
modes.push_back(Twinkling);
SetupZones();
}
RGBController_AcerNitroHidKeyboard::~RGBController_AcerNitroHidKeyboard()
{
Shutdown();
}
void RGBController_AcerNitroHidKeyboard::SetupZones()
{
zone* new_zone = new zone;
new_zone->name = "Keyboard Backlight Zone";
new_zone->type = ZONE_TYPE_LINEAR;
new_zone->leds_min = 4;
new_zone->leds_max = 4;
new_zone->leds_count = 4;
zones.push_back(*new_zone);
for(std::size_t zone_idx = 0; zone_idx < ACER_HID_NUM_ZONES; zone_idx++)
{
led* new_led = new led();
new_led->name = "Keyboard Backlight Zone ";
new_led->name.append(std::to_string(zone_idx + 1));
new_led->value = (unsigned int)leds.size();
leds.push_back(*new_led);
}
SetupColors();
}
void RGBController_AcerNitroHidKeyboard::DeviceUpdateLEDs()
{
mode& current_mode = modes[active_mode];
if(current_mode.value == ACER_HID_MODE_DIRECT)
{
controller->SetLEDs(colors, current_mode.brightness, device_id);
}
else
{
RGBColor color = current_mode.colors.size()==0? (RGBColor)0 : current_mode.colors[0];
unsigned char direction = 1;
if((modes[active_mode].flags & MODE_FLAG_HAS_DIRECTION_LR) && modes[active_mode].direction)
{
direction = 2;
}
controller->SetAllLEDs(color, current_mode.brightness, current_mode.speed, direction, current_mode.value, device_id);
}
}
void RGBController_AcerNitroHidKeyboard::DeviceUpdateZoneLEDs(int)
{
DeviceUpdateLEDs();
}
void RGBController_AcerNitroHidKeyboard::DeviceUpdateSingleLED(int)
{
DeviceUpdateLEDs();
}
void RGBController_AcerNitroHidKeyboard::DeviceUpdateMode()
{
DeviceUpdateLEDs();
}
@@ -0,0 +1,33 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidKeyboard.cpp |
| |
| RGBController for Acer Nitro HID Keyboard |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#pragma once
#include "RGBController.h"
#include "AcerNitroHidKeyboardController.h"
class RGBController_AcerNitroHidKeyboard : public RGBController
{
public:
RGBController_AcerNitroHidKeyboard(std::shared_ptr<AcerNitroHidKeyboardController> controller);
~RGBController_AcerNitroHidKeyboard();
void SetupZones();
void DeviceUpdateLEDs();
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
private:
std::shared_ptr<AcerNitroHidKeyboardController> controller;
unsigned int device_id;
};
@@ -0,0 +1,152 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidLed.cpp |
| |
| RGBController for Acer Nitro HID LED |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "RGBController_AcerNitroHidLed.h"
/**------------------------------------------------------------------*\
@name Acer Nitro HID Led
@category Laptop
@type HID
@save :x:
@direct :white_check_mark:
@effects :white_check_mark:
@detectors DetectAcerHIDControllers
@comment
\*-------------------------------------------------------------------*/
RGBController_AcerNitroHidLed::RGBController_AcerNitroHidLed(std::shared_ptr<AcerNitroHidKeyboardController> controller)
{
this->controller = controller;
device_id = 0x65;
name = "Acer Nitro HID LED Device";
vendor = "Acer";
type = DEVICE_TYPE_LIGHT;
description = "Acer Nitro HID LED Device";
location = controller->GetLocation();
mode Direct;
Direct.name = "Direct";
Direct.value = ACER_HID_MODE_DIRECT;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS ;
Direct.color_mode = MODE_COLORS_PER_LED;
Direct.brightness_min = 0;
Direct.brightness_max = 100;
Direct.brightness = 100;
modes.push_back(Direct);
mode Static;
Static.name = "Static";
Static.value = ACER_HID_MODE_STATIC;
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
Static.brightness_min = 0;
Static.brightness_max = 100;
Static.brightness = 100;
Static.colors_min = 1;
Static.colors_max = 1;
Static.colors.resize(1);
Static.speed = 0;
modes.push_back(Static);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = ACER_HID_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.brightness_min = 0;
Breathing.brightness_max = 100;
Breathing.brightness = 100;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.speed_min = 1;
Breathing.speed_max = 5;
Breathing.speed = 4;
Breathing.colors.resize(1);
modes.push_back(Breathing);
mode Neon;
Neon.name = "Neon";
Neon.value = ACER_HID_MODE_NEON;
Neon.flags = MODE_FLAG_REQUIRES_ENTIRE_DEVICE | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Neon.color_mode = MODE_COLORS_NONE;
Neon.brightness_min = 0;
Neon.brightness_max = 100;
Neon.brightness = 100;
Neon.speed_min = 1;
Neon.speed_max = 5;
Neon.speed = 4;
modes.push_back(Neon);
SetupZones();
}
RGBController_AcerNitroHidLed::~RGBController_AcerNitroHidLed()
{
Shutdown();
}
void RGBController_AcerNitroHidLed::SetupZones()
{
zone* new_zone = new zone;
new_zone->name = "LED";
new_zone->type = ZONE_TYPE_LINEAR;
new_zone->leds_min = 1;
new_zone->leds_max = 1;
new_zone->leds_count = 1;
zones.push_back(*new_zone);
led* new_led = new led();
new_led->name = "LED";
new_led->value = (unsigned int)leds.size();
leds.push_back(*new_led);
SetupColors();
}
void RGBController_AcerNitroHidLed::DeviceUpdateLEDs()
{
mode& current_mode = modes[active_mode];
if(current_mode.value == ACER_HID_MODE_DIRECT)
{
controller->SetLEDs(colors, current_mode.brightness, device_id);
}
else
{
RGBColor color = current_mode.colors.size()==0? (RGBColor)0 : current_mode.colors[0];
unsigned char direction = 1;
if((modes[active_mode].flags & MODE_FLAG_HAS_DIRECTION_LR) && modes[active_mode].direction)
{
direction = 2;
}
controller->SetAllLEDs(color, current_mode.brightness, current_mode.speed, direction, current_mode.value, device_id);
}
}
void RGBController_AcerNitroHidLed::DeviceUpdateZoneLEDs(int)
{
DeviceUpdateLEDs();
}
void RGBController_AcerNitroHidLed::DeviceUpdateSingleLED(int)
{
DeviceUpdateLEDs();
}
void RGBController_AcerNitroHidLed::DeviceUpdateMode()
{
DeviceUpdateLEDs();
}
@@ -0,0 +1,35 @@
/*---------------------------------------------------------*\
| RGBController_AcerNitroHidLed.cpp |
| |
| RGBController for Acer Nitro HID LED |
| |
| Marek Pokropiński Jul 27 2026 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#pragma once
#include "RGBController.h"
#include "AcerNitroHidKeyboardController.h"
#include "RGBController_AcerNitroHidKeyboard.h"
class RGBController_AcerNitroHidLed : public RGBController
{
public:
RGBController_AcerNitroHidLed(std::shared_ptr<AcerNitroHidKeyboardController> controller);
~RGBController_AcerNitroHidLed();
void SetupZones();
void DeviceUpdateLEDs();
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
private:
std::shared_ptr<AcerNitroHidKeyboardController> controller;
unsigned int device_id;
};
@@ -32,6 +32,7 @@ static const std::map<alienware_platform_id, uint8_t> zone_quirks_table =
{ 0x0C01, 4 }, // Dell G5 SE 5505
{ 0x0A01, 16 }, // Dell G7 15 7500
{ 0x0E03, 4 }, // Dell G15 5511
{ 0x0E07, 4 }, // Dell G15 5520
{ 0x0E0A, 4 } // Dell G15 5530
};
@@ -49,9 +50,21 @@ static const std::map<alienware_platform_id, std::vector<const char*>> zone_name
"Light Bar 7", "Light Bar 8", "Light Bar 9",
"Light Bar 10", "Light Bar 11", "Light Bar 12" } },
{ 0x0E03, { "Left", "Middle", "Right", "Numpad" } },
{ 0x0E07, { "Left", "Middle", "Right", "Numpad" } },
{ 0x0E0A, { "Left", "Middle", "Right", "Numpad" } }
};
/*---------------------------------------------------------*\
| Mapping the platform ID to the actual hardware zone IDs |
\*---------------------------------------------------------*/
static const std::map<alienware_platform_id, std::vector<uint8_t>> zone_ids_table =
{
{ 0x0C01, { 0x00, 0x01, 0x02, 0x03 } }, // Dell G5 SE 5505
{ 0x0E03, { 0x00, 0x01, 0x02, 0x03 } }, // Dell G15 5511
{ 0x0E07, { 0x10, 0x11, 0x12, 0x13 } }, // Dell G15 5520
{ 0x0E0A, { 0x10, 0x11, 0x12, 0x13 } } // Dell G15 5530
};
static void SendHIDReport(hid_device *dev, const unsigned char* usb_buf, size_t usb_buf_size)
{
using namespace std::chrono_literals;
@@ -138,6 +151,21 @@ AlienwareController::AlienwareController(hid_device* dev_handle, const hid_devic
}
}
/*-----------------------------------------------------*\
| Initialize hardware zone IDs |
\*-----------------------------------------------------*/
if(zone_ids_table.count(platform_id))
{
zone_ids = zone_ids_table.at(platform_id);
}
else
{
for(size_t i = 0; i < number_of_zones; i++)
{
zone_ids.push_back(static_cast<uint8_t>(i));
}
}
/*-----------------------------------------------------*\
| Set defaults for all zones |
| It doesn't seem possible to read the controller's |
@@ -155,6 +183,7 @@ AlienwareController::AlienwareController(hid_device* dev_handle, const hid_devic
zones[zone_idx].period = 2000;
zones[zone_idx].tempo = ALIENWARE_TEMPO_MAX;
zones[zone_idx].dim = 0;
zones[zone_idx].direction = 0;
}
/*-----------------------------------------------------*\
@@ -266,42 +295,53 @@ bool AlienwareController::Dim(std::vector<uint8_t> zones, double percent)
return(true);
}
unsigned char usb_buf[HIDAPI_ALIENWARE_REPORT_SIZE];
bool result = true;
/*-----------------------------------------------------*\
| Zero out buffer |
| Split the zone list into packet-sized chunks so it |
| never overflows usb_buf |
\*-----------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-----------------------------------------------------*\
| Set up message packet with leading 00, per hidapi |
\*-----------------------------------------------------*/
uint16_t num_zones = (uint16_t)zones.size();
usb_buf[0x00] = 0x00;
usb_buf[0x01] = 0x03;
usb_buf[0x02] = ALIENWARE_COMMAND_DIM;
usb_buf[0x03] = static_cast<uint8_t>(percent);
usb_buf[0x04] = num_zones >> 8;
usb_buf[0x05] = num_zones & 0xFF;
for(size_t i = 0; i < num_zones; i++)
for(size_t offset = 0; offset < zones.size(); offset += ALIENWARE_MAX_ZONES_PER_PACKET)
{
usb_buf[0x06+i] = zones[i];
unsigned char usb_buf[HIDAPI_ALIENWARE_REPORT_SIZE];
/*-------------------------------------------------*\
| Zero out buffer |
\*-------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-------------------------------------------------*\
| Set up message packet with leading 00, per hidapi |
\*-------------------------------------------------*/
uint16_t num_zones = (uint16_t)std::min<size_t>(ALIENWARE_MAX_ZONES_PER_PACKET, zones.size() - offset);
usb_buf[0x00] = 0x00;
usb_buf[0x01] = 0x03;
usb_buf[0x02] = ALIENWARE_COMMAND_DIM;
usb_buf[0x03] = static_cast<uint8_t>(percent);
usb_buf[0x04] = num_zones >> 8;
usb_buf[0x05] = num_zones & 0xFF;
for(size_t i = 0; i < num_zones; i++)
{
usb_buf[0x06+i] = zones[offset + i];
}
/*-------------------------------------------------*\
| Send packet |
\*-------------------------------------------------*/
SendHIDReport(dev, usb_buf, sizeof(usb_buf));
HidapiAlienwareReport response = GetResponse();
/*-------------------------------------------------*\
| For this command, error is if the output equals |
| the input |
\*-------------------------------------------------*/
result &= (response.data[1] == 0x03) && memcmp(usb_buf, response.data, HIDAPI_ALIENWARE_REPORT_SIZE);
}
/*-----------------------------------------------------*\
| Send packet |
\*-----------------------------------------------------*/
SendHIDReport(dev, usb_buf, sizeof(usb_buf));
HidapiAlienwareReport response = GetResponse();
/*-----------------------------------------------------*\
| For this command, error is if the output equals the |
| input |
\*-----------------------------------------------------*/
return((response.data[1] == 0x03) && memcmp(usb_buf, response.data, HIDAPI_ALIENWARE_REPORT_SIZE));
return(result);
}
bool AlienwareController::UserAnimation(uint16_t subcommand, uint16_t animation, uint16_t duration)
@@ -370,42 +410,53 @@ bool AlienwareController::SelectZones(const std::vector<uint8_t>& zones)
return(false);
}
unsigned char usb_buf[HIDAPI_ALIENWARE_REPORT_SIZE];
bool result = true;
/*-----------------------------------------------------*\
| Zero out buffer |
| Split the zone list into packet-sized chunks so it |
| never overflows usb_buf |
\*-----------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-----------------------------------------------------*\
| Set up message packet with leading 00, per hidapi |
\*-----------------------------------------------------*/
uint16_t num_zones = (uint16_t)zones.size();
usb_buf[0x00] = 0x00;
usb_buf[0x01] = 0x03;
usb_buf[0x02] = ALIENWARE_COMMAND_SELECT_ZONES;
usb_buf[0x03] = 1; // loop?
usb_buf[0x04] = num_zones >> 8;
usb_buf[0x05] = num_zones & 0xFF;
for(size_t i = 0; i < num_zones; i++)
for(size_t offset = 0; offset < zones.size(); offset += ALIENWARE_MAX_ZONES_PER_PACKET)
{
usb_buf[0x06+i] = zones[i];
unsigned char usb_buf[HIDAPI_ALIENWARE_REPORT_SIZE];
/*-------------------------------------------------*\
| Zero out buffer |
\*-------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-------------------------------------------------*\
| Set up message packet with leading 00, per hidapi |
\*-------------------------------------------------*/
uint16_t num_zones = (uint16_t)std::min<size_t>(ALIENWARE_MAX_ZONES_PER_PACKET, zones.size() - offset);
usb_buf[0x00] = 0x00;
usb_buf[0x01] = 0x03;
usb_buf[0x02] = ALIENWARE_COMMAND_SELECT_ZONES;
usb_buf[0x03] = 1; // loop?
usb_buf[0x04] = num_zones >> 8;
usb_buf[0x05] = num_zones & 0xFF;
for(size_t i = 0; i < num_zones; i++)
{
usb_buf[0x06+i] = zones[offset + i];
}
/*-------------------------------------------------*\
| Send packet |
\*-------------------------------------------------*/
SendHIDReport(dev, usb_buf, sizeof(usb_buf));
HidapiAlienwareReport response = GetResponse();
/*-------------------------------------------------*\
| For this command, error is if the output equals |
| the input |
\*-------------------------------------------------*/
result &= (response.data[1] == 0x03) && memcmp(usb_buf, response.data, HIDAPI_ALIENWARE_REPORT_SIZE);
}
/*-----------------------------------------------------*\
| Send packet |
\*-----------------------------------------------------*/
SendHIDReport(dev, usb_buf, sizeof(usb_buf));
HidapiAlienwareReport response = GetResponse();
/*-----------------------------------------------------*\
| For this command, error is if the output equals the |
| input |
\*-----------------------------------------------------*/
return((response.data[1] == 0x03) && memcmp(usb_buf, response.data, HIDAPI_ALIENWARE_REPORT_SIZE));
return(result);
}
bool AlienwareController::ModeAction(uint8_t mode, uint16_t duration, uint16_t tempo, RGBColor color)
@@ -509,44 +560,55 @@ bool AlienwareController::SetColorDirect(RGBColor color, std::vector<uint8_t> zo
return(true);
}
unsigned char usb_buf[HIDAPI_ALIENWARE_REPORT_SIZE];
bool result = true;
/*-----------------------------------------------------*\
| Zero out buffer |
| Split the zone list into packet-sized chunks so it |
| never overflows usb_buf |
\*-----------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-----------------------------------------------------*\
| Set up message packet with leading 00, per hidapi |
\*-----------------------------------------------------*/
uint16_t num_zones = (uint16_t)zones.size();
usb_buf[0x00] = 0x00;
usb_buf[0x01] = 0x03;
usb_buf[0x02] = ALIENWARE_COMMAND_SET_COLOR;
usb_buf[0x03] = RGBGetRValue(color);
usb_buf[0x04] = RGBGetGValue(color);
usb_buf[0x05] = RGBGetBValue(color);
usb_buf[0x06] = num_zones >> 8;
usb_buf[0x07] = num_zones & 0xFF;
for(size_t i = 0; i < num_zones; i++)
for(size_t offset = 0; offset < zones.size(); offset += ALIENWARE_MAX_ZONES_PER_PACKET)
{
usb_buf[0x08 + i] = zones[i];
unsigned char usb_buf[HIDAPI_ALIENWARE_REPORT_SIZE];
/*-------------------------------------------------*\
| Zero out buffer |
\*-------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-------------------------------------------------*\
| Set up message packet with leading 00, per hidapi |
\*-------------------------------------------------*/
uint16_t num_zones = (uint16_t)std::min<size_t>(ALIENWARE_MAX_ZONES_PER_PACKET, zones.size() - offset);
usb_buf[0x00] = 0x00;
usb_buf[0x01] = 0x03;
usb_buf[0x02] = ALIENWARE_COMMAND_SET_COLOR;
usb_buf[0x03] = RGBGetRValue(color);
usb_buf[0x04] = RGBGetGValue(color);
usb_buf[0x05] = RGBGetBValue(color);
usb_buf[0x06] = num_zones >> 8;
usb_buf[0x07] = num_zones & 0xFF;
for(size_t i = 0; i < num_zones; i++)
{
usb_buf[0x08 + i] = zones[offset + i];
}
/*-------------------------------------------------*\
| Send packet |
\*-------------------------------------------------*/
SendHIDReport(dev, usb_buf, sizeof(usb_buf));
HidapiAlienwareReport response = GetResponse();
/*-------------------------------------------------*\
| For this command, error is if the output equals |
| the input |
\*-------------------------------------------------*/
result &= (response.data[1] == 0x03) && memcmp(usb_buf, response.data, HIDAPI_ALIENWARE_REPORT_SIZE);
}
/*-----------------------------------------------------*\
| Send packet |
\*-----------------------------------------------------*/
SendHIDReport(dev, usb_buf, sizeof(usb_buf));
HidapiAlienwareReport response = GetResponse();
/*-----------------------------------------------------*\
| For this command, error is if the output equals the |
| input |
\*-----------------------------------------------------*/
return((response.data[1] == 0x03) && memcmp(usb_buf, response.data, HIDAPI_ALIENWARE_REPORT_SIZE));
return(result);
}
bool AlienwareController::Reset()
@@ -640,6 +702,15 @@ void AlienwareController::SetDim(uint8_t zone, uint8_t dim)
}
}
void AlienwareController::SetDirection(uint8_t zone, uint8_t direction)
{
if(zone < zones.size())
{
zones[zone].direction = direction;
dirty = true;
}
}
void AlienwareController::UpdateDim()
{
if(!dirty_dim)
@@ -655,7 +726,8 @@ void AlienwareController::UpdateDim()
for(size_t i = 0; i < zones.size(); i++)
{
dim_zone_map[zones[i].dim].emplace_back((uint8_t)i);
uint8_t hw_zone = (i < zone_ids.size()) ? zone_ids[i] : static_cast<uint8_t>(i);
dim_zone_map[zones[i].dim].emplace_back(hw_zone);
}
for(std::pair<const uint8_t, std::vector<uint8_t>> &pair : dim_zone_map)
@@ -682,7 +754,8 @@ bool AlienwareController::UpdateDirect()
for(size_t i = 0; i < zones.size(); i++)
{
color_zone_map[zones[i].color[0]].emplace_back((uint8_t)i);
uint8_t hw_zone = (i < zone_ids.size()) ? zone_ids[i] : static_cast<uint8_t>(i);
color_zone_map[zones[i].color[0]].emplace_back(hw_zone);
}
for(std::pair<const RGBColor, std::vector<uint8_t>> &pair : color_zone_map)
@@ -726,8 +799,9 @@ void AlienwareController::UpdateMode()
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
alienware_zone zone = zones[zone_idx];
uint8_t hw_zone = (zone_idx < zone_ids.size()) ? zone_ids[zone_idx] : static_cast<uint8_t>(zone_idx);
result = SelectZones({static_cast<uint8_t>(zone_idx)});
result = SelectZones({hw_zone});
if(!result)
{
@@ -750,18 +824,18 @@ void AlienwareController::UpdateMode()
case ALIENWARE_MODE_MORPH:
{
uint8_t zones[2] = { zone.mode, zone.mode };
uint8_t modes[2] = { zone.mode, zone.mode };
uint16_t periods[2] = { zone.period, zone.period };
uint16_t tempos[2] = { zone.tempo, zone.tempo };
RGBColor colors[2] = { zone.color[0], zone.color[1] };
result = MultiModeAction(zones, periods, tempos, colors, 2);
result = MultiModeAction(modes, periods, tempos, colors, 2);
}
break;
case ALIENWARE_MODE_SPECTRUM:
{
uint8_t zones[7] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
uint8_t modes[7] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH };
@@ -774,13 +848,13 @@ void AlienwareController::UpdateMode()
zone.tempo, zone.tempo,
zone.tempo };
result = MultiModeAction(zones, periods, tempos, rainbow_colors[0], 7);
result = MultiModeAction(modes, periods, tempos, rainbow_colors[0], 7);
}
break;
case ALIENWARE_MODE_RAINBOW:
{
uint8_t zones[7] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
uint8_t modes[7] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH };
@@ -793,18 +867,19 @@ void AlienwareController::UpdateMode()
zone.tempo, zone.tempo,
zone.tempo };
result = MultiModeAction(zones, periods, tempos, rainbow_colors[zone_idx], 7);
unsigned int color_idx = (zone.direction == MODE_DIRECTION_LEFT) ? (4 - 1 - (zone_idx % 4)) : (zone_idx % 4);
result = MultiModeAction(modes, periods, tempos, rainbow_colors[color_idx], 7);
}
break;
case ALIENWARE_MODE_BREATHING:
{
uint8_t zones[2] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH };
uint8_t modes[2] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH };
uint16_t periods[2] = { zone.period, zone.period };
uint16_t tempos[2] = { zone.tempo, zone.tempo };
RGBColor colors[2] = { zone.color[0], 0x0 };
result = MultiModeAction(zones, periods, tempos, colors, 2);
result = MultiModeAction(modes, periods, tempos, colors, 2);
}
break;
@@ -831,6 +906,117 @@ void AlienwareController::UpdateMode()
dirty = false;
}
void AlienwareController::SaveController()
{
/*-----------------------------------------------------*\
| Save current mode configuration to EEPROM slot 0x0061 |
\*-----------------------------------------------------*/
UserAnimation(ALIENWARE_COMMAND_USER_ANIM_REMOVE, ALIENWARE_ANIM_DEFAULT, 0);
bool result = UserAnimation(ALIENWARE_COMMAND_USER_ANIM_NEW, ALIENWARE_ANIM_DEFAULT, 0);
if(!result)
{
return;
}
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
alienware_zone zone = zones[zone_idx];
uint8_t hw_zone = (zone_idx < zone_ids.size()) ? zone_ids[zone_idx] : static_cast<uint8_t>(zone_idx);
result = SelectZones({hw_zone});
if(!result)
{
return;
}
switch (zone.mode)
{
case ALIENWARE_MODE_COLOR:
result = ModeAction(zone.mode, 2000, ALIENWARE_TEMPO_MAX, zone.color[0]);
break;
case ALIENWARE_MODE_PULSE:
result = ModeAction(zone.mode, zone.period, zone.tempo, zone.color[0]);
break;
case ALIENWARE_MODE_MORPH:
{
uint8_t modes[2] = { zone.mode, zone.mode };
uint16_t periods[2] = { zone.period, zone.period };
uint16_t tempos[2] = { zone.tempo, zone.tempo };
RGBColor colors[2] = { zone.color[0], zone.color[1] };
result = MultiModeAction(modes, periods, tempos, colors, 2);
}
break;
case ALIENWARE_MODE_SPECTRUM:
{
uint8_t modes[7] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH };
uint16_t periods[7] = { zone.period, zone.period,
zone.period, zone.period,
zone.period, zone.period,
zone.period };
uint16_t tempos[7] = { zone.tempo, zone.tempo,
zone.tempo, zone.tempo,
zone.tempo, zone.tempo,
zone.tempo };
result = MultiModeAction(modes, periods, tempos, rainbow_colors[0], 7);
}
break;
case ALIENWARE_MODE_RAINBOW:
{
uint8_t modes[7] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH,
ALIENWARE_MODE_MORPH };
uint16_t periods[7] = { zone.period, zone.period,
zone.period, zone.period,
zone.period, zone.period,
zone.period };
uint16_t tempos[7] = { zone.tempo, zone.tempo,
zone.tempo, zone.tempo,
zone.tempo, zone.tempo,
zone.tempo };
unsigned int color_idx = (zone.direction == MODE_DIRECTION_LEFT) ? (4 - 1 - (zone_idx % 4)) : (zone_idx % 4);
result = MultiModeAction(modes, periods, tempos, rainbow_colors[color_idx], 7);
}
break;
case ALIENWARE_MODE_BREATHING:
{
uint8_t modes[2] = { ALIENWARE_MODE_MORPH, ALIENWARE_MODE_MORPH };
uint16_t periods[2] = { zone.period, zone.period };
uint16_t tempos[2] = { zone.tempo, zone.tempo };
RGBColor colors[2] = { zone.color[0], 0x0 };
result = MultiModeAction(modes, periods, tempos, colors, 2);
}
break;
default:
result = false;
}
if(!result)
{
return;
}
}
UserAnimation(ALIENWARE_COMMAND_USER_ANIM_FINISH_SAVE, ALIENWARE_ANIM_DEFAULT, 0);
UserAnimation(ALIENWARE_COMMAND_USER_ANIM_DEFAULT, ALIENWARE_ANIM_DEFAULT, 0);
UserAnimation(ALIENWARE_COMMAND_USER_ANIM_STARTUP, ALIENWARE_ANIM_DEFAULT, 0);
}
void AlienwareController::UpdateController()
{
UpdateMode();
@@ -22,6 +22,14 @@
#define ALIENWARE_REPORT_SIZE 33
#define HIDAPI_ALIENWARE_REPORT_SIZE (ALIENWARE_REPORT_SIZE + 1)
#define ALIENWARE_CONTROLLER_NAME "AlienWare Controller"
/*---------------------------------------------------------*\
| Max zone IDs that fit in one report after the command |
| header. Selections larger than this must be split across |
| multiple packets; writing them into a single report |
| overflows usb_buf (e.g. desktops with ~100 zones). |
\*---------------------------------------------------------*/
#define ALIENWARE_MAX_ZONES_PER_PACKET 25
enum
{
ALIENWARE_COMMAND_REPORT = 0x20, /* Set report type to get */
@@ -115,11 +123,13 @@ public:
void SetPeriod(uint8_t zone, uint16_t period);
void SetTempo(uint8_t zone, uint16_t tempo);
void SetDim(uint8_t zone, uint8_t dim);
void SetDirection(uint8_t zone, uint8_t direction);
AlienwareReport GetStatus(uint8_t subcommand);
void UpdateDim();
void UpdateMode();
void UpdateController();
void SaveController();
protected:
hid_device* dev;
@@ -132,6 +142,7 @@ private:
uint16_t period;
uint16_t tempo;
uint8_t dim;
uint8_t direction;
} alienware_zone;
typedef struct
@@ -145,6 +156,7 @@ private:
std::string serial_number;
std::string version;
std::vector<const char*> zone_names;
std::vector<uint8_t> zone_ids;
bool dirty;
bool dirty_dim;
@@ -7,8 +7,8 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "AlienwareController.h"
#include "DetectionManager.h"
#include "RGBController_Alienware.h"
/*---------------------------------------------------------*\
@@ -22,17 +22,22 @@
#define ALIENWARE_G_SERIES_PID1 0x0550
#define ALIENWARE_G_SERIES_PID2 0x0551
void DetectAlienwareControllers(hid_device_info* info, const std::string& name)
DetectedControllers DetectAlienwareControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AlienwareController* controller = new AlienwareController(dev, *info, name);
RGBController_Alienware* rgb_controller = new RGBController_Alienware(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR("Dell G Series LED Controller", DetectAlienwareControllers, ALIENWARE_VID, ALIENWARE_G_SERIES_PID1);
@@ -39,7 +39,7 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
mode Color;
Color.name = "Static";
Color.value = ALIENWARE_MODE_COLOR;
Color.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Color.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
Color.color_mode = MODE_COLORS_PER_LED;
Color.colors_min = 1;
Color.colors_max = 1;
@@ -51,13 +51,13 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
mode Pulse;
Pulse.name = "Flashing";
Pulse.value = ALIENWARE_MODE_PULSE;
Pulse.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Pulse.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
Pulse.color_mode = MODE_COLORS_PER_LED;
Pulse.colors_min = 1;
Pulse.colors_max = 1;
Pulse.speed_min = ALIENWARE_TEMPO_MIN;
Pulse.speed_max = ALIENWARE_TEMPO_MAX;
Pulse.speed = ALIENWARE_TEMPO_MIN;
Pulse.speed_min = ALIENWARE_TEMPO_MAX;
Pulse.speed_max = 50;
Pulse.speed = 150;
Pulse.brightness_min = 100;
Pulse.brightness_max = 0;
Pulse.brightness = 0;
@@ -66,14 +66,16 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
mode Morph;
Morph.name = "Morph";
Morph.value = ALIENWARE_MODE_MORPH;
Morph.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Morph.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
Morph.color_mode = MODE_COLORS_MODE_SPECIFIC;
Morph.colors_min = 2 * controller->GetZoneCount();
Morph.colors_max = Morph.colors_min;
Morph.colors.resize(Morph.colors_max);
Morph.speed_min = ALIENWARE_TEMPO_MIN;
Morph.speed_max = ALIENWARE_TEMPO_MAX;
Morph.speed = ALIENWARE_TEMPO_MIN;
Morph.colors_min = 2;
Morph.colors_max = 2 * controller->GetZoneCount();
Morph.colors.resize(2);
Morph.colors[0] = 0x0000FF;
Morph.colors[1] = 0xFF0000;
Morph.speed_min = ALIENWARE_TEMPO_MAX;
Morph.speed_max = 20;
Morph.speed = 100;
Morph.brightness_min = 100;
Morph.brightness_max = 0;
Morph.brightness = 0;
@@ -82,11 +84,11 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
mode Spectrum;
Spectrum.name = "Spectrum Cycle";
Spectrum.value = ALIENWARE_MODE_SPECTRUM;
Spectrum.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Spectrum.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
Spectrum.color_mode = MODE_COLORS_NONE;
Spectrum.speed_min = ALIENWARE_TEMPO_SPECTRUM;
Spectrum.speed_max = ALIENWARE_TEMPO_MAX;
Spectrum.speed = ALIENWARE_TEMPO_SPECTRUM;
Spectrum.speed_min = ALIENWARE_TEMPO_MAX;
Spectrum.speed_max = ALIENWARE_TEMPO_SPECTRUM;
Spectrum.speed = 40;
Spectrum.brightness_min = 100;
Spectrum.brightness_max = 0;
Spectrum.brightness = 0;
@@ -95,11 +97,12 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
mode Rainbow;
Rainbow.name = "Rainbow Wave";
Rainbow.value = ALIENWARE_MODE_RAINBOW;
Rainbow.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Rainbow.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_MANUAL_SAVE;
Rainbow.color_mode = MODE_COLORS_NONE;
Rainbow.speed_min = ALIENWARE_TEMPO_SPECTRUM;
Rainbow.speed_max = ALIENWARE_TEMPO_MAX;
Rainbow.speed = ALIENWARE_TEMPO_SPECTRUM;
Rainbow.speed_min = ALIENWARE_TEMPO_MAX;
Rainbow.speed_max = ALIENWARE_TEMPO_SPECTRUM;
Rainbow.speed = 40;
Rainbow.direction = MODE_DIRECTION_RIGHT;
Rainbow.brightness_min = 100;
Rainbow.brightness_max = 0;
Rainbow.brightness = 0;
@@ -108,13 +111,13 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = ALIENWARE_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
Breathing.color_mode = MODE_COLORS_PER_LED;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.speed_min = ALIENWARE_TEMPO_MIN;
Breathing.speed_max = ALIENWARE_TEMPO_MAX;
Breathing.speed = ALIENWARE_TEMPO_MIN;
Breathing.speed_min = ALIENWARE_TEMPO_MAX;
Breathing.speed_max = 50;
Breathing.speed = 150;
Breathing.brightness_min = 100;
Breathing.brightness_max = 0;
Breathing.brightness = 0;
@@ -125,6 +128,13 @@ RGBController_Alienware::RGBController_Alienware(AlienwareController* controller
controller->UpdateDim();
}
RGBController_Alienware::~RGBController_Alienware()
{
Shutdown();
delete controller;
}
void RGBController_Alienware::SetupZones()
{
/*-------------------------------------------------*\
@@ -141,7 +151,6 @@ void RGBController_Alienware::SetupZones()
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);
}
@@ -158,26 +167,19 @@ void RGBController_Alienware::SetupZones()
SetupColors();
}
void RGBController_Alienware::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_Alienware::DeviceUpdateLEDs()
{
DeviceUpdateMode();
}
void RGBController_Alienware::UpdateZoneLEDs(int /*zone*/)
void RGBController_Alienware::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_Alienware::UpdateSingleLED(int led)
void RGBController_Alienware::DeviceUpdateSingleLED(int led)
{
UpdateZoneLEDs(led);
DeviceUpdateZoneLEDs(led);
}
static bool modes_eq(const mode& mode1, const mode& mode2)
@@ -225,6 +227,7 @@ void RGBController_Alienware::DeviceUpdateMode()
uint16_t period = 0x07d0;
controller->SetMode(zone_idx, current_mode.value);
controller->SetDirection(zone_idx, current_mode.direction);
switch(current_mode_idx)
{
@@ -236,6 +239,7 @@ void RGBController_Alienware::DeviceUpdateMode()
break;
case ALIENWARE_MODE_PULSE:
period = std::max<uint16_t>(500, (uint16_t)(current_mode.speed * 10));
controller->SetPeriod(zone_idx, period);
controller->SetColor( zone_idx, colors[current_zone.start_idx]);
controller->SetTempo( zone_idx, current_mode.speed);
@@ -243,10 +247,22 @@ void RGBController_Alienware::DeviceUpdateMode()
break;
case ALIENWARE_MODE_MORPH:
controller->SetPeriod(zone_idx, period);
controller->SetColor( zone_idx, current_mode.colors[zone_idx * 2], current_mode.colors[(zone_idx * 2) + 1]);
controller->SetTempo( zone_idx, current_mode.speed);
controller->SetDim( zone_idx, modes[current_mode_idx].brightness);
{
RGBColor c1 = (current_mode.colors.size() >= 1) ? current_mode.colors[0] : 0x0000FF;
RGBColor c2 = (current_mode.colors.size() >= 2) ? current_mode.colors[1] : 0xFF0000;
if(current_mode.colors.size() >= (std::size_t)((zone_idx + 1) * 2))
{
c1 = current_mode.colors[zone_idx * 2];
c2 = current_mode.colors[(zone_idx * 2) + 1];
}
period = std::max<uint16_t>(400, (uint16_t)(current_mode.speed * 10));
controller->SetPeriod(zone_idx, period);
controller->SetColor( zone_idx, c1, c2);
controller->SetTempo( zone_idx, current_mode.speed);
controller->SetDim( zone_idx, modes[current_mode_idx].brightness);
}
break;
case ALIENWARE_MODE_SPECTRUM:
@@ -257,6 +273,7 @@ void RGBController_Alienware::DeviceUpdateMode()
break;
case ALIENWARE_MODE_BREATHING:
period = std::max<uint16_t>(500, (uint16_t)(current_mode.speed * 10));
controller->SetPeriod(zone_idx, period);
controller->SetColor( zone_idx, colors[current_zone.start_idx], 0x0);
controller->SetTempo( zone_idx, current_mode.speed);
@@ -283,3 +300,9 @@ void RGBController_Alienware::DeviceUpdateMode()
current_mode = new_current_mode;
}
}
void RGBController_Alienware::DeviceSaveMode()
{
controller->SaveController();
}
@@ -19,16 +19,16 @@ class RGBController_Alienware : public RGBController
{
public:
RGBController_Alienware(AlienwareController* controller_ptr);
~RGBController_Alienware();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
void DeviceSaveMode();
private:
AlienwareController* controller;
@@ -319,7 +319,7 @@ void AlienwareAW410KController::SetMode
SendCommit();
}
void AlienwareAW410KController::UpdateSingleLED
void AlienwareAW410KController::DeviceUpdateSingleLED
(
unsigned char led,
unsigned char red,
@@ -130,7 +130,7 @@ public:
unsigned char blue2
);
void UpdateSingleLED
void DeviceUpdateSingleLED
(
unsigned char led,
unsigned char red,
@@ -0,0 +1,43 @@
/*---------------------------------------------------------*\
| AlienwareAW410KControllerDetect.cpp |
| |
| Detector for Alienware AW410K Keyboard |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "DetectionManager.h"
#include "AlienwareAW410KController.h"
#include "RGBController_AlienwareAW410K.h"
/*---------------------------------------------------------*\
| Alienware vendor ID |
\*---------------------------------------------------------*/
#define ALIENWARE_VID 0x04F2
/*---------------------------------------------------------*\
| Keyboard product IDs |
\*---------------------------------------------------------*/
#define ALIENWARE_AW410K_PID 0x1968
DetectedControllers DetectAlienwareAW410KControllers(hid_device_info* info, const std::string& name)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AlienwareAW410KController* controller = new AlienwareAW410KController(dev, info->path, name);
RGBController_AlienwareAW410K* rgb_controller = new RGBController_AlienwareAW410K(controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("Alienware AW410K", DetectAlienwareAW410KControllers, ALIENWARE_VID, ALIENWARE_AW410K_PID, 0x02, 0xFF00, 0x01);
@@ -278,16 +278,7 @@ RGBController_AlienwareAW410K::RGBController_AlienwareAW410K(AlienwareAW410KCont
RGBController_AlienwareAW410K::~RGBController_AlienwareAW410K()
{
/*---------------------------------------------------------*\
| Delete the matrix map |
\*---------------------------------------------------------*/
for(unsigned int zone_index = 0; zone_index < zones.size(); zone_index++)
{
if(zones[zone_index].matrix_map != NULL)
{
delete zones[zone_index].matrix_map;
}
}
Shutdown();
delete controller;
}
@@ -310,14 +301,7 @@ void RGBController_AlienwareAW410K::SetupZones()
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
{
new_zone.matrix_map = new matrix_map_type;
new_zone.matrix_map->height = 6;
new_zone.matrix_map->width = 24;
new_zone.matrix_map->map = (unsigned int *)&matrix_map;
}
else
{
new_zone.matrix_map = NULL;
new_zone.matrix_map.Set(6, 24, (unsigned int *)&matrix_map);
}
zones.push_back(new_zone);
@@ -336,13 +320,6 @@ void RGBController_AlienwareAW410K::SetupZones()
SetupColors();
}
void RGBController_AlienwareAW410K::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AlienwareAW410K::DeviceUpdateLEDs()
{
std::vector<SelectedButtons> frame_buf_keys;
@@ -374,21 +351,21 @@ void RGBController_AlienwareAW410K::DeviceUpdateLEDs()
std::copy(new_colors.begin(), new_colors.end(),current_colors.begin());
}
void RGBController_AlienwareAW410K::UpdateZoneLEDs(int zone)
void RGBController_AlienwareAW410K::DeviceUpdateZoneLEDs(int zone)
{
controller->SetDirect((unsigned char) zone, RGBGetRValue(zones[zone].colors[0]), RGBGetGValue(zones[zone].colors[0]), RGBGetBValue(zones[zone].colors[0]));
}
void RGBController_AlienwareAW410K::UpdateSingleLED(int led)
void RGBController_AlienwareAW410K::DeviceUpdateSingleLED(int led)
{
controller->UpdateSingleLED(leds[led].value, RGBGetRValue(colors[led]), RGBGetGValue(colors[led]), RGBGetBValue(colors[led]));
controller->DeviceUpdateSingleLED(leds[led].value, RGBGetRValue(colors[led]), RGBGetGValue(colors[led]), RGBGetBValue(colors[led]));
}
void RGBController_AlienwareAW410K::DeviceUpdateMode()
{
if(active_mode == 0xFFFF)
{
UpdateLEDs();
UpdateLEDsInternal();
return;
}
@@ -23,11 +23,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -318,7 +318,7 @@ void AlienwareAW510KController::SetMode
SendCommit();
}
void AlienwareAW510KController::UpdateSingleLED
void AlienwareAW510KController::DeviceUpdateSingleLED
(
unsigned char led,
unsigned char red,
@@ -132,7 +132,7 @@ public:
unsigned char blue2
);
void UpdateSingleLED
void DeviceUpdateSingleLED
(
unsigned char led,
unsigned char red,
@@ -0,0 +1,43 @@
/*---------------------------------------------------------*\
| AlienwareAW510KControllerDetect.cpp |
| |
| Detector for Alienware AW510K Keyboard |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "DetectionManager.h"
#include "AlienwareAW510KController.h"
#include "RGBController_AlienwareAW510K.h"
/*---------------------------------------------------------*\
| Alienware vendor ID |
\*---------------------------------------------------------*/
#define ALIENWARE_VID 0x04F2
/*---------------------------------------------------------*\
| Keyboard product IDs |
\*---------------------------------------------------------*/
#define ALIENWARE_AW510K_PID 0x1830
DetectedControllers DetectAlienwareAW510KControllers(hid_device_info* info, const std::string& name)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AlienwareAW510KController* controller = new AlienwareAW510KController(dev, info->path, name);
RGBController_AlienwareAW510K* rgb_controller = new RGBController_AlienwareAW510K(controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("Alienware AW510K", DetectAlienwareAW510KControllers, ALIENWARE_VID, ALIENWARE_AW510K_PID, 0x02, 0xFF00, 0x01);
@@ -277,16 +277,7 @@ RGBController_AlienwareAW510K::RGBController_AlienwareAW510K(AlienwareAW510KCont
RGBController_AlienwareAW510K::~RGBController_AlienwareAW510K()
{
/*---------------------------------------------------------*\
| Delete the matrix map |
\*---------------------------------------------------------*/
for(unsigned int zone_index = 0; zone_index < zones.size(); zone_index++)
{
if(zones[zone_index].matrix_map != NULL)
{
delete zones[zone_index].matrix_map;
}
}
Shutdown();
delete controller;
}
@@ -309,14 +300,7 @@ void RGBController_AlienwareAW510K::SetupZones()
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
{
new_zone.matrix_map = new matrix_map_type;
new_zone.matrix_map->height = 7;
new_zone.matrix_map->width = 24;
new_zone.matrix_map->map = (unsigned int *)&matrix_map;
}
else
{
new_zone.matrix_map = NULL;
new_zone.matrix_map.Set(7, 24, (unsigned int *)&matrix_map);
}
zones.push_back(new_zone);
@@ -335,13 +319,6 @@ void RGBController_AlienwareAW510K::SetupZones()
SetupColors();
}
void RGBController_AlienwareAW510K::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AlienwareAW510K::DeviceUpdateLEDs()
{
std::vector<SelectedKeys> frame_buf_keys;
@@ -395,21 +372,21 @@ void RGBController_AlienwareAW510K::DeviceUpdateLEDs()
std::copy(new_colors.begin(), new_colors.end(),current_colors.begin());
}
void RGBController_AlienwareAW510K::UpdateZoneLEDs(int zone)
void RGBController_AlienwareAW510K::DeviceUpdateZoneLEDs(int zone)
{
controller->SetDirect((unsigned char) zone, RGBGetRValue(zones[zone].colors[0]), RGBGetGValue(zones[zone].colors[0]), RGBGetBValue(zones[zone].colors[0]));
}
void RGBController_AlienwareAW510K::UpdateSingleLED(int led)
void RGBController_AlienwareAW510K::DeviceUpdateSingleLED(int led)
{
controller->UpdateSingleLED(leds[led].value, RGBGetRValue(colors[led]), RGBGetGValue(colors[led]), RGBGetBValue(colors[led]));
controller->DeviceUpdateSingleLED(leds[led].value, RGBGetRValue(colors[led]), RGBGetGValue(colors[led]), RGBGetBValue(colors[led]));
}
void RGBController_AlienwareAW510K::DeviceUpdateMode()
{
if(active_mode == 0xFFFF)
{
UpdateLEDs();
UpdateLEDsInternal();
return;
}
@@ -22,11 +22,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -1,62 +0,0 @@
/*---------------------------------------------------------*\
| AlienwareKeyboardControllerDetect.cpp |
| |
| Detector for Alienware Keyboard |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "Detector.h"
#include "AlienwareAW510KController.h"
#include "AlienwareAW410KController.h"
#include "RGBController_AlienwareAW510K.h"
#include "RGBController_AlienwareAW410K.h"
/*-----------------------------------------------------*\
| Alienware vendor ID |
\*-----------------------------------------------------*/
#define ALIENWARE_VID 0x04F2
/*-----------------------------------------------------*\
| Keyboard product IDs |
\*-----------------------------------------------------*/
#define ALIENWARE_AW510K_PID 0x1830
#define ALIENWARE_AW410K_PID 0x1968
/******************************************************************************************\
* *
* DetectAlienwareKeyboardControllers *
* *
* Tests the USB address to see if a Alienware RGB Keyboard controller exists there. *
* *
\******************************************************************************************/
void DetectAlienwareAW510KControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if( dev )
{
AlienwareAW510KController* controller = new AlienwareAW510KController(dev, info->path, name);
RGBController_AlienwareAW510K* rgb_controller = new RGBController_AlienwareAW510K(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
void DetectAlienwareAW410KControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if( dev )
{
AlienwareAW410KController* controller = new AlienwareAW410KController(dev, info->path, name);
RGBController_AlienwareAW410K* rgb_controller = new RGBController_AlienwareAW410K(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}/* DetectAlienwareKeyboardControllers() */
REGISTER_HID_DETECTOR_IPU("Alienware AW510K", DetectAlienwareAW510KControllers, ALIENWARE_VID, ALIENWARE_AW510K_PID, 0x02, 0xFF00, 0x01);
REGISTER_HID_DETECTOR_IPU("Alienware AW410K", DetectAlienwareAW410KControllers, ALIENWARE_VID, ALIENWARE_AW410K_PID, 0x02, 0xFF00, 0x01);
@@ -40,11 +40,11 @@ std::vector<unsigned char> AlienwareAW3423DWFController::GetReportResponse()
void AlienwareAW3423DWFController::PerformLogin()
{
unsigned char init_packet[64] =
{
0x40, 0xE1, 0x01
};
SendControlPacket(init_packet, 4);
unsigned char init_packet[192] = {0x00};
init_packet[0] = 0x40;
init_packet[1] = 0xE1;
init_packet[2] = 0x01;
SendControlPacket(init_packet, 192);
std::vector<unsigned char> response = GetReportResponse();
@@ -0,0 +1,47 @@
/*---------------------------------------------------------*\
| AlienwareAW3423DWFControllerDetect.cpp |
| |
| Detector for Alienware AW3423DWF monitor |
| |
| Ferréol DUBOIS COLI (Fefe_du_973) 23 Jan 2025 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "AlienwareAW3423DWFController.h"
#include "DetectionManager.h"
#include "RGBController_AlienwareAW3423DWF.h"
/*---------------------------------------------------------*\
| Alienware Vendor ID |
\*---------------------------------------------------------*/
#define ALIENWARE_VID 0x187C
/*---------------------------------------------------------*\
| Alienware Vendor ID |
\*---------------------------------------------------------*/
#define ALIENWARE_AW3423DWF_PID 0x100E
#define ALIENWARE_USAGE_PAGE 0xFFDA
#define ALIENWARE_USAGE 0x00DA
DetectedControllers DetectAlienwareAW3423DWFControllers(hid_device_info* info, const std::string&)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AlienwareAW3423DWFController* controller = new AlienwareAW3423DWFController(dev, info->path);
RGBController_AlienwareAW3423DWF* rgb_controller = new RGBController_AlienwareAW3423DWF(controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR("Alienware AW3423DWF", DetectAlienwareAW3423DWFControllers, ALIENWARE_VID, ALIENWARE_AW3423DWF_PID);
@@ -46,6 +46,8 @@ RGBController_AlienwareAW3423DWF::RGBController_AlienwareAW3423DWF(AlienwareAW34
RGBController_AlienwareAW3423DWF::~RGBController_AlienwareAW3423DWF()
{
Shutdown();
delete controller;
}
@@ -57,7 +59,6 @@ void RGBController_AlienwareAW3423DWF::SetupZones()
Logo.leds_min = 1;
Logo.leds_max = 1;
Logo.leds_count = 1;
Logo.matrix_map = NULL;
zones.push_back(Logo);
led Logo_LED;
@@ -71,7 +72,6 @@ void RGBController_AlienwareAW3423DWF::SetupZones()
Number.leds_min = 1;
Number.leds_max = 1;
Number.leds_count = 1;
Number.matrix_map = NULL;
zones.push_back(Number);
led Number_LED;
@@ -85,7 +85,6 @@ void RGBController_AlienwareAW3423DWF::SetupZones()
PowerButton.leds_min = 1;
PowerButton.leds_max = 1;
PowerButton.leds_count = 1;
PowerButton.matrix_map = NULL;
zones.push_back(PowerButton);
led PowerButton_LED;
@@ -96,10 +95,6 @@ void RGBController_AlienwareAW3423DWF::SetupZones()
SetupColors();
}
void RGBController_AlienwareAW3423DWF::ResizeZone(int /*zone*/, int /*new_size*/)
{
}
void RGBController_AlienwareAW3423DWF::DeviceUpdateLEDs()
{
/*-----------------------------------------------------*\
@@ -118,17 +113,17 @@ void RGBController_AlienwareAW3423DWF::DeviceUpdateLEDs()
{
for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++)
{
UpdateSingleLED(led_idx);
DeviceUpdateSingleLED(led_idx);
}
}
}
void RGBController_AlienwareAW3423DWF::UpdateZoneLEDs(int /*zone*/)
void RGBController_AlienwareAW3423DWF::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AlienwareAW3423DWF::UpdateSingleLED(int led)
void RGBController_AlienwareAW3423DWF::DeviceUpdateSingleLED(int led)
{
unsigned char red = RGBGetRValue(colors[led]);
unsigned char grn = RGBGetGValue(colors[led]);
@@ -21,11 +21,10 @@ public:
~RGBController_AlienwareAW3423DWF();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -9,12 +9,10 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "AlienwareAW3423DWFController.h"
#include "AlienwareMonitorController.h"
#include "RGBController_AlienwareAW3423DWF.h"
#include "RGBController_AlienwareMonitor.h"
#include <hidapi.h>
#include "AlienwareMonitorController.h"
#include "DetectionManager.h"
#include "RGBController_AlienwareMonitor.h"
/*---------------------------------------------------------*\
| Alienware Vendor ID |
@@ -24,43 +22,26 @@
/*---------------------------------------------------------*\
| Alienware Vendor ID |
\*---------------------------------------------------------*/
#define ALIENWARE_AW3423DWF_PID 0x100E
#define ALIENWARE_AW3225QF_PID 0x1013
#define ALIENWARE_USAGE_PAGE 0xFFDA
#define ALIENWARE_USAGE 0x00DA
/******************************************************************************************\
* *
* AlienwareAW3423DWFControllerDetect *
* *
* Tests the USB address to see if an Alienware AW3423DWF exists there. *
* *
\******************************************************************************************/
void DetectAlienwareAW3423DWFControllers(hid_device_info* info, const std::string&)
DetectedControllers DetectAlienwareMonitorControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
AlienwareAW3423DWFController* controller = new AlienwareAW3423DWFController(dev, info->path);
RGBController_AlienwareAW3423DWF* rgb_controller = new RGBController_AlienwareAW3423DWF(controller);
DetectedControllers detected_controllers;
hid_device* dev;
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
void DetectAlienwareMonitorControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
dev = hid_open_path(info->path);
if(dev)
{
AlienwareMonitorController* controller = new AlienwareMonitorController(dev, info->path, name);
RGBController_AlienwareMonitor* rgb_controller = new RGBController_AlienwareMonitor(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR("Alienware AW3423DWF", DetectAlienwareAW3423DWFControllers, ALIENWARE_VID, ALIENWARE_AW3423DWF_PID);
REGISTER_HID_DETECTOR("Alienware AW3225QF", DetectAlienwareMonitorControllers, ALIENWARE_VID, ALIENWARE_AW3225QF_PID);
@@ -46,6 +46,8 @@ RGBController_AlienwareMonitor::RGBController_AlienwareMonitor(AlienwareMonitorC
RGBController_AlienwareMonitor::~RGBController_AlienwareMonitor()
{
Shutdown();
delete controller;
}
@@ -57,7 +59,6 @@ void RGBController_AlienwareMonitor::SetupZones()
Logo.leds_min = 1;
Logo.leds_max = 1;
Logo.leds_count = 1;
Logo.matrix_map = NULL;
zones.push_back(Logo);
led Logo_LED;
@@ -71,7 +72,6 @@ void RGBController_AlienwareMonitor::SetupZones()
Number.leds_min = 1;
Number.leds_max = 1;
Number.leds_count = 1;
Number.matrix_map = NULL;
zones.push_back(Number);
led Number_LED;
@@ -85,7 +85,6 @@ void RGBController_AlienwareMonitor::SetupZones()
PowerButton.leds_min = 1;
PowerButton.leds_max = 1;
PowerButton.leds_count = 1;
PowerButton.matrix_map = NULL;
zones.push_back(PowerButton);
led PowerButton_LED;
@@ -96,11 +95,6 @@ void RGBController_AlienwareMonitor::SetupZones()
SetupColors();
}
void RGBController_AlienwareMonitor::ResizeZone(int /*zone*/, int /*new_size*/)
{
}
void RGBController_AlienwareMonitor::DeviceUpdateLEDs()
{
/*-----------------------------------------------------*\
@@ -119,17 +113,17 @@ void RGBController_AlienwareMonitor::DeviceUpdateLEDs()
{
for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++)
{
UpdateSingleLED(led_idx);
DeviceUpdateSingleLED(led_idx);
}
}
}
void RGBController_AlienwareMonitor::UpdateZoneLEDs(int /*zone*/)
void RGBController_AlienwareMonitor::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AlienwareMonitor::UpdateSingleLED(int led)
void RGBController_AlienwareMonitor::DeviceUpdateSingleLED(int led)
{
unsigned char red = RGBGetRValue(colors[led]);
unsigned char grn = RGBGetGValue(colors[led]);
@@ -21,11 +21,10 @@ RGBController_AlienwareMonitor(AlienwareMonitorController* controller_ptr);
~RGBController_AlienwareMonitor();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -9,10 +9,10 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "AnnePro2Controller.h"
#include "RGBController_AnnePro2.h"
#include <hidapi.h>
#include "AnnePro2Controller.h"
#include "DetectionManager.h"
#include "RGBController_AnnePro2.h"
/*---------------------------------------------------------*\
| Anne Pro 2 vendor IDs |
@@ -29,25 +29,22 @@
#define ANNE_PRO_2_PID_4 0xA293
#define ANNE_PRO_2_PID_5 0xA297
/******************************************************************************************\
* *
* DetectAnnePro2Controllers *
* *
* Tests the USB address to see if an Obins Lab AnnePro2 keyboard exists there. *
* *
\******************************************************************************************/
void DetectAnnePro2Controllers(hid_device_info* info, const std::string&)
DetectedControllers DetectAnnePro2Controllers(hid_device_info* info, const std::string&)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AnnePro2Controller* controller = new AnnePro2Controller(dev, info->path);
RGBController_AnnePro2* rgb_controller = new RGBController_AnnePro2(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_I("Anne Pro 2", DetectAnnePro2Controllers, ANNE_PRO_2_VID_1, ANNE_PRO_2_PID_1, 1);
@@ -144,6 +144,8 @@ RGBController_AnnePro2::RGBController_AnnePro2(AnnePro2Controller* controller_pt
RGBController_AnnePro2::~RGBController_AnnePro2()
{
Shutdown();
delete controller;
}
@@ -164,14 +166,7 @@ void RGBController_AnnePro2::SetupZones()
if(zone_types[zone_idx] == ZONE_TYPE_MATRIX)
{
new_zone.matrix_map = new matrix_map_type;
new_zone.matrix_map->height = 5;
new_zone.matrix_map->width = 14;
new_zone.matrix_map->map = (unsigned int *)&matrix_map;
}
else
{
new_zone.matrix_map = NULL;
new_zone.matrix_map.Set(5, 14, (unsigned int *)&matrix_map);
}
zones.push_back(new_zone);
@@ -190,13 +185,6 @@ void RGBController_AnnePro2::SetupZones()
SetupColors();
}
void RGBController_AnnePro2::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AnnePro2::DeviceUpdateLEDs()
{
const unsigned char frame_buf_length = LED_REAL_COUNT * 3;
@@ -228,12 +216,12 @@ void RGBController_AnnePro2::DeviceUpdateLEDs()
controller->SendDirect(frame_buf_length, frame_buf);
}
void RGBController_AnnePro2::UpdateZoneLEDs(int /*zone*/)
void RGBController_AnnePro2::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_AnnePro2::UpdateSingleLED(int /*led*/)
void RGBController_AnnePro2::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
@@ -21,11 +21,10 @@ public:
~RGBController_AnnePro2();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -10,39 +10,38 @@
\*---------------------------------------------------------*/
#include <vector>
#include "Detector.h"
#include "ArcticController.h"
#include "RGBController_Arctic.h"
#include "DetectionManager.h"
#include "find_usb_serial_port.h"
#include "RGBController_Arctic.h"
#define CH341_VID 0x1A86
#define CH341_PID 0x7523
void DetectArcticControllers()
DetectedControllers DetectArcticControllers()
{
std::vector<std::string *> ports = find_usb_serial_port(CH341_VID, CH341_PID);
DetectedControllers detected_controllers;
std::vector<std::string> ports;
ports = find_usb_serial_port(CH341_VID, CH341_PID);
for(unsigned int device = 0; device < ports.size(); device++)
{
ArcticController *controller = new ArcticController(*ports[device]);
ArcticController *controller = new ArcticController(ports[device]);
if(controller->IsPresent())
{
RGBController_Arctic *rgb_controller = new RGBController_Arctic(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
else
{
delete controller;
}
delete ports[device];
}
return(detected_controllers);
}
REGISTER_DETECTOR("Arctic RGB controller", DetectArcticControllers);
/*---------------------------------------------------------------------------------------------------------*\
| Entries for dynamic UDEV rules |
| |
| DUMMY_DEVICE_DETECTOR("Arctic RGB controller", DetectArcticControllers, 0x1A86, 0x7523 ) |
\*---------------------------------------------------------------------------------------------------------*/
REGISTER_CUSTOM_UDEV_RULE(arctic, "Arctic RGB controller", "SUBSYSTEMS==\"serial|hidraw\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"7523\", TAG+=\"uaccess\", TAG+=\"Arctic_RGB_controller\"");
@@ -55,6 +55,8 @@ RGBController_Arctic::RGBController_Arctic(ArcticController* controller_ptr)
RGBController_Arctic::~RGBController_Arctic()
{
Shutdown();
keepalive_thread_run = false;
keepalive_thread.join();
delete controller;
@@ -70,7 +72,6 @@ void RGBController_Arctic::SetupZones()
LedZone.leds_count = 1;
LedZone.leds_min = 1;
LedZone.leds_max = 1;
LedZone.matrix_map = nullptr;
led Led;
Led.name = LedZone.name + " LED";
@@ -83,13 +84,6 @@ void RGBController_Arctic::SetupZones()
SetupColors();
}
void RGBController_Arctic::ResizeZone(int /* zone */, int /* new_size */)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_Arctic::DeviceUpdateLEDs()
{
last_update_time = std::chrono::steady_clock::now();
@@ -97,12 +91,12 @@ void RGBController_Arctic::DeviceUpdateLEDs()
controller->SetChannels(colors);
}
void RGBController_Arctic::UpdateZoneLEDs(int /* zone */)
void RGBController_Arctic::DeviceUpdateZoneLEDs(int /* zone */)
{
DeviceUpdateLEDs();
}
void RGBController_Arctic::UpdateSingleLED(int /* led */)
void RGBController_Arctic::DeviceUpdateSingleLED(int /* led */)
{
DeviceUpdateLEDs();
}
@@ -123,7 +117,7 @@ void RGBController_Arctic::KeepaliveThreadFunction()
sleep_time = ARCTIC_KEEPALIVE_PERIOD - (std::chrono::steady_clock::now() - last_update_time);
if(sleep_time <= ARCTIC_SLEEP_THRESHOLD)
{
UpdateLEDs(); // Already protected thru a device update thread
UpdateLEDsInternal(); // Already protected thru a device update thread
std::this_thread::sleep_for(ARCTIC_KEEPALIVE_PERIOD);
}
else
@@ -25,11 +25,9 @@ public:
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -9,7 +9,7 @@
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "DetectionManager.h"
#include "AresonController.h"
#include "RGBController_Areson.h"
@@ -28,17 +28,22 @@
#define REDRAGON_M914_PID 0xFA7B
#define REDRAGON_M914_WIRELESS_PID 0xFA7C
void DetectAresonControllers(hid_device_info* info, const std::string& name)
DetectedControllers DetectAresonControllers(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AresonController* controller = new AresonController(dev, *info, name);
RGBController_Areson* rgb_controller = new RGBController_Areson(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
detected_controllers.push_back(rgb_controller);
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR_IPU("ZET GAMING Edge Air Pro (Wireless)", DetectAresonControllers, ARESON_VID, ZET_GAMING_EDGE_AIR_PRO_WIRELESS_PID, 1, 0xFF02, 2);
@@ -125,6 +125,8 @@ RGBController_Areson::RGBController_Areson(AresonController* controller_ptr)
RGBController_Areson::~RGBController_Areson()
{
Shutdown();
delete controller;
}
@@ -137,7 +139,6 @@ void RGBController_Areson::SetupZones()
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);
@@ -150,24 +151,17 @@ void RGBController_Areson::SetupZones()
SetupColors();
}
void RGBController_Areson::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_Areson::DeviceUpdateLEDs()
{
DeviceUpdateMode();
}
void RGBController_Areson::UpdateZoneLEDs(int /*zone*/)
void RGBController_Areson::DeviceUpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateMode();
}
void RGBController_Areson::UpdateSingleLED(int /*led*/)
void RGBController_Areson::DeviceUpdateSingleLED(int /*led*/)
{
DeviceUpdateMode();
}
@@ -21,11 +21,10 @@ public:
~RGBController_Areson();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -0,0 +1,46 @@
/*---------------------------------------------------------*\
| AsusAuraCoreControllerDetect.cpp |
| |
| Detector for ASUS ROG Aura Core |
| |
| Adam Honse (CalcProgrammer1) 13 Apr 2020 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include <hidapi.h>
#include "AsusAuraCoreController.h"
#include "DetectionManager.h"
#include "RGBController_AsusAuraCore.h"
#define AURA_CORE_VID 0x0B05
DetectedControllers DetectAsusAuraCoreControllers(hid_device_info* info, const std::string& /*name*/)
{
DetectedControllers detected_controllers;
hid_device* dev;
dev = hid_open_path(info->path);
if(dev)
{
AuraCoreController* controller = new AuraCoreController(dev, info->path);
RGBController_AuraCore* rgb_controller = new RGBController_AuraCore(controller);
if(rgb_controller->GetDeviceType() != DEVICE_TYPE_UNKNOWN)
{
detected_controllers.push_back(rgb_controller);
}
else
{
delete rgb_controller;
}
}
return(detected_controllers);
}
REGISTER_HID_DETECTOR ("ASUS Aura Core", DetectAsusAuraCoreControllers, AURA_CORE_VID, 0x1854);
REGISTER_HID_DETECTOR ("ASUS Aura Core", DetectAsusAuraCoreControllers, AURA_CORE_VID, 0x1866);
REGISTER_HID_DETECTOR ("ASUS Aura Core", DetectAsusAuraCoreControllers, AURA_CORE_VID, 0x1869);
@@ -45,6 +45,13 @@ RGBController_AuraCore::RGBController_AuraCore(AuraCoreController* controller_pt
SetupZones();
}
RGBController_AuraCore::~RGBController_AuraCore()
{
Shutdown();
delete controller;
}
void RGBController_AuraCore::SetupKeyboard()
{
name = "ASUS Aura Keyboard";
@@ -170,11 +177,6 @@ void RGBController_AuraCore::SetupGA15DH()
modes.push_back(Static);
}
RGBController_AuraCore::~RGBController_AuraCore()
{
delete controller;
}
void RGBController_AuraCore::SetupZones()
{
zone auraZone;
@@ -186,7 +188,6 @@ void RGBController_AuraCore::SetupZones()
auraZone.leds_min = 4;
auraZone.leds_max = 4;
auraZone.leds_count = 4;
auraZone.matrix_map = NULL;
}
else if(controller->aura_device.aura_type == AURA_CORE_DEVICE_GA15DH)
{
@@ -195,7 +196,6 @@ void RGBController_AuraCore::SetupZones()
auraZone.leds_min = 20;
auraZone.leds_max = 20;
auraZone.leds_count = 20;
auraZone.matrix_map = NULL;
}
else
{
@@ -215,19 +215,12 @@ void RGBController_AuraCore::SetupZones()
SetupColors();
}
void RGBController_AuraCore::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AuraCore::DeviceUpdateLEDs()
{
UpdateZoneLEDs(0);
DeviceUpdateZoneLEDs(0);
}
void RGBController_AuraCore::UpdateZoneLEDs(int /*zone*/)
void RGBController_AuraCore::DeviceUpdateZoneLEDs(int /*zone*/)
{
if(modes[active_mode].value == AURA_CORE_MODE_DIRECT)
{
@@ -256,16 +249,16 @@ void RGBController_AuraCore::UpdateZoneLEDs(int /*zone*/)
{
for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++)
{
UpdateSingleLED(led_idx);
DeviceUpdateSingleLED(led_idx);
}
}
else
{
UpdateSingleLED(0);
DeviceUpdateSingleLED(0);
}
}
void RGBController_AuraCore::UpdateSingleLED(int led)
void RGBController_AuraCore::DeviceUpdateSingleLED(int led)
{
unsigned char speed = 0xFF;
unsigned char red = 0;
@@ -24,11 +24,9 @@ public:
void SetupGA15DH();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateZoneLEDs(int zone);
void DeviceUpdateSingleLED(int led);
void DeviceUpdateMode();
@@ -1,68 +0,0 @@
/*---------------------------------------------------------*\
| AsusAuraCoreControllerDetect.cpp |
| |
| Detector for ASUS ROG Aura Core |
| |
| Adam Honse (CalcProgrammer1) 13 Apr 2020 |
| Chris M (Dr_No) 28 Jul 2022 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-or-later |
\*---------------------------------------------------------*/
#include "Detector.h"
#include "AsusAuraCoreController.h"
#include "RGBController.h"
#include "RGBController_AsusAuraCore.h"
#include "RGBController_AsusAuraCoreLaptop.h"
#include <hidapi.h>
#define AURA_CORE_VID 0x0B05
/******************************************************************************************\
* *
* DetectAuraCoreControllers *
* *
* Tests the USB address to see if an Asus ROG Aura Core controller exists there *
* *
\******************************************************************************************/
void DetectAsusAuraCoreControllers(hid_device_info* info, const std::string& /*name*/)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
AuraCoreController* controller = new AuraCoreController(dev, info->path);
RGBController_AuraCore* rgb_controller = new RGBController_AuraCore(controller);
if(rgb_controller->type != DEVICE_TYPE_UNKNOWN)
{
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
else
{
delete rgb_controller;
}
}
}
void DetectAsusAuraCoreLaptopControllers(hid_device_info* info, const std::string& /*name*/)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
AsusAuraCoreLaptopController* controller = new AsusAuraCoreLaptopController(dev, info->path);
RGBController_AsusAuraCoreLaptop* rgb_controller = new RGBController_AsusAuraCoreLaptop(controller);
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
REGISTER_HID_DETECTOR ("ASUS Aura Core", DetectAsusAuraCoreControllers, AURA_CORE_VID, 0x1854);
REGISTER_HID_DETECTOR ("ASUS Aura Core", DetectAsusAuraCoreControllers, AURA_CORE_VID, 0x1866);
REGISTER_HID_DETECTOR ("ASUS Aura Core", DetectAsusAuraCoreControllers, AURA_CORE_VID, 0x1869);
REGISTER_HID_DETECTOR_PU("ASUS ROG Strix SCAR 15", DetectAsusAuraCoreLaptopControllers, AURA_CORE_VID, AURA_STRIX_SCAR_15_PID, 0xFF31, 0x79);
REGISTER_HID_DETECTOR_PU("ASUS ROG Strix SCAR 17", DetectAsusAuraCoreLaptopControllers, AURA_CORE_VID, 0x1866, 0xFF31, 0x79);
@@ -11,6 +11,7 @@
#include "AsusAuraCoreLaptopController.h"
#include "dmiinfo.h"
#include "ResourceManager.h"
#include "SettingsManager.h"
#include "StringUtils.h"

Some files were not shown because too many files have changed in this diff Show More