Compare commits

...
Author SHA1 Message Date
Adam Honse 972c0f74e6 Use read byte data for ENE detect 2022-10-02 23:01:28 -05:00
Chris M 8f2b33ce3e Initial commit for Gigabyte RTX3070 MASTER 8G LHR to resolve #2761
* Registering detector in GigabyteRGBFusion2GPUControllerDetect.cpp
* Link to [webpage](https://www.gigabyte.com/Graphics-Card/GV-
N3070AORUS-M-8GD-rev-20)
2022-09-28 19:50:45 +10:00
nomeat 3a251e1e47 Initial commit for Cooler Master MM730 2022-09-27 22:07:22 +00:00
Codename-Antares 57cb3ef9cd Initial Implementation for a MSI GPU FPS Limiter (tested and working)
Commit amended for code style by Adam Honse <[email protected]
2022-09-27 11:36:07 -05:00
Aleš Nezbeda 2603dbe4ab Fix profile not being applied when I2C bus ID changes on reboot 2022-09-27 02:29:59 +00:00
Teemu Linkoaho c1d7daf8c0 Adding ASUS TUF RX 6900 XT OC GPU 2022-09-25 20:46:36 -05:00
Adam Honse 3219dbfdc4 Fix read() warnings 2022-09-25 19:39:22 -05:00
Thomas Boos bf7f470dc5 Support for more ARGB LEDs in Per-LED mode for MSI boards added 2022-09-25 19:45:40 +00:00
Adam Honse 19218f4513 Fix warnings in cli.cpp 2022-09-25 01:03:25 -05:00
Adam Honse dff6b0e494 Fix warning in RGBController_GigabyteRGBFusion2USB.h 2022-09-25 00:11:44 -05:00
Gwen b75e3af5dc Add GV-N3090AORUSX W-24GD Support 2022-09-25 03:44:40 +00:00
Adam Honse 9aa4b5b817 Fix warning in RGBController_Debug.cpp 2022-09-24 22:25:50 -05:00
Adam Honse ab918dada0 Fix warning in RGBController_Sinowealth1007.cpp 2022-09-24 21:14:03 -05:00
Adam Honse ece626828a Fix warnings in RGBController_QMKOpenRGBRevE.cpp 2022-09-24 20:31:49 -05:00
Adam Honse 4b575a780a Fix warnings in RGBController_QMKOpenRGBRevD.cpp 2022-09-24 20:28:29 -05:00
Adam Honse fad91f9a46 Fix warnings in RGBController_QMKOpenRGBRevB.cpp 2022-09-24 17:47:43 -05:00
Adam Honse d68831a116 Fix warning in SteelSeriesSenseiController.cpp 2022-09-24 12:12:51 -05:00
Adam Honse 7f3d4f0dfb Fix warning in SteelSeriesOldApexController.cpp 2022-09-23 22:35:45 -05:00
Adam Honse f6bd67c5a3 Fix warnings in RGBController_SinowealthGMOW.cpp 2022-09-23 22:24:37 -05:00
Adam Honse 75f3f3a3cb Fix warnings in RGBController_QMKOpenRGBRev9.cpp 2022-09-23 18:01:34 -05:00
Adam Honse 20cc60c901 Fix warning in NZXTHuePlusControllerDetect.cpp 2022-09-23 17:58:13 -05:00
Adam Honse f4dd9135dc Fix warnings in LogitechProtocolCommon.cpp 2022-09-23 17:14:37 -05:00
Adam Honse f5ddbed890 Fix warning in LogitechProtocolCommon.h 2022-09-23 17:14:37 -05:00
Peter Vazny 89a6abd9ed Adds support for Lenovo Legion Y740 15" and 17" 2022-09-23 19:10:42 +00:00
Adam Honse b198a6db21 Fix warning in StrimerLConnectController.cpp 2022-09-23 12:46:00 -05:00
Adam Honse db070be161 Fix warning in RGBController_LenovoUSB.cpp 2022-09-23 12:44:53 -05:00
Adam Honse 86eb4dd2e2 Fix warnings in LianLiUniHubController.cpp 2022-09-23 12:44:07 -05:00
Adam Honse e30fdb06d1 Fix more warnings in GigabyteRGBFusion2GPUController.cpp 2022-09-23 12:42:33 -05:00
Adam Honse c4902b7476 Fix warnings in GigabyteRGBFusion2GPUController.cpp 2022-09-21 19:34:08 -05:00
Adam Honse ae350f23a4 Fix warnings in RGBController_GigabyteRGBFusion2GPU.cpp 2022-09-21 19:26:16 -05:00
Adam Honse 54b3828e52 Fix warning in GaiZhongGaiKeyboardController.cpp 2022-09-21 19:24:53 -05:00
Adam Honse 186dd2b672 Fix warning in EVGAKeyboardController.cpp 2022-09-21 19:23:48 -05:00
Adam Honse b84ca30a14 Fix warnings in CorsairPeripheralV2Controller 2022-09-21 12:42:20 -05:00
Adam Honse e51b4ce324 Fix multiply defined warnings in CorsairPeripheralV2Devices controller 2022-09-19 23:14:02 -05:00
Peter Vazny 91879cd063 2502 - adds Lenovo Legion 7 gen 5, Slim 7 gen 5 and Slim 7 gen 6 2022-09-19 16:36:20 +00:00
Tony Stipanic a876d7b120 Add support for Sapphire Radeon RX 6950 XT Nitro+ 2022-09-17 17:10:11 +00:00
Adam Honse ecdb1c8c50 Add another NZXT motherboard ID to Hue 2 controller 2022-09-16 20:31:17 -05:00
Adam Honse a82a6e96ed Fix warnings in RGBController_EVGAGPUv3.cpp 2022-09-16 12:08:11 -05:00
Adam Honse c84cf9392f Fix warning in EVGAGPUv3Controller.cpp 2022-09-16 12:07:56 -05:00
Adam Honse 48b819218d Fix warning in RGBController_EVGAGP102.cpp 2022-09-16 12:07:41 -05:00
Adam Honse 0a1306aefa Turn off explicit fallthrough warning in Linux (GCC) 2022-09-16 12:07:26 -05:00
Adam Honse 541819dd79 Fix warning in CorsairPeripheralV2Controller.cpp 2022-09-16 12:07:09 -05:00
Adam Honse c177016801 Fix multiply defined warning in CM Small ARGB Controller 2022-09-16 12:06:51 -05:00
Adam Honse de1d62cef2 Fix warning in RGBController_CorsairK100.cpp 2022-09-15 19:16:53 -05:00
Adam Honse 75104ba424 Fix error from multiply defined name across different files 2022-09-15 18:21:46 -05:00
Ryan Frankcombe 777d292c7c Initial commit for Gigabyte Super-IO motherboard controller (X570-UD) 2022-09-15 22:40:13 +00:00
Adam Honse e855e19a09 Fix warnings in RGBController_CorsairK100.cpp 2022-09-15 11:41:52 -05:00
Adam Honse 34fc9fbdee Fix warnings in RGBController_AsusAuraKeyboard.cpp 2022-09-15 11:33:08 -05:00
Adam Honse 211bc2359f Fix warning in OpenRGBNanoleafScanningThread.cpp 2022-09-15 11:27:16 -05:00
Adam Honse 219483267c Fix MacOS warning in NetworkClient.cpp 2022-09-14 23:14:55 -05:00
Adam Honse 8bf6514ae3 Fix warnings in Corsair Peripheral V2 Controller 2022-09-14 23:03:33 -05:00
Adam Honse efc9c1fa38 Fix warnings in RGBController_CMR6000Controller.cpp 2022-09-14 22:57:30 -05:00
Adam Honse b027de02a3 Fix warnings in RGBController_CMMMController.cpp and RGBController_CMMM711Controller.cpp 2022-09-14 22:53:29 -05:00
Adam Honse 4ff5e8c9cf Fix warning in ROGStrixLC_Controller.cpp 2022-09-14 22:49:37 -05:00
Adam Honse a1b3a805e4 Fix warning in AsusAuraRyuoAIOController.cpp 2022-09-14 22:46:08 -05:00
Adam Honse e9cf78cb7f Fix warning in AsusAuraMouseController.cpp 2022-09-14 22:43:29 -05:00
Adam Honse 19459edbc9 Fix warning in OpenRGBDevicePage.cpp 2022-09-14 22:38:50 -05:00
Adam Honse c0cb942ea7 Fix warning in cli.cpp 2022-09-14 22:34:30 -05:00
Shayne Hartford 7836a637b9 New Wooting PIDs 2022-09-15 01:48:07 +00:00
Mola19 15757d2736 Adjusting metadata for Asus Strix Claw to fix supported devices list 2022-09-14 01:09:48 +02:00
thombo 295adfb3e7 Support for MSI board 7D19 added and configuration for 7D15 and 7D59 corrected 2022-09-11 19:33:01 +02:00
XPRAMT f44cd6919f Added support for Traditional Chinese internationalization 2022-09-07 21:09:37 +00:00
Flora Aubry 2fc79a8e93 Add support for Sapphire Toxic 6900xt variant 2022-09-07 21:05:10 +00:00
Tiago Oliveira ae460fa10a Add device ASUS TUF RX6800 OC to GPU vendor list 2022-09-06 00:16:01 +00:00
Chris 6d7aa82b8b Adjust Razer meta data to reflect changes in commit cc1a9212b 2022-09-05 09:50:13 +10:00
Adam Honse cc1a9212b4 Update unknown type Razer devices to valid types 2022-09-04 23:23:10 +00:00
Adam Honse bbaac044df Move Razer constant data to a cpp file to fix multiple definition warnings 2022-09-04 20:44:28 +00:00
Thomas Boos e4262af2e7 Support for MSI boards 7D36 and 7D43 added, configuration for MSI board 7D09 corrected (fixes #2643 and #2711) 2022-09-04 20:24:00 +00:00
nick black 99cd322721 i2c_smbus_linux: closedir() on error path 2022-09-03 03:08:33 -04:00
Chris c69a8d15f2 Correcting regression bug in metadata caused by commit 20286c285 2022-09-02 23:31:38 +10:00
Chris c1f57477e8 Adding MSI 3090Ti Gaming X Trio 24G GPU to resolve #2717
* Added card id `0x5091` to pci_ids.h
* Registered detector in `MSIGPUControllerDetect.cpp`
* Link to [webpage](https://www.msi.com/Graphics-Card/GeForce-RTX-3090-Ti-GAMING-X-TRIO-24G)
2022-09-02 12:52:38 +10:00
SjG 4a47d33e5f Add Gainward RTX 3080 Ti Phoenix 2022-09-01 10:31:05 +00:00
Adam Honse 8dd50f4cd7 Fix error 2022-08-31 20:20:10 -05:00
Chris 9fe664ee72 Adding DEVICE_TYPE_ACCESSORY to enum
+ Adding Accessory icons for light and dark theme
+ Adding entry into OpenRGBDialog2 to display icon
+ Creating `Accessory` category in "Supported Devices"
2022-09-01 05:19:09 +00:00
Adam Honse 03d99d135c Address a bunch of warnings 2022-08-31 19:16:57 -05:00
Elchanan Haas e7c385bd71 Add support for MSI GL66 2022-09-01 03:24:51 +00:00
Matt Silva 7c227108bb Sinowealth detector: fix for rgb controller not being added when USE_HID_USAGE isn't defined 2022-09-01 03:22:30 +00:00
flora f53173c55b Add ASUS STRIX 3070 O8G OC non LHR 2022-09-01 03:21:14 +00:00
Codename-Antares 30ff0f04e6 Fix wrong Assinged Keymap ID for Apex Keyboard 2022-09-01 03:19:23 +00:00
Chris 1f6580ebc5 Fixing regression bug caused by DELIMITER change in the supported devices script
+ Adding ability to manually run "Supported Devices" job
+ Changing `Delimiter` from UTF8 to ASCII character
2022-09-01 03:14:37 +00:00
Codename-Antares ec6a19eef9 change name of StrimerLConnect 2022-09-01 03:13:47 +00:00
Niels Westphal 053a492b0a Add Gainward RTX 2080 2022-08-29 15:59:54 +00:00
crashniels 09789de591 Add ID for KFA 2080 TI EX OC 2022-08-29 01:02:30 +02:00
Thomas Boos 6d1f8967a0 Support for Corsair K55 RGB PRO XT (fixes issue #2555) 2022-08-27 19:13:42 +00:00
Chris 38dd53b945 Initial commit for the Gigabyte 3060 EAGLE OC 12G GPU
+ Register detector in GigabyteRGBFusionGPUControllerDetect.cpp
+ Link to [webpage](https://www.gigabyte.com/Graphics-Card/GV-N3060EAGLE-OC-12GD-rev-10#kf)
2022-08-27 04:29:13 +00:00
Chris 116d6c4282 Initial commit for the Sapphire 6900 XT Nitro+ GPU to resolve #2710
+ Added card id `0x440E` to pci_ids.h
+ Register detector in SapphireGPUControllerDetect.cpp
+ Link to [webpage](https://www.sapphiretech.com/en/consumer/nitro-radeon-rx-6900-xt-se-16g-gddr6)
2022-08-27 11:12:35 +10:00
Chris 09ef1689dc Adding EVGA 3090Ti FTW3 Ultra Gaming GPU
* Added card id `0x4985` to pci_ids.h
* Registered detector in `EVGAAmpereGPUControllerDetect.cpp`
* Link to [webpage](https://www.evga.com/products/product.aspx?pn=24G-P5-4985-KR)
2022-08-23 13:49:40 +00:00
Chris 8f3ed4c869 Initial commit for the ASUS Strix RTX 3070 O8G V2 White GPU to resolve #2697
+ Add id to pci_ids.h
+ Register detector in ENESMBusControllerDetect.cpp
+ Link to [webpage](https://rog.asus.com/us/graphics-cards/graphics-cards/rog-strix/rog-strix-rtx3070-o8g-white-model/)
2022-08-23 13:44:43 +00:00
Thomas Boos 8c315f5e6e Update hidapi to version 0.12.0. Direct mode stabilization of Logitech G203 Lightsync (fixes #877). 2022-08-23 13:42:15 +00:00
Chris 8fb373a851 Correct Corsair V2 peripheral Detector metadata to resolve #2690 2022-08-23 04:06:35 +00:00
Chris fe98af43ee Changing automatic Faustus udev rules to resolve #2695 2022-08-23 04:05:50 +00:00
Alexey Sokolov 1d5faef123 Fix build with latest nlohmann json lib 2022-08-23 04:05:30 +00:00
Peter Vazny 044917e2f1 Lenovo refactor - adds framework for detecting keyboard layout 2022-08-22 18:48:06 +00:00
Yanzgz 8bb77e1715 Added support for Chinese internationalization 2022-08-22 14:56:06 +00:00
Adam Honse 64199ec939 Remove SetCustomMode from GaiZhongGaiKeyboardController 2022-08-21 23:09:18 -05:00
Yanzgz 68df4d4b00 [New Device/Implements] CH551G open source keyboard (Rebase) 2022-08-22 03:26:17 +00:00
Adam Honse 389cdf340f Allow mode specific color mode for SetCustomMode 2022-08-21 22:08:23 -05:00
Adam Honse 1396cc8f92 Remove SetCustomMode from all controllers beginning with the letters V, W, Y, and Z 2022-08-21 21:37:21 -05:00
Adam Honse 9d7fef5bbc Remove SetCustomMode from all controllers beginning with the letter T 2022-08-21 21:26:41 -05:00
Adam Honse 126e5f4341 Remove SetCustomMode from all controllers beginning with the letter S 2022-08-21 19:31:01 -05:00
Adam Honse 66c856f49a Remove SetCustomMode from all controllers beginning with the letter R 2022-08-21 18:23:34 -05:00
Adam Honse 933370537d Remove SetCustomMode from all controllers beginning with the letter Q 2022-08-21 17:44:31 -05:00
Adam Honse 215183f9c5 Remove SetCustomMode from all controllers beginning with the letter P 2022-08-21 16:24:44 -05:00
Adam Honse bc1ba87e13 Remove SetCustomMode from all controllers beginning with the letter N 2022-08-21 16:04:10 -05:00
Chris 07f55095d5 Adjusting the Razer Huntsman V2 key layout to resolve #2673
* Adding `huntsman_v2_device` to device list
* Regression bug introduce with 942a842a
2022-08-18 00:20:32 +10:00
Chris 8926d29300 Initial commit for Razer Deathadder Essential V2 to resolve #2651
+ Added PID entry for the Deathadder Essential V2
+ Registered detectors
+ Added metadata to RazerDevices.h
+ Added capabilities to RazerController.cpp
+ Added `GetMaxBrightness()` to account for difference in brightness value
2022-08-15 20:08:47 +00:00
Adam Honse 3ac70cd8a6 Fix string in log 2022-08-15 15:07:33 -05:00
Chris 3a71b76075 Initial commit for the Corsair MM700 to resolve #1718
+ Adding CorsairPeripheralV2Controller base class
+ Adding CorsairPeripheralV2Devices.h metadata file
+ Renaming CorsairK55RGBPROController to CorsairPeripheralV2SWController
+ Adjusting CorsairPeripheralV2SWController to accomodate base class changes
+ Renaming RGBController_CorsairK55RGBPRO to RGBController_CorsairV2SW
+ Adjusting RGBController_CorsairV2SW to handle device set up from meta data
+ Adding PID `0x1B9B` and registering detector in CorsairPeripheralV2ControllerDetect.cpp
2022-08-15 12:43:49 +10:00
Adam Honse 9caf7802ed Remove SetCustomMode from all controllers beginning with the letter M 2022-08-14 18:49:41 -05:00
Mike C 69f916c389 Add Support for Asus ROG Strix XG27W Gaming Monitor 2022-08-14 23:26:08 +00:00
Adam Honse 6f1e76c8b1 Remove SetCustomMode from all controllers beginning with the letter L 2022-08-14 13:24:38 -05:00
Adam Honse b6b59db12f Remove SetCustomMode from all controllers beginning with the letter K 2022-08-14 13:08:43 -05:00
Christopher Wróbel 10f9bf4441 Add missing german translation for settings 2022-08-14 17:19:51 +00:00
Adam Honse 35e049a8bb Remove SetCustomMode from all controllers beginning with the letter H 2022-08-14 01:55:19 -05:00
Adam Honse 94603fbfb9 Remove SetCustomMode from all controllers beginning with the letters F and G 2022-08-14 01:44:30 -05:00
TheRogueZeta 27d1831035 Initial commit for EVGA 3080 FTW3 12GB Hydro Copper 2022-08-12 00:19:22 -07:00
Adam Honse 859f15a5b4 Remove SetCustomMode from all controllers beginning with the letter E 2022-08-11 20:18:45 -05:00
Adam Honse 100e6ddb2a Remove SetCustomMode from all controllers beginning with the letter D 2022-08-10 16:04:23 -05:00
Adam Honse f8916f2bcb Remove SetCustomMode from all controllers beginning with the letters B and C, except Cooler Master 2022-08-10 09:52:38 -05:00
Adam Honse eab96d1b36 Remove SetCustomMode from all controllers beginning with the letter A 2022-08-09 22:58:40 -05:00
Adam Honse 58b1a29076 Remove SetCustomMode from some controllers (the ones in my PC) 2022-08-09 21:07:22 -05:00
Adam Honse afb975e5fc Add generic implementation of SetCustomMode to RGBController class 2022-08-09 20:49:38 -05:00
Adam Honse 3af17b6d8e Apply changes from \!1275 code review 2022-08-09 19:06:51 -05:00
Shaun McThomas 8b02484456 Create "Direct" Mode for ASRock Polychrome USB device. 2022-08-09 23:59:04 +00:00
Chris 6292ee1664 Initial commit for the Cougar 700K EVO Keyboard to resolve #2310
* Adding entry for the Cougar 700K EVO VID & PID
* Registered detectors
* Creating CougarKeyboardController class
* Creating RGBController_CougarKeyboard class
2022-08-09 18:43:18 +00:00
Chris cac67592b7 Correcting the metadata for the Logitech x56 HOTAS to resolve #2574
* Changing detector to IPU to remove duplicate detection
+ Adding Save() method to controller
+ Adding Brightness
2022-08-09 18:24:12 +00:00
Chris 4f649795b3 Fixing regression to the DetectCoolerMasterMouse callback made in f33fc268
* Changed the `if` to a `switch case` to correct the MM720 triggering the callback but not creating a controller.
* Code cleanup and readability changes.
* Related to !1116
2022-08-09 20:58:22 +10:00
Mola19 f637d64dcb Support for Asus Strix Claw 2022-08-08 15:06:53 +00:00
Chris f1860bf742 Initial commit for Razer Naga Classic to resolve #2646
+ Adding PID entry for the Naga Classic
+ Registered detectors
+ Added metadata to RazerDevices.h
+ Added capabilities to RazerController.cpp
2022-08-08 23:28:30 +10:00
MOVZX b1f560d28d Add support for MSI Radeon RX 6900/6950 XT Gaming X Trio 2022-08-08 02:27:13 +00:00
Chris 1c1bfee727 Initial commit for the Asus ROG Strix SCAR 15 to resolve #2622
+ Adding AsusAuraCoreLaptopController and RGBController_AsusAuraCoreLaptop
+ Adding PID `0x19B6` and registering detector in AsusAuraCoreControllerDetect.cpp
2022-08-08 09:38:10 +10:00
Chris 4d7fe885c9 Adding a name to the LIFX controller 2022-08-08 02:02:43 +10:00
Chris 223ec45a75 Adding Laptop Stand Chroma Device to razer device list. 2022-08-06 19:56:48 +00:00
Chris 95f7cc1010 Initial commit for 3 versions of the Gigabyte 3060 Vision OC 12G GPU to resolve #2393
+ Add id to pci_ids.h
+ Register detector in GigabyteRGBFusionGPUControllerDetect.cpp
+ Link to [webpage](https://www.gigabyte.com/Graphics-Card/GV-N3060VISION-OC-12GD-rev-20)
2022-08-06 19:43:32 +00:00
Chris be4c4bfabe Adjusting Blackwidow V3 key map layout to resolve #2583 2022-08-06 19:42:35 +00:00
MOVZX ecdad8c3de Add support for MSI Radeon RX 6700 XT Gaming X & MSI Radeon RX 6800 XT Gaming X Trio 2022-08-06 19:40:43 +00:00
morg 551c30e6e6 Add support for PNY GeForce RTX 3080 10GB XLR8 Gaming REVEL EPIC-X RGB 2022-08-03 14:38:56 +00:00
reklrekl f46d86303c Add ISO keycodes 0x32 and 0x64 to QMK controller 2022-08-03 14:38:12 +00:00
Vladimir fef0bfe3bd Switched from C-style arrays to std::vector to fix C++17 std::size() not being available on some Linux dists to fix !1343 build failures 2022-08-03 02:14:27 +00:00
Chris 102d7cecef Initial commit for Razer Laptop Stand Chroma to resolve #2638
+ Adding PID entry for the Laptop Stand Chroma
+ Registered detectors
+ Added metadata to RazerDevices.h
+ Added capabilities to RazerController.cpp
2022-08-02 21:05:03 +00:00
Chris 864422b4bc Fixing regression from 942a842a
+ Adding ZONE_EN_KEYBOARD constant char* to KeyNames
+ Replacing declarations of "Keyboard" zone with new constant char*
+ Adding "Keyboard" zone check RGBController_Razer.cpp before hiding keys
2022-08-02 21:03:28 +00:00
edbgon 2fae06a49a Add HID to Logitech Lightspeed location string so that profile loading is successful. 2022-08-02 16:25:54 +02:00
morg 5ad475befe Add support for PNY GeForce RTX 3060 Ti XLR8 variant 2022-08-01 10:23:13 +02:00
Vladimir 153c1579b5 Fix RGBController_MSIGPU's interaction with mode speed and brightness values to resolve #2637 2022-07-31 06:55:00 +00:00
Min Gu Kang f511ceac14 Initial commit for Glorious Model D Wireless 2022-07-31 06:53:33 +00:00
Carter Miller d918917c73 Removing some duplicated code and comments from NvAPI Illumination Controller, likely result of some git issue (my fault) during original merge 2022-07-31 06:52:54 +00:00
cmill f5f4040f58 Added support line for GA104 version of PNY 3060 XLR8 Revel Epic-x 2022-07-31 02:10:10 +00:00
Chris 306d9cc8ea Initial commit for the Gigabyte RTX 3070 Vision OC 8G LHR GPU to resolve #2639
+ Add id to pci_ids.h
+ Register detector in GigabyteRGBFusionGPUControllerDetect.cpp
+ Link to [webpage](https://www.gigabyte.com/Graphics-Card/GV-N3070VISION-OC-8GD-rev-20#kf)
2022-07-30 17:25:55 +10:00
Chris 6b55bbc8aa Adding MSI 6600XT Gaming X 8G GPU to resolve #2384
* Added card id `0x5020` to pci_ids.h
* Registered detector in `MSIGPUControllerDetect.cpp`
* Link to [webpage](https://www.msi.com/Graphics-Card/Radeon-RX-6600-XT-GAMING-X-8G)
2022-07-29 11:58:31 +10:00
Chris 20286c285d Improving targeted detection for the Das 4Q Keyboard to resolve #2633
+ Changing to IPU detector to accurately detect keyboard first time
* Avoiding errors by adding new detector callback function
2022-07-28 17:15:38 +00:00
Vladimir c7881890d0 Initial commit for the MSI RTX 3090 Ti Suprim X 24G to resolve #2409 2022-07-28 11:46:43 +03:00
Matt Silva 773fac2240 Initial commit for Glorious Model O Wireless - Sinowealth 2022-07-27 04:03:45 +00:00
Chris 5991d566c2 Initial commit for the Gigabyte RTX 3060Ti Vision OC 8G GPU to resolve #2627
+ Add id to pci_ids.h
+ Register detector in GigabyteRGBFusionGPUControllerDetect.cpp
+ Link to [webpage](https://www.gigabyte.com/Graphics-Card/GV-N306TVISION-OC-8GD-rev-20#kf)
2022-07-27 12:33:56 +10:00
Chris 40bcddf569 Adding the Gigabyte Z370 AORUS Ultra Gaming-CF to resolve #2623 2022-07-27 01:32:44 +00:00
Chris fa84a587b5 Changing detector type for NVidia Illumination GPUs to resolve #2617
+ Switching the detector registration to allow enabling / disabling.
2022-07-26 23:33:29 +10:00
Chris 148f69b929 Initial commit for the Gigabyte Aorus 2080 XTREME 8G GPU to resolve #2615
+ Add id to pci_ids.h
+ Register detector in GigabyteRGBFusion2GPUControllerDetect.cpp
+ Link to [webpage](https://www.gigabyte.com/Graphics-Card/GV-N2080AORUS-X-8GC#kf)
2022-07-25 20:31:48 +10:00
Adam Honse b6af69cd50 Remove Ubuntu 21.10 test 2022-07-24 16:47:58 -05:00
Adam Honse c6c9bd9f24 Fix race condition crash in SRGBmodsPicoController 2022-07-24 16:10:43 -05:00
Chris a0f9e4ed01 Initial commit for the AMD RX 6900 XT reference GPU to resolve #2612
+ Adding USB PID `0x015B` to the existing controller.
+ Adding missing colour modes `Rainbow Wave`, `Swirl`, `Chase` and `Bounce`
2022-07-25 03:33:50 +10:00
thombo 20c50ba367 Support for MSI boards 7D18 and 7D51 added 2022-07-23 17:39:55 +00:00
Chris 462da9663f Adding the GA104 variant of the MSI 3060 Gaming X 12G GPU to resolve #2613
* Related to !1317
* Registered detector in `MSIGPUControllerDetect.cpp`
2022-07-23 10:04:47 +10:00
Chris 942a842a32 Hiding non-keys from Razer keymaps
+ Setting matrix map key value if not found in defined layout
+ Correcting layout for `blackwidow_chroma_te_keymap` to include missing keys
2022-07-23 01:51:50 +10:00
Adam Honse 16effbe35b Initial support for SRGBmods Raspberry Pi Pico LED Controller 2022-07-22 03:23:31 +00:00
Chris 3f03e4b550 Initial commit for Razer Blade 15 Base 2021 V2 to resolve #2599
+ Adding entry for the Blade 15 Base V2
+ Registered detectors
+ Added metadata to RazerDevices.h
+ Added capabilities to RazerController.cpp
2022-07-22 09:04:07 +10:00
Chris 9147e65963 Adding en_AU and en_GB locales to resolve #2500
* Adjusted main.cpp to accomodate the full locale name
2022-07-21 13:37:10 +10:00
flora fd4db35940 Add support for Sapphire RX6900XT Toxic Limited Edition 2022-07-20 16:57:00 +00:00
Chris 40ed7bdf83 Initial commit for the Lian Li Strimer L Connect to resolve #2563
+ Adding StrimerLConnectController
+ Adding RGBController_StrimerLConnect
+ Adding ENEUSBControllersDetect.cpp to register StrimerLConnect detector
2022-07-21 00:14:58 +10:00
Adam Honse 75711744e7 Use 16-LED linear layout for Blade Stealth Late 2020 2022-07-20 13:03:13 +00:00
Chris b1b07db406 Adding MSI 3060 Gaming X 12G GPU to resolve #2610
* Added card id `0x3976` to pci_ids.h
* Registered detector in `MSIGPUControllerDetect.cpp`
* Link to [webpage](https://www.msi.com/Graphics-Card/GeForce-RTX-3060-GAMING-X-12G)
2022-07-20 04:44:48 +00:00
Chris c479a06312 Adding qt5-linguist to Fedora build dependencies 2022-07-20 14:34:13 +10:00
Chris d33c410ea6 Adding new receiver for the Logitech G915 Wireless Keyboard
+ Adding new PID `0xC547`
+ Registering detector in LogitechControllerDetect.cpp
2022-07-19 20:06:40 +00:00
Adam Honse ced081d168 Fix more warnings 2022-07-19 00:48:35 -05:00
Adam Honse bf6ae63ae6 Fix some Windows build warnings 2022-07-18 20:46:13 -05:00
morg c0851f3b1e Add support for Cooler Master Addressable Gen 2 RGB LED Controller A1. Closes #2256 2022-07-18 23:58:44 +00:00
Adam Honse bba7fa9fd2 Fix a bunch of compiler warnings 2022-07-17 22:33:20 -05:00
flora be10133bce removed dualsense detect.h from .pro 2022-07-18 02:43:44 +00:00
Chris d6cc7ff984 Adding MSI 3080 SUPRIM X 12G LHR GPU to resolve #2602
* Registered detector in `MSIGPUControllerDetect.cpp`
* Link to [webpage](https://www.msi.com/Graphics-Card/GeForce-RTX-3080-SUPRIM-X-12G-LHR)
2022-07-18 02:43:17 +00:00
B Horn a54f03e199 Fixing MacOS / Clang builds 2022-07-18 02:32:28 +00:00
B Horn 640eb7905c SDK Listening Options 2022-07-17 20:30:15 +00:00
Chris M 241ea0a8ef Adding ability to load profile on GUI shutdown to resolve #1694 2022-07-17 05:48:49 +00:00
thombo f737ef1214 Support for MSI boards 7D08, 7D30 and 7D59 added, some configurations corrected 2022-07-15 19:19:07 +02:00
Chris 6aff7254b7 Change Non-Mainline pipelines to be manually triggered 2022-07-15 23:48:38 +10:00
morg ea24729808 Add bookworm and ubuntu jammy builds and tests 2022-07-15 13:33:21 +00:00
TheRogueZeta c8ce5dc973 Rework and fix Polychrome v1 controller 2022-07-15 00:10:10 +00:00
TheRogueZeta ce9895412a Initial commit for ASUS ROG Strix LC 3080TI O12G Gaming 2022-07-14 01:34:27 +00:00
Thomas Karl Pietrowski a9d67cd10f debian: Adding qttools5-dev-tools to build deps 2022-07-14 01:32:39 +00:00
Aytaç Kayadelen 75527b3989 Change Aurora Link to New Repository 2022-07-14 01:31:32 +00:00
Chris 554bbb65b3 Adding EVGA 3080 FTW3 Ultra Hybrid Gaming LHR GPU to resolve #2589
* Added card id `0x4878` to pci_ids.h
* Registered detector in `EVGAAmpereGPUControllerDetect.cpp`
* Link to [webpage](https://www.evga.com/products/product.aspx?pn=12G-P5-4878-KL)
2022-07-13 02:35:17 +00:00
HorrorTroll 3217bd7ceb Fixed some issues of new QMK Protocol 2022-07-12 21:29:23 +07:00
547 changed files with 32744 additions and 12140 deletions
+160 -5
View File
@@ -51,6 +51,9 @@ before_script:
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (AppImage) 32-bit Build Target #
@@ -71,6 +74,13 @@ before_script:
- README.md
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (AppImage) 64-bit Build Target #
#-----------------------------------------------------------------------#
@@ -111,6 +121,13 @@ before_script:
- openrgb-dbgsym*.deb
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.deb) Debian Buster (Legacy) 64-bit Build Target #
#-----------------------------------------------------------------------#
@@ -132,6 +149,13 @@ before_script:
- openrgb-dbgsym*.deb
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bullseye 32-bit Build Target #
#-----------------------------------------------------------------------#
@@ -153,6 +177,13 @@ before_script:
- openrgb-dbgsym*.deb
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bullseye 64-bit Build Target #
#-----------------------------------------------------------------------#
@@ -174,6 +205,69 @@ before_script:
- openrgb-dbgsym*.deb
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bookworm 32-bit Build Target #
#-----------------------------------------------------------------------#
"Linux 32 .deb (Debian Bookworm)":
<<: *ccache_init
image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-32
stage: build
script:
- dpkg-architecture -l
- dpkg-buildpackage --target-arch i386 -us -B
- rm -v ../openrgb-dbgsym*.deb
- mv -v ../openrgb*.deb ./
artifacts:
name: "${CI_PROJECT_NAME}_Linux_32_deb_${CI_COMMIT_SHORT_SHA}"
paths:
- openrgb*.deb
exclude:
- openrgb-dbgsym*.deb
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.deb) Debian Bookworm 64-bit Build Target #
#-----------------------------------------------------------------------#
"Linux 64 .deb (Debian Bookworm)":
<<: *ccache_init
image: registry.gitlab.com/openrgbdevelopers/openrgb-linux-ci-deb-builder:bookworm-64
stage: build
script:
- dpkg-architecture -l
- dpkg-buildpackage -us -B
- rm -v ../openrgb-dbgsym*.deb
- mv -v ../openrgb*.deb ./
artifacts:
name: "${CI_PROJECT_NAME}_Linux_64_deb_${CI_COMMIT_SHORT_SHA}"
paths:
- openrgb*.deb
exclude:
- openrgb-dbgsym*.deb
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.rpm, f35) 64-bit Build Target #
#-----------------------------------------------------------------------#
@@ -201,6 +295,13 @@ before_script:
- openrgb*.rpm
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Linux (.rpm, f36) 64-bit Build Target #
#-----------------------------------------------------------------------#
@@ -228,6 +329,13 @@ before_script:
- openrgb*.rpm
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Debian 32 Buster test #
#-----------------------------------------------------------------------#
@@ -296,6 +404,40 @@ before_script:
needs:
- "Linux 64 .deb (Debian Bullseye)"
#-----------------------------------------------------------------------#
# Debian 32 Bookworm test #
#-----------------------------------------------------------------------#
"Debian 32 Bookworm":
image: i386/debian:bookworm
stage: test
script:
- apt update
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*i386.deb
- openrgb --version
- openrgb -l
- apt remove -y openrgb
dependencies:
- "Linux 32 .deb (Debian Bookworm)"
needs:
- "Linux 32 .deb (Debian Bookworm)"
#-----------------------------------------------------------------------#
# Debian 64 Bookworm test #
#-----------------------------------------------------------------------#
"Debian 64 Bookworm":
image: amd64/debian:bookworm
stage: test
script:
- apt update
- DEBIAN_FRONTEND=noninteractive apt install -yq --no-install-recommends ./openrgb*amd64.deb
- openrgb --version
- openrgb -l
- apt remove -y openrgb
dependencies:
- "Linux 64 .deb (Debian Bookworm)"
needs:
- "Linux 64 .deb (Debian Bookworm)"
#-----------------------------------------------------------------------#
# Ubuntu 64 20.04LTS test #
#-----------------------------------------------------------------------#
@@ -314,10 +456,10 @@ before_script:
- "Linux 64 .deb (Debian Buster)"
#-----------------------------------------------------------------------#
# Ubuntu 64 21.10 test #
# Ubuntu 64 22.04 test #
#-----------------------------------------------------------------------#
"Ubuntu 64 21.10":
image: ubuntu:impish
"Ubuntu 64 22.04LTS":
image: ubuntu:jammy
stage: test
script:
- apt update
@@ -326,9 +468,9 @@ before_script:
- openrgb -l
- apt remove -y openrgb
dependencies:
- "Linux 64 .deb (Debian Bullseye)"
- "Linux 64 .deb (Debian Bookworm)"
needs:
- "Linux 64 .deb (Debian Bullseye)"
- "Linux 64 .deb (Debian Bookworm)"
#-----------------------------------------------------------------------#
# Fedora 64 v35 test #
@@ -435,6 +577,13 @@ before_script:
- 'OpenRGB Windows 32-bit'
expire_in: 30 days
rules:
- if: '$CI_PROJECT_PATH == "CalcProgrammer1/OpenRGB"'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
#-----------------------------------------------------------------------#
# Windows (64-bit) Build Target #
#-----------------------------------------------------------------------#
@@ -532,6 +681,9 @@ before_script:
when: on_success
- if: '$BUILD_MACOS =~ /.+/'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
"MacOS Intel":
tags:
@@ -554,3 +706,6 @@ before_script:
when: on_success
- if: '$BUILD_MACOS =~ /.+/'
when: on_success
- if: $CI_PIPELINE_SOURCE == "push"
when: manual
allow_failure: true
+7 -5
View File
@@ -10,8 +10,8 @@ CODEOWNERS @Calcprogrammer1
#-----------------------------------------------------------------------------#
[Controllers]
/Controllers/AMDWraithPrismController/
/Controllers/ASRockPolychromeSMBusController/
/Controllers/ASRockPolychromeUSBController/
/Controllers/ASRockSMBusController/
/Controllers/AlienwareController/
/Controllers/AlienwareKeyboardController/
/Controllers/AnnePro2Controller/
@@ -40,8 +40,8 @@ CODEOWNERS @Calcprogrammer1
/Controllers/EKController/ @Dr_No
/Controllers/ENESMBusController/
/Controllers/EVGAAmpereGPUController/ @TheRogueZeta
/Controllers/EVGAGP102GPUController/
/Controllers/EVGAPascalGPUController/
/Controllers/EVGAGP102GPUController/
/Controllers/EVGAPascalGPUController/
/Controllers/EVGATuringGPUController/ @TheRogueZeta
/Controllers/EVGAUSBController/ @Dr_No
/Controllers/EVisionKeyboardController/
@@ -102,5 +102,7 @@ CODEOWNERS @Calcprogrammer1
# that is an exception to the above should be explicitly named here #
#-----------------------------------------------------------------------------#
[Controllers]
/Controllers/ASRockPolychromeSMBusController/ASRockPolychromeSMBusController.cpp @TheRogueZeta
/Controllers/ASRockPolychromeSMBusController/ASRockPolychromeSMBusController.h @TheRogueZeta
/Controllers/ASRockSMBusController/ASRockPolychromeV1SMBusController.cpp @TheRogueZeta
/Controllers/ASRockSMBusController/ASRockPolychromeV1SMBusController.h @TheRogueZeta
/Controllers/ASRockSMBusController/RGBController_ASRockPolychromeV1SMBus.cpp @TheRogueZeta
/Controllers/ASRockSMBusController/RGBController_ASRockPolychromeV1SMBus.h @TheRogueZeta
+10
View File
@@ -12,6 +12,16 @@ To create a merge request, log into GitLab and fork the OpenRGB project. Push y
* Follow the Style Guidelines below when making your code changes.
* Avoid using `git merge` when updating your fork. The OpenRGB project uses a linear git history, meaning all changes are rebased onto the tip of master. By using `git rebase` to update your fork, you will make it easier to accept merge requests.
### Pipelines, Shared Runners and Quotas
Since mid 2022 Gitlab has limited the usage of shared runners to all projects and whilst quite geneorous quotas are allowed
for open source projects it is possible to exhaust them. With that in mind not all jobs within the pipeline build are
triggered to automatically run with every push to your branch with the exception of the Windows 64bit and Linux Appimage 64bit
jobs. If you need to test or share another build you can still start it manually from your pipeline queue.
Once a merge request is created all architectures and platforms will be compiled to ensure that they are ready to merge.
Please refer to the following link for [further information relating to minutes and quotas](https://docs.gitlab.com/ee/ci/pipelines/cicd_minutes.html).
## Style Guidelines
OpenRGB is written in C++, uses the Qt framework for UI, and uses the QMake build system. While OpenRGB does use C++, I am primarily a C programmer and prefer doing things "C Style" vs. C++ style. C++'s object oriented programming features fit the needs of a program such as OpenRGB where there are many implementations of a single interface so I chose to write it in C++ over C. Still, however, I prefer using C-style code where possible. When making changes to existing code files, try to follow the existing style. Merge requests that go out of their way to restyle code will not be accepted and will be sent back for rework.
@@ -168,11 +168,6 @@ void RGBController_BloodyMouse::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_BloodyMouse::SetCustomMode()
{
active_mode = 0;
}
void RGBController_BloodyMouse::DeviceUpdateMode()
{
/*---------------------------------------------------------*\
@@ -34,7 +34,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -236,11 +236,6 @@ void RGBController_AMDWraithPrism::UpdateSingleLED(int led)
UpdateZoneLEDs(led);
}
void RGBController_AMDWraithPrism::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AMDWraithPrism::DeviceUpdateMode()
{
bool random = (modes[active_mode].color_mode == MODE_COLORS_RANDOM);
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -20,6 +20,18 @@
#define POLYCHROME_USB_INIT 0xA4
#define POLYCHROME_USB_COMMIT 0x12
const char* polychrome_USB_zone_names[] =
{
"RGB LED 1 Header",
"RGB LED 2 Header",
"Addressable Header 1",
"Addressable Header 2",
"PCH",
"IO Cover",
"PCB",
"Audio",
};
PolychromeUSBController::PolychromeUSBController(hid_device* dev_handle, const char* path)
{
DMIInfo dmi;
@@ -165,6 +177,41 @@ void PolychromeUSBController::WriteZone
hid_read(dev, usb_buf, 64);
};
void PolychromeUSBController::WriteAllZones
(
const std::vector<PolychromeZoneInfo>& zones_info,
const std::vector<zone>& zones
)
{
unsigned char usb_buf[65];
/*-----------------------------------------------------*\
| Zero out buffer |
\*-----------------------------------------------------*/
memset(usb_buf, 0x00, sizeof(usb_buf));
/*-----------------------------------------------------*\
| Set up message packet with leading 00 |
\*-----------------------------------------------------*/
usb_buf[0x01] = POLYCHROME_USB_SET_ZONE;
usb_buf[0x03] = 0x07;
usb_buf[0x04] = zones_info[0].mode;
usb_buf[0x04] = 0xE2;
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
usb_buf[0x05 + (3 * zone_idx) ] = RGBGetRValue(zones[zone_idx].colors[0]);
usb_buf[0x05 + (3 * zone_idx) + 1] = RGBGetGValue(zones[zone_idx].colors[0]);
usb_buf[0x05 + (3 * zone_idx) + 2] = RGBGetBValue(zones[zone_idx].colors[0]);
}
/*-----------------------------------------------------*\
| Send packet |
\*-----------------------------------------------------*/
hid_write(dev, usb_buf, 65);
hid_read(dev, usb_buf, 64);
}
void PolychromeUSBController::WriteRGSwap
(
bool ahdr1,
@@ -262,7 +309,7 @@ PolychromeZoneInfo PolychromeUSBController::GetZoneConfig(unsigned char zone)
g = usb_buf[0x06];
b = usb_buf[0x07];
zoneinfo.mode = usb_buf[0x04];
zoneinfo.mode = usb_buf[0x04] != 0xE2 ? usb_buf[0x04] : 0x0F;
zoneinfo.color = ToRGBColor(r,g,b);
zoneinfo.speed = usb_buf[0x08];
zoneinfo.zone = usb_buf[0x03];
@@ -16,7 +16,7 @@
/*----------------------------------------------------------------------------------------------*\
| Definitions for Polychrome USB |
\*----------------------------------------------------------------------------------------------*/
#define POLYCHROME_USB_NUM_MODES 15 /* Number of Polychrome USB modes */
#define POLYCHROME_USB_NUM_MODES 16 /* Number of Polychrome USB modes */
enum
{
@@ -35,6 +35,7 @@ enum
POLYCHROME_USB_MODE_NEON = 0x0C, /* Neon effect mode */
POLYCHROME_USB_MODE_WATER = 0x0D, /* Water effect mode */
POLYCHROME_USB_MODE_RAINBOW = 0x0E, /* Rainbow effect mode */
POLYCHROME_USB_MODE_DIRECT = 0x0F, /* CHROMA CONNECT effect mode */
};
enum
@@ -57,17 +58,7 @@ enum
POLYCHROME_USB_ZONE_UNAVAILABLE = 0x1E, // Value from LEDCOUNT CFG if zone not present
};
static const char* polychrome_USB_zone_names[] =
{
"RGB LED 1 Header",
"RGB LED 2 Header",
"Addressable Header 1",
"Addressable Header 2",
"PCH",
"IO Cover",
"PCB",
"Audio",
};
extern const char* polychrome_USB_zone_names[];
enum
{
@@ -127,6 +118,12 @@ public:
bool allzone
);
void WriteAllZones
(
const std::vector<PolychromeZoneInfo> &zones_info,
const std::vector<zone> &zones
);
void WriteHeader
(
unsigned char cfg,
@@ -173,6 +173,13 @@ RGBController_PolychromeUSB::RGBController_PolychromeUSB(PolychromeUSBController
Rainbow.color_mode = MODE_COLORS_NONE;
modes.push_back(Rainbow);
mode Direct;
Direct.name = "Direct";
Direct.value = POLYCHROME_USB_MODE_DIRECT;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
SetupZones();
/*-------------------------------------------------*\
@@ -276,6 +283,11 @@ void RGBController_PolychromeUSB::ResizeZone(int zone, int new_size)
void RGBController_PolychromeUSB::DeviceUpdateLEDs()
{
if(POLYCHROME_USB_MODE_DIRECT == zones_info[0].mode )
{
controller->WriteAllZones(zones_info,zones);
return;
}
for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
unsigned char set_mode = zones_info[zone_idx].mode;
@@ -324,11 +336,6 @@ unsigned char RGBController_PolychromeUSB::GetDeviceMode(unsigned char zone)
return(active_mode);
}
void RGBController_PolychromeUSB::SetCustomMode()
{
active_mode = POLYCHROME_USB_MODE_STATIC;
}
void RGBController_PolychromeUSB::DeviceUpdateMode()
{
for(unsigned int zone_idx = 0; zone_idx < zones.size(); zone_idx++)
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -22,7 +22,6 @@ ASRockPolychromeV1SMBusController::ASRockPolychromeV1SMBusController(i2c_smbus_i
this->dev = dev;
DMIInfo dmi;
device_name = "ASRock " + dmi.getMainboard();
ReadLEDConfiguration();
@@ -62,9 +61,9 @@ void ASRockPolychromeV1SMBusController::ReadLEDConfiguration()
| The LED configuration register holds 6 bytes, so the first read should return 6 |
| If not, set all zone sizes to zero |
\*---------------------------------------------------------------------------------*/
LOG_DEBUG("[%s] Reading LED config from controller", device_name.c_str());
LOG_DEBUG("[%s] Reading Zone sizes from controller", device_name.c_str());
uint8_t asrock_zone_count[I2C_SMBUS_BLOCK_MAX] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
if (bus->i2c_smbus_read_block_data(dev, POLYCHROME_V1_REG_LED_CONFIG, asrock_zone_count) == 0x06)
if (bus->i2c_smbus_read_block_data(dev, POLYCHROME_V1_REG_ZONE_SIZE, asrock_zone_count) == 0x06)
{
zone_led_count[POLYCHROME_V1_ZONE_1] = asrock_zone_count[0];
zone_led_count[POLYCHROME_V1_ZONE_2] = asrock_zone_count[1];
@@ -86,27 +85,156 @@ void ASRockPolychromeV1SMBusController::ReadLEDConfiguration()
}
}
uint8_t ASRockPolychromeV1SMBusController::GetMode()
uint8_t ASRockPolychromeV1SMBusController::GetARGBColorOrder()
{
return(active_mode);
uint8_t temp[1] = { 0x00 };
LOG_TRACE("[%s] Reading ARGB color order config from the controller", device_name.c_str());
//Read the data
if(bus->i2c_smbus_read_block_data(dev, POLYCHROME_V1_REG_ARGB_GRB, temp) == 0x01)
{
if(temp[0] == 1)
{
LOG_DEBUG("[%s] Color order is GRB for the ARGB header", device_name.c_str());
}
else
{
LOG_DEBUG("[%s] Color order is RGB for the ARGB header", device_name.c_str());
}
return temp[0];
}
else
{
return 0;
}
}
void ASRockPolychromeV1SMBusController::SetColorsAndSpeed(uint8_t led, uint8_t red, uint8_t green, uint8_t blue)
RGBColor ASRockPolychromeV1SMBusController::GetZoneColor(uint8_t zone)
{
uint8_t color_speed_pkt[4] = { red, green, blue, active_speed };
uint8_t select_led_pkt[1] = { led };
LOG_TRACE("[%s] Reading color from zone %02d", device_name.c_str(), zone);
return zone_config[zone].color;
}
uint8_t ASRockPolychromeV1SMBusController::GetZoneMode(uint8_t zone)
{
LOG_TRACE("[%s] Retreving mode %02X from zone_modes for zone %02d", device_name.c_str(), zone_config[zone].mode, zone);
return(zone_config[zone].mode);
}
void ASRockPolychromeV1SMBusController::LoadZoneConfig()
{
uint8_t zone[1] = { 0x00 };
uint8_t mode[1] = { 0xFF };
uint8_t color_speed_pkt[4] = { 0, 0, 0, 0 };
LOG_TRACE("[%s] Reading modes from all zones", device_name.c_str());
//Polychrome v1 supports per zone modes so we need to set the zone before we can read the mode.
//Write the zone index.
for(uint8_t zone_idx = 0 ; zone_idx < POLYCHROME_V1_ZONE_COUNT; zone_idx ++)
{
if(zone_led_count[zone_idx] > 0)
{
zone[0] = zone_idx;
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_ZONE_SELECT, 1, zone);
//Read the data back.
if(bus->i2c_smbus_read_block_data(dev, POLYCHROME_V1_REG_ZONE_SELECT, zone) == 0x01)
{
//Validate that we changed correctly.
if(zone[0] == zone_idx)
{
//Read the mode for the zone.
if(bus->i2c_smbus_read_block_data(dev, POLYCHROME_V1_REG_MODE, mode) == 0x01)
{
LOG_DEBUG("[%s] Mode 0x%02x for zone %02d", device_name.c_str(), mode[0], zone_idx);
zone_config[zone_idx].mode = mode[0];
bus->i2c_smbus_read_block_data(dev, zone_config[zone_idx].mode, color_speed_pkt);
zone_config[zone_idx].color = color_speed_pkt[0] << 16 | color_speed_pkt[1] << 8 | color_speed_pkt[2];
zone_config[zone_idx].speed = color_speed_pkt [3];
LOG_TRACE("[%s] Mode config: %06X, %02X", device_name.c_str(), zone_config[zone_idx].color, zone_config[zone_idx].speed );
}
}
else
{
LOG_WARNING("[%s] Zone mode register failed to change!", device_name.c_str() );
}
}
}
else
{
zone_config[zone_idx].mode = 0;
zone_config[zone_idx].color = 0;
zone_config[zone_idx].speed = 0;
}
}
}
void ASRockPolychromeV1SMBusController::SetARGBColorOrder(bool value)
{
uint8_t temp[1] = { 0x00 };
LOG_TRACE("[%s] Setting ARGB color order config to the controller", device_name.c_str());
temp[0] = (value) ? 0x01 : 0x00;
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_ARGB_GRB, 1, temp);
GetARGBColorOrder();
}
bool ASRockPolychromeV1SMBusController::SetARGBSize(uint8_t new_size)
{
LOG_DEBUG("[%s] Setting ARGB header to %02d.", device_name.c_str(), new_size);
uint8_t asrock_zone_count[6] = { 0x0 };
uint8_t new_asrock_zone_count[6] = { 0x0 };
//memcpy(new_asrock_zone_count, zone_led_count, sizeof(new_asrock_zone_count - 1));
new_asrock_zone_count[POLYCHROME_V1_ZONE_1] = zone_led_count[POLYCHROME_V1_ZONE_1];
new_asrock_zone_count[POLYCHROME_V1_ZONE_2] = zone_led_count[POLYCHROME_V1_ZONE_2];
new_asrock_zone_count[POLYCHROME_V1_ZONE_3] = zone_led_count[POLYCHROME_V1_ZONE_3];
new_asrock_zone_count[POLYCHROME_V1_ZONE_4] = zone_led_count[POLYCHROME_V1_ZONE_4];
new_asrock_zone_count[POLYCHROME_V1_ZONE_5] = zone_led_count[POLYCHROME_V1_ZONE_5];
new_asrock_zone_count[POLYCHROME_V1_ZONE_ADDRESSABLE] = new_size;
//Write the new config to the register
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_ZONE_SIZE, 6, new_asrock_zone_count);
//Validate the write
if (bus->i2c_smbus_read_block_data(dev, POLYCHROME_V1_REG_ZONE_SIZE, asrock_zone_count) == 0x06)
{
for (uint8_t i = 0; i < 6; i++)
{
if (new_asrock_zone_count[i] != asrock_zone_count[i])
{
LOG_WARNING("[%s] Failed to validate zone %02d size!", device_name.c_str(), i);
return false;
}
}
LOG_DEBUG("[%s] Zone configuration validation completed.", device_name.c_str());
return true;
}
return false;
}
void ASRockPolychromeV1SMBusController::SetColorsAndSpeed(uint8_t zone, uint8_t red, uint8_t green, uint8_t blue)
{
LOG_TRACE("[%s] Updating color and speed for zone %02d: 0x%06X", device_name.c_str(), zone, (red << 16 | green << 8 | blue));
uint8_t color_speed_pkt[4] = { red, green, blue, zone_config[zone].speed };
uint8_t select_zone_pkt[1] = { zone };
/*-----------------------------------------------------*\
| Select LED |
| Select Zone |
\*-----------------------------------------------------*/
if(active_mode != POLYCHROME_V1_MODE_OFF)
if(zone_config[zone].mode != POLYCHROME_V1_MODE_OFF)
{
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_LED_SELECT, 1, select_led_pkt);
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_ZONE_SELECT, 1, select_zone_pkt);
std::this_thread::sleep_for(1ms);
}
switch(active_mode)
switch(zone_config[zone].mode)
{
/*-----------------------------------------------------*\
| These modes take 4 bytes in R/G/B/S order |
@@ -122,7 +250,7 @@ void ASRockPolychromeV1SMBusController::SetColorsAndSpeed(uint8_t led, uint8_t r
case POLYCHROME_V1_MODE_NEON:
case POLYCHROME_V1_MODE_WATER:
bus->i2c_smbus_write_block_data(dev, active_mode, 4, color_speed_pkt);
bus->i2c_smbus_write_block_data(dev, zone_config[zone].mode, 4, color_speed_pkt);
break;
/*-----------------------------------------------------*\
@@ -131,7 +259,7 @@ void ASRockPolychromeV1SMBusController::SetColorsAndSpeed(uint8_t led, uint8_t r
default:
case POLYCHROME_V1_MODE_STATIC:
case POLYCHROME_V1_MODE_MUSIC:
bus->i2c_smbus_write_block_data(dev, active_mode, 3, color_speed_pkt);
bus->i2c_smbus_write_block_data(dev, zone_config[zone].mode, 3, color_speed_pkt);
break;
/*-----------------------------------------------------*\
@@ -140,7 +268,7 @@ void ASRockPolychromeV1SMBusController::SetColorsAndSpeed(uint8_t led, uint8_t r
case POLYCHROME_V1_MODE_RANDOM:
case POLYCHROME_V1_MODE_WAVE:
case POLYCHROME_V1_MODE_RAINBOW:
bus->i2c_smbus_write_block_data(dev, active_mode, 1, &active_speed);
bus->i2c_smbus_write_block_data(dev, zone_config[zone].mode, 1, &zone_config[zone].speed);
break;
/*-----------------------------------------------------*\
@@ -153,12 +281,12 @@ void ASRockPolychromeV1SMBusController::SetColorsAndSpeed(uint8_t led, uint8_t r
}
void ASRockPolychromeV1SMBusController::SetMode(uint8_t zone,uint8_t mode, uint8_t speed)
void ASRockPolychromeV1SMBusController::SetMode(uint8_t zone, uint8_t mode, uint8_t speed)
{
uint8_t led_count_pkt[1] = { 0x00 };
active_zone = zone;
active_mode = mode;
active_speed = speed;
LOG_TRACE("[%s] Updating mode for zone %02d, Mode 0x%02X, Speed 0x%02X", device_name.c_str(), zone, mode, speed);
uint8_t led_count_pkt[1] = { 0x00 };
zone_config[zone].mode = mode;
zone_config[zone].speed = speed;
/*-----------------------------------------------------*\
| Make sure set all register is set to 0 |
@@ -169,12 +297,12 @@ void ASRockPolychromeV1SMBusController::SetMode(uint8_t zone,uint8_t mode, uint8
/*-----------------------------------------------------*\
| Set the zone we are working on |
\*-----------------------------------------------------*/
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_LED_SELECT, 1, &active_zone);
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_ZONE_SELECT, 1, &zone);
std::this_thread::sleep_for(1ms);
/*-----------------------------------------------------*\
| Write the mode |
\*-----------------------------------------------------*/
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_MODE, 1, &active_mode);
std::this_thread::sleep_for(1ms);
bus->i2c_smbus_write_block_data(dev, POLYCHROME_V1_REG_MODE, 1, &zone_config[zone].mode);
std::this_thread::sleep_for(1ms);
}
@@ -9,6 +9,7 @@
\*-----------------------------------------*/
#include "i2c_smbus.h"
#include "RGBController.h"
#include <string>
#pragma once
@@ -24,22 +25,22 @@ enum
\*------------------------------------------------------------------------------------------*/
POLYCHROME_V1_REG_FIRMWARE_VER = 0x00, /* Firmware version Major.Minor */
POLYCHROME_V1_REG_MODE = 0x30, /* Mode selection register */
POLYCHROME_V1_REG_LED_SELECT = 0x31, /* LED selection register */
POLYCHROME_V1_REG_ZONE_SELECT = 0x31, /* Zone selection register */
POLYCHROME_V1_REG_SET_ALL = 0x32, /* Set All register 0x1 = set all */
POLYCHROME_V1_REG_LED_CONFIG = 0x33, /* LED configuration register */
POLYCHROME_V1_REG_ARGB_GRB = 0x35, /* ARGB bistream reversing register */
POLYCHROME_V1_REG_ZONE_SIZE = 0x33, /* Zone size configuration register */
POLYCHROME_V1_REG_ARGB_GRB = 0x35, /* ARGB bitstream reversing register */
};
enum
{
POLYCHROME_V1_ZONE_1 = 0x00, /* RGB LED 1 Header */
POLYCHROME_V1_ZONE_2 = 0x01, /* RGB LED 2 Header */
POLYCHROME_V1_ZONE_3 = 0x02, /* Audio/PCH Zone LEDs */
POLYCHROME_V1_ZONE_4 = 0x03, /* Audio/PCH Zone LEDs */
POLYCHROME_V1_ZONE_5 = 0x04, /* IO Cover Zone LEDs */
POLYCHROME_V1_ZONE_3 = 0x02, /* PCH Zone */
POLYCHROME_V1_ZONE_4 = 0x03, /* IO Cover Zone */
POLYCHROME_V1_ZONE_5 = 0x04, /* Audio Zone LEDs */
POLYCHROME_V1_ZONE_ADDRESSABLE = 0x05, /* Addressable LED header */
POLYCHROME_V1_ZONE_COUNT = 0x06, /* Total number of zones */
POLYCHROME_V1_ZONE_ADDRESSABLE_MAX = 0x64, /* Maxinum number of ARGB LEDs */
POLYCHROME_V1_ZONE_ADDRESSABLE_MAX = 0x64, /* Maximum number of ARGB LEDs */
};
/*----------------------------------------------------------------------------------------------*\
@@ -51,7 +52,7 @@ enum
{
POLYCHROME_V1_MODE_OFF = 0x10, /* OFF mode */
POLYCHROME_V1_MODE_STATIC = 0x11, /* Static color mode */
POLYCHROME_V1_MODE_BREATHING = 0x12, /* Breating effect mode */
POLYCHROME_V1_MODE_BREATHING = 0x12, /* Breathing effect mode */
POLYCHROME_V1_MODE_STROBE = 0x13, /* Strobe effect mode */
POLYCHROME_V1_MODE_SPECTRUM_CYCLE = 0x14, /* Spectrum Cycle effect mode */
POLYCHROME_V1_MODE_RANDOM = 0x15, /* Random effect mode */
@@ -119,6 +120,13 @@ enum
POLYCHROME_V1_SPEED_MAX_ARGB = 0x02, /* Fastest speed */
};
struct zone_cfg
{
uint8_t mode;
uint8_t speed;
RGBColor color;
};
class ASRockPolychromeV1SMBusController
{
public:
@@ -128,20 +136,24 @@ public:
std::string GetDeviceLocation();
std::string GetDeviceName();
std::string GetFirmwareVersion();
uint8_t GetMode();
uint8_t GetARGBColorOrder();
RGBColor GetZoneColor(uint8_t zone);
uint8_t GetZoneMode(uint8_t zone);
void LoadZoneConfig();
void SetARGBColorOrder(bool value);
bool SetARGBSize(uint8_t led_count);
void SetColorsAndSpeed(uint8_t led, uint8_t red, uint8_t green, uint8_t blue);
void SetMode(uint8_t zone, uint8_t mode, uint8_t speed);
uint8_t zone_led_count[6];
zone_cfg zone_config[6];
uint16_t fw_version;
private:
std::string device_name;
uint8_t active_zone;
uint8_t active_mode;
uint8_t active_speed;
i2c_smbus_interface* bus;
polychrome_dev_id dev;
void ReadLEDConfiguration();
void ReadLEDConfiguration();
};
@@ -26,14 +26,14 @@
RGBController_ASRockASRRGBSMBus::RGBController_ASRockASRRGBSMBus(ASRockASRRGBSMBusController* controller_ptr)
{
controller = controller_ptr;
controller = controller_ptr;
name = controller->GetDeviceName();
vendor = "ASRock";
version = controller->GetFirmwareVersion();
type = DEVICE_TYPE_MOTHERBOARD;
description = "ASRock ASR RGB LED Device";
location = controller->GetDeviceLocation();
name = controller->GetDeviceName();
vendor = "ASRock";
version = controller->GetFirmwareVersion();
type = DEVICE_TYPE_MOTHERBOARD;
description = "ASRock ASR RGB LED Device";
location = controller->GetDeviceLocation();
mode Off;
Off.name = "Off";
@@ -196,11 +196,6 @@ void RGBController_ASRockASRRGBSMBus::UpdateSingleLED(int led)
controller->SetColorsAndSpeed(led, red, grn, blu);
}
void RGBController_ASRockASRRGBSMBus::SetCustomMode()
{
active_mode = 1;
}
void RGBController_ASRockASRRGBSMBus::DeviceUpdateMode()
{
@@ -26,7 +26,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -7,6 +7,7 @@
| Adam Honse (CalcProgrammer1) 12/15/2019 |
\*-----------------------------------------*/
#include "LogManager.h"
#include "RGBController_ASRockPolychromeV1SMBus.h"
static const char* polychrome_v1_zone_names[] =
@@ -29,38 +30,42 @@ static const char* polychrome_v1_zone_names[] =
@detectors DetectASRockSMBusControllers
@comment ASRock Polychrome v1 controllers will save with each update.
Per ARGB LED support is not possible with these devices.
ARGB size and color order is set using the `ARGB Header Config mode`
`Right` = GRB mode that is needed for WS2812B ARGB devices and `Left` = RGB used for WS2811 strips
The modes speed slider will set the size of the header
Spectrum Cycles uses the RGB values to set the individual color brightness.
\*-------------------------------------------------------------------*/
RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASRockPolychromeV1SMBusController* controller_ptr)
{
controller = controller_ptr;
controller = controller_ptr;
name = controller->GetDeviceName();
vendor = "ASRock";
version = controller->GetFirmwareVersion();
type = DEVICE_TYPE_MOTHERBOARD;
description = "ASRock Polychrome v1 Device";
location = controller->GetDeviceLocation();
name = controller->GetDeviceName();
vendor = "ASRock";
version = controller->GetFirmwareVersion();
type = DEVICE_TYPE_MOTHERBOARD;
description = "ASRock Polychrome v1 Device";
location = controller->GetDeviceLocation();
mode Off;
Off.name = "Off";
Off.value = POLYCHROME_V1_MODE_OFF;
Off.flags = 0;
Off.flags = MODE_FLAG_AUTOMATIC_SAVE;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
mode Static;
Static.name = "Static";
Static.value = POLYCHROME_V1_MODE_STATIC;
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Static.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Static);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = POLYCHROME_V1_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR;
Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Breathing.speed_min = POLYCHROME_V1_SPEED_MIN_BREATHING;
Breathing.speed_max = POLYCHROME_V1_SPEED_MAX_BREATHING;
Breathing.speed = POLYCHROME_V1_SPEED_DEFAULT_BREATHING;
@@ -70,7 +75,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Strobe;
Strobe.name = "Strobe";
Strobe.value = POLYCHROME_V1_MODE_STROBE;
Strobe.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR;
Strobe.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Strobe.speed_min = POLYCHROME_V1_SPEED_MIN_STROBE;
Strobe.speed_max = POLYCHROME_V1_SPEED_MAX_STROBE;
Strobe.speed = POLYCHROME_V1_SPEED_DEFAULT_STROBE;
@@ -80,17 +85,17 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode SpectrumCycle;
SpectrumCycle.name = "Spectrum Cycle";
SpectrumCycle.value = POLYCHROME_V1_MODE_SPECTRUM_CYCLE;
SpectrumCycle.flags = MODE_FLAG_HAS_SPEED;
SpectrumCycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
SpectrumCycle.speed_min = POLYCHROME_V1_SPEED_MIN_CYCLE;
SpectrumCycle.speed_max = POLYCHROME_V1_SPEED_MAX_CYCLE;
SpectrumCycle.speed = POLYCHROME_V1_SPEED_DEFAULT_CYCLE;
SpectrumCycle.color_mode = MODE_COLORS_NONE;
SpectrumCycle.color_mode = MODE_COLORS_PER_LED;
modes.push_back(SpectrumCycle);
mode Random;
Random.name = "Random";
Random.value = POLYCHROME_V1_MODE_RANDOM;
Random.flags = MODE_FLAG_HAS_SPEED;
Random.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Random.speed_min = POLYCHROME_V1_SPEED_MIN_RANDOM;
Random.speed_max = POLYCHROME_V1_SPEED_MAX_RANDOM;
Random.speed = POLYCHROME_V1_SPEED_DEFAULT_RANDOM;
@@ -98,16 +103,16 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
modes.push_back(Random);
mode Music;
Music.name = "Music";
Music.value = POLYCHROME_V1_MODE_MUSIC;
Music.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Music.color_mode = MODE_COLORS_PER_LED;
Music.name = "Music";
Music.value = POLYCHROME_V1_MODE_MUSIC;
Music.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Music.color_mode = MODE_COLORS_NONE;
modes.push_back(Music);
mode Wave;
Wave.name = "Wave";
Wave.value = POLYCHROME_V1_MODE_WAVE;
Wave.flags = MODE_FLAG_HAS_SPEED;
Wave.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Wave.speed_min = POLYCHROME_V1_SPEED_MIN_WAVE;
Wave.speed_max = POLYCHROME_V1_SPEED_MAX_WAVE;
Wave.speed = POLYCHROME_V1_SPEED_DEFAULT_WAVE;
@@ -121,7 +126,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Spring;
Spring.name = "Spring";
Spring.value = POLYCHROME_V1_MODE_SPRING;
Spring.flags = MODE_FLAG_HAS_SPEED;
Spring.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Spring.speed_min = POLYCHROME_V1_SPEED_MIN_ARGB;
Spring.speed_max = POLYCHROME_V1_SPEED_MAX_ARGB;
Spring.speed = POLYCHROME_V1_SPEED_DEFAULT_SPRING;
@@ -131,7 +136,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Stack;
Stack.name = "Stack";
Stack.value = POLYCHROME_V1_MODE_STACK;
Stack.flags = MODE_FLAG_HAS_SPEED;
Stack.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Stack.speed_min = POLYCHROME_V1_SPEED_MIN_ARGB;
Stack.speed_max = POLYCHROME_V1_SPEED_MAX_ARGB;
Stack.speed = POLYCHROME_V1_SPEED_DEFAULT_STACK;
@@ -141,7 +146,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Cram;
Cram.name = "Cram";
Cram.value = POLYCHROME_V1_MODE_CRAM;
Cram.flags = MODE_FLAG_HAS_SPEED;
Cram.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Cram.speed_min = POLYCHROME_V1_SPEED_MIN_ARGB;
Cram.speed_max = POLYCHROME_V1_SPEED_MAX_ARGB;
Cram.speed = POLYCHROME_V1_SPEED_DEFAULT_CRAM;
@@ -151,7 +156,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Scan;
Scan.name = "Scan";
Scan.value = POLYCHROME_V1_MODE_SCAN;
Scan.flags = MODE_FLAG_HAS_SPEED;
Scan.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Scan.speed_min = POLYCHROME_V1_SPEED_MIN_ARGB;
Scan.speed_max = POLYCHROME_V1_SPEED_MAX_ARGB;
Scan.speed = POLYCHROME_V1_SPEED_DEFAULT_SCAN;
@@ -161,7 +166,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Neon;
Neon.name = "Neon";
Neon.value = POLYCHROME_V1_MODE_NEON;
Neon.flags = MODE_FLAG_HAS_SPEED;
Neon.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Neon.speed_min = POLYCHROME_V1_SPEED_MIN_ARGB;
Neon.speed_max = POLYCHROME_V1_SPEED_MAX_ARGB;
Neon.speed = POLYCHROME_V1_SPEED_DEFAULT_NEON;
@@ -171,7 +176,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Water;
Water.name = "Water";
Water.value = POLYCHROME_V1_MODE_WATER;
Water.flags = MODE_FLAG_HAS_SPEED;
Water.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Water.speed_min = POLYCHROME_V1_SPEED_MIN_ARGB;
Water.speed_max = POLYCHROME_V1_SPEED_MAX_ARGB;
Water.speed = POLYCHROME_V1_SPEED_DEFAULT_WATER;
@@ -181,7 +186,7 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
mode Rainbow;
Rainbow.name = "Rainbow";
Rainbow.value = POLYCHROME_V1_MODE_RAINBOW;
Rainbow.flags = MODE_FLAG_HAS_SPEED;
Rainbow.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
Rainbow.speed_min = POLYCHROME_V1_SPEED_MIN_RAINBOW;
Rainbow.speed_max = POLYCHROME_V1_SPEED_MAX_RAINBOW;
Rainbow.speed = POLYCHROME_V1_SPEED_DEFAULT_RAINBOW;
@@ -189,7 +194,37 @@ RGBController_ASRockPolychromeV1SMBus::RGBController_ASRockPolychromeV1SMBus(ASR
modes.push_back(Rainbow);
*/
/*---------------------------------------------------------------------*\
| This ARGB_Config section is a hack to allow users to configure the |
| RGB vs GRB mode using the direction of the mode as well as set the |
| size of the devices connected to the header using the brightness |
| value. |
| |
| The mode should be removed onece the device settings are avaiable. |
\*---------------------------------------------------------------------*/
mode ARGB_Config;
ARGB_Config.name = "ARGB Header Config";
ARGB_Config.value = POLYCHROME_V1_REG_ARGB_GRB;
ARGB_Config.flags = MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_SPEED | MODE_FLAG_AUTOMATIC_SAVE;
ARGB_Config.speed = controller->zone_led_count[POLYCHROME_V1_ZONE_ADDRESSABLE];
ARGB_Config.speed_min = 1;
ARGB_Config.speed_max = POLYCHROME_V1_ZONE_ADDRESSABLE_MAX;
ARGB_Config.direction = controller -> GetARGBColorOrder();
ARGB_Config.color_mode = MODE_COLORS_NONE;
modes.push_back(ARGB_Config);
SetupZones();
controller->LoadZoneConfig();
active_mode = getModeIndex(controller->zone_config[0].mode); // Hard coding zone 0 until per zone modes are available.
if(active_mode != POLYCHROME_V1_MODE_OFF)
{
for( uint8_t zone_idx = 0; zone_idx < zoneIndexMap.size(); zone_idx++)
{
zones[zone_idx].colors[0] = controller->GetZoneColor(zoneIndexMap[zone_idx]);
}
}
}
RGBController_ASRockPolychromeV1SMBus::~RGBController_ASRockPolychromeV1SMBus()
@@ -197,6 +232,18 @@ RGBController_ASRockPolychromeV1SMBus::~RGBController_ASRockPolychromeV1SMBus()
delete controller;
}
uint8_t RGBController_ASRockPolychromeV1SMBus::getModeIndex(uint8_t mode_value)
{
for(uint8_t mode_index = 0; mode_index < modes.size(); mode_index++)
{
if (modes[mode_index].value == mode_value)
{
return mode_index;
}
}
return 0;
}
void RGBController_ASRockPolychromeV1SMBus::SetupZones()
{
/*---------------------------------------------------------*\
@@ -210,118 +257,92 @@ void RGBController_ASRockPolychromeV1SMBus::SetupZones()
{
if(controller->zone_led_count[zone_idx] > 0)
{
zone* new_zone = new zone();
zone* new_zone = new zone();
/*---------------------------------------------------------*\
| Set zone name to channel name |
\*---------------------------------------------------------*/
new_zone->name = polychrome_v1_zone_names[zone_idx];
new_zone->type = ZONE_TYPE_SINGLE;
new_zone->leds_min = 1;
new_zone->leds_max = 1;
//new_zone->leds_count = zone_led_count[zone_idx];
new_zone->leds_count = 1;
new_zone->type = ZONE_TYPE_SINGLE;
new_zone->matrix_map = NULL;
if(zone_idx == POLYCHROME_V1_ZONE_ADDRESSABLE)
{
new_zone->leds_max = POLYCHROME_V1_ZONE_ADDRESSABLE_MAX;
}
/*---------------------------------------------------------*\
| Push new zone to zones vector |
\*---------------------------------------------------------*/
zones.push_back(*new_zone);
}
}
uint8_t led_count = 0;
/*---------------------------------------------------------*\
| Set up LEDs |
\*---------------------------------------------------------*/
for(uint8_t zone_idx = 0; zone_idx < POLYCHROME_V1_ZONE_COUNT; zone_idx++)
{
if(controller->zone_led_count[zone_idx] > 0)
{
for(uint8_t led_idx = 0; led_idx < controller->zone_led_count[zone_idx]; led_idx++)
{
/*---------------------------------------------------------*\
| Each zone only has one LED |
\*---------------------------------------------------------*/
led* new_led = new led();
/*---------------------------------------------------------*\
| Each zone only has one LED |
\*---------------------------------------------------------*/
led* new_led = new led();
new_led->name = polychrome_v1_zone_names[zone_idx];
new_led->name = polychrome_v1_zone_names[zone_idx];
new_led->value = zone_idx;
new_led->name.append(" " + std::to_string(led_idx + 1));
new_led->value = 0;
new_led->value = zone_idx;
/*---------------------------------------------------------*\
| Push new LED to LEDs vector |
\*---------------------------------------------------------*/
leds.push_back(*new_led);
led_count++;
if(zone_idx == POLYCHROME_V1_ZONE_ADDRESSABLE)
{
break;
}
}
/*---------------------------------------------------------*\
| Push new LED to LEDs vector |
\*---------------------------------------------------------*/
leds.push_back(*new_led);
zoneIndexMap.push_back(zone_idx);
}
}
SetupColors();
}
void RGBController_ASRockPolychromeV1SMBus::ResizeZone(int /*zone*/, int /*new_size*/)
void RGBController_ASRockPolychromeV1SMBus::ResizeZone(int zone, int new_size)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
LOG_TRACE("[%s] ResizeZone(%02X, %02X)", name.c_str(), zone, new_size);
controller-> SetARGBSize(new_size & 0xFF);
zones[POLYCHROME_V1_ZONE_ADDRESSABLE].leds_count = 1;
}
void RGBController_ASRockPolychromeV1SMBus::DeviceUpdateLEDs()
{
for (std::size_t led = 0; led < colors.size(); led++)
LOG_TRACE("[%s] DeviceUpdateLEDs()", name.c_str());
for (uint8_t zone_idx = 0; zone_idx < zoneIndexMap.size(); zone_idx++)
{
UpdateSingleLED(led);
UpdateSingleLED(zone_idx);
}
}
void RGBController_ASRockPolychromeV1SMBus::UpdateZoneLEDs(int /*zone*/)
{
LOG_TRACE("[%s] UpdateZoneLEDs()", name.c_str());
DeviceUpdateLEDs();
}
void RGBController_ASRockPolychromeV1SMBus::UpdateSingleLED(int led)
void RGBController_ASRockPolychromeV1SMBus::UpdateSingleLED(int zone)
{
unsigned char red = RGBGetRValue(colors[led]);
unsigned char grn = RGBGetGValue(colors[led]);
unsigned char blu = RGBGetBValue(colors[led]);
LOG_TRACE("[%s] UpdateSingleLED(%02X)", name.c_str(), zone);
/*---------------------------------------------------------*\
| If the LED value is non-zero, this LED overrides the LED |
| index |
\*---------------------------------------------------------*/
if(leds[led].value != 0)
{
led = leds[led].value;
}
uint8_t red = RGBGetRValue(colors[zone]);
uint8_t grn = RGBGetGValue(colors[zone]);
uint8_t blu = RGBGetBValue(colors[zone]);
controller->SetColorsAndSpeed(led, red, grn, blu);
}
void RGBController_ASRockPolychromeV1SMBus::SetCustomMode()
{
active_mode = 1;
controller->SetColorsAndSpeed(zoneIndexMap[zone], red, grn, blu);
}
void RGBController_ASRockPolychromeV1SMBus::DeviceUpdateMode()
{
for(uint8_t led_idx = 0; led_idx < leds.size(); led_idx++)
LOG_TRACE("[%s] DeviceUpdateMode()", name.c_str());
if(modes[active_mode].value != POLYCHROME_V1_REG_ARGB_GRB)
{
controller->SetMode(led_idx, modes[active_mode].value, modes[active_mode].speed);
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);
}
}
else
{
controller-> SetARGBColorOrder(modes[active_mode].direction);
controller-> SetARGBSize(modes[active_mode].speed);
}
DeviceUpdateLEDs();
}
@@ -26,9 +26,10 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
ASRockPolychromeV1SMBusController* controller;
uint8_t getModeIndex(uint8_t mode_value);
std::vector<uint8_t> zoneIndexMap;
};
@@ -33,14 +33,14 @@ static const char* polychrome_v2_zone_names[] =
RGBController_ASRockPolychromeV2SMBus::RGBController_ASRockPolychromeV2SMBus(ASRockPolychromeV2SMBusController* controller_ptr)
{
controller = controller_ptr;
controller = controller_ptr;
name = controller->GetDeviceName();
vendor = "ASRock";
version = controller->GetFirmwareVersion();
type = DEVICE_TYPE_MOTHERBOARD;
description = "ASRock Polychrome v2 Device";
location = controller->GetDeviceLocation();
name = controller->GetDeviceName();
vendor = "ASRock";
version = controller->GetFirmwareVersion();
type = DEVICE_TYPE_MOTHERBOARD;
description = "ASRock Polychrome v2 Device";
location = controller->GetDeviceLocation();
mode Off;
@@ -316,11 +316,6 @@ void RGBController_ASRockPolychromeV2SMBus::UpdateSingleLED(int led)
controller->SetColorsAndSpeed(led, red, grn, blu);
}
void RGBController_ASRockPolychromeV2SMBus::SetCustomMode()
{
active_mode = 1;
}
void RGBController_ASRockPolychromeV2SMBus::DeviceUpdateMode()
{
@@ -26,7 +26,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -179,11 +179,6 @@ void RGBController_Alienware::UpdateSingleLED(int led)
UpdateZoneLEDs(led);
}
void RGBController_Alienware::SetCustomMode()
{
active_mode = 0;
}
static bool modes_eq(const mode& mode1, const mode& mode2)
{
return( ( mode1.name == mode2.name )
@@ -29,8 +29,6 @@ public:
void DeviceUpdateMode();
void SetCustomMode();
private:
AlienwareController* controller;
std::chrono::steady_clock::time_point last_packet_ts;
@@ -172,7 +172,7 @@ void AlienwareAW510KController::SendInitialize()
void AlienwareAW510KController::SetDirect
(
unsigned char zone,
unsigned char /*zone*/,
unsigned char r,
unsigned char g,
unsigned char b
@@ -222,7 +222,7 @@ void AlienwareAW510KController::SendDirectOn
| To Guarantee the data are always %4 =0 append |
| zeros at end of last packet |
\*-----------------------------------------------*/
for(int i = 0; i < (frame_data.size() % 4); i++)
for(unsigned int i = 0; i < (frame_data.size() % 4); i++)
{
SelectedKeys key;
key.idx = 0x00;
@@ -358,7 +358,7 @@ void AlienwareAW510KController::UpdateSingleLED
}
void AlienwareAW510KController::SendMode
(
unsigned char zone,
unsigned char /*zone*/,
unsigned char mode,
unsigned short speed,
unsigned char direction,
@@ -171,21 +171,21 @@ static const led_type led_names[] =
RGBController_AlienwareAW510K::RGBController_AlienwareAW510K(AlienwareAW510KController* controller_ptr)
{
controller = controller_ptr;
controller = controller_ptr;
name = "Alienware AW510K Keyboard Device";
vendor = "Alienware";
type = DEVICE_TYPE_KEYBOARD;
description = "Alienware AW510K Keyboard Device";
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
name = "Alienware AW510K Keyboard Device";
vendor = "Alienware";
type = DEVICE_TYPE_KEYBOARD;
description = "Alienware AW510K Keyboard Device";
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
mode Direct_Per_LED;
Direct_Per_LED.name = "Direct";
Direct_Per_LED.value = ALIENWARE_AW510K_MODE_DIRECT_PER_LED;
Direct_Per_LED.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct_Per_LED.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct_Per_LED);
mode Direct;
Direct.name = "Direct";
Direct.value = ALIENWARE_AW510K_MODE_DIRECT_PER_LED;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
mode Static;
Static.name = "Static";
@@ -403,11 +403,6 @@ void RGBController_AlienwareAW510K::UpdateSingleLED(int led)
controller->UpdateSingleLED(leds[led].value, RGBGetRValue(colors[led]), RGBGetGValue(colors[led]), RGBGetBValue(colors[led]));
}
void RGBController_AlienwareAW510K::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AlienwareAW510K::DeviceUpdateMode()
{
if(active_mode == 0xFFFF)
@@ -26,7 +26,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -23,7 +23,7 @@ static unsigned int matrix_map[5][14] =
static const char* zone_names[] =
{
"Keyboard",
ZONE_EN_KEYBOARD,
};
static zone_type zone_types[] =
@@ -236,11 +236,6 @@ void RGBController_AnnePro2::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AnnePro2::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AnnePro2::DeviceUpdateMode()
{
@@ -24,7 +24,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -2,9 +2,12 @@
#include "AsusAuraCoreController.h"
#include "RGBController.h"
#include "RGBController_AsusAuraCore.h"
#include "RGBController_AsusAuraCoreLaptop.h"
#include <hidapi/hidapi.h>
#define AURA_CORE_VID 0x0B05
#define AURA_CORE_VID 0x0B05
#define AURA_STRIX_SCAR_15_PID 0x19B6
/******************************************************************************************\
* *
@@ -14,13 +17,14 @@
* *
\******************************************************************************************/
void DetectAsusAuraCoreControllers(hid_device_info* info, const std::string&)
void DetectAsusAuraCoreControllers(hid_device_info* info, const std::string& /*name*/)
{
hid_device* dev = hid_open_path(info->path);
if( dev )
if(dev)
{
AuraCoreController* controller = new AuraCoreController(dev, info->path);
RGBController_AuraCore* rgb_controller = new RGBController_AuraCore(controller);
AuraCoreController* controller = new AuraCoreController(dev, info->path);
RGBController_AuraCore* rgb_controller = new RGBController_AuraCore(controller);
// Constructor sets the name
if(rgb_controller->type != DEVICE_TYPE_UNKNOWN)
{
@@ -33,6 +37,21 @@ void DetectAsusAuraCoreControllers(hid_device_info* info, const std::string&)
}
}
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);
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);
// Constructor sets the name
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);
@@ -0,0 +1,356 @@
/*---------------------------------------------------------------------*\
| AsusAuraCoreLaptopController.cpp |
| |
| Driver for Asus Aura Core Laptop USB Controller |
| |
| Chris M (Dr_No) 28 Jul 2022 |
| |
\*---------------------------------------------------------------------*/
#include "AsusAuraCoreLaptopController.h"
static uint8_t packet_map[ASUSAURACORELAPTOP_KEYCOUNT +
ASUSAURACORELAPTOP_LIGHTBARCOUNT +
ASUSAURACORELAPTOP_LIDCOUNT ] =
{
/*00 ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 */
21, 23, 24, 25, 26, 28, 29, 30, 31, 33,
/*10 F10 F11 F12 DEL ` 1 2 3 4 5 */
34, 35, 36, 37, 42, 43, 44, 45, 46, 47,
/*20 6 7 8 9 0 - = BSP BSP BSP */
48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
/*30 PLY TAB Q W E R T Y U I */
58, 63, 64, 65, 66, 67, 68, 69, 70, 71,
/*40 O P [ ] \ STP CAP A S D */
72, 73, 74, 75, 76, 79, 84, 85, 86, 87,
/*50 F G H J K L ; ' ENT PRV */
88, 89, 90, 91, 92, 93, 94, 95, 98, 100,
/*60 LSH Z X C V B N M , . */
105, 107, 108, 109, 110, 111, 112, 113, 114, 115,
/*70 / RSH UP NXT LCTL LFN LWIN LALT SPC RALT */
116, 119, 139, 121, 126, 127, 128, 129, 131, 135,
/*80 RCTL LFT DWN RGT PRT KSTN VDN VUP MICM HPFN */
137, 159, 160, 161, 142, 175, 2, 3, 4, 5,
/*90 ARMC LB1 LB2 LB3 LB4 LB5 LB6 LOGO LIDL LIDR */
6, 174, 173, 172, 171, 170, 169, 167, 176, 177,
};
static std::string power_zones[ASUSAURACORELAPTOP_POWER_ZONES] =
{
"Logo",
ZONE_EN_KEYBOARD,
"Lightbar",
"Lid Edges"
};
static std::string power_states[ASUSAURACORELAPTOP_POWER_STATES] =
{
" when booting",
" when awake",
" when sleeping",
" when off",
};
AsusAuraCoreLaptopController::AsusAuraCoreLaptopController(hid_device* dev_handle, const char* path)
{
const uint8_t sz = HID_MAX_STR;
wchar_t tmp[sz];
dev = dev_handle;
location = path;
hid_get_manufacturer_string(dev, tmp, sz);
std::wstring wName = std::wstring(tmp);
device_name = std::string(wName.begin(), wName.end());
hid_get_product_string(dev, tmp, sz);
wName = std::wstring(tmp);
device_name.append(" ").append(std::string(wName.begin(), wName.end()));
SetPowerConfigFromJSON();
}
AsusAuraCoreLaptopController::~AsusAuraCoreLaptopController()
{
hid_close(dev);
}
std::string AsusAuraCoreLaptopController::GetDeviceName()
{
return device_name;
}
std::string AsusAuraCoreLaptopController::GetSerial()
{
const uint8_t sz = HID_MAX_STR;
wchar_t tmp[sz];
int ret = hid_get_serial_number_string(dev, tmp, sz);
if (ret != 0)
{
LOG_DEBUG("[%s] Get HID Serial string failed", device_name.c_str());
return("");
}
std::wstring w_tmp = std::wstring(tmp);
std::string serial = std::string(w_tmp.begin(), w_tmp.end());
return serial;
}
std::string AsusAuraCoreLaptopController::GetLocation()
{
return("HID: " + location);
}
void AsusAuraCoreLaptopController::SetMode(uint8_t mode, uint8_t speed, uint8_t brightness, RGBColor color1, RGBColor color2, uint8_t random, uint8_t direction)
{
bool needs_update = !( (current_mode == mode ) &&
(current_speed == speed ) &&
(current_brightness == brightness ) &&
(current_c1 == color1 ) &&
(current_c2 == color2 ) &&
(current_random == random ) &&
(current_direction == direction ) );
if(needs_update)
{
current_mode = mode;
current_speed = speed;
current_brightness = brightness;
current_c1 = color1;
current_c2 = color2;
current_random = random;
current_direction = direction;
SendUpdate();
SendBrightness();
}
}
void AsusAuraCoreLaptopController::SetLedsDirect(std::vector<RGBColor> colors)
{
/*---------------------------------------------------------*\
| The keyboard zone is a set of 168 keys (indexed from 0) |
| sent in 11 packets of 16 triplets. The Lid and Lightbar |
| zones are sent in one final packet afterwards. |
\*---------------------------------------------------------*/
const uint8_t key_set = 167;
const uint8_t led_count = 178;
const uint16_t map_size = 3 * led_count;
const uint8_t leds_per_packet = 16;
uint8_t buffer[ASUSAURACORELAPTOP_WRITE_PACKET_SIZE] = { ASUSAURACORELAPTOP_REPORT_ID, ASUSAURACORELAPTOP_CMD_DIRECT,
0x00, 0x01, 0x01, 0x01, 0x00, leds_per_packet, 0x00 };
uint8_t key_buf[map_size];
memset(key_buf, 0, map_size);
for(size_t led_index = 0; led_index < colors.size(); led_index++)
{
uint16_t offset = 3 * packet_map[led_index];
key_buf[offset] = RGBGetRValue(colors[led_index]);
key_buf[offset + 1] = RGBGetGValue(colors[led_index]);
key_buf[offset + 2] = RGBGetBValue(colors[led_index]);
}
for(size_t i = 0; i < key_set; i+=leds_per_packet)
{
uint8_t leds_remaining = key_set - i;
if(leds_remaining < leds_per_packet)
{
buffer[07] = leds_remaining;
}
buffer[06] = i;
memcpy(&buffer[ASUSAURACORELAPTOP_DATA_BYTE], &key_buf[3 * i], (3 * buffer[07]));
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
}
buffer[4] = 0x04;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
memcpy(&buffer[ASUSAURACORELAPTOP_DATA_BYTE], &key_buf[3 * key_set], (3 * (led_count - key_set)));
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
}
void AsusAuraCoreLaptopController::SendBrightness()
{
const uint8_t index = 2;
uint8_t buffer[ASUSAURACORELAPTOP_WRITE_PACKET_SIZE] = { ASUSAURACORELAPTOP_REPORT_ID, ASUSAURACORELAPTOP_CMD_BRIGHTNESS };
memset(&buffer[index], 0, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE - index);
buffer[4] = current_brightness;
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
}
void AsusAuraCoreLaptopController::SendUpdate()
{
uint8_t buffer[ASUSAURACORELAPTOP_WRITE_PACKET_SIZE] = { ASUSAURACORELAPTOP_REPORT_ID, ASUSAURACORELAPTOP_CMD_UPDATE };
buffer[ASUSAURACORELAPTOP_ZONE_BYTE] = 0;
buffer[ASUSAURACORELAPTOP_MODE_BYTE] = current_mode;
buffer[ASUSAURACORELAPTOP_R1_BYTE] = RGBGetRValue(current_c1);
buffer[ASUSAURACORELAPTOP_G1_BYTE] = RGBGetGValue(current_c1);
buffer[ASUSAURACORELAPTOP_B1_BYTE] = RGBGetBValue(current_c1);
buffer[ASUSAURACORELAPTOP_SPEED_BYTE] = current_speed;
buffer[ASUSAURACORELAPTOP_DIRECTION_BYTE] = current_direction;
buffer[ASUSAURACORELAPTOP_DATA_BYTE] = current_random;
buffer[ASUSAURACORELAPTOP_R2_BYTE] = RGBGetRValue(current_c2);
buffer[ASUSAURACORELAPTOP_G2_BYTE] = RGBGetGValue(current_c2);
buffer[ASUSAURACORELAPTOP_B2_BYTE] = RGBGetBValue(current_c2);
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
SendApply();
}
void AsusAuraCoreLaptopController::SendApply()
{
const uint8_t index = 2;
uint8_t buffer[ASUSAURACORELAPTOP_WRITE_PACKET_SIZE] = { ASUSAURACORELAPTOP_REPORT_ID, ASUSAURACORELAPTOP_CMD_APPLY };
memset(&buffer[index], 0, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE - index);
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
}
void AsusAuraCoreLaptopController::SendSet()
{
const uint8_t index = 2;
uint8_t buffer[ASUSAURACORELAPTOP_WRITE_PACKET_SIZE] = { ASUSAURACORELAPTOP_REPORT_ID, ASUSAURACORELAPTOP_CMD_SET };
memset(&buffer[index], 0, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE - index);
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
}
std::vector<p_state> AsusAuraCoreLaptopController::PowerConfigArray()
{
std::vector<p_state> temp;
for(uint8_t zone_index = 0; zone_index < ASUSAURACORELAPTOP_POWER_ZONES; zone_index++)
{
for(uint8_t state_index = 0; state_index < ASUSAURACORELAPTOP_POWER_STATES; state_index++)
{
p_state new_state;
new_state.zone = power_zones[zone_index] + power_states[state_index];
new_state.state = true;
temp.push_back(new_state);
}
}
return temp;
}
void AsusAuraCoreLaptopController::SetPowerConfigFromJSON()
{
std::vector<p_state> power_config = PowerConfigArray();
const std::string section_power = "PowerConfig";
const std::string detector_name = "Asus Aura Core Laptop";
SettingsManager* settings_manager = ResourceManager::get()->GetSettingsManager();
json device_settings = settings_manager->GetSettings(detector_name);
/*---------------------------------------------------------*\
| Get Power state config from the settings manager |
| If PowerConfig is not found then write it to settings |
\*---------------------------------------------------------*/
if(!device_settings.contains(section_power))
{
json pcfg;
for(size_t i = 0; i < power_config.size(); i++)
{
pcfg[power_config[i].zone] = power_config[i].state;
}
device_settings[section_power] = pcfg;
settings_manager->SetSettings(detector_name, device_settings);
settings_manager->SaveSettings();
}
else
{
for(size_t i = 0; i < power_config.size(); i++)
{
std::string key_name = power_config[i].zone;
if(device_settings[section_power].contains(key_name))
{
power_config[i].state = device_settings[section_power][key_name];
LOG_DEBUG("[%s] Reading power config for %s: %s", device_name.c_str(), key_name.c_str(), ((power_config[i].state) ? "On" : "Off"));
}
}
}
/*-----------------------------------------------------------------------------*\
| Power state flags are packed in zones but the order is inconsistent. |
| With thanks to AsusCtl for helping to decipher the packet captures |
| https://gitlab.com/asus-linux/asusctl/-/blob/main/rog-aura/src/usb.rs#L150 |
\*-----------------------------------------------------------------------------*/
bool flag_array[] =
{
power_config[0].state, power_config[4].state,
power_config[1].state, power_config[5].state,
!power_config[2].state, !power_config[6].state,
!power_config[3].state, !power_config[7].state,
false, power_config[8].state,
power_config[9].state, !power_config[10].state,
!power_config[11].state, false,
false, false,
power_config[12].state, power_config[13].state,
!power_config[14].state, !power_config[15].state
};
uint32_t flags = PackPowerFlags(flag_array);
LOG_DEBUG("[%s] Sending power config Logo+KB: %02X Lightbar: %02X Lid Edges: %02X Raw: %08X", device_name.c_str(), (flags & 0xFF), ((flags >> 8) & 0xFF), ((flags >> 16) & 0xFF), flags);
SendPowerConfig(flags);
}
void AsusAuraCoreLaptopController::SendPowerConfig(uint32_t flags)
{
const uint8_t index = 6;
uint8_t buffer[ASUSAURACORELAPTOP_WRITE_PACKET_SIZE] = { ASUSAURACORELAPTOP_REPORT_ID, ASUSAURACORELAPTOP_CMD_POWER, 0x01, 0x00, 0x00, 0x0F };
memset(&buffer[index], 0, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE - index);
buffer[3] = flags & 0xFF;
buffer[4] = (flags >> 8) & 0xFF;
buffer[5] = (flags >> 16) & 0xFF;
hid_send_feature_report(dev, buffer, ASUSAURACORELAPTOP_WRITE_PACKET_SIZE);
}
uint32_t AsusAuraCoreLaptopController::PackPowerFlags(bool flags[])
{
uint32_t temp = {};
const uint8_t length = 32;
for (size_t i = 0; i < length; ++i)
{
uint32_t flag = {flags[i]};
flag <<= i;
temp |= flag;
}
return temp;
}
@@ -0,0 +1,135 @@
/*---------------------------------------------------------------------*\
| AsusAuraCoreLaptopController.h |
| |
| Driver for AsusAuraCoreLaptop USB Controller |
| |
| Chris M (Dr_No) 28 Jul 2022 |
| |
\*---------------------------------------------------------------------*/
#include <string>
#include <vector>
#include <hidapi/hidapi.h>
#include "LogManager.h"
#include "RGBController.h"
#include "ResourceManager.h"
#include "SettingsManager.h"
#include "RGBControllerKeyNames.h"
#pragma once
#define NA 0xFFFFFFFF
#define HID_MAX_STR 255
#define ASUSAURACORELAPTOP_TIMEOUT 250
#define ASUSAURACORELAPTOP_READ_PACKET_SIZE 64
#define ASUSAURACORELAPTOP_WRITE_PACKET_SIZE 64 //Buffer requires a prepended ReportID hence + 1
#define ASUSAURACORELAPTOP_KEYCOUNT 91
#define ASUSAURACORELAPTOP_KEY_WIDTH 18
#define ASUSAURACORELAPTOP_KEY_HEIGHT 7
#define ASUSAURACORELAPTOP_LIGHTBARCOUNT 6
#define ASUSAURACORELAPTOP_LIDCOUNT 3
#define ASUSAURACORELAPTOP_POWER_ZONES 4
#define ASUSAURACORELAPTOP_POWER_STATES 4
#define ASUSAURACORELAPTOP_BRIGHTNESS_MIN 0
#define ASUSAURACORELAPTOP_BRIGHTNESS_MAX 255
enum
{
ASUSAURACORELAPTOP_MODE_OFF = 0x00, //Turn off - All leds off
ASUSAURACORELAPTOP_MODE_DIRECT = 0xFF, //Direct Led Control - Independently set LEDs in zone
ASUSAURACORELAPTOP_MODE_STATIC = 0x00, //Static Mode - Set entire zone to a single color.
ASUSAURACORELAPTOP_MODE_BREATHING = 0x01, //Breathing Mode - Fades between fully off and fully on.
ASUSAURACORELAPTOP_MODE_SPECTRUM = 0x02, //Spectrum Cycle Mode - Cycles through the color spectrum on all lights on the device
ASUSAURACORELAPTOP_MODE_RAINBOW = 0x03, //Rainbow Wave Mode - Cycle thru the color spectrum as a wave across all LEDs
ASUSAURACORELAPTOP_MODE_FLASHING = 0x0A, //Flashing Mode - Abruptly changing between fully off and fully on.
/*-------------------------------------------------*\
| Modes not implemented in the Armoury Crate |
| OEM software that were discovered. |
\*-------------------------------------------------*/
ASUSAURACORELAPTOP_MODE_STARRY_NIGHT = 0x04, //Starry Night Mode
ASUSAURACORELAPTOP_MODE_RAIN = 0x05, //Rain Mode
ASUSAURACORELAPTOP_MODE_REACT_FADE = 0x06, //Reactive Fade Mode
ASUSAURACORELAPTOP_MODE_REACT_LASER = 0x07, //Reactive Laser Mode
ASUSAURACORELAPTOP_MODE_REACT_RIPPLE = 0x08, //Reactive Ripple Mode
ASUSAURACORELAPTOP_MODE_COMET = 0x0B, //Comet Mode
ASUSAURACORELAPTOP_MODE_FLASHNDASH = 0x0C, //Flash n Dash Mode
ASUSAURACORELAPTOP_MODE_KEYSTONE = 0x0D, //Keystone Mode
};
enum
{
ASUSAURACORELAPTOP_ZONE_BYTE = 2,
ASUSAURACORELAPTOP_MODE_BYTE = 3,
ASUSAURACORELAPTOP_R1_BYTE = 4,
ASUSAURACORELAPTOP_G1_BYTE = 5,
ASUSAURACORELAPTOP_B1_BYTE = 6,
ASUSAURACORELAPTOP_SPEED_BYTE = 7,
ASUSAURACORELAPTOP_DIRECTION_BYTE = 8,
ASUSAURACORELAPTOP_DATA_BYTE = 9,
ASUSAURACORELAPTOP_R2_BYTE = 10,
ASUSAURACORELAPTOP_G2_BYTE = 11,
ASUSAURACORELAPTOP_B2_BYTE = 12,
};
enum
{
ASUSAURACORELAPTOP_REPORT_ID = 0x5D,
ASUSAURACORELAPTOP_CMD_BRIGHTNESS = 0xBA,
ASUSAURACORELAPTOP_CMD_DIRECT = 0xBC,
ASUSAURACORELAPTOP_CMD_POWER = 0xBD,
ASUSAURACORELAPTOP_CMD_UPDATE = 0xB3,
ASUSAURACORELAPTOP_CMD_APPLY = 0xB4,
ASUSAURACORELAPTOP_CMD_SET = 0xB5,
};
enum
{
ASUSAURACORELAPTOP_SPEED_SLOWEST = 0xE1, // Slowest speed
ASUSAURACORELAPTOP_SPEED_NORMAL = 0xEB, // Normal speed
ASUSAURACORELAPTOP_SPEED_FASTEST = 0xF5, // Fastest speed
};
struct p_state
{
std::string zone;
bool state;
};
class AsusAuraCoreLaptopController
{
public:
AsusAuraCoreLaptopController(hid_device* dev_handle, const char* path);
~AsusAuraCoreLaptopController();
std::string GetDeviceName();
std::string GetSerial();
std::string GetLocation();
void SetMode(uint8_t mode, uint8_t speed, uint8_t brightness, RGBColor color1, RGBColor color2, uint8_t random, uint8_t direction);
void SetLedsDirect(std::vector<RGBColor> colors);
private:
std::string device_name;
std::string location;
hid_device* dev;
uint8_t current_mode;
uint8_t current_speed;
uint8_t current_direction;
RGBColor current_c1;
RGBColor current_c2;
uint8_t current_brightness;
uint8_t current_random;
void SendApply();
void SendBrightness();
void SendSet();
void SendUpdate();
void SetPowerConfigFromJSON();
void SendPowerConfig(uint32_t flags);
uint32_t PackPowerFlags(bool flags[]);
std::vector<p_state> PowerConfigArray();
};
@@ -44,39 +44,39 @@ RGBController_AuraCore::RGBController_AuraCore(AuraCoreController* controller_pt
void RGBController_AuraCore::SetupKeyboard()
{
name = "ASUS Aura Keyboard";
vendor = "ASUS";
type = DEVICE_TYPE_KEYBOARD;
description = "ASUS Aura Core Device";
name = "ASUS Aura Keyboard";
vendor = "ASUS";
type = DEVICE_TYPE_KEYBOARD;
description = "ASUS Aura Core Device";
mode Static;
Static.name = "Static";
Static.value = AURA_CORE_MODE_STATIC;
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Static.color_mode = MODE_COLORS_PER_LED;
Static.name = "Static";
Static.value = AURA_CORE_MODE_STATIC;
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Static.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Static);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = AURA_CORE_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Breathing.color_mode = MODE_COLORS_PER_LED;
Breathing.name = "Breathing";
Breathing.value = AURA_CORE_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Breathing.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Breathing);
mode ColorCycle;
ColorCycle.name = "Color Cycle";
ColorCycle.value = AURA_CORE_MODE_SPECTRUM_CYCLE;
ColorCycle.flags = 0;
ColorCycle.color_mode = MODE_COLORS_NONE;
ColorCycle.name = "Color Cycle";
ColorCycle.value = AURA_CORE_MODE_SPECTRUM_CYCLE;
ColorCycle.flags = 0;
ColorCycle.color_mode = MODE_COLORS_NONE;
modes.push_back(ColorCycle);
}
void RGBController_AuraCore::SetupGA15DH()
{
name = "ASUS Aura GA15DH";
vendor = "ASUS";
type = DEVICE_TYPE_LEDSTRIP;
description = "ASUS Aura Core Device";
name = "ASUS Aura GA15DH";
vendor = "ASUS";
type = DEVICE_TYPE_LEDSTRIP;
description = "ASUS Aura Core Device";
mode Static;
Static.name = "Static";
@@ -160,10 +160,10 @@ void RGBController_AuraCore::SetupGA15DH()
modes.push_back(Irradiation);
mode Direct;
Static.name = "Direct";
Static.value = AURA_CORE_MODE_DIRECT;
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Static.color_mode = MODE_COLORS_PER_LED;
Static.name = "Direct";
Static.value = AURA_CORE_MODE_DIRECT;
Static.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Static.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Static);
}
@@ -312,11 +312,6 @@ void RGBController_AuraCore::UpdateSingleLED(int led)
controller->SendApply();
}
void RGBController_AuraCore::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraCore::DeviceUpdateMode()
{
if(modes[active_mode].value == AURA_CORE_MODE_DIRECT)
@@ -27,7 +27,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -0,0 +1,491 @@
/*---------------------------------------------------------------------*\
| RGBController_AsusAuraCoreLaptop.cpp |
| |
| Driver for AsusAuraCoreLaptop USB Controller |
| |
| Chris M (Dr_No) 28 Jul 2022 |
| |
\*---------------------------------------------------------------------*/
#include "RGBController_AsusAuraCoreLaptop.h"
static unsigned int matrix_map[ASUSAURACORELAPTOP_KEY_HEIGHT][ASUSAURACORELAPTOP_KEY_WIDTH] =
{
{ NA, NA, 86, 87, 88, 89, 90, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA },
{ 0, NA, 1, 2, 3, 4, NA, 5, 6, 7, 8, NA, 9, 10, 11, 12, 13, NA },
{ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, NA },
{ 31, NA, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, NA, 45, NA },
{ 46, NA, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, NA, 58, NA, 59, NA },
{ 60, NA, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, NA, 72, NA, 73, NA },
{ 74, 75, 76, 77, NA, NA, NA, 78, NA, NA, NA, 79, 80, 81, 82, 83, 84, 85 }
};
static const char *led_names[] =
{
KEY_EN_ESCAPE, //00
KEY_EN_F1,
KEY_EN_F2,
KEY_EN_F3,
KEY_EN_F4,
KEY_EN_F5,
KEY_EN_F6,
KEY_EN_F7,
KEY_EN_F8,
KEY_EN_F9,
KEY_EN_F10, //10
KEY_EN_F11,
KEY_EN_F12,
KEY_EN_DELETE,
KEY_EN_BACK_TICK,
KEY_EN_1,
KEY_EN_2,
KEY_EN_3,
KEY_EN_4,
KEY_EN_5,
KEY_EN_6, //20
KEY_EN_7,
KEY_EN_8,
KEY_EN_9,
KEY_EN_0,
KEY_EN_MINUS,
KEY_EN_EQUALS,
KEY_EN_BACKSPACE,
KEY_EN_BACKSPACE,
KEY_EN_BACKSPACE,
KEY_EN_MEDIA_PLAY_PAUSE, //30
KEY_EN_TAB,
KEY_EN_Q,
KEY_EN_W,
KEY_EN_E,
KEY_EN_R,
KEY_EN_T,
KEY_EN_Y,
KEY_EN_U,
KEY_EN_I,
KEY_EN_O, //40
KEY_EN_P,
KEY_EN_LEFT_BRACKET,
KEY_EN_RIGHT_BRACKET,
KEY_EN_ANSI_BACK_SLASH,
KEY_EN_MEDIA_STOP,
KEY_EN_CAPS_LOCK,
KEY_EN_A,
KEY_EN_S,
KEY_EN_D,
KEY_EN_F, //50
KEY_EN_G,
KEY_EN_H,
KEY_EN_J,
KEY_EN_K,
KEY_EN_L,
KEY_EN_SEMICOLON,
KEY_EN_QUOTE,
KEY_EN_ANSI_ENTER,
KEY_EN_MEDIA_PREVIOUS,
KEY_EN_LEFT_SHIFT, //60
KEY_EN_Z,
KEY_EN_X,
KEY_EN_C,
KEY_EN_V,
KEY_EN_B,
KEY_EN_N,
KEY_EN_M,
KEY_EN_COMMA,
KEY_EN_PERIOD,
KEY_EN_FORWARD_SLASH, //70
KEY_EN_RIGHT_SHIFT,
KEY_EN_UP_ARROW,
KEY_EN_MEDIA_NEXT,
KEY_EN_LEFT_CONTROL,
KEY_EN_LEFT_FUNCTION,
KEY_EN_LEFT_WINDOWS,
KEY_EN_LEFT_ALT,
KEY_EN_SPACE,
KEY_EN_RIGHT_ALT,
KEY_EN_RIGHT_CONTROL, //80
KEY_EN_LEFT_ARROW,
KEY_EN_DOWN_ARROW,
KEY_EN_RIGHT_ARROW,
KEY_EN_PRINT_SCREEN,
"Asus Keystone",
KEY_EN_MEDIA_VOLUME_DOWN,
KEY_EN_MEDIA_VOLUME_UP,
"Key: Mic On/Off",
"Key: HyperFan",
"Key: Armoury Crate", //90
"Lightbar LED 1",
"Lightbar LED 2",
"Lightbar LED 3",
"Lightbar LED 4",
"Lightbar LED 5",
"Lightbar LED 6",
"Logo",
"Lid Left",
"Lid Right", //99
};
/**------------------------------------------------------------------*\
@name AsusAuraCoreLaptop
@category DEVICE_TYPE_KEYBOARD
@type USB
@save :x:
@direct :white_check_mark:
@effects :white_check_mark:
@detectors DetectAsusAuraCoreLaptopControllers
@comment Power profiles for this controller are set to `On` for all power
state and scan be adjusted in the JSON config file.
For each zone available LEDs can be set as `On = true` or `Off = false` when
* Booting
* Awake (Normal Usage)
* Sleeping
* Shutdown / Power Off
\*-------------------------------------------------------------------*/
RGBController_AsusAuraCoreLaptop::RGBController_AsusAuraCoreLaptop(AsusAuraCoreLaptopController *controller_ptr)
{
controller = controller_ptr;
name = "Asus Aura Core Laptop";
vendor = "Asus";
type = DEVICE_TYPE_KEYBOARD;
description = controller->GetDeviceName();
serial = controller->GetSerial();
location = controller->GetLocation();
mode Direct;
Direct.name = "Direct";
Direct.value = ASUSAURACORELAPTOP_MODE_DIRECT;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
mode Static;
Static.name = "Static";
Static.value = ASUSAURACORELAPTOP_MODE_STATIC;
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Static.colors_min = 1;
Static.colors_max = 1;
Static.colors.resize(Static.colors_max);
Static.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Static.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Static.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Static.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Static.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
Static.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Static);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = ASUSAURACORELAPTOP_MODE_BREATHING;
Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Breathing.colors_min = 1;
Breathing.colors_max = 2;
Breathing.colors.resize(Breathing.colors_min);
Breathing.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Breathing.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Breathing.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Breathing.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Breathing.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Breathing);
mode Flashing;
Flashing.name = "Flashing";
Flashing.value = ASUSAURACORELAPTOP_MODE_FLASHING;
Flashing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Flashing.colors_min = 1;
Flashing.colors_max = 1;
Flashing.colors.resize(Flashing.colors_max);
Flashing.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Flashing.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Flashing.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Flashing.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Flashing.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Flashing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Flashing.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Flashing);
mode Spectrum;
Spectrum.name = "Spectrum Cycle";
Spectrum.value = ASUSAURACORELAPTOP_MODE_SPECTRUM;
Spectrum.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
Spectrum.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Spectrum.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Spectrum.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Spectrum.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Spectrum.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Spectrum.color_mode = MODE_COLORS_NONE;
Spectrum.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Spectrum);
mode Rainbow;
Rainbow.name = "Rainbow Wave";
Rainbow.value = ASUSAURACORELAPTOP_MODE_RAINBOW;
Rainbow.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD;
Rainbow.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Rainbow.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Rainbow.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Rainbow.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Rainbow.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Rainbow.color_mode = MODE_COLORS_NONE;
Rainbow.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Rainbow);
mode Starry;
Starry.name = "Starry Night";
Starry.value = ASUSAURACORELAPTOP_MODE_STARRY_NIGHT;
Starry.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Starry.colors_min = 1;
Starry.colors_max = 2;
Starry.colors.resize(Starry.colors_min);
Starry.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Starry.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Starry.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Starry.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Starry.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Starry.color_mode = MODE_COLORS_MODE_SPECIFIC;
Starry.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Starry);
mode Rain;
Rain.name = "Rain";
Rain.value = ASUSAURACORELAPTOP_MODE_RAIN;
Rain.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
Rain.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Rain.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Rain.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Rain.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Rain.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Rain.color_mode = MODE_COLORS_NONE;
Rain.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Rain);
mode ReactFade;
ReactFade.name = "Reactive - Fade";
ReactFade.value = ASUSAURACORELAPTOP_MODE_REACT_FADE;
ReactFade.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
ReactFade.colors_min = 1;
ReactFade.colors_max = 1;
ReactFade.colors.resize(ReactFade.colors_max);
ReactFade.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
ReactFade.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
ReactFade.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
ReactFade.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
ReactFade.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
ReactFade.color_mode = MODE_COLORS_MODE_SPECIFIC;
ReactFade.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(ReactFade);
mode ReactLaser;
ReactLaser.name = "Reactive - Laser";
ReactLaser.value = ASUSAURACORELAPTOP_MODE_REACT_LASER;
ReactLaser.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
ReactLaser.colors_min = 1;
ReactLaser.colors_max = 1;
ReactLaser.colors.resize(ReactLaser.colors_max);
ReactLaser.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
ReactLaser.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
ReactLaser.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
ReactLaser.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
ReactLaser.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
ReactLaser.color_mode = MODE_COLORS_MODE_SPECIFIC;
ReactLaser.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(ReactLaser);
mode ReactRipple;
ReactRipple.name = "Reactive - Ripple";
ReactRipple.value = ASUSAURACORELAPTOP_MODE_REACT_RIPPLE;
ReactRipple.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
ReactRipple.colors_min = 1;
ReactRipple.colors_max = 1;
ReactRipple.colors.resize(ReactRipple.colors_max);
ReactRipple.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
ReactRipple.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
ReactRipple.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
ReactRipple.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
ReactRipple.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
ReactRipple.color_mode = MODE_COLORS_MODE_SPECIFIC;
ReactRipple.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(ReactRipple);
mode Comet;
Comet.name = "Comet";
Comet.value = ASUSAURACORELAPTOP_MODE_COMET;
Comet.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_DIRECTION_LR;
Comet.colors_min = 1;
Comet.colors_max = 1;
Comet.colors.resize(Comet.colors_max);
Comet.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Comet.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Comet.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Comet.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Comet.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Comet.color_mode = MODE_COLORS_MODE_SPECIFIC;
Comet.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Comet);
mode FlashNDash;
FlashNDash.name = "Flash N Dash";
FlashNDash.value = ASUSAURACORELAPTOP_MODE_FLASHNDASH;
FlashNDash.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_DIRECTION_LR;
FlashNDash.colors_min = 1;
FlashNDash.colors_max = 1;
FlashNDash.colors.resize(FlashNDash.colors_max);
FlashNDash.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
FlashNDash.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
FlashNDash.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
FlashNDash.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
FlashNDash.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
FlashNDash.color_mode = MODE_COLORS_MODE_SPECIFIC;
FlashNDash.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(FlashNDash);
mode Keystone;
Keystone.name = "Keystone";
Keystone.value = ASUSAURACORELAPTOP_MODE_KEYSTONE;
Keystone.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
Keystone.colors_min = 1;
Keystone.colors_max = 1;
Keystone.colors.resize(Keystone.colors_max);
Keystone.brightness_min = ASUSAURACORELAPTOP_BRIGHTNESS_MIN;
Keystone.brightness_max = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Keystone.brightness = ASUSAURACORELAPTOP_BRIGHTNESS_MAX;
Keystone.speed_min = ASUSAURACORELAPTOP_SPEED_SLOWEST;
Keystone.speed_max = ASUSAURACORELAPTOP_SPEED_FASTEST;
Keystone.color_mode = MODE_COLORS_MODE_SPECIFIC;
Keystone.speed = ASUSAURACORELAPTOP_SPEED_NORMAL;
modes.push_back(Keystone);
mode Off;
Off.name = "Off";
Off.value = ASUSAURACORELAPTOP_MODE_OFF;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
Init_Controller();
SetupZones();
}
RGBController_AsusAuraCoreLaptop::~RGBController_AsusAuraCoreLaptop()
{
delete controller;
}
void RGBController_AsusAuraCoreLaptop::Init_Controller()
{
/*-------------------------------------------------*\
| Create the keyboard zone and add the matix map |
\*-------------------------------------------------*/
zone KB_zone;
KB_zone.name = "Keyboard Zone";
KB_zone.type = ZONE_TYPE_MATRIX;
KB_zone.leds_min = ASUSAURACORELAPTOP_KEYCOUNT;
KB_zone.leds_max = ASUSAURACORELAPTOP_KEYCOUNT;
KB_zone.leds_count = ASUSAURACORELAPTOP_KEYCOUNT;
KB_zone.matrix_map = new matrix_map_type;
KB_zone.matrix_map->height = ASUSAURACORELAPTOP_KEY_HEIGHT;
KB_zone.matrix_map->width = ASUSAURACORELAPTOP_KEY_WIDTH;
KB_zone.matrix_map->map = (unsigned int *)&matrix_map;
zones.push_back(KB_zone);
zone lightbar;
lightbar.name = "Lightbar Zone";
lightbar.type = ZONE_TYPE_LINEAR;
lightbar.leds_min = ASUSAURACORELAPTOP_LIGHTBARCOUNT;
lightbar.leds_max = ASUSAURACORELAPTOP_LIGHTBARCOUNT;
lightbar.leds_count = ASUSAURACORELAPTOP_LIGHTBARCOUNT;
zones.push_back(lightbar);
zone lid;
lid.name = "Lid Zone";
lid.type = ZONE_TYPE_LINEAR;
lid.leds_min = ASUSAURACORELAPTOP_LIDCOUNT;
lid.leds_max = ASUSAURACORELAPTOP_LIDCOUNT;
lid.leds_count = ASUSAURACORELAPTOP_LIDCOUNT;
zones.push_back(lid);
}
void RGBController_AsusAuraCoreLaptop::SetupZones()
{
/*-------------------------------------------------*\
| Clear any existing color/LED configuration |
\*-------------------------------------------------*/
leds.clear();
colors.clear();
/*---------------------------------------------------------*\
| Set up zones |
\*---------------------------------------------------------*/
for(std::size_t zone_index = 0; zone_index < zones.size(); zone_index++)
{
int zone_offset = leds.size();
for(unsigned int led_index = 0; led_index < zones[zone_index].leds_count; led_index++)
{
led new_led;
new_led.value = led_index + zone_offset;
new_led.name = led_names[new_led.value];
leds.push_back(new_led);
}
}
SetupColors();
}
void RGBController_AsusAuraCoreLaptop::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_AsusAuraCoreLaptop::DeviceUpdateLEDs()
{
controller->SetLedsDirect(colors);
}
void RGBController_AsusAuraCoreLaptop::UpdateZoneLEDs(int zone)
{
std::vector<RGBColor> colour;
for(size_t i = 0; i < zones[zone].leds_count; i++)
{
colour.push_back(zones[zone].colors[i]);
}
controller->SetLedsDirect(colour);
}
void RGBController_AsusAuraCoreLaptop::UpdateSingleLED(int led)
{
std::vector<RGBColor> colour;
colour.push_back(colors[led]);
controller->SetLedsDirect(colour);
}
void RGBController_AsusAuraCoreLaptop::DeviceUpdateMode()
{
mode set_mode = modes[active_mode];
if(set_mode.value == ASUSAURACORELAPTOP_MODE_DIRECT)
{
return;
}
uint8_t random = (set_mode.color_mode == MODE_COLORS_RANDOM) ? 0xFF : 0;
RGBColor color1 = (set_mode.colors.size() > 0) ? set_mode.colors[0] : 0;
RGBColor color2 = (set_mode.colors.size() > 1) ? set_mode.colors[1] : 0;
controller->SetMode(set_mode.value, set_mode.speed, set_mode.brightness, color1, color2, random, set_mode.direction );
}
@@ -0,0 +1,35 @@
/*---------------------------------------------------------------------*\
| RGBController_AsusAuraCoreLaptop.h |
| |
| Driver for AsusAuraCoreLaptop USB Controller |
| |
| Chris M (Dr_No) 28 Jul 2022 |
| |
\*---------------------------------------------------------------------*/
#pragma once
#include <vector>
#include "RGBController.h"
#include "AsusAuraCoreLaptopController.h"
class RGBController_AsusAuraCoreLaptop : public RGBController
{
public:
RGBController_AsusAuraCoreLaptop(AsusAuraCoreLaptopController* controller_ptr);
~RGBController_AsusAuraCoreLaptop();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateMode();
private:
void Init_Controller();
AsusAuraCoreLaptopController* controller;
};
@@ -114,8 +114,10 @@ REGISTER_I2C_PCI_DETECTOR("ASUS AREZ Strix RX Vega 56 O8G" , DetectAs
REGISTER_I2C_PCI_DETECTOR("ASUS Vega 64 Strix" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_VEGA10_DEV, ASUS_SUB_VEN, ASUS_VEGA64_STRIX, 0x29);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 5600XT Strix O6G Gaming" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_NAVI10_DEV, ASUS_SUB_VEN, ASUS_RX5600XT_STRIX_O6G_GAMING, 0x2A);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 5700XT Strix Gaming OC" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_NAVI10_DEV, ASUS_SUB_VEN, ASUS_RX5700XT_STRIX_GAMING_OC, 0x2A);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 6800 TUF Gaming OC" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_NAVI21_DEV1, ASUS_SUB_VEN, ASUS_RX6800_TUF_GAMING_OC, 0x2A);
REGISTER_I2C_PCI_DETECTOR("ASUS ROG STRIX RX480 Gaming OC" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_POLARIS_DEV, ASUS_SUB_VEN, ASUS_RX480_STRIX_GAMING_OC, 0x29);
REGISTER_I2C_PCI_DETECTOR("ASUS ROG STRIX RX560 Gaming" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_POLARIS11, ASUS_SUB_VEN, ASUS_RX560_STRIX_4G_GAMING, 0x29);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 570 Strix O4G Gaming OC" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_POLARIS_DEV, ASUS_SUB_VEN, ASUS_RX570_STRIX_O4G_GAMING_OC, 0x29);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 580 Strix Gaming OC" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_POLARIS_DEV, ASUS_SUB_VEN, ASUS_RX580_STRIX_GAMING_OC, 0x29);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 580 Strix Gaming TOP" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_POLARIS_DEV, ASUS_SUB_VEN, ASUS_RX580_STRIX_GAMING_TOP, 0x29);
REGISTER_I2C_PCI_DETECTOR("ASUS RX 6900XT TUF Gaming OC" , DetectAsusAuraGPUControllers, AMD_GPU_VEN, AMD_NAVI21_DEV1, ASUS_SUB_VEN, ASUS_TUF_RX6900XT_O16G_GAMING, 0x2A);
@@ -183,11 +183,6 @@ void RGBController_AuraGPU::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AuraGPU::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraGPU::DeviceUpdateMode()
{
int new_mode = modes[active_mode].value;
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -16,6 +16,7 @@
enum
{
AURA_ROG_STRIX_XG27AQ_PID = 0x198C,
AURA_ROG_STRIX_XG27W_PID = 0x1933,
AURA_ROG_PG32UQ_PID = 0x19B9,
};
@@ -85,9 +85,9 @@ std::string AuraMouseController::GetVersion(bool wireless, int protocol)
case 3:
{
char version[9];
char version[16];
int offset = (wireless ? 13 : 4);
snprintf(version, 9, "%2d.%02d.%02d", usb_buf_out[offset + 1], usb_buf_out[offset + 2], usb_buf_out[offset + 3]);
snprintf(version, 16, "%2d.%02d.%02d", usb_buf_out[offset + 1], usb_buf_out[offset + 2], usb_buf_out[offset + 3]);
str = std::string(version);
}
break;
@@ -110,7 +110,7 @@ void AuraMousematController::UpdateDevice
usb_buf[0x08] = pattern;
usb_buf[0x09] = 0x00;
for(int i = 0; i < colors.size(); i++)
for(unsigned int i = 0; i < colors.size(); i++)
{
usb_buf[0x0a + i * 3] = RGBGetRValue(colors[i]);
usb_buf[0x0b + i * 3] = RGBGetGValue(colors[i]);
@@ -12,9 +12,6 @@
AsusAuraRyuoAIOController::AsusAuraRyuoAIOController(hid_device* dev_handle, const char* path) : AuraUSBController(dev_handle, path)
{
const int szTemp = ASUSAURARYUOAIOCONTROLLER_HID_MAX_STR;
wchar_t tmpName[szTemp];
/*-----------------------------------------------------*\
| Add addressable devices |
| Manually adding device info for now |
@@ -33,7 +30,7 @@ std::string AsusAuraRyuoAIOController::GetLocation()
return("HID: " + location);
}
void AsusAuraRyuoAIOController::SetMode(unsigned char channel, unsigned char mode, unsigned char red, unsigned char grn, unsigned char blu)
void AsusAuraRyuoAIOController::SetMode(unsigned char /*channel*/, unsigned char /*mode*/, unsigned char /*red*/, unsigned char /*grn*/, unsigned char /*blu*/)
{
/*---------------------------------------------------------*\
| This interface is not used in this controller however is |
@@ -56,7 +53,7 @@ void AsusAuraRyuoAIOController::SetMode(unsigned char mode, unsigned char speed,
}
}
void AsusAuraRyuoAIOController::SetChannelLEDs(unsigned char channel, RGBColor * colors, unsigned int num_colors)
void AsusAuraRyuoAIOController::SetChannelLEDs(unsigned char /*channel*/, RGBColor* /*colors*/, unsigned int /*num_colors*/)
{
/*---------------------------------------------------------*\
| This interface is not used in this controller however is |
@@ -26,6 +26,7 @@ AuraUSBController::~AuraUSBController()
{
hid_close(dev);
}
unsigned int AuraUSBController::GetChannelCount()
{
return(device_info.size());
@@ -104,7 +105,7 @@ void AuraUSBController::GetConfigTable()
}
}
else
{
{
LOG_INFO("[%s] Could not read config table, can not add device", device_name);
delete this;
}
@@ -67,6 +67,7 @@
\*-----------------------------------------------------------------*/
#define AURA_ROG_STRIX_XG27AQ_PID 0x198C
#define AURA_ROG_STRIX_XG27W_PID 0x1933
#define AURA_ROG_PG32UQ_PID 0x19B9
/*-----------------------------------------------------------------*\
@@ -346,6 +347,7 @@ REGISTER_HID_DETECTOR_PU("ASUS ROG Balteus Qi", DetectAs
| MONITORS |
\*-----------------------------------------------------------------*/
REGISTER_HID_DETECTOR_PU("ASUS ROG Strix XG27AQ", DetectAsusAuraUSBMonitor, AURA_USB_VID, AURA_ROG_STRIX_XG27AQ_PID, 0xFFA0, 1);
REGISTER_HID_DETECTOR_PU("ASUS ROG Strix XG27W", DetectAsusAuraUSBMonitor, AURA_USB_VID, AURA_ROG_STRIX_XG27W_PID, 0xFFA0, 1);
REGISTER_HID_DETECTOR_PU("ASUS ROG PG32UQ", DetectAsusAuraUSBMonitor, AURA_USB_VID, AURA_ROG_PG32UQ_PID, 0xFFA0, 1);
/*-----------------------------------------------------------------*\
@@ -177,12 +177,6 @@ void RGBController_AuraHeadsetStand::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AuraHeadsetStand::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraHeadsetStand::DeviceUpdateMode()
{
unsigned char red = 0;
@@ -35,7 +35,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
@@ -405,7 +405,7 @@ void RGBController_AuraKeyboard::SetupZones()
\*-----------------------------------------------------*/
case SCOPE_LAYOUT:
led_names = default_led_names;
led_zones.push_back({"Keyboard", ZONE_TYPE_MATRIX, 106, new matrix_map_type{6, 22, (unsigned int *)&scope_matrix_map}});
led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 106, new matrix_map_type{6, 22, (unsigned int *)&scope_matrix_map}});
led_names.insert(led_names.begin() + 7, {KEY_EN_LEFT_WINDOWS, 0x15});
led_names.insert(led_names.begin() + 12, {KEY_EN_LEFT_ALT, 0x1D});
@@ -413,8 +413,8 @@ void RGBController_AuraKeyboard::SetupZones()
case SCOPE_RX_LAYOUT:
led_names = default_led_names;
led_zones.push_back({"Keyboard", ZONE_TYPE_MATRIX, 106, new matrix_map_type{6, 22, (unsigned int *)&scope_matrix_map}});
led_zones.push_back({"Logo", ZONE_TYPE_SINGLE, 1});
led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 106, new matrix_map_type{6, 22, (unsigned int *)&scope_matrix_map}});
led_zones.push_back({"Logo", ZONE_TYPE_SINGLE, 1, NULL});
led_names.insert(led_names.begin() + 7, {KEY_EN_LEFT_WINDOWS, 0x15});
led_names.insert(led_names.begin() + 12, {KEY_EN_LEFT_ALT, 0x1D});
@@ -423,9 +423,9 @@ void RGBController_AuraKeyboard::SetupZones()
case SCOPE_TKL_LAYOUT:
led_names = default_tkl_led_names;
led_zones.push_back({"Keyboard", ZONE_TYPE_MATRIX, 86, new matrix_map_type{6, 18, (unsigned int *)&scope_tkl_matrix_map}});
led_zones.push_back({"Logo", ZONE_TYPE_LINEAR, 2});
led_zones.push_back({"Underglow", ZONE_TYPE_LINEAR, 26});
led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 86, new matrix_map_type{6, 18, (unsigned int *)&scope_tkl_matrix_map}});
led_zones.push_back({"Logo", ZONE_TYPE_LINEAR, 2, NULL});
led_zones.push_back({"Underglow", ZONE_TYPE_LINEAR, 26, NULL});
led_names.insert(led_names.begin() + 7, {KEY_EN_LEFT_WINDOWS, 0x15});
led_names.insert(led_names.begin() + 12, {KEY_EN_LEFT_ALT, 0x1D});
@@ -433,9 +433,9 @@ void RGBController_AuraKeyboard::SetupZones()
case FLARE_LAYOUT:
led_names = default_led_names;
led_zones.push_back({"Keyboard", ZONE_TYPE_MATRIX, 106, new matrix_map_type{6, 22, (unsigned int *)&flare_matrix_map}});
led_zones.push_back({"Logo", ZONE_TYPE_SINGLE, 1});
led_zones.push_back({"Underglow", ZONE_TYPE_SINGLE, 2});
led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 106, new matrix_map_type{6, 22, (unsigned int *)&flare_matrix_map}});
led_zones.push_back({"Logo", ZONE_TYPE_SINGLE, 1, NULL});
led_zones.push_back({"Underglow", ZONE_TYPE_SINGLE, 2, NULL});
led_names.insert(led_names.begin() + 7, {KEY_EN_LEFT_WINDOWS, 0x0D});
led_names.insert(led_names.begin() + 12, {KEY_EN_LEFT_ALT, 0x15});
@@ -447,7 +447,7 @@ void RGBController_AuraKeyboard::SetupZones()
case FALCHION_LAYOUT:
led_names = default_65pct_led_names;
led_zones.push_back({"Keyboard", ZONE_TYPE_MATRIX, 68, new matrix_map_type{5, 16, (unsigned int *)&falchion_matrix_map}});
led_zones.push_back({ZONE_EN_KEYBOARD, ZONE_TYPE_MATRIX, 68, new matrix_map_type{5, 16, (unsigned int *)&falchion_matrix_map}});
break;
}
@@ -527,11 +527,6 @@ void RGBController_AuraKeyboard::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AuraKeyboard::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraKeyboard::DeviceUpdateMode()
{
@@ -48,7 +48,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -112,12 +112,6 @@ void RGBController_AuraMonitor::UpdateSingleLED(int led)
controller->ApplyChanges();
}
void RGBController_AuraMonitor::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraMonitor::DeviceUpdateMode()
{
/*---------------------------------------------------------*\
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
@@ -221,11 +221,6 @@ void RGBController_AuraMouse::UpdateSingleLED(int led)
controller->SendUpdate(leds[led].value, modes[active_mode].value, red, grn, blu, 0, false, 0, modes[active_mode].brightness);
}
void RGBController_AuraMouse::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraMouse::DeviceUpdateMode()
{
if(modes[active_mode].color_mode == MODE_COLORS_PER_LED)
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
@@ -22,15 +22,15 @@
RGBController_AuraMousemat::RGBController_AuraMousemat(AuraMousematController* controller_ptr)
{
controller = controller_ptr;
controller = controller_ptr;
name = "ASUS Aura Mousemat";
vendor = "ASUS";
type = DEVICE_TYPE_MOUSEMAT;
description = "ASUS Aura Mousemat Device";
version = controller->GetVersion();
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
name = "ASUS Aura Mousemat";
vendor = "ASUS";
type = DEVICE_TYPE_MOUSEMAT;
description = "ASUS Aura Mousemat Device";
version = controller->GetVersion();
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
mode Direct;
Direct.name = "Direct";
@@ -230,11 +230,6 @@ void RGBController_AuraMousemat::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AuraMousemat::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraMousemat::DeviceUpdateMode()
{
if(modes[active_mode].value == AURA_MOUSEMAT_MODE_DIRECT)
@@ -43,7 +43,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
@@ -169,7 +169,7 @@ void RGBController_AsusAuraRyuoAIO::SetupZones()
SetupColors();
}
void RGBController_AsusAuraRyuoAIO::ResizeZone(int zone, int new_size)
void RGBController_AsusAuraRyuoAIO::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
@@ -194,11 +194,6 @@ void RGBController_AsusAuraRyuoAIO::UpdateSingleLED(int led)
UpdateZoneLEDs(GetLED_Zone(led));
}
void RGBController_AsusAuraRyuoAIO::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AsusAuraRyuoAIO::DeviceUpdateMode()
{
RGBColor colour = (modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) ? modes[active_mode].colors[0] : 0;
@@ -27,8 +27,8 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
int GetDeviceMode();
int GetLED_Zone(int led_idx);
@@ -129,11 +129,6 @@ void RGBController_AuraStrixEvolve::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AuraStrixEvolve::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraStrixEvolve::DeviceUpdateMode()
{
unsigned char red = RGBGetRValue(colors[0]);
@@ -32,7 +32,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
@@ -223,7 +223,7 @@ void RGBController_AuraTUFKeyboard::SetupZones()
int zone_size = 138;
zone keyboard;
keyboard.name = "Keyboard";
keyboard.name = ZONE_EN_KEYBOARD;
keyboard.type = ZONE_TYPE_MATRIX;
keyboard.leds_min = zone_size;
keyboard.leds_max = zone_size;
@@ -271,11 +271,6 @@ void RGBController_AuraTUFKeyboard::UpdateSingleLED(int led)
controller->UpdateSingleLed(led, red, green, blue);
}
void RGBController_AuraTUFKeyboard::SetCustomMode()
{
active_mode = 0;
}
void RGBController_AuraTUFKeyboard::DeviceUpdateMode()
{
unsigned char color_mode;
@@ -35,7 +35,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
@@ -249,11 +249,6 @@ void RGBController_AuraUSB::UpdateSingleLED(int led)
controller->SetChannelLEDs(channel, zones[channel].colors, zones[channel].leds_count);
}
void RGBController_AuraUSB::SetCustomMode()
{
}
void RGBController_AuraUSB::DeviceUpdateMode()
{
initializedMode = true;
@@ -27,7 +27,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -171,7 +171,7 @@ void RGBController_ROGStrixLC_Controller::SetupZones()
SetupColors();
}
void RGBController_ROGStrixLC_Controller::ResizeZone(int zone, int new_size)
void RGBController_ROGStrixLC_Controller::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
@@ -196,18 +196,6 @@ void RGBController_ROGStrixLC_Controller::UpdateSingleLED(int led)
UpdateZoneLEDs(GetLED_Zone(led));
}
void RGBController_ROGStrixLC_Controller::SetCustomMode()
{
for(std::size_t mode_idx = 0; mode_idx < modes.size() ; mode_idx++)
{
if (modes[mode_idx].value == ROGSTRIXLC_CONTROLLER_MODE_DIRECT)
{
active_mode = mode_idx;
break;
}
}
}
void RGBController_ROGStrixLC_Controller::DeviceUpdateMode()
{
RGBColor colour = (modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC) ? modes[active_mode].colors[0] : 0;
@@ -27,7 +27,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
int GetDeviceMode();
@@ -12,9 +12,6 @@
ROGStrixLC_Controller::ROGStrixLC_Controller(hid_device* dev_handle, const char* path) : AuraUSBController(dev_handle, path)
{
const int szTemp = HID_MAX_STR;
wchar_t tmpName[szTemp];
/*-----------------------------------------------------*\
| Add addressable devices |
| Manually adding device info for now |
@@ -34,7 +31,7 @@ std::string ROGStrixLC_Controller::GetLocation()
return("HID: " + location);
}
void ROGStrixLC_Controller::SetMode(unsigned char channel, unsigned char mode, unsigned char red, unsigned char grn, unsigned char blu)
void ROGStrixLC_Controller::SetMode(unsigned char /*channel*/, unsigned char /*mode*/, unsigned char /*red*/, unsigned char /*grn*/, unsigned char /*blu*/)
{
/*---------------------------------------------------------*\
| This interface is not used in this controller however is |
@@ -58,7 +55,7 @@ void ROGStrixLC_Controller::SetMode(unsigned char mode, unsigned char speed, uns
}
}
void ROGStrixLC_Controller::SetChannelLEDs(unsigned char channel, RGBColor * colors, unsigned int num_colors)
void ROGStrixLC_Controller::SetChannelLEDs(unsigned char /*channel*/, RGBColor* /*colors*/, unsigned int /*num_colors*/)
{
/*---------------------------------------------------------*\
| This interface is not used in this controller however is |
@@ -0,0 +1,26 @@
#include "Detector.h"
#include "AsusStrixClawController.h"
#include "RGBController.h"
#include "RGBController_AsusStrixClaw.h"
#include <stdexcept>
#include <hidapi/hidapi.h>
#include "dependencies/dmiinfo.h"
#define ASUS_LEGACY_USB_VID 0x195D
#define ASUS_ROG_STRIX_CLAW_PID 0x1016
void DetectAsusStrixClaw(hid_device_info* info, const std::string& name)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
StrixClawController* controller = new StrixClawController(dev, info->path);
RGBController_StrixClaw* rgb_controller = new RGBController_StrixClaw(controller);
rgb_controller->name = name;
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
REGISTER_HID_DETECTOR_IPU("ASUS ROG Strix Claw", DetectAsusStrixClaw, ASUS_LEGACY_USB_VID, ASUS_ROG_STRIX_CLAW_PID, 0, 0xFF01, 1);
@@ -0,0 +1,97 @@
/*-----------------------------------------*\
| AsusStrixClawController.cpp |
| |
| Driver for ASUS Strix USB |
| lighting controller |
| |
| Mola19 08/06/2022 |
\*-----------------------------------------*/
#include "AsusStrixClawController.h"
#include <cstring>
#include <string>
StrixClawController::StrixClawController(hid_device* dev_handle, const char* path)
{
dev = dev_handle;
location = path;
}
StrixClawController::~StrixClawController()
{
hid_close(dev);
}
std::string StrixClawController::GetDeviceLocation()
{
return("HID: " + location);
}
std::string StrixClawController::GetSerialString()
{
wchar_t serial_string[HID_MAX_STR];
int ret = hid_get_serial_number_string(dev, serial_string, HID_MAX_STR);
if(ret != 0)
{
return("");
}
std::wstring return_wstring = serial_string;
std::string return_string(return_wstring.begin(), return_wstring.end());
return(return_string);
}
std::string StrixClawController::GetVersion()
{
// asking the device to prepare version information
unsigned char usb_buf_out[9];
memset(usb_buf_out, 0x00, 9);
usb_buf_out[0x00] = 0x07;
usb_buf_out[0x01] = 0x80;
hid_send_feature_report(dev, usb_buf_out, 9);
// retrieving the version information
unsigned char usb_buf_in[9];
memset(usb_buf_in, 0x00, 9);
usb_buf_in[0x00] = 0x07;
hid_get_feature_report(dev, usb_buf_in, 9);
return (std::to_string(usb_buf_in[1]) + std::to_string(usb_buf_in[2]));
}
void StrixClawController::SetScrollWheelLED(bool OnOff)
{
unsigned char usb_buf[9];
memset(usb_buf, 0x00, 9);
usb_buf[0x00] = 0x07;
usb_buf[0x01] = 0x07;
usb_buf[0x02] = 0x01;
usb_buf[0x03] = OnOff;
hid_send_feature_report(dev, usb_buf, 9);
}
void StrixClawController::SetLogoLED(uint8_t brightness)
{
unsigned char usb_buf[9];
memset(usb_buf, 0x00, 9);
usb_buf[0x00] = 0x07;
usb_buf[0x01] = 0x0a;
usb_buf[0x02] = 0x01;
usb_buf[0x03] = 0x00;
usb_buf[0x04] = brightness;
hid_send_feature_report(dev, usb_buf, 9);
}
@@ -0,0 +1,35 @@
/*-----------------------------------------*\
| AsusStrixClawController.h |
| |
| Definitions and types for ASUS |
| Legacy USB RGB lighting controller |
| |
| Mola19 08/06/2022 |
\*-----------------------------------------*/
#include "RGBController.h"
#include <string>
#include <hidapi/hidapi.h>
#pragma once
#define HID_MAX_STR 255
class StrixClawController
{
public:
StrixClawController(hid_device* dev_handle, const char* path);
virtual ~StrixClawController();
std::string GetDeviceLocation();
std::string GetSerialString();
std::string GetVersion();
void SetScrollWheelLED(bool OnOff);
void SetLogoLED(uint8_t brightness);
private:
hid_device* dev;
std::string location;
};
@@ -0,0 +1,132 @@
/*-----------------------------------------*\
| RGBController_AsusStrixClaw.cpp |
| |
| Generic RGB Interface for Asus |
| Legacy USB controller driver |
| |
| Mola19 08/06/2022 |
\*-----------------------------------------*/
#include "RGBController_AsusStrixClaw.h"
/**------------------------------------------------------------------*\
@name Asus Strix Claw
@category Mouse
@type USB
@save :robot:
@direct :x:
@effects :tools:
@detectors DetectAsusStrixClaw
@comment
\*-------------------------------------------------------------------*/
RGBController_StrixClaw::RGBController_StrixClaw(StrixClawController* controller_ptr)
{
controller = controller_ptr;
name = "ASUS ROG Strix Claw";
vendor = "ASUS";
type = DEVICE_TYPE_MOUSE;
description = "ASUS Legacy Mouse Device";
version = controller->GetVersion();
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
mode Off;
Off.name = "Off";
Off.value = 0;
Off.flags = MODE_FLAG_AUTOMATIC_SAVE;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
mode On;
On.name = "On";
On.value = 1;
On.flags = MODE_FLAG_AUTOMATIC_SAVE;
On.color_mode = MODE_COLORS_NONE;
modes.push_back(On);
SetupZones();
}
RGBController_StrixClaw::~RGBController_StrixClaw()
{
delete controller;
}
void RGBController_StrixClaw::SetupZones()
{
zone scroll_wheel_zone;
scroll_wheel_zone.name = "Scroll Wheel";
scroll_wheel_zone.type = ZONE_TYPE_SINGLE;
scroll_wheel_zone.leds_min = 1;
scroll_wheel_zone.leds_max = 1;
scroll_wheel_zone.leds_count = 1;
scroll_wheel_zone.matrix_map = NULL;
zones.push_back(scroll_wheel_zone);
led scroll_wheel_led;
scroll_wheel_led.name = "Scroll Wheel LED";
scroll_wheel_led.value = 1;
leds.push_back(scroll_wheel_led);
zone logo_zone;
logo_zone.name = "Logo";
logo_zone.type = ZONE_TYPE_SINGLE;
logo_zone.leds_min = 1;
logo_zone.leds_max = 1;
logo_zone.leds_count = 1;
logo_zone.matrix_map = NULL;
zones.push_back(logo_zone);
led logo_led;
logo_led.name = "Logo LED";
logo_led.value = 1;
leds.push_back(logo_led);
SetupColors();
}
void RGBController_StrixClaw::ResizeZone(int /*zone*/, int /*new_size*/)
{
}
void RGBController_StrixClaw::DeviceUpdateLEDs()
{
}
void RGBController_StrixClaw::UpdateZoneLEDs(int /*zone*/)
{
}
void RGBController_StrixClaw::UpdateSingleLED(int /*led*/)
{
}
void RGBController_StrixClaw::DeviceUpdateMode()
{
if(modes[active_mode].value == 0)
{
controller->SetScrollWheelLED(false);
controller->SetLogoLED(0);
}
else if(modes[active_mode].value == 1)
{
controller->SetScrollWheelLED(true);
controller->SetLogoLED(255);
}
}
@@ -0,0 +1,33 @@
/*-----------------------------------------*\
| RGBController_AsusStrixClaw.h |
| |
| Generic RGB Interface for Asus |
| Legacy USB controller driver |
| |
| Mola19 08/06/2022 |
\*-----------------------------------------*/
#pragma once
#include "RGBController.h"
#include "AsusStrixClawController.h"
class RGBController_StrixClaw : public RGBController
{
public:
RGBController_StrixClaw(StrixClawController* controller_ptr);
~RGBController_StrixClaw();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void DeviceUpdateMode();
private:
StrixClawController* controller;
};
@@ -141,11 +141,6 @@ void RGBController_AsusTUFLaptopWMI::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_AsusTUFLaptopWMI::SetCustomMode()
{
SetMode(0);
}
void RGBController_AsusTUFLaptopWMI::DeviceUpdateMode()
{
DeviceUpdateLEDs();
@@ -20,8 +20,6 @@ public:
void UpdateSingleLED(int led) override;
void DeviceUpdateMode() override;
void SetCustomMode() override;
};
#endif
@@ -137,11 +137,6 @@ void RGBController_BlinkyTape::UpdateSingleLED(int /*led*/)
controller->SetLEDs(colors);
}
void RGBController_BlinkyTape::SetCustomMode()
{
}
void RGBController_BlinkyTape::DeviceUpdateMode()
{
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -0,0 +1,373 @@
/*-------------------------------------------------------------------*\
| CMARGBGen2A1controller.cpp |
| |
| Driver for Coolermaster ARGB Gen 2 A1 USB Controller |
| |
| morg (Morgan Guimard) 6/26/2022 |
| |
\*-------------------------------------------------------------------*/
#include "CMARGBGen2A1controller.h"
#include <cstring>
CMARGBGen2A1controller::CMARGBGen2A1controller(hid_device* dev_handle, const hid_device_info& info)
{
dev = dev_handle;
location = info.path;
wchar_t serial_string[128];
int ret = hid_get_serial_number_string(dev, serial_string, 128);
if(ret != 0)
{
serial_number = "";
}
else
{
std::wstring return_wstring = serial_string;
serial_number = std::string(return_wstring.begin(), return_wstring.end());
}
/*---------------------------------------------*\
| Setup direct mode on start |
\*---------------------------------------------*/
SetupDirectMode();
}
CMARGBGen2A1controller::~CMARGBGen2A1controller()
{
hid_close(dev);
}
std::string CMARGBGen2A1controller::GetDeviceLocation()
{
return("HID: " + location);
}
std::string CMARGBGen2A1controller::GetSerialString()
{
return(serial_number);
}
void CMARGBGen2A1controller::SaveToFlash()
{
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = CM_ARGB_GEN2_A1_COMMAND;
usb_buf[2] = CM_ARGB_GEN2_A1_FLASH;
usb_buf[3] = CM_ARGB_GEN2_A1_WRITE;
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
void CMARGBGen2A1controller::SetupDirectMode()
{
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
/*---------------------------------------------*\
| Swith to direct mode |
\*---------------------------------------------*/
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = CM_ARGB_GEN2_A1_COMMAND;
usb_buf[2] = CM_ARGB_GEN2_A1_LIGHTNING_CONTROL;
usb_buf[3] = CM_ARGB_GEN2_A1_WRITE;
usb_buf[4] = 0x01; // channel???
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
software_mode_activated = true;
}
void CMARGBGen2A1controller::SetupZoneSize(unsigned int zone_id, unsigned int size)
{
/*---------------------------------------------*\
| Set the mode sequence to full static |
| (01 for static) |
| |
| This device stores 2 distinct values |
| - effect speed |
| - approximated zone size |
| |
| It's probably based on standard ARGB sizes |
| Still, the 06 value has some mystery. |
| |
| ES= effect speed |
| LC= LEDs count |
| |
| ES LC |
| ----- |
| 0a 06 |
| 09 06 |
| 08 07 |
| 07 08 |
| 06 0a |
| 05 0c |
| 04 0f |
| 03 14 |
| 02 1e |
| 01 3c |
\*---------------------------------------------*/
const unsigned char gaps[10] =
{
0x05, 0x06, 0x07, 0x08, 0x0A, 0x0C, 0x0F, 0x14, 0x1E, 0x3C
};
unsigned char speed = 0x0A;
for(unsigned int g = 0; g < 10; g++)
{
if(size <= gaps[g])
{
break;
}
speed--;
}
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = CM_ARGB_GEN2_A1_COMMAND;
usb_buf[2] = CM_ARGB_GEN2_A1_SIZES;
usb_buf[3] = CM_ARGB_GEN2_A1_WRITE;
usb_buf[4] = 1 << zone_id;
usb_buf[5] = speed;
usb_buf[6] = size;
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
void CMARGBGen2A1controller::SendDirectChannel(unsigned int zone_id, std::vector<RGBColor> colors)
{
/*---------------------------------------------*\
| Create the color data array |
\*---------------------------------------------*/
std::vector<unsigned char> color_data = CreateColorData(colors);
std::vector<unsigned char>::iterator it = color_data.begin();
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
unsigned int offset;
unsigned char packet_start[CM_ARGB_GEN2_A1_PACKETS_PER_CHANNEL] =
{
0x00, 0x01, 0x82
};
/*---------------------------------------------*\
| Send 3 packets for the zone |
\*---------------------------------------------*/
for(unsigned int p = 0; p < CM_ARGB_GEN2_A1_PACKETS_PER_CHANNEL; p++)
{
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = packet_start[p];
usb_buf[2] = 0x09;
if(p == 0)
{
usb_buf[3] = 1 << zone_id;
usb_buf[5] = 0x3C;
offset = 6;
}
else
{
offset = 3;
}
while(offset < CM_ARGB_GEN2_A1_PACKET_LENGTH && it != color_data.end())
{
usb_buf[offset] = *it;
offset++;
it++;
}
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
/*---------------------------------------------*\
| This device needs some delay before we send |
| any other packet |
\*---------------------------------------------*/
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
/*---------------------------------------------*\
| Next channel needs some delay as well |
\*---------------------------------------------*/
std::this_thread::sleep_for(std::chrono::milliseconds(2));
}
void CMARGBGen2A1controller::SetMode(unsigned int mode_value, unsigned char speed, unsigned char brightness, RGBColor color, bool random)
{
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
/*---------------------------------------------*\
| Switch to hardware mode if needed |
\*---------------------------------------------*/
if(software_mode_activated)
{
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = CM_ARGB_GEN2_A1_COMMAND;
usb_buf[2] = CM_ARGB_GEN2_A1_LIGHTNING_CONTROL;
usb_buf[3] = CM_ARGB_GEN2_A1_WRITE;
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
software_mode_activated = false;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
/*---------------------------------------------*\
| Set the mode values and write to the device |
\*---------------------------------------------*/
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = CM_ARGB_GEN2_A1_COMMAND;
usb_buf[2] = CM_ARGB_GEN2_A1_HW_MODE_SETUP;
usb_buf[3] = CM_ARGB_GEN2_A1_WRITE;
usb_buf[4] = 0xFF;
usb_buf[5] = 0xFF;
usb_buf[6] = mode_value;
bool is_custom_mode = mode_value == CM_ARGB_GEN2_A1_CUSTOM_MODE;
if(is_custom_mode)
{
usb_buf[8] = 0xFF;
}
else
{
usb_buf[7] = speed;
usb_buf[8] = brightness;
usb_buf[9] = RGBGetRValue(color);
usb_buf[10] = RGBGetGValue(color);
usb_buf[11] = RGBGetBValue(color);
usb_buf[12] = random;
}
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
if(is_custom_mode)
{
for(unsigned int channel = 0; channel < CM_ARGB_GEN2_A1_CHANNEL_COUNT; channel++)
{
SetCustomSequence(channel);
}
}
}
std::vector<unsigned char> CMARGBGen2A1controller::CreateColorData(std::vector<RGBColor> colors)
{
std::vector<unsigned char> color_data;
for(unsigned int c = 0; c < colors.size(); c++)
{
color_data.push_back(RGBGetRValue(colors[c]));
color_data.push_back(RGBGetGValue(colors[c]));
color_data.push_back(RGBGetBValue(colors[c]));
}
return color_data;
}
void CMARGBGen2A1controller::SetCustomColors(unsigned int zone_id, std::vector<RGBColor> colors)
{
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
/*---------------------------------------------*\
| Create the color data array |
\*---------------------------------------------*/
std::vector<unsigned char> color_data = CreateColorData(colors);
std::vector<unsigned char>::iterator it = color_data.begin();
unsigned char packet_start[5] =
{
CM_ARGB_GEN2_A1_COMMAND, 0x00, 0x01, 0x02, 0x83
};
/*---------------------------------------------*\
| Send the 5 packets of colors |
\*---------------------------------------------*/
for(unsigned int p = 0; p < 5; p++)
{
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = packet_start[p];
/*----------------------------------------------*\
| This part isnt well understood |
| 1st packet starts with CM_ARGB_GEN2_A1_COMMAND |
| Looks like it is a read command |
\*----------------------------------------------*/
usb_buf[2] = p == 0 ? 0x06 : 0x08; // 0x08 custom data, 0x06 sizes?
usb_buf[3] = p == 0 ? 0x01 : 0x02; // read/write has no meaning here
usb_buf[4] = 1 << zone_id;
unsigned int offset = 6;
while(p > 0 && offset < CM_ARGB_GEN2_A1_PACKET_LENGTH && it != color_data.end())
{
usb_buf[offset] = *it;
offset++;
it++;
}
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
std::this_thread::sleep_for(std::chrono::milliseconds(20));
}
}
void CMARGBGen2A1controller::SetCustomSequence(unsigned int zone_id)
{
unsigned char usb_buf[CM_ARGB_GEN2_A1_PACKET_LENGTH];
const unsigned char static_seq = 0x01;
/*---------------------------------------------*\
| Set the mode sequence to full static |
| (01 for static) |
\*---------------------------------------------*/
memset(usb_buf, 0x00, CM_ARGB_GEN2_A1_PACKET_LENGTH);
usb_buf[1] = CM_ARGB_GEN2_A1_COMMAND;
usb_buf[2] = CM_ARGB_GEN2_A1_CUSTOM_SEQUENCES;
usb_buf[3] = CM_ARGB_GEN2_A1_WRITE;
usb_buf[4] = 1 << zone_id;
usb_buf[5] = static_seq;
usb_buf[6] = static_seq;
usb_buf[7] = static_seq;
usb_buf[8] = static_seq;
usb_buf[9] = static_seq;
usb_buf[10] = static_seq;
hid_write(dev, usb_buf, CM_ARGB_GEN2_A1_PACKET_LENGTH);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
@@ -0,0 +1,89 @@
/*-------------------------------------------------------------------*\
| CMARGBGen2A1controller.h |
| |
| Driver for Coolermaster ARGB Gen 2 A1 USB Controller |
| |
| morg (Morgan Guimard) 6/26/2022 |
| |
\*-------------------------------------------------------------------*/
#include "RGBController.h"
#include <string>
#include <hidapi/hidapi.h>
#pragma once
#define CM_ARGB_GEN2_A1_PACKET_LENGTH 65
#define CM_ARGB_GEN2_A1_CHANNEL_MAX_SIZE 48
#define CM_ARGB_GEN2_A1_CHANNEL_COUNT 3
#define CM_ARGB_GEN2_A1_PACKETS_PER_CHANNEL 3
enum
{
CM_ARGB_GEN2_A1_DIRECT_MODE = 0xFF,
CM_ARGB_GEN2_A1_SPECTRUM_MODE = 0x00,
CM_ARGB_GEN2_A1_STATIC_MODE = 0x01,
CM_ARGB_GEN2_A1_RELOAD_MODE = 0x02,
CM_ARGB_GEN2_A1_RECOIL_MODE = 0x03,
CM_ARGB_GEN2_A1_BREATHING_MODE = 0x04,
CM_ARGB_GEN2_A1_REFILL_MODE = 0x05,
CM_ARGB_GEN2_A1_DEMO_MODE = 0x06,
CM_ARGB_GEN2_A1_FILL_FLOW_MODE = 0x07,
CM_ARGB_GEN2_A1_RAINBOW_MODE = 0x08,
CM_ARGB_GEN2_A1_CUSTOM_MODE = 0xC0,
CM_ARGB_GEN2_A1_OFF_MODE = 0x09
};
enum
{
CM_ARGB_GEN2_A1_BRIGHTNESS_MAX = 0xFF,
CM_ARGB_GEN2_A1_BRIGHTNESS_MIN = 0x00,
CM_ARGB_GEN2_A1_SPEED_MAX = 0x04,
CM_ARGB_GEN2_A1_SPEED_MIN = 0x00,
};
enum
{
CM_ARGB_GEN2_A1_COMMAND = 0x80,
CM_ARGB_GEN2_A1_READ = 0x01,
CM_ARGB_GEN2_A1_WRITE = 0x02,
CM_ARGB_GEN2_A1_RESPONSE = 0x03
};
enum
{
CM_ARGB_GEN2_A1_SIZES = 0x06,
CM_ARGB_GEN2_A1_FLASH = 0x0B,
CM_ARGB_GEN2_A1_IDENTIFY = 0x0A,
CM_ARGB_GEN2_A1_LIGHTNING_CONTROL = 0x01,
CM_ARGB_GEN2_A1_HW_MODE_SETUP = 0x03,
CM_ARGB_GEN2_A1_CUSTOM_SEQUENCES = 0x10,
CM_ARGB_GEN2_A1_CUSTOM_SPEED = 0x11
};
class CMARGBGen2A1controller
{
public:
CMARGBGen2A1controller(hid_device* dev_handle, const hid_device_info& info);
~CMARGBGen2A1controller();
std::string GetSerialString();
std::string GetDeviceLocation();
void SendDirectChannel(unsigned int zone_id, std::vector<RGBColor> colors);
void SetupZoneSize(unsigned int zone_id, unsigned int size);
void SetupDirectMode();
void SetMode(unsigned int mode_value, unsigned char speed, unsigned char brightness, RGBColor color, bool random);
void SetCustomColors(unsigned int zone_id, std::vector<RGBColor> colors);
void SaveToFlash();
private:
std::string serial_number;
std::string location;
bool software_mode_activated = false;
hid_device* dev;
void SetCustomSequence(unsigned int zone_id);
std::vector<unsigned char> CreateColorData(std::vector<RGBColor> colors);
};
@@ -28,6 +28,7 @@ enum
CM_MM531_PID = 0x0097,
CM_MM711_PID = 0x0101,
CM_MM720_PID = 0x0141,
CM_MM730_PID = 0x0165,
};
enum
@@ -9,10 +9,11 @@
#include "CMR6000Controller.h"
#include <cstring>
CMR6000Controller::CMR6000Controller(hid_device* dev_handle, char *_path)
CMR6000Controller::CMR6000Controller(hid_device* dev_handle, char *_path, uint16_t _pid)
{
dev = dev_handle;
location = _path;
pid = _pid;
const int szTemp = 256;
wchar_t tmpName[szTemp];
@@ -59,21 +60,6 @@ unsigned char CMR6000Controller::GetMode()
return current_mode;
}
unsigned char CMR6000Controller::GetLedRed()
{
return current_red;
}
unsigned char CMR6000Controller::GetLedGreen()
{
return current_green;
}
unsigned char CMR6000Controller::GetLedBlue()
{
return current_blue;
}
unsigned char CMR6000Controller::GetLedSpeed()
{
return current_speed;
@@ -89,13 +75,17 @@ bool CMR6000Controller::GetRandomColours()
return current_random;
}
void CMR6000Controller::SetMode(unsigned char mode, unsigned char speed, unsigned char red, unsigned char green, unsigned char blue, unsigned char random, unsigned char brightness)
uint16_t CMR6000Controller::GetPID()
{
return pid;
}
void CMR6000Controller::SetMode(unsigned char mode, unsigned char speed, RGBColor color1, RGBColor color2, unsigned char random, unsigned char brightness)
{
current_mode = mode;
current_speed = speed;
current_red = red;
current_green = green;
current_blue = blue;
primary = color1;
secondary = color2;
current_random = random;
current_brightness = brightness;
@@ -103,7 +93,7 @@ void CMR6000Controller::SetMode(unsigned char mode, unsigned char speed, unsigne
}
void CMR6000Controller::SendUpdate()
{
{
if(current_mode == CM_MR6000_MODE_OFF)
{
unsigned char buffer[CM_6K_PACKET_SIZE] = { 0x00, 0x41, 0x43 };
@@ -114,6 +104,11 @@ void CMR6000Controller::SendUpdate()
{
SendEnableCommand();
if(pid == COOLERMASTER_RADEON_6900_PID)
{
SendSecondColour();
}
unsigned char buffer[CM_6K_PACKET_SIZE] = { 0x00 };
int buffer_size = (sizeof(buffer) / sizeof(buffer[0]));
memset(buffer, 0xFF, buffer_size);
@@ -124,18 +119,39 @@ void CMR6000Controller::SendUpdate()
buffer[0x03] = 0x01;
buffer[0x04] = 0x00;
buffer[0x05] = current_mode;
buffer[0x06] = (current_mode == CM_MR6000_MODE_DIRECT) ? 0xFF: current_speed;
buffer[0x07] = (current_mode == CM_MR6000_MODE_BREATHE)? current_random : 0x00; //random (A0)
buffer[0x08] = (current_mode == CM_MR6000_MODE_BREATHE)? 0x03 : 0xFF;
buffer[0x06] = current_speed;
buffer[0x07] = current_random; //random (A0)
//buffer[0x09] = 0xFF;
buffer[0x0A] = current_brightness;
buffer[0x0B] = (current_mode == CM_MR6000_MODE_COLOR_CYCLE) ? 0xFF : current_red;
buffer[0x0C] = (current_mode == CM_MR6000_MODE_COLOR_CYCLE) ? 0xFF : current_green;
buffer[0x0D] = (current_mode == CM_MR6000_MODE_COLOR_CYCLE) ? 0xFF : current_blue;
buffer[0x0B] = (current_mode == CM_MR6000_MODE_COLOR_CYCLE) ? 0xFF : RGBGetRValue(primary);
buffer[0x0C] = (current_mode == CM_MR6000_MODE_COLOR_CYCLE) ? 0xFF : RGBGetGValue(primary);
buffer[0x0D] = (current_mode == CM_MR6000_MODE_COLOR_CYCLE) ? 0xFF : RGBGetBValue(primary);
buffer[0x0E] = 0x00;
buffer[0x0F] = 0x00;
buffer[0x10] = 0x00;
/*-----------------------------------------------------------------*\
| Index 0x08 looks to be mode specific flags / options |
\*-----------------------------------------------------------------*/
switch(current_mode)
{
case CM_MR6000_MODE_BREATHE:
buffer[0x08] = 0x03;
break;
case CM_MR6000_MODE_RAINBOW:
buffer[0x08] = 0x05;
break;
case CM_MR6000_MODE_CHASE:
buffer[0x08] = 0xC3;
break;
case CM_MR6000_MODE_SWIRL:
buffer[0x08] = 0x4A;
break;
default:
buffer[0x08] = 0xFF;
}
hid_write(dev, buffer, buffer_size);
SendColourConfig();
@@ -174,3 +190,18 @@ void CMR6000Controller::SendColourConfig()
hid_write(dev, buffer, buffer_size);
hid_read_timeout(dev, buffer, buffer_size, CM_6K_INTERRUPT_TIMEOUT);
}
void CMR6000Controller::SendSecondColour()
{
unsigned char buffer[CM_6K_PACKET_SIZE] = { 0x00, 0x51, 0x9C, 0x01, 0x00 };
buffer[5] = RGBGetRValue(primary);
buffer[6] = RGBGetGValue(primary);
buffer[7] = RGBGetBValue(primary);
buffer[8] = RGBGetRValue(secondary);
buffer[9] = RGBGetGValue(secondary);
buffer[10] = RGBGetBValue(secondary);
hid_write(dev, buffer, CM_6K_PACKET_SIZE);
hid_read_timeout(dev, buffer, CM_6K_PACKET_SIZE, CM_6K_INTERRUPT_TIMEOUT);
}
@@ -9,21 +9,31 @@
#include <string>
#include <array>
#include <hidapi/hidapi.h>
#include "RGBController.h"
#pragma once
#define CM_6K_PACKET_SIZE 65 //Includes extra first byte for non HID Report packets
#define CM_6K_INTERRUPT_TIMEOUT 250
#define CM_6K_DEVICE_NAME_SIZE (sizeof(device_name) / sizeof(device_name[ 0 ]))
#define CM_6K_SERIAL_SIZE (sizeof(serial) / sizeof(serial[ 0 ]))
#define HID_MAX_STR 255
#define COOLERMASTER_RADEON_6000_PID 0x014D
#define COOLERMASTER_RADEON_6900_PID 0x015B
#define CM_6K_PACKET_SIZE 65 //Includes extra first byte for non HID Report packets
#define CM_6K_INTERRUPT_TIMEOUT 250
#define CM_6K_DEVICE_NAME_SIZE (sizeof(device_name) / sizeof(device_name[ 0 ]))
#define CM_6K_SERIAL_SIZE (sizeof(serial) / sizeof(serial[ 0 ]))
#define HID_MAX_STR 255
enum
{
CM_MR6000_MODE_DIRECT = 0x00, //Direct Mode
CM_MR6000_MODE_BREATHE = 0x01, //Breathe Mode
CM_MR6000_MODE_COLOR_CYCLE = 0x02, //Color cycle
CM_MR6000_MODE_OFF = 0xFF, //Off
CM_MR6000_MODE_DIRECT = 0x00, //Direct Mode
CM_MR6000_MODE_BREATHE = 0x01, //Breathe Mode
CM_MR6000_MODE_COLOR_CYCLE = 0x02, //Color cycle
CM_MR6000_MODE_RAINBOW = 0x07, //Rainbow
CM_MR6000_MODE_BOUNCE = 0x08, //Bounce
CM_MR6000_MODE_CHASE = 0x09, //Chase
CM_MR6000_MODE_SWIRL = 0x0A, //Swirl
CM_MR6000_MODE_OFF = 0xFF, //Off
};
enum
@@ -34,6 +44,10 @@ enum
MR6000_CYCLE_SPEED_FAST = 0x6E, /* Fast speed */
MR6000_CYCLE_SPEED_FASTEST = 0x68, /* Fastest speed */
MR6000_RAINBOW_SPEED_SLOWEST = 0x78, /* Slowest speed */
MR6000_RAINBOW_SPEED_NORMAL = 0x6B, /* Normal speed */
MR6000_RAINBOW_SPEED_FASTEST = 0x60, /* Fastest speed */
MR6000_BREATHE_SPEED_SLOWEST = 0x3C, /* Slowest speed */
MR6000_BREATHE_SPEED_SLOW = 0x37, /* Slow speed */
MR6000_BREATHE_SPEED_NORMAL = 0x31, /* Normal speed */
@@ -44,39 +58,39 @@ enum
class CMR6000Controller
{
public:
CMR6000Controller(hid_device* dev_handle, char *_path);
CMR6000Controller(hid_device* dev_handle, char *_path, uint16_t _pid);
~CMR6000Controller();
std::string GetDeviceName();
std::string GetSerial();
std::string GetLocation();
std::string GetDeviceName();
std::string GetSerial();
std::string GetLocation();
unsigned char GetMode();
unsigned char GetLedRed();
unsigned char GetLedGreen();
unsigned char GetLedBlue();
unsigned char GetLedSpeed();
unsigned char GetBrightness();
bool GetRandomColours();
void SetMode(unsigned char mode, unsigned char speed, unsigned char red, unsigned char green, unsigned char blue, unsigned char random, unsigned char brightness);
unsigned char GetMode();
unsigned char GetLedSpeed();
unsigned char GetBrightness();
bool GetRandomColours();
uint16_t GetPID();
void SetMode(unsigned char mode, unsigned char speed, RGBColor color1, RGBColor color2, unsigned char random, unsigned char brightness);
private:
std::string device_name;
std::string serial;
std::string location;
hid_device* dev;
std::string device_name;
std::string serial;
std::string location;
hid_device* dev;
uint16_t pid;
unsigned char current_mode;
unsigned char current_speed;
unsigned char current_random;
unsigned char current_mode;
unsigned char current_speed;
unsigned char current_random;
unsigned char current_red;
unsigned char current_green;
unsigned char current_blue;
unsigned char current_brightness;
unsigned char current_brightness;
RGBColor primary;
RGBColor secondary;
void SendUpdate();
void SendEnableCommand();
void SendApplyCommand();
void SendColourConfig();
void SendUpdate();
void SendEnableCommand();
void SendApplyCommand();
void SendColourConfig();
void SendSecondColour();
};
@@ -12,6 +12,11 @@
#include "CMSmallARGBController.h"
#include <cstring>
cm_small_argb_headers cm_small_argb_header_data[1] =
{
{ "CM Small ARGB", 0x01, true, 12 }
};
CMSmallARGBController::CMSmallARGBController(hid_device* dev_handle, char *_path, unsigned char _zone_idx)
{
const int szTemp = 256;
@@ -215,7 +220,7 @@ void CMSmallARGBController::SendUpdate()
buffer[CM_SMALL_ARGB_COMMAND_BYTE] = 0x0b;
buffer[CM_SMALL_ARGB_FUNCTION_BYTE] = (false) ? 0x01 : 0x02; //This controls custom mode TODO
buffer[CM_SMALL_ARGB_ZONE_BYTE] = small_argb_header_data[zone_index].header;
buffer[CM_SMALL_ARGB_ZONE_BYTE] = cm_small_argb_header_data[zone_index].header;
buffer[CM_SMALL_ARGB_MODE_BYTE] = current_mode;
buffer[CM_SMALL_ARGB_SPEED_BYTE] = current_speed;
buffer[CM_SMALL_ARGB_COLOUR_INDEX_BYTE] = (bool_random) ? 0x00 : 0x10; //This looks to still be the colour index and controls random colours
@@ -34,7 +34,7 @@ enum
CM_SMALL_ARGB_BLUE_BYTE = 11,
};
struct _argb_headers
struct cm_small_argb_headers
{
const char* name;
unsigned char header;
@@ -42,10 +42,7 @@ struct _argb_headers
unsigned int count;
};
static _argb_headers small_argb_header_data[1] =
{
{ "CM Small ARGB", 0x01, true, 12 }
};
extern cm_small_argb_headers cm_small_argb_header_data[1];
enum
{
@@ -1,41 +1,67 @@
/*-----------------------------------------------------*\
| OpenRGB includes |
\*-----------------------------------------------------*/
#include <hidapi/hidapi.h>
#include "Detector.h"
#include "CMMM711Controller.h"
#include "CMMP750Controller.h"
#include "CMARGBcontroller.h"
#include "CMSmallARGBController.h"
#include "CMRGBController.h"
#include "CMR6000Controller.h"
#include "CMMKController.h"
#include "LogManager.h"
#include "RGBController.h"
/*-----------------------------------------------------*\
| Coolermaster specific includes |
\*-----------------------------------------------------*/
#include "RGBController_CMMMController.h"
#include "RGBController_CMMM711Controller.h"
#include "RGBController_CMMP750Controller.h"
#include "RGBController_CMARGBController.h"
#include "RGBController_CMSmallARGBController.h"
#include "RGBController_CMARGBGen2A1Controller.h"
#include "RGBController_CMRGBController.h"
#include "RGBController_CMR6000Controller.h"
#include "RGBController_CMMKController.h"
#include <hidapi/hidapi.h>
#define COOLERMASTER_VID 0x2516
/*-----------------------------------------------------*\
| Coolermaster USB vendor ID |
\*-----------------------------------------------------*/
#define COOLERMASTER_VID 0x2516
#define COOLERMASTER_MM530_PID 0x0065
#define COOLERMASTER_MM531_PID 0x0097
#define COOLERMASTER_MM711_PID 0x0101
#define COOLERMASTER_MM720_PID 0x0141
#define COOLERMASTER_MP750_XL_PID 0x0109
#define COOLERMASTER_MP750_L_PID 0x0107
#define COOLERMASTER_MP750_MEDIUM_PID 0x0105
#define COOLERMASTER_ARGB_PID 0x1011
#define COOLERMASTER_SMALL_ARGB_PID 0x1000
#define COOLERMASTER_RGB_PID 0x004F
#define COOLERMASTER_RADEON_6000_PID 0x014D
#define COOLERMASTER_MASTERKEYS_PRO_L_PID 0x003B
#define COOLERMASTER_MASTERKEYS_PRO_L_WHITE_PID 0x0047
#define COOLERMASTER_MASTERKEYS_PRO_S_PID 0x003C
#define COOLERMASTER_MASTERKEYS_MK750_PID 0x0067
#define COOLERMASTER_MASTERKEYS_SK630_PID 0x0089
#define COOLERMASTER_MASTERKEYS_SK650_PID 0x008D
/*-----------------------------------------------------*\
| Coolermaster Keyboards |
\*-----------------------------------------------------*/
#define COOLERMASTER_MASTERKEYS_PRO_L_PID 0x003B
#define COOLERMASTER_MASTERKEYS_PRO_L_WHITE_PID 0x0047
#define COOLERMASTER_MASTERKEYS_PRO_S_PID 0x003C
#define COOLERMASTER_MASTERKEYS_MK750_PID 0x0067
#define COOLERMASTER_MASTERKEYS_SK630_PID 0x0089
#define COOLERMASTER_MASTERKEYS_SK650_PID 0x008D
/*-----------------------------------------------------*\
| Coolermaster GPUs |
| PIDs defined in `CMR6000Controller.h` |
\*-----------------------------------------------------*/
/*-----------------------------------------------------*\
| Coolermaster LEDstrip controllers |
\*-----------------------------------------------------*/
#define COOLERMASTER_ARGB_PID 0x1011
#define COOLERMASTER_ARGB_GEN2_A1_PID 0x0173
#define COOLERMASTER_SMALL_ARGB_PID 0x1000
#define COOLERMASTER_RGB_PID 0x004F
/*-----------------------------------------------------*\
| Coolermaster Mice |
\*-----------------------------------------------------*/
#define COOLERMASTER_MM530_PID 0x0065
#define COOLERMASTER_MM531_PID 0x0097
#define COOLERMASTER_MM711_PID 0x0101
#define COOLERMASTER_MM720_PID 0x0141
#define COOLERMASTER_MM730_PID 0x0165
/*-----------------------------------------------------*\
| Coolermaster Mousemats |
\*-----------------------------------------------------*/
#define COOLERMASTER_MP750_XL_PID 0x0109
#define COOLERMASTER_MP750_L_PID 0x0107
#define COOLERMASTER_MP750_MEDIUM_PID 0x0105
/******************************************************************************************\
* *
@@ -67,13 +93,26 @@ void DetectCoolerMasterARGB(hid_device_info* info, const std::string&)
}
}
void DetectCoolerMasterARGBGen2A1(hid_device_info* info, const std::string&)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
CMARGBGen2A1controller* controller = new CMARGBGen2A1controller(dev, *info);
RGBController_CMARGBGen2A1Controller* rgb_controller = new RGBController_CMARGBGen2A1Controller(controller);
// Constructor sets the name
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
}
void DetectCoolerMasterGPU(hid_device_info* info, const std::string&)
{
hid_device* dev = hid_open_path(info->path);
if(dev)
{
CMR6000Controller* controller = new CMR6000Controller(dev, info->path);
CMR6000Controller* controller = new CMR6000Controller(dev, info->path, info->product_id);
RGBController_CMR6000Controller* rgb_controller = new RGBController_CMR6000Controller(controller);
// Constructor sets the name
ResourceManager::get()->RegisterRGBController(rgb_controller);
@@ -99,21 +138,32 @@ void DetectCoolerMasterMouse(hid_device_info* info, const std::string& name)
if(dev)
{
if(info->product_id == COOLERMASTER_MM530_PID || info->product_id == COOLERMASTER_MM531_PID)
switch(info->product_id)
{
CMMMController* controller = new CMMMController(dev, info->path, info->product_id);
RGBController_CMMMController* rgb_controller = new RGBController_CMMMController(controller);
rgb_controller->name = name;
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
else if(info->product_id == COOLERMASTER_MM711_PID)
{
CMMM711Controller* controller = new CMMM711Controller(dev, info->path);
RGBController_CMMM711Controller* rgb_controller = new RGBController_CMMM711Controller(controller);
// Constructor sets the name
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
case COOLERMASTER_MM530_PID:
case COOLERMASTER_MM531_PID:
case COOLERMASTER_MM720_PID:
case COOLERMASTER_MM730_PID:
{
CMMMController* controller = new CMMMController(dev, info->path, info->product_id);
RGBController_CMMMController* rgb_controller = new RGBController_CMMMController(controller);
rgb_controller->name = name;
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
break;
case COOLERMASTER_MM711_PID:
{
CMMM711Controller* controller = new CMMM711Controller(dev, info->path);
RGBController_CMMM711Controller* rgb_controller = new RGBController_CMMM711Controller(controller);
// Constructor sets the name
ResourceManager::get()->RegisterRGBController(rgb_controller);
}
break;
default:
LOG_DEBUG("[%s] Controller not created as the product ID %04X is missing from detector switch", name.c_str(), info->product_id);
}
}
}
@@ -156,20 +206,43 @@ void DetectCoolerMasterSmallARGB(hid_device_info* info, const std::string&)
}
}
REGISTER_HID_DETECTOR_IPU("Cooler Master MM530", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM530_PID, 1, 0xFF00, 1);
//REGISTER_HID_DETECTOR_IPU("Cooler Master MM531", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM531_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MM711", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM711_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MM720", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM720_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_PU ("Cooler Master MP750 XL", DetectCoolerMasterMousemats, COOLERMASTER_VID, COOLERMASTER_MP750_XL_PID, 0xFF00, 1);
REGISTER_HID_DETECTOR_PU ("Cooler Master MP750 Large", DetectCoolerMasterMousemats, COOLERMASTER_VID, COOLERMASTER_MP750_L_PID, 0xFF00, 1);
REGISTER_HID_DETECTOR_PU ("Cooler Master MP750 Medium", DetectCoolerMasterMousemats, COOLERMASTER_VID, COOLERMASTER_MP750_MEDIUM_PID, 0xFF00, 1);
/*-----------------------------------------------------*\
| Coolermaster Keyboards |
\*-----------------------------------------------------*/
REGISTER_HID_DETECTOR_IPU("Cooler Master MasterKeys Pro L", DetectCoolerMasterKeyboards, COOLERMASTER_VID, COOLERMASTER_MASTERKEYS_PRO_L_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MasterKeys Pro L White", DetectCoolerMasterKeyboards, COOLERMASTER_VID, COOLERMASTER_MASTERKEYS_PRO_L_WHITE_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MasterKeys Pro S", DetectCoolerMasterKeyboards, COOLERMASTER_VID, COOLERMASTER_MASTERKEYS_PRO_S_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MK570", DetectCoolerMasterKeyboards, COOLERMASTER_VID, COOLERMASTER_MASTERKEYS_MK750_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master SK630", DetectCoolerMasterKeyboards, COOLERMASTER_VID, COOLERMASTER_MASTERKEYS_SK630_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master SK650", DetectCoolerMasterKeyboards, COOLERMASTER_VID, COOLERMASTER_MASTERKEYS_SK650_PID, 1, 0xFF00, 1);
/*-----------------------------------------------------*\
| Coolermaster LEDstrip controllers |
\*-----------------------------------------------------*/
REGISTER_HID_DETECTOR_IPU("Cooler Master ARGB", DetectCoolerMasterARGB, COOLERMASTER_VID, COOLERMASTER_ARGB_PID, 0, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master Small ARGB", DetectCoolerMasterSmallARGB, COOLERMASTER_VID, COOLERMASTER_SMALL_ARGB_PID, 0, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master ARGB Gen 2 A1", DetectCoolerMasterARGBGen2A1, COOLERMASTER_VID, COOLERMASTER_ARGB_GEN2_A1_PID, 1, 0xFF01, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master RGB", DetectCoolerMasterRGB, COOLERMASTER_VID, COOLERMASTER_RGB_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master Small ARGB", DetectCoolerMasterSmallARGB, COOLERMASTER_VID, COOLERMASTER_SMALL_ARGB_PID, 0, 0xFF00, 1);
/*-----------------------------------------------------*\
| Coolermaster Mice |
\*-----------------------------------------------------*/
REGISTER_HID_DETECTOR_IPU("Cooler Master MM530", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM530_PID, 1, 0xFF00, 1);
//REGISTER_HID_DETECTOR_IPU("Cooler Master MM531", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM531_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MM711", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM711_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MM720", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM720_PID, 1, 0xFF00, 1);
REGISTER_HID_DETECTOR_IPU("Cooler Master MM730", DetectCoolerMasterMouse, COOLERMASTER_VID, COOLERMASTER_MM730_PID, 1, 0xFF00, 1);
/*-----------------------------------------------------*\
| Coolermaster Mousemats |
\*-----------------------------------------------------*/
REGISTER_HID_DETECTOR_PU ("Cooler Master MP750 XL", DetectCoolerMasterMousemats, COOLERMASTER_VID, COOLERMASTER_MP750_XL_PID, 0xFF00, 1);
REGISTER_HID_DETECTOR_PU ("Cooler Master MP750 Large", DetectCoolerMasterMousemats, COOLERMASTER_VID, COOLERMASTER_MP750_L_PID, 0xFF00, 1);
REGISTER_HID_DETECTOR_PU ("Cooler Master MP750 Medium", DetectCoolerMasterMousemats, COOLERMASTER_VID, COOLERMASTER_MP750_MEDIUM_PID, 0xFF00, 1);
/*-----------------------------------------------------*\
| Coolermaster GPUs |
| PIDs defined in `CMR6000Controller.h` |
\*-----------------------------------------------------*/
REGISTER_HID_DETECTOR_I ("Cooler Master Radeon 6000 GPU", DetectCoolerMasterGPU, COOLERMASTER_VID, COOLERMASTER_RADEON_6000_PID, 1 );
REGISTER_HID_DETECTOR_I ("Cooler Master Radeon 6900 GPU", DetectCoolerMasterGPU, COOLERMASTER_VID, COOLERMASTER_RADEON_6900_PID, 1 );
@@ -0,0 +1,305 @@
/*-------------------------------------------------------------------*\
| RGBController_CMARGBGen2A1Controller.cpp |
| |
| Driver for Coolermaster ARGB Gen 2 A1 USB Controller |
| |
| morg (Morgan Guimard) 6/26/2022 |
| |
\*-------------------------------------------------------------------*/
#include "RGBController_CMARGBGen2A1Controller.h"
#include <thread>
#include <chrono>
/**------------------------------------------------------------------*\
@name Coolermaster ARGB A1
@category LEDStrip
@type USB
@save :white_check_mark:
@direct :white_check_mark:
@effects :white_check_mark:
@detectors DetectCoolerMasterARGBGen2A1
@comment This device does not have Gen 2 support in OpenRGB yet.
Gen2 has auto-resize feature and parallel to serial magical stuff.<
\*-------------------------------------------------------------------*/
RGBController_CMARGBGen2A1Controller::RGBController_CMARGBGen2A1Controller(CMARGBGen2A1controller* controller_ptr)
{
controller = controller_ptr;
name = "CoolerMaster LED Controller A1";
vendor = "CoolerMaster";
type = DEVICE_TYPE_LEDSTRIP;
description = name;
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
version = "";
mode Direct;
Direct.name = "Direct";
Direct.value = CM_ARGB_GEN2_A1_DIRECT_MODE;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
mode Spectrum;
Spectrum.name = "Spectrum";
Spectrum.value = CM_ARGB_GEN2_A1_SPECTRUM_MODE;
Spectrum.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
Spectrum.color_mode = MODE_COLORS_NONE;
Spectrum.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Spectrum.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Spectrum.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Spectrum.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
Spectrum.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
Spectrum.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
modes.push_back(Spectrum);
mode Static;
Static.name = "Static";
Static.value = CM_ARGB_GEN2_A1_STATIC_MODE;
Static.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_MANUAL_SAVE;
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
Static.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Static.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Static.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Static.colors.resize(1);
modes.push_back(Static);
mode Reload;
Reload.name = "Reload";
Reload.value = CM_ARGB_GEN2_A1_RELOAD_MODE;
Reload.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
Reload.color_mode = MODE_COLORS_MODE_SPECIFIC;
Reload.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Reload.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Reload.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Reload.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
Reload.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
Reload.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
Reload.colors.resize(1);
modes.push_back(Reload);
mode Recoil;
Recoil.name = "Recoil";
Recoil.value = CM_ARGB_GEN2_A1_RECOIL_MODE;
Recoil.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
Recoil.color_mode = MODE_COLORS_MODE_SPECIFIC;
Recoil.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Recoil.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Recoil.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Recoil.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
Recoil.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
Recoil.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
Recoil.colors.resize(1);
modes.push_back(Recoil);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = CM_ARGB_GEN2_A1_BREATHING_MODE;
Breathing.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Breathing.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Breathing.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Breathing.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
Breathing.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
Breathing.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
Breathing.colors.resize(1);
modes.push_back(Breathing);
mode Refill;
Refill.name = "Refill";
Refill.value = CM_ARGB_GEN2_A1_REFILL_MODE;
Refill.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_MANUAL_SAVE;
Refill.color_mode = MODE_COLORS_MODE_SPECIFIC;
Refill.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Refill.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Refill.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Refill.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
Refill.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
Refill.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
Refill.colors.resize(1);
modes.push_back(Refill);
mode Demo;
Demo.name = "Demo";
Demo.value = CM_ARGB_GEN2_A1_DEMO_MODE;
Demo.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
Demo.color_mode = MODE_COLORS_NONE;
Demo.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Demo.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Demo.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
modes.push_back(Demo);
mode FillFlow;
FillFlow.name = "Fill Flow";
FillFlow.value = CM_ARGB_GEN2_A1_FILL_FLOW_MODE;
FillFlow.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;;
FillFlow.color_mode = MODE_COLORS_NONE;
FillFlow.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
FillFlow.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
FillFlow.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
FillFlow.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
FillFlow.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
FillFlow.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
modes.push_back(FillFlow);
mode Rainbow;
Rainbow.name = "Rainbow";
Rainbow.value = CM_ARGB_GEN2_A1_RAINBOW_MODE;
Rainbow.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;;
Rainbow.color_mode = MODE_COLORS_NONE;
Rainbow.brightness = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Rainbow.brightness_min = CM_ARGB_GEN2_A1_BRIGHTNESS_MIN;
Rainbow.brightness_max = CM_ARGB_GEN2_A1_BRIGHTNESS_MAX;
Rainbow.speed = CM_ARGB_GEN2_A1_SPEED_MAX/2;
Rainbow.speed_min = CM_ARGB_GEN2_A1_SPEED_MIN;
Rainbow.speed_max = CM_ARGB_GEN2_A1_SPEED_MAX;
modes.push_back(Rainbow);
mode Custom;
Custom.name = "Custom";
Custom.value = CM_ARGB_GEN2_A1_CUSTOM_MODE;
Custom.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_MANUAL_SAVE;
Custom.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Custom);
mode Off;
Off.name = "Off";
Off.value = CM_ARGB_GEN2_A1_OFF_MODE;
Off.flags = MODE_FLAG_MANUAL_SAVE;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
SetupZones();
}
RGBController_CMARGBGen2A1Controller::~RGBController_CMARGBGen2A1Controller()
{
delete controller;
}
void RGBController_CMARGBGen2A1Controller::SetupZones()
{
unsigned int total_leds = 0;
for(unsigned int channel = 0; channel < CM_ARGB_GEN2_A1_CHANNEL_COUNT; channel++)
{
zone new_zone;
new_zone.name = "Channel " + std::to_string(channel + 1);
new_zone.type = ZONE_TYPE_LINEAR;
new_zone.leds_min = 0;
new_zone.leds_max = CM_ARGB_GEN2_A1_CHANNEL_MAX_SIZE;
new_zone.leds_count = 0;
new_zone.matrix_map = nullptr;
zones.push_back(new_zone);
total_leds += new_zone.leds_count;
}
leds.resize(total_leds);
for(unsigned int i = 0; i < total_leds; i++)
{
leds[i].name = "LED " + std::to_string(i + 1);
}
SetupColors();
}
void RGBController_CMARGBGen2A1Controller::ResizeZone(int zone, int new_size)
{
zones[zone].leds_count = new_size;
// todo: refactor with above code
unsigned int total_leds = 0;
for(unsigned int channel = 0; channel < CM_ARGB_GEN2_A1_CHANNEL_COUNT; channel++)
{
total_leds += zones[channel].leds_count;
}
leds.resize(total_leds);
for(unsigned int i = 0; i < total_leds; i++)
{
leds[i].name = "LED " + std::to_string(i + 1);
}
controller->SetupZoneSize(zone, new_size);
SetupColors();
}
void RGBController_CMARGBGen2A1Controller::DeviceUpdateLEDs()
{
for(unsigned int channel = 0; channel < CM_ARGB_GEN2_A1_CHANNEL_COUNT; channel ++)
{
UpdateZoneLEDs(channel);
}
}
void RGBController_CMARGBGen2A1Controller::UpdateZoneLEDs(int zone)
{
if(zones[zone].leds_count > 0)
{
unsigned int start = zones[zone].start_idx;
unsigned int end = start + zones[zone].leds_count;
std::vector<RGBColor> zone_colors(colors.begin() + start , colors.begin() + end);
if(modes[active_mode].value == CM_ARGB_GEN2_A1_DIRECT_MODE)
{
controller->SendDirectChannel(zone, zone_colors);
}
else
{
controller->SetCustomColors(zone, zone_colors);
}
}
}
void RGBController_CMARGBGen2A1Controller::UpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
void RGBController_CMARGBGen2A1Controller::SetCustomMode()
{
active_mode = 0;
}
void RGBController_CMARGBGen2A1Controller::DeviceUpdateMode()
{
const mode& active = modes[active_mode];
if(active.value == CM_ARGB_GEN2_A1_DIRECT_MODE)
{
controller->SetupDirectMode();
}
else
{
RGBColor color = active.color_mode == MODE_COLORS_MODE_SPECIFIC ?
active.colors[0] : 0;
controller->SetMode
(
active.value,
active.speed,
active.brightness,
color,
active.color_mode == MODE_COLORS_RANDOM
);
}
}
void RGBController_CMARGBGen2A1Controller::DeviceSaveMode()
{
controller->SaveToFlash();
}
@@ -0,0 +1,32 @@
/*-------------------------------------------------------------------*\
| RGBController_CMARGBGen2A1Controller.h |
| |
| Driver for Coolermaster ARGB Controller |
| |
| morg (Morgan Guimard) 6/26/2022 |
| |
\*-------------------------------------------------------------------*/
#pragma once
#include "RGBController.h"
#include "CMARGBGen2A1controller.h"
#include <vector>
class RGBController_CMARGBGen2A1Controller : public RGBController
{
public:
RGBController_CMARGBGen2A1Controller(CMARGBGen2A1controller* controller_ptr);
~RGBController_CMARGBGen2A1Controller();
void SetupZones();
void ResizeZone(int zone, int new_size);
void DeviceUpdateLEDs();
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
void DeviceSaveMode();
private:
CMARGBGen2A1controller* controller;
};
@@ -25,7 +25,6 @@
RGBController_CMMM711Controller::RGBController_CMMM711Controller(CMMM711Controller* controller_ptr)
{
controller = controller_ptr;
uint8_t speed = controller->GetLedSpeed();
name = controller->GetDeviceName();
vendor = "Cooler Master";
@@ -26,7 +26,6 @@
RGBController_CMMMController::RGBController_CMMMController(CMMMController* controller_ptr)
{
controller = controller_ptr;
uint8_t speed = controller->GetLedSpeed();
name = "Cooler Master MasterMouse";
vendor = controller->GetDeviceVendor();
@@ -22,64 +22,126 @@
RGBController_CMR6000Controller::RGBController_CMR6000Controller(CMR6000Controller* controller_ptr)
{
controller = controller_ptr;
unsigned char speed = controller->GetLedSpeed();
controller = controller_ptr;
name = "AMD RX 6xxx GPU";
vendor = "Cooler Master";
type = DEVICE_TYPE_GPU;
description = controller->GetDeviceName();
serial = controller->GetSerial();
location = controller->GetLocation();
name = "AMD RX 6xxx GPU";
vendor = "Cooler Master";
type = DEVICE_TYPE_GPU;
description = controller->GetDeviceName();
serial = controller->GetSerial();
location = controller->GetLocation();
mode Off;
Off.name = "Off";
Off.flags = 0;
Off.value = CM_MR6000_MODE_OFF;
Off.color_mode = MODE_COLORS_NONE;
Off.name = "Off";
Off.flags = 0;
Off.value = CM_MR6000_MODE_OFF;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
mode Direct;
Direct.name = "Direct";
Direct.value = CM_MR6000_MODE_DIRECT;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR| MODE_FLAG_HAS_BRIGHTNESS;
Direct.color_mode = MODE_COLORS_PER_LED;
Direct.colors_min = 1;
Direct.colors_max = 1;
Direct.colors.resize(1);
Direct.brightness_min = 0x00;
Direct.brightness_max = 0xFF;
Direct.brightness = 0xFF;
Direct.name = "Direct";
Direct.value = CM_MR6000_MODE_DIRECT;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR| MODE_FLAG_HAS_BRIGHTNESS;
Direct.color_mode = MODE_COLORS_PER_LED;
Direct.speed = 0xFF;
Direct.brightness_min = 0x00;
Direct.brightness_max = 0xFF;
Direct.brightness = 0xFF;
modes.push_back(Direct);
mode ColorCycle;
ColorCycle.name = "Color Cycle";
ColorCycle.value = CM_MR6000_MODE_COLOR_CYCLE;
ColorCycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
ColorCycle.speed_min = MR6000_CYCLE_SPEED_SLOWEST;
ColorCycle.speed = MR6000_CYCLE_SPEED_NORMAL;
ColorCycle.speed_max = MR6000_CYCLE_SPEED_FASTEST;
ColorCycle.color_mode = MODE_COLORS_NONE;
ColorCycle.speed = speed;
ColorCycle.brightness_min = 0x00;
ColorCycle.brightness_max = 0xFF;
ColorCycle.brightness = 0x7F;
ColorCycle.name = "Spectrum Cycle";
ColorCycle.value = CM_MR6000_MODE_COLOR_CYCLE;
ColorCycle.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
ColorCycle.speed_min = MR6000_CYCLE_SPEED_SLOWEST;
ColorCycle.speed = MR6000_CYCLE_SPEED_NORMAL;
ColorCycle.speed_max = MR6000_CYCLE_SPEED_FASTEST;
ColorCycle.color_mode = MODE_COLORS_NONE;
ColorCycle.speed = MR6000_CYCLE_SPEED_NORMAL;
ColorCycle.brightness_min = 0x00;
ColorCycle.brightness_max = 0xFF;
ColorCycle.brightness = 0x7F;
modes.push_back(ColorCycle);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = CM_MR6000_MODE_BREATHE;
Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR;
Breathing.speed_min = MR6000_BREATHE_SPEED_SLOWEST;
Breathing.speed = MR6000_BREATHE_SPEED_NORMAL;
Breathing.speed_max = MR6000_BREATHE_SPEED_FASTEST;
Breathing.color_mode = MODE_COLORS_PER_LED;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.name = "Breathing";
Breathing.value = CM_MR6000_MODE_BREATHE;
Breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR;
Breathing.speed_min = MR6000_BREATHE_SPEED_SLOWEST;
Breathing.speed = MR6000_BREATHE_SPEED_NORMAL;
Breathing.speed_max = MR6000_BREATHE_SPEED_FASTEST;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.colors.resize(1);
Breathing.speed = speed;
Breathing.speed = MR6000_BREATHE_SPEED_NORMAL;
modes.push_back(Breathing);
if(controller->GetPID() == COOLERMASTER_RADEON_6900_PID)
{
mode Rainbow;
Rainbow.name = "Rainbow Wave";
Rainbow.value = CM_MR6000_MODE_RAINBOW;
Rainbow.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
Rainbow.speed_min = MR6000_RAINBOW_SPEED_SLOWEST;
Rainbow.speed = MR6000_RAINBOW_SPEED_NORMAL;
Rainbow.speed_max = MR6000_RAINBOW_SPEED_FASTEST;
Rainbow.color_mode = MODE_COLORS_NONE;
Rainbow.speed = MR6000_CYCLE_SPEED_NORMAL;
Rainbow.brightness_min = 0x00;
Rainbow.brightness_max = 0xFF;
Rainbow.brightness = 0xFF;
modes.push_back(Rainbow);
mode Bounce;
Bounce.name = "Bounce";
Bounce.value = CM_MR6000_MODE_BOUNCE;
Bounce.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
Bounce.speed_min = MR6000_CYCLE_SPEED_SLOWEST;
Bounce.speed = MR6000_CYCLE_SPEED_NORMAL;
Bounce.speed_max = MR6000_CYCLE_SPEED_FASTEST;
Bounce.color_mode = MODE_COLORS_NONE;
Bounce.speed = MR6000_CYCLE_SPEED_NORMAL;
Bounce.brightness_min = 0x00;
Bounce.brightness_max = 0xFF;
Bounce.brightness = 0xFF;
modes.push_back(Bounce);
mode Chase;
Chase.name = "Chase";
Chase.value = CM_MR6000_MODE_CHASE;
Chase.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_DIRECTION_LR;
Chase.speed_min = MR6000_CYCLE_SPEED_SLOWEST;
Chase.speed = MR6000_CYCLE_SPEED_NORMAL;
Chase.speed_max = MR6000_CYCLE_SPEED_FASTEST;
Chase.color_mode = MODE_COLORS_MODE_SPECIFIC;
Chase.colors_min = 2;
Chase.colors_max = 2;
Chase.colors.resize(2);
Chase.speed = MR6000_CYCLE_SPEED_NORMAL;
Chase.brightness_min = 0;
Chase.brightness_max = 0xFF;
Chase.brightness = 0xFF;
modes.push_back(Chase);
mode Swirl;
Swirl.name = "Swirl";
Swirl.value = CM_MR6000_MODE_SWIRL;
Swirl.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_DIRECTION_LR;
Swirl.speed_min = MR6000_CYCLE_SPEED_SLOWEST;
Swirl.speed = MR6000_CYCLE_SPEED_NORMAL;
Swirl.speed_max = MR6000_CYCLE_SPEED_FASTEST;
Swirl.color_mode = MODE_COLORS_MODE_SPECIFIC;
Swirl.colors_min = 1;
Swirl.colors_max = 1;
Swirl.colors.resize(1);
Swirl.speed = MR6000_CYCLE_SPEED_NORMAL;
Swirl.brightness_min = 0;
Swirl.brightness_max = 0xFF;
Swirl.brightness = 0xFF;
modes.push_back(Swirl);
}
SetupZones();
active_mode = 1;
}
@@ -118,21 +180,32 @@ void RGBController_CMR6000Controller::ResizeZone(int /*zone*/, int /*new_size*/)
void RGBController_CMR6000Controller::DeviceUpdateLEDs()
{
unsigned char red = 0;
unsigned char grn = 0;
unsigned char blu = 0;
mode new_mode = modes[active_mode];
RGBColor color1 = (new_mode.colors.size() > 0) ? new_mode.colors[0] : colors[0];
RGBColor color2 = (new_mode.colors.size() > 1) ? new_mode.colors[1] : 0;
unsigned char bri = (new_mode.flags & MODE_FLAG_HAS_BRIGHTNESS) ? new_mode.brightness : 0xFF;
unsigned char rnd = 0x20;
if(modes[active_mode].color_mode == MODE_COLORS_PER_LED)
switch(new_mode.value)
{
red = RGBGetRValue(colors[0]);
grn = RGBGetGValue(colors[0]);
blu = RGBGetBValue(colors[0]);
/*-----------------------------------------------------------------*\
| Breathing mode requires value 0x20 when in MODE_SPECIFIC_COLOR |
\*-----------------------------------------------------------------*/
case CM_MR6000_MODE_BREATHE:
if(new_mode.color_mode == MODE_COLORS_RANDOM)
{
rnd = 0xA0;
}
break;
case CM_MR6000_MODE_SWIRL:
case CM_MR6000_MODE_CHASE:
rnd = new_mode.direction;
break;
default:
rnd = 0;
}
unsigned char rnd = (modes[active_mode].color_mode == MODE_COLORS_RANDOM) ? 0xA0 : 0x20;
unsigned char bri = (modes[active_mode].flags & MODE_FLAG_HAS_BRIGHTNESS) ? modes[active_mode].brightness : 0xFF;
controller->SetMode(modes[active_mode].value, modes[active_mode].speed, red, grn, blu, rnd, bri);
controller->SetMode(new_mode.value, new_mode.speed, color1, color2, rnd, bri);
}
void RGBController_CMR6000Controller::UpdateZoneLEDs(int /*zone*/)
@@ -27,7 +27,7 @@ RGBController_CMSmallARGBController::RGBController_CMSmallARGBController(CMSmall
controller = controller_ptr;
unsigned char speed = controller->GetLedSpeed();
name = small_argb_header_data[controller->GetZoneIndex()].name;
name = cm_small_argb_header_data[controller->GetZoneIndex()].name;
vendor = "Cooler Master";
type = DEVICE_TYPE_LEDSTRIP;
description = controller->GetDeviceName();
@@ -185,7 +185,7 @@ RGBController_CMSmallARGBController::~RGBController_CMSmallARGBController()
void RGBController_CMSmallARGBController::Init_Controller()
{
int zone_idx = controller->GetZoneIndex();
int zone_led_count = small_argb_header_data[zone_idx].count;
int zone_led_count = cm_small_argb_header_data[zone_idx].count;
bool boolSingleLED = ( zone_led_count == 1 ); //If argb_header_data[zone_idx].count == 1 then the zone is ZONE_TYPE_SINGLE
zone ARGB_zone;
@@ -215,7 +215,7 @@ void RGBController_CMSmallARGBController::SetupZones()
if (!boolSingleLED)
{
controller->SetLedCount(small_argb_header_data[zone_idx].header, zones[zone_idx].leds_count);
controller->SetLedCount(cm_small_argb_header_data[zone_idx].header, zones[zone_idx].leds_count);
}
for(unsigned int lp_idx = 0; lp_idx < zones[zone_idx].leds_count; lp_idx++)
@@ -226,13 +226,13 @@ void RGBController_CMSmallARGBController::SetupZones()
if(boolSingleLED)
{
new_led.name = i;
new_led.value = small_argb_header_data[i].header;
new_led.value = cm_small_argb_header_data[i].header;
}
else
{
new_led.name = i;
new_led.name.append(" LED " + std::to_string(lp_idx));
new_led.value = small_argb_header_data[i].header;
new_led.value = cm_small_argb_header_data[i].header;
}
leds.push_back(new_led);
@@ -138,11 +138,6 @@ void RGBController_CorsairCommanderCore::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_CorsairCommanderCore::SetCustomMode()
{
active_mode = 0;
}
void RGBController_CorsairCommanderCore::DeviceUpdateMode()
{
switch(modes[active_mode].value)
@@ -24,7 +24,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -115,11 +115,6 @@ void RGBController_CorsairDominatorPlatinum::UpdateSingleLED(int led)
controller->ApplyColors();
}
void RGBController_CorsairDominatorPlatinum::SetCustomMode()
{
active_mode = 0;
}
void RGBController_CorsairDominatorPlatinum::DeviceUpdateMode()
{
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -126,11 +126,6 @@ void RGBController_CorsairHydro::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_CorsairHydro::SetCustomMode()
{
active_mode = 0;
}
void RGBController_CorsairHydro::DeviceUpdateMode()
{
switch(modes[active_mode].value)
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -127,11 +127,6 @@ void RGBController_CorsairHydroPlatinum::UpdateSingleLED(int /*led*/)
DeviceUpdateLEDs();
}
void RGBController_CorsairHydroPlatinum::SetCustomMode()
{
active_mode = 0;
}
void RGBController_CorsairHydroPlatinum::DeviceUpdateMode()
{
@@ -24,7 +24,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -315,11 +315,6 @@ void RGBController_CorsairLightingNode::UpdateSingleLED(int led)
controller->SetChannelLEDs(channel, zones[channel].colors, zones[channel].leds_count);
}
void RGBController_CorsairLightingNode::SetCustomMode()
{
active_mode = 0;
}
void RGBController_CorsairLightingNode::DeviceUpdateMode()
{
if(modes[active_mode].value == 0xFFFF)
@@ -25,7 +25,6 @@ public:
void UpdateZoneLEDs(int zone);
void UpdateSingleLED(int led);
void SetCustomMode();
void DeviceUpdateMode();
private:
@@ -1,106 +0,0 @@
#include "CorsairK55RGBPROController.h"
/*-----------------------------------------*\
| CorsairK55RGBPROController.cpp |
| |
| Driver for Corsair K55 RGB PRO Keyboard |
\*-----------------------------------------*/
#include "LogManager.h"
CorsairK55RGBPROController::CorsairK55RGBPROController(hid_device* dev_handle, const char* path)
{
dev = dev_handle;
location = path;
LightingControl();
}
CorsairK55RGBPROController::~CorsairK55RGBPROController()
{
hid_close(dev);
}
std::string CorsairK55RGBPROController::GetDeviceLocation()
{
return("HID: " + location);
}
std::string CorsairK55RGBPROController::GetFirmwareString()
{
return "";
}
std::string CorsairK55RGBPROController::GetName()
{
return name;
}
void CorsairK55RGBPROController::SetName(std::string device_name)
{
name = device_name;
}
std::string CorsairK55RGBPROController::GetSerialString()
{
wchar_t serial_string[128];
int ret = hid_get_serial_number_string(dev, serial_string, 128);
if(ret != 0)
{
return("");
}
std::wstring return_wstring = serial_string;
std::string return_string(return_wstring.begin(), return_wstring.end());
return(return_string);
}
void CorsairK55RGBPROController::LightingControl()
{
unsigned char usb_buf[65];
memset(usb_buf, 0x00, sizeof(usb_buf));
//This is requered
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x01;
usb_buf[0x03] = 0x03;
usb_buf[0x05] = 0x02;
hid_write(dev, (unsigned char *)usb_buf, 65);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x02;
usb_buf[0x03] = 0x5F;
hid_write(dev, (unsigned char *)usb_buf, 65);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x0D;
usb_buf[0x04] = 0x01;
hid_write(dev, (unsigned char *)usb_buf, 65);
}
void CorsairK55RGBPROController::SetLEDs(std::vector<RGBColor>colors)
{
unsigned char usb_buf[65];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x06;
usb_buf[0x04] = 0x12;
for(std::size_t color_idx = 0; color_idx < colors.size(); color_idx++)
{
RGBColor color = colors[color_idx];
usb_buf[9 + color_idx] = RGBGetRValue(color);
usb_buf[15 + color_idx] = RGBGetGValue(color);
usb_buf[21 + color_idx] = RGBGetBValue(color);
}
hid_write(dev, (unsigned char *)usb_buf, 65);
}
@@ -1,35 +0,0 @@
#ifndef CORSAIRK55RGBPROCONTROLLER_H
#define CORSAIRK55RGBPROCONTROLLER_H
#include "RGBController.h"
#include <string>
#include <hidapi/hidapi.h>
class CorsairK55RGBPROController
{
public:
CorsairK55RGBPROController(hid_device* dev_handle, const char* path);
~CorsairK55RGBPROController();
std::string GetDeviceLocation();
std::string GetFirmwareString();
std::string GetName();
std::string GetSerialString();
void SetLEDs(std::vector<RGBColor> colors);
void SetLEDsKeyboardLimited(std::vector<RGBColor> colors);
void SetName(std::string device_name);
private:
hid_device* dev;
std::string firmware_version;
std::string location;
std::string name;
device_type type;
void LightingControl();
void SetLEDsKeyboardFull(std::vector<RGBColor> colors);
};
#endif // CORSAIRK55RGBPROCONTROLLER_H
@@ -0,0 +1,287 @@
/*--------------------------------------------*\
| CorsairK55RGBPROXTController.cpp |
| |
| Driver for Corsair K55 RGB PRO XT Keyboard |
\*--------------------------------------------*/
#include "CorsairK55RGBPROXTController.h"
#include "LogManager.h"
#define COLOR_BANK_SIZE 137
#define HID_PACKET_LENGTH 65
#define HID_PAYLOAD_SIZE1 (HID_PACKET_LENGTH - 12)
#define HID_PAYLOAD_SIZE2 (HID_PACKET_LENGTH - 4)
static const unsigned int keys[] =
{ 127, 128, 129, 130, 131, 132, 37, 49, 39, 53, 102, 101, 26, 96, 104, 54, 27, 16, 0, 25,
103, 55, 28, 22, 18, 23, 56, 29, 4, 3, 2, 57, 30, 17, 5, 21, 31, 58, 32, 19,
6, 1, 40, 59, 33, 24, 7, 60, 34, 20, 9, 13, 61, 35, 8, 10, 12, 14, 11, 50,
62, 41, 15, 47, 51, 107, 63, 42, 43, 48, 52, 118, 64, 38, 44, 46, 106, 97, 65, 36,
105, 66, 69, 72, 76, 67, 70, 73, 78, 77, 68, 71, 74, 75, 79, 91, 88, 85, 94, 80,
92, 89, 86, 81, 93, 90, 87, 95, 82, 83, 84 };
static unsigned char color_bank[3][COLOR_BANK_SIZE];
static const unsigned char filler[] =
{ 0x70, 0x6E, 0x4E, 0x4D, 0x4C, 0x65, 0x6F, 0x2C, 0x4B, 0x4A, 0x49, 0x48, 0x47, 0x46, 0x45, 0x05,
0x19, 0x06, 0x1B, 0x1D, 0x64, 0x6A, 0x34, 0x6B, 0x6C, 0x69, 0x38, 0x37, 0x36, 0x10, 0x11, 0x16,
0x04, 0x39, 0x2F, 0x13, 0x12, 0x0C, 0x18, 0x33, 0x0F, 0x0E, 0x0D, 0x0B, 0x0A, 0x09, 0x07, 0x27,
0x7A, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1C, 0x17, 0x15, 0x08, 0x1A, 0x14, 0x2B, 0x2D,
0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x29, 0x1F, 0x1E, 0x35, 0x44, 0x43, 0x42, 0x41, 0x40, 0x62,
0x00, 0x5B, 0x5A, 0x59, 0x5E, 0x5D, 0x5C, 0x88, 0x87, 0x86, 0x85, 0x84, 0x83, 0x63, 0x53, 0x4F,
0x61, 0x60, 0x5F, 0x58, 0x57, 0x56, 0x55, 0x54, 0x2A, 0x2E, 0x28, 0x32, 0x30, 0x51, 0x50, 0x52,
0x6D };
CorsairK55RGBPROXTController::CorsairK55RGBPROXTController(hid_device* dev_handle, const char* path)
{
dev = dev_handle;
location = path;
LightingControl();
}
CorsairK55RGBPROXTController::~CorsairK55RGBPROXTController()
{
hid_close(dev);
}
std::string CorsairK55RGBPROXTController::GetDeviceLocation()
{
return("HID: " + location);
}
std::string CorsairK55RGBPROXTController::GetFirmwareString()
{
return "";
}
std::string CorsairK55RGBPROXTController::GetSerialString()
{
wchar_t serial_string[128];
int ret = hid_get_serial_number_string(dev, serial_string, 128);
if(ret != 0)
{
return("");
}
std::wstring return_wstring = serial_string;
std::string return_string(return_wstring.begin(), return_wstring.end());
return(return_string);
}
void CorsairK55RGBPROXTController::LightingControl()
{
unsigned char usb_buf[HID_PACKET_LENGTH];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x01;
usb_buf[0x03] = 0x03;
usb_buf[0x05] = 0x02;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x02;
usb_buf[0x03] = 0x5F;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x0D;
usb_buf[0x04] = 0x01;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
}
void CorsairK55RGBPROXTController::SetLEDs(std::vector<RGBColor>colors)
{
for(std::size_t color_idx = 0; color_idx < colors.size(); ++color_idx)
{
RGBColor color = colors[color_idx];
color_bank[0][keys[color_idx]] = RGBGetRValue(color);
color_bank[1][keys[color_idx]] = RGBGetGValue(color);
color_bank[2][keys[color_idx]] = RGBGetBValue(color);
}
unsigned char* color_ptr = &color_bank[0][0];
unsigned char usb_buf[HID_PACKET_LENGTH];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x06;
usb_buf[0x04] = 0x9B;
usb_buf[0x05] = 0x01;
memcpy(&usb_buf[12], color_ptr, HID_PAYLOAD_SIZE1);
color_ptr += HID_PAYLOAD_SIZE1;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
usb_buf[0x02] = 0x07;
for(std::size_t i = 0; i < 6; ++i)
{
memcpy(&usb_buf[4], color_ptr, HID_PAYLOAD_SIZE2);
color_ptr += HID_PAYLOAD_SIZE2;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
}
}
void CorsairK55RGBPROXTController::SetHardwareMode
(
int mode_value,
unsigned int color_mode,
std::vector<RGBColor> colors,
unsigned int speed,
unsigned int direction
)
{
LightingControl();
unsigned char usb_buf[HID_PACKET_LENGTH];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x0D;
usb_buf[0x03] = 0x01;
usb_buf[0x04] = 0x61;
usb_buf[0x05] = 0x6D;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x09;
usb_buf[0x03] = 0x01;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x06;
usb_buf[0x03] = 0x01;
usb_buf[0x04] = 0x78;
usb_buf[0x08] = mode_value & 0x00FF;
usb_buf[0x09] = mode_value >> 8;
if(color_mode != MODE_COLORS_NONE)
{
usb_buf[0x0A] = color_mode == MODE_COLORS_RANDOM ? CORSAIR_HW_MODE_COLOR_RANDOM : CORSAIR_HW_MODE_COLOR_PREDEF;
}
if(mode_value == CORSAIR_HW_MODE_WATER_COLOR_VALUE)
{
usb_buf[0x0A] = CORSAIR_HW_MODE_COLOR_UNKNOWN;
}
usb_buf[0x0B] = speed;
if((mode_value == CORSAIR_HW_MODE_COLOR_WAVE_VALUE) ||
(mode_value == CORSAIR_HW_MODE_RAINBOW_WAVE_VALUE) ||
(mode_value == CORSAIR_HW_MODE_RAIN_VALUE) ||
(mode_value == CORSAIR_HW_MODE_SPIRAL_VALUE) ||
(mode_value == CORSAIR_HW_MODE_VISOR_VALUE))
{
switch(direction)
{
case MODE_DIRECTION_LEFT:
if(mode_value == CORSAIR_HW_MODE_SPIRAL_VALUE)
{
usb_buf[0x0C] = CORSAIE_HW_MODE_DIR_COUNTER_CLOCK_WISE;
}
else
{
usb_buf[0x0C] = CORSAIR_HW_MODE_DIR_LEFT;
}
break;
case MODE_DIRECTION_RIGHT:
if(mode_value == CORSAIR_HW_MODE_SPIRAL_VALUE)
{
usb_buf[0x0C] = CORSAIR_HW_MODE_DIR_CLOCK_WISE;
}
else
{
usb_buf[0x0C] = CORSAIR_HW_MODE_DIR_RIGHT;
}
break;
case MODE_DIRECTION_UP:
usb_buf[0x0C] = CORSAIR_HW_MODE_DIR_UP;
break;
case MODE_DIRECTION_DOWN:
usb_buf[0x0C] = CORSAIR_HW_MODE_DIR_DOWN;
break;
default:
usb_buf[0x0C] = CORSAIR_HW_MODE_DIR_NONE;
break;
}
}
int fill_dest_index = 0x0F;
int fill_src_index = 0x00;
if(usb_buf[0x0A] != CORSAIR_HW_MODE_COLOR_RANDOM)
{
usb_buf[0x0E] = (unsigned char)colors.size();
for(size_t i = 0; i < colors.size(); ++i)
{
usb_buf[0x0F + i * 4] = 0xFF;
usb_buf[0x10 + i * 4] = RGBGetBValue(colors[i]);
usb_buf[0x11 + i * 4] = RGBGetGValue(colors[i]);
usb_buf[0x12 + i * 4] = RGBGetRValue(colors[i]);
usb_buf[4] += 4;
fill_dest_index += 4;
}
}
memcpy(&usb_buf[fill_dest_index], &filler[fill_src_index], HID_PACKET_LENGTH - fill_dest_index);
fill_src_index += (HID_PACKET_LENGTH - fill_dest_index);
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x07;
usb_buf[0x03] = 0x01;
memcpy(&usb_buf[4], &filler[fill_src_index], HID_PACKET_LENGTH - 4);
fill_src_index += (HID_PACKET_LENGTH - 4);
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x07;
usb_buf[0x03] = 0x01;
memcpy(&usb_buf[4], &filler[fill_src_index], sizeof(filler) - fill_src_index);
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x08;
usb_buf[0x02] = 0x05;
usb_buf[0x03] = 0x01;
usb_buf[0x04] = 0x01;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
}
void CorsairK55RGBPROXTController::SwitchMode(bool software)
{
if(software)
{
LightingControl();
}
else
{
unsigned char usb_buf[HID_PACKET_LENGTH];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x01] = 0x00;
usb_buf[0x02] = 0x01;
usb_buf[0x03] = 0x03;
usb_buf[0x05] = 0x01;
hid_write(dev, (unsigned char *)usb_buf, HID_PACKET_LENGTH);
}
}
@@ -0,0 +1,90 @@
/*--------------------------------------------*\
| CorsairK55RGBPROXTController.h |
| |
| Driver for Corsair K55 RGB PRO XT Keyboard |
\*--------------------------------------------*/
#ifndef CORSAIRK55RGBPROXTCONTROLLER_H
#define CORSAIRK55RGBPROXTCONTROLLER_H
#include "RGBController.h"
#include <string>
#include <hidapi/hidapi.h>
class CorsairK55RGBPROXTController
{
public:
CorsairK55RGBPROXTController(hid_device* dev_handle, const char* path);
~CorsairK55RGBPROXTController();
std::string GetDeviceLocation();
std::string GetFirmwareString();
std::string GetSerialString();
void SetLEDs(std::vector<RGBColor> colors);
void SetHardwareMode
(
int mode_value,
unsigned int color_mode,
std::vector<RGBColor> colors,
unsigned int speed,
unsigned int direction
);
void SwitchMode(bool software);
enum
{
CORSAIR_MODE_DIRECT_VALUE = 0xFFFF,
CORSAIR_HW_MODE_STATIC_VALUE = 0x207E,
CORSAIR_HW_MODE_COLOR_PULSE_VALUE = 0xAD4F,
CORSAIR_HW_MODE_COLOR_SHIFT_VALUE = 0xA5FA,
CORSAIR_HW_MODE_COLOR_WAVE_VALUE = 0x7BFF,
CORSAIR_HW_MODE_RAINBOW_WAVE_VALUE = 0xB94C,
CORSAIR_HW_MODE_RAIN_VALUE = 0xA07E,
CORSAIR_HW_MODE_SPIRAL_VALUE = 0xAB87,
CORSAIR_HW_MODE_WATER_COLOR_VALUE = 0x0022,
CORSAIR_HW_MODE_TYPE_KEY_VALUE = 0xB1F9,
CORSAIR_HW_MODE_TYPE_RIPPLE_VALUE = 0x09A2,
CORSAIR_HW_MODE_VISOR_VALUE = 0x90c0
};
enum
{
CORSAIR_HW_MODE_COLOR_NONE = 0x00,
CORSAIR_HW_MODE_COLOR_PREDEF = 0x01,
CORSAIR_HW_MODE_COLOR_RANDOM = 0x02,
CORSAIR_HW_MODE_COLOR_UNKNOWN = 0x03
};
enum
{
CORSAIR_HW_MODE_SPEED_NONE = 0x00,
CORSAIR_HW_MODE_SPEED_MIN = 0x03,
CORSAIR_HW_MODE_SPEED_MED = 0x04,
CORSAIR_HW_MODE_SPEED_MAX = 0x05
};
enum
{
CORSAIR_HW_MODE_DIR_NONE = 0x00,
CORSAIR_HW_MODE_DIR_DOWN = 0x01,
CORSAIR_HW_MODE_DIR_UP = 0x02,
CORSAIR_HW_MODE_DIR_RIGHT = 0x04,
CORSAIR_HW_MODE_DIR_LEFT = 0x05,
CORSAIR_HW_MODE_DIR_CLOCK_WISE = 0x06,
CORSAIE_HW_MODE_DIR_COUNTER_CLOCK_WISE = 0x07
};
private:
hid_device* dev;
std::string firmware_version;
std::string location;
device_type type;
void LightingControl();
};
#endif // CORSAIRK55RGBPROXTCONTROLLER_H

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