From bfe51add6624acf57a59d2ab7fce82b88e00951b Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Sat, 10 Sep 2016 10:40:44 +0200 Subject: [PATCH] Refactored the positionen to be stored in the LED --- Devices/Generic/AbstractCueDevice.cs | 19 ++++++++++++------- Devices/Generic/CorsairLed.cs | 14 +++++++++++++- Devices/Headset/CorsairHeadset.cs | 5 +++-- Devices/Keyboard/CorsairKeyboard.cs | 22 +++++++++++----------- Devices/Keyboard/Keys/CorsairKey.cs | 9 +-------- Devices/Keyboard/Keys/RectangleKeyGroup.cs | 4 ++-- Devices/Mouse/CorsairMouse.cs | 21 +++++++++++---------- Devices/Mousemat/CorsairMousemat.cs | 7 +++---- 8 files changed, 56 insertions(+), 45 deletions(-) diff --git a/Devices/Generic/AbstractCueDevice.cs b/Devices/Generic/AbstractCueDevice.cs index 6a71e1f..3cd9340 100644 --- a/Devices/Generic/AbstractCueDevice.cs +++ b/Devices/Generic/AbstractCueDevice.cs @@ -104,16 +104,21 @@ namespace CUE.NET.Devices.Generic #region Methods /// - /// Gets the LED-Object with the specified id. + /// Initializes the LED-Object with the specified id. /// - /// The LED-Id to look for. + /// The LED-Id to initialize. + /// The rectangle representing the position of the LED to initialize. /// - protected CorsairLed GetLed(int ledId) + protected CorsairLed InitializeLed(int ledId, RectangleF ledRectangle) { if (!Leds.ContainsKey(ledId)) - Leds.Add(ledId, new CorsairLed()); + { + CorsairLed led = new CorsairLed(ledRectangle); + Leds.Add(ledId, led); + return led; + } - return Leds[ledId]; + return null; } /// @@ -169,7 +174,7 @@ namespace CUE.NET.Devices.Generic public void Update(bool flushLeds = false) { OnUpdating(); - + DeviceUpdate(); ICollection ledsToUpdate = (flushLeds ? Leds : Leds.Where(x => x.Value.IsDirty)).Select(x => new LedUpateRequest(x.Key, x.Value.RequestedColor)).ToList(); @@ -186,7 +191,7 @@ namespace CUE.NET.Devices.Generic /// Performs device specific updates. /// protected abstract void DeviceUpdate(); - + private void UpdateLeds(ICollection updateRequests) { updateRequests = updateRequests.Where(x => x.Color != Color.Transparent).ToList(); diff --git a/Devices/Generic/CorsairLed.cs b/Devices/Generic/CorsairLed.cs index 78f9026..ceec886 100644 --- a/Devices/Generic/CorsairLed.cs +++ b/Devices/Generic/CorsairLed.cs @@ -13,6 +13,11 @@ namespace CUE.NET.Devices.Generic public class CorsairLed { #region Properties & Fields + + /// + /// Gets a rectangle representing the physical location of the led. + /// + public RectangleF LedRectangle { get; } /// /// Indicates whether the LED has changed an internal state. @@ -55,7 +60,14 @@ namespace CUE.NET.Devices.Generic #region Constructors - internal CorsairLed() { } + /// + /// Initializes a new instance of the class. + /// + /// The rectangle representing the physical location of the led. + internal CorsairLed(RectangleF ledRectangle) + { + this.LedRectangle = ledRectangle; + } #endregion diff --git a/Devices/Headset/CorsairHeadset.cs b/Devices/Headset/CorsairHeadset.cs index 9a66aea..b8bfa91 100644 --- a/Devices/Headset/CorsairHeadset.cs +++ b/Devices/Headset/CorsairHeadset.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Drawing; using System.Linq; using CUE.NET.Devices.Generic; using CUE.NET.Devices.Headset.Enums; @@ -67,8 +68,8 @@ namespace CUE.NET.Devices.Headset private void InitializeLeds() { - GetLed((int)CorsairHeadsetLedId.LeftLogo); - GetLed((int)CorsairHeadsetLedId.RightLogo); + InitializeLed((int)CorsairHeadsetLedId.LeftLogo, new RectangleF(0, 0, 1, 1)); + InitializeLed((int)CorsairHeadsetLedId.RightLogo, new RectangleF(1, 0, 1, 1)); } protected override void DeviceUpdate() diff --git a/Devices/Keyboard/CorsairKeyboard.cs b/Devices/Keyboard/CorsairKeyboard.cs index 4aa24e3..1ad7ccb 100644 --- a/Devices/Keyboard/CorsairKeyboard.cs +++ b/Devices/Keyboard/CorsairKeyboard.cs @@ -64,7 +64,7 @@ namespace CUE.NET.Devices.Keyboard /// /// The point to get the key from. /// The key at the given point or null if no key is found. - public CorsairKey this[PointF location] => _keys.Values.FirstOrDefault(x => x.KeyRectangle.Contains(location)); + public CorsairKey this[PointF location] => _keys.Values.FirstOrDefault(x => x.Led.LedRectangle.Contains(location)); /// /// Gets a list of inside the given rectangle. @@ -72,7 +72,8 @@ namespace CUE.NET.Devices.Keyboard /// The rectangle to check. /// The minimal percentage overlay a key must have with the to be taken into the list. /// - public IEnumerable this[RectangleF referenceRect, float minOverlayPercentage = 0.5f] => _keys.Values.Where(x => RectangleHelper.CalculateIntersectPercentage(x.KeyRectangle, referenceRect) >= minOverlayPercentage); + public IEnumerable this[RectangleF referenceRect, float minOverlayPercentage = 0.5f] => _keys.Values + .Where(x => RectangleHelper.CalculateIntersectPercentage(x.Led.LedRectangle, referenceRect) >= minOverlayPercentage); #endregion @@ -120,7 +121,7 @@ namespace CUE.NET.Devices.Keyboard this.KeyboardDeviceInfo = info; InitializeKeys(); - KeyboardRectangle = RectangleHelper.CreateRectangleFromRectangles(this.Select(x => x.KeyRectangle)); + KeyboardRectangle = RectangleHelper.CreateRectangleFromRectangles(this.Select(x => x.Led.LedRectangle)); } #endregion @@ -158,15 +159,15 @@ namespace CUE.NET.Devices.Keyboard switch (brush.BrushCalculationMode) { case BrushCalculationMode.Relative: - RectangleF brushRectangle = RectangleHelper.CreateRectangleFromRectangles(keys.Select(x => x.KeyRectangle)); + RectangleF brushRectangle = RectangleHelper.CreateRectangleFromRectangles(keys.Select(x => x.Led.LedRectangle)); float offsetX = -brushRectangle.X; float offsetY = -brushRectangle.Y; brushRectangle.X = 0; brushRectangle.Y = 0; - brush.PerformRender(brushRectangle, keys.Select(x => new BrushRenderTarget(x.KeyId, x.KeyRectangle.GetCenter(offsetX, offsetY)))); + brush.PerformRender(brushRectangle, keys.Select(x => new BrushRenderTarget(x.KeyId, x.Led.LedRectangle.GetCenter(offsetX, offsetY)))); break; case BrushCalculationMode.Absolute: - brush.PerformRender(KeyboardRectangle, keys.Select(x => new BrushRenderTarget(x.KeyId, x.KeyRectangle.GetCenter()))); + brush.PerformRender(KeyboardRectangle, keys.Select(x => new BrushRenderTarget(x.KeyId, x.Led.LedRectangle.GetCenter()))); break; default: throw new ArgumentException(); @@ -181,7 +182,7 @@ namespace CUE.NET.Devices.Keyboard // ReSharper disable once CatchAllClause catch (Exception ex) { OnException(ex); } } - + /// /// Gets a list containing all LEDs of this group. /// @@ -236,9 +237,8 @@ namespace CUE.NET.Devices.Keyboard for (int i = 0; i < nativeLedPositions.numberOfLed; i++) { _CorsairLedPosition ledPosition = (_CorsairLedPosition)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); - CorsairLed led = GetLed((int)ledPosition.ledId); - _keys.Add(ledPosition.ledId, new CorsairKey(ledPosition.ledId, led, - new RectangleF((float)ledPosition.left, (float)ledPosition.top, (float)ledPosition.width, (float)ledPosition.height))); + CorsairLed led = InitializeLed((int)ledPosition.ledId, new RectangleF((float)ledPosition.left, (float)ledPosition.top, (float)ledPosition.width, (float)ledPosition.height)); + _keys.Add(ledPosition.ledId, new CorsairKey(ledPosition.ledId, led)); ptr = new IntPtr(ptr.ToInt64() + structSize); } @@ -273,7 +273,7 @@ namespace CUE.NET.Devices.Keyboard } #endregion - + #region IEnumerable /// diff --git a/Devices/Keyboard/Keys/CorsairKey.cs b/Devices/Keyboard/Keys/CorsairKey.cs index 1cb799f..3410fd1 100644 --- a/Devices/Keyboard/Keys/CorsairKey.cs +++ b/Devices/Keyboard/Keys/CorsairKey.cs @@ -24,11 +24,6 @@ namespace CUE.NET.Devices.Keyboard.Keys /// public CorsairLed Led { get; } - /// - /// Gets a rectangle representing the physical location of the key. - /// - public RectangleF KeyRectangle { get; } - #endregion #region Constructors @@ -38,12 +33,10 @@ namespace CUE.NET.Devices.Keyboard.Keys /// /// The key-ID of the key. /// The LED of the key. - /// The rectangle representing the physical location of the key. - internal CorsairKey(CorsairKeyboardKeyId keyId, CorsairLed led, RectangleF keyRectangle) + internal CorsairKey(CorsairKeyboardKeyId keyId, CorsairLed led) { this.KeyId = keyId; this.Led = led; - this.KeyRectangle = keyRectangle; } #endregion diff --git a/Devices/Keyboard/Keys/RectangleKeyGroup.cs b/Devices/Keyboard/Keys/RectangleKeyGroup.cs index c2a175c..45015ba 100644 --- a/Devices/Keyboard/Keys/RectangleKeyGroup.cs +++ b/Devices/Keyboard/Keys/RectangleKeyGroup.cs @@ -65,7 +65,7 @@ namespace CUE.NET.Devices.Keyboard.Keys /// (optional) The minimal percentage overlay a key must have with the to be taken into the keygroup. (default: 0.5f) /// (optional) Specifies whether this group should be automatically attached or not. (default: true) public RectangleKeyGroup(CorsairKeyboard keyboard, CorsairKey fromKey, CorsairKey toKey, float minOverlayPercentage = 0.5f, bool autoAttach = true) - : this(keyboard, RectangleHelper.CreateRectangleFromRectangles(fromKey.KeyRectangle, toKey.KeyRectangle), minOverlayPercentage, autoAttach) + : this(keyboard, RectangleHelper.CreateRectangleFromRectangles(fromKey.Led.LedRectangle, toKey.Led.LedRectangle), minOverlayPercentage, autoAttach) { } /// @@ -104,7 +104,7 @@ namespace CUE.NET.Devices.Keyboard.Keys /// The list containing the keys. protected override IList GetGroupKeys() { - return _keyCache ?? (_keyCache = Keyboard.Where(x => RectangleHelper.CalculateIntersectPercentage(x.KeyRectangle, Rectangle) >= MinOverlayPercentage).ToList()); + return _keyCache ?? (_keyCache = Keyboard.Where(x => RectangleHelper.CalculateIntersectPercentage(x.Led.LedRectangle, Rectangle) >= MinOverlayPercentage).ToList()); } #endregion diff --git a/Devices/Mouse/CorsairMouse.cs b/Devices/Mouse/CorsairMouse.cs index d063cee..46501b6 100644 --- a/Devices/Mouse/CorsairMouse.cs +++ b/Devices/Mouse/CorsairMouse.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Drawing; using System.Linq; using CUE.NET.Devices.Generic; using CUE.NET.Devices.Mouse.Enums; @@ -72,22 +73,22 @@ namespace CUE.NET.Devices.Mouse switch (MouseDeviceInfo.PhysicalLayout) { case CorsairPhysicalMouseLayout.Zones1: - GetLed((int)CorsairMouseLedId.B1); + InitializeLed((int)CorsairMouseLedId.B1, new RectangleF(0, 0, 1, 1)); break; case CorsairPhysicalMouseLayout.Zones2: - GetLed((int)CorsairMouseLedId.B1); - GetLed((int)CorsairMouseLedId.B2); + InitializeLed((int)CorsairMouseLedId.B1, new RectangleF(0, 0, 1, 1)); + InitializeLed((int)CorsairMouseLedId.B2, new RectangleF(1, 0, 1, 1)); break; case CorsairPhysicalMouseLayout.Zones3: - GetLed((int)CorsairMouseLedId.B1); - GetLed((int)CorsairMouseLedId.B2); - GetLed((int)CorsairMouseLedId.B3); + InitializeLed((int)CorsairMouseLedId.B1, new RectangleF(0, 0, 1, 1)); + InitializeLed((int)CorsairMouseLedId.B2, new RectangleF(1, 0, 1, 1)); + InitializeLed((int)CorsairMouseLedId.B3, new RectangleF(2, 0, 1, 1)); break; case CorsairPhysicalMouseLayout.Zones4: - GetLed((int)CorsairMouseLedId.B1); - GetLed((int)CorsairMouseLedId.B2); - GetLed((int)CorsairMouseLedId.B3); - GetLed((int)CorsairMouseLedId.B4); + InitializeLed((int)CorsairMouseLedId.B1, new RectangleF(0, 0, 1, 1)); + InitializeLed((int)CorsairMouseLedId.B2, new RectangleF(1, 0, 1, 1)); + InitializeLed((int)CorsairMouseLedId.B3, new RectangleF(2, 0, 1, 1)); + InitializeLed((int)CorsairMouseLedId.B4, new RectangleF(3, 0, 1, 1)); break; default: throw new WrapperException($"Can't initial mouse with layout '{MouseDeviceInfo.PhysicalLayout}'"); diff --git a/Devices/Mousemat/CorsairMousemat.cs b/Devices/Mousemat/CorsairMousemat.cs index 1536dea..cf538ad 100644 --- a/Devices/Mousemat/CorsairMousemat.cs +++ b/Devices/Mousemat/CorsairMousemat.cs @@ -12,7 +12,6 @@ using System.Runtime.InteropServices; using CUE.NET.Devices.Generic; using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Mousemat.Enums; -using CUE.NET.Effects; using CUE.NET.Exceptions; using CUE.NET.Native; @@ -47,7 +46,7 @@ namespace CUE.NET.Devices.Mousemat /// Gets specific information provided by CUE for the mousemat. /// public CorsairMousematDeviceInfo MousematDeviceInfo { get; } - + /// /// Gets a read-only collection containing all LEDs of the mousemat. /// @@ -105,8 +104,8 @@ namespace CUE.NET.Devices.Mousemat } // Sort for easy iteration by clients - foreach (_CorsairLedPosition position in positions.OrderBy(p => p.ledId)) - GetLed((int)position.ledId); + foreach (_CorsairLedPosition ledPosition in positions.OrderBy(p => p.ledId)) + InitializeLed((int)ledPosition.ledId, new RectangleF((float)ledPosition.left, (float)ledPosition.top, (float)ledPosition.width, (float)ledPosition.height)); } protected override void DeviceUpdate()