From c963bcd9d7e645c6713ba92254be306155b82b9d Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 26 Mar 2021 23:15:40 +0100 Subject: [PATCH 1/8] ASUS - Added more undocumented LED IDs ASUS - Reversed LED mapping to have the ASUS ID as the key ASUS - Throw informative exception on missing LED mapping --- RGB.NET.Devices.Asus/Enum/AsusLedId.cs | 3 + .../Keyboard/AsusKeyboardLedMapping.cs | 303 +++++++++--------- .../Keyboard/AsusKeyboardRGBDevice.cs | 15 +- 3 files changed, 165 insertions(+), 156 deletions(-) diff --git a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs index f56d64a..a5ee8e1 100644 --- a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs +++ b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs @@ -156,5 +156,8 @@ namespace RGB.NET.Devices.Asus UNDOCUMENTED_3 = 0x101, UNDOCUMENTED_4 = 0x102, UNDOCUMENTED_5 = 0x103, + UNDOCUMENTED_6 = 0x1EB, // ISO tilde + UNDOCUMENTED_7 = 0x1EC, // ISO backslash + UNDOCUMENTED_8 = 0x14E, } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs index 3b9f802..3bb0de9 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs @@ -5,157 +5,160 @@ namespace RGB.NET.Devices.Asus { internal static class AsusKeyboardLedMapping { - public static readonly Dictionary MAPPING = new() + public static readonly Dictionary MAPPING = new() { - { LedId.Keyboard_Escape, AsusLedId.KEY_ESCAPE }, - { LedId.Keyboard_F1, AsusLedId.KEY_F1 }, - { LedId.Keyboard_F2, AsusLedId.KEY_F2 }, - { LedId.Keyboard_F3, AsusLedId.KEY_F3 }, - { LedId.Keyboard_F4, AsusLedId.KEY_F4 }, - { LedId.Keyboard_F5, AsusLedId.KEY_F5 }, - { LedId.Keyboard_F6, AsusLedId.KEY_F6 }, - { LedId.Keyboard_F7, AsusLedId.KEY_F7 }, - { LedId.Keyboard_F8, AsusLedId.KEY_F8 }, - { LedId.Keyboard_F9, AsusLedId.KEY_F9 }, - { LedId.Keyboard_F10, AsusLedId.KEY_F10 }, - { LedId.Keyboard_F11, AsusLedId.KEY_F11 }, - { LedId.Keyboard_F12, AsusLedId.KEY_F12 }, - { LedId.Keyboard_1, AsusLedId.KEY_1 }, - { LedId.Keyboard_2, AsusLedId.KEY_2 }, - { LedId.Keyboard_3, AsusLedId.KEY_3 }, - { LedId.Keyboard_4, AsusLedId.KEY_4 }, - { LedId.Keyboard_5, AsusLedId.KEY_5 }, - { LedId.Keyboard_6, AsusLedId.KEY_6 }, - { LedId.Keyboard_7, AsusLedId.KEY_7 }, - { LedId.Keyboard_8, AsusLedId.KEY_8 }, - { LedId.Keyboard_9, AsusLedId.KEY_9 }, - { LedId.Keyboard_0, AsusLedId.KEY_0 }, - { LedId.Keyboard_MinusAndUnderscore, AsusLedId.KEY_MINUS }, - { LedId.Keyboard_EqualsAndPlus, AsusLedId.KEY_EQUALS }, - { LedId.Keyboard_Backspace, AsusLedId.KEY_BACK }, - { LedId.Keyboard_Tab, AsusLedId.KEY_TAB }, - { LedId.Keyboard_Q, AsusLedId.KEY_Q }, - { LedId.Keyboard_W, AsusLedId.KEY_W }, - { LedId.Keyboard_E, AsusLedId.KEY_E }, - { LedId.Keyboard_R, AsusLedId.KEY_R }, - { LedId.Keyboard_T, AsusLedId.KEY_T }, - { LedId.Keyboard_Y, AsusLedId.KEY_Y }, - { LedId.Keyboard_U, AsusLedId.KEY_U }, - { LedId.Keyboard_I, AsusLedId.KEY_I }, - { LedId.Keyboard_O, AsusLedId.KEY_O }, - { LedId.Keyboard_P, AsusLedId.KEY_P }, - { LedId.Keyboard_BracketLeft, AsusLedId.KEY_LBRACKET }, - { LedId.Keyboard_BracketRight, AsusLedId.KEY_RBRACKET }, - { LedId.Keyboard_Enter, AsusLedId.KEY_RETURN }, - { LedId.Keyboard_CapsLock, AsusLedId.KEY_CAPITAL }, - { LedId.Keyboard_A, AsusLedId.KEY_A }, - { LedId.Keyboard_S, AsusLedId.KEY_S }, - { LedId.Keyboard_D, AsusLedId.KEY_D }, - { LedId.Keyboard_F, AsusLedId.KEY_F }, - { LedId.Keyboard_G, AsusLedId.KEY_G }, - { LedId.Keyboard_H, AsusLedId.KEY_H }, - { LedId.Keyboard_J, AsusLedId.KEY_J }, - { LedId.Keyboard_K, AsusLedId.KEY_K }, - { LedId.Keyboard_L, AsusLedId.KEY_L }, - { LedId.Keyboard_SemicolonAndColon, AsusLedId.KEY_SEMICOLON }, - { LedId.Keyboard_ApostropheAndDoubleQuote, AsusLedId.KEY_APOSTROPHE }, - { LedId.Keyboard_GraveAccentAndTilde, AsusLedId.KEY_GRAVE }, - { LedId.Keyboard_LeftShift, AsusLedId.KEY_LSHIFT }, - { LedId.Keyboard_Backslash, AsusLedId.KEY_BACKSLASH }, - { LedId.Keyboard_Z, AsusLedId.KEY_Z }, - { LedId.Keyboard_X, AsusLedId.KEY_X }, - { LedId.Keyboard_C, AsusLedId.KEY_C }, - { LedId.Keyboard_V, AsusLedId.KEY_V }, - { LedId.Keyboard_B, AsusLedId.KEY_B }, - { LedId.Keyboard_N, AsusLedId.KEY_N }, - { LedId.Keyboard_M, AsusLedId.KEY_M }, - { LedId.Keyboard_CommaAndLessThan, AsusLedId.KEY_COMMA }, - { LedId.Keyboard_PeriodAndBiggerThan, AsusLedId.KEY_PERIOD }, - { LedId.Keyboard_SlashAndQuestionMark, AsusLedId.KEY_SLASH }, - { LedId.Keyboard_RightShift, AsusLedId.KEY_RSHIFT }, - { LedId.Keyboard_LeftCtrl, AsusLedId.KEY_LCONTROL }, - { LedId.Keyboard_LeftGui, AsusLedId.KEY_LWIN }, - { LedId.Keyboard_LeftAlt, AsusLedId.KEY_LMENU }, - { LedId.Keyboard_Space, AsusLedId.KEY_SPACE }, - { LedId.Keyboard_RightAlt, AsusLedId.KEY_RMENU }, - { LedId.Keyboard_RightGui, AsusLedId.KEY_RWIN }, - { LedId.Keyboard_Application, AsusLedId.KEY_APPS }, - { LedId.Keyboard_RightCtrl, AsusLedId.KEY_RCONTROL }, - { LedId.Keyboard_PrintScreen, AsusLedId.KEY_SYSRQ }, - { LedId.Keyboard_ScrollLock, AsusLedId.KEY_SCROLL }, - { LedId.Keyboard_PauseBreak, AsusLedId.KEY_PAUSE }, - { LedId.Keyboard_Insert, AsusLedId.KEY_INSERT }, - { LedId.Keyboard_Home, AsusLedId.KEY_HOME }, - { LedId.Keyboard_PageUp, AsusLedId.KEY_PRIOR }, - { LedId.Keyboard_Delete, AsusLedId.KEY_DELETE }, - { LedId.Keyboard_End, AsusLedId.KEY_END }, - { LedId.Keyboard_PageDown, AsusLedId.KEY_NEXT }, - { LedId.Keyboard_ArrowUp, AsusLedId.KEY_UP }, - { LedId.Keyboard_ArrowLeft, AsusLedId.KEY_LEFT }, - { LedId.Keyboard_ArrowDown, AsusLedId.KEY_DOWN }, - { LedId.Keyboard_ArrowRight, AsusLedId.KEY_RIGHT }, - { LedId.Keyboard_NumLock, AsusLedId.KEY_NUMLOCK }, - { LedId.Keyboard_NumSlash, AsusLedId.KEY_DIVIDE }, - { LedId.Keyboard_NumAsterisk, AsusLedId.KEY_MULTIPLY }, - { LedId.Keyboard_NumMinus, AsusLedId.KEY_SUBTRACT }, - { LedId.Keyboard_Num7, AsusLedId.KEY_NUMPAD7 }, - { LedId.Keyboard_Num8, AsusLedId.KEY_NUMPAD8 }, - { LedId.Keyboard_Num9, AsusLedId.KEY_NUMPAD9 }, - { LedId.Keyboard_NumPeriodAndDelete, AsusLedId.KEY_DECIMAL }, - { LedId.Keyboard_NumPlus, AsusLedId.KEY_ADD }, - { LedId.Keyboard_Num4, AsusLedId.KEY_NUMPAD4 }, - { LedId.Keyboard_Num5, AsusLedId.KEY_NUMPAD5 }, - { LedId.Keyboard_Num6, AsusLedId.KEY_NUMPAD6 }, - { LedId.Keyboard_Num1, AsusLedId.KEY_NUMPAD1 }, - { LedId.Keyboard_Num2, AsusLedId.KEY_NUMPAD2 }, - { LedId.Keyboard_Num3, AsusLedId.KEY_NUMPAD3 }, - { LedId.Keyboard_Num0, AsusLedId.KEY_NUMPAD0 }, - { LedId.Keyboard_NumEnter, AsusLedId.KEY_NUMPADENTER }, - { LedId.Keyboard_NonUsBackslash, AsusLedId.UNDOCUMENTED_1 }, - { LedId.Keyboard_NonUsTilde, AsusLedId.UNDOCUMENTED_2 }, - { LedId.Keyboard_NumComma, AsusLedId.KEY_NUMPADCOMMA }, - { LedId.Logo, AsusLedId.UNDOCUMENTED_3 }, - { LedId.Keyboard_Custom1, AsusLedId.UNDOCUMENTED_4 }, - { LedId.Keyboard_Custom2, AsusLedId.UNDOCUMENTED_5 }, - { LedId.Keyboard_Custom3, AsusLedId.KEY_F13 }, - { LedId.Keyboard_Custom4, AsusLedId.KEY_F14 }, - { LedId.Keyboard_Custom5, AsusLedId.KEY_F15 }, - { LedId.Keyboard_Custom6, AsusLedId.KEY_KANA }, - { LedId.Keyboard_Custom7, AsusLedId.KEY_ABNT_C1 }, - { LedId.Keyboard_Custom8, AsusLedId.KEY_CONVERT }, - { LedId.Keyboard_Custom9, AsusLedId.KEY_NOCONVERT }, - { LedId.Keyboard_Custom10, AsusLedId.KEY_YEN }, - { LedId.Keyboard_Custom11, AsusLedId.KEY_ABNT_C2 }, - { LedId.Keyboard_Custom12, AsusLedId.KEY_NUMPADEQUALS }, - { LedId.Keyboard_Custom13, AsusLedId.KEY_CIRCUMFLEX }, - { LedId.Keyboard_Custom14, AsusLedId.KEY_AT }, - { LedId.Keyboard_Custom15, AsusLedId.KEY_COLON }, - { LedId.Keyboard_Custom16, AsusLedId.KEY_UNDERLINE }, - { LedId.Keyboard_Custom17, AsusLedId.KEY_KANJI }, - { LedId.Keyboard_Custom18, AsusLedId.KEY_STOP }, - { LedId.Keyboard_Custom19, AsusLedId.KEY_AX }, - { LedId.Keyboard_Custom20, AsusLedId.KEY_UNLABELED }, - { LedId.Keyboard_Custom21, AsusLedId.KEY_NEXTTRACK }, - { LedId.Keyboard_Custom22, AsusLedId.KEY_CALCULATOR }, - { LedId.Keyboard_Custom23, AsusLedId.KEY_POWER }, - { LedId.Keyboard_Custom24, AsusLedId.KEY_SLEEP }, - { LedId.Keyboard_Custom25, AsusLedId.KEY_WAKE }, - { LedId.Keyboard_Custom26, AsusLedId.KEY_WEBSEARCH }, - { LedId.Keyboard_Custom27, AsusLedId.KEY_WEBFAVORITES }, - { LedId.Keyboard_Custom28, AsusLedId.KEY_WEBREFRESH }, - { LedId.Keyboard_Custom29, AsusLedId.KEY_WEBSTOP }, - { LedId.Keyboard_Custom30, AsusLedId.KEY_WEBFORWARD }, - { LedId.Keyboard_Custom31, AsusLedId.KEY_WEBHOME }, - { LedId.Keyboard_Custom32, AsusLedId.KEY_WEBBACK }, - { LedId.Keyboard_Custom33, AsusLedId.KEY_MYCOMPUTER }, - { LedId.Keyboard_Custom34, AsusLedId.KEY_MAIL }, - { LedId.Keyboard_Custom35, AsusLedId.KEY_MEDIASELECT }, - { LedId.Keyboard_Custom36, AsusLedId.KEY_FN }, - { LedId.Keyboard_MediaMute, AsusLedId.KEY_MUTE }, - { LedId.Keyboard_MediaPlay, AsusLedId.KEY_PLAYPAUSE }, - { LedId.Keyboard_MediaStop, AsusLedId.KEY_MEDIASTOP }, - { LedId.Keyboard_MediaVolumeDown, AsusLedId.KEY_VOLUMEDOWN }, - { LedId.Keyboard_MediaVolumeUp, AsusLedId.KEY_VOLUMEUP }, + { AsusLedId.KEY_ESCAPE, LedId.Keyboard_Escape }, + { AsusLedId.KEY_F1, LedId.Keyboard_F1 }, + { AsusLedId.KEY_F2, LedId.Keyboard_F2 }, + { AsusLedId.KEY_F3, LedId.Keyboard_F3 }, + { AsusLedId.KEY_F4, LedId.Keyboard_F4 }, + { AsusLedId.KEY_F5, LedId.Keyboard_F5 }, + { AsusLedId.KEY_F6, LedId.Keyboard_F6 }, + { AsusLedId.KEY_F7, LedId.Keyboard_F7 }, + { AsusLedId.KEY_F8, LedId.Keyboard_F8 }, + { AsusLedId.KEY_F9, LedId.Keyboard_F9 }, + { AsusLedId.KEY_F10, LedId.Keyboard_F10 }, + { AsusLedId.KEY_F11, LedId.Keyboard_F11 }, + { AsusLedId.KEY_F12, LedId.Keyboard_F12 }, + { AsusLedId.KEY_1, LedId.Keyboard_1 }, + { AsusLedId.KEY_2, LedId.Keyboard_2 }, + { AsusLedId.KEY_3, LedId.Keyboard_3 }, + { AsusLedId.KEY_4, LedId.Keyboard_4 }, + { AsusLedId.KEY_5, LedId.Keyboard_5 }, + { AsusLedId.KEY_6, LedId.Keyboard_6 }, + { AsusLedId.KEY_7, LedId.Keyboard_7 }, + { AsusLedId.KEY_8, LedId.Keyboard_8 }, + { AsusLedId.KEY_9, LedId.Keyboard_9 }, + { AsusLedId.KEY_0, LedId.Keyboard_0 }, + { AsusLedId.KEY_MINUS , LedId.Keyboard_MinusAndUnderscore }, + { AsusLedId.KEY_EQUALS, LedId.Keyboard_EqualsAndPlus }, + { AsusLedId.KEY_BACK, LedId.Keyboard_Backspace }, + { AsusLedId.KEY_TAB, LedId.Keyboard_Tab }, + { AsusLedId.KEY_Q, LedId.Keyboard_Q }, + { AsusLedId.KEY_W, LedId.Keyboard_W }, + { AsusLedId.KEY_E, LedId.Keyboard_E }, + { AsusLedId.KEY_R, LedId.Keyboard_R }, + { AsusLedId.KEY_T, LedId.Keyboard_T }, + { AsusLedId.KEY_Y, LedId.Keyboard_Y }, + { AsusLedId.KEY_U, LedId.Keyboard_U }, + { AsusLedId.KEY_I, LedId.Keyboard_I }, + { AsusLedId.KEY_O, LedId.Keyboard_O }, + { AsusLedId.KEY_P, LedId.Keyboard_P }, + { AsusLedId.KEY_LBRACKET, LedId.Keyboard_BracketLeft }, + { AsusLedId.KEY_RBRACKET, LedId.Keyboard_BracketRight }, + { AsusLedId.KEY_RETURN, LedId.Keyboard_Enter }, + { AsusLedId.KEY_CAPITAL, LedId.Keyboard_CapsLock }, + { AsusLedId.KEY_A, LedId.Keyboard_A }, + { AsusLedId.KEY_S, LedId.Keyboard_S }, + { AsusLedId.KEY_D, LedId.Keyboard_D }, + { AsusLedId.KEY_F, LedId.Keyboard_F }, + { AsusLedId.KEY_G, LedId.Keyboard_G }, + { AsusLedId.KEY_H, LedId.Keyboard_H }, + { AsusLedId.KEY_J, LedId.Keyboard_J }, + { AsusLedId.KEY_K, LedId.Keyboard_K }, + { AsusLedId.KEY_L, LedId.Keyboard_L }, + { AsusLedId.KEY_SEMICOLON,LedId.Keyboard_SemicolonAndColon }, + { AsusLedId.KEY_APOSTROPHE, LedId.Keyboard_ApostropheAndDoubleQuote }, + { AsusLedId.KEY_GRAVE, LedId.Keyboard_GraveAccentAndTilde }, + { AsusLedId.KEY_LSHIFT, LedId.Keyboard_LeftShift }, + { AsusLedId.KEY_BACKSLASH, LedId.Keyboard_Backslash }, + { AsusLedId.KEY_Z, LedId.Keyboard_Z }, + { AsusLedId.KEY_X, LedId.Keyboard_X }, + { AsusLedId.KEY_C, LedId.Keyboard_C }, + { AsusLedId.KEY_V, LedId.Keyboard_V }, + { AsusLedId.KEY_B, LedId.Keyboard_B }, + { AsusLedId.KEY_N, LedId.Keyboard_N }, + { AsusLedId.KEY_M, LedId.Keyboard_M }, + { AsusLedId.KEY_COMMA, LedId.Keyboard_CommaAndLessThan }, + { AsusLedId.KEY_PERIOD, LedId.Keyboard_PeriodAndBiggerThan }, + { AsusLedId.KEY_SLASH, LedId.Keyboard_SlashAndQuestionMark }, + { AsusLedId.KEY_RSHIFT, LedId.Keyboard_RightShift }, + { AsusLedId.KEY_LCONTROL, LedId.Keyboard_LeftCtrl }, + { AsusLedId.KEY_LWIN, LedId.Keyboard_LeftGui }, + { AsusLedId.KEY_LMENU, LedId.Keyboard_LeftAlt }, + { AsusLedId.KEY_SPACE, LedId.Keyboard_Space }, + { AsusLedId.KEY_RMENU, LedId.Keyboard_RightAlt }, + { AsusLedId.KEY_RWIN, LedId.Keyboard_RightGui }, + { AsusLedId.KEY_APPS, LedId.Keyboard_Application }, + { AsusLedId.KEY_RCONTROL, LedId.Keyboard_RightCtrl }, + { AsusLedId.KEY_SYSRQ, LedId.Keyboard_PrintScreen }, + { AsusLedId.KEY_SCROLL, LedId.Keyboard_ScrollLock }, + { AsusLedId.KEY_PAUSE, LedId.Keyboard_PauseBreak }, + { AsusLedId.KEY_INSERT, LedId.Keyboard_Insert }, + { AsusLedId.KEY_HOME, LedId.Keyboard_Home }, + { AsusLedId.KEY_PRIOR, LedId.Keyboard_PageUp }, + { AsusLedId.KEY_DELETE, LedId.Keyboard_Delete }, + { AsusLedId.KEY_END, LedId.Keyboard_End }, + { AsusLedId.KEY_NEXT, LedId.Keyboard_PageDown }, + { AsusLedId.KEY_UP, LedId.Keyboard_ArrowUp }, + { AsusLedId.KEY_LEFT, LedId.Keyboard_ArrowLeft }, + { AsusLedId.KEY_DOWN, LedId.Keyboard_ArrowDown }, + { AsusLedId.KEY_RIGHT, LedId.Keyboard_ArrowRight }, + { AsusLedId.KEY_NUMLOCK, LedId.Keyboard_NumLock }, + { AsusLedId.KEY_DIVIDE, LedId.Keyboard_NumSlash }, + { AsusLedId.KEY_MULTIPLY, LedId.Keyboard_NumAsterisk }, + { AsusLedId.KEY_SUBTRACT, LedId.Keyboard_NumMinus }, + { AsusLedId.KEY_NUMPAD7, LedId.Keyboard_Num7 }, + { AsusLedId.KEY_NUMPAD8, LedId.Keyboard_Num8 }, + { AsusLedId.KEY_NUMPAD9, LedId.Keyboard_Num9 }, + { AsusLedId.KEY_DECIMAL, LedId.Keyboard_NumPeriodAndDelete }, + { AsusLedId.KEY_ADD ,LedId.Keyboard_NumPlus }, + { AsusLedId.KEY_NUMPAD4, LedId.Keyboard_Num4 }, + { AsusLedId.KEY_NUMPAD5, LedId.Keyboard_Num5 }, + { AsusLedId.KEY_NUMPAD6, LedId.Keyboard_Num6 }, + { AsusLedId.KEY_NUMPAD1, LedId.Keyboard_Num1 }, + { AsusLedId.KEY_NUMPAD2, LedId.Keyboard_Num2 }, + { AsusLedId.KEY_NUMPAD3, LedId.Keyboard_Num3 }, + { AsusLedId.KEY_NUMPAD0, LedId.Keyboard_Num0 }, + { AsusLedId.KEY_NUMPADENTER, LedId.Keyboard_NumEnter }, + { AsusLedId.KEY_NUMPADCOMMA, LedId.Keyboard_NumComma }, + { AsusLedId.KEY_F13, LedId.Keyboard_Custom3 }, + { AsusLedId.KEY_F14, LedId.Keyboard_Custom4 }, + { AsusLedId.KEY_F15, LedId.Keyboard_Custom5 }, + { AsusLedId.KEY_KANA, LedId.Keyboard_Custom6 }, + { AsusLedId.KEY_ABNT_C1, LedId.Keyboard_Custom7 }, + { AsusLedId.KEY_CONVERT, LedId.Keyboard_Custom8 }, + { AsusLedId.KEY_NOCONVERT, LedId.Keyboard_Custom9 }, + { AsusLedId.KEY_YEN, LedId.Keyboard_Custom10 }, + { AsusLedId.KEY_ABNT_C2, LedId.Keyboard_Custom11 }, + { AsusLedId.KEY_NUMPADEQUALS, LedId.Keyboard_Custom12 }, + { AsusLedId.KEY_CIRCUMFLEX, LedId.Keyboard_Custom13 }, + { AsusLedId.KEY_AT, LedId.Keyboard_Custom14 }, + { AsusLedId.KEY_COLON, LedId.Keyboard_Custom15 }, + { AsusLedId.KEY_UNDERLINE, LedId.Keyboard_Custom16 }, + { AsusLedId.KEY_KANJI, LedId.Keyboard_Custom17 }, + { AsusLedId.KEY_STOP, LedId.Keyboard_Custom18 }, + { AsusLedId.KEY_AX, LedId.Keyboard_Custom19 }, + { AsusLedId.KEY_UNLABELED, LedId.Keyboard_Custom20 }, + { AsusLedId.KEY_NEXTTRACK, LedId.Keyboard_Custom21 }, + { AsusLedId.KEY_CALCULATOR, LedId.Keyboard_Custom22 }, + { AsusLedId.KEY_POWER, LedId.Keyboard_Custom23 }, + { AsusLedId.KEY_SLEEP, LedId.Keyboard_Custom24 }, + { AsusLedId.KEY_WAKE, LedId.Keyboard_Custom25 }, + { AsusLedId.KEY_WEBSEARCH, LedId.Keyboard_Custom26 }, + { AsusLedId.KEY_WEBFAVORITES, LedId.Keyboard_Custom27 }, + { AsusLedId.KEY_WEBREFRESH, LedId.Keyboard_Custom28 }, + { AsusLedId.KEY_WEBSTOP, LedId.Keyboard_Custom29 }, + { AsusLedId.KEY_WEBFORWARD, LedId.Keyboard_Custom30 }, + { AsusLedId.KEY_WEBHOME, LedId.Keyboard_Custom31 }, + { AsusLedId.KEY_WEBBACK, LedId.Keyboard_Custom32 }, + { AsusLedId.KEY_MYCOMPUTER, LedId.Keyboard_Custom33 }, + { AsusLedId.KEY_MAIL, LedId.Keyboard_Custom34 }, + { AsusLedId.KEY_MEDIASELECT, LedId.Keyboard_Custom35 }, + { AsusLedId.KEY_FN, LedId.Keyboard_Custom36 }, + { AsusLedId.KEY_MUTE, LedId.Keyboard_MediaMute }, + { AsusLedId.KEY_PLAYPAUSE, LedId.Keyboard_MediaPlay }, + { AsusLedId.KEY_MEDIASTOP, LedId.Keyboard_MediaStop }, + { AsusLedId.KEY_VOLUMEDOWN, LedId.Keyboard_MediaVolumeDown }, + { AsusLedId.KEY_VOLUMEUP, LedId.Keyboard_MediaVolumeUp }, + { AsusLedId.UNDOCUMENTED_1, LedId.Keyboard_NonUsBackslash }, + { AsusLedId.UNDOCUMENTED_2, LedId.Keyboard_NonUsTilde }, + { AsusLedId.UNDOCUMENTED_3, LedId.Logo }, + { AsusLedId.UNDOCUMENTED_4, LedId.Keyboard_Custom1 }, + { AsusLedId.UNDOCUMENTED_5, LedId.Keyboard_Custom2 }, + { AsusLedId.UNDOCUMENTED_6, LedId.Keyboard_NonUsTilde }, + { AsusLedId.UNDOCUMENTED_7, LedId.Keyboard_NonUsBackslash }, + { AsusLedId.UNDOCUMENTED_8, LedId.Keyboard_Custom37 }, }; } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 28cfbec..23a5a8f 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -36,18 +36,21 @@ namespace RGB.NET.Devices.Asus private void InitializeLayout() { - Dictionary reversedMapping = AsusKeyboardLedMapping.MAPPING.ToDictionary(x => x.Value, x => x.Key); - if (DeviceInfo.Device.Type != (uint)AsusDeviceType.NB_KB_4ZONE_RGB) { int pos = 0; foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) - AddLed(reversedMapping[(AsusLedId)key.Code], new Point(pos++ * 19, 0), new Size(19, 19)); + { + if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) + AddLed(ledId, new Point(pos++ * 19, 0), new Size(19, 19)); + else + throw new RGBDeviceException($"Couldn't find a LED mapping for key {key.Code:X} named '{key.Name}' on device '{DeviceInfo.DeviceName}'"); + } //UK Layout - AddLed(reversedMapping[AsusLedId.KEY_OEM_102], new Point(pos++ * 19, 0), new Size(19, 19)); + AddLed(AsusKeyboardLedMapping.MAPPING[AsusLedId.KEY_OEM_102], new Point(pos++ * 19, 0), new Size(19, 19)); - AddLed(reversedMapping[AsusLedId.UNDOCUMENTED_1], new Point(pos * 19, 0), new Size(19, 19)); + AddLed(AsusKeyboardLedMapping.MAPPING[AsusLedId.UNDOCUMENTED_1], new Point(pos * 19, 0), new Size(19, 19)); } else { @@ -63,7 +66,7 @@ namespace RGB.NET.Devices.Asus if (DeviceInfo.Device.Type == (uint)AsusDeviceType.NB_KB_4ZONE_RGB) return ledId - LedId.Keyboard_Custom1; - return AsusKeyboardLedMapping.MAPPING[ledId]; + return AsusKeyboardLedMapping.MAPPING.FirstOrDefault(m => m.Value == ledId).Key; } #endregion From a52bb474ef8443b099a9eebd1567fbd8e72ffdd5 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 27 Mar 2021 14:38:09 +0100 Subject: [PATCH 2/8] ASUS - Keyboards guard against double LEDs ASUS - Keyboards return the correct AsusLed in GetLedCustomData --- .../Keyboard/AsusKeyboardRGBDevice.cs | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 23a5a8f..7b31d21 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using AuraServiceLib; using RGB.NET.Core; @@ -13,6 +12,8 @@ namespace RGB.NET.Devices.Asus { #region Properties & Fields + private Dictionary _ledAsusLed = new(); + IKeyboardDeviceInfo IKeyboard.DeviceInfo => DeviceInfo; #endregion @@ -42,15 +43,15 @@ namespace RGB.NET.Devices.Asus foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) { if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) - AddLed(ledId, new Point(pos++ * 19, 0), new Size(19, 19)); + AddAsusLed((AsusLedId)key.Code, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); else throw new RGBDeviceException($"Couldn't find a LED mapping for key {key.Code:X} named '{key.Name}' on device '{DeviceInfo.DeviceName}'"); + } - //UK Layout - AddLed(AsusKeyboardLedMapping.MAPPING[AsusLedId.KEY_OEM_102], new Point(pos++ * 19, 0), new Size(19, 19)); - - AddLed(AsusKeyboardLedMapping.MAPPING[AsusLedId.UNDOCUMENTED_1], new Point(pos * 19, 0), new Size(19, 19)); + // UK Layout + AddAsusLed(AsusLedId.KEY_OEM_102, AsusKeyboardLedMapping.MAPPING[AsusLedId.KEY_OEM_102], new Point(pos++ * 19, 0), new Size(19, 19)); + AddAsusLed(AsusLedId.KEY_OEM_102, AsusKeyboardLedMapping.MAPPING[AsusLedId.UNDOCUMENTED_1], new Point(pos * 19, 0), new Size(19, 19)); } else { @@ -60,13 +61,21 @@ namespace RGB.NET.Devices.Asus } } + private void AddAsusLed(AsusLedId asusLedId, LedId ledId, Point position, Size size) + { + if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId firstAsusLed)) + throw new RGBDeviceException($"Got LED '{ledId}' twice, first ASUS LED '{firstAsusLed}' second ASUS LED '{asusLedId}' on device '{DeviceInfo.DeviceName}'"); + + this._ledAsusLed.Add(ledId, asusLedId); + AddLed(ledId, position, size); + } + /// protected override object? GetLedCustomData(LedId ledId) { - if (DeviceInfo.Device.Type == (uint)AsusDeviceType.NB_KB_4ZONE_RGB) - return ledId - LedId.Keyboard_Custom1; - - return AsusKeyboardLedMapping.MAPPING.FirstOrDefault(m => m.Value == ledId).Key; + if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId asusLedId)) + return asusLedId; + return null; } #endregion From 40cce7aaaf972fc3d158c5591bd695be61195076 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 29 Mar 2021 00:59:26 +0200 Subject: [PATCH 3/8] Core - Added Unknown LED IDs Core - Moved Custom LED IDs from 0xFF to 0xFE ASUS - Use Unknown LED IDs for missing LED mappings --- RGB.NET.Core/Leds/LedId.cs | 386 ++++++++++++------ RGB.NET.Devices.Asus/Enum/AsusLedId.cs | 6 +- .../Keyboard/AsusKeyboardLedMapping.cs | 6 +- .../Keyboard/AsusKeyboardRGBDevice.cs | 7 +- 4 files changed, 273 insertions(+), 132 deletions(-) diff --git a/RGB.NET.Core/Leds/LedId.cs b/RGB.NET.Core/Leds/LedId.cs index f3e3bac..9f60cbf 100644 --- a/RGB.NET.Core/Leds/LedId.cs +++ b/RGB.NET.Core/Leds/LedId.cs @@ -1234,133 +1234,263 @@ namespace RGB.NET.Core Cooler64 = 0x00D00040, /*### Custom ###*/ - Custom1 = 0x0FF00001, - Custom2 = 0x0FF00002, - Custom3 = 0x0FF00003, - Custom4 = 0x0FF00004, - Custom5 = 0x0FF00005, - Custom6 = 0x0FF00006, - Custom7 = 0x0FF00007, - Custom8 = 0x0FF00008, - Custom9 = 0x0FF00009, - Custom10 = 0x0FF0000A, - Custom11 = 0x0FF0000B, - Custom12 = 0x0FF0000C, - Custom13 = 0x0FF0000D, - Custom14 = 0x0FF0000E, - Custom15 = 0x0FF0000F, - Custom16 = 0x0FF00010, - Custom17 = 0x0FF00011, - Custom18 = 0x0FF00012, - Custom19 = 0x0FF00013, - Custom20 = 0x0FF00014, - Custom21 = 0x0FF00015, - Custom22 = 0x0FF00016, - Custom23 = 0x0FF00017, - Custom24 = 0x0FF00018, - Custom25 = 0x0FF00019, - Custom26 = 0x0FF0001A, - Custom27 = 0x0FF0001B, - Custom28 = 0x0FF0001C, - Custom29 = 0x0FF0001D, - Custom30 = 0x0FF0001E, - Custom31 = 0x0FF0001F, - Custom32 = 0x0FF00020, - Custom33 = 0x0FF00021, - Custom34 = 0x0FF00022, - Custom35 = 0x0FF00023, - Custom36 = 0x0FF00024, - Custom37 = 0x0FF00025, - Custom38 = 0x0FF00026, - Custom39 = 0x0FF00027, - Custom40 = 0x0FF00028, - Custom41 = 0x0FF00029, - Custom42 = 0x0FF0002A, - Custom43 = 0x0FF0002B, - Custom44 = 0x0FF0002C, - Custom45 = 0x0FF0002D, - Custom46 = 0x0FF0002E, - Custom47 = 0x0FF0002F, - Custom48 = 0x0FF00030, - Custom49 = 0x0FF00031, - Custom50 = 0x0FF00032, - Custom51 = 0x0FF00033, - Custom52 = 0x0FF00034, - Custom53 = 0x0FF00035, - Custom54 = 0x0FF00036, - Custom55 = 0x0FF00037, - Custom56 = 0x0FF00038, - Custom57 = 0x0FF00039, - Custom58 = 0x0FF0003A, - Custom59 = 0x0FF0003B, - Custom60 = 0x0FF0003C, - Custom61 = 0x0FF0003D, - Custom62 = 0x0FF0003E, - Custom63 = 0x0FF0003F, - Custom64 = 0x0FF00040, - Custom65 = 0x0FF00041, - Custom66 = 0x0FF00042, - Custom67 = 0x0FF00043, - Custom68 = 0x0FF00044, - Custom69 = 0x0FF00045, - Custom70 = 0x0FF00046, - Custom71 = 0x0FF00047, - Custom72 = 0x0FF00048, - Custom73 = 0x0FF00049, - Custom74 = 0x0FF0004A, - Custom75 = 0x0FF0004B, - Custom76 = 0x0FF0004C, - Custom77 = 0x0FF0004D, - Custom78 = 0x0FF0004E, - Custom79 = 0x0FF0004F, - Custom80 = 0x0FF00050, - Custom81 = 0x0FF00051, - Custom82 = 0x0FF00052, - Custom83 = 0x0FF00053, - Custom84 = 0x0FF00054, - Custom85 = 0x0FF00055, - Custom86 = 0x0FF00056, - Custom87 = 0x0FF00057, - Custom88 = 0x0FF00058, - Custom89 = 0x0FF00059, - Custom90 = 0x0FF0005A, - Custom91 = 0x0FF0005B, - Custom92 = 0x0FF0005C, - Custom93 = 0x0FF0005D, - Custom94 = 0x0FF0005E, - Custom95 = 0x0FF0005F, - Custom96 = 0x0FF00060, - Custom97 = 0x0FF00061, - Custom98 = 0x0FF00062, - Custom99 = 0x0FF00063, - Custom100 = 0x0FF00064, - Custom101 = 0x0FF00065, - Custom102 = 0x0FF00066, - Custom103 = 0x0FF00067, - Custom104 = 0x0FF00068, - Custom105 = 0x0FF00069, - Custom106 = 0x0FF0006A, - Custom107 = 0x0FF0006B, - Custom108 = 0x0FF0006C, - Custom109 = 0x0FF0006D, - Custom110 = 0x0FF0006E, - Custom111 = 0x0FF0006F, - Custom112 = 0x0FF00070, - Custom113 = 0x0FF00071, - Custom114 = 0x0FF00072, - Custom115 = 0x0FF00073, - Custom116 = 0x0FF00074, - Custom117 = 0x0FF00075, - Custom118 = 0x0FF00076, - Custom119 = 0x0FF00077, - Custom120 = 0x0FF00078, - Custom121 = 0x0FF00079, - Custom122 = 0x0FF0007A, - Custom123 = 0x0FF0007B, - Custom124 = 0x0FF0007C, - Custom125 = 0x0FF0007D, - Custom126 = 0x0FF0007E, - Custom127 = 0x0FF0007F, - Custom128 = 0x0FF00080, + Custom1 = 0x0FE00001, + Custom2 = 0x0FE00002, + Custom3 = 0x0FE00003, + Custom4 = 0x0FE00004, + Custom5 = 0x0FE00005, + Custom6 = 0x0FE00006, + Custom7 = 0x0FE00007, + Custom8 = 0x0FE00008, + Custom9 = 0x0FE00009, + Custom10 = 0x0FE0000A, + Custom11 = 0x0FE0000B, + Custom12 = 0x0FE0000C, + Custom13 = 0x0FE0000D, + Custom14 = 0x0FE0000E, + Custom15 = 0x0FE0000F, + Custom16 = 0x0FE00010, + Custom17 = 0x0FE00011, + Custom18 = 0x0FE00012, + Custom19 = 0x0FE00013, + Custom20 = 0x0FE00014, + Custom21 = 0x0FE00015, + Custom22 = 0x0FE00016, + Custom23 = 0x0FE00017, + Custom24 = 0x0FE00018, + Custom25 = 0x0FE00019, + Custom26 = 0x0FE0001A, + Custom27 = 0x0FE0001B, + Custom28 = 0x0FE0001C, + Custom29 = 0x0FE0001D, + Custom30 = 0x0FE0001E, + Custom31 = 0x0FE0001F, + Custom32 = 0x0FE00020, + Custom33 = 0x0FE00021, + Custom34 = 0x0FE00022, + Custom35 = 0x0FE00023, + Custom36 = 0x0FE00024, + Custom37 = 0x0FE00025, + Custom38 = 0x0FE00026, + Custom39 = 0x0FE00027, + Custom40 = 0x0FE00028, + Custom41 = 0x0FE00029, + Custom42 = 0x0FE0002A, + Custom43 = 0x0FE0002B, + Custom44 = 0x0FE0002C, + Custom45 = 0x0FE0002D, + Custom46 = 0x0FE0002E, + Custom47 = 0x0FE0002F, + Custom48 = 0x0FE00030, + Custom49 = 0x0FE00031, + Custom50 = 0x0FE00032, + Custom51 = 0x0FE00033, + Custom52 = 0x0FE00034, + Custom53 = 0x0FE00035, + Custom54 = 0x0FE00036, + Custom55 = 0x0FE00037, + Custom56 = 0x0FE00038, + Custom57 = 0x0FE00039, + Custom58 = 0x0FE0003A, + Custom59 = 0x0FE0003B, + Custom60 = 0x0FE0003C, + Custom61 = 0x0FE0003D, + Custom62 = 0x0FE0003E, + Custom63 = 0x0FE0003F, + Custom64 = 0x0FE00040, + Custom65 = 0x0FE00041, + Custom66 = 0x0FE00042, + Custom67 = 0x0FE00043, + Custom68 = 0x0FE00044, + Custom69 = 0x0FE00045, + Custom70 = 0x0FE00046, + Custom71 = 0x0FE00047, + Custom72 = 0x0FE00048, + Custom73 = 0x0FE00049, + Custom74 = 0x0FE0004A, + Custom75 = 0x0FE0004B, + Custom76 = 0x0FE0004C, + Custom77 = 0x0FE0004D, + Custom78 = 0x0FE0004E, + Custom79 = 0x0FE0004F, + Custom80 = 0x0FE00050, + Custom81 = 0x0FE00051, + Custom82 = 0x0FE00052, + Custom83 = 0x0FE00053, + Custom84 = 0x0FE00054, + Custom85 = 0x0FE00055, + Custom86 = 0x0FE00056, + Custom87 = 0x0FE00057, + Custom88 = 0x0FE00058, + Custom89 = 0x0FE00059, + Custom90 = 0x0FE0005A, + Custom91 = 0x0FE0005B, + Custom92 = 0x0FE0005C, + Custom93 = 0x0FE0005D, + Custom94 = 0x0FE0005E, + Custom95 = 0x0FE0005F, + Custom96 = 0x0FE00060, + Custom97 = 0x0FE00061, + Custom98 = 0x0FE00062, + Custom99 = 0x0FE00063, + Custom100 = 0x0FE00064, + Custom101 = 0x0FE00065, + Custom102 = 0x0FE00066, + Custom103 = 0x0FE00067, + Custom104 = 0x0FE00068, + Custom105 = 0x0FE00069, + Custom106 = 0x0FE0006A, + Custom107 = 0x0FE0006B, + Custom108 = 0x0FE0006C, + Custom109 = 0x0FE0006D, + Custom110 = 0x0FE0006E, + Custom111 = 0x0FE0006F, + Custom112 = 0x0FE00070, + Custom113 = 0x0FE00071, + Custom114 = 0x0FE00072, + Custom115 = 0x0FE00073, + Custom116 = 0x0FE00074, + Custom117 = 0x0FE00075, + Custom118 = 0x0FE00076, + Custom119 = 0x0FE00077, + Custom120 = 0x0FE00078, + Custom121 = 0x0FE00079, + Custom122 = 0x0FE0007A, + Custom123 = 0x0FE0007B, + Custom124 = 0x0FE0007C, + Custom125 = 0x0FE0007D, + Custom126 = 0x0FE0007E, + Custom127 = 0x0FE0007F, + Custom128 = 0x0FE00080, + + /*### Unknown ###*/ + Unknown1 = 0x0FF00001, + Unknown2 = 0x0FF00002, + Unknown3 = 0x0FF00003, + Unknown4 = 0x0FF00004, + Unknown5 = 0x0FF00005, + Unknown6 = 0x0FF00006, + Unknown7 = 0x0FF00007, + Unknown8 = 0x0FF00008, + Unknown9 = 0x0FF00009, + Unknown10 = 0x0FF0000A, + Unknown11 = 0x0FF0000B, + Unknown12 = 0x0FF0000C, + Unknown13 = 0x0FF0000D, + Unknown14 = 0x0FF0000E, + Unknown15 = 0x0FF0000F, + Unknown16 = 0x0FF00010, + Unknown17 = 0x0FF00011, + Unknown18 = 0x0FF00012, + Unknown19 = 0x0FF00013, + Unknown20 = 0x0FF00014, + Unknown21 = 0x0FF00015, + Unknown22 = 0x0FF00016, + Unknown23 = 0x0FF00017, + Unknown24 = 0x0FF00018, + Unknown25 = 0x0FF00019, + Unknown26 = 0x0FF0001A, + Unknown27 = 0x0FF0001B, + Unknown28 = 0x0FF0001C, + Unknown29 = 0x0FF0001D, + Unknown30 = 0x0FF0001E, + Unknown31 = 0x0FF0001F, + Unknown32 = 0x0FF00020, + Unknown33 = 0x0FF00021, + Unknown34 = 0x0FF00022, + Unknown35 = 0x0FF00023, + Unknown36 = 0x0FF00024, + Unknown37 = 0x0FF00025, + Unknown38 = 0x0FF00026, + Unknown39 = 0x0FF00027, + Unknown40 = 0x0FF00028, + Unknown41 = 0x0FF00029, + Unknown42 = 0x0FF0002A, + Unknown43 = 0x0FF0002B, + Unknown44 = 0x0FF0002C, + Unknown45 = 0x0FF0002D, + Unknown46 = 0x0FF0002E, + Unknown47 = 0x0FF0002F, + Unknown48 = 0x0FF00030, + Unknown49 = 0x0FF00031, + Unknown50 = 0x0FF00032, + Unknown51 = 0x0FF00033, + Unknown52 = 0x0FF00034, + Unknown53 = 0x0FF00035, + Unknown54 = 0x0FF00036, + Unknown55 = 0x0FF00037, + Unknown56 = 0x0FF00038, + Unknown57 = 0x0FF00039, + Unknown58 = 0x0FF0003A, + Unknown59 = 0x0FF0003B, + Unknown60 = 0x0FF0003C, + Unknown61 = 0x0FF0003D, + Unknown62 = 0x0FF0003E, + Unknown63 = 0x0FF0003F, + Unknown64 = 0x0FF00040, + Unknown65 = 0x0FF00041, + Unknown66 = 0x0FF00042, + Unknown67 = 0x0FF00043, + Unknown68 = 0x0FF00044, + Unknown69 = 0x0FF00045, + Unknown70 = 0x0FF00046, + Unknown71 = 0x0FF00047, + Unknown72 = 0x0FF00048, + Unknown73 = 0x0FF00049, + Unknown74 = 0x0FF0004A, + Unknown75 = 0x0FF0004B, + Unknown76 = 0x0FF0004C, + Unknown77 = 0x0FF0004D, + Unknown78 = 0x0FF0004E, + Unknown79 = 0x0FF0004F, + Unknown80 = 0x0FF00050, + Unknown81 = 0x0FF00051, + Unknown82 = 0x0FF00052, + Unknown83 = 0x0FF00053, + Unknown84 = 0x0FF00054, + Unknown85 = 0x0FF00055, + Unknown86 = 0x0FF00056, + Unknown87 = 0x0FF00057, + Unknown88 = 0x0FF00058, + Unknown89 = 0x0FF00059, + Unknown90 = 0x0FF0005A, + Unknown91 = 0x0FF0005B, + Unknown92 = 0x0FF0005C, + Unknown93 = 0x0FF0005D, + Unknown94 = 0x0FF0005E, + Unknown95 = 0x0FF0005F, + Unknown96 = 0x0FF00060, + Unknown97 = 0x0FF00061, + Unknown98 = 0x0FF00062, + Unknown99 = 0x0FF00063, + Unknown100 = 0x0FF00064, + Unknown101 = 0x0FF00065, + Unknown102 = 0x0FF00066, + Unknown103 = 0x0FF00067, + Unknown104 = 0x0FF00068, + Unknown105 = 0x0FF00069, + Unknown106 = 0x0FF0006A, + Unknown107 = 0x0FF0006B, + Unknown108 = 0x0FF0006C, + Unknown109 = 0x0FF0006D, + Unknown110 = 0x0FF0006E, + Unknown111 = 0x0FF0006F, + Unknown112 = 0x0FF00070, + Unknown113 = 0x0FF00071, + Unknown114 = 0x0FF00072, + Unknown115 = 0x0FF00073, + Unknown116 = 0x0FF00074, + Unknown117 = 0x0FF00075, + Unknown118 = 0x0FF00076, + Unknown119 = 0x0FF00077, + Unknown120 = 0x0FF00078, + Unknown121 = 0x0FF00079, + Unknown122 = 0x0FF0007A, + Unknown123 = 0x0FF0007B, + Unknown124 = 0x0FF0007C, + Unknown125 = 0x0FF0007D, + Unknown126 = 0x0FF0007E, + Unknown127 = 0x0FF0007F, + Unknown128 = 0x0FF00080, } } diff --git a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs index a5ee8e1..27be15f 100644 --- a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs +++ b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs @@ -158,6 +158,10 @@ namespace RGB.NET.Devices.Asus UNDOCUMENTED_5 = 0x103, UNDOCUMENTED_6 = 0x1EB, // ISO tilde UNDOCUMENTED_7 = 0x1EC, // ISO backslash - UNDOCUMENTED_8 = 0x14E, + + // UNDOCUMENTED_8 = 0x14E, + // UNDOCUMENTED_9 = 0x424, + // UNDOCUMENTED_10 = 0x1A8, + // UNDOCUMENTED_11 = 0x415, } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs index 3bb0de9..ebe8a49 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs @@ -158,7 +158,11 @@ namespace RGB.NET.Devices.Asus { AsusLedId.UNDOCUMENTED_5, LedId.Keyboard_Custom2 }, { AsusLedId.UNDOCUMENTED_6, LedId.Keyboard_NonUsTilde }, { AsusLedId.UNDOCUMENTED_7, LedId.Keyboard_NonUsBackslash }, - { AsusLedId.UNDOCUMENTED_8, LedId.Keyboard_Custom37 }, + + // { AsusLedId.UNDOCUMENTED_8, LedId.Keyboard_Custom37 }, + // { AsusLedId.UNDOCUMENTED_9, LedId.Keyboard_Custom38 }, + // { AsusLedId.UNDOCUMENTED_10, LedId.Keyboard_Custom39 }, + // { AsusLedId.UNDOCUMENTED_11, LedId.Keyboard_Custom40 }, }; } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 7b31d21..3071feb 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -40,13 +40,16 @@ namespace RGB.NET.Devices.Asus if (DeviceInfo.Device.Type != (uint)AsusDeviceType.NB_KB_4ZONE_RGB) { int pos = 0; + int unknownLed = (int) LedId.Unknown1; foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) { if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) AddAsusLed((AsusLedId)key.Code, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); else - throw new RGBDeviceException($"Couldn't find a LED mapping for key {key.Code:X} named '{key.Name}' on device '{DeviceInfo.DeviceName}'"); - + { + AddAsusLed((AsusLedId)key.Code, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); + unknownLed++; + } } // UK Layout From 9bfc53087c2d88af7b7b27502f4c70666dbab522 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 29 Mar 2021 16:17:14 +0200 Subject: [PATCH 4/8] ASUS - Cleaned up code and removed strangly placed per-device logic --- RGB.NET.Devices.Asus/Enum/AsusLedId.cs | 14 ----------- .../Generic/AsusUpdateQueue.cs | 23 ++++--------------- .../Keyboard/AsusKeyboardLedMapping.cs | 14 +---------- .../Keyboard/AsusKeyboardRGBDevice.cs | 10 -------- 4 files changed, 6 insertions(+), 55 deletions(-) diff --git a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs index 27be15f..96da088 100644 --- a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs +++ b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs @@ -149,19 +149,5 @@ namespace RGB.NET.Devices.Asus KEY_MAIL = 0xEC, // Mail KEY_MEDIASELECT = 0xED, // Media Select KEY_FN = 0x100, // Function key - - // Undocumented - UNDOCUMENTED_1 = 0x59, - UNDOCUMENTED_2 = 0x56, - UNDOCUMENTED_3 = 0x101, - UNDOCUMENTED_4 = 0x102, - UNDOCUMENTED_5 = 0x103, - UNDOCUMENTED_6 = 0x1EB, // ISO tilde - UNDOCUMENTED_7 = 0x1EC, // ISO backslash - - // UNDOCUMENTED_8 = 0x14E, - // UNDOCUMENTED_9 = 0x424, - // UNDOCUMENTED_10 = 0x1A8, - // UNDOCUMENTED_11 = 0x415, } } diff --git a/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs b/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs index 70b1a38..63b5ebd 100644 --- a/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs +++ b/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs @@ -47,23 +47,8 @@ namespace RGB.NET.Devices.Asus AsusLedId index = (AsusLedId)key; if (Device is IAuraSyncKeyboard keyboard) { - IAuraRgbLight light = index switch - { - //UK keyboard Layout - AsusLedId.KEY_OEM_102 => keyboard.Lights[(int)((3 * keyboard.Width) + 13)], - AsusLedId.UNDOCUMENTED_1 => keyboard.Lights[(int)((4 * keyboard.Width) + 1)], - _ => keyboard.Key[(ushort)index] - }; - - // Asus Strix Scope - if (keyboard.Name == "Charm") - light = index switch - { - AsusLedId.KEY_LWIN => keyboard.Lights[(int)((5 * keyboard.Width) + 2)], - AsusLedId.KEY_LMENU => keyboard.Lights[(int)((5 * keyboard.Width) + 3)], - _ => light - }; - + IAuraRgbLight light = keyboard.Key[(ushort)index]; + (_, byte r, byte g, byte b) = value.GetRGBBytes(); light.Red = r; light.Green = g; @@ -88,8 +73,10 @@ namespace RGB.NET.Devices.Asus Device.Apply(); } catch - { /* "The server threw an exception." seems to be a thing here ... */ } + { /* "The server threw an exception." seems to be a thing here ... */ + } } + #endregion } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs index ebe8a49..db5cd15 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs @@ -145,24 +145,12 @@ namespace RGB.NET.Devices.Asus { AsusLedId.KEY_MYCOMPUTER, LedId.Keyboard_Custom33 }, { AsusLedId.KEY_MAIL, LedId.Keyboard_Custom34 }, { AsusLedId.KEY_MEDIASELECT, LedId.Keyboard_Custom35 }, - { AsusLedId.KEY_FN, LedId.Keyboard_Custom36 }, + { AsusLedId.KEY_FN, LedId.Keyboard_Function }, { AsusLedId.KEY_MUTE, LedId.Keyboard_MediaMute }, { AsusLedId.KEY_PLAYPAUSE, LedId.Keyboard_MediaPlay }, { AsusLedId.KEY_MEDIASTOP, LedId.Keyboard_MediaStop }, { AsusLedId.KEY_VOLUMEDOWN, LedId.Keyboard_MediaVolumeDown }, { AsusLedId.KEY_VOLUMEUP, LedId.Keyboard_MediaVolumeUp }, - { AsusLedId.UNDOCUMENTED_1, LedId.Keyboard_NonUsBackslash }, - { AsusLedId.UNDOCUMENTED_2, LedId.Keyboard_NonUsTilde }, - { AsusLedId.UNDOCUMENTED_3, LedId.Logo }, - { AsusLedId.UNDOCUMENTED_4, LedId.Keyboard_Custom1 }, - { AsusLedId.UNDOCUMENTED_5, LedId.Keyboard_Custom2 }, - { AsusLedId.UNDOCUMENTED_6, LedId.Keyboard_NonUsTilde }, - { AsusLedId.UNDOCUMENTED_7, LedId.Keyboard_NonUsBackslash }, - - // { AsusLedId.UNDOCUMENTED_8, LedId.Keyboard_Custom37 }, - // { AsusLedId.UNDOCUMENTED_9, LedId.Keyboard_Custom38 }, - // { AsusLedId.UNDOCUMENTED_10, LedId.Keyboard_Custom39 }, - // { AsusLedId.UNDOCUMENTED_11, LedId.Keyboard_Custom40 }, }; } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 3071feb..1bba8c5 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -40,21 +40,11 @@ namespace RGB.NET.Devices.Asus if (DeviceInfo.Device.Type != (uint)AsusDeviceType.NB_KB_4ZONE_RGB) { int pos = 0; - int unknownLed = (int) LedId.Unknown1; foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) { if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) AddAsusLed((AsusLedId)key.Code, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); - else - { - AddAsusLed((AsusLedId)key.Code, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); - unknownLed++; - } } - - // UK Layout - AddAsusLed(AsusLedId.KEY_OEM_102, AsusKeyboardLedMapping.MAPPING[AsusLedId.KEY_OEM_102], new Point(pos++ * 19, 0), new Size(19, 19)); - AddAsusLed(AsusLedId.KEY_OEM_102, AsusKeyboardLedMapping.MAPPING[AsusLedId.UNDOCUMENTED_1], new Point(pos * 19, 0), new Size(19, 19)); } else { From e86003f1ea372d6b952f060ed53b49c523e3d545 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 22 Apr 2021 17:30:19 +0200 Subject: [PATCH 5/8] ASUS - Attempt to add lights that aren't present as keys --- RGB.NET.Devices.Asus/AsusDeviceProvider.cs | 1 + .../Generic/AsusUpdateQueue.cs | 20 ++++++++--- .../Keyboard/AsusKeyboardRGBDevice.cs | 35 +++++++++++++++++-- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/RGB.NET.Devices.Asus/AsusDeviceProvider.cs b/RGB.NET.Devices.Asus/AsusDeviceProvider.cs index 580ab42..609dbf9 100644 --- a/RGB.NET.Devices.Asus/AsusDeviceProvider.cs +++ b/RGB.NET.Devices.Asus/AsusDeviceProvider.cs @@ -45,6 +45,7 @@ namespace RGB.NET.Devices.Asus protected override void InitializeSDK() { + // ReSharper disable once SuspiciousTypeConversion.Global _sdk = (IAuraSdk2)new AuraSdk(); _sdk.SwitchMode(); } diff --git a/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs b/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs index 63b5ebd..6b6977a 100644 --- a/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs +++ b/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs @@ -42,13 +42,23 @@ namespace RGB.NET.Devices.Asus { if ((Device.Type == (uint)AsusDeviceType.KEYBOARD_RGB) || (Device.Type == (uint)AsusDeviceType.NB_KB_RGB)) { - foreach ((object key, Color value) in dataSet) + if (Device is not IAuraSyncKeyboard keyboard) + return; + + foreach ((object customData, Color value) in dataSet) { - AsusLedId index = (AsusLedId)key; - if (Device is IAuraSyncKeyboard keyboard) + (bool, int) customDataTuple = ((bool, int))customData; + if (customDataTuple.Item1) { - IAuraRgbLight light = keyboard.Key[(ushort)index]; - + IAuraRgbLight light = keyboard.Key[(ushort)customDataTuple.Item2]; + (_, byte r, byte g, byte b) = value.GetRGBBytes(); + light.Red = r; + light.Green = g; + light.Blue = b; + } + else + { + IAuraRgbLight light = keyboard.Lights[customDataTuple.Item2]; (_, byte r, byte g, byte b) = value.GetRGBBytes(); light.Red = r; light.Green = g; diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 1bba8c5..91823ea 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using AuraServiceLib; using RGB.NET.Core; @@ -13,6 +14,7 @@ namespace RGB.NET.Devices.Asus #region Properties & Fields private Dictionary _ledAsusLed = new(); + private Dictionary _ledAsusLights = new(); IKeyboardDeviceInfo IKeyboard.DeviceInfo => DeviceInfo; @@ -40,10 +42,28 @@ namespace RGB.NET.Devices.Asus if (DeviceInfo.Device.Type != (uint)AsusDeviceType.NB_KB_4ZONE_RGB) { int pos = 0; - foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) + int unknownLed = (int)LedId.Unknown1; + + List keys = ((IAuraSyncKeyboard)DeviceInfo.Device).Keys.Cast().ToList(); + foreach (IAuraRgbKey key in keys) { if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) AddAsusLed((AsusLedId)key.Code, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); + else + { + AddAsusLed((AsusLedId)key.Code, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); + unknownLed++; + } + } + + for (int index = 0; index < ((IAuraSyncKeyboard)DeviceInfo.Device).Lights.Count; index++) + { + IAuraRgbLight light = ((IAuraSyncKeyboard)DeviceInfo.Device).Lights[index]; + if (keys.Contains(light)) + continue; + + AddAsusLed(index, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); + unknownLed++; } } else @@ -57,17 +77,26 @@ namespace RGB.NET.Devices.Asus private void AddAsusLed(AsusLedId asusLedId, LedId ledId, Point position, Size size) { if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId firstAsusLed)) - throw new RGBDeviceException($"Got LED '{ledId}' twice, first ASUS LED '{firstAsusLed}' second ASUS LED '{asusLedId}' on device '{DeviceInfo.DeviceName}'"); + throw new + RGBDeviceException($"Got LED '{ledId}' twice, first ASUS LED '{firstAsusLed}' second ASUS LED '{asusLedId}' on device '{DeviceInfo.DeviceName}'"); this._ledAsusLed.Add(ledId, asusLedId); AddLed(ledId, position, size); } + private void AddAsusLed(int index, LedId ledId, Point position, Size size) + { + this._ledAsusLights.Add(ledId, index); + AddLed(ledId, position, size); + } + /// protected override object? GetLedCustomData(LedId ledId) { if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId asusLedId)) - return asusLedId; + return (true, (int)asusLedId); + if (this._ledAsusLights.TryGetValue(ledId, out int lightIndex)) + return (false, lightIndex); return null; } From d6054cf527f08f9bb2cd32a8c6a91c7bbd468064 Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 23 Apr 2021 22:11:00 +0200 Subject: [PATCH 6/8] ASUS - Added mechanism to add extra LEDs via lights --- .../Keyboard/AsusKeyboardRGBDevice.cs | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 91823ea..319b3b5 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using AuraServiceLib; using RGB.NET.Core; @@ -44,8 +43,8 @@ namespace RGB.NET.Devices.Asus int pos = 0; int unknownLed = (int)LedId.Unknown1; - List keys = ((IAuraSyncKeyboard)DeviceInfo.Device).Keys.Cast().ToList(); - foreach (IAuraRgbKey key in keys) + ClearTags(); + foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) { if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) AddAsusLed((AsusLedId)key.Code, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); @@ -54,17 +53,20 @@ namespace RGB.NET.Devices.Asus AddAsusLed((AsusLedId)key.Code, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); unknownLed++; } + + TagAsusLed(key); } for (int index = 0; index < ((IAuraSyncKeyboard)DeviceInfo.Device).Lights.Count; index++) { IAuraRgbLight light = ((IAuraSyncKeyboard)DeviceInfo.Device).Lights[index]; - if (keys.Contains(light)) + if (IsAsusLedTagged(light)) continue; AddAsusLed(index, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); unknownLed++; } + ClearTags(); } else { @@ -100,6 +102,22 @@ namespace RGB.NET.Devices.Asus return null; } + private void ClearTags() + { + foreach (IAuraRgbLight light in ((IAuraSyncKeyboard)DeviceInfo.Device).Lights) + light.Color = 0x000000; + } + + private void TagAsusLed(IAuraRgbKey key) + { + key.Color = 0x000001; + } + + private bool IsAsusLedTagged(IAuraRgbLight light) + { + return light.Color == 0x000001; + } + #endregion } } From 6665e14e1daf0750b1dfbcdf6b89fbd26a5a2b4b Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 26 Apr 2021 22:58:52 +0200 Subject: [PATCH 7/8] ASUS - Explain what is going on with LED tagging --- .../Keyboard/AsusKeyboardRGBDevice.cs | 65 ++++++++++++++----- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index 319b3b5..b4af3a4 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading; using AuraServiceLib; using RGB.NET.Core; @@ -43,6 +44,10 @@ namespace RGB.NET.Devices.Asus int pos = 0; int unknownLed = (int)LedId.Unknown1; + // A device can have more lights than keys, a space bar with 4 lights per example but only the middle light is represented as a key + // This means we want all lights but keys contain more information (a LED ID) so first pick up all keys and 'tag' them by giving them a color of 0x000001 + + // Clear tags to make sure no device is already at 0x000001 ClearTags(); foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) { @@ -57,6 +62,11 @@ namespace RGB.NET.Devices.Asus TagAsusLed(key); } + // Give the ASUS SDK some time to catch up + Thread.Sleep(100); + + // With keys iterated, add any light that was not tagged, these are lights that aren't represented by keys + // Because there's no way to tell which light is which, they're all added as Unknown LEDs for (int index = 0; index < ((IAuraSyncKeyboard)DeviceInfo.Device).Lights.Count; index++) { IAuraRgbLight light = ((IAuraSyncKeyboard)DeviceInfo.Device).Lights[index]; @@ -66,6 +76,8 @@ namespace RGB.NET.Devices.Asus AddAsusLed(index, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); unknownLed++; } + + // Clear tags when done, the info is no longer relevant ClearTags(); } else @@ -76,22 +88,6 @@ namespace RGB.NET.Devices.Asus } } - private void AddAsusLed(AsusLedId asusLedId, LedId ledId, Point position, Size size) - { - if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId firstAsusLed)) - throw new - RGBDeviceException($"Got LED '{ledId}' twice, first ASUS LED '{firstAsusLed}' second ASUS LED '{asusLedId}' on device '{DeviceInfo.DeviceName}'"); - - this._ledAsusLed.Add(ledId, asusLedId); - AddLed(ledId, position, size); - } - - private void AddAsusLed(int index, LedId ledId, Point position, Size size) - { - this._ledAsusLights.Add(ledId, index); - AddLed(ledId, position, size); - } - /// protected override object? GetLedCustomData(LedId ledId) { @@ -102,17 +98,52 @@ namespace RGB.NET.Devices.Asus return null; } + + /// + /// Add an ASUS LED by its LED ID + /// + private void AddAsusLed(AsusLedId asusLedId, LedId ledId, Point position, Size size) + { + if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId firstAsusLed)) + throw new RGBDeviceException($"Got LED '{ledId}' twice, first ASUS LED '{firstAsusLed}' " + + $"second ASUS LED '{asusLedId}' on device '{DeviceInfo.DeviceName}'"); + + this._ledAsusLed.Add(ledId, asusLedId); + AddLed(ledId, position, size); + } + + /// + /// Add an asus LED by its light index + /// + private void AddAsusLed(int index, LedId ledId, Point position, Size size) + { + this._ledAsusLights.Add(ledId, index); + AddLed(ledId, position, size); + } + + /// + /// Clears the tags off all keys by setting their color to 0x000000 + /// private void ClearTags() { - foreach (IAuraRgbLight light in ((IAuraSyncKeyboard)DeviceInfo.Device).Lights) + foreach (IAuraRgbLight light in ((IAuraSyncKeyboard)DeviceInfo.Device).Lights) light.Color = 0x000000; } + /// + /// Tags a LED by its key by setting its color to 0x000001 + /// + /// private void TagAsusLed(IAuraRgbKey key) { key.Color = 0x000001; } + /// + /// Determines whether a LED is tagged by its light + /// + /// + /// private bool IsAsusLedTagged(IAuraRgbLight light) { return light.Color == 0x000001; From 4055ee9b0adea74de21004cbd5573b1b6e9de955 Mon Sep 17 00:00:00 2001 From: Robert Date: Thu, 29 Apr 2021 17:20:24 +0200 Subject: [PATCH 8/8] ASUS - Refactored to use LedMappings ASUS - Added laptop model detection ASUS - Added the option to provide extra LED mappings to keyboards based on model ASUS - Removed old attempts at detecting non-key LEDs on keyboards --- RGB.NET.Devices.Asus/AsusDeviceProvider.cs | 6 +- RGB.NET.Devices.Asus/Enum/AsusLedId.cs | 13 +- RGB.NET.Devices.Asus/Enum/AsusLedType.cs | 18 + .../Generic/AsusUpdateQueue.cs | 10 +- RGB.NET.Devices.Asus/Helper/WMIHelper.cs | 19 +- .../Keyboard/AsusKeyboardLedMapping.cs | 333 ++++++++++-------- .../Keyboard/AsusKeyboardRGBDevice.cs | 92 ++--- .../Keyboard/AsusKeyboardRGBDeviceInfo.cs | 20 +- 8 files changed, 292 insertions(+), 219 deletions(-) create mode 100644 RGB.NET.Devices.Asus/Enum/AsusLedType.cs diff --git a/RGB.NET.Devices.Asus/AsusDeviceProvider.cs b/RGB.NET.Devices.Asus/AsusDeviceProvider.cs index 609dbf9..68c545f 100644 --- a/RGB.NET.Devices.Asus/AsusDeviceProvider.cs +++ b/RGB.NET.Devices.Asus/AsusDeviceProvider.cs @@ -65,9 +65,9 @@ namespace RGB.NET.Devices.Asus AsusDeviceType.VGA_RGB => new AsusGraphicsCardRGBDevice(new AsusRGBDeviceInfo(RGBDeviceType.GraphicsCard, device), GetUpdateTrigger()), AsusDeviceType.HEADSET_RGB => new AsusHeadsetRGBDevice(new AsusRGBDeviceInfo(RGBDeviceType.Headset, device), GetUpdateTrigger()), AsusDeviceType.DRAM_RGB => new AsusDramRGBDevice(new AsusRGBDeviceInfo(RGBDeviceType.DRAM, device), GetUpdateTrigger()), - AsusDeviceType.KEYBOARD_RGB => new AsusKeyboardRGBDevice(new AsusKeyboardRGBDeviceInfo(device), GetUpdateTrigger()), - AsusDeviceType.NB_KB_RGB => new AsusKeyboardRGBDevice(new AsusKeyboardRGBDeviceInfo(device), GetUpdateTrigger()), - AsusDeviceType.NB_KB_4ZONE_RGB => new AsusKeyboardRGBDevice(new AsusKeyboardRGBDeviceInfo(device), GetUpdateTrigger()), + AsusDeviceType.KEYBOARD_RGB => new AsusKeyboardRGBDevice(new AsusKeyboardRGBDeviceInfo(device), LedMappings.KeyboardMapping, GetUpdateTrigger()), + AsusDeviceType.NB_KB_RGB => new AsusKeyboardRGBDevice(new AsusKeyboardRGBDeviceInfo(device), LedMappings.KeyboardMapping, GetUpdateTrigger()), + AsusDeviceType.NB_KB_4ZONE_RGB => new AsusKeyboardRGBDevice(new AsusKeyboardRGBDeviceInfo(device), null, GetUpdateTrigger()), AsusDeviceType.MOUSE_RGB => new AsusMouseRGBDevice(new AsusRGBDeviceInfo(RGBDeviceType.Mouse, device), GetUpdateTrigger()), _ => new AsusUnspecifiedRGBDevice(new AsusRGBDeviceInfo(RGBDeviceType.Unknown, device), LedId.Custom1, GetUpdateTrigger()) }; diff --git a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs index 96da088..5a9a118 100644 --- a/RGB.NET.Devices.Asus/Enum/AsusLedId.cs +++ b/RGB.NET.Devices.Asus/Enum/AsusLedId.cs @@ -2,7 +2,10 @@ namespace RGB.NET.Devices.Asus { - internal enum AsusLedId : ushort + /// + /// Represents a LED ID as they are known by the ASUS SDK + /// + public enum AsusLedId : ushort { KEY_ESCAPE = 0x01, KEY_1 = 0x02, @@ -149,5 +152,13 @@ namespace RGB.NET.Devices.Asus KEY_MAIL = 0xEC, // Mail KEY_MEDIASELECT = 0xED, // Media Select KEY_FN = 0x100, // Function key + + // Undocumented + UNDOCUMENTED_1 = 0x59, + UNDOCUMENTED_2 = 0x56, + UNDOCUMENTED_3 = 0x101, + UNDOCUMENTED_4 = 0x102, + UNDOCUMENTED_5 = 0x103, + UNDOCUMENTED_6 = 0xDA, // Bottom-left function on the ROG Zephyrus Duo 15 } } diff --git a/RGB.NET.Devices.Asus/Enum/AsusLedType.cs b/RGB.NET.Devices.Asus/Enum/AsusLedType.cs new file mode 100644 index 0000000..7134ccd --- /dev/null +++ b/RGB.NET.Devices.Asus/Enum/AsusLedType.cs @@ -0,0 +1,18 @@ +namespace RGB.NET.Devices.Asus +{ + /// + /// Represents a type of ASUS LED as known by the ASUS SDK + /// + public enum AsusLedType + { + /// + /// An ASUS LED that is present on a device's IAuraSyncKeyboard.Keys enumerable + /// + Key, + + /// + /// An ASUS LED that is present on a device's IAuraSyncDevice.Lights enumerable + /// + Light + } +} diff --git a/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs b/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs index 6b6977a..77d4540 100644 --- a/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs +++ b/RGB.NET.Devices.Asus/Generic/AsusUpdateQueue.cs @@ -44,13 +44,13 @@ namespace RGB.NET.Devices.Asus { if (Device is not IAuraSyncKeyboard keyboard) return; - + foreach ((object customData, Color value) in dataSet) { - (bool, int) customDataTuple = ((bool, int))customData; - if (customDataTuple.Item1) + (AsusLedType ledType, int id) = (AsusKeyboardLedCustomData)customData; + if (ledType == AsusLedType.Key) { - IAuraRgbLight light = keyboard.Key[(ushort)customDataTuple.Item2]; + IAuraRgbLight light = keyboard.Key[(ushort)id]; (_, byte r, byte g, byte b) = value.GetRGBBytes(); light.Red = r; light.Green = g; @@ -58,7 +58,7 @@ namespace RGB.NET.Devices.Asus } else { - IAuraRgbLight light = keyboard.Lights[customDataTuple.Item2]; + IAuraRgbLight light = keyboard.Lights[id]; (_, byte r, byte g, byte b) = value.GetRGBBytes(); light.Red = r; light.Green = g; diff --git a/RGB.NET.Devices.Asus/Helper/WMIHelper.cs b/RGB.NET.Devices.Asus/Helper/WMIHelper.cs index 0a43046..42f599f 100644 --- a/RGB.NET.Devices.Asus/Helper/WMIHelper.cs +++ b/RGB.NET.Devices.Asus/Helper/WMIHelper.cs @@ -9,13 +9,15 @@ namespace RGB.NET.Devices.Asus #region Properties & Fields // ReSharper disable InconsistentNaming + private static readonly ManagementObjectSearcher? _systemModelSearcher; private static readonly ManagementObjectSearcher? _mainboardSearcher; private static readonly ManagementObjectSearcher? _graphicsCardSearcher; // ReSharper restore InconsistentNaming + private static string? _systemModelInfo; private static (string manufacturer, string model)? _mainboardInfo; private static string? _graphicsCardInfo; - + #endregion #region Constructors @@ -24,6 +26,7 @@ namespace RGB.NET.Devices.Asus { if (OperatingSystem.IsWindows()) { + _systemModelSearcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT Model FROM Win32_ComputerSystem"); _mainboardSearcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT Manufacturer,Product FROM Win32_BaseBoard"); _graphicsCardSearcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT Name FROM Win32_VideoController"); } @@ -33,6 +36,20 @@ namespace RGB.NET.Devices.Asus #region Methods + internal static string? GetSystemModelInfo() + { + if (!OperatingSystem.IsWindows()) return null; + + if ((_systemModelInfo == null) && (_systemModelSearcher != null)) + foreach (ManagementBaseObject managementBaseObject in _systemModelSearcher.Get()) + { + _systemModelInfo = managementBaseObject["Model"]?.ToString(); + break; + } + + return _systemModelInfo; + } + internal static (string manufacturer, string model)? GetMainboardInfo() { if (!OperatingSystem.IsWindows()) return null; diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs index db5cd15..30fd811 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardLedMapping.cs @@ -1,156 +1,189 @@ -using System.Collections.Generic; -using RGB.NET.Core; +using RGB.NET.Core; namespace RGB.NET.Devices.Asus { - internal static class AsusKeyboardLedMapping + public static class LedMappings { - public static readonly Dictionary MAPPING = new() - { - { AsusLedId.KEY_ESCAPE, LedId.Keyboard_Escape }, - { AsusLedId.KEY_F1, LedId.Keyboard_F1 }, - { AsusLedId.KEY_F2, LedId.Keyboard_F2 }, - { AsusLedId.KEY_F3, LedId.Keyboard_F3 }, - { AsusLedId.KEY_F4, LedId.Keyboard_F4 }, - { AsusLedId.KEY_F5, LedId.Keyboard_F5 }, - { AsusLedId.KEY_F6, LedId.Keyboard_F6 }, - { AsusLedId.KEY_F7, LedId.Keyboard_F7 }, - { AsusLedId.KEY_F8, LedId.Keyboard_F8 }, - { AsusLedId.KEY_F9, LedId.Keyboard_F9 }, - { AsusLedId.KEY_F10, LedId.Keyboard_F10 }, - { AsusLedId.KEY_F11, LedId.Keyboard_F11 }, - { AsusLedId.KEY_F12, LedId.Keyboard_F12 }, - { AsusLedId.KEY_1, LedId.Keyboard_1 }, - { AsusLedId.KEY_2, LedId.Keyboard_2 }, - { AsusLedId.KEY_3, LedId.Keyboard_3 }, - { AsusLedId.KEY_4, LedId.Keyboard_4 }, - { AsusLedId.KEY_5, LedId.Keyboard_5 }, - { AsusLedId.KEY_6, LedId.Keyboard_6 }, - { AsusLedId.KEY_7, LedId.Keyboard_7 }, - { AsusLedId.KEY_8, LedId.Keyboard_8 }, - { AsusLedId.KEY_9, LedId.Keyboard_9 }, - { AsusLedId.KEY_0, LedId.Keyboard_0 }, - { AsusLedId.KEY_MINUS , LedId.Keyboard_MinusAndUnderscore }, - { AsusLedId.KEY_EQUALS, LedId.Keyboard_EqualsAndPlus }, - { AsusLedId.KEY_BACK, LedId.Keyboard_Backspace }, - { AsusLedId.KEY_TAB, LedId.Keyboard_Tab }, - { AsusLedId.KEY_Q, LedId.Keyboard_Q }, - { AsusLedId.KEY_W, LedId.Keyboard_W }, - { AsusLedId.KEY_E, LedId.Keyboard_E }, - { AsusLedId.KEY_R, LedId.Keyboard_R }, - { AsusLedId.KEY_T, LedId.Keyboard_T }, - { AsusLedId.KEY_Y, LedId.Keyboard_Y }, - { AsusLedId.KEY_U, LedId.Keyboard_U }, - { AsusLedId.KEY_I, LedId.Keyboard_I }, - { AsusLedId.KEY_O, LedId.Keyboard_O }, - { AsusLedId.KEY_P, LedId.Keyboard_P }, - { AsusLedId.KEY_LBRACKET, LedId.Keyboard_BracketLeft }, - { AsusLedId.KEY_RBRACKET, LedId.Keyboard_BracketRight }, - { AsusLedId.KEY_RETURN, LedId.Keyboard_Enter }, - { AsusLedId.KEY_CAPITAL, LedId.Keyboard_CapsLock }, - { AsusLedId.KEY_A, LedId.Keyboard_A }, - { AsusLedId.KEY_S, LedId.Keyboard_S }, - { AsusLedId.KEY_D, LedId.Keyboard_D }, - { AsusLedId.KEY_F, LedId.Keyboard_F }, - { AsusLedId.KEY_G, LedId.Keyboard_G }, - { AsusLedId.KEY_H, LedId.Keyboard_H }, - { AsusLedId.KEY_J, LedId.Keyboard_J }, - { AsusLedId.KEY_K, LedId.Keyboard_K }, - { AsusLedId.KEY_L, LedId.Keyboard_L }, - { AsusLedId.KEY_SEMICOLON,LedId.Keyboard_SemicolonAndColon }, - { AsusLedId.KEY_APOSTROPHE, LedId.Keyboard_ApostropheAndDoubleQuote }, - { AsusLedId.KEY_GRAVE, LedId.Keyboard_GraveAccentAndTilde }, - { AsusLedId.KEY_LSHIFT, LedId.Keyboard_LeftShift }, - { AsusLedId.KEY_BACKSLASH, LedId.Keyboard_Backslash }, - { AsusLedId.KEY_Z, LedId.Keyboard_Z }, - { AsusLedId.KEY_X, LedId.Keyboard_X }, - { AsusLedId.KEY_C, LedId.Keyboard_C }, - { AsusLedId.KEY_V, LedId.Keyboard_V }, - { AsusLedId.KEY_B, LedId.Keyboard_B }, - { AsusLedId.KEY_N, LedId.Keyboard_N }, - { AsusLedId.KEY_M, LedId.Keyboard_M }, - { AsusLedId.KEY_COMMA, LedId.Keyboard_CommaAndLessThan }, - { AsusLedId.KEY_PERIOD, LedId.Keyboard_PeriodAndBiggerThan }, - { AsusLedId.KEY_SLASH, LedId.Keyboard_SlashAndQuestionMark }, - { AsusLedId.KEY_RSHIFT, LedId.Keyboard_RightShift }, - { AsusLedId.KEY_LCONTROL, LedId.Keyboard_LeftCtrl }, - { AsusLedId.KEY_LWIN, LedId.Keyboard_LeftGui }, - { AsusLedId.KEY_LMENU, LedId.Keyboard_LeftAlt }, - { AsusLedId.KEY_SPACE, LedId.Keyboard_Space }, - { AsusLedId.KEY_RMENU, LedId.Keyboard_RightAlt }, - { AsusLedId.KEY_RWIN, LedId.Keyboard_RightGui }, - { AsusLedId.KEY_APPS, LedId.Keyboard_Application }, - { AsusLedId.KEY_RCONTROL, LedId.Keyboard_RightCtrl }, - { AsusLedId.KEY_SYSRQ, LedId.Keyboard_PrintScreen }, - { AsusLedId.KEY_SCROLL, LedId.Keyboard_ScrollLock }, - { AsusLedId.KEY_PAUSE, LedId.Keyboard_PauseBreak }, - { AsusLedId.KEY_INSERT, LedId.Keyboard_Insert }, - { AsusLedId.KEY_HOME, LedId.Keyboard_Home }, - { AsusLedId.KEY_PRIOR, LedId.Keyboard_PageUp }, - { AsusLedId.KEY_DELETE, LedId.Keyboard_Delete }, - { AsusLedId.KEY_END, LedId.Keyboard_End }, - { AsusLedId.KEY_NEXT, LedId.Keyboard_PageDown }, - { AsusLedId.KEY_UP, LedId.Keyboard_ArrowUp }, - { AsusLedId.KEY_LEFT, LedId.Keyboard_ArrowLeft }, - { AsusLedId.KEY_DOWN, LedId.Keyboard_ArrowDown }, - { AsusLedId.KEY_RIGHT, LedId.Keyboard_ArrowRight }, - { AsusLedId.KEY_NUMLOCK, LedId.Keyboard_NumLock }, - { AsusLedId.KEY_DIVIDE, LedId.Keyboard_NumSlash }, - { AsusLedId.KEY_MULTIPLY, LedId.Keyboard_NumAsterisk }, - { AsusLedId.KEY_SUBTRACT, LedId.Keyboard_NumMinus }, - { AsusLedId.KEY_NUMPAD7, LedId.Keyboard_Num7 }, - { AsusLedId.KEY_NUMPAD8, LedId.Keyboard_Num8 }, - { AsusLedId.KEY_NUMPAD9, LedId.Keyboard_Num9 }, - { AsusLedId.KEY_DECIMAL, LedId.Keyboard_NumPeriodAndDelete }, - { AsusLedId.KEY_ADD ,LedId.Keyboard_NumPlus }, - { AsusLedId.KEY_NUMPAD4, LedId.Keyboard_Num4 }, - { AsusLedId.KEY_NUMPAD5, LedId.Keyboard_Num5 }, - { AsusLedId.KEY_NUMPAD6, LedId.Keyboard_Num6 }, - { AsusLedId.KEY_NUMPAD1, LedId.Keyboard_Num1 }, - { AsusLedId.KEY_NUMPAD2, LedId.Keyboard_Num2 }, - { AsusLedId.KEY_NUMPAD3, LedId.Keyboard_Num3 }, - { AsusLedId.KEY_NUMPAD0, LedId.Keyboard_Num0 }, - { AsusLedId.KEY_NUMPADENTER, LedId.Keyboard_NumEnter }, - { AsusLedId.KEY_NUMPADCOMMA, LedId.Keyboard_NumComma }, - { AsusLedId.KEY_F13, LedId.Keyboard_Custom3 }, - { AsusLedId.KEY_F14, LedId.Keyboard_Custom4 }, - { AsusLedId.KEY_F15, LedId.Keyboard_Custom5 }, - { AsusLedId.KEY_KANA, LedId.Keyboard_Custom6 }, - { AsusLedId.KEY_ABNT_C1, LedId.Keyboard_Custom7 }, - { AsusLedId.KEY_CONVERT, LedId.Keyboard_Custom8 }, - { AsusLedId.KEY_NOCONVERT, LedId.Keyboard_Custom9 }, - { AsusLedId.KEY_YEN, LedId.Keyboard_Custom10 }, - { AsusLedId.KEY_ABNT_C2, LedId.Keyboard_Custom11 }, - { AsusLedId.KEY_NUMPADEQUALS, LedId.Keyboard_Custom12 }, - { AsusLedId.KEY_CIRCUMFLEX, LedId.Keyboard_Custom13 }, - { AsusLedId.KEY_AT, LedId.Keyboard_Custom14 }, - { AsusLedId.KEY_COLON, LedId.Keyboard_Custom15 }, - { AsusLedId.KEY_UNDERLINE, LedId.Keyboard_Custom16 }, - { AsusLedId.KEY_KANJI, LedId.Keyboard_Custom17 }, - { AsusLedId.KEY_STOP, LedId.Keyboard_Custom18 }, - { AsusLedId.KEY_AX, LedId.Keyboard_Custom19 }, - { AsusLedId.KEY_UNLABELED, LedId.Keyboard_Custom20 }, - { AsusLedId.KEY_NEXTTRACK, LedId.Keyboard_Custom21 }, - { AsusLedId.KEY_CALCULATOR, LedId.Keyboard_Custom22 }, - { AsusLedId.KEY_POWER, LedId.Keyboard_Custom23 }, - { AsusLedId.KEY_SLEEP, LedId.Keyboard_Custom24 }, - { AsusLedId.KEY_WAKE, LedId.Keyboard_Custom25 }, - { AsusLedId.KEY_WEBSEARCH, LedId.Keyboard_Custom26 }, - { AsusLedId.KEY_WEBFAVORITES, LedId.Keyboard_Custom27 }, - { AsusLedId.KEY_WEBREFRESH, LedId.Keyboard_Custom28 }, - { AsusLedId.KEY_WEBSTOP, LedId.Keyboard_Custom29 }, - { AsusLedId.KEY_WEBFORWARD, LedId.Keyboard_Custom30 }, - { AsusLedId.KEY_WEBHOME, LedId.Keyboard_Custom31 }, - { AsusLedId.KEY_WEBBACK, LedId.Keyboard_Custom32 }, - { AsusLedId.KEY_MYCOMPUTER, LedId.Keyboard_Custom33 }, - { AsusLedId.KEY_MAIL, LedId.Keyboard_Custom34 }, - { AsusLedId.KEY_MEDIASELECT, LedId.Keyboard_Custom35 }, - { AsusLedId.KEY_FN, LedId.Keyboard_Function }, - { AsusLedId.KEY_MUTE, LedId.Keyboard_MediaMute }, - { AsusLedId.KEY_PLAYPAUSE, LedId.Keyboard_MediaPlay }, - { AsusLedId.KEY_MEDIASTOP, LedId.Keyboard_MediaStop }, - { AsusLedId.KEY_VOLUMEDOWN, LedId.Keyboard_MediaVolumeDown }, - { AsusLedId.KEY_VOLUMEUP, LedId.Keyboard_MediaVolumeUp }, - }; + /// + /// A LED mapping containing ASUS keyboard LED IDs + /// + public static readonly LedMapping KeyboardMapping = + new() + { + {LedId.Keyboard_Escape, AsusLedId.KEY_ESCAPE}, + {LedId.Keyboard_F1, AsusLedId.KEY_F1}, + {LedId.Keyboard_F2, AsusLedId.KEY_F2}, + {LedId.Keyboard_F3, AsusLedId.KEY_F3}, + {LedId.Keyboard_F4, AsusLedId.KEY_F4}, + {LedId.Keyboard_F5, AsusLedId.KEY_F5}, + {LedId.Keyboard_F6, AsusLedId.KEY_F6}, + {LedId.Keyboard_F7, AsusLedId.KEY_F7}, + {LedId.Keyboard_F8, AsusLedId.KEY_F8}, + {LedId.Keyboard_F9, AsusLedId.KEY_F9}, + {LedId.Keyboard_F10, AsusLedId.KEY_F10}, + {LedId.Keyboard_F11, AsusLedId.KEY_F11}, + {LedId.Keyboard_F12, AsusLedId.KEY_F12}, + {LedId.Keyboard_1, AsusLedId.KEY_1}, + {LedId.Keyboard_2, AsusLedId.KEY_2}, + {LedId.Keyboard_3, AsusLedId.KEY_3}, + {LedId.Keyboard_4, AsusLedId.KEY_4}, + {LedId.Keyboard_5, AsusLedId.KEY_5}, + {LedId.Keyboard_6, AsusLedId.KEY_6}, + {LedId.Keyboard_7, AsusLedId.KEY_7}, + {LedId.Keyboard_8, AsusLedId.KEY_8}, + {LedId.Keyboard_9, AsusLedId.KEY_9}, + {LedId.Keyboard_0, AsusLedId.KEY_0}, + {LedId.Keyboard_MinusAndUnderscore, AsusLedId.KEY_MINUS}, + {LedId.Keyboard_EqualsAndPlus, AsusLedId.KEY_EQUALS}, + {LedId.Keyboard_Backspace, AsusLedId.KEY_BACK}, + {LedId.Keyboard_Tab, AsusLedId.KEY_TAB}, + {LedId.Keyboard_Q, AsusLedId.KEY_Q}, + {LedId.Keyboard_W, AsusLedId.KEY_W}, + {LedId.Keyboard_E, AsusLedId.KEY_E}, + {LedId.Keyboard_R, AsusLedId.KEY_R}, + {LedId.Keyboard_T, AsusLedId.KEY_T}, + {LedId.Keyboard_Y, AsusLedId.KEY_Y}, + {LedId.Keyboard_U, AsusLedId.KEY_U}, + {LedId.Keyboard_I, AsusLedId.KEY_I}, + {LedId.Keyboard_O, AsusLedId.KEY_O}, + {LedId.Keyboard_P, AsusLedId.KEY_P}, + {LedId.Keyboard_BracketLeft, AsusLedId.KEY_LBRACKET}, + {LedId.Keyboard_BracketRight, AsusLedId.KEY_RBRACKET}, + {LedId.Keyboard_Enter, AsusLedId.KEY_RETURN}, + {LedId.Keyboard_CapsLock, AsusLedId.KEY_CAPITAL}, + {LedId.Keyboard_A, AsusLedId.KEY_A}, + {LedId.Keyboard_S, AsusLedId.KEY_S}, + {LedId.Keyboard_D, AsusLedId.KEY_D}, + {LedId.Keyboard_F, AsusLedId.KEY_F}, + {LedId.Keyboard_G, AsusLedId.KEY_G}, + {LedId.Keyboard_H, AsusLedId.KEY_H}, + {LedId.Keyboard_J, AsusLedId.KEY_J}, + {LedId.Keyboard_K, AsusLedId.KEY_K}, + {LedId.Keyboard_L, AsusLedId.KEY_L}, + {LedId.Keyboard_SemicolonAndColon, AsusLedId.KEY_SEMICOLON}, + {LedId.Keyboard_ApostropheAndDoubleQuote, AsusLedId.KEY_APOSTROPHE}, + {LedId.Keyboard_GraveAccentAndTilde, AsusLedId.KEY_GRAVE}, + {LedId.Keyboard_LeftShift, AsusLedId.KEY_LSHIFT}, + {LedId.Keyboard_Backslash, AsusLedId.KEY_BACKSLASH}, + {LedId.Keyboard_Z, AsusLedId.KEY_Z}, + {LedId.Keyboard_X, AsusLedId.KEY_X}, + {LedId.Keyboard_C, AsusLedId.KEY_C}, + {LedId.Keyboard_V, AsusLedId.KEY_V}, + {LedId.Keyboard_B, AsusLedId.KEY_B}, + {LedId.Keyboard_N, AsusLedId.KEY_N}, + {LedId.Keyboard_M, AsusLedId.KEY_M}, + {LedId.Keyboard_CommaAndLessThan, AsusLedId.KEY_COMMA}, + {LedId.Keyboard_PeriodAndBiggerThan, AsusLedId.KEY_PERIOD}, + {LedId.Keyboard_SlashAndQuestionMark, AsusLedId.KEY_SLASH}, + {LedId.Keyboard_RightShift, AsusLedId.KEY_RSHIFT}, + {LedId.Keyboard_LeftCtrl, AsusLedId.KEY_LCONTROL}, + {LedId.Keyboard_LeftGui, AsusLedId.KEY_LWIN}, + {LedId.Keyboard_LeftAlt, AsusLedId.KEY_LMENU}, + {LedId.Keyboard_Space, AsusLedId.KEY_SPACE}, + {LedId.Keyboard_RightAlt, AsusLedId.KEY_RMENU}, + {LedId.Keyboard_RightGui, AsusLedId.KEY_RWIN}, + {LedId.Keyboard_Application, AsusLedId.KEY_APPS}, + {LedId.Keyboard_RightCtrl, AsusLedId.KEY_RCONTROL}, + {LedId.Keyboard_PrintScreen, AsusLedId.KEY_SYSRQ}, + {LedId.Keyboard_ScrollLock, AsusLedId.KEY_SCROLL}, + {LedId.Keyboard_PauseBreak, AsusLedId.KEY_PAUSE}, + {LedId.Keyboard_Insert, AsusLedId.KEY_INSERT}, + {LedId.Keyboard_Home, AsusLedId.KEY_HOME}, + {LedId.Keyboard_PageUp, AsusLedId.KEY_PRIOR}, + {LedId.Keyboard_Delete, AsusLedId.KEY_DELETE}, + {LedId.Keyboard_End, AsusLedId.KEY_END}, + {LedId.Keyboard_PageDown, AsusLedId.KEY_NEXT}, + {LedId.Keyboard_ArrowUp, AsusLedId.KEY_UP}, + {LedId.Keyboard_ArrowLeft, AsusLedId.KEY_LEFT}, + {LedId.Keyboard_ArrowDown, AsusLedId.KEY_DOWN}, + {LedId.Keyboard_ArrowRight, AsusLedId.KEY_RIGHT}, + {LedId.Keyboard_NumLock, AsusLedId.KEY_NUMLOCK}, + {LedId.Keyboard_NumSlash, AsusLedId.KEY_DIVIDE}, + {LedId.Keyboard_NumAsterisk, AsusLedId.KEY_MULTIPLY}, + {LedId.Keyboard_NumMinus, AsusLedId.KEY_SUBTRACT}, + {LedId.Keyboard_Num7, AsusLedId.KEY_NUMPAD7}, + {LedId.Keyboard_Num8, AsusLedId.KEY_NUMPAD8}, + {LedId.Keyboard_Num9, AsusLedId.KEY_NUMPAD9}, + {LedId.Keyboard_NumPeriodAndDelete, AsusLedId.KEY_DECIMAL}, + {LedId.Keyboard_NumPlus, AsusLedId.KEY_ADD}, + {LedId.Keyboard_Num4, AsusLedId.KEY_NUMPAD4}, + {LedId.Keyboard_Num5, AsusLedId.KEY_NUMPAD5}, + {LedId.Keyboard_Num6, AsusLedId.KEY_NUMPAD6}, + {LedId.Keyboard_Num1, AsusLedId.KEY_NUMPAD1}, + {LedId.Keyboard_Num2, AsusLedId.KEY_NUMPAD2}, + {LedId.Keyboard_Num3, AsusLedId.KEY_NUMPAD3}, + {LedId.Keyboard_Num0, AsusLedId.KEY_NUMPAD0}, + {LedId.Keyboard_NumEnter, AsusLedId.KEY_NUMPADENTER}, + {LedId.Keyboard_NonUsBackslash, AsusLedId.UNDOCUMENTED_1}, + {LedId.Keyboard_NonUsTilde, AsusLedId.UNDOCUMENTED_2}, + {LedId.Keyboard_NumComma, AsusLedId.KEY_NUMPADCOMMA}, + {LedId.Logo, AsusLedId.UNDOCUMENTED_3}, + {LedId.Keyboard_Function, AsusLedId.KEY_FN}, + {LedId.Keyboard_MediaMute, AsusLedId.KEY_MUTE}, + {LedId.Keyboard_MediaPlay, AsusLedId.KEY_PLAYPAUSE}, + {LedId.Keyboard_MediaStop, AsusLedId.KEY_MEDIASTOP}, + {LedId.Keyboard_MediaVolumeDown, AsusLedId.KEY_VOLUMEDOWN}, + {LedId.Keyboard_MediaVolumeUp, AsusLedId.KEY_VOLUMEUP}, + {LedId.Keyboard_Custom1, AsusLedId.KEY_F13}, + {LedId.Keyboard_Custom2, AsusLedId.KEY_F14}, + {LedId.Keyboard_Custom3, AsusLedId.KEY_F15}, + {LedId.Keyboard_Custom4, AsusLedId.KEY_KANA}, + {LedId.Keyboard_Custom5, AsusLedId.KEY_ABNT_C1}, + {LedId.Keyboard_Custom6, AsusLedId.KEY_CONVERT}, + {LedId.Keyboard_Custom7, AsusLedId.KEY_NOCONVERT}, + {LedId.Keyboard_Custom8, AsusLedId.KEY_YEN}, + {LedId.Keyboard_Custom9, AsusLedId.KEY_ABNT_C2}, + {LedId.Keyboard_Custom10, AsusLedId.KEY_NUMPADEQUALS}, + {LedId.Keyboard_Custom11, AsusLedId.KEY_CIRCUMFLEX}, + {LedId.Keyboard_Custom12, AsusLedId.KEY_AT}, + {LedId.Keyboard_Custom13, AsusLedId.KEY_COLON}, + {LedId.Keyboard_Custom14, AsusLedId.KEY_UNDERLINE}, + {LedId.Keyboard_Custom15, AsusLedId.KEY_KANJI}, + {LedId.Keyboard_Custom16, AsusLedId.KEY_STOP}, + {LedId.Keyboard_Custom17, AsusLedId.KEY_AX}, + {LedId.Keyboard_Custom18, AsusLedId.KEY_UNLABELED}, + {LedId.Keyboard_Custom19, AsusLedId.KEY_NEXTTRACK}, + {LedId.Keyboard_Custom20, AsusLedId.KEY_CALCULATOR}, + {LedId.Keyboard_Custom21, AsusLedId.KEY_POWER}, + {LedId.Keyboard_Custom22, AsusLedId.KEY_SLEEP}, + {LedId.Keyboard_Custom23, AsusLedId.KEY_WAKE}, + {LedId.Keyboard_Custom24, AsusLedId.KEY_WEBSEARCH}, + {LedId.Keyboard_Custom25, AsusLedId.KEY_WEBFAVORITES}, + {LedId.Keyboard_Custom26, AsusLedId.KEY_WEBREFRESH}, + {LedId.Keyboard_Custom27, AsusLedId.KEY_WEBSTOP}, + {LedId.Keyboard_Custom28, AsusLedId.KEY_WEBFORWARD}, + {LedId.Keyboard_Custom29, AsusLedId.KEY_WEBHOME}, + {LedId.Keyboard_Custom30, AsusLedId.KEY_WEBBACK}, + {LedId.Keyboard_Custom31, AsusLedId.KEY_MYCOMPUTER}, + {LedId.Keyboard_Custom32, AsusLedId.KEY_MAIL}, + {LedId.Keyboard_Custom33, AsusLedId.KEY_MEDIASELECT}, + {LedId.Keyboard_Custom34, AsusLedId.UNDOCUMENTED_4}, + {LedId.Keyboard_Custom35, AsusLedId.UNDOCUMENTED_5}, + {LedId.Keyboard_Custom36, AsusLedId.UNDOCUMENTED_6} + }; + + /// + /// A LED mapping containing extra lights for the ROG Zephyrus Duo 15 + /// + /// ASUS notebooks have extra lights under wide keys like space and backspace, these do not appear as keys on the device. + /// Instead they only appear in the Lights enumerable, this mapping maps LED IDs to the index of these lights. + /// + /// You may add more of these by further populating . + /// + public static readonly LedMapping ROGZephyrusDuo15 = + new() + { + {LedId.Keyboard_Custom50, 39}, // Mapping starts at Custom50 to avoid possible conflicts with KeyboardMapping above + {LedId.Keyboard_Custom51, 40}, + {LedId.Keyboard_Custom52, 55}, + {LedId.Keyboard_Custom53, 57}, + {LedId.Keyboard_Custom54, 97}, + {LedId.Keyboard_Custom55, 99}, + {LedId.Keyboard_Custom56, 118}, + {LedId.Keyboard_Custom57, 120}, + {LedId.Keyboard_Custom58, 130}, + {LedId.Keyboard_Custom59, 131}, + {LedId.Keyboard_Custom60, 133}, + }; } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs index b4af3a4..f2a02c9 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDevice.cs @@ -1,10 +1,21 @@ using System.Collections.Generic; -using System.Threading; +using System.Linq; +using System.Text.RegularExpressions; using AuraServiceLib; using RGB.NET.Core; namespace RGB.NET.Devices.Asus { + /// + /// Represents custom LED data for ASUS keyboard LEDs. + /// + public record AsusKeyboardLedCustomData(AsusLedType LedType, int Id); + + /// + /// Represents a record containing regex that matches to an ASUS device model and a LED mapping mapping to Light indexes. + /// + public record AsusKeyboardExtraMapping(Regex Regex, LedMapping LedMapping); + /// /// /// Represents a Asus keyboard. @@ -13,11 +24,22 @@ namespace RGB.NET.Devices.Asus { #region Properties & Fields + private readonly LedMapping? _ledMapping; private Dictionary _ledAsusLed = new(); private Dictionary _ledAsusLights = new(); IKeyboardDeviceInfo IKeyboard.DeviceInfo => DeviceInfo; + /// + /// Gets or sets a list of extra LED mappings to apply to modes that match the provided regex + /// Note: These LED mappings should be based on light indexes + /// + public static List ExtraLedMappings = + new() + { + new AsusKeyboardExtraMapping(new Regex("(ROG Zephyrus Duo 15).*?"), LedMappings.ROGZephyrusDuo15) + }; + #endregion #region Constructors @@ -27,9 +49,11 @@ namespace RGB.NET.Devices.Asus /// Initializes a new instance of the class. /// /// The specific information provided by Asus for the keyboard. - internal AsusKeyboardRGBDevice(AsusKeyboardRGBDeviceInfo info, IDeviceUpdateTrigger updateTrigger) + internal AsusKeyboardRGBDevice(AsusKeyboardRGBDeviceInfo info, LedMapping? ledMapping, IDeviceUpdateTrigger updateTrigger) : base(info, updateTrigger) { + this._ledMapping = ledMapping; + InitializeLayout(); } @@ -44,41 +68,24 @@ namespace RGB.NET.Devices.Asus int pos = 0; int unknownLed = (int)LedId.Unknown1; - // A device can have more lights than keys, a space bar with 4 lights per example but only the middle light is represented as a key - // This means we want all lights but keys contain more information (a LED ID) so first pick up all keys and 'tag' them by giving them a color of 0x000001 - - // Clear tags to make sure no device is already at 0x000001 - ClearTags(); foreach (IAuraRgbKey key in ((IAuraSyncKeyboard)DeviceInfo.Device).Keys) { - if (AsusKeyboardLedMapping.MAPPING.TryGetValue((AsusLedId)key.Code, out LedId ledId)) + if ((_ledMapping != null) && _ledMapping.TryGetValue((AsusLedId)key.Code, out LedId ledId)) AddAsusLed((AsusLedId)key.Code, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); else { AddAsusLed((AsusLedId)key.Code, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); unknownLed++; } - - TagAsusLed(key); } - // Give the ASUS SDK some time to catch up - Thread.Sleep(100); - - // With keys iterated, add any light that was not tagged, these are lights that aren't represented by keys - // Because there's no way to tell which light is which, they're all added as Unknown LEDs - for (int index = 0; index < ((IAuraSyncKeyboard)DeviceInfo.Device).Lights.Count; index++) + // Add extra LED mapping if required + AsusKeyboardExtraMapping? extraMapping = ExtraLedMappings.FirstOrDefault(m => m.Regex.IsMatch(this.DeviceInfo.Model)); + if (extraMapping != null) { - IAuraRgbLight light = ((IAuraSyncKeyboard)DeviceInfo.Device).Lights[index]; - if (IsAsusLedTagged(light)) - continue; - - AddAsusLed(index, (LedId)unknownLed, new Point(pos++ * 19, 0), new Size(19, 19)); - unknownLed++; + foreach ((LedId ledId, int lightIndex) in extraMapping.LedMapping) + AddAsusLed(lightIndex, ledId, new Point(pos++ * 19, 0), new Size(19, 19)); } - - // Clear tags when done, the info is no longer relevant - ClearTags(); } else { @@ -92,13 +99,12 @@ namespace RGB.NET.Devices.Asus protected override object? GetLedCustomData(LedId ledId) { if (this._ledAsusLed.TryGetValue(ledId, out AsusLedId asusLedId)) - return (true, (int)asusLedId); + return new AsusKeyboardLedCustomData(AsusLedType.Key, (int)asusLedId); if (this._ledAsusLights.TryGetValue(ledId, out int lightIndex)) - return (false, lightIndex); + return new AsusKeyboardLedCustomData(AsusLedType.Light, lightIndex); return null; } - /// /// Add an ASUS LED by its LED ID /// @@ -113,7 +119,7 @@ namespace RGB.NET.Devices.Asus } /// - /// Add an asus LED by its light index + /// Add an ASUS LED by its light index /// private void AddAsusLed(int index, LedId ledId, Point position, Size size) { @@ -121,34 +127,6 @@ namespace RGB.NET.Devices.Asus AddLed(ledId, position, size); } - /// - /// Clears the tags off all keys by setting their color to 0x000000 - /// - private void ClearTags() - { - foreach (IAuraRgbLight light in ((IAuraSyncKeyboard)DeviceInfo.Device).Lights) - light.Color = 0x000000; - } - - /// - /// Tags a LED by its key by setting its color to 0x000001 - /// - /// - private void TagAsusLed(IAuraRgbKey key) - { - key.Color = 0x000001; - } - - /// - /// Determines whether a LED is tagged by its light - /// - /// - /// - private bool IsAsusLedTagged(IAuraRgbLight light) - { - return light.Color == 0x000001; - } - #endregion } } diff --git a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDeviceInfo.cs b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDeviceInfo.cs index a74ab1b..0301934 100644 --- a/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDeviceInfo.cs +++ b/RGB.NET.Devices.Asus/Keyboard/AsusKeyboardRGBDeviceInfo.cs @@ -1,4 +1,5 @@ -using AuraServiceLib; +using System.Collections.Generic; +using AuraServiceLib; using RGB.NET.Core; namespace RGB.NET.Devices.Asus @@ -10,6 +11,12 @@ namespace RGB.NET.Devices.Asus { #region Properties & Fields + /// + /// The ASUS SDK returns useless names for notebook keyboards, possibly for others as well. + /// Keep a list of those and rely on to get the real model + /// + private static List GenericDeviceNames = new() {"NotebookKeyboard"}; + /// public KeyboardLayoutType Layout => KeyboardLayoutType.Unknown; @@ -23,9 +30,18 @@ namespace RGB.NET.Devices.Asus /// /// The backing this RGB.NET device. internal AsusKeyboardRGBDeviceInfo(IAuraSyncDevice device) - : base(RGBDeviceType.Keyboard, device, device.Name) + : base(RGBDeviceType.Keyboard, device, GetKeyboardModel(device.Name)) { } #endregion + + #region Methods + + private static string? GetKeyboardModel(string deviceName) + { + return GenericDeviceNames.Contains(deviceName) ? WMIHelper.GetSystemModelInfo() : deviceName; + } + + #endregion } }