internal void WakeAfterStartupOrResume(PowerOnOffState state = PowerOnOffState.StartUp, bool checkUserSession = true) { var wakeDevices = Devices.Where(d => state == PowerOnOffState.StartUp && d.PowerOnAfterStartup || state == PowerOnOffState.Resume && d.PowerOnAfterResume || state == PowerOnOffState.ScreenSaver && d.PowerSwitchOnScreenSaver); PowerOnDevices(wakeDevices, state, checkUserSession); }
public void PowerOnDevices(IEnumerable <LgDevice> devices, PowerOnOffState state = PowerOnOffState.StartUp, bool checkUserSession = true) { if (!devices.Any()) { return; } if (checkUserSession && !UserSessionInfo.UserLocalSession) { Logger.Debug($"WakeAfterStartupOrResume: not waking because session info indicates no local session"); return; } var resumeScript = Path.Combine(Program.DataDir, "ResumeScript.bat"); var tasks = new List <Task>(); foreach (var device in devices) { if (!device.PowerOnAfterManualPowerOff && device.PoweredOffBy == LgDevice.PowerOffSource.Manually) { Logger.Debug($"[{device.Name}]: device was manually powered off by user, not powering on"); continue; } device.DisposeConnection(); var task = device.WakeAndConnectWithRetries(Config.PowerOnRetries); tasks.Add(task); } if (File.Exists(resumeScript)) { var waitTask = Task.WhenAll(tasks.ToArray()); Utils.WaitForTask(waitTask); Utils.StartProcess(resumeScript, hidden: true); } }
public void PowerOffDevices(IEnumerable <LgDevice> devices, PowerOnOffState state = PowerOnOffState.ShutDown) { if (!devices.Any()) { return; } if (NativeMethods.GetAsyncKeyState(NativeConstants.VK_CONTROL) < 0 || NativeMethods.GetAsyncKeyState(NativeConstants.VK_RCONTROL) < 0) { Logger.Debug("Not powering off because CONTROL-key is down"); return; } NativeMethods.SetThreadExecutionState(NativeConstants.ES_CONTINUOUS | NativeConstants.ES_SYSTEM_REQUIRED | NativeConstants.ES_AWAYMODE_REQUIRED); try { if (state == PowerOnOffState.ShutDown) { var sleep = Config.ShutdownDelay; Logger.Debug($"PowerOffDevices: Waiting for {sleep} milliseconds..."); while (sleep > 0 && _restartDetector?.PowerOffDetected == false) { Thread.Sleep(100); if (_restartDetector != null && (_restartDetector.RestartDetected || _restartDetector.IsRebootInProgress())) { Logger.Debug("Not powering off because of a restart"); return; } sleep -= 100; } } Logger.Debug("Powering off tv(s)..."); var tasks = new List <Task>(); foreach (var device in devices) { var task = device.PowerOff(true); tasks.Add(task); } if (state == PowerOnOffState.StandBy) { var standByScript = Path.Combine(Program.DataDir, "StandByScript.bat"); if (File.Exists(standByScript)) { Utils.StartProcess(standByScript, hidden: true, wait: true); } } var waitTask = Task.WhenAll(tasks.ToArray()); Utils.WaitForTask(waitTask); Logger.Debug("Done powering off tv(s)"); } finally { NativeMethods.SetThreadExecutionState(NativeConstants.ES_CONTINUOUS); } }