From 66889929632df94cd8155dcb48dd3954bfa8002b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Jaussaud?= Date: Fri, 1 Oct 2021 16:33:44 +0800 Subject: [PATCH 1/4] Add XPG Prime support --- .../Project-Aurora/Devices/XPG/XPGDevice.cs | 166 ++++++++++++++++++ .../Project-Aurora/Project-Aurora.csproj | 3 + .../Project-Aurora/Settings/Configuration.cs | 4 + .../Settings/KeyboardLayoutManager.cs | 2 + .../xpg_summoner_right_features.json | 20 +++ .../kb_layouts/xpg_summoner.json | 68 +++++++ .../Project-Aurora/libxpgp_aurora.dll | Bin 0 -> 52456 bytes 7 files changed, 263 insertions(+) create mode 100644 Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs create mode 100644 Project-Aurora/Project-Aurora/kb_layouts/Extra Features/xpg_summoner_right_features.json create mode 100644 Project-Aurora/Project-Aurora/kb_layouts/xpg_summoner.json create mode 100644 Project-Aurora/Project-Aurora/libxpgp_aurora.dll diff --git a/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs b/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs new file mode 100644 index 000000000..b47b2a113 --- /dev/null +++ b/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs @@ -0,0 +1,166 @@ +using Aurora; +using Aurora.Devices; +using Aurora.Devices.ScriptedDevice; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +using System.Runtime.InteropServices; // DllImport +using System.Diagnostics; // Stopwatch +using System.ComponentModel; // DoWorkEventArgs + +namespace Aurora.Devices.XPG +{ + + class XPGDevice : IDevice + { + // XPG device is implemented as a script for ScriptedDevice, but we + // also want the script to call Shutdown() when UpdateDevice() fails. + // This lets us easily handle the peripheral being disconnected and + // reconnected. However, we can't override the interface method + // from ScriptedDevice, use aggregation instead. + private Devices.ScriptedDevice.ScriptedDevice device; + + public XPGDevice() + { + device = new Devices.ScriptedDevice.ScriptedDevice(new XPGDeviceScript()); + } + + public Settings.VariableRegistry RegisteredVariables => device.RegisteredVariables; + public string DeviceName => "XPG"; + public string DeviceDetails => device.DeviceDetails; + public string DeviceUpdatePerformance => device.DeviceUpdatePerformance; + public bool Initialize() => device.Initialize(); + public void Shutdown() => device.Shutdown(); + public void Reset() => device.Reset(); + public bool Reconnect() => device.Reconnect(); + public bool IsInitialized => device.IsInitialized; + public bool IsConnected() => device.IsConnected(); + public bool IsKeyboardConnected() => device.IsKeyboardConnected(); + public bool IsPeripheralConnected() => device.IsPeripheralConnected(); + + public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) + { + if (IsInitialized) + { + bool success = device.UpdateDevice(keyColors, e, forced); + if (!success) { + device.Shutdown(); + } + return success; + } + return false; + } + public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArgs e, bool forced = false) + { + if (IsInitialized) + { + bool success = device.UpdateDevice(colorComposition, e, forced); + if (!success) { + device.Shutdown(); + } + return success; + } + return false; + } + + } + + + internal class XPGDeviceScript + { + public string devicename = "XPG script"; + public bool enabled = true; + + private Stopwatch updateStopwatch = new Stopwatch(); + + + [DllImport("libxpgp_aurora", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Initialize")] + private static extern int cInitialize(); + [DllImport("libxpgp_aurora", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Reset")] + private static extern void cReset(); + [DllImport("libxpgp_aurora", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Shutdown")] + private static extern void cShutdown(); + [DllImport("libxpgp_aurora", CallingConvention = CallingConvention.Cdecl, EntryPoint = "UpdateDevice")] + private static extern int cUpdateDevice(byte[] array, int bytesize); + + + public bool Initialize() + { + int error = cInitialize(); + if (error > 0) // a proper error occured + { + throw new Exception("Error initializing XPGDeviceScript"); + } + return error == 0; // true if we have a device + } + + public void Reset() + { + updateStopwatch.Reset(); + cReset(); + } + + public void Shutdown() + { + updateStopwatch.Reset(); + cShutdown(); + } + + private const int colorcount = 108; // highest value we use is FN_Key (107) + private const int bytesize = 4 * colorcount; + private byte[] currentColors = new byte[bytesize]; + public bool UpdateDevice(Dictionary keyColors, bool forced) + { + byte[] newColors = new byte[bytesize]; // zero-init + if (keyColors.ContainsKey(DeviceKeys.Peripheral)) + { + Color color = keyColors[DeviceKeys.Peripheral]; + for (int k = 0; k < colorcount; k++) + { + newColors[4 * k + 0] = color.R; + newColors[4 * k + 1] = color.G; + newColors[4 * k + 2] = color.B; + newColors[4 * k + 3] = color.A; + } + } + foreach (KeyValuePair kvp in keyColors) + { + int k = (int)kvp.Key; + if (0 <= k && k < colorcount) + { + Color color = kvp.Value; + newColors[4 * k + 0] = color.R; + newColors[4 * k + 1] = color.G; + newColors[4 * k + 2] = color.B; + newColors[4 * k + 3] = color.A; + } + } + // Stopwatch is stopped. This is the first update after connecting. + // 'this.currentColors' doesn't hold any previous state. + if (!updateStopwatch.IsRunning) + { + forced = true; + } + // The device resets itself after 5s. Force an update before then. + if (updateStopwatch.ElapsedMilliseconds >= 4703) + { + forced = true; + } + // Do the thing! + if (forced || !Enumerable.SequenceEqual(this.currentColors, newColors)) + { + int error = cUpdateDevice(newColors, bytesize); + if (error != 0) // device has probably been physically disconnected + { + return false; + } + updateStopwatch.Restart(); + this.currentColors = newColors; + } + return true; + } + } + +} diff --git a/Project-Aurora/Project-Aurora/Project-Aurora.csproj b/Project-Aurora/Project-Aurora/Project-Aurora.csproj index 5e686d109..3385ccf2b 100644 --- a/Project-Aurora/Project-Aurora/Project-Aurora.csproj +++ b/Project-Aurora/Project-Aurora/Project-Aurora.csproj @@ -138,6 +138,9 @@ PreserveNewest + + PreserveNewest + diff --git a/Project-Aurora/Project-Aurora/Settings/Configuration.cs b/Project-Aurora/Project-Aurora/Settings/Configuration.cs index 9c87116e2..148ff739b 100755 --- a/Project-Aurora/Project-Aurora/Settings/Configuration.cs +++ b/Project-Aurora/Project-Aurora/Settings/Configuration.cs @@ -308,6 +308,10 @@ public enum PreferredKeyboard [Description("HyperX Alloy Elite RGB")] HyperX_Alloy_Elite_RGB = 1400, + //XPG range is 1500-1599 + [Description("XPG Mage/Summoner")] + XPG_Summoner = 1500 + } public enum PreferredKeyboardLocalization diff --git a/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs b/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs index 80a9357d8..940924963 100755 --- a/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs +++ b/Project-Aurora/Project-Aurora/Settings/KeyboardLayoutManager.cs @@ -796,6 +796,8 @@ public void LoadBrand(PreferredKeyboard keyboard_preference = PreferredKeyboard. layoutConfigPath = Path.Combine(layoutsPath, "omen_four_zone.json"); else if (keyboard_preference == PreferredKeyboard.HyperX_Alloy_Elite_RGB) layoutConfigPath = Path.Combine(layoutsPath, "hyperx_alloy_elite_rgb.json"); + else if (keyboard_preference == PreferredKeyboard.XPG_Summoner) + layoutConfigPath = Path.Combine(layoutsPath, "xpg_summoner.json"); else { diff --git a/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/xpg_summoner_right_features.json b/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/xpg_summoner_right_features.json new file mode 100644 index 000000000..e48149054 --- /dev/null +++ b/Project-Aurora/Project-Aurora/kb_layouts/Extra Features/xpg_summoner_right_features.json @@ -0,0 +1,20 @@ +{ + "group_tag": "keyboard", + "origin_region": 2, + "grouped_keys": [ + { + "visualName": "\\", + "tag": 51, + "margin_left": -320, + "margin_top": 74, + "width": 47.0, + "height": 30.0, + "font_size": 9.0, + "enabled": true, + "absolute_location": true + } + ], + "key_conversion": { + 77: 51 + } +} \ No newline at end of file diff --git a/Project-Aurora/Project-Aurora/kb_layouts/xpg_summoner.json b/Project-Aurora/Project-Aurora/kb_layouts/xpg_summoner.json new file mode 100644 index 000000000..2b121c864 --- /dev/null +++ b/Project-Aurora/Project-Aurora/kb_layouts/xpg_summoner.json @@ -0,0 +1,68 @@ +{ + "keys_to_remove": [ + 51, 71, 77 + ], + "key_modifications": { + "50": { + "line_break": null, + "width": 30 + }, + "52": { + "line_break": null, + "margin_left": 67.0 + }, + "72": { + "visualName": null, + "tag": 72, + "line_break": null, + "margin_left": 7.0, + "margin_top": 0.0, + "width": 74.0, + "height": 30.0, + "font_size": 12.0, + "width_bits": 7, + "height_bits": 3, + "margin_left_bits": 0, + "margin_top_bits": 0, + "enabled": null + }, + "76": { + "visualName": null, + "tag": 76, + "line_break": null, + "margin_left": 0.0, + "margin_top": 0.0, + "width": 78.0, + "height": 30.0, + "font_size": 12.0, + "width_bits": 7, + "height_bits": 3, + "margin_left_bits": 0, + "margin_top_bits": 0, + "enabled": null + }, + "88": { + "tag": 88, + "line_break": null, + "width": 93 + }, + "99": { + "visualName": "FN", + "tag": 107, + "line_break": null, + "margin_left": null, + "margin_top": null, + "width": null, + "height": null, + "font_size": null, + "width_bits": null, + "height_bits": null, + "margin_left_bits": null, + "margin_top_bits": null, + "enabled": null + } + }, + "included_features": [ + "xpg_summoner_right_features.json" + ] +} diff --git a/Project-Aurora/Project-Aurora/libxpgp_aurora.dll b/Project-Aurora/Project-Aurora/libxpgp_aurora.dll new file mode 100644 index 0000000000000000000000000000000000000000..7070b2dd15844b1e1ce573c3f829a7ee8f8eff90 GIT binary patch literal 52456 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 Date: Fri, 12 Nov 2021 16:15:27 +0800 Subject: [PATCH 2/4] Updated XPG library libxpgp_aurora.dll --- .../Project-Aurora/libxpgp_aurora.dll | Bin 52456 -> 54640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Project-Aurora/Project-Aurora/libxpgp_aurora.dll b/Project-Aurora/Project-Aurora/libxpgp_aurora.dll index 7070b2dd15844b1e1ce573c3f829a7ee8f8eff90..1c32a7b3fcf912e336061e401509d508d46abf7b 100644 GIT binary patch delta 21826 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 delta 19105 zcmc(H30PCd`u9ml*hCYTC@M?PpeTyL6;zb4d4fSvaaRNv+>vTPx?F=MD90E@$5yM> zV(nFnYsCe(8aHsQ6s>z(Y;BuVZP8ka)|&4(=N#N_d%yp4@Be$g^EmmvGw(Yy@4Pef z&To~p$!@?RhKZIlOxAja$qhqXEnx}($yy2Hw>+qc?0tp_Ssv8bz2IAhiI6T2 zYSAdnI4Rc%k=lv)Q6glJHImlhd7z{SGZ0>SqM2lS*zAevMks2p2Sy=+4?-sSS<<3A zt()pV6=mK+cx&7`qUtTpsBoZQ)+z1=7Aes3|c@8+xIAeDw>-QfZ3@ zd=smXL~AM_`=o(h)uO;k@-<=%Y(uqukGQ)9dchbBtzb0?LkuS1dF#k9#9#=%N$bfx z#G=7dL$Zi$LM%;`w3E*f%R-Ena-7s4mM8McNPsNRt5A%cE=iDmCUM`%FwRHm#M?bE z7-YCTzjEG4^G_1i>c0}b6n_6G#2HR?5ln+MIOGx;;2zj)7FbpfbFEZiae{py5I>G- z>BQn5u4qQHxmatKCu{AvyONxA50n1Hkw@+w{om#ohP5(mzTH?qiE|vJ%{FkiT@_~e z)g7ddN2vP_l(Q_I%<_l}n+oA_cUn7Zt#3fY5ts&Dqg*amMj>lewc`t`--vSLY2>zt zD!FDH1biS+s7o0-eAp1yd{50$x*chDV;4uOK@6kk z9O2+UcF0ixBHRrcaio$2&#-3Kk{QMp>oV6$a@5axC8@;f*@>N5xjKUfra>Eh3R#Z9K-J2nU-&GQ5J^x1l{7 zQi;v0wTW-f{ClgZJ#5=FdB9RS><=};PhL+?)|Op_CbH%6MMz*2@z+@H0b+EdGQd(1 z?G)n*;vqbAi{m{l!;Nxq{~$BjLq2((ZM#yZqK^|&wE!LDY_c7=&GS5-So z#~|MBBueInma?`ujhf}+cR2>3lze;kVb~!O%?K3dp~yuuyXtYz9qQ zc%`mX2Bv{K6AS&~G$A0AtO=ABlrK$+0D+drX`(@dP=a-gd**Vn^G{L*N1w=0 z1jeC%sE2rwR*2yk;@IDsw^b5rj#^s`ekq#h%I?G3RQYf^tS!;uI2l7*XJ}{Gx|02^5*2NOKpjM$xy;1DZEj6 zdm0CjEA?BMGzMG!jc>v`R2J$K`(zERK7=(NmmI5->LM%H)to^#(e#5gHX4~HvQ~G# zKZLI1dyU!|y^>JZD+w4je5WMTbxJ~ArzD7-lK=EYr=&I=cOoOKZg{`wo03FDj-({H zaaZ@2s|QmLNbPf?u#^s9p5!}|{1T`$@eU>2o)`5~5tv4p{-he6{k%}tR{zW!w0*i# z2H9PzwI`@GX-^(Q4u!=;=aWsf4MHq;3!V!XdMIgxCGib0h!VT-o}@BJ1MUpcw+?KB9UjJhO|;< zD40nCbNWjeCsUpx++HR(fRYH^11t7Jj7|l2muk;3kmd4lq|k?-ePwcg8g*(heRRWh z!*oN%$9 zgAT4I4H39SMZs?P1Ot4w9r5^ZJC>Sqi{>Qd;$dwyDsLR32GE6k--O1C$+Hz&s zow!sdKZA(5*2QvV#-8Y_kCBCrAl9~$r!jO~s#WXYcJ{|%h+=*2N2yFu#-SOJ77bkv zjQz2eyHrz9mh)GPTSXw6=ya(D+EEbnNyG9*=K$Rr=*H;A>P)FRxKZTZLUZrrbBEI0 z`;hw}i^KykEOfVM3W4--^h%<=dy9rf>Ho$rd9q zV20-!xMK#o56E&%H_%x|o5MYUo%Nhd<8Wc$X0SpGUC44bGUB);{7A%FAVX`o2Qg(b zC0gTJLq}&N_$xJiU|Ne^k>40?2tQLNc_Ty2%G;%!m$yUS0(p!2txB6(P4Lzw1w?P07k~gETF#+B+cm_Hy z7)?Tl8N0Ez5i(t=5>h7Gvvk)*AKF!vX1VK*hl#+*b$pzb+toPCz)hqU!uYCx7$ao$ zA1)V7N^^SB3CCS`sfHe*-2;E&q!WfuiV>64PXD^3PGXYMdE;4qxahi;-2ISrZ~d9n z^9@qdx}S8Xp7hoHQ|g;Ve$Yfq%UBW;Tqup3MGgk{mHyg~{1I%E8Z*h_HWAYH{m98S z7U`aud~8|*v9v9eUW+G9L;6Tp$CF_p^Q77tb}a+6a6vBB`MsFW2^wknt6-mz-}GX7Y8Z7C}syQ(S^C zKf|5p(Psv0f-<}k`9Xs}AjDvsp&8*g5KHZfd7eeH*%Gu=E(w0bI*i}ks99?Rm#ROQ zRJ~Z~a}_WwN6@56bUavdLh|}Biu{r{+XqQh4@+ng_-v@W26M|`mH${sc7{F**sz;= z!!M)0hvQLLKA_tsT6}vXL$i`&9i~c5;Ww#AiiVa@?4o1NeU}UM6r`b^gIP%AC%)r+ zUw)C}{TR!gz+A9)E8K-C8plQZu;mOLf>|QoPHjw>Pt3t+ z{P6BF$Hq@D%Ma9cI1WU!)_N{gu9zAPBlDY5x@1PXRLMx^{gNX8N0dOl>oA^`!NvN} zSPH6Bx>Q=ovDW@d$M8P19(rQ92EST}JTf@e6GW-)?Af0hMm2ILQ4DMAhgBA9pG(E; zq&czbD)uWg@+-3ycYO)UBT}Z`dg1DeQA#VA&$qrsovMaZ#sVAsXFbc z^4J|)P%o{y5nr>uPWc1dUsc}E`8npjc<8{HQYth`VcC!54D*xv**`fq^Ad5iw2!va zcEr||rvI1HQvbTNelJSvA(TeG?%YZ0LUCQvrR%nn*991cq6-^T)F z^rEX%{wg#E3C2FGH3@nYZl%reU(Q1ki`}?2X$t>Kcjne4n6W39d2 zlz&HIF``qcr**0HLNSQ|z14&*m+O+A?y4w&&qq+y37&7zgg7Em1};Y&;Xr3cl%oiY zMlB5-BWNYodV1)d#Mg5l^UOGjI_k6obhbEtj)Vj~b{sbjh_foNbrDvJt8t3`3BDPu zf<$x+Gwpt1KLd0wqM6{xR|B2b!7F@murWXOQ7pPj?P62Kjm3S?8FqqfF)OKXRSA1Y zn_NGNVV++eur~RFF|WqcU*j(~y_Rs`wYc-OctadJU#=khwfNN6;-9=0zy4a>xHc@)dhOIw$=X}2_~1S6fwu8?_KnAsk#043Uiekf8ykOnpR+~zZa6?(WMp5TQ2`l zte{L@NGUM`^UA@+d@mxrGCur1w#s_$^8@2>q;T~Ak&bf=3M{uQSFT93&@J4HK8~}R za696^7u_3Pb2q6l!))rz7zbHnWs&`~+2PjdJ_ppu;F!?^{r}*L$I&%q63&yGA~W_N zEhE&XZgG*lvVTD?Et9Q5I;+Rhfdhqzwk<*>1BjcoO4ata9o7&Xy=22J< z^XsPnJ~*KRaQK+yy3!z^aHoeZ$1uT-hvUm`e0)eZxgiv8KXVl%*;DKK?hwWAZ5`WHEIu27A6k+sp^ zRV)!JzTWk3T3>~An3|{b?*xvD0;^sT!0z$6h1ZJ`IWHu5;|u+O>GKa!VCV~h1KubA z4$m>DD@p3rx0(9Ui_xyINa@OLjoKPRBvH-09}X8(Jllnjej!Fb5u&@qXn_!2CPpXo z(X>o4n$U%ApXv;M71qlE2Zm3AZFOKO_RkazPnqKdrjBzsG+^qjorF%Iyuktw*TD`? zq0Zlj2?}29%qw_BjP4Mkd&Q_th^`c)Gx%u095LFzb6p2reQuk6oyqX1w@nABsjMSC z`5V*^XvF-c65GBNe0n`x^XGj;w}Y4Io&aWh3o(8tFopis<4No(IzFN4U-CPIS>d$t z*Bz57T2qxM+872|v5;4CcR~(dF<*q3PYcAAtl}5Dq9HE$=)D?$;-qt&*!v`mGFZKm zaDy{A+-~5?5447+zp`8Pwo-aSeZXTEHV`__vo0N8d)O5m6w2}_+e6RgsWAY;?MYlg z2#E5SCirEj1HmLGX?@!z@1adE#SgtUW?&8p%judZmSQzVH`A&W7P?r3)k zw9{mK`{jClX}x~)=Aa&B5*GASgH`WI8$L8nv9IA@H~!O?8XsSfEQMAuK*!7f&H#Rb z0ZQFH(J0;!B(rZ*lb$=A4ZA6C^jF8fSjGG3Xt1{nSFFT4gpYk+B)?^x-;Mh z(cL?`!?ZXZ?-`vcte(2VTJ)-pf2-z{@f*fGD9MPInfW*{omE(#A;mh%!DmiAbHcZ0d!(()+iQWR8V69UHld$GLVX2!s^9k%* z{**MYiQ`78&1JaGziGN;u*L|+!RZG+VU*x*@(@9Nt?Jq@w!H*MFYa^(9BPCDH(;l z1)n>ZXl6KeSTK(9t-l)jbyIOHrs5=iE~dm;|7I%g`OB%;;OhTqDx$IcaVm~vCIm^A zlEQ>$rhFvUDKHar4@RssP7JT9bAl{a4ddu-tb3`)$9&~@*+p-}9HH%Cb*`GXOPtk> zwGL5=lMxy4`igf|aRm$L{LA1L)3LgcMKWb zuchfYRHNR2pOpuAJ$YB9u+ZD2IO`yp*vECgVK1z3$OFF_ult3;g3pQ?@~z9oD_pjK z>f^z32WekJZ`!8@ZZYk0sE-7;Kf0Bdg)dn{*>MFcIs?iUbiuELmy*Y#z_JA_L{Zj) zWXx{rLKlw!L46K@n!J#tu^Xk4pA)%$;0)>lC%-%ngr#8KggWad##z01hsW2BdJcGO zLd*Wf<9R^fU%j2U{t&JH|F*L2duc=oZF0Zx??%&WE1QOQ>2v?0J#*^XGwLtfQx@Yc z`O7wy#dto0C;zwYs=E@vJR=kO2K|q8z>LB`iL>fuuh@*k!p(3X8BK3df62g#~vZboBbXGJ17Z))T78`1eIv=F#Km zRc{@?i;L$jVbSx*Ka(44uqAq$A19mMHb3@Mm>;63nqx9WKK-f#i+BsgKKGhqQk|(l zqR970n%+7>Y16slt;s&|R#uJsT$CkFQ+Bm56=YHjT7H;eZxL6p=A{W6&#~0033HVa z!h2`>?v#u1q_0Z#9M)}I90HX<9Ko=RT1^RR5NafZ0CCJr&;s##J0SuX0gMJl16d$j zie&(*CM)9=`$q7JI!9u8d2w{)*GF2vc)7!!HsDJHYl?fVo=cI`qJ`YCV@|m7f6@lW zTTRJ6&ITyK>aOD?+-V3t)j{wn1O)-`f5wUoZ?iwe{TWuo6v;E^7ccHB=!v+$FsNZg zVRL|e6K-nf#bK)gpJX?N;*Om|qw&(Nklr=&uon~6KBELIT07|vOCK;c*)Z#VUVg9OIVd;)s`Sv*LHvW}Lb}{C` z{1epuL3{&gk{qXXgQ-w~(JS79gYt05(-`ii*JZnLeV*e=UG59Oh>vEL^sS$pdCVJfzJ8l)ZidR z8(If{Fu>)Ba~}C^a8R2X+=q)(3!jf}r?3%1>HMZpz8tdfdVLQM5lEWC+e#ojxwEUI>^FnocnPdN-an~ zxj;+b#qO=HrSDJUTe^4}UKs?mmYjCx(NQDFrMx6JLXgw*a$b_t^vWsOd55G7P4sAr z;+<`ukbe#hmNs}s&JPU;R-qL1DtEzoW=po%q?1O6r83B12{wE2ooqnq@VY!7<9 zY<)Yz;oY37ipwa8K&TzHzI;lE;}=TM%cwsbcYKL-#3JdOKEyi0)-0u*8kW9)fOWAf z@P!|}Nji;eK5<<$u{6b+UQ zyPhjU+Z};7$i-3ZdOy1EawXC4hE5rK=&cR()|?2(H5FYp1}GgD1w!p86NnJU5fBFM zfu5^z>{gMkqeq)AKoi#b1~#}gM)+{Nd}@vBP24_cco@LaJA?uJ4MYQ;MDJ}7SRoEy z6i1a&QY??9hgxKvgLR;;uq*H{DC{Z^e^D52V^iu%JJ&=g?F7a0Sfx-}e>GioS~|AV zRP-k}YMz5sxnmWd2S-l+=E7M(qXK=RP<&j$Z!N+{r-iQIX(EmiF>w*TEuf5^VnTZn zW1tdE_ZG1d>eKjf5qFFDk%%iqTp;3L5o1K`ETXrFPcYYLdEZ)+1mdiia8Sfz5!diY zKVW06a#bs80e(I6cU2%kMiXrKxXv2w$#SaSg2?-0)zU7#$)T}*q;7l3A7k5ge3H(u zXzs$LOS$|9#Npf+=Np*dFTU5rCdB{4ATlsjEwu%aH&UC1{${4N@gJQW2Z^cZQXK=q zox*n^l!qx2!j-#JPt9a^YG*IcAf$1shC$?hYHXkns&T2-^JVz|jtFZTdX0XiLSH{G zGn0Yif=uVrXpR(o-)9@@VDUkZn!a4bC}*uhui+&%pIN>hnQ3}Ae_9GBUpNU+>Lp|B z5;Ow|lW2lf9;T+T_-c?{1hUqpYR)TKe|!YhrUN1_RmK9WuQWUM1o%?J6N!%g4QUba z_?}I!<#mmRJ>{p;NW(N%YK|nM(?Y!TbnUTqi&;jNq|KLJnn)DsO{GUClD6snq&X8w zR(j|9F%zi@1}&z@todYTdXQ8xkyNIqOFx}Jx{VJEu;OA^e&YYF&y^Kb%#xl zJH|95v&VHkY()+ZBbC$J5n~aSU$2t8)`Ks*Z#Pq+n8i zX}fyl%SnT!UwV^v8R628yvdl1fzmDxgy?2wB))^ho#R5E6ATjl%Xa3Iwp z6YhU(Dr+hsle6kIME~^5@imRvVzAOVv0RMOpogh|rtZ zF1W0%;FF@-<&vmr?SqF>j`?H=Htl0sS8xEB!UjkDY&yg$Z;?utOl#fS=1$A7(^rg9 z9DU{WbSx6^4#%aMHW!ptevT&C>fhnh{g3cKUwdzzOYTnd3;h5I`F8GHHa^VbU1HrS z0eRjB&!ws-lrv*2={#NInZc(;%q6MQTejXR=gaQRr!|1w-OK#u1cwpK8ccKPSh8-q zTIv`>KAWyF9ml&mI6IJEtam+*Ry|t8XGCI zT%HS{Pq{otq+F`%Y}C0{u#Htd9_iSYH!YW^fTHuhl%M?6)1N40y>0bJA{|Rt4w*h< zm*Tn`$~D(|&Yh0$)ny$?`%58n_O=AH>o2zWa%*n+Hfp11<3&_+VO~jKmr(}HY&r*{1_OE`dJ}!1f z`kXmT(yZ(`lbHUK-W)$GefC7A&CIFeO1^nV<<|N9M=sYATp8a2-a~kb;DfjyLI;H2 z2nK{P2s04g*+|;tjY`pmij@m>GFk0kjqhsrYP>4s)j0E7T-i2v5=oc&Nt9&6{6Mr? zDXVHDB*`lL>j=L(qNOOki%1p($_ktF(cZFTUm@L3jTGJ%NT6sJF-s7bNTSU}K1HWQ zragBO{llP&G(LAgi#Pc^o{WHoGC@pR&9gNnX_g>~DNjfgo6l4jUya+>{`+{<>R0*r zTP42Iy7DxymB0GTtNg)*uO%?ht}Zi0&)4G0*W&8e;>l%X@WP8GB|iQ{pnsU81iG+L z%Rn=Y7$&qa!}x;M0!;`Zp!0ys5VW8Rf$I>uf-VAXK!^an3%CXQ*xr-|W@2-l3_1&V z8DR|QD&PYI(?mp=rVP^#VG3w1Fd1i%EYK8(A>@Hh13D2bpsRs;U;I@Rl>w$BECHPb zT#P_J8!H6vLs$vg4s41;)N0Ub;CzI2RHiw$&mXsd_K55Pp2Y0_7<2{jq#s&AY2ZnJ zhS^4G;K=~UQX1$T$S`|AD}e@t!=RIa+8|U4n&Oo<409TE6;RO@NacaQBiz|#LhC~q z<~qVXDg^u(7x0fj?*h(j&oECxX8}8gqH8`yp}=JbKA;PMXAzX3D}de|&}E>Nz>;vZ z7PK9>wHvwv^e&((0?L9`13gWVFfAfVU>k&qptZmy2va~80*@eMfwluL^u)jgT>5{g#~^K=xAUFwk3AZ)nn2B!PrurM??#J58*P+06dCN1)6Ri z-x~+3&~)JHG+2Vtz>5g75-1IfO@~!LCj*Bd_<~LYPDJnnodu+S!l(wF2TYoPI!!bK zh-WVD=!)VVGG6 zO3+!rWe9$tla1J}BWOyXAn+8W_h2bIzG7)q&&D44jos==8Z$DjTbeXWl8oJ+ryJub z8Nf)ipk)$9h7m78`Oj%@IpZxEKuk+pkt0ieXb5)hsTvJCB>g&0=F>YFEngs1HDJZl_N`|i3DZx5B zBIcU-C%4HJf+8~1Ktl-P5eO^-_0`lzQ`byg@&u%1A{Y_=QBjhx@{lC53T*MY<-`#9 z7DM26T?!2K6Lz`Z0g+z!7?DKtvfmNX&Wm_M#Ggd06;b)UAlFL7o+27V93^6= zh!zpoh*&J5UBpTOP0T$p;i-teKL{0RMT`+~fQVB>w1`+J;(8JHhi?9u)Doi04JTCgQgu-V^Z=Mbytc6B9fg zLKR98eMM{~Vh0hsix@3pqKGLXriwU4#MvUgBjQ34X>GKAW`&rrTg0;>I_d;5s_3H; zQHWvMiDTox7(0CZ%zrp|{ujoMP(SmZ4W9pnv11bZ{y!Q#=!gGy?3n(W!9&Nve>!$D zu})@Am{ihZ?H~zRx2}7MV_lqtj9BkS=B+;%a!5AEI6HGf)|-r-Quqf4PbuRpEM_-k zIT=~Ar)C;6NX~}`OjS_h|6?%yRptHT2M>rhbm<&6aRwA-m?lv0|4|5iUhvF0ITL0Z zg(^c(;lBowvteUNmP{rg%|B}9L(g4QxgubR?xPEC%e8XSU{f!g1rs;LNF*h;O?@Sj z@RAFgyGl)2*wsMx+Q<0GLt_BSqUa*FD7h%D2$4c;RshT<YL_ zs@lYCR&S2poVU4X^OnuKHkWR;Z#liCY76s;=O@Zfd_PGm&MM9;E-Wr8-c@Wbt|+c5 zt}bS_Dz~b)YPX`iYSaTL$t$)q|VOMGL})BWVa(wk^>&(9-fv>8CC1VQ%fd*xvlHdhLOM zzZESAF_t{ow#&1WDD+;aIL ztFnWsvOL!RBQN8Iyq$0V(8b$lTT1Gp?_Ga^PX7@SHC@Y3Sv1G=uBp4IT{ zh_jbJ+hAXJ``Ap1xIQ{%xE8-MRG> z`pxo48@$y7@r^Ld#}OS-G(6edC-<@* zbDrCy9~Wh>xtzGXL%v&MX=qH|LvC94i>D1mpRcbyXWQO%^QEu9Tup3nn}W z^KYP;_>I&}!bmp8Xrr|a+}(!yD)B6MYE=`qcFg9l41e*NO@5jB*2xpeY}z1zO;=E{#7v)uLu>~1}$tkLc@ z6Dyv+o3Gj8`ewtfTg#(OJHGMivh~1MEA~G)zuees>fOn!S{5GtvAk&38;6D;-M?(q z{kNj0HNB8$>DcME^s;7UY>DcrPiV_O-XywM{n^5I*SK2bd=*_eC^2hKV3!H4=k~qVHelo(&qepUE=W}LeOA=L z|JZMn=fp3}eN^1e*>+J`^P6Rjo1BQ$FG?y}RW+&cZy(GZ=DbldqP*ur`-KH1AMWkk z(zI(#%(nMNeRp^7<#o%_!qTisWwV#RJYpnrMz%o0xRn=Q3hyy7*xX;1Y-#SXdPLam zeThT1ZAyGF>ii-1s7Z0H`)H3p_cmJ~xzc+_K)Xlts`o3_c36@A(H5Wa zemU3LYBKIvRLOS-I>$Uzw>gwrKiu?H^Z@4ZxyO!A zNbMIFy|t0r9@-wAJ9mjBUsUSUzS?iQ^uE19v8ZxLOY@xk$I}j1rY-e8WQqRs$5T@y znvN%(FC8?E&Kg|o)nr~;x6q>Hw_ZQb*H>GJ;^;#dD|IP1hPjsrjbmfPND%Upkll`)v%0t$8M-JT2lm=Yf-F6f= zu=k^ri;aucBvqdIrEpR0%KVIT&czXvr#TP)X}cbJIpx__<5JVtGcw$t%?v&Jr8!$$ z@9F!d8H<9F$l61#HjX}Cu%G1pT0hKVwSXyD(#(Q>KS-u`We~N0$oPs-Y>s+qvQBL@47vD)T}0-Ri4 z-`6ciwJ_)Ot)5@k8}p7WFLLI=PuB%jeLnYS+nHC^H}dkm_G{6Jvipnjiofr_z)k=7 R`o&xAy}TQF@C!Qge*hUA46XnG From 8a51563f1999bbe7df3ac483b83b31f54a792d49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Jaussaud?= Date: Fri, 12 Nov 2021 16:16:47 +0800 Subject: [PATCH 3/4] Update XPGDevice to inherit DefaultDevice instead of IDevice --- .../Project-Aurora/Devices/XPG/XPGDevice.cs | 123 ++++++++---------- 1 file changed, 54 insertions(+), 69 deletions(-) diff --git a/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs b/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs index b47b2a113..16b463ad9 100644 --- a/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs +++ b/Project-Aurora/Project-Aurora/Devices/XPG/XPGDevice.cs @@ -13,65 +13,9 @@ namespace Aurora.Devices.XPG { - class XPGDevice : IDevice + class XPGDevice : DefaultDevice { - // XPG device is implemented as a script for ScriptedDevice, but we - // also want the script to call Shutdown() when UpdateDevice() fails. - // This lets us easily handle the peripheral being disconnected and - // reconnected. However, we can't override the interface method - // from ScriptedDevice, use aggregation instead. - private Devices.ScriptedDevice.ScriptedDevice device; - - public XPGDevice() - { - device = new Devices.ScriptedDevice.ScriptedDevice(new XPGDeviceScript()); - } - - public Settings.VariableRegistry RegisteredVariables => device.RegisteredVariables; - public string DeviceName => "XPG"; - public string DeviceDetails => device.DeviceDetails; - public string DeviceUpdatePerformance => device.DeviceUpdatePerformance; - public bool Initialize() => device.Initialize(); - public void Shutdown() => device.Shutdown(); - public void Reset() => device.Reset(); - public bool Reconnect() => device.Reconnect(); - public bool IsInitialized => device.IsInitialized; - public bool IsConnected() => device.IsConnected(); - public bool IsKeyboardConnected() => device.IsKeyboardConnected(); - public bool IsPeripheralConnected() => device.IsPeripheralConnected(); - - public bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) - { - if (IsInitialized) - { - bool success = device.UpdateDevice(keyColors, e, forced); - if (!success) { - device.Shutdown(); - } - return success; - } - return false; - } - public bool UpdateDevice(DeviceColorComposition colorComposition, DoWorkEventArgs e, bool forced = false) - { - if (IsInitialized) - { - bool success = device.UpdateDevice(colorComposition, e, forced); - if (!success) { - device.Shutdown(); - } - return success; - } - return false; - } - - } - - - internal class XPGDeviceScript - { - public string devicename = "XPG script"; - public bool enabled = true; + public override string DeviceName => "XPG"; private Stopwatch updateStopwatch = new Stopwatch(); @@ -85,35 +29,70 @@ internal class XPGDeviceScript [DllImport("libxpgp_aurora", CallingConvention = CallingConvention.Cdecl, EntryPoint = "UpdateDevice")] private static extern int cUpdateDevice(byte[] array, int bytesize); + private bool crashed = false; + private bool initialized = false; + public override bool IsInitialized => initialized && !crashed; + + protected override string DeviceInfo => crashed ? "Error" : "OK"; - public bool Initialize() + public override bool Initialize() { - int error = cInitialize(); - if (error > 0) // a proper error occured + if (crashed) + { + return false; + } + if (!initialized) { - throw new Exception("Error initializing XPGDeviceScript"); + int error = cInitialize(); + if (error > 0) // a proper error occured + { + crashed = true; // unlikely to work on the second try either + } + if (error == 0) // no error + device found + { + initialized = true; + } } - return error == 0; // true if we have a device + return IsInitialized; } - public void Reset() + public override void Reset() { updateStopwatch.Reset(); - cReset(); + if (IsInitialized) + { + cReset(); + } } - public void Shutdown() + public override void Shutdown() { - updateStopwatch.Reset(); + Reset(); cShutdown(); + initialized = false; + } + + public override bool UpdateDevice(Dictionary keyColors, DoWorkEventArgs e, bool forced = false) + { + if (IsInitialized) + { + bool success = TryUpdateDevice(keyColors, forced); + if (!success) + { + this.Shutdown(); + } + return success; + } + return false; } private const int colorcount = 108; // highest value we use is FN_Key (107) private const int bytesize = 4 * colorcount; private byte[] currentColors = new byte[bytesize]; - public bool UpdateDevice(Dictionary keyColors, bool forced) + private byte[] spareBuffer = new byte[bytesize]; + private bool TryUpdateDevice(Dictionary keyColors, bool forced) { - byte[] newColors = new byte[bytesize]; // zero-init + byte[] newColors = this.spareBuffer; if (keyColors.ContainsKey(DeviceKeys.Peripheral)) { Color color = keyColors[DeviceKeys.Peripheral]; @@ -125,6 +104,11 @@ public bool UpdateDevice(Dictionary keyColors, bool forced) newColors[4 * k + 3] = color.A; } } + else + { + // start with current colors to support partial updates + Array.Copy(this.currentColors, newColors, bytesize); + } foreach (KeyValuePair kvp in keyColors) { int k = (int)kvp.Key; @@ -157,6 +141,7 @@ public bool UpdateDevice(Dictionary keyColors, bool forced) return false; } updateStopwatch.Restart(); + this.spareBuffer = this.currentColors; this.currentColors = newColors; } return true; From e29b385402b7b27e7753428650804a3676b67d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Jaussaud?= Date: Thu, 16 Dec 2021 17:29:45 +0800 Subject: [PATCH 4/4] Updated XPG library libxpgp_aurora.dll --- .../Project-Aurora/libxpgp_aurora.dll | Bin 54640 -> 54640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Project-Aurora/Project-Aurora/libxpgp_aurora.dll b/Project-Aurora/Project-Aurora/libxpgp_aurora.dll index 1c32a7b3fcf912e336061e401509d508d46abf7b..5c0c7dee1356ac219e306177f4cb44d9841ea4bc 100644 GIT binary patch delta 4707 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 delta 4765 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 Z{$HCNnmM58MQZ)VCd*o<6xb)!e*u(@*6{!U