diff --git a/Artemis/Artemis/InjectionModules/ManagerModules.cs b/Artemis/Artemis/InjectionModules/ManagerModules.cs index 453345f68..540e266ef 100644 --- a/Artemis/Artemis/InjectionModules/ManagerModules.cs +++ b/Artemis/Artemis/InjectionModules/ManagerModules.cs @@ -8,6 +8,7 @@ namespace Artemis.InjectionModules public override void Load() { Bind().ToSelf().InSingletonScope(); + Bind().ToSelf().InSingletonScope(); Bind().ToSelf().InSingletonScope(); Bind().ToSelf().InSingletonScope(); Bind().ToSelf().InSingletonScope(); diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index 2d7b40e09..9c05d4cc3 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -1,10 +1,11 @@ using System; +using System.Diagnostics; using System.Drawing; using System.Linq; using System.Timers; -using Artemis.Events; using Caliburn.Micro; using Ninject.Extensions.Logging; +using Brush = System.Windows.Media.Brush; namespace Artemis.Managers { @@ -13,11 +14,12 @@ namespace Artemis.Managers /// public class LoopManager : IDisposable { + private readonly DeviceManager _deviceManager; private readonly EffectManager _effectManager; private readonly IEventAggregator _events; - private readonly DeviceManager _deviceManager; private readonly ILogger _logger; private readonly Timer _loopTimer; + private int _fpsCount; public LoopManager(ILogger logger, IEventAggregator events, EffectManager effectManager, DeviceManager deviceManager) @@ -27,9 +29,18 @@ namespace Artemis.Managers _effectManager = effectManager; _deviceManager = deviceManager; + // Setup timers _loopTimer = new Timer(40); _loopTimer.Elapsed += Render; _loopTimer.Start(); + + var fpsTimer = new Timer(1000); + fpsTimer.Elapsed += delegate + { + Debug.WriteLine(_fpsCount); + _fpsCount = 0; + }; + fpsTimer.Start(); } /// @@ -121,8 +132,8 @@ namespace Artemis.Managers // Get ActiveEffect's bitmap Bitmap bitmap = null; - System.Windows.Media.Brush mouseBrush = null; - System.Windows.Media.Brush headsetBrush = null; + Brush mouseBrush = null; + Brush headsetBrush = null; var mice = _deviceManager.MiceProviders.Where(m => m.CanUse).ToList(); var headsets = _deviceManager.HeadsetProviders.Where(m => m.CanUse).ToList(); @@ -144,7 +155,10 @@ namespace Artemis.Managers // If no bitmap was generated this frame is done if (bitmap == null) + { + _fpsCount++; return; + } // Fill the bitmap's background with black to avoid trailing colors on some keyboards var fixedBmp = new Bitmap(bitmap.Width, bitmap.Height); @@ -158,6 +172,8 @@ namespace Artemis.Managers // Update the keyboard _deviceManager.ActiveKeyboard?.DrawBitmap(bitmap); + + _fpsCount++; } } } diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs index 0168e8dc6..ed30fc18e 100644 --- a/Artemis/Artemis/Managers/ProfileManager.cs +++ b/Artemis/Artemis/Managers/ProfileManager.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Linq; using System.Timers; -using Artemis.Models; using Artemis.Modules.Effects.ProfilePreview; using Artemis.Settings; using Artemis.ViewModels.Abstract; @@ -15,7 +14,6 @@ namespace Artemis.Managers private readonly EffectManager _effectManager; private readonly ILogger _logger; private readonly LoopManager _loopManager; - private EffectModel _prePreviewEffect; public ProfileManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager, LoopManager loopManager) @@ -54,21 +52,18 @@ namespace Artemis.Managers if (_effectManager.ActiveEffect != ProfilePreviewModel) return; - _logger.Debug("Clear effect after profile preview"); - _effectManager.ClearEffect(); - - if (_prePreviewEffect == null || _prePreviewEffect is GameModel) - return; - - _logger.Debug("Change back effect after profile preview"); - _effectManager.ChangeEffect(_prePreviewEffect); + _logger.Debug("Loading last effect after profile preview"); + var lastEffect = _effectManager.GetLastEffect(); + if (lastEffect != null) + _effectManager.ChangeEffect(lastEffect); + else + _effectManager.ClearEffect(); } else { if (_effectManager.ActiveEffect != ProfilePreviewModel) { _logger.Debug("Activate profile preview"); - _prePreviewEffect = _effectManager.ActiveEffect; _effectManager.ChangeEffect(ProfilePreviewModel); } diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index 66c2e9d73..048dc4c37 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -23,6 +23,10 @@ namespace Artemis.Models DataModel = dataModel; } + // Used by profile system + public IDataModel DataModel { get; set; } + public ProfileModel Profile { get; set; } + public abstract void Dispose(); // Called on creation @@ -31,12 +35,9 @@ namespace Artemis.Models // Called every frame public abstract void Update(); - // Used by profile system - public IDataModel DataModel { get; set; } - public ProfileModel Profile { get; set; } - // Called after every update - public virtual void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets) + public virtual void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, + bool renderHeadsets) { keyboard = null; mouse = null; @@ -49,7 +50,8 @@ namespace Artemis.Models var renderLayers = GetRenderLayers(renderMice, renderHeadsets); // Render the keyboard layer-by-layer - keyboard = Profile.GenerateBitmap(renderLayers, DataModel, MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(4), false, true); + keyboard = Profile.GenerateBitmap(renderLayers, DataModel, + MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(4), false, true); // Render the first enabled mouse (will default to null if renderMice was false) mouse = Profile.GenerateBrush(renderLayers.LastOrDefault(l => l.LayerType == LayerType.Mouse), DataModel); // Render the first enabled headset (will default to null if renderHeadsets was false) diff --git a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileDataModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileDataModel.cs index 6b35318af..74c31722f 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileDataModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileDataModel.cs @@ -1,4 +1,5 @@ using Artemis.Models.Interfaces; +using SpotifyAPI.Local.Models; namespace Artemis.Modules.Effects.WindowsProfile { @@ -27,6 +28,7 @@ namespace Artemis.Modules.Effects.WindowsProfile } public class Spotify { + public bool Running { get; set; } public string Artist { get; set; } public string SongName { get; set; } public int SongPercentCompleted { get; set; } diff --git a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs index f550df9c5..805444d2f 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs @@ -105,16 +105,25 @@ namespace Artemis.Modules.Effects.WindowsProfile { StatusResponse status = _spotify.GetStatus(); if (status == null) + { + dataModel.Spotify.Running = false; return; + } - dataModel.Spotify.Artist = status.Track.ArtistResource.Name; - dataModel.Spotify.SongName = status.Track.TrackResource.Name; - dataModel.Spotify.SongPercentCompleted = (int) (status.PlayingPosition/status.Track.Length*100.0); + dataModel.Spotify.Running = true; dataModel.Spotify.SpotifyVolume = (int)(status.Volume * 100); - dataModel.Spotify.Album = status.Track.AlbumResource.Name; dataModel.Spotify.Repeat = status.Repeat; dataModel.Spotify.Shuffle = status.Shuffle; dataModel.Spotify.Playing = status.Playing; + + // Only update track info if not null + if (status.Track == null) + return; + + dataModel.Spotify.Artist = status.Track.ArtistResource?.Name; + dataModel.Spotify.SongName = status.Track.TrackResource?.Name; + dataModel.Spotify.SongPercentCompleted = (int)(status.PlayingPosition / status.Track.Length * 100.0); + dataModel.Spotify.Album = status.Track.AlbumResource?.Name; } } } \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs index 7fe270433..67d1e7725 100644 --- a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.IO; using System.Linq; +using System.Timers; using System.Xml.Serialization; using Artemis.Models.Interfaces; using Artemis.Models.Profiles; @@ -40,6 +41,7 @@ namespace Artemis.ViewModels.Profiles .Select(c => new LayerConditionViewModel(this, c, DataModelProps))); PropertyChanged += PropertiesViewModelHandler; + PreSelect(); }