From 74889b2fd521fcdd0679c322f64a6199807c4664 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Mon, 5 Dec 2016 19:53:32 +0100 Subject: [PATCH] Improved error catching Improved tweening --- Artemis/Artemis/App.xaml.cs | 2 +- Artemis/Artemis/ArtemisBootstrapper.cs | 1 - .../CoolerMaster/MasterkeysProS.cs | 2 +- Artemis/Artemis/Managers/LoopManager.cs | 29 +++++++++++++-- Artemis/Artemis/Models/EffectModel.cs | 4 +-- .../Modules/Games/Overwatch/OverwatchModel.cs | 13 +++---- .../Profiles/Layers/Models/LayerModel.cs | 3 ++ .../Layers/Models/LayerPropertiesModel.cs | 9 ----- .../Profiles/Layers/Models/TweenModel.cs | 36 +++++++++++-------- Artemis/Artemis/Properties/AssemblyInfo.cs | 1 - .../Views/Profiles/LayerTweenView.xaml | 27 ++++---------- 11 files changed, 69 insertions(+), 58 deletions(-) diff --git a/Artemis/Artemis/App.xaml.cs b/Artemis/Artemis/App.xaml.cs index f6b42a8e5..3d53eec5c 100644 --- a/Artemis/Artemis/App.xaml.cs +++ b/Artemis/Artemis/App.xaml.cs @@ -38,7 +38,7 @@ namespace Artemis } } - private static ExceptionViewer GetArtemisExceptionViewer(Exception e) + public static ExceptionViewer GetArtemisExceptionViewer(Exception e) { var logger = LogManager.GetCurrentClassLogger(); logger.Fatal(e, "Unhandled exception, showing dialog and shutting down."); diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index 23efdc1bf..7073c0662 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -10,7 +10,6 @@ using Artemis.Utilities; using Artemis.Utilities.Converters; using Artemis.ViewModels; using Caliburn.Micro; -using MoonSharp.Interpreter; using Newtonsoft.Json; using Ninject; diff --git a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs index 3b28d528e..36a9f5b72 100644 --- a/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs +++ b/Artemis/Artemis/DeviceProviders/CoolerMaster/MasterkeysProS.cs @@ -26,7 +26,7 @@ namespace Artemis.DeviceProviders.CoolerMaster "If needed, you can select a different keyboard in Artemis under settings."; Height = 6; - Width = 17; + Width = 18; PreviewSettings = new PreviewSettings(683, 242, new Thickness(0, 0, 0, 0), Resources.masterkeys_pro_s); _generalSettings = SettingsProvider.Load(); diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index 631017882..1261bdb48 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -4,6 +4,8 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Timers; +using System.Windows; +using System.Windows.Threading; using Artemis.DeviceProviders; using Ninject.Extensions.Logging; using Timer = System.Timers.Timer; @@ -19,21 +21,44 @@ namespace Artemis.Managers private readonly EffectManager _effectManager; private readonly ILogger _logger; private readonly Timer _loopTimer; + private bool _canShowException; public LoopManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager) { _logger = logger; _effectManager = effectManager; _deviceManager = deviceManager; + _canShowException = true; // Setup timers _loopTimer = new Timer(40); - _loopTimer.Elapsed += Render; + _loopTimer.Elapsed += LoopTimerOnElapsed; _loopTimer.Start(); _logger.Info("Intialized LoopManager"); } + private void LoopTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) + { + try + { + Render(); + } + catch (Exception e) + { + if (_canShowException) + { + Caliburn.Micro.Execute.OnUIThread(delegate + { + _canShowException = false; + _loopTimer.Stop(); + App.GetArtemisExceptionViewer(e).ShowDialog(); + Environment.Exit(0); + }); + } + } + } + /// /// Gets whether the loop is running /// @@ -95,7 +120,7 @@ namespace Artemis.Managers _deviceManager.ReleaseActiveKeyboard(); } - private void Render(object sender, ElapsedEventArgs e) + private void Render() { if (!Running || _deviceManager.ChangingKeyboard) return; diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index 478884cdb..6df55e873 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -89,8 +89,8 @@ namespace Artemis.Models var keyboardRect = DeviceManager.ActiveKeyboard.KeyboardRectangle(KeyboardScale); using (var g = Graphics.FromImage(frame.KeyboardBitmap)) { - Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), - DataModel, keyboardRect, false, true, "keyboard"); + Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), + DataModel, keyboardRect, false, true, "keyboard"); } // Render mice layer-by-layer var devRec = new Rect(0, 0, 40, 40); diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs index e2dfab716..7f53834eb 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs @@ -281,19 +281,20 @@ namespace Artemis.Modules.Games.Overwatch public void FindOverwatch() { - var gameSettings = (OverwatchSettings) Settings; + var gameSettings = Settings as OverwatchSettings; + if (gameSettings == null) + return; + // If already propertly set up, don't do anything if ((gameSettings.GameDirectory != null) && File.Exists(gameSettings.GameDirectory + "Overwatch.exe") && File.Exists(gameSettings.GameDirectory + "RzChromaSDK64.dll")) return; var key = Registry.LocalMachine.OpenSubKey( - @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Overwatch"); - if (key == null) - return; + @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Overwatch"); + var path = key?.GetValue("DisplayIcon")?.ToString(); - var path = key.GetValue("DisplayIcon").ToString(); - if (!File.Exists(path)) + if (string.IsNullOrEmpty(path) || !File.Exists(path)) return; gameSettings.GameDirectory = path.Substring(0, path.Length - 14); diff --git a/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs b/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs index 766a3b467..9ee65ab2f 100644 --- a/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Models/LayerModel.cs @@ -87,6 +87,9 @@ namespace Artemis.Profiles.Layers.Models /// public void Draw(IDataModel dataModel, DrawingContext c, bool preview, bool updateAnimations) { + if (Brush == null) + return; + LayerType.Draw(this, c); } diff --git a/Artemis/Artemis/Profiles/Layers/Models/LayerPropertiesModel.cs b/Artemis/Artemis/Profiles/Layers/Models/LayerPropertiesModel.cs index 310aec92d..ccf0d77c5 100644 --- a/Artemis/Artemis/Profiles/Layers/Models/LayerPropertiesModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Models/LayerPropertiesModel.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Windows; using System.Windows.Media; @@ -27,13 +26,9 @@ namespace Artemis.Profiles.Layers.Models Conditions = source.Conditions; DynamicProperties = source.DynamicProperties; Brush = source.Brush; - XEase = source.XEase; - YEase = source.YEase; HeightEase = source.HeightEase; WidthEase = source.WidthEase; OpacityEase = source.OpacityEase; - XEaseTime = source.XEaseTime; - YEaseTime = source.YEaseTime; HeightEaseTime = source.HeightEaseTime; WidthEaseTime = source.WidthEaseTime; OpacityEaseTime = source.OpacityEaseTime; @@ -49,10 +44,6 @@ namespace Artemis.Profiles.Layers.Models public double OpacityEaseTime { get; set; } public double HeightEaseTime { get; set; } public double WidthEaseTime { get; set; } - public double YEaseTime { get; set; } - public double XEaseTime { get; set; } - public string XEase { get; set; } - public string YEase { get; set; } public string WidthEase { set; get; } public string HeightEase { get; set; } public string OpacityEase { get; set; } diff --git a/Artemis/Artemis/Profiles/Layers/Models/TweenModel.cs b/Artemis/Artemis/Profiles/Layers/Models/TweenModel.cs index 275f406f9..29e679164 100644 --- a/Artemis/Artemis/Profiles/Layers/Models/TweenModel.cs +++ b/Artemis/Artemis/Profiles/Layers/Models/TweenModel.cs @@ -6,9 +6,7 @@ namespace Artemis.Profiles.Layers.Models public class TweenModel { private readonly LayerModel _layerModel; - private float _x; private Tweener _xTweener; - private float _y; private Tweener _yTweener; private float _width; private Tweener _widthTweener; @@ -16,11 +14,12 @@ namespace Artemis.Profiles.Layers.Models private Tweener _heightTweener; private float _opacity; private Tweener _opacityTweener; + private float _x; + private float _y; public TweenModel(LayerModel layerModel) { _layerModel = layerModel; - _xTweener = new Tweener((float) layerModel.X, (float) layerModel.X, 0); _yTweener = new Tweener((float) layerModel.Y, (float) layerModel.Y, 0); _widthTweener = new Tweener((float) layerModel.Width, (float) layerModel.Width, 0); @@ -32,22 +31,31 @@ namespace Artemis.Profiles.Layers.Models public void Update() { - // TODO: Don't update if animation speed is 0 - if (Math.Abs(_layerModel.X - _x) > 0.001) - _xTweener = new Tweener(_x, (float) _layerModel.X, _layerModel.Properties.XEaseTime, - GetEaseFunction(_layerModel.Properties.XEase)); - if (Math.Abs(_layerModel.Y - _y) > 0.001) - _yTweener = new Tweener(_y, (float) _layerModel.Y, _layerModel.Properties.YEaseTime, - GetEaseFunction(_layerModel.Properties.YEase)); + // Width if (Math.Abs(_layerModel.Width - _width) > 0.001) - _widthTweener = new Tweener(_width, (float) _layerModel.Width, - _layerModel.Properties.WidthEaseTime, GetEaseFunction(_layerModel.Properties.WidthEase)); + { + var widthFunc = GetEaseFunction(_layerModel.Properties.WidthEase); + var widthSpeed = _layerModel.Properties.WidthEaseTime; + + _xTweener = new Tweener(_xTweener.Value, (float) _layerModel.X, widthSpeed, widthFunc); + _widthTweener = new Tweener(_widthTweener.Value, (float) _layerModel.Width, widthSpeed, widthFunc); + } + + // Height if (Math.Abs(_layerModel.Height - _height) > 0.001) - _heightTweener = new Tweener(_height, (float) _layerModel.Height, - _layerModel.Properties.HeightEaseTime, GetEaseFunction(_layerModel.Properties.HeightEase)); + { + var heightFunc = GetEaseFunction(_layerModel.Properties.HeightEase); + var heightSpeed = _layerModel.Properties.HeightEaseTime; + _yTweener = new Tweener(_y, (float) _layerModel.Y, heightSpeed, heightFunc); + _heightTweener = new Tweener(_height, (float) _layerModel.Height, heightSpeed, heightFunc); + } + + // Opacity if (Math.Abs(_layerModel.Opacity - _opacity) > 0.001) + { _opacityTweener = new Tweener(_opacity, (float) _layerModel.Opacity, _layerModel.Properties.OpacityEaseTime, GetEaseFunction(_layerModel.Properties.OpacityEase)); + } _xTweener.Update(40); _yTweener.Update(40); diff --git a/Artemis/Artemis/Properties/AssemblyInfo.cs b/Artemis/Artemis/Properties/AssemblyInfo.cs index a7dab2921..e104e5cf9 100644 --- a/Artemis/Artemis/Properties/AssemblyInfo.cs +++ b/Artemis/Artemis/Properties/AssemblyInfo.cs @@ -55,6 +55,5 @@ using System.Windows; [assembly: AssemblyVersion("1.5.0.4")] [assembly: AssemblyFileVersion("1.5.0.4")] -[assembly: InternalsVisibleTo("Artemis.Tests")] [assembly: InternalsVisibleTo("Artemis.Explorables")] diff --git a/Artemis/Artemis/Views/Profiles/LayerTweenView.xaml b/Artemis/Artemis/Views/Profiles/LayerTweenView.xaml index 9d871bace..0f9c51660 100644 --- a/Artemis/Artemis/Views/Profiles/LayerTweenView.xaml +++ b/Artemis/Artemis/Views/Profiles/LayerTweenView.xaml @@ -18,43 +18,28 @@ -