Manages the main programn loop
Наследование: IDisposable
Пример #1
0
 /// <summary>
 ///     Loads the last active effect and starts the program
 /// </summary>
 public void EnableProgram()
 {
     Logger.Debug("Enabling program");
     ProgramEnabled = true;
     LoopManager.StartAsync();
     RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled));
 }
Пример #2
0
        public MainManager(ILogger logger, LoopManager loopManager, DeviceManager deviceManager,
            EffectManager effectManager, ProfileManager profileManager, PipeServer pipeServer)
        {
            Logger = logger;
            LoopManager = loopManager;
            DeviceManager = deviceManager;
            EffectManager = effectManager;
            ProfileManager = profileManager;
            PipeServer = pipeServer;

            _processTimer = new Timer(1000);
            _processTimer.Elapsed += ScanProcesses;
            _processTimer.Start();

            ProgramEnabled = false;
            Running = false;

            // Create and start the web server
            GameStateWebServer = new GameStateWebServer(logger);
            GameStateWebServer.Start();

            // Start the named pipe
            PipeServer.Start("artemis");

            // Start the update task
            var updateTask = new Task(Updater.UpdateApp);
            updateTask.Start();

            Logger.Info("Intialized MainManager");
            Logger.Info($"Artemis version {Assembly.GetExecutingAssembly().GetName().Version} is ready!");
        }
Пример #3
0
        public MainManager(ILogger logger, LoopManager loopManager, DeviceManager deviceManager,
                           ModuleManager moduleManager, PreviewManager previewManager, MigrationManager migrationManager,
                           PipeServer pipeServer, GameStateWebServer gameStateWebServer)
        {
            _migrationManager = migrationManager;
            Logger            = logger;
            LoopManager       = loopManager;
            DeviceManager     = deviceManager;
            ModuleManager     = moduleManager;
            PreviewManager    = previewManager;
            PipeServer        = pipeServer;

            _processTimer          = new Timer(1000);
            _processTimer.Elapsed += ScanProcesses;
            _processTimer.Start();

            ProgramEnabled = false;

            // Create and start the web server
            GameStateWebServer = gameStateWebServer;
            GameStateWebServer.Start();

            // Start the named pipe
            PipeServer.Start("artemis");

            // Listen for power mode changes
            SystemEvents.PowerModeChanged += OnPowerChange;

            Logger.Info("Intialized MainManager");
            Logger.Info($"Artemis version {Assembly.GetExecutingAssembly().GetName().Version} is ready!");
        }
Пример #4
0
 /// <summary>
 ///     Stops the program
 /// </summary>
 public void DisableProgram()
 {
     Logger.Debug("Disabling program");
     LoopManager.Stop();
     ProgramEnabled = false;
     _events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled));
 }
Пример #5
0
        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");
        }
Пример #6
0
 /// <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));
 }
Пример #7
0
        public MainManager(ILogger logger, LoopManager loopManager, DeviceManager deviceManager,
                           EffectManager effectManager, ProfileManager profileManager, PipeServer pipeServer)
        {
            Logger         = logger;
            LoopManager    = loopManager;
            DeviceManager  = deviceManager;
            EffectManager  = effectManager;
            ProfileManager = profileManager;
            PipeServer     = pipeServer;

            _processTimer          = new Timer(1000);
            _processTimer.Elapsed += ScanProcesses;
            _processTimer.Start();

            ProgramEnabled = false;
            Running        = false;

            // Create and start the web server
            GameStateWebServer = new GameStateWebServer(logger);
            GameStateWebServer.Start();

            // Start the named pipe
            PipeServer.Start("artemis");

            // Start the update task
            var updateTask = new Task(Updater.UpdateApp);

            updateTask.Start();

            Logger.Info("Intialized MainManager");
            Logger.Info($"Artemis version {Assembly.GetExecutingAssembly().GetName().Version} is ready!");
        }
Пример #8
0
 /// <summary>
 ///     Stops the program
 /// </summary>
 public void DisableProgram()
 {
     Logger.Debug("Disabling program");
     LoopManager.Stop();
     ProgramEnabled = false;
     RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled));
 }
Пример #9
0
        /// <summary>
        ///     Loads the last active effect and starts the program
        /// </summary>
        public async void EnableProgram()
        {
            Logger.Debug("Enabling program");
            ProgramEnabled = true;
            await LoopManager.StartAsync();

            _migrationManager.MigrateProfiles();
            RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled));
        }
Пример #10
0
        public void Dispose()
        {
            Logger.Debug("Shutting down MainManager");

            _processTimer?.Stop();
            _processTimer?.Dispose();
            LoopManager?.Stop();
            ModuleManager?.ActiveModule?.Dispose();
            GameStateWebServer?.Stop();
            PipeServer?.Stop();
        }
Пример #11
0
        private void DeviceManagerOnOnKeyboardChanged(object sender, KeyboardChangedEventArgs e)
        {
            _deviceManager.OnKeyboardChanged -= DeviceManagerOnOnKeyboardChanged;
            _logger.Debug("Resuming module change");

            var module = _waitEffect;

            _waitEffect = null;
            var loopManager = _waitLoopManager;

            _waitLoopManager = null;

            ChangeActiveModule(module, loopManager);
        }
Пример #12
0
 /// <summary>
 ///     Stops the program
 /// </summary>
 public void DisableProgram()
 {
     Logger.Debug("Disabling program");
     foreach (var overlayModule in ModuleManager.OverlayModules)
     {
         if (overlayModule.Settings.IsEnabled)
         {
             overlayModule.Dispose();
         }
     }
     LoopManager.Stop();
     ProgramEnabled = false;
     RaiseEnabledChangedEvent(new EnabledChangedEventArgs(ProgramEnabled));
 }
Пример #13
0
        private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs e)
        {
            _deviceManager.OnKeyboardChangedEvent -= DeviceManagerOnOnKeyboardChangedEvent;
            _logger.Debug("Resuming effect change");

            var effect = _waitEffect;

            _waitEffect = null;
            var loopManager = _waitLoopManager;

            _waitLoopManager = null;

            ChangeEffect(effect, loopManager);
        }
Пример #14
0
        public ProfileManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager,
            LoopManager loopManager)
        {
            _logger = logger;
            _effectManager = effectManager;
            _deviceManager = deviceManager;
            _loopManager = loopManager;
            _generalSettings = SettingsProvider.Load<GeneralSettings>();

            GameViewModels = new List<GameViewModel>();

            var profilePreviewTimer = new Timer(500);
            profilePreviewTimer.Elapsed += SetupProfilePreview;
            profilePreviewTimer.Start();

            _logger.Info("Intialized ProfileManager");
        }
Пример #15
0
        public ProfileManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager,
                              LoopManager loopManager)
        {
            _logger        = logger;
            _effectManager = effectManager;
            _deviceManager = deviceManager;
            _loopManager   = loopManager;

            GameViewModels = new List <GameViewModel>();

            var profilePreviewTimer = new Timer(500);

            profilePreviewTimer.Elapsed += SetupProfilePreview;
            profilePreviewTimer.Start();

            _logger.Info("Intialized ProfileManager");
        }
Пример #16
0
        public PreviewManager(ILogger logger, ModuleManager moduleManager, DeviceManager deviceManager,
                              LoopManager loopManager)
        {
            _logger          = logger;
            _moduleManager   = moduleManager;
            _deviceManager   = deviceManager;
            _loopManager     = loopManager;
            _generalSettings = SettingsProvider.Load <GeneralSettings>();

            PreviewViewModules = new List <ModuleViewModel>();

            var profilePreviewTimer = new Timer(500);

            profilePreviewTimer.Elapsed += SetupProfilePreview;
            profilePreviewTimer.Start();

            _logger.Info("Intialized PreviewManager");
        }
Пример #17
0
        /// <summary>
        ///     Disables the current effect and changes it to the provided effect.
        /// </summary>
        /// <param name="effectModel">The effect to activate</param>
        /// <param name="loopManager">Optionally pass the LoopManager to automatically start it, if it's not running.</param>
        public void ChangeEffect(EffectModel effectModel, LoopManager loopManager = null)
        {
            if (effectModel == null)
            {
                throw new ArgumentNullException(nameof(effectModel));
            }
            if (effectModel is OverlayModel)
            {
                throw new ArgumentException("Can't set an Overlay effect as the active effect");
            }

            if (_deviceManager.ActiveKeyboard == null)
            {
                _deviceManager.EnableLastKeyboard();
            }
            // If still null, no last keyboard, so stop.
            if (_deviceManager.ActiveKeyboard == null)
            {
                _logger.Debug("Cancelling effect change, no LastKeyboard");
                return;
            }

            // Game models are only used if they are enabled
            var gameModel = effectModel as GameModel;

            if (gameModel != null)
            {
                if (!gameModel.Enabled)
                {
                    _logger.Debug("Cancelling effect change, provided game not enabled");
                    return;
                }
            }


            var wasNull = false;

            if (ActiveEffect == null)
            {
                wasNull      = true;
                ActiveEffect = effectModel;
            }

            lock (ActiveEffect)
            {
                if (!wasNull)
                {
                    ActiveEffect.Dispose();
                }

                ActiveEffect = effectModel;
                ActiveEffect.Enable();
                if (!ActiveEffect.Initialized)
                {
                    _logger.Debug("Cancelling effect change, couldn't initialize the effect ({0})", effectModel.Name);
                    ActiveEffect = null;
                    return;
                }
            }

            if (loopManager != null && !loopManager.Running)
            {
                _logger.Debug("Starting LoopManager for effect change");
                loopManager.StartAsync();
            }

            _logger.Debug("Changed active effect to: {0}", effectModel.Name);

            if (ActiveEffect is GameModel || ActiveEffect is ProfilePreviewModel)
            {
                return;
            }

            // Non-game effects are stored as the new LastEffect.
            General.Default.LastEffect = ActiveEffect?.Name;
            General.Default.Save();
        }
Пример #18
0
        /// <summary>
        ///     Disables the current effect and changes it to the provided effect.
        /// </summary>
        /// <param name="effectModel">The effect to activate</param>
        /// <param name="loopManager">Optionally pass the LoopManager to automatically start it, if it's not running.</param>
        public void ChangeEffect(EffectModel effectModel, LoopManager loopManager = null)
        {
            if (_waitEffect != null)
            {
                _logger.Debug("Stopping effect because a change is already queued");
                return;
            }

            if (effectModel == null)
                throw new ArgumentNullException(nameof(effectModel));
            if (effectModel is OverlayModel)
                throw new ArgumentException("Can't set an Overlay effect as the active effect");

            if (_deviceManager.ActiveKeyboard == null)
            {
                _logger.Debug("Stopping effect change until keyboard is enabled");
                _waitEffect = effectModel;
                _waitLoopManager = loopManager;
                _deviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent;
                _deviceManager.EnableLastKeyboard();
                return;
            }

            // Game models are only used if they are enabled
            var gameModel = effectModel as GameModel;
            if (gameModel != null)
                if (!gameModel.Enabled)
                {
                    _logger.Debug("Cancelling effect change, provided game not enabled");
                    return;
                }


            var wasNull = false;
            if (ActiveEffect == null)
            {
                wasNull = true;
                ActiveEffect = effectModel;
            }

            lock (ActiveEffect)
            {
                if (!wasNull)
                    ActiveEffect.Dispose();

                ActiveEffect = effectModel;
                ActiveEffect.Enable();
                if (!ActiveEffect.Initialized)
                {
                    _logger.Debug("Cancelling effect change, couldn't initialize the effect ({0})", effectModel.Name);
                    ActiveEffect = null;
                    return;
                }
            }

            if (loopManager != null && !loopManager.Running)
            {
                _logger.Debug("Starting LoopManager for effect change");
                loopManager.StartAsync();
            }

            _logger.Debug("Changed active effect to: {0}", effectModel.Name);

            if (ActiveEffect is GameModel || ActiveEffect is ProfilePreviewModel)
                return;

            // Non-game effects are stored as the new LastEffect.
            _generalSettings.LastEffect = ActiveEffect?.Name;
            _generalSettings.Save();
        }
Пример #19
0
        private void DeviceManagerOnOnKeyboardChangedEvent(object sender, KeyboardChangedEventArgs e)
        {
            _deviceManager.OnKeyboardChangedEvent -= DeviceManagerOnOnKeyboardChangedEvent;
            _logger.Debug("Resuming effect change");

            var effect = _waitEffect;
            _waitEffect = null;
            var loopManager = _waitLoopManager;
            _waitLoopManager = null;

            ChangeEffect(effect, loopManager);
        }
Пример #20
0
        /// <summary>
        ///     Disables the current module and changes it to the provided module.
        /// </summary>
        /// <param name="moduleModel">The module to activate</param>
        /// <param name="loopManager">Optionally pass the LoopManager to automatically start it, if it's not running.</param>
        /// <param name="storeAsLast">Whether or not to store this effect as the last effect</param>
        public void ChangeActiveModule(ModuleModel moduleModel, LoopManager loopManager = null, bool storeAsLast = true)
        {
            if (_waitEffect != null)
            {
                _logger.Debug("Stopping module change because a change is already queued");
                return;
            }

            if (moduleModel == null)
            {
                throw new ArgumentNullException(nameof(moduleModel));
            }

            if (_deviceManager.ActiveKeyboard == null)
            {
                _logger.Debug("Stopping module change until keyboard is enabled");
                _waitEffect      = moduleModel;
                _waitLoopManager = loopManager;
                _deviceManager.OnKeyboardChanged += DeviceManagerOnOnKeyboardChanged;
                _deviceManager.EnableLastKeyboard();
                return;
            }

            // Process bound modules are only used if they are enabled
            if (moduleModel.Settings != null && !moduleModel.Settings.IsEnabled && moduleModel.IsBoundToProcess)
            {
                _logger.Debug("Cancelling module change, provided module is process bound and not enabled");
                return;
            }

            var wasNull = false;

            if (ActiveModule == null)
            {
                wasNull      = true;
                ActiveModule = moduleModel;
            }

            lock (ActiveModule)
            {
                if (!wasNull)
                {
                    ActiveModule.Dispose();
                }
                lock (moduleModel)
                {
                    ActiveModule = moduleModel;
                    ActiveModule.Enable();
                    if (!ActiveModule.IsInitialized)
                    {
                        _logger.Debug("Cancelling module change, couldn't initialize the module ({0})", moduleModel.Name);
                        ActiveModule = null;
                        return;
                    }
                }
            }

            if (loopManager != null && !loopManager.Running)
            {
                _logger.Debug("Starting LoopManager for module change");
                loopManager.StartAsync();
            }

            if (!ActiveModule.IsBoundToProcess && !ActiveModule.IsOverlay && storeAsLast)
            {
                _generalSettings.LastModule = ActiveModule?.Name;
                _generalSettings.Save();
            }

            _logger.Debug("Changed active module to: {0}", moduleModel.Name);
            RaiseEffectChangedEvent(new ModuleChangedEventArgs(moduleModel));
        }
Пример #21
0
        /// <summary>
        ///     Disables the current effect and changes it to the provided effect.
        /// </summary>
        /// <param name="effectModel">The effect to activate</param>
        /// <param name="loopManager">Optionally pass the LoopManager to automatically start it, if it's not running.</param>
        public void ChangeEffect(EffectModel effectModel, LoopManager loopManager = null)
        {
            if (_waitEffect != null)
            {
                _logger.Debug("Stopping effect because a change is already queued");
                return;
            }

            if (effectModel == null)
            {
                throw new ArgumentNullException(nameof(effectModel));
            }
            if (effectModel is OverlayModel)
            {
                throw new ArgumentException("Can't set an Overlay effect as the active effect");
            }

            if (_deviceManager.ActiveKeyboard == null)
            {
                _logger.Debug("Stopping effect change until keyboard is enabled");
                _waitEffect      = effectModel;
                _waitLoopManager = loopManager;
                _deviceManager.OnKeyboardChangedEvent += DeviceManagerOnOnKeyboardChangedEvent;
                _deviceManager.EnableLastKeyboard();
                return;
            }

            // Game models are only used if they are enabled
            var gameModel = effectModel as GameModel;

            if (gameModel != null)
            {
                if (!gameModel.Enabled)
                {
                    _logger.Debug("Cancelling effect change, provided game not enabled");
                    return;
                }
            }


            var wasNull = false;

            if (ActiveEffect == null)
            {
                wasNull      = true;
                ActiveEffect = effectModel;
            }

            lock (ActiveEffect)
            {
                if (!wasNull)
                {
                    ActiveEffect.Dispose();
                }

                ActiveEffect = effectModel;
                ActiveEffect.Enable();
                if (!ActiveEffect.Initialized)
                {
                    _logger.Debug("Cancelling effect change, couldn't initialize the effect ({0})", effectModel.Name);
                    ActiveEffect = null;
                    return;
                }
            }

            if (loopManager != null && !loopManager.Running)
            {
                _logger.Debug("Starting LoopManager for effect change");
                loopManager.StartAsync();
            }

            _logger.Debug("Changed active effect to: {0}", effectModel.Name);

            if (ActiveEffect is GameModel || ActiveEffect is ProfilePreviewModel)
            {
                return;
            }

            // Non-game effects are stored as the new LastEffect.
            _generalSettings.LastEffect = ActiveEffect?.Name;
            _generalSettings.Save();
        }