Files
Artemis/Artemis/Artemis/Managers/MainManager.cs
T
Robert Beekman c294f6d84a 1.2.0 (#127)
* Changed Rocket League to no longer rely on float but int for boost reading

* Small fixes
Fixed layer sometimes losing it's parent after edit
Reoganized layer type view(models)
Added animations to headsets (broken for Corsair atm)

* Working toward 1.2.0
Fixed sliding animations sometimes leaving a blank pixel
Added a 'new folder' button (resolves #123)
Added official G810 support (needs testing, shares profiles with the G910, resolves #114)
Added support for generic Logitech RGB devices (needs testing, pretends to be a headset for now, resolves #45)

* Implemented a generic fix for transparency issues

* Rendering cleanup
Added a RenderFrame class to encapsulate all bitmaps that must be rendered
LayerTypes now define a target device
LayerTypes can set wheter to be drawn in the editor or not
Added Generic device type

* Resharper cleanup

* Fixed startup issues, together with the refactor this resolves #111 it seems.

* Fixed profile editor crash
Fixed boolean condition not showing last value in editor

* Added missing generic device type usage check

* Generic device fixes

* Fixed folder cloning
Fixed unsaved changes false-positive

* Profile editor no longer takes over keyboard if a game is running
Updated Rocket League for 1.21

* Added JsonIgnore to ILayerType properties
Renamed Generic device to Generic (Logitech)

* Reduced profile editor CPU usage

* Non-keyboard types clean up keyboard properties when selected
Fixed a crash while saving

* Added layer resize on import
Null reference fixes
Cleaned up JSON some more
Added default animation to layer (NoneAnimation)
Removed unnecessary layer properties casts

* Updated default profiles for all keyboards

* Bumped version number to 1.2.0
2016-07-19 21:56:58 +02:00

148 lines
5.1 KiB
C#

using System;
using System.Diagnostics;
using System.Linq;
using System.Timers;
using Artemis.Events;
using Artemis.Models;
using Artemis.Modules.Effects.ProfilePreview;
using Artemis.Utilities.GameState;
using Artemis.Utilities.Keyboard;
using Artemis.Utilities.LogitechDll;
using Artemis.ViewModels;
using Caliburn.Micro;
using Ninject;
using Ninject.Extensions.Logging;
namespace Artemis.Managers
{
/// <summary>
/// Contains all the other managers and non-loop related components
/// </summary>
public class MainManager : IDisposable
{
public delegate void PauseCallbackHandler();
private readonly IEventAggregator _events;
private readonly Timer _processTimer;
public MainManager(IEventAggregator events, ILogger logger, LoopManager loopManager,
DeviceManager deviceManager, EffectManager effectManager, ProfileManager profileManager)
{
_events = events;
Logger = logger;
LoopManager = loopManager;
DeviceManager = deviceManager;
EffectManager = effectManager;
ProfileManager = profileManager;
_processTimer = new Timer(1000);
_processTimer.Elapsed += ScanProcesses;
_processTimer.Start();
ProgramEnabled = false;
Running = false;
// TODO: Dependency inject utilities?
KeyboardHook = new KeyboardHook();
// Create and start the web server
GameStateWebServer = new GameStateWebServer();
GameStateWebServer.Start();
// Start the named pipe
PipeServer = new PipeServer();
PipeServer.Start("artemis");
Logger.Info("Intialized MainManager");
}
[Inject]
public Lazy<ShellViewModel> ShellViewModel { get; set; }
public ILogger Logger { get; set; }
public LoopManager LoopManager { get; }
public DeviceManager DeviceManager { get; set; }
public EffectManager EffectManager { get; set; }
public ProfileManager ProfileManager { get; set; }
public PipeServer PipeServer { get; set; }
public KeyboardHook KeyboardHook { get; set; }
public GameStateWebServer GameStateWebServer { get; set; }
public bool ProgramEnabled { get; private set; }
public bool Running { get; private set; }
public void Dispose()
{
Logger.Debug("Shutting down MainManager");
_processTimer?.Stop();
_processTimer?.Dispose();
LoopManager?.Stop();
EffectManager?.ActiveEffect?.Dispose();
GameStateWebServer?.Stop();
PipeServer?.Stop();
}
/// <summary>
/// Loads the last active effect and starts the program
/// </summary>
public void EnableProgram()
{
Logger.Debug("Enabling program");
ProgramEnabled = true;
LoopManager.StartAsync();
_events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled));
}
/// <summary>
/// Stops the program
/// </summary>
public void DisableProgram()
{
Logger.Debug("Disabling program");
LoopManager.Stop();
ProgramEnabled = false;
_events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled));
}
/// <summary>
/// Manages active games by keeping an eye on their processes
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ScanProcesses(object sender, ElapsedEventArgs e)
{
if (!ProgramEnabled)
return;
var runningProcesses = Process.GetProcesses();
// If the currently active effect is a disabled game, get rid of it.
if (EffectManager.ActiveEffect != null)
EffectManager.DisableInactiveGame();
// If the currently active effect is a no longer running game, get rid of it.
var activeGame = EffectManager.ActiveEffect as GameModel;
if (activeGame != null)
{
if (!runningProcesses.Any(p => p.ProcessName == activeGame.ProcessName && p.HasExited == false))
{
Logger.Info("Disabling game: {0}", activeGame.Name);
EffectManager.DisableGame(activeGame);
}
}
// Look for running games, stopping on the first one that's found.
var newGame = EffectManager.EnabledGames
.FirstOrDefault(g => runningProcesses
.Any(p => p.ProcessName == g.ProcessName && p.HasExited == false));
if (newGame == null || EffectManager.ActiveEffect == newGame)
return;
// If it's not already enabled, do so.
Logger.Info("Detected and enabling game: {0}", newGame.Name);
EffectManager.ChangeEffect(newGame, LoopManager);
}
}
}