namespace RadeonResetBugFixService { using System; using System.IO; using System.Reflection; using Contracts; using Logging; using Tasks; class MainHandler { private string LogFilename { get; } private DevicesStatus StartupDevicesStatus { get; } = new DevicesStatus(); private DevicesStatus ShutdownDevicesStatus { get; } = new DevicesStatus(); private object Mutex = new object(); public MainHandler() { var date = DateTime.Now; this.LogFilename = Path.Combine( Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "logs", $"radeonfix_{date:yyyyMMdd}_{date:HHmmss}.log"); } public void HandleLog(string message) { using (ILogger fileLogger = new FileLogger(this.LogFilename)) { fileLogger.Log(message); } } public void HandleStartup(string reason) { using (var fileLogger = new FileLogger(this.LogFilename)) { using (ILogger logger = new TaskLoggerWrapper(fileLogger, "Startup")) { logger.Log($"Reason: {reason}"); try { lock (this.Mutex) { TasksProcessor.ProcessTasks( logger, new ITask[] { new EnableBasicDisplayStartupTask(), new SleepTask(TimeSpan.FromSeconds(20)), new DisableVirtualVideoTask(this.StartupDevicesStatus), new EnableAmdVideoTask(this.StartupDevicesStatus), new SleepTask(TimeSpan.FromSeconds(40)), new FixMonitorTask(), new DisableVirtualVideoTask(this.StartupDevicesStatus), new FixMonitorTask(), }); } } catch (Exception e) { logger.LogError(e.ToString()); } } } } public void HandleShutdown(string reason) { using (var fileLogger = new FileLogger(this.LogFilename)) { using (ILogger logger = new TaskLoggerWrapper(fileLogger, "Shutdown")) { logger.Log($"Reason: {reason}"); try { lock (this.Mutex) { TasksProcessor.ProcessTasks( logger, new ITask[] { new StopAudioServiceTask(), new SleepTask(TimeSpan.FromSeconds(15)), new DisableAmdVideoTask(this.ShutdownDevicesStatus), new EnableVirtualVideoTask(this.ShutdownDevicesStatus), new LastResortDevicesRestoreTask(this.StartupDevicesStatus), new LastResortDevicesRestoreTask(this.StartupDevicesStatus), // just in case new DisableBasicDisplayStartupTask(), }); } } catch (Exception e) { logger.LogError(e.ToString()); } } } } } }