예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
            }
        }