コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
                }
            }            
        }