From 7e72e22295abe4093ea14a79d909e0371bda5e2a Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 11 Oct 2023 19:30:49 +0200 Subject: [PATCH] Revert "Undo device changes" This reverts commit 41c1458b5af460769fdd06b9e86fe4b03ef54ed2. --- .../Models/Surface/ArtemisDevice.cs | 47 ++++++++++++++++--- .../Services/Core/SurfaceManager.cs | 2 +- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs index f81a44d87..ef29c01f7 100644 --- a/src/Artemis.Core/Models/Surface/ArtemisDevice.cs +++ b/src/Artemis.Core/Models/Surface/ArtemisDevice.cs @@ -15,11 +15,17 @@ namespace Artemis.Core; /// public class ArtemisDevice : CorePropertyChanged { + private readonly List _originalLeds; + private readonly Size _originalSize; private SKPath? _path; private SKRect _rectangle; internal ArtemisDevice(IRGBDevice rgbDevice, DeviceProvider deviceProvider) { + _originalLeds = new List(rgbDevice.Select(l => new OriginalLed(l))); + Rectangle ledRectangle = new(rgbDevice.Select(x => x.Boundary)); + _originalSize = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y); + Identifier = rgbDevice.GetDeviceIdentifier(); DeviceEntity = new DeviceEntity(); RgbDevice = rgbDevice; @@ -48,6 +54,10 @@ public class ArtemisDevice : CorePropertyChanged internal ArtemisDevice(IRGBDevice rgbDevice, DeviceProvider deviceProvider, DeviceEntity deviceEntity) { + _originalLeds = new List(rgbDevice.Select(l => new OriginalLed(l))); + Rectangle ledRectangle = new(rgbDevice.Select(x => x.Boundary)); + _originalSize = ledRectangle.Size + new Size(ledRectangle.Location.X, ledRectangle.Location.Y); + Identifier = rgbDevice.GetDeviceIdentifier(); DeviceEntity = deviceEntity; RgbDevice = rgbDevice; @@ -349,7 +359,7 @@ public class ArtemisDevice : CorePropertyChanged return mappedLed; return artemisLed; } - + /// /// Returns the most preferred device layout for this device. /// @@ -451,6 +461,16 @@ public class ArtemisDevice : CorePropertyChanged /// internal void ApplyLayout(ArtemisLayout? layout, bool createMissingLeds, bool removeExcessiveLeds) { + if (layout == null) + { + ClearLayout(); + UpdateLeds(); + + CalculateRenderProperties(); + OnDeviceUpdated(); + return; + } + if (createMissingLeds && !DeviceProvider.CreateMissingLedsSupported) throw new ArtemisCoreException($"Cannot apply layout with {nameof(createMissingLeds)} " + "set to true because the device provider does not support it"); @@ -458,18 +478,33 @@ public class ArtemisDevice : CorePropertyChanged throw new ArtemisCoreException($"Cannot apply layout with {nameof(removeExcessiveLeds)} " + "set to true because the device provider does not support it"); - if (layout != null && layout.IsValid) + ClearLayout(); + if (layout.IsValid) layout.ApplyTo(RgbDevice, createMissingLeds, removeExcessiveLeds); - - UpdateLeds(); - + Layout = layout; - Layout?.ApplyDevice(this); + Layout.ApplyDevice(this); + CalculateRenderProperties(); OnDeviceUpdated(); } + private void ClearLayout() + { + if (Layout == null) + return; + + RgbDevice.DeviceInfo.LayoutMetadata = null; + RgbDevice.Size = _originalSize; + Layout = null; + + while (RgbDevice.Any()) + RgbDevice.RemoveLed(RgbDevice.First().Id); + foreach (OriginalLed originalLed in _originalLeds) + RgbDevice.AddLed(originalLed.Id, originalLed.Location, originalLed.Size, originalLed.CustomData); + } + internal void ApplyToEntity() { // Other properties are computed diff --git a/src/Artemis.Core/Services/Core/SurfaceManager.cs b/src/Artemis.Core/Services/Core/SurfaceManager.cs index 99c2a78c9..8630186ca 100644 --- a/src/Artemis.Core/Services/Core/SurfaceManager.cs +++ b/src/Artemis.Core/Services/Core/SurfaceManager.cs @@ -24,7 +24,7 @@ internal sealed class SurfaceManager : IDisposable public SurfaceManager(IRenderer renderer, IManagedGraphicsContext? graphicsContext, int targetFrameRate, float renderScale) { _renderer = renderer; - _updateTrigger = new TimerUpdateTrigger(false) {UpdateFrequency = 1.0 / targetFrameRate}; + _updateTrigger = new TimerUpdateTrigger {UpdateFrequency = 1.0 / targetFrameRate}; GraphicsContext = graphicsContext; TargetFrameRate = targetFrameRate;