private static async Task MiningManagerMainLoop(CancellationToken stop) { try { var checkWaitTime = TimeSpan.FromMilliseconds(50); Func <bool> isActive = () => !stop.IsCancellationRequested; // sleep time setting is minimal 1 minute, 19-20s interval var preventSleepIntervalElapsedTimeChecker = new ElapsedTimeChecker(TimeSpan.FromSeconds(19), true); Logger.Info(Tag, "Starting MiningManagerMainLoop"); while (isActive()) { if (isActive()) { await TaskHelpers.TryDelay(checkWaitTime, stop); } // prevent sleep check if (isActive() && preventSleepIntervalElapsedTimeChecker.CheckAndMarkElapsedTime()) { var isMining = IsMiningEnabled; if (isMining) { PInvokeHelpers.PreventSleep(); } else { PInvokeHelpers.AllowMonitorPowerdownAndSleep(); } } // TODO should we check internet interval here??? } } catch (TaskCanceledException e) { Logger.Info(Tag, $"MiningManagerMainLoop TaskCanceledException: {e.Message}"); } catch (Exception e) { Logger.Error(Tag, $"TaskCanceledException Exception: {e.Message}"); } finally { Logger.Info(Tag, "Exiting MiningManagerMainLoop run cleanup"); // cleanup PInvokeHelpers.AllowMonitorPowerdownAndSleep(); } }
private static async Task MainLoop(CancellationToken stop) { try { var checkWaitTime = TimeSpan.FromMilliseconds(50); Func<bool> isActive = () => !stop.IsCancellationRequested; // TODO set this interval somwhere // periodically update the plugin list var getOnlineMinerPluginsElapsedTimeChecker = new ElapsedTimeChecker(MinerPluginsUpdaterSettings.CheckPluginsInterval, false); // TODO for now every minute check // TODO debug only we should check plugin updates after we update the miner plugin API //var pluginsUpdateElapsedTimeChecker = new ElapsedTimeChecker(TimeSpan.FromSeconds(30), false); var restartActiveDevicesPluginsList = new List<string>(); Logger.Debug("MinerPluginsManager", $"STARTING MAIN LOOP"); while (isActive()) { try { if (isActive()) await TaskHelpers.TryDelay(checkWaitTime, stop); if (isActive() && getOnlineMinerPluginsElapsedTimeChecker.CheckAndMarkElapsedTime() && UpdateSettings.Instance.AutoUpdateMinerPlugins) { Logger.Debug("MinerPluginsManager", $"Checking for plugin updates"); // TODO Cross refference online plugins var success = await GetOnlineMinerPlugins(); if (success) { Logger.Debug("MinerPluginsManager", $"Checking for plugin updates SUCCESS"); CrossReferenceInstalledWithOnline(); // TODO check settings for plugins updates installs // TODO install online compatible plugins Logger.Debug("MinerPluginsManager", $"Checking plugins to Install/Update"); foreach (var packageInfoCR in PluginsPackagesInfosCRs) { var pluginUUID = packageInfoCR.Key; // plugin updates cases var installed = packageInfoCR.Value.Installed; var supportedAndCompatible = packageInfoCR.Value.CompatibleNHPluginVersion && packageInfoCR.Value.Supported; var updatesEnabled = packageInfoCR.Value.IsAutoUpdateEnabled; var canUpdate = supportedAndCompatible && installed && packageInfoCR.Value.HasNewerVersion; var compatibleNotInstalled = !installed && supportedAndCompatible && false; // disable by default var isInstalling = MinerPluginInstallTasks.ContainsKey(pluginUUID); if (updatesEnabled && !isInstalling && (canUpdate || compatibleNotInstalled)) { Logger.Debug("MinerPluginsManager", $"Main loop Install/Update {packageInfoCR.Key}"); IProgress<Tuple<PluginInstallProgressState, int>> progress = null; if (_minerPluginInstallTasksProgress.TryGetValue(pluginUUID, out progress)) { // TODO log no progress } _ = DownloadAndInstall(pluginUUID, progress); } } // check plugins to instal } else { Logger.Debug("MinerPluginsManager", $"Checking for plugin updates FAIL"); } } // TODO trigger active device re-evaluation after install/remove/updates are finished if (isActive() && (_minerPluginInstallRemoveStates.Count + restartActiveDevicesPluginsList.Count) > 0) { var finishedKeys = new List<string>(); foreach (var kvp in _minerPluginInstallRemoveStates) { if (kvp.Value != PluginInstallRemoveState.Remove && kvp.Value != PluginInstallRemoveState.InstallOrUpdate) { restartActiveDevicesPluginsList.Add(kvp.Key); finishedKeys.Add(kvp.Key); } Logger.DebugDelayed("MinerPluginsManager", $"_minerPluginInstallRemoveStates {kvp.Key}-{kvp.Value.ToString()}", TimeSpan.FromSeconds(5)); } var allRemoved = true; foreach (var key in finishedKeys) { allRemoved &= _minerPluginInstallRemoveStates.TryRemove(key, out var _); } if (!allRemoved) { Logger.DebugDelayed("MinerPluginsManager", $"_minerPluginInstallRemoveStates allRemoved false", TimeSpan.FromSeconds(5)); } if (_minerPluginInstallRemoveStates.Count == 0) { restartActiveDevicesPluginsList.Clear(); Logger.DebugDelayed("MinerPluginsManager", $"RESTART ACTIVE DEVICES", TimeSpan.FromSeconds(5)); _ = ApplicationStateManager.RestartDevicesState(); } else { Logger.DebugDelayed("MinerPluginsManager", $"SKIP!!!!!!!!!!!!!!! RESTART ACTIVE DEVICES", TimeSpan.FromSeconds(5)); } } } catch (TaskCanceledException e) { Logger.Info("MinerPluginsManager", $"Main Loop TaskCanceledException {e.Message}"); return; } catch (Exception e) { Logger.Error("MinerPluginsManager", $"Main Loop Tick Exception {e.Message}"); } } } finally { Logger.Debug("MinerPluginsManager", $"EXITING MAIN LOOP"); // cleanup var pluginUUIDs = MinerPluginInstallTasks.Keys; foreach (var pluginUUID in pluginUUIDs) { TryCancelInstall(pluginUUID); } } }