From 666990eacd0f8fd9d541aa4927a6b450b0a19d7c Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 14 Oct 2022 12:19:53 +0200 Subject: [PATCH 001/224] updated to nhmws4, added version info and os version --- src/NHM.Common/NHM.Common.csproj | 4 ++-- src/NHMCore/NHMCore.csproj | 4 ++-- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/NHM.Common/NHM.Common.csproj b/src/NHM.Common/NHM.Common.csproj index 73d17b805..fb6051148 100644 --- a/src/NHM.Common/NHM.Common.csproj +++ b/src/NHM.Common/NHM.Common.csproj @@ -8,12 +8,12 @@ 1701;1702;CA1416 - $(DefineConstants)TRACE + $(DefineConstants)TRACE;NHMWS4 1701;1702;CA1416 - $(DefineConstants)TRACE + $(DefineConstants)TRACE;NHMWS4 diff --git a/src/NHMCore/NHMCore.csproj b/src/NHMCore/NHMCore.csproj index 0271c61e8..103aa2af8 100644 --- a/src/NHMCore/NHMCore.csproj +++ b/src/NHMCore/NHMCore.csproj @@ -26,12 +26,12 @@ x64 ..\..\Debug\app\ - TRACE;DEBUG;INTEGRATE_Joker_PLUGIN + TRACE;DEBUG;INTEGRATE_Joker_PLUGIN;NHMWS4 x64 ..\..\Release\app\ - TRACE;INTEGRATE_Joker_PLUGIN + TRACE;INTEGRATE_Joker_PLUGIN;NHMWS4 true diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 898df8c68..7bb630337 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -231,7 +231,7 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) Btc = btc, Worker = worker, RigID = rigID, - Version = new List { $"NHM/{NHMApplication.ProductVersion}", "NA/NA" }, + Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, OptionalMutableProperties = new List { new OptionalMutablePropertyString From 1a21e78463d7c51b521f5968ce5fbe51e963d60f Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 25 Oct 2022 09:29:46 +0200 Subject: [PATCH 002/224] dynamic optional values per rig and per device --- .../Enums/DeviceDynamicProperties.cs | 20 +++ src/NHMCore/Mining/ComputeDevice.cs | 1 + src/NHMCore/Nhmws/V4/MessageParserV4.cs | 122 ++++++++++++++---- src/NHMCore/Nhmws/V4/MessagesV4.cs | 6 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 2 +- src/NHMCore/Utils/Helpers.cs | 12 ++ 6 files changed, 132 insertions(+), 31 deletions(-) create mode 100644 src/NHM.Common/Enums/DeviceDynamicProperties.cs diff --git a/src/NHM.Common/Enums/DeviceDynamicProperties.cs b/src/NHM.Common/Enums/DeviceDynamicProperties.cs new file mode 100644 index 000000000..33f4bf511 --- /dev/null +++ b/src/NHM.Common/Enums/DeviceDynamicProperties.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.Common.Enums +{ + public enum DeviceDynamicProperties + { + NONE, + Load, + MemoryControllerLoad, + Temperature, + FanSpeedPercentage, + PowerUsage, + VramTemp, + HotspotTemp + } +} diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 7bc87c481..ff5ae3cf9 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -58,6 +58,7 @@ internal set OnPropertyChanged(); } } + public List SupportedDynamicProperties { get; set; } = new(); // disabled state check public bool IsDisabled => (!Enabled || State == DeviceState.Disabled); diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 7bb630337..187ef63dd 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -4,12 +4,15 @@ using NHM.Common.Enums; using NHM.DeviceMonitoring; using NHM.DeviceMonitoring.TDP; +using NHMCore.Configs; using NHMCore.Mining; using NHMCore.Mining.MiningStats; +using NHMCore.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Windows.ApplicationModel.Contacts; namespace NHMCore.Nhmws.V4 { @@ -57,7 +60,7 @@ private static string GetDevicePlugin(string UUID) return devData.MinerName; } - private static (List<(string name, string unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d) + private static (List<(string name, string unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin) { string getValue(T o) => (typeof(T).Name, o) switch { @@ -77,31 +80,46 @@ private static (List<(string name, string unit)> properties, JArray values) GetD _ => null, }; - (string name, string unit, string value)? pairOrNull(string name, string unit) + (DeviceDynamicProperties type, string name, string unit, string value)? pairOrNull(DeviceDynamicProperties type, string name, string unit) { - if (d.DeviceMonitor is T sensor) return (name, unit, getValue(sensor)); - if (typeof(T) == typeof(string)) return (name, unit, getValueForName(name)); + if (d.DeviceMonitor is T sensor) return (type, name, unit, getValue(sensor)); + if (typeof(T) == typeof(string)) return (type, name, unit, getValueForName(name)); return null; } // here sort manually by type - var dynamicPropertiesWithValues = new List<(string name, string unit, string value)?> + var dynamicPropertiesWithValues = new List<(DeviceDynamicProperties type, string name, string unit, string value)?> { - pairOrNull("Temp.","C"), - pairOrNull("VRAM T.","C"), - pairOrNull("Load","%"), - pairOrNull("MemCtrl Load","%"), - pairOrNull("Fan","%"), - pairOrNull("Power","W"), - pairOrNull("Miner", ""), + pairOrNull(DeviceDynamicProperties.Temperature ,"Temperature","C"), + pairOrNull(DeviceDynamicProperties.VramTemp,"VRAM Temperature","C"), + pairOrNull(DeviceDynamicProperties.Load,"Load","%"), + pairOrNull(DeviceDynamicProperties.MemoryControllerLoad, "MemCtrl Load","%"), + pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan","%"), + pairOrNull(DeviceDynamicProperties.PowerUsage, "Power","W"), + pairOrNull(DeviceDynamicProperties.NONE, "Miner", ""), }; - var deviceOptionalDynamic = dynamicPropertiesWithValues .Where(p => p.HasValue) .Where(p => p.Value.value != null) .Select(p => p.Value) - .ToArray(); + .ToList(); + if (isLogin) + { + bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string unit, string value) dynamicVal) + { + if (dynamicVal.unit == String.Empty) return false; + var ok = Int32.TryParse(dynamicVal.value, out var res); + if (ok && res < 0) return true; + return false; + }; + deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); + deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); + } + foreach (DeviceDynamicProperties i in Enum.GetValues(typeof(DeviceDynamicProperties))) + { + if (!d.SupportedDynamicProperties.Contains(i)) deviceOptionalDynamic.RemoveAll(prop => prop.type == i); + } var optionalDynamicProperties = deviceOptionalDynamic.Select(p => (p.name, p.unit)).ToList(); var values_odv = new JArray(deviceOptionalDynamic.Select(p => p.value)); return (optionalDynamicProperties, values_odv); @@ -221,7 +239,7 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) { "optional", getStaticPropertiesOptionalValues(d) }, }, Actions = createDefaultActions(), - OptionalDynamicProperties = GetDeviceOptionalDynamic(d).properties, + OptionalDynamicProperties = GetDeviceOptionalDynamic(d, true).properties, OptionalMutableProperties = GetDeviceOptionalMutable(d).properties, }; } @@ -232,7 +250,17 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) Worker = worker, RigID = rigID, Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, - OptionalMutableProperties = new List + OptionalMutableProperties = GetRigOptionalMutableValuesLogin(btc, worker), + OptionalDynamicProperties = GetRigOptionalDynamicValuesLogin(), + Actions = createDefaultActions(), + Devices = devices.Select(mapComputeDevice).ToList(), + MinerState = GetMinerStateValues(worker, devices), + }; + return _loginMessage; + } + private static List GetRigOptionalMutableValuesLogin(string btc, string worker) + { + return new List { new OptionalMutablePropertyString { @@ -240,7 +268,7 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) DisplayGroup = 0, DisplayName = "User name", DefaultValue = btc, - Range = (64, null), + Range = (64, String.Empty), }, new OptionalMutablePropertyString { @@ -248,14 +276,32 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) DisplayGroup = 0, DisplayName = "Worker name", DefaultValue = worker, - Range = (64, null), + Range = (64, String.Empty), }, - }, - Actions = createDefaultActions(), - Devices = devices.Select(mapComputeDevice).ToList(), - MinerState = GetMinerStateValues(worker, devices), - }; - return _loginMessage; + }; + } + private static List> GetRigOptionalDynamicValuesLogin() + { + return new List> + { + new List + { + "Uptime", + "s" + }, + new List + { + "IP address" + }, + new List + { + "Profiles bundle id" + }, + new List + { + "Profiles bundle name" + } + }; } private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable devices) @@ -265,6 +311,26 @@ private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable delProp.Remove(); return json; } + private static List GetRigOptionalDynamicValues() + { + var list = new List + { + Helpers.GetElapsedSecondsSinceStart().ToString(), + Helpers.GetLocalIP().ToString(), + String.Empty, //todo + String.Empty + }; + return list; + } + private static List GetRigOptionalMutableValues() + { + var list = new List + { + CredentialsSettings.Instance.BitcoinAddress, + CredentialsSettings.Instance.WorkerName + }; + return list; + } internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices) { @@ -311,8 +377,8 @@ JArray mmv(ComputeDevice d) return new MinerState.DeviceState { - MutableDynamicValues = mdv(d), - OptionalDynamicValues = GetDeviceOptionalDynamic(d).values, // odv + MandatoryDynamicValues = mdv(d), + OptionalDynamicValues = GetDeviceOptionalDynamic(d, false).values, // odv MandatoryMutableValues = mmv(d), OptionalMutableValues = GetDeviceOptionalMutable(d).values, // omv }; @@ -321,9 +387,9 @@ JArray mmv(ComputeDevice d) return new MinerState { MutableDynamicValues = new JArray(rigStateToInt(rig)), - OptionalDynamicValues = new JArray(), + OptionalDynamicValues = new JArray(GetRigOptionalDynamicValues()), MandatoryMutableValues = new JArray(rigStateToInt(rig), workerName), - OptionalMutableValues = new JArray(), + OptionalMutableValues = new JArray(GetRigOptionalMutableValues()), Devices = devices.Select(toDeviceState).ToList(), }; } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index abf536f25..63a26a852 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -26,7 +27,8 @@ internal class LoginMessage : ISendMessage // "static_properties": { ... }, // "optional_dynamic_properties": [ ... ], - + [JsonProperty("optional_dynamic_properties")] + public List> OptionalDynamicProperties { get; set; } [JsonProperty("optional_mutable_properties")] public List OptionalMutableProperties { get; set; } @@ -213,7 +215,7 @@ internal class MinerState : ISendMessage internal class DeviceState { [JsonProperty("mdv")] - public JArray MutableDynamicValues { get; set; } + public JArray MandatoryDynamicValues { get; set; } [JsonProperty("odv")] public JArray OptionalDynamicValues { get; set; } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 619b65df4..de26114a3 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -72,7 +72,7 @@ private enum MessageType static private LoginMessage _login = new LoginMessage { - Version = new List { $"NHM/{NHMApplication.ProductVersion}", "NA/NA" }, + Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, Btc = DemoUser.BTC, }; diff --git a/src/NHMCore/Utils/Helpers.cs b/src/NHMCore/Utils/Helpers.cs index 368e12180..9aba14da7 100644 --- a/src/NHMCore/Utils/Helpers.cs +++ b/src/NHMCore/Utils/Helpers.cs @@ -7,6 +7,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Net; using System.Net.Http; using System.Security.Principal; using System.Threading.Tasks; @@ -19,6 +20,7 @@ public class Helpers : PInvokeHelpers public static bool Is64BitOperatingSystem = Is64BitProcess || InternalCheckIsWow64(); public static readonly bool IsElevated; + private static int StartEpoch = 0; static Helpers() @@ -26,6 +28,7 @@ static Helpers() using var identity = WindowsIdentity.GetCurrent(); var principal = new WindowsPrincipal(identity); IsElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); + StartEpoch = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; } public static bool InternalCheckIsWow64() @@ -282,5 +285,14 @@ private static async Task UploadLogArchive(string tmpArchivePath, string u return false; } } + public static int GetElapsedSecondsSinceStart() + { + var elapsed = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds - StartEpoch; + return elapsed; + } + public static IPAddress GetLocalIP() + { + return IPAddress.Parse(Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].ToString()) ?? IPAddress.None; + } } } From 8a4d93b90a04e23a1880f8bf4f0e2e14415b98a2 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 25 Oct 2022 15:01:22 +0200 Subject: [PATCH 003/224] added some missing interfaces --- .../Core_clock/ICoreClock.cs | 13 +++ .../Core_clock/ICoreClockDelta.cs | 13 +++ .../Core_clock/ICoreClockDeltaSet.cs | 13 +++ .../Core_clock/ICoreClockRange.cs | 14 +++ .../Core_clock/ICoreClockSet.cs | 13 +++ src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 74 ++++++++++++- .../DeviceMonitorNVIDIA.cs | 100 +++++++++++++++++- .../Memory_clock/IMemoryClock.cs | 13 +++ .../Memory_clock/IMemoryClockDelta.cs | 13 +++ .../Memory_clock/IMemoryClockDeltaSet.cs | 13 +++ .../Memory_clock/IMemoryClockRange.cs | 14 +++ .../Memory_clock/IMemoryClockSet.cs | 13 +++ src/NHMCore/Mining/ComputeDevice.cs | 54 ++++++++++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 24 ++++- 14 files changed, 381 insertions(+), 3 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClock.cs create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockSet.cs create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClock.cs create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockSet.cs diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClock.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClock.cs new file mode 100644 index 000000000..d0cde77ae --- /dev/null +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClock.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Core_clock +{ + public interface ICoreClock + { + int CoreClock { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs new file mode 100644 index 000000000..7a7fa5f6f --- /dev/null +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Core_clock +{ + public interface ICoreClockDelta + { + int CoreClockDelta { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs new file mode 100644 index 000000000..fb6976ca6 --- /dev/null +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Core_clock +{ + public interface ICoreClockDeltaSet + { + bool SetCoreClockDelta(int coreClockDelta); + } +} diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs new file mode 100644 index 000000000..990238ea9 --- /dev/null +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Core_clock +{ + public interface ICoreClockRange + { + (int min, int max) CoreClockRange { get; } + (int min, int max) CoreClockDeltaRange { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockSet.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockSet.cs new file mode 100644 index 000000000..1d927f13e --- /dev/null +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockSet.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Core_clock +{ + public interface ICoreClockSet + { + bool SetCoreClock(int coreClock); + } +} diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs index 234cedfa3..d10c6f62e 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs @@ -1,13 +1,18 @@ using NHM.Common; using NHM.DeviceMonitoring.AMD; +using NHM.DeviceMonitoring.Core_clock; +using NHM.DeviceMonitoring.Memory_clock; +using NHM.DeviceMonitoring.NVIDIA; using NHM.DeviceMonitoring.TDP; using System; namespace NHM.DeviceMonitoring { - internal class DeviceMonitorAMD : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemControllerLoad, ISpecialTemps + internal class DeviceMonitorAMD : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange { public int BusID { get; private set; } + private const int RET_OK = 0; + private static readonly TimeSpan _delayedLogging = TimeSpan.FromMinutes(0.5); @@ -217,6 +222,17 @@ public bool SetTDPSimple(TDPSimpleType level) return (-1, -1); } + public bool SetMemoryClock(int memoryClock) + { + return AMD_ODN.nhm_amd_device_set_memory_clocks(BusID, memoryClock) == 0 ? true : false; + } + + public bool SetCoreClock(int coreClock) + { + return AMD_ODN.nhm_amd_device_set_core_clocks(BusID, coreClock) == 0 ? true : false; + } + + public int HotspotTemp { get @@ -242,5 +258,61 @@ public int MemoryControllerLoad return -1; } } + + public int MemoryClock + { + get + { + int memoryClock = 0; + int ok = AMD_ODN.nhm_amd_device_get_memory_clocks(BusID, ref memoryClock); + if (ok == RET_OK) return memoryClock; + Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_memory_clocks failed with error code {ok}", _delayedLogging); + return -1; + } + } + + public int CoreClock + { + get + { + int coreClock = 0; + int ok = AMD_ODN.nhm_amd_device_get_core_clocks(BusID, ref coreClock); + if (ok == RET_OK) return coreClock; + Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_core_clocks failed with error code {ok}", _delayedLogging); + return -1; + } + } + + public (int min, int max) GetMemoryClockRange + { + get + { + int dmcMin = 0; + int dmcMax = 0; + int def = 0; + int ok = AMD_ODN.nhm_amd_device_get_memory_clocks_min_max_default(BusID, ref dmcMin, ref dmcMax, ref def); + if (ok == RET_OK) return (dmcMin, dmcMax); + Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_memory_clocks_min_max_default failed with error code {ok}", _delayedLogging); + return (-1, -1); + } + } + + public (int min, int max) GetMemoryClockDeltaRange => (-1, -1); + + public (int min, int max) CoreClockRange + { + get + { + int dmcMin = 0; + int dmcMax = 0; + int def = 0; + int ok = AMD_ODN.nhm_amd_device_get_core_clocks_min_max_default(BusID, ref dmcMin, ref dmcMax, ref def); + if (ok == RET_OK) return (dmcMin, dmcMax); + Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_core_clocks_min_max_default failed with error code {ok}", _delayedLogging); + return (-1, -1); + } + } + + public (int min, int max) CoreClockDeltaRange => (-1, -1); } } diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index 2112af7ac..7c3b35c25 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -1,4 +1,6 @@ using NHM.Common; +using NHM.DeviceMonitoring.Core_clock; +using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.NVIDIA; using NHM.DeviceMonitoring.TDP; using System; @@ -6,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps + internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClockDelta, IMemoryClockDelta, ICoreClock, IMemoryClock, ICoreClockSet, ICoreClockDeltaSet, IMemoryClockDeltaSet, IMemoryClockRange, ICoreClockRange { private const int RET_OK = 0; public static object _lock = new object(); @@ -248,9 +250,105 @@ public int MemoryControllerLoad return -1; } } + + public int CoreClock + { + get + { + int coreClock = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks(BusID, ref coreClock); + if (ok == RET_OK) return coreClock; + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks failed with error code {ok}", _delayedLogging); + return -1; + } + } + + public int MemoryClock + { + get + { + int memoryClock = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks(BusID, ref memoryClock); + if (ok == RET_OK) return memoryClock; + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks failed with error code {ok}", _delayedLogging); + return -1; + } + } + + public int CoreClockDelta + { + get + { + int coreClockDelta = 0; + int memClockDelta = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_clocks_delta(BusID, ref coreClockDelta, ref memClockDelta); + if (ok == RET_OK) return coreClockDelta; + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_clocks_delta failed with error code {ok}", _delayedLogging); + return -1; + } + } + public int MemoryClockDelta + { + get + { + int coreClockDelta = 0; + int memClockDelta = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_clocks_delta(BusID, ref coreClockDelta, ref memClockDelta); + if (ok == RET_OK) return memClockDelta; + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_clocks_delta failed with error code {ok}", _delayedLogging); + return -1; + } + } + public void PrintMemoryTimings() { NVIDIA_MON.nhm_nvidia_device_print_memory_timings(BusID); } + + public bool SetCoreClock(int coreClock) + { + return NVIDIA_MON.nhm_nvidia_device_set_core_clocks(BusID, coreClock) == 0 ? true : false; + } + public bool SetCoreClockDelta(int coreClockDelta) + { + return NVIDIA_MON.nhm_nvidia_device_set_core_clocks_delta(BusID, coreClockDelta) == 0 ? true : false; + } + + public bool SetMemoryClockDelta(int memoryClockDelta) + { + return NVIDIA_MON.nhm_nvidia_device_set_memory_clocks_delta(BusID, memoryClockDelta) == 0 ? true : false; + } + [Obsolete("Not implemented for NVIDIA")] + public (int min, int max) GetMemoryClockRange => (-1, -1); + public (int min, int max) GetMemoryClockDeltaRange + { + get + { + int dmcMin = 0; + int dmcMax = 0; + int dccMin = 0; + int dccMax = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_oc_limits_delta(BusID, ref dccMin, ref dccMax, ref dmcMin, ref dmcMax); + if(ok == RET_OK) return (dmcMin, dmcMax); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_oc_limits_delta failed with error code {ok}", _delayedLogging); + return (-1, -1); + } + } + [Obsolete("Not implemented for NVIDIA")] + public (int min, int max) CoreClockRange => (-1, -1); + public (int min, int max) CoreClockDeltaRange + { + get + { + int dmcMin = 0; + int dmcMax = 0; + int dccMin = 0; + int dccMax = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_oc_limits_delta(BusID, ref dccMin, ref dccMax, ref dmcMin, ref dmcMax); + if (ok == RET_OK) return (dccMin, dccMax); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_oc_limits_delta failed with error code {ok}", _delayedLogging); + return (-1, -1); + } + } } } diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClock.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClock.cs new file mode 100644 index 000000000..78e300835 --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClock.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClock + { + int MemoryClock { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs new file mode 100644 index 000000000..da7fd1f2e --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockDelta + { + int MemoryClockDelta { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs new file mode 100644 index 000000000..87af03cd2 --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockDeltaSet + { + bool SetMemoryClockDelta(int memoryClockDelta); + } +} diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs new file mode 100644 index 000000000..f641dc139 --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockRange + { + (int min, int max) GetMemoryClockRange { get; } + (int min, int max) GetMemoryClockDeltaRange { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockSet.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockSet.cs new file mode 100644 index 000000000..ef3e06360 --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockSet.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockSet + { + bool SetMemoryClock(int memoryClock); + } +} diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index ff5ae3cf9..53b4f9a8e 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -2,6 +2,8 @@ using NHM.Common.Device; using NHM.Common.Enums; using NHM.DeviceMonitoring; +using NHM.DeviceMonitoring.Core_clock; +using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.TDP; using NHM.UUID; using NHMCore.ApplicationState; @@ -266,6 +268,38 @@ public int MemoryControllerLoad return -1; } } + public int CoreClock + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreClock get) return get.CoreClock; + return -1; + } + } + public int CoreClockDelta + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreClockDelta get) return get.CoreClockDelta; + return -1; + } + } + public int MemoryClock + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is IMemoryClock get) return get.MemoryClock; + return -1; + } + } + public int MemoryClockDelta + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is IMemoryClockDelta get) return get.MemoryClockDelta; + return -1; + } + } #endregion Getters #region Setters @@ -275,6 +309,26 @@ public bool SetPowerMode(TDPSimpleType level) if (CanSetTDP && DeviceMonitor is ITDP set) return set.SetTDPSimple(level); return false; } + public bool SetCoreClock(int coreClock) + { + if(CanSetTDP && DeviceMonitor is ICoreClockSet set) return set.SetCoreClock(coreClock); + return false; + } + public bool SetCoreClockDelta(int coreClockDelta) + { + if(CanSetTDP && DeviceMonitor is ICoreClockDeltaSet set) return set.SetCoreClockDelta(coreClockDelta); + return false; + } + public bool SetMemoryClock(int memoryClock) + { + if(CanSetTDP && DeviceMonitor is IMemoryClockSet set) return set.SetMemoryClock(memoryClock); + return false; + } + public bool SetMemoryClockDelta(int memoryClockDelta) + { + if(CanSetTDP && DeviceMonitor is IMemoryClockDeltaSet set) return set.SetMemoryClockDelta(memoryClockDelta); + return false; + } #endregion diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 187ef63dd..71cbe8aa4 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -3,6 +3,8 @@ using NHM.Common.Device; using NHM.Common.Enums; using NHM.DeviceMonitoring; +using NHM.DeviceMonitoring.Core_clock; +using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.TDP; using NHMCore.Configs; using NHMCore.Mining; @@ -97,6 +99,9 @@ private static (List<(string name, string unit)> properties, JArray values) GetD pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan","%"), pairOrNull(DeviceDynamicProperties.PowerUsage, "Power","W"), pairOrNull(DeviceDynamicProperties.NONE, "Miner", ""), + pairOrNull(DeviceDynamicProperties.NONE, "OC Profile", ""), + pairOrNull(DeviceDynamicProperties.NONE, "Fan profile", ""), + pairOrNull(DeviceDynamicProperties.NONE, "ELP profile", "") }; var deviceOptionalDynamic = dynamicPropertiesWithValues .Where(p => p.HasValue) @@ -135,7 +140,7 @@ List getOptionalMutableProperties(ComputeDevice d) // TODO sort by type var optionalProperties = new List { - valueOrNull(new OptionalMutablePropertyEnum + valueOrNull(new OptionalMutablePropertyEnum //TODO is always included? { PropertyID = OptionalMutableProperty.NextPropertyId(), // TODO this will eat up the ID DisplayName = "TDP Simple", @@ -162,6 +167,23 @@ List getOptionalMutableProperties(ComputeDevice d) } }), }; + //TODO + //if(d.DeviceMonitor is ICoreClockSet) + //{ + + //} + //if(d.DeviceMonitor is ICoreClockDeltaSet) + //{ + + //} + //if(d.DeviceMonitor is IMemoryClockSet) + //{ + + //} + //if (d.DeviceMonitor is IMemoryClockDeltaSet) + //{ + + //} return optionalProperties .Where(p => p != null) .ToList(); From 8be15d30af2459468fa3fdbf4f46ec79ceac0ac6 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 26 Oct 2022 14:23:53 +0200 Subject: [PATCH 004/224] added some interfaces for fan speed --- src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 19 ++++++++++++++++--- .../DeviceMonitorNVIDIA.cs | 13 ++++++++++++- src/NHM.DeviceMonitoring/IResetFanSpeed.cs | 13 +++++++++++++ .../ISetFanSpeedPercentage.cs | 13 +++++++++++++ src/NHMCore/Mining/ComputeDevice.cs | 10 ++++++++++ 5 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/IResetFanSpeed.cs create mode 100644 src/NHM.DeviceMonitoring/ISetFanSpeedPercentage.cs diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs index d10c6f62e..f40ca2a68 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs @@ -8,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorAMD : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange + internal class DeviceMonitorAMD : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage { public int BusID { get; private set; } private const int RET_OK = 0; @@ -224,14 +224,27 @@ public bool SetTDPSimple(TDPSimpleType level) public bool SetMemoryClock(int memoryClock) { - return AMD_ODN.nhm_amd_device_set_memory_clocks(BusID, memoryClock) == 0 ? true : false; + var ok = AMD_ODN.nhm_amd_device_set_memory_clocks(BusID, memoryClock); + if (ok == RET_OK) return true; + Logger.InfoDelayed(LogTag, $"nhm_amd_device_set_memory_clocks failed with error code {ok}", _delayedLogging); + return false; } public bool SetCoreClock(int coreClock) { - return AMD_ODN.nhm_amd_device_set_core_clocks(BusID, coreClock) == 0 ? true : false; + var ok = AMD_ODN.nhm_amd_device_set_core_clocks(BusID, coreClock); + if(ok == RET_OK) return true; + Logger.InfoDelayed(LogTag, $"nhm_amd_device_set_core_clocks failed with error code {ok}", _delayedLogging); + return false; } + public bool SetFanSpeedPercentage(int percentage) + { + var ok = AMD_ODN.nhm_amd_device_set_fan_speed_percentage(BusID, percentage); + if (ok == RET_OK) return true; + Logger.InfoDelayed(LogTag, $"nhm_amd_device_set_fan_speed_percentage failed with error code {ok}", _delayedLogging); + return false; + } public int HotspotTemp { diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index 7c3b35c25..ed4bf7d16 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -8,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClockDelta, IMemoryClockDelta, ICoreClock, IMemoryClock, ICoreClockSet, ICoreClockDeltaSet, IMemoryClockDeltaSet, IMemoryClockRange, ICoreClockRange + internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClockDelta, IMemoryClockDelta, ICoreClock, IMemoryClock, ICoreClockSet, ICoreClockDeltaSet, IMemoryClockDeltaSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed { private const int RET_OK = 0; public static object _lock = new object(); @@ -136,6 +136,17 @@ public bool SetFanSpeedPercentage(int percentage) return true; } + public bool ResetFanSpeedPercentage() + { + int ok = NVIDIA_MON.nhm_nvidia_device_restore_fan_speed(BusID); + if(ok != RET_OK) + { + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_restore_fan_speed failed with error code {ok}", _delayedLogging); + return false; + } + return true; + } + #region ITDP public TDPSettingType SettingType { get; set; } = TDPSettingType.SIMPLE; diff --git a/src/NHM.DeviceMonitoring/IResetFanSpeed.cs b/src/NHM.DeviceMonitoring/IResetFanSpeed.cs new file mode 100644 index 000000000..550338f10 --- /dev/null +++ b/src/NHM.DeviceMonitoring/IResetFanSpeed.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring +{ + public interface IResetFanSpeed + { + bool ResetFanSpeedPercentage(); + } +} diff --git a/src/NHM.DeviceMonitoring/ISetFanSpeedPercentage.cs b/src/NHM.DeviceMonitoring/ISetFanSpeedPercentage.cs new file mode 100644 index 000000000..805a2310b --- /dev/null +++ b/src/NHM.DeviceMonitoring/ISetFanSpeedPercentage.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring +{ + public interface ISetFanSpeedPercentage + { + bool SetFanSpeedPercentage(int percentage); + } +} diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 53b4f9a8e..aa8c55e6a 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -329,6 +329,16 @@ public bool SetMemoryClockDelta(int memoryClockDelta) if(CanSetTDP && DeviceMonitor is IMemoryClockDeltaSet set) return set.SetMemoryClockDelta(memoryClockDelta); return false; } + public bool SetFanSpeedPercentage(int percent) + { + if(DeviceMonitor is ISetFanSpeedPercentage set) return set.SetFanSpeedPercentage(percent); + return false; + } + public bool ResetFanSpeed() + { + if (DeviceMonitor is IResetFanSpeed set) return set.ResetFanSpeedPercentage(); + return false; + } #endregion From 0e451a95f33b1a272f3e6a66664e4eaee02ccffd Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 27 Oct 2022 14:59:34 +0200 Subject: [PATCH 005/224] in progress of adding mutable values --- src/NHMCore/Nhmws/Messages.cs | 28 ++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 270 ++++++++++++++------ src/NHMCore/Nhmws/V4/MessagesV4.cs | 119 ++++++++- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 20 +- src/NHMCore/Nhmws/V4/Nhmws4JSONConverter.cs | 4 +- 5 files changed, 352 insertions(+), 89 deletions(-) diff --git a/src/NHMCore/Nhmws/Messages.cs b/src/NHMCore/Nhmws/Messages.cs index 5cd300252..482b18287 100644 --- a/src/NHMCore/Nhmws/Messages.cs +++ b/src/NHMCore/Nhmws/Messages.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using NHMCore.Nhmws.V4; using System.Collections.Generic; namespace NHMCore.Nhmws @@ -184,6 +185,33 @@ internal class MinerReset : IReceiveRpcMessage public string Level { get; set; } } + internal class MinerCallAction : IReceiveRpcMessage //todo in progress + { + [JsonProperty("method")] + public string Method => "miner.call.action"; + [JsonProperty("id")] + public int Id { get; set; } + [JsonProperty("device_id")] + public string DeviceId { get; set; } + [JsonProperty("action_id")] + public int ActionId { get; set; } + [JsonProperty("parameters")] + public List Parameters { get; set; } + } + + internal class MinerSetMutable : IReceiveRpcMessage //todo in progress + { + [JsonProperty("method")] + public string Method => "miner.set.mutable"; + [JsonProperty("id")] + public int Id { get; set; } + [JsonProperty("properties")] + List Properties { get; set; } + [JsonProperty("devices")] + List Devices { get; set; } + + } + // RPC response internal class ExecutedCall : ISendMessage { diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 71cbe8aa4..152bbe8f3 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -42,6 +42,8 @@ internal static IMethod ParseMessage(string jsonData) "mining.stop" => JsonConvert.DeserializeObject(jsonData), "mining.set.power_mode" => JsonConvert.DeserializeObject(jsonData), "miner.reset" => JsonConvert.DeserializeObject(jsonData), + "miner.call.action" => JsonConvert.DeserializeObject(jsonData), + "miner.set.mutable" => JsonConvert.DeserializeObject(jsonData), // non supported _ => throw new Exception($"Unable to deserialize '{jsonData}' got method '{method}'."), }; @@ -79,6 +81,9 @@ private static (List<(string name, string unit)> properties, JArray values) GetD string getValueForName(string name) => name switch { "Miner" => $"{GetDevicePlugin(d.Uuid)}", + "OC profile" => $"", //TODO + "Fan profile" => $"", //TODO + "ELP profile" => $"", //TODO _ => null, }; @@ -99,7 +104,7 @@ private static (List<(string name, string unit)> properties, JArray values) GetD pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan","%"), pairOrNull(DeviceDynamicProperties.PowerUsage, "Power","W"), pairOrNull(DeviceDynamicProperties.NONE, "Miner", ""), - pairOrNull(DeviceDynamicProperties.NONE, "OC Profile", ""), + pairOrNull(DeviceDynamicProperties.NONE, "OC profile", ""), pairOrNull(DeviceDynamicProperties.NONE, "Fan profile", ""), pairOrNull(DeviceDynamicProperties.NONE, "ELP profile", "") }; @@ -138,40 +143,54 @@ private static (List properties, JArray values) GetDevi List getOptionalMutableProperties(ComputeDevice d) { // TODO sort by type - var optionalProperties = new List + var optionalProperties = new List(); + optionalProperties.Add(new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Miners settings", + DefaultValue = "", + Range = (2048, "") + }); + if (d.DeviceMonitor is ITDP tdp) + { + optionalProperties.Add(valueOrNull(new OptionalMutablePropertyEnum //TODO is always included? { - valueOrNull(new OptionalMutablePropertyEnum //TODO is always included? + PropertyID = OptionalMutableProperty.NextPropertyId(), // TODO this will eat up the ID + DisplayName = "TDP Simple", + DefaultValue = "Medium", + Range = new List { "Low", "Medium", "High" }, + // TODO action/setter to execute + ExecuteTask = async (object p) => { - PropertyID = OptionalMutableProperty.NextPropertyId(), // TODO this will eat up the ID - DisplayName = "TDP Simple", - DefaultValue = "Medium", - Range = new List{ "Low", "Medium", "High" }, - // TODO action/setter to execute - ExecuteTask = async (object p) => - { - // #1 validate JSON input - if (p is string pstr && pstr is not null) return Task.FromResult(null); - // TODO do something - return Task.FromResult(null); - }, - GetValue = () => + // #1 validate JSON input + if (p is string pstr && pstr is not null) return Task.FromResult(null); + // TODO do something + return Task.FromResult(null); + }, + GetValue = () => + { + var ret = d.TDPSimple switch { - var ret = d.TDPSimple switch - { - TDPSimpleType.LOW => "Low", - TDPSimpleType.MEDIUM => "Medium", - TDPSimpleType.HIGH => "High", - _ => "ERROR", - }; - return ret; - } - }), - }; - //TODO - //if(d.DeviceMonitor is ICoreClockSet) - //{ - - //} + TDPSimpleType.LOW => "Low", + TDPSimpleType.MEDIUM => "Medium", + TDPSimpleType.HIGH => "High", + _ => "ERROR", + }; + return ret; + } + })); + } + if (d.DeviceMonitor is ICoreClockSet) + { + optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayName = "Core clock", + DefaultValue = 0,// WHAT HERE? value now? probaBLY not it can reconnect or was ever + Range = (0, 100)// HERE MIN MAX DEF + })); + } //if(d.DeviceMonitor is ICoreClockDeltaSet) //{ @@ -207,49 +226,11 @@ public static LoginMessage CreateLoginMessage(string btc, string worker, string var sorted = SortedDevices(devices); if (_loginMessage != null) return _loginMessage; - List createDefaultActions() => - new List - { - new NhnwsAction - { - ActionID = NhnwsAction.NextActionId(), - DisplayName = "Mining start", - DisplayGroup = 1, - }, - new NhnwsAction - { - ActionID = NhnwsAction.NextActionId(), - DisplayName = "Mining stop", - DisplayGroup = 1, - }, - new NhnwsAction - { - ActionID = NhnwsAction.NextActionId(), - DisplayName = "Mining enable", - DisplayGroup = 1, - }, - new NhnwsAction - { - ActionID = NhnwsAction.NextActionId(), - DisplayName = "Mining disable", - DisplayGroup = 1, - }, - }; + Device mapComputeDevice(ComputeDevice d) { - List getStaticPropertiesOptionalValues(ComputeDevice d) - { - return d.BaseDevice switch - { - IGpuDevice gpu => new List - { - new JArray("bus_id", $"{gpu.PCIeBusID}"), - new JArray("vram", $"{gpu.GpuRam}"), - }, - _ => new List { }, - }; - } + return new Device { @@ -258,9 +239,9 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) { "device_id", d.B64Uuid }, { "class", $"{(int)d.DeviceType}" }, { "name", d.Name }, - { "optional", getStaticPropertiesOptionalValues(d) }, + { "optional", GetStaticPropertiesOptionalValues(d) }, }, - Actions = createDefaultActions(), + Actions = CreateDefaultDeviceActions(), OptionalDynamicProperties = GetDeviceOptionalDynamic(d, true).properties, OptionalMutableProperties = GetDeviceOptionalMutable(d).properties, }; @@ -274,7 +255,7 @@ List getStaticPropertiesOptionalValues(ComputeDevice d) Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, OptionalMutableProperties = GetRigOptionalMutableValuesLogin(btc, worker), OptionalDynamicProperties = GetRigOptionalDynamicValuesLogin(), - Actions = createDefaultActions(), + Actions = CreateDefaultRigActions(), Devices = devices.Select(mapComputeDevice).ToList(), MinerState = GetMinerStateValues(worker, devices), }; @@ -415,6 +396,145 @@ JArray mmv(ComputeDevice d) Devices = devices.Select(toDeviceState).ToList(), }; } + private static List CreateDefaultDeviceActions() + { + return new List + { + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Device enable", + DisplayGroup = 0, + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Device disable", + DisplayGroup = 0, + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "OC profile test", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterString() + { + DisplayName = "OC profile", + DefaultValue = "", + Range = (1024, "") + } + } + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Fan profile test", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterString() + { + DisplayName = "Fan profile", + DefaultValue = "", + Range = (1024, "") + } + } + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "ELP profile test", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterString() + { + DisplayName = "ELP profile", + DefaultValue = "", + Range = (1024, "") + } + } + } + }; + } + private static List CreateDefaultRigActions() + { + return new List + { + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Mining start", + DisplayGroup = 1, + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Mining stop", + DisplayGroup = 1, + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Profiles bundle set", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterString() + { + DisplayName = "Bundle profiles", + DefaultValue = "", + Range = (4096, "") + } + } + }, + new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Profiles bundle reset", + DisplayGroup = 1, + }, + }; + } + private static List GetStaticPropertiesOptionalValues(ComputeDevice d) + { + return d.BaseDevice switch + { + IGpuDevice gpu => new List + { + new JArray("bus_id", $"{gpu.PCIeBusID}"), + new JArray("vram", $"{gpu.GpuRam}"), + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d))),//todo make function + //new JArray("limits", $"{GetLimitsForDevice(d)}"), + }, + _ => new List { }, + }; + } + private static string FormatForOptionalValues(string name, string content) + { + return "{\""+ name +"\":" + content + "}"; + } + + private static string GetMinersForDevice(ComputeDevice d) + { + List miners = new List(); + var uniquePlugins = d.AlgorithmSettings?.Select(item => item.PluginName)?.Distinct()?.Where(item => !string.IsNullOrEmpty(item)); + if (uniquePlugins == null) return String.Empty; + foreach(var plugin in uniquePlugins) + { + var uniqueAlgos = d.AlgorithmSettings?.Where(item => item.PluginName == plugin)?.Select(item => item.AlgorithmName)?.Distinct(); + if(uniqueAlgos == null) uniqueAlgos = new List(); + miners.Add(new Miner() { Id = plugin, Algos = uniqueAlgos.ToList() }); + } + var json = JsonConvert.SerializeObject(miners); + return json; + } + private static string GetLimitsForDevice(ComputeDevice d) + { + return ""; + } } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 63a26a852..38a250655 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -7,6 +7,13 @@ namespace NHMCore.Nhmws.V4 { + public enum Type : int + { + Int = 0, + Bool = 1, + Enum = 2, + String = 3, + } internal class LoginMessage : ISendMessage { [JsonProperty("method")] @@ -33,7 +40,7 @@ internal class LoginMessage : ISendMessage public List OptionalMutableProperties { get; set; } [JsonProperty("actions")] - public List Actions { get; set; } + public List Actions { get; set; } [JsonProperty("devices")] public List Devices { get; set; } @@ -87,14 +94,6 @@ internal interface IAction { } internal abstract class OptionalMutableProperty { - public enum Type : int - { - Int = 0, - Bool = 1, - Enum = 2, - String = 3, - } - private static int _nextPropertyId = 100; internal static int NextPropertyId() => _nextPropertyId++; @@ -174,7 +173,7 @@ internal class OptionalMutablePropertyString : OptionalMutableProperty public (int len, string charset) Range { get; set; } } - internal class NhnwsAction + internal class NhmwsAction { private static int _actionId = 0; internal static int NextActionId() => _actionId++; @@ -187,6 +186,8 @@ internal class NhnwsAction [JsonProperty("display_group")] public int DisplayGroup { get; set; } + [JsonProperty("parameters")] + public List Parameters { get; set; } = new(); [JsonIgnore] public Func> ExecuteTask { get; set; } @@ -206,7 +207,7 @@ internal class Device public List OptionalMutableProperties { get; set; } [JsonProperty("actions")] - public List Actions { get; set; } + public List Actions { get; set; } } @@ -246,4 +247,100 @@ internal class DeviceState public List Devices { get; set; } } + internal abstract class Parameter + { + [JsonProperty("display_name")] + public string DisplayName { get; set; } + [JsonProperty("display_group")] + public int DisplayGroup { get; set; } + [JsonProperty("display_unit")] + public string DisplayUnit { get; set; } + [JsonProperty("type")] + abstract public Type PropertyType { get; } + } + internal class ParameterInteger : Parameter + { + [JsonProperty("type")] + public override Type PropertyType => Type.Int; + + [JsonProperty("default")] + public int DefaultValue { get; set; } + + [JsonProperty("range")] + [JsonConverter(typeof(Nhmws4JSONConverter))] + public (int min, int max) Range { get; set; } + } + internal class ParameterBool : Parameter + { + [JsonProperty("type")] + public override Type PropertyType => Type.Bool; + + [JsonProperty("default")] + public bool DefaultValue { get; set; } + } + internal class ParameterEnum : Parameter + { + [JsonProperty("type")] + public override Type PropertyType => Type.Enum; + + [JsonProperty("default")] + public string DefaultValue { get; set; } + + [JsonProperty("range")] + public List Range { get; set; } + } + internal class ParameterString : Parameter + { + [JsonProperty("type")] + public override Type PropertyType => Type.String; + + [JsonProperty("default")] + public string DefaultValue { get; set; } + + [JsonProperty("range")] + [JsonConverter(typeof(Nhmws4JSONConverter))] + public (int len, string charset) Range { get; set; } + } + internal abstract class ActionParameter + { + [JsonProperty("device_name")] + public string DeviceName { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("type")] + public int Type { get; set; } + } + internal class Property + { + [JsonProperty("prop_id")] + public int PropId { get; set; } + } + internal class PropertyInt : Property + { + [JsonProperty("value")] + public int Value { get; set; } + } + internal class PropertyBool : Property + { + [JsonProperty("value")] + public bool Value { get; set; } + } + internal class PropertyEnum : Property + { + [JsonProperty("value")] + public Type Value { get; set; } + } + internal class PropertyString : Property + { + [JsonProperty("value")] + public string Value { get; set; } + } + internal class Miner + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("algorithms")] + public List Algos { get; set; } = new List(); + } + } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index de26114a3..d1f5d1de0 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -673,7 +673,23 @@ async Task systemDump() _ => throw new RpcException($"RpcMessage MinerReset operation not supported for level '{level}'", ErrorCode.UnableToHandleRpc), }; } - + private static Task CallAction(MinerCallAction action) + { + var deserializedParams = new List(); + foreach(var param in action.Parameters) + { + //TODO override abstract class ActionParameter to desired form + //deserializedParams.Add(JsonConvert.DeserializeObject(param)); + } + //some switch to determine command + //handle each param in request + //return result + return Task.FromResult(""); + } + private static Task SetMutable(MinerSetMutable mutableCmd) + { + return Task.FromResult(""); + } #endregion RpcMessages static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) @@ -699,6 +715,8 @@ static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) MiningStop m => await StopMining(m.Device), MiningSetPowerMode m => await SetPowerMode(m.Device, (TDPSimpleType)m.PowerMode), MinerReset m => await MinerReset(m.Level), // rpcAnswer + MinerCallAction m => await CallAction(m), + MinerSetMutable m => await SetMutable(m), _ => throw new RpcException($"RpcMessage operation not supported for method '{rpcMsg.Method}'", ErrorCode.UnableToHandleRpc), }; diff --git a/src/NHMCore/Nhmws/V4/Nhmws4JSONConverter.cs b/src/NHMCore/Nhmws/V4/Nhmws4JSONConverter.cs index b904b5911..768152fd3 100644 --- a/src/NHMCore/Nhmws/V4/Nhmws4JSONConverter.cs +++ b/src/NHMCore/Nhmws/V4/Nhmws4JSONConverter.cs @@ -22,14 +22,14 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s serializer.Serialize(writer, sValue); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); } public override bool CanRead => false; - public override bool CanConvert(Type objectType) + public override bool CanConvert(System.Type objectType) { return objectType == typeof((int min, int max)) || objectType == typeof((int len, string charset)) From d406fcbbd1e83bb20041c2eff41500efd1d1a3e9 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 28 Oct 2022 14:54:52 +0200 Subject: [PATCH 006/224] monitoring modification --- .../Core_clock/ICoreClockDeltaSet.cs | 13 ---- .../Core_clock/ICoreClockRange.cs | 1 - src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 4 -- .../DeviceMonitorNVIDIA.cs | 71 +++---------------- .../ICoreClockDelta.cs => ITDPLimits.cs} | 6 +- .../Memory_clock/IMemoryClockDelta.cs | 13 ---- .../Memory_clock/IMemoryClockDeltaSet.cs | 13 ---- .../Memory_clock/IMemoryClockRange.cs | 1 - src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 19 ++--- src/NHMCore/Mining/ComputeDevice.cs | 28 ++------ 10 files changed, 24 insertions(+), 145 deletions(-) delete mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs rename src/NHM.DeviceMonitoring/{Core_clock/ICoreClockDelta.cs => ITDPLimits.cs} (51%) delete mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs delete mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs deleted file mode 100644 index fb6976ca6..000000000 --- a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDeltaSet.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NHM.DeviceMonitoring.Core_clock -{ - public interface ICoreClockDeltaSet - { - bool SetCoreClockDelta(int coreClockDelta); - } -} diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs index 990238ea9..946218171 100644 --- a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs @@ -9,6 +9,5 @@ namespace NHM.DeviceMonitoring.Core_clock public interface ICoreClockRange { (int min, int max) CoreClockRange { get; } - (int min, int max) CoreClockDeltaRange { get; } } } diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs index f40ca2a68..9271dbe8f 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs @@ -310,8 +310,6 @@ public int CoreClock } } - public (int min, int max) GetMemoryClockDeltaRange => (-1, -1); - public (int min, int max) CoreClockRange { get @@ -325,7 +323,5 @@ public int CoreClock return (-1, -1); } } - - public (int min, int max) CoreClockDeltaRange => (-1, -1); } } diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index ed4bf7d16..4bd120933 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -8,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClockDelta, IMemoryClockDelta, ICoreClock, IMemoryClock, ICoreClockSet, ICoreClockDeltaSet, IMemoryClockDeltaSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed + internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits { private const int RET_OK = 0; public static object _lock = new object(); @@ -285,32 +285,6 @@ public int MemoryClock return -1; } } - - public int CoreClockDelta - { - get - { - int coreClockDelta = 0; - int memClockDelta = 0; - int ok = NVIDIA_MON.nhm_nvidia_device_get_clocks_delta(BusID, ref coreClockDelta, ref memClockDelta); - if (ok == RET_OK) return coreClockDelta; - Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_clocks_delta failed with error code {ok}", _delayedLogging); - return -1; - } - } - public int MemoryClockDelta - { - get - { - int coreClockDelta = 0; - int memClockDelta = 0; - int ok = NVIDIA_MON.nhm_nvidia_device_get_clocks_delta(BusID, ref coreClockDelta, ref memClockDelta); - if (ok == RET_OK) return memClockDelta; - Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_clocks_delta failed with error code {ok}", _delayedLogging); - return -1; - } - } - public void PrintMemoryTimings() { NVIDIA_MON.nhm_nvidia_device_print_memory_timings(BusID); @@ -320,46 +294,21 @@ public bool SetCoreClock(int coreClock) { return NVIDIA_MON.nhm_nvidia_device_set_core_clocks(BusID, coreClock) == 0 ? true : false; } - public bool SetCoreClockDelta(int coreClockDelta) + public (bool ok, uint min, uint max, uint def) GetTDPLimits() { - return NVIDIA_MON.nhm_nvidia_device_set_core_clocks_delta(BusID, coreClockDelta) == 0 ? true : false; + uint min = 0; + uint max = 0; + uint def = 0; + var ok = NVIDIA_MON.nhm_nvidia_device_get_tdp_min_max_default(BusID, ref min, ref max, ref def); + if (ok == RET_OK) return (true, min, max, def); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_tdp_min_max_default failed with error code {ok}", _delayedLogging); + return (false, 0, 0, 0); } - public bool SetMemoryClockDelta(int memoryClockDelta) - { - return NVIDIA_MON.nhm_nvidia_device_set_memory_clocks_delta(BusID, memoryClockDelta) == 0 ? true : false; - } [Obsolete("Not implemented for NVIDIA")] public (int min, int max) GetMemoryClockRange => (-1, -1); - public (int min, int max) GetMemoryClockDeltaRange - { - get - { - int dmcMin = 0; - int dmcMax = 0; - int dccMin = 0; - int dccMax = 0; - int ok = NVIDIA_MON.nhm_nvidia_device_get_oc_limits_delta(BusID, ref dccMin, ref dccMax, ref dmcMin, ref dmcMax); - if(ok == RET_OK) return (dmcMin, dmcMax); - Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_oc_limits_delta failed with error code {ok}", _delayedLogging); - return (-1, -1); - } - } + [Obsolete("Not implemented for NVIDIA")] public (int min, int max) CoreClockRange => (-1, -1); - public (int min, int max) CoreClockDeltaRange - { - get - { - int dmcMin = 0; - int dmcMax = 0; - int dccMin = 0; - int dccMax = 0; - int ok = NVIDIA_MON.nhm_nvidia_device_get_oc_limits_delta(BusID, ref dccMin, ref dccMax, ref dmcMin, ref dmcMax); - if (ok == RET_OK) return (dccMin, dccMax); - Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_oc_limits_delta failed with error code {ok}", _delayedLogging); - return (-1, -1); - } - } } } diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs b/src/NHM.DeviceMonitoring/ITDPLimits.cs similarity index 51% rename from src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs rename to src/NHM.DeviceMonitoring/ITDPLimits.cs index 7a7fa5f6f..7212f3abb 100644 --- a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs +++ b/src/NHM.DeviceMonitoring/ITDPLimits.cs @@ -4,10 +4,10 @@ using System.Text; using System.Threading.Tasks; -namespace NHM.DeviceMonitoring.Core_clock +namespace NHM.DeviceMonitoring { - public interface ICoreClockDelta + public interface ITDPLimits { - int CoreClockDelta { get; } + (bool ok, uint min, uint max, uint def) GetTDPLimits(); } } diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs deleted file mode 100644 index da7fd1f2e..000000000 --- a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NHM.DeviceMonitoring.Memory_clock -{ - public interface IMemoryClockDelta - { - int MemoryClockDelta { get; } - } -} diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs deleted file mode 100644 index 87af03cd2..000000000 --- a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDeltaSet.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NHM.DeviceMonitoring.Memory_clock -{ - public interface IMemoryClockDeltaSet - { - bool SetMemoryClockDelta(int memoryClockDelta); - } -} diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs index f641dc139..3d3996b88 100644 --- a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs @@ -9,6 +9,5 @@ namespace NHM.DeviceMonitoring.Memory_clock public interface IMemoryClockRange { (int min, int max) GetMemoryClockRange { get; } - (int min, int max) GetMemoryClockDeltaRange { get; } } } diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index 09242a3dc..7ca4d8eba 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -46,20 +46,12 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_core_clocks(int bus_number, int core_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_set_core_clocks_delta(int bus_number, int core_clocks_delta); - [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_clocks(int bus_number, ref int memory_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_set_memory_clocks_delta(int bus_number, int memory_clocks_delta); - [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_info(int bus_number, ref ulong free, ref ulong total, ref ulong used); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_restore_fan_speed(int bus_number); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_clocks_delta(int bus_number, ref int core_clock, ref int mem_clock); - [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_oc_limits_delta(int bus_number, ref int delta_core_min, ref int delta_core_max, ref int delta_mem_min, ref int delta_mem_max); - [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_memory_timings(int bus_number, string memory_timings); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_reset_memory_timings(int bus_number); @@ -69,14 +61,11 @@ internal static class NVIDIA_MON public static extern int nhm_nvidia_device_get_memory_controller_load(int bus_number, ref int mem_ctrl_load); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_print_memory_timings(int bus_number); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_get_core_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_get_memory_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def); - //Excavator no longer has these functions (or they have been moved) - //[DllImport(dll, CallingConvention = CallingConvention.StdCall)] - //public static extern int nhm_amd_device_set_memory_clocks(int bus_number, int memory_clocks); - //[DllImport(dll, CallingConvention = CallingConvention.StdCall)] - //public static extern int nhm_amd_device_get_core_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int defaultV); - //[DllImport(dll, CallingConvention = CallingConvention.StdCall)] - //public static extern int nhm_amd_device_get_memory_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int defaultV); } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index aa8c55e6a..0c010491b 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -276,14 +276,6 @@ public int CoreClock return -1; } } - public int CoreClockDelta - { - get - { - if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreClockDelta get) return get.CoreClockDelta; - return -1; - } - } public int MemoryClock { get @@ -292,12 +284,16 @@ public int MemoryClock return -1; } } - public int MemoryClockDelta + public (uint min, uint max, uint def) TDPLimits { get { - if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is IMemoryClockDelta get) return get.MemoryClockDelta; - return -1; + if(!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ITDPLimits get) + { + var ret = get.GetTDPLimits(); + return (ret.min, ret.max, ret.def); + } + return (0, 0, 0); } } #endregion Getters @@ -314,21 +310,11 @@ public bool SetCoreClock(int coreClock) if(CanSetTDP && DeviceMonitor is ICoreClockSet set) return set.SetCoreClock(coreClock); return false; } - public bool SetCoreClockDelta(int coreClockDelta) - { - if(CanSetTDP && DeviceMonitor is ICoreClockDeltaSet set) return set.SetCoreClockDelta(coreClockDelta); - return false; - } public bool SetMemoryClock(int memoryClock) { if(CanSetTDP && DeviceMonitor is IMemoryClockSet set) return set.SetMemoryClock(memoryClock); return false; } - public bool SetMemoryClockDelta(int memoryClockDelta) - { - if(CanSetTDP && DeviceMonitor is IMemoryClockDeltaSet set) return set.SetMemoryClockDelta(memoryClockDelta); - return false; - } public bool SetFanSpeedPercentage(int percent) { if(DeviceMonitor is ISetFanSpeedPercentage set) return set.SetFanSpeedPercentage(percent); From c561eda8d50e73f9dfe6f84ad064c3680e1f2d23 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 3 Nov 2022 08:43:49 +0100 Subject: [PATCH 007/224] added core and memory clock ranges to NHM --- .../Core_clock/ICoreClockRange.cs | 2 +- src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 24 +++++++-------- .../DeviceMonitorNVIDIA.cs | 30 ++++++++++++++++--- .../Memory_clock/IMemoryClockRange.cs | 2 +- src/NHMCore/Mining/ComputeDevice.cs | 24 +++++++++++++++ 5 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs index 946218171..b81e1872f 100644 --- a/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs +++ b/src/NHM.DeviceMonitoring/Core_clock/ICoreClockRange.cs @@ -8,6 +8,6 @@ namespace NHM.DeviceMonitoring.Core_clock { public interface ICoreClockRange { - (int min, int max) CoreClockRange { get; } + (bool ok, int min, int max, int def) CoreClockRange { get; } } } diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs index 9271dbe8f..94b464765 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs @@ -296,31 +296,31 @@ public int CoreClock } } - public (int min, int max) GetMemoryClockRange + public (bool ok, int min, int max, int def) MemoryClockRange { get { - int dmcMin = 0; - int dmcMax = 0; + int min = 0; + int max = 0; int def = 0; - int ok = AMD_ODN.nhm_amd_device_get_memory_clocks_min_max_default(BusID, ref dmcMin, ref dmcMax, ref def); - if (ok == RET_OK) return (dmcMin, dmcMax); + int ok = AMD_ODN.nhm_amd_device_get_memory_clocks_min_max_default(BusID, ref min, ref max, ref def); + if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_memory_clocks_min_max_default failed with error code {ok}", _delayedLogging); - return (-1, -1); + return (false, -1, -1, -1); } } - public (int min, int max) CoreClockRange + public (bool ok, int min, int max, int def) CoreClockRange { get { - int dmcMin = 0; - int dmcMax = 0; + int min = 0; + int max = 0; int def = 0; - int ok = AMD_ODN.nhm_amd_device_get_core_clocks_min_max_default(BusID, ref dmcMin, ref dmcMax, ref def); - if (ok == RET_OK) return (dmcMin, dmcMax); + int ok = AMD_ODN.nhm_amd_device_get_core_clocks_min_max_default(BusID, ref min, ref max, ref def); + if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_amd_device_get_core_clocks_min_max_default failed with error code {ok}", _delayedLogging); - return (-1, -1); + return (false, -1, -1, -1); } } } diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index 4bd120933..349abe362 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -305,10 +305,32 @@ public bool SetCoreClock(int coreClock) return (false, 0, 0, 0); } - [Obsolete("Not implemented for NVIDIA")] - public (int min, int max) GetMemoryClockRange => (-1, -1); + public (bool ok, int min, int max, int def) CoreClockRange + { + get + { + int min = 0; + int max = 0; + int def = 0; + var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default(BusID, ref min, ref max, ref def); + if (ok == RET_OK) return (true, min, max, def); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks_min_max_default failed with error code {ok}", _delayedLogging); + return (false, 0, 0, 0); - [Obsolete("Not implemented for NVIDIA")] - public (int min, int max) CoreClockRange => (-1, -1); + } + } + public (bool ok, int min, int max, int def) MemoryClockRange + { + get + { + int min = 0; + int max = 0; + int def = 0; + var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default(BusID, ref min, ref max, ref def); + if (ok == RET_OK) return (true, min, max, def); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default failed with error code {ok}", _delayedLogging); + return (false, 0, 0, 0); + } + } } } diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs index 3d3996b88..1cb7a3dc1 100644 --- a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRange.cs @@ -8,6 +8,6 @@ namespace NHM.DeviceMonitoring.Memory_clock { public interface IMemoryClockRange { - (int min, int max) GetMemoryClockRange { get; } + (bool ok, int min, int max, int def) MemoryClockRange { get; } } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 0c010491b..476544f68 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -296,6 +296,30 @@ public int MemoryClock return (0, 0, 0); } } + public (bool ok, int min, int max, int def) CoreClockRange + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreClockRange get) + { + var ret = get.CoreClockRange; + return (ret.ok, ret.min, ret.max, ret.def); + } + return (false, -1, -1, -1); + } + } + public (bool ok, int min, int max, int def) MemoryClockRange + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is IMemoryClockRange get) + { + var ret = get.MemoryClockRange; + return (ret.ok, ret.min, ret.max, ret.def); + } + return (false, -1, -1, -1); + } + } #endregion Getters #region Setters From 6629e389ed5bfaffc7ba26a536cf9af5fc7e7aa4 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 4 Nov 2022 15:00:56 +0100 Subject: [PATCH 008/224] added bundle classes --- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 71 +++++++++++------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 98 +++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 28 deletions(-) diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 152bbe8f3..48838ed32 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -181,28 +181,34 @@ List getOptionalMutableProperties(ComputeDevice d) } })); } - if (d.DeviceMonitor is ICoreClockSet) + if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) { - optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + var ret = rangeCore.CoreClockRange; + if (ret.ok) { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayName = "Core clock", - DefaultValue = 0,// WHAT HERE? value now? probaBLY not it can reconnect or was ever - Range = (0, 100)// HERE MIN MAX DEF - })); + optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayName = "Core clock", + DefaultValue = ret.def, + Range = (ret.min, ret.max) + })); + } + } + if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange rangeMem) + { + var ret = rangeMem.MemoryClockRange; + if (ret.ok) + { + optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayName = "Memory clock", + DefaultValue = ret.def, + Range = (ret.min, ret.max) + })); + } } - //if(d.DeviceMonitor is ICoreClockDeltaSet) - //{ - - //} - //if(d.DeviceMonitor is IMemoryClockSet) - //{ - - //} - //if (d.DeviceMonitor is IMemoryClockDeltaSet) - //{ - - //} return optionalProperties .Where(p => p != null) .ToList(); @@ -225,13 +231,8 @@ public static LoginMessage CreateLoginMessage(string btc, string worker, string { var sorted = SortedDevices(devices); if (_loginMessage != null) return _loginMessage; - - - Device mapComputeDevice(ComputeDevice d) { - - return new Device { StaticProperties = new Dictionary @@ -532,9 +533,23 @@ private static string GetMinersForDevice(ComputeDevice d) var json = JsonConvert.SerializeObject(miners); return json; } - private static string GetLimitsForDevice(ComputeDevice d) - { - return ""; - } + //private static string GetLimitsForDevice(ComputeDevice d) + //{ + // List limits = new List(); + // if(d.DeviceMonitor is ITDP) + // { + // //todo need monitor here + // //if(d.DeviceMonitor.) + // //limits.Add(new Limit() { Name = "Power mode", Unit = "%" }); + // } + // if(d.DeviceMonitor is ICoreClockSet) + // { + + // } + // if(d.DeviceMonitor is IMemoryClockSet) + // { + + // } + //} } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 38a250655..5874a4987 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -3,7 +3,10 @@ using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Security.Policy; using System.Threading.Tasks; +using System.Windows.Media.Animation; namespace NHMCore.Nhmws.V4 { @@ -343,4 +346,99 @@ internal class Miner public List Algos { get; set; } = new List(); } + internal class Bundle + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("oc")] + public List OcBundles { get; set; } = new List(); + [JsonProperty("fan")] + public List FanBundles { get; set; } = new List(); + [JsonProperty("elp")] + public List ElpBundles { get; set; } = new List(); + } + internal class ElpBundle + { + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("device_name")] + public string DeviceName { get; set; } + [JsonProperty("miner_id")] + public string MinerId { get; set; } + [JsonProperty("algorithm_id")] + public string AlgoId { get; set; } + [JsonProperty("elp")] + public string Elp { get; set; } + } + internal class OcBundle + { + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("device_name")] + public string DeviceName { get; set; } + [JsonProperty("miner_id", Required = Required.AllowNull)] + public string? MinerId { get; set; } + [JsonProperty("algorithm_id", Required = Required.AllowNull)] + public string? AlgoId { get; set; } + [JsonProperty("core_clock")] + public int CoreClock { get; set; } + [JsonProperty("memory_clock")] + public int MemoryClock { get; set; } + [JsonProperty("tdp")] + public int TDP { get; set; } + } + + internal abstract class FanBundle + { + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("device_name")] + public string DeviceName { get; set; } + [JsonProperty("miner_id", Required = Required.AllowNull)] + public string? MinerId { get; set; } + [JsonProperty("algorithm_id", Required = Required.AllowNull)] + public string? AlgoId { get; set; } + [JsonProperty("type")] + abstract public int Type { get; set; } + } + internal class FanBundleFixed : FanBundle + { + [JsonProperty("type")] + public override int Type { get; set; } = 0; + [JsonProperty("fan_speed")] + public int FanSpeed { get; set; } + } + internal class FanBundleGPUTemp : FanBundle + { + [JsonProperty("type")] + public override int Type { get; set; } = 1; + [JsonProperty("gpu_temp")] + public int GpuTemp { get; set; } + } + internal class FanBundleVramAndGPUTemp : FanBundle + { + [JsonProperty("type")] + public override int Type { get; set; } = 2; + [JsonProperty("gpu_temp")] + public int GpuTemp { get; set; } + [JsonProperty("vram_temp")] + public int VramTemp { get; set; } + [JsonProperty("max_fan_speed")] + public int MaxFanSpeed { get; set; } + } + //internal class Limit + //{ + // [JsonProperty("name")] + // public string Name { get; set; } + // [JsonProperty("unit")] + // public string Unit { get; set; } + // [JsonProperty("default")] + // public int def { get; set; } + // [JsonProperty("range")] + // [JsonConverter(typeof(Nhmws4JSONConverter))] + // public (int min, int max) range { get; set; } + //} + } From 70935843c292b727aff3d8dbb87570c9f64cdacc Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 8 Nov 2022 13:56:52 +0100 Subject: [PATCH 009/224] test action prototypes done --- src/NHMCore/Nhmws/ActionMap.cs | 14 ++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 241 +++++++++--------------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 228 ++++++++++++++++++---- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 86 ++++++++- 4 files changed, 380 insertions(+), 189 deletions(-) create mode 100644 src/NHMCore/Nhmws/ActionMap.cs diff --git a/src/NHMCore/Nhmws/ActionMap.cs b/src/NHMCore/Nhmws/ActionMap.cs new file mode 100644 index 000000000..fb4c1327e --- /dev/null +++ b/src/NHMCore/Nhmws/ActionMap.cs @@ -0,0 +1,14 @@ +using NHMCore.Nhmws.V4; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Nhmws +{ + public static class ActionMap + { + public static List ActionList = new(); + } +} diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 48838ed32..5c9f409bc 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -150,65 +150,93 @@ List getOptionalMutableProperties(ComputeDevice d) DisplayGroup = 0, DisplayName = "Miners settings", DefaultValue = "", - Range = (2048, "") - }); - if (d.DeviceMonitor is ITDP tdp) - { - optionalProperties.Add(valueOrNull(new OptionalMutablePropertyEnum //TODO is always included? - { - PropertyID = OptionalMutableProperty.NextPropertyId(), // TODO this will eat up the ID - DisplayName = "TDP Simple", - DefaultValue = "Medium", - Range = new List { "Low", "Medium", "High" }, - // TODO action/setter to execute - ExecuteTask = async (object p) => - { - // #1 validate JSON input - if (p is string pstr && pstr is not null) return Task.FromResult(null); - // TODO do something - return Task.FromResult(null); - }, - GetValue = () => - { - var ret = d.TDPSimple switch - { - TDPSimpleType.LOW => "Low", - TDPSimpleType.MEDIUM => "Medium", - TDPSimpleType.HIGH => "High", - _ => "ERROR", - }; - return ret; - } - })); - } - if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) - { - var ret = rangeCore.CoreClockRange; - if (ret.ok) - { - optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayName = "Core clock", - DefaultValue = ret.def, - Range = (ret.min, ret.max) - })); - } - } - if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange rangeMem) - { - var ret = rangeMem.MemoryClockRange; - if (ret.ok) + Range = (2048, ""), + //ExecuteTask = async (object p) => + //{ + // //todo + // return null; + //}, + GetValue = () => { - optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayName = "Memory clock", - DefaultValue = ret.def, - Range = (ret.min, ret.max) - })); + //todo? + return string.Empty; } - } + }); + //if (d.DeviceMonitor is ITDP tdp) + //{ + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyEnum //TODO is always included? + // { + // PropertyID = OptionalMutableProperty.NextPropertyId(), // TODO this will eat up the ID + // DisplayName = "TDP Simple", + // DefaultValue = "Medium", + // Range = new List { "Low", "Medium", "High" }, + // // TODO action/setter to execute + // ExecuteTask = async (object p) => + // { + // // #1 validate JSON input + // if (p is string pstr && pstr is not null) return Task.FromResult(null); + // // TODO do something + // return Task.FromResult(null); + // }, + // GetValue = () => + // { + // var ret = d.TDPSimple switch + // { + // TDPSimpleType.LOW => "Low", + // TDPSimpleType.MEDIUM => "Medium", + // TDPSimpleType.HIGH => "High", + // _ => "ERROR", + // }; + // return ret; + // } + // })); + //} + //if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) + //{ + // var ret = rangeCore.CoreClockRange; + // if (ret.ok) + // { + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + // { + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayName = "Core clock", + // DefaultValue = ret.def, + // Range = (ret.min, ret.max), + // //ExecuteTask = async (object p) => + // //{ + // //todo + // //} + // GetValue = () => + // { + // //todo? + // return string.Empty; + // } + // })); + // } + //} + //if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange rangeMem) + //{ + // var ret = rangeMem.MemoryClockRange; + // if (ret.ok) + // { + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + // { + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayName = "Memory clock", + // DefaultValue = ret.def, + // Range = (ret.min, ret.max), + // //ExecuteTask = async (object p) => + // //{ + // //todo + // //} + // GetValue = () => + // { + // //todo? + // return string.Empty; + // } + // })); + // } + //} return optionalProperties .Where(p => p != null) .ToList(); @@ -401,102 +429,21 @@ private static List CreateDefaultDeviceActions() { return new List { - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Device enable", - DisplayGroup = 0, - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Device disable", - DisplayGroup = 0, - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "OC profile test", - DisplayGroup = 1, - Parameters = new List() - { - new ParameterString() - { - DisplayName = "OC profile", - DefaultValue = "", - Range = (1024, "") - } - } - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Fan profile test", - DisplayGroup = 1, - Parameters = new List() - { - new ParameterString() - { - DisplayName = "Fan profile", - DefaultValue = "", - Range = (1024, "") - } - } - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "ELP profile test", - DisplayGroup = 1, - Parameters = new List() - { - new ParameterString() - { - DisplayName = "ELP profile", - DefaultValue = "", - Range = (1024, "") - } - } - } + NhmwsAction.ActionDeviceEnable(), + NhmwsAction.ActionDeviceDisable(), + NhmwsAction.ActionOcProfileTest(), + NhmwsAction.ActionFanProfileTest(), + NhmwsAction.ActionElpProfileTest(), }; } private static List CreateDefaultRigActions() { return new List { - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Mining start", - DisplayGroup = 1, - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Mining stop", - DisplayGroup = 1, - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Profiles bundle set", - DisplayGroup = 1, - Parameters = new List() - { - new ParameterString() - { - DisplayName = "Bundle profiles", - DefaultValue = "", - Range = (4096, "") - } - } - }, - new NhmwsAction - { - ActionID = NhmwsAction.NextActionId(), - DisplayName = "Profiles bundle reset", - DisplayGroup = 1, - }, + NhmwsAction.ActionStartMining(), + NhmwsAction.ActionStopMining(), + NhmwsAction.ActionProfilesBundleSet(), + NhmwsAction.ActionProfilesBundleReset(), }; } private static List GetStaticPropertiesOptionalValues(ComputeDevice d) diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 5874a4987..3efdc3be1 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -7,6 +7,7 @@ using System.Security.Policy; using System.Threading.Tasks; using System.Windows.Media.Animation; +using Windows.Devices.Sensors; namespace NHMCore.Nhmws.V4 { @@ -16,6 +17,22 @@ public enum Type : int Bool = 1, Enum = 2, String = 3, + } + public enum SupportedAction : int + { + ActionUnsupported = -1, + ActionStartMining, + ActionStopMining, + ActionProfilesBundleSet, + ActionProfilesBundleReset, + ActionDeviceEnable, + ActionDeviceDisable, + ActionOcProfileTest, + ActionFanProfileTest, + ActionElpProfileTest, + + + } internal class LoginMessage : ISendMessage { @@ -49,7 +66,7 @@ internal class LoginMessage : ISendMessage public List Devices { get; set; } [JsonProperty("miner.state")] - public JObject MinerState { get; set; } + public JObject MinerState { get; set; } } @@ -84,15 +101,15 @@ internal class LoginMessage : ISendMessage internal interface IStaticMandatoryProperty { } internal interface IStaticOptionalProperty { } - + internal interface IDynamicMandatoryProperty { } - + internal interface IDynamicOptionalProperty { } internal interface IMutableMandatoryProperty { } - + internal interface IMutableOptionalProperty { } - + internal interface IAction { } internal abstract class OptionalMutableProperty @@ -176,7 +193,7 @@ internal class OptionalMutablePropertyString : OptionalMutableProperty public (int len, string charset) Range { get; set; } } - internal class NhmwsAction + public class NhmwsAction { private static int _actionId = 0; internal static int NextActionId() => _actionId++; @@ -190,10 +207,163 @@ internal class NhmwsAction [JsonProperty("display_group")] public int DisplayGroup { get; set; } [JsonProperty("parameters")] - public List Parameters { get; set; } = new(); - + public List Parameters { get; set; } = new(); + [JsonIgnore] + public SupportedAction ActionType { get; set; } [JsonIgnore] - public Func> ExecuteTask { get; set; } + public Func> ExecuteTask { get; set; } + public static NhmwsAction ActionDeviceEnable() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Device enable", + DisplayGroup = 0, + ActionType = SupportedAction.ActionDeviceEnable, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionDeviceDisable() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Device disable", + DisplayGroup = 0, + ActionType = SupportedAction.ActionDeviceDisable, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionOcProfileTest() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "OC profile test", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterStringLogin() + { + DisplayName = "OC profile", + DefaultValue = "", + Range = (1024, "") + } + }, + ActionType = SupportedAction.ActionOcProfileTest, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionFanProfileTest() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Fan profile test", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterStringLogin() + { + DisplayName = "Fan profile", + DefaultValue = "", + Range = (1024, "") + } + }, + ExecuteTask = async (object p) => + { + if (p is FanBundle fb && fb is not null) //todo fan bundle call here + { + var a = 0; + } + return 0; + }, + ActionType = SupportedAction.ActionFanProfileTest, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionElpProfileTest() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "ELP profile test", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterStringLogin() + { + DisplayName = "ELP profile", + DefaultValue = "", + Range = (1024, "") + } + }, + ActionType= SupportedAction.ActionElpProfileTest, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionStartMining() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Mining start", + DisplayGroup = 1, + ActionType = SupportedAction.ActionStartMining, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionStopMining() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Mining stop", + DisplayGroup = 1, + ActionType = SupportedAction.ActionStopMining, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionProfilesBundleSet() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Profiles bundle set", + DisplayGroup = 1, + Parameters = new List() + { + new ParameterStringLogin() + { + DisplayName = "Bundle profiles", + DefaultValue = "", + Range = (4096, "") + } + }, + ActionType = SupportedAction.ActionProfilesBundleSet, + }; + ActionMap.ActionList.Add(action); + return action; + } + public static NhmwsAction ActionProfilesBundleReset() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Profiles bundle reset", + DisplayGroup = 1, + ActionType= SupportedAction.ActionProfilesBundleReset, + }; + ActionMap.ActionList.Add(action); + return action; + } } internal class Device @@ -250,7 +420,7 @@ internal class DeviceState public List Devices { get; set; } } - internal abstract class Parameter + public abstract class ParameterLogin { [JsonProperty("display_name")] public string DisplayName { get; set; } @@ -261,7 +431,7 @@ internal abstract class Parameter [JsonProperty("type")] abstract public Type PropertyType { get; } } - internal class ParameterInteger : Parameter + internal class ParameterIntegerLogin : ParameterLogin { [JsonProperty("type")] public override Type PropertyType => Type.Int; @@ -273,7 +443,7 @@ internal class ParameterInteger : Parameter [JsonConverter(typeof(Nhmws4JSONConverter))] public (int min, int max) Range { get; set; } } - internal class ParameterBool : Parameter + internal class ParameterBoolLogin : ParameterLogin { [JsonProperty("type")] public override Type PropertyType => Type.Bool; @@ -281,7 +451,7 @@ internal class ParameterBool : Parameter [JsonProperty("default")] public bool DefaultValue { get; set; } } - internal class ParameterEnum : Parameter + internal class ParameterEnumLogin : ParameterLogin { [JsonProperty("type")] public override Type PropertyType => Type.Enum; @@ -292,7 +462,7 @@ internal class ParameterEnum : Parameter [JsonProperty("range")] public List Range { get; set; } } - internal class ParameterString : Parameter + internal class ParameterStringLogin : ParameterLogin { [JsonProperty("type")] public override Type PropertyType => Type.String; @@ -378,9 +548,9 @@ internal class OcBundle public string Name { get; set; } [JsonProperty("device_name")] public string DeviceName { get; set; } - [JsonProperty("miner_id", Required = Required.AllowNull)] + [JsonProperty("miner_id")] public string? MinerId { get; set; } - [JsonProperty("algorithm_id", Required = Required.AllowNull)] + [JsonProperty("algorithm_id")] public string? AlgoId { get; set; } [JsonProperty("core_clock")] public int CoreClock { get; set; } @@ -389,38 +559,20 @@ internal class OcBundle [JsonProperty("tdp")] public int TDP { get; set; } } - - internal abstract class FanBundle + internal class FanBundle { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("device_name")] public string DeviceName { get; set; } - [JsonProperty("miner_id", Required = Required.AllowNull)] + [JsonProperty("miner_id")] public string? MinerId { get; set; } - [JsonProperty("algorithm_id", Required = Required.AllowNull)] + [JsonProperty("algorithm_id")] public string? AlgoId { get; set; } [JsonProperty("type")] - abstract public int Type { get; set; } - } - internal class FanBundleFixed : FanBundle - { - [JsonProperty("type")] - public override int Type { get; set; } = 0; + public int Type { get; set; } [JsonProperty("fan_speed")] public int FanSpeed { get; set; } - } - internal class FanBundleGPUTemp : FanBundle - { - [JsonProperty("type")] - public override int Type { get; set; } = 1; - [JsonProperty("gpu_temp")] - public int GpuTemp { get; set; } - } - internal class FanBundleVramAndGPUTemp : FanBundle - { - [JsonProperty("type")] - public override int Type { get; set; } = 2; [JsonProperty("gpu_temp")] public int GpuTemp { get; set; } [JsonProperty("vram_temp")] diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index d1f5d1de0..70b689996 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using NHM.Common; using NHM.Common.Enums; using NHM.DeviceMonitoring.TDP; @@ -593,6 +594,10 @@ private static Task StopMining(string devs) } #endregion Stop + #region Actions + + #endregion Actions + private static Task SetPowerMode(string device, TDPSimpleType level) { if (GlobalDeviceSettings.Instance.DisableDevicePowerModeSettings) throw new RpcException("Not able to set Power Mode: Device Power Mode Settings Disabled", ErrorCode.UnableToHandleRpc); @@ -675,17 +680,90 @@ async Task systemDump() } private static Task CallAction(MinerCallAction action) { - var deserializedParams = new List(); + var actionRecord = ActionMap.ActionList.Where(a => a.ActionID == action.ActionId).FirstOrDefault(); + if (actionRecord == null) + { + NHM.Common.Logger.Error("NHWebSocketV4", "Action not found"); + return Task.FromResult(string.Empty); + } + //var typeOfParams = foreach(var param in action.Parameters) { - //TODO override abstract class ActionParameter to desired form - //deserializedParams.Add(JsonConvert.DeserializeObject(param)); + ParseAndCallAction(actionRecord.ActionType, param); } //some switch to determine command //handle each param in request //return result return Task.FromResult(""); } + private static Task ParseAndCallAction(SupportedAction typeOfAction, string parameters) + { + switch (typeOfAction) + { + case SupportedAction.ActionStartMining: + break; + case SupportedAction.ActionStopMining: + break; + case SupportedAction.ActionProfilesBundleSet: + break; + case SupportedAction.ActionProfilesBundleReset: + break; + case SupportedAction.ActionDeviceEnable: + break; + case SupportedAction.ActionDeviceDisable: + break; + case SupportedAction.ActionOcProfileTest: + object jobjectOc = JsonConvert.DeserializeObject(parameters); + if (jobjectOc is not JObject jsonObjOC) break; + if (jsonObjOC.ToObject() is OcBundle ob) ExecuteOCBundle(ob); + break; + case SupportedAction.ActionFanProfileTest: + object jobjectFan = JsonConvert.DeserializeObject(parameters); + if (jobjectFan is not JObject jsonObjFan) break; + if (jsonObjFan.ToObject() is FanBundle fb) ExecuteFanBundle(fb); + break; + case SupportedAction.ActionElpProfileTest: + object jobjectELP = JsonConvert.DeserializeObject(parameters); + if (jobjectELP is not JObject jsonObjELP) break; + if (jsonObjELP.ToObject() is ElpBundle eb) ExecuteELPBundle(eb); + break; + default: + break; + } + return Task.CompletedTask; + } + private static Task ExecuteOCBundle(OcBundle ocBundle) + { + return Task.CompletedTask; + } + private static Task ExecuteELPBundle(ElpBundle elpBundle) + { + return Task.CompletedTask; + } + private static Task ExecuteFanBundle(FanBundle fanBundle) + { + object t = fanBundle.Type switch + { + 0 => ExecuteFanBundleFixed(fanBundle), + 1 => ExecuteFanBundleTargetGPUTemp(fanBundle), + 2 => ExecuteFanBundleTargetGPUVRAMTemp(fanBundle), + _ => throw new RpcException($"Fan bundle type not supported for method '{fanBundle.Type}'", ErrorCode.UnableToHandleRpc), + }; + return Task.CompletedTask; + } + private static Task ExecuteFanBundleFixed(FanBundle fanBundle) + { + return Task.CompletedTask; + } + private static Task ExecuteFanBundleTargetGPUTemp(FanBundle fanBundle) + { + return Task.CompletedTask; + } + private static Task ExecuteFanBundleTargetGPUVRAMTemp(FanBundle fanBundle) + { + return Task.CompletedTask; + } + private static Task SetMutable(MinerSetMutable mutableCmd) { return Task.FromResult(""); @@ -715,7 +793,7 @@ static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) MiningStop m => await StopMining(m.Device), MiningSetPowerMode m => await SetPowerMode(m.Device, (TDPSimpleType)m.PowerMode), MinerReset m => await MinerReset(m.Level), // rpcAnswer - MinerCallAction m => await CallAction(m), + MinerCallAction m => await CallAction(m), // call decision from here!!! MinerSetMutable m => await SetMutable(m), _ => throw new RpcException($"RpcMessage operation not supported for method '{rpcMsg.Method}'", ErrorCode.UnableToHandleRpc), }; From 87d62134a0804b8ba8c54b856f893eb5005f79c0 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 10 Nov 2022 15:12:13 +0100 Subject: [PATCH 010/224] can connect again, modified login message to latest form --- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 162 ++++++++++++++---------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 85 +++---------- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 18 ++- 3 files changed, 135 insertions(+), 130 deletions(-) diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 5c9f409bc..f74abd489 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -13,8 +13,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; -using Windows.ApplicationModel.Contacts; namespace NHMCore.Nhmws.V4 { @@ -64,7 +62,7 @@ private static string GetDevicePlugin(string UUID) return devData.MinerName; } - private static (List<(string name, string unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin) + private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin) { string getValue(T o) => (typeof(T).Name, o) switch { @@ -82,8 +80,11 @@ private static (List<(string name, string unit)> properties, JArray values) GetD { "Miner" => $"{GetDevicePlugin(d.Uuid)}", "OC profile" => $"", //TODO + "OC profile ID" => $"", "Fan profile" => $"", //TODO + "Fan profile ID" => $"", "ELP profile" => $"", //TODO + "ELP profile ID" => $"", _ => null, }; @@ -101,12 +102,15 @@ private static (List<(string name, string unit)> properties, JArray values) GetD pairOrNull(DeviceDynamicProperties.VramTemp,"VRAM Temperature","C"), pairOrNull(DeviceDynamicProperties.Load,"Load","%"), pairOrNull(DeviceDynamicProperties.MemoryControllerLoad, "MemCtrl Load","%"), - pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan","%"), - pairOrNull(DeviceDynamicProperties.PowerUsage, "Power","W"), - pairOrNull(DeviceDynamicProperties.NONE, "Miner", ""), - pairOrNull(DeviceDynamicProperties.NONE, "OC profile", ""), - pairOrNull(DeviceDynamicProperties.NONE, "Fan profile", ""), - pairOrNull(DeviceDynamicProperties.NONE, "ELP profile", "") + pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan speed","%"), + pairOrNull(DeviceDynamicProperties.PowerUsage, "Power usage","W"), + pairOrNull(DeviceDynamicProperties.NONE, "Miner", null), + pairOrNull(DeviceDynamicProperties.NONE, "OC profile", null), + pairOrNull(DeviceDynamicProperties.NONE, "OC profile ID", null), + pairOrNull(DeviceDynamicProperties.NONE, "Fan profile", null), + pairOrNull(DeviceDynamicProperties.NONE, "Fan profile ID", null), + pairOrNull(DeviceDynamicProperties.NONE, "ELP profile", null), + pairOrNull(DeviceDynamicProperties.NONE, "ELP profile ID", null), }; var deviceOptionalDynamic = dynamicPropertiesWithValues .Where(p => p.HasValue) @@ -130,7 +134,7 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u { if (!d.SupportedDynamicProperties.Contains(i)) deviceOptionalDynamic.RemoveAll(prop => prop.type == i); } - var optionalDynamicProperties = deviceOptionalDynamic.Select(p => (p.name, p.unit)).ToList(); + List<(string name, string? unit)> optionalDynamicProperties = deviceOptionalDynamic.Select(p => (p.name, p.unit)).ToList(); var values_odv = new JArray(deviceOptionalDynamic.Select(p => p.value)); return (optionalDynamicProperties, values_odv); } @@ -162,34 +166,33 @@ List getOptionalMutableProperties(ComputeDevice d) return string.Empty; } }); - //if (d.DeviceMonitor is ITDP tdp) + #region OMVMaybe + //if (d.DeviceMonitor is ITDP tdp && d.DeviceMonitor is ITDPLimits tdpLim) //{ - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyEnum //TODO is always included? + // var limits = tdpLim.GetTDPLimits(); + // if (limits.ok) // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), // TODO this will eat up the ID - // DisplayName = "TDP Simple", - // DefaultValue = "Medium", - // Range = new List { "Low", "Medium", "High" }, - // // TODO action/setter to execute - // ExecuteTask = async (object p) => + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt // { - // // #1 validate JSON input - // if (p is string pstr && pstr is not null) return Task.FromResult(null); - // // TODO do something - // return Task.FromResult(null); - // }, - // GetValue = () => - // { - // var ret = d.TDPSimple switch + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayName = "Power mode", + // DisplayUnit = "%", + // DefaultValue = (int)limits.def, + // Range = ((int)limits.min, (int)limits.max), + // //ExecuteTask = async (object p) => + // //{ + // // // #1 validate JSON input + // // if (p is string pstr && pstr is not null) return Task.FromResult(null); + // // // TODO do something + // // return Task.FromResult(null); + // //}, + // GetValue = () => // { - // TDPSimpleType.LOW => "Low", - // TDPSimpleType.MEDIUM => "Medium", - // TDPSimpleType.HIGH => "High", - // _ => "ERROR", - // }; - // return ret; - // } - // })); + // return tdp.TDPPercentage; + // } + // })); + // } + //} //if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) //{ @@ -200,6 +203,7 @@ List getOptionalMutableProperties(ComputeDevice d) // { // PropertyID = OptionalMutableProperty.NextPropertyId(), // DisplayName = "Core clock", + // DisplayUnit = "MHz", // DefaultValue = ret.def, // Range = (ret.min, ret.max), // //ExecuteTask = async (object p) => @@ -208,8 +212,7 @@ List getOptionalMutableProperties(ComputeDevice d) // //} // GetValue = () => // { - // //todo? - // return string.Empty; + // return d.CoreClock; // } // })); // } @@ -223,6 +226,7 @@ List getOptionalMutableProperties(ComputeDevice d) // { // PropertyID = OptionalMutableProperty.NextPropertyId(), // DisplayName = "Memory clock", + // DisplayUnit = "MHz", // DefaultValue = ret.def, // Range = (ret.min, ret.max), // //ExecuteTask = async (object p) => @@ -231,12 +235,12 @@ List getOptionalMutableProperties(ComputeDevice d) // //} // GetValue = () => // { - // //todo? - // return string.Empty; + // return d.MemoryClock; // } // })); // } //} + #endregion return optionalProperties .Where(p => p != null) .ToList(); @@ -255,6 +259,20 @@ List getOptionalMutablePropertiesCached(ComputeDevice d } private static LoginMessage _loginMessage = null; + public static List> DeviceOptionalDynamicToList(List<(string name, string? unit)> properties) + { + List> result = new List>(); + foreach (var property in properties) + { + if(property.unit == null) + { + result.Add(new List { property.name }); + continue; + } + result.Add(new List { property.name, property.unit }); + } + return result; + } public static LoginMessage CreateLoginMessage(string btc, string worker, string rigID, IOrderedEnumerable devices) { var sorted = SortedDevices(devices); @@ -271,7 +289,7 @@ Device mapComputeDevice(ComputeDevice d) { "optional", GetStaticPropertiesOptionalValues(d) }, }, Actions = CreateDefaultDeviceActions(), - OptionalDynamicProperties = GetDeviceOptionalDynamic(d, true).properties, + OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true).properties), OptionalMutableProperties = GetDeviceOptionalMutable(d).properties, }; } @@ -451,13 +469,17 @@ private static List GetStaticPropertiesOptionalValues(ComputeDevice d) return d.BaseDevice switch { IGpuDevice gpu => new List - { - new JArray("bus_id", $"{gpu.PCIeBusID}"), - new JArray("vram", $"{gpu.GpuRam}"), - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d))),//todo make function - //new JArray("limits", $"{GetLimitsForDevice(d)}"), - }, - _ => new List { }, + { + new JArray("bus_id", $"{gpu.PCIeBusID}"), + new JArray("vram", $"{gpu.GpuRam}"), + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d))), + new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), + }, + _ => new List + { + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d))), + new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), + }, }; } @@ -480,23 +502,35 @@ private static string GetMinersForDevice(ComputeDevice d) var json = JsonConvert.SerializeObject(miners); return json; } - //private static string GetLimitsForDevice(ComputeDevice d) - //{ - // List limits = new List(); - // if(d.DeviceMonitor is ITDP) - // { - // //todo need monitor here - // //if(d.DeviceMonitor.) - // //limits.Add(new Limit() { Name = "Power mode", Unit = "%" }); - // } - // if(d.DeviceMonitor is ICoreClockSet) - // { - - // } - // if(d.DeviceMonitor is IMemoryClockSet) - // { - - // } - //} + private static string GetLimitsForDevice(ComputeDevice d) + { + List limits = new List(); + if (d.DeviceMonitor is ITDP && d.DeviceMonitor is ITDPLimits tdpLim && d.CanSetPowerMode) + { + var lims = tdpLim.GetTDPLimits(); + if (lims.ok) + { + limits.Add(new Limit { Name = "Power mode", Unit = "%", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } + } + if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange ccLim) + { + var lims = ccLim.CoreClockRange; + if (lims.ok) + { + limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } + } + if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange mcLim) + { + var lims = mcLim.MemoryClockRange; + if (lims.ok) + { + limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } + } + var json = JsonConvert.SerializeObject(limits); + return json; + } } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 3efdc3be1..eb8014f5a 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -48,12 +48,6 @@ internal class LoginMessage : ISendMessage public string RigID { get; set; } = ""; [JsonProperty("worker")] public string Worker { get; set; } = ""; - //[JsonProperty("group")] - //public string Group { get; set; } = ""; - - // "static_properties": { ... }, - - // "optional_dynamic_properties": [ ... ], [JsonProperty("optional_dynamic_properties")] public List> OptionalDynamicProperties { get; set; } [JsonProperty("optional_mutable_properties")] @@ -69,35 +63,6 @@ internal class LoginMessage : ISendMessage public JObject MinerState { get; set; } } - - //internal class LoginMessageBreak : ISendMessage - //{ - // [JsonProperty("method")] - // public string Method => "loginBreak2"; - //} - - - // new stuff - - //internal class MinerBye : ISendMessage - //{ - // [JsonProperty("method")] - // public string Method => "miner.bye"; - // [JsonProperty("params")] - // public List Params = new List(); - //} - - //internal class ServerBye : IReceiveMessage - //{ - // [JsonProperty("method")] - // public string Method => "server.bye"; - // [JsonProperty("params")] - // public List Params = new List(); - //} - - - - internal interface IStaticMandatoryProperty { } internal interface IStaticOptionalProperty { } @@ -126,18 +91,11 @@ internal abstract class OptionalMutableProperty [JsonProperty("display_group")] public int? DisplayGroup { get; set; } = 0; - [JsonProperty("display_unit")] - public string DisplayUnit { get; set; } + [JsonProperty("display_unit", NullValueHandling = NullValueHandling.Ignore)] + public string? DisplayUnit { get; set; } [JsonProperty("type")] abstract public Type PropertyType { get; } - - //[JsonProperty("default")] - //public T DefaultValue { get; set; } - - //[JsonProperty("range")] - //public TR Range { get; set; } - [JsonIgnore] public Func> ExecuteTask { get; set; } @@ -365,17 +323,14 @@ public static NhmwsAction ActionProfilesBundleReset() return action; } } - internal class Device { [JsonProperty("static_properties")] public Dictionary StaticProperties { get; set; } [JsonProperty("optional_dynamic_properties")] - [JsonConverter(typeof(Nhmws4JSONConverter))] - public List<(string name, string unit)> OptionalDynamicProperties { get; set; } - - // + //[JsonConverter(typeof(Nhmws4JSONConverter))] + public List> OptionalDynamicProperties { get; set; } [JsonProperty("optional_mutable_properties")] public List OptionalMutableProperties { get; set; } @@ -424,10 +379,10 @@ public abstract class ParameterLogin { [JsonProperty("display_name")] public string DisplayName { get; set; } - [JsonProperty("display_group")] - public int DisplayGroup { get; set; } - [JsonProperty("display_unit")] - public string DisplayUnit { get; set; } + [JsonProperty("display_group", NullValueHandling = NullValueHandling.Ignore)] + public int? DisplayGroup { get; set; } + [JsonProperty("display_unit", NullValueHandling = NullValueHandling.Ignore)] + public string? DisplayUnit { get; set; } [JsonProperty("type")] abstract public Type PropertyType { get; } } @@ -580,17 +535,17 @@ internal class FanBundle [JsonProperty("max_fan_speed")] public int MaxFanSpeed { get; set; } } - //internal class Limit - //{ - // [JsonProperty("name")] - // public string Name { get; set; } - // [JsonProperty("unit")] - // public string Unit { get; set; } - // [JsonProperty("default")] - // public int def { get; set; } - // [JsonProperty("range")] - // [JsonConverter(typeof(Nhmws4JSONConverter))] - // public (int min, int max) range { get; set; } - //} + internal class Limit + { + [JsonProperty("name")] + public string Name { get; set; } + [JsonProperty("unit")] + public string Unit { get; set; } + [JsonProperty("default")] + public int Def { get; set; } + [JsonProperty("range")] + [JsonConverter(typeof(Nhmws4JSONConverter))] + public (int min, int max) Range { get; set; } + } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 70b689996..c1458e002 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -25,7 +25,7 @@ namespace NHMCore.Nhmws.V4 static class NHWebSocketV4 { #region locking - + private static readonly string _logTag = "NHWebSocketV4"; private static readonly object _lock = new object(); private class LockingProperty { @@ -701,16 +701,23 @@ private static Task ParseAndCallAction(SupportedAction typeOfAction, string para switch (typeOfAction) { case SupportedAction.ActionStartMining: + NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionStopMining: + NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionProfilesBundleSet: + var bundle = JsonConvert.DeserializeObject(parameters); + ExecuteProfilesBundleSet(bundle); break; case SupportedAction.ActionProfilesBundleReset: + ExecuteProfilesBundleReset(); break; case SupportedAction.ActionDeviceEnable: + NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionDeviceDisable: + NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionOcProfileTest: object jobjectOc = JsonConvert.DeserializeObject(parameters); @@ -728,10 +735,19 @@ private static Task ParseAndCallAction(SupportedAction typeOfAction, string para if (jsonObjELP.ToObject() is ElpBundle eb) ExecuteELPBundle(eb); break; default: + NHLog.Warn(_logTag, "This type of action is unsupported: " + typeOfAction); break; } return Task.CompletedTask; } + private static Task ExecuteProfilesBundleSet(Bundle bundle) + { + return Task.CompletedTask; + } + private static Task ExecuteProfilesBundleReset() + { + return Task.CompletedTask; + } private static Task ExecuteOCBundle(OcBundle ocBundle) { return Task.CompletedTask; From d4c71b1ee431f6ecab381f4066aab3af73775b56 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 11 Nov 2022 10:13:54 +0100 Subject: [PATCH 011/224] namespace adjustment --- .../Configs/ELPDataModels/AlgoELPData.cs | 2 +- .../Configs/ELPDataModels/MinerELPData.cs | 2 +- .../{Utils => Configs/Managers}/ELPManager.cs | 36 +++++++++---------- src/NHMCore/Mining/AlgorithmContainer.cs | 2 +- src/NHMCore/Mining/MiningManager.cs | 1 + src/NiceHashMiner/ViewModels/MainVM.cs | 1 + .../ViewModels/Plugins/PluginEntryVM.cs | 2 +- .../Views/ParameterOverview/AlgoItem.xaml.cs | 2 +- .../ParameterOverview/DeviceELPItem.xaml.cs | 2 +- .../Views/ParameterOverview/MinerItem.xaml.cs | 2 +- .../ParameterOverview.xaml.cs | 3 +- 11 files changed, 29 insertions(+), 26 deletions(-) rename src/NHMCore/{Utils => Configs/Managers}/ELPManager.cs (93%) diff --git a/src/NHMCore/Configs/ELPDataModels/AlgoELPData.cs b/src/NHMCore/Configs/ELPDataModels/AlgoELPData.cs index 6a00c089b..e9ba94cc2 100644 --- a/src/NHMCore/Configs/ELPDataModels/AlgoELPData.cs +++ b/src/NHMCore/Configs/ELPDataModels/AlgoELPData.cs @@ -1,6 +1,6 @@ using NHM.Common; using NHMCore.ApplicationState; -using NHMCore.Utils; +using NHMCore.Configs.Managers; using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/src/NHMCore/Configs/ELPDataModels/MinerELPData.cs b/src/NHMCore/Configs/ELPDataModels/MinerELPData.cs index 044f5ab7e..a7b91085e 100644 --- a/src/NHMCore/Configs/ELPDataModels/MinerELPData.cs +++ b/src/NHMCore/Configs/ELPDataModels/MinerELPData.cs @@ -1,7 +1,7 @@ using NHM.Common; using NHM.MinerPluginToolkitV1.CommandLine; using NHMCore.ApplicationState; -using NHMCore.Utils; +using NHMCore.Configs.Managers; using System; using System.Collections.Generic; using System.Collections.ObjectModel; diff --git a/src/NHMCore/Utils/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs similarity index 93% rename from src/NHMCore/Utils/ELPManager.cs rename to src/NHMCore/Configs/Managers/ELPManager.cs index edb7268db..e494390f2 100644 --- a/src/NHMCore/Utils/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -10,7 +10,7 @@ using System.Linq; using static NHM.MinerPluginToolkitV1.CommandLine.MinerConfigManager; -namespace NHMCore.Utils +namespace NHMCore.Configs.Managers { public delegate void NotifyELPChangeEventHandler(object sender, EventArgs e); public class ELPManager @@ -47,7 +47,7 @@ public MinerConfig CreateDefaultConfig(PluginConfiguration pconf) defCfg.MinerName = pconf.PluginName; defCfg.MinerUUID = pconf.PluginUUID; defCfg.MinerCommands.AddRange(pconf.MinerSpecificCommands); - Dictionary> algorithmDevicePairs = new(); + Dictionary> algorithmDevicePairs = new(); foreach (var devAlgoPair in pconf.SupportedDevicesAlgorithms) { foreach (var algo in devAlgoPair.Value) @@ -56,7 +56,7 @@ public MinerConfig CreateDefaultConfig(PluginConfiguration pconf) var devs = pconf.Devices.Where(dev => dev.deviceType.ToString().Contains(devAlgoPair.Key))? .Select(dev => new { P = (dev.Uuid, dev.FullName) })? .Select(p => p.P); - if(devs != null) algorithmDevicePairs[algo].AddRange(devs); + if (devs != null) algorithmDevicePairs[algo].AddRange(devs); } } foreach (var algoPairs in algorithmDevicePairs) @@ -103,7 +103,7 @@ public MinerConfig FixConfigIntegrityIfNeeded(MinerConfig data, PluginConfigurat public void UpdateMinerELPConfig() { - foreach(var miner in _minerELPs) + foreach (var miner in _minerELPs) { var config = ConstructConfigFromMinerELPData(miner); WriteConfig(config); @@ -131,7 +131,7 @@ public DeviceELPData FindDeviceNode(AlgorithmContainer ac, string uuid) } public string FindAppropriateCommandForAlgoContainer(AlgorithmContainer ac) { - if(ac == null) return string.Empty; + if (ac == null) return string.Empty; return _minerELPs .Where(miner => miner.UUID == ac.MinerUUID)? .FirstOrDefault()? @@ -139,7 +139,7 @@ public string FindAppropriateCommandForAlgoContainer(AlgorithmContainer ac) .FirstOrDefault()? .AllCMDStrings.Where(x => x.uuid == ac.ComputeDevice.Uuid)? .Select(x => x.command)? - .FirstOrDefault() ?? String.Empty; + .FirstOrDefault() ?? string.Empty; } public MinerELPData ConstructMinerELPDataFromConfig(MinerConfig cfg) { @@ -161,12 +161,12 @@ public MinerELPData ConstructMinerELPDataFromConfig(MinerConfig cfg) .Distinct()? .ToList(); uniqueFlags?.ForEach(f => tempAlgo.Devices[HEADER].AddELP(f)); - if (!uniqueFlags.Any()) tempAlgo.Devices[HEADER].ELPs.Add(new DeviceELPElement(false) { ELP = String.Empty }); + if (!uniqueFlags.Any()) tempAlgo.Devices[HEADER].ELPs.Add(new DeviceELPElement(false) { ELP = string.Empty }); tempAlgo.Name = algo.AlgorithmName; foreach (var dev in algo.Devices) { var tempELPElts = new DeviceELPElement[uniqueFlags?.Count + 1 ?? 1]; - tempELPElts[tempELPElts.Length - 1] = new DeviceELPElement() { ELP = String.Empty }; + tempELPElts[tempELPElts.Length - 1] = new DeviceELPElement() { ELP = string.Empty }; foreach (var arg in dev.Value.Commands) { if (arg.Count != 3) continue; @@ -213,7 +213,7 @@ private MinerConfig ConstructConfigFromMinerELPData(MinerELPData miner) { var deviceParams = new List>(); if (dev.IsDeviceDataHeader) continue; - for (int i = 0; i < dev.ELPs.Count; i++) + for (var i = 0; i < dev.ELPs.Count; i++) { if (header.ELPs[i] == null || header.ELPs[i].ELP == null) continue; var flagAndDelim = header.ELPs[i].ELP.Trim().Split(' '); @@ -246,47 +246,47 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) .Select((elp, index) => new { elp, index }) .Where(item => string.IsNullOrEmpty(item.elp.ELP.Trim())) .FirstOrDefault(); - bool shouldDelete = false; - if(columnToDelete != null) shouldDelete = columnToDelete.index < header.ELPs.Count - 1; + var shouldDelete = false; + if (columnToDelete != null) shouldDelete = columnToDelete.index < header.ELPs.Count - 1; List<(string devUUID, List> paramList)> devParams = new(); if (algo.Devices == null) algo.Devices = new(); foreach (var dev in algo.Devices) { if (dev.IsDeviceDataHeader && !string.IsNullOrEmpty(dev.ELPs?.LastOrDefault()?.ELP)) shouldAddnewColumn = true; - if (shouldAddnewColumn) dev.ELPs.Add(new DeviceELPElement(!dev.IsDeviceDataHeader) { ELP = String.Empty }); + if (shouldAddnewColumn) dev.ELPs.Add(new DeviceELPElement(!dev.IsDeviceDataHeader) { ELP = string.Empty }); if (header.ELPs == null || dev.ELPs == null) continue; if (columnToDelete != null && shouldDelete) dev.ELPs.RemoveAt(columnToDelete.index); if (header.ELPs.Count != dev.ELPs.Count) continue; List> oneDevParams = new(); - for (int i = 0; i < dev.ELPs.Count; i++) + for (var i = 0; i < dev.ELPs.Count; i++) { var flagAndDelim = header.ELPs[i].ELP.Trim().Split(' '); if (flagAndDelim.Length != 2) continue; - if (dev.ELPs[i].ELP == String.Empty) continue; + if (dev.ELPs[i].ELP == string.Empty) continue; oneDevParams.Add(new List { flagAndDelim[0], dev.ELPs[i].ELP, flagAndDelim[1] }); } devParams.Add((dev.UUID, oneDevParams)); dev.ConstructedELPs = oneDevParams; } Dictionary, List<(string devUUID, List> paramList)>> deviceParamsGroups = new(); - for (int first = 1; first < devParams.Count; first++) + for (var first = 1; first < devParams.Count; first++) { var isPartOfGroup = deviceParamsGroups.Keys.Any(keys => keys.Contains(first)); if (isPartOfGroup) continue; var group = new HashSet { first }; - for (int second = first + 1; second < devParams.Count; second++) + for (var second = first + 1; second < devParams.Count; second++) { if (MinerExtraParameters.CheckIfCanGroup(new List>> { devParams[first].paramList, devParams[second].paramList })) group.Add(second); } var selectionGroup = devParams.Where((_, index) => group.Contains(index)).ToList(); - deviceParamsGroups.Add(group, selectionGroup); + deviceParamsGroups.Add(group, selectionGroup); } var parsedCommandsPerGroup = new List<(string uuid, string command)>(); foreach (var dev in deviceParamsGroups) { var uuidList = dev.Value.Select(k => k.devUUID).ToList(); var command = MinerExtraParameters.Parse(minerParams, algoParams, dev.Value.Select(v => v.paramList).ToList()); - foreach(var uuid in uuidList) + foreach (var uuid in uuidList) { parsedCommandsPerGroup.Add((uuid, command)); } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 605dfc9cc..948482fad 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -5,8 +5,8 @@ using NHMCore.ApplicationState; using NHMCore.Configs; using NHMCore.Configs.ELPDataModels; +using NHMCore.Configs.Managers; using NHMCore.Mining.Plugins; -using NHMCore.Utils; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index c6311043b..f9d6f52b9 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -2,6 +2,7 @@ using NHM.Common.Enums; using NHMCore.ApplicationState; using NHMCore.Configs; +using NHMCore.Configs.Managers; using NHMCore.Mining.Grouping; using NHMCore.Notifications; using NHMCore.Schedules; diff --git a/src/NiceHashMiner/ViewModels/MainVM.cs b/src/NiceHashMiner/ViewModels/MainVM.cs index 27fb3431c..5e5b9ccb0 100644 --- a/src/NiceHashMiner/ViewModels/MainVM.cs +++ b/src/NiceHashMiner/ViewModels/MainVM.cs @@ -8,6 +8,7 @@ using NHMCore.ApplicationState; using NHMCore.Configs; using NHMCore.Configs.ELPDataModels; +using NHMCore.Configs.Managers; using NHMCore.Mining; using NHMCore.Mining.IdleChecking; using NHMCore.Mining.MiningStats; diff --git a/src/NiceHashMiner/ViewModels/Plugins/PluginEntryVM.cs b/src/NiceHashMiner/ViewModels/Plugins/PluginEntryVM.cs index 01b54f9f3..e183741b4 100644 --- a/src/NiceHashMiner/ViewModels/Plugins/PluginEntryVM.cs +++ b/src/NiceHashMiner/ViewModels/Plugins/PluginEntryVM.cs @@ -1,6 +1,6 @@ using NHM.Common; +using NHMCore.Configs.Managers; using NHMCore.Mining.Plugins; -using NHMCore.Utils; using NiceHashMiner.ViewModels.Models; using System; using System.Collections.Generic; diff --git a/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml.cs b/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml.cs index 9dc5af72d..4b70c1e13 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml.cs +++ b/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml.cs @@ -1,6 +1,6 @@ using NHM.Common.Enums; using NHMCore.Configs.ELPDataModels; -using NHMCore.Utils; +using NHMCore.Configs.Managers; using NiceHashMiner.ViewModels.Models; using System; using System.Collections.Generic; diff --git a/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml.cs b/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml.cs index bb3c1c0f7..cea287dcd 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml.cs +++ b/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml.cs @@ -15,8 +15,8 @@ using System.Windows.Shapes; using NHM.Common.Enums; using NHMCore.Configs.ELPDataModels; -using NHMCore.Utils; using Windows.UI; +using NHMCore.Configs.Managers; namespace NiceHashMiner.Views.ParameterOverview { diff --git a/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml.cs b/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml.cs index b11e6776f..cff55c804 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml.cs +++ b/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml.cs @@ -1,5 +1,5 @@ using NHMCore.Configs.ELPDataModels; -using NHMCore.Utils; +using NHMCore.Configs.Managers; using NiceHashMiner.ViewModels.Models; using System; using System.Collections.Generic; diff --git a/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml.cs b/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml.cs index 3694791b1..29d1309f5 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml.cs +++ b/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml.cs @@ -1,4 +1,5 @@ -using NHMCore.Utils; +using NHMCore.Configs.Managers; +using NHMCore.Utils; using NiceHashMiner.ViewModels; using System; using System.Collections.Generic; From b34b238812e1c6c65c59298e83b3565a8dee4d67 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 14 Nov 2022 15:01:09 +0100 Subject: [PATCH 012/224] continue setting oc --- .../DeviceMonitorNVIDIA.cs | 6 +- src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 2 + src/NHMCore/Configs/Managers/FanManager.cs | 12 +++ src/NHMCore/Configs/Managers/OCManager.cs | 59 +++++++++++++ src/NHMCore/Mining/ComputeDevice.cs | 5 ++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 3 + src/NHMCore/Nhmws/V4/MessagesV4.cs | 83 ++++++++++++++----- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 43 ++++++++++ 8 files changed, 190 insertions(+), 23 deletions(-) create mode 100644 src/NHMCore/Configs/Managers/FanManager.cs create mode 100644 src/NHMCore/Configs/Managers/OCManager.cs diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index 349abe362..a231cd2da 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -8,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits + internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits { private const int RET_OK = 0; public static object _lock = new object(); @@ -294,6 +294,10 @@ public bool SetCoreClock(int coreClock) { return NVIDIA_MON.nhm_nvidia_device_set_core_clocks(BusID, coreClock) == 0 ? true : false; } + public bool SetMemoryClock(int memoryClock) + { + return NVIDIA_MON.nhm_nvidia_device_set_memory_clocks(BusID, memoryClock) == 0 ? true : false; + } public (bool ok, uint min, uint max, uint def) GetTDPLimits() { uint min = 0; diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index 7ca4d8eba..21b04c5bc 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -48,6 +48,8 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_clocks(int bus_number, ref int memory_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_set_memory_clocks(int bus_number, int memory_clocks); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_info(int bus_number, ref ulong free, ref ulong total, ref ulong used); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_restore_fan_speed(int bus_number); diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs new file mode 100644 index 000000000..ccb01928d --- /dev/null +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Configs.Managers +{ + internal class FanManager + { + } +} diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs new file mode 100644 index 000000000..3889883f5 --- /dev/null +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -0,0 +1,59 @@ +using NHMCore.ApplicationState; +using NHMCore.Mining; +using NHMCore.Nhmws.V4; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Configs.Managers +{ + public class OCManager + { + private OCManager() { } + public static OCManager Instance { get; } = new OCManager(); + private List _ocBundles = new(); + public void ClearBundles() + { + _ocBundles.Clear(); + } + public bool AddOCAndApply(OcBundle bundle) + { + _ocBundles.Add(bundle); + if (!MiningState.Instance.AnyDeviceRunning) return true; + //var miningDevs = AvailableDevices.Devices.Where(d => d.State == NHM.Common.Enums.DeviceState.Mining && d.State == NHM.Common.Enums.DeviceState.Benchmarking); + //if (!miningDevs.Any()) return true; + if ((bundle.AlgoId == null && bundle.MinerId == null) || (!bundle.AlgoId.Any() && !bundle.MinerId.Any())) + { + var contextDevices = AvailableDevices.Devices + .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking) + .Where(d => d.Name == bundle.DeviceName); + foreach (var contextDevice in contextDevices) + { + var okCC = contextDevice.SetCoreClock(bundle.CoreClock); + var okMC = contextDevice.SetMemoryClock(bundle.MemoryClock); + var okTDP = contextDevice.SetPowerModeManual(bundle.TDP); + //todo continue here + //foreach(var algoContainer in contextDevice.AlgorithmSettings) + //{ + // //stuff can be null here!!!!! + + // algoContainer.OCSetting = (bundle.CoreClock, bundle.MemoryClock, bundle.MemoryClock); + // //apply + //} + } + } + else if(bundle.AlgoId == null) + { + + } + else if(bundle.MinerId == null) + { + + } + return true; + + } + } +} diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 476544f68..17091691f 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -329,6 +329,11 @@ public bool SetPowerMode(TDPSimpleType level) if (CanSetTDP && DeviceMonitor is ITDP set) return set.SetTDPSimple(level); return false; } + public bool SetPowerModeManual(int TDP) + { + if (CanSetTDP && DeviceMonitor is ITDP set) return set.SetTDPPercentage(TDP); + return false; + } public bool SetCoreClock(int coreClock) { if(CanSetTDP && DeviceMonitor is ICoreClockSet set) return set.SetCoreClock(coreClock); diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index f74abd489..ee33337e6 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -450,8 +450,11 @@ private static List CreateDefaultDeviceActions() NhmwsAction.ActionDeviceEnable(), NhmwsAction.ActionDeviceDisable(), NhmwsAction.ActionOcProfileTest(), + NhmwsAction.ActionOcProfileTestStop(), NhmwsAction.ActionFanProfileTest(), + NhmwsAction.ActionFanProfileTestStop(), NhmwsAction.ActionElpProfileTest(), + NhmwsAction.ActionElpProfileTestStop(), }; } private static List CreateDefaultRigActions() diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index eb8014f5a..7c3e0d0d1 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -30,9 +30,9 @@ public enum SupportedAction : int ActionOcProfileTest, ActionFanProfileTest, ActionElpProfileTest, - - - + ActionElpProfileTestStop, + ActionOcProfileTestStop, + ActionFanProfileTestStop, } internal class LoginMessage : ISendMessage { @@ -215,6 +215,19 @@ public static NhmwsAction ActionOcProfileTest() ActionMap.ActionList.Add(action); return action; } + public static NhmwsAction ActionOcProfileTestStop() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "OC profile stop test", + DisplayGroup = 1, + Parameters = new(), + ActionType = SupportedAction.ActionOcProfileTestStop, + }; + ActionMap.ActionList.Add(action); + return action; + } public static NhmwsAction ActionFanProfileTest() { var action = new NhmwsAction @@ -244,6 +257,19 @@ public static NhmwsAction ActionFanProfileTest() ActionMap.ActionList.Add(action); return action; } + public static NhmwsAction ActionFanProfileTestStop() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Fan profile stop test", + DisplayGroup = 1, + Parameters = new(), + ActionType = SupportedAction.ActionFanProfileTestStop, + }; + ActionMap.ActionList.Add(action); + return action; + } public static NhmwsAction ActionElpProfileTest() { var action = new NhmwsAction @@ -265,6 +291,19 @@ public static NhmwsAction ActionElpProfileTest() ActionMap.ActionList.Add(action); return action; } + public static NhmwsAction ActionElpProfileTestStop() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "ELP profile stop test", + DisplayGroup = 1, + Parameters = new(), + ActionType= SupportedAction.ActionElpProfileTestStop, + }; + ActionMap.ActionList.Add(action); + return action; + } public static NhmwsAction ActionStartMining() { var action = new NhmwsAction @@ -477,36 +516,36 @@ internal class Bundle public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } - [JsonProperty("oc")] - public List OcBundles { get; set; } = new List(); - [JsonProperty("fan")] - public List FanBundles { get; set; } = new List(); - [JsonProperty("elp")] - public List ElpBundles { get; set; } = new List(); + [JsonProperty("oc", NullValueHandling = NullValueHandling.Ignore)] + public List? OcBundles { get; set; } + [JsonProperty("fan", NullValueHandling = NullValueHandling.Ignore)] + public List? FanBundles { get; set; } + [JsonProperty("elp", NullValueHandling = NullValueHandling.Ignore)] + public List? ElpBundles { get; set; } } internal class ElpBundle { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("device_name")] - public string DeviceName { get; set; } - [JsonProperty("miner_id")] - public string MinerId { get; set; } - [JsonProperty("algorithm_id")] + public List? DeviceName { get; set; } + [JsonProperty("miner_id", NullValueHandling = NullValueHandling.Ignore)] + public List? MinerId { get; set; } + [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] public string AlgoId { get; set; } [JsonProperty("elp")] public string Elp { get; set; } } - internal class OcBundle + public class OcBundle { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("device_name")] public string DeviceName { get; set; } - [JsonProperty("miner_id")] - public string? MinerId { get; set; } - [JsonProperty("algorithm_id")] - public string? AlgoId { get; set; } + [JsonProperty("miner_id", NullValueHandling = NullValueHandling.Ignore)] + public List? MinerId { get; set; } + [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] + public List? AlgoId { get; set; } [JsonProperty("core_clock")] public int CoreClock { get; set; } [JsonProperty("memory_clock")] @@ -520,10 +559,10 @@ internal class FanBundle public string Name { get; set; } [JsonProperty("device_name")] public string DeviceName { get; set; } - [JsonProperty("miner_id")] - public string? MinerId { get; set; } - [JsonProperty("algorithm_id")] - public string? AlgoId { get; set; } + [JsonProperty("miner_id", NullValueHandling = NullValueHandling.Ignore)] + public List? MinerId { get; set; } + [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] + public List? AlgoId { get; set; } [JsonProperty("type")] public int Type { get; set; } [JsonProperty("fan_speed")] diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index c1458e002..40993c43b 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -5,6 +5,7 @@ using NHM.DeviceMonitoring.TDP; using NHMCore.ApplicationState; using NHMCore.Configs; +using NHMCore.Configs.Managers; using NHMCore.Mining; using NHMCore.Switching; using NHMCore.Utils; @@ -742,6 +743,19 @@ private static Task ParseAndCallAction(SupportedAction typeOfAction, string para } private static Task ExecuteProfilesBundleSet(Bundle bundle) { + //todo check returns!!! + if(bundle.OcBundles != null) + { + ExecuteOCBundles(bundle.OcBundles); + } + if(bundle.FanBundles != null) + { + ExecuteFanBundles(bundle.FanBundles); + } + if(bundle.ElpBundles != null) + { + ExecuteELPBundles(bundle.ElpBundles); + } return Task.CompletedTask; } private static Task ExecuteProfilesBundleReset() @@ -750,12 +764,32 @@ private static Task ExecuteProfilesBundleReset() } private static Task ExecuteOCBundle(OcBundle ocBundle) { + OCManager.Instance.ClearBundles(); + OCManager.Instance.AddOCAndApply(ocBundle); + return Task.CompletedTask; + } + private static Task ExecuteOCBundles(List bundles) + { + foreach (var bundle in bundles) + { + //todo check returns + ExecuteOCBundle(bundle); + } return Task.CompletedTask; } private static Task ExecuteELPBundle(ElpBundle elpBundle) { return Task.CompletedTask; } + private static Task ExecuteELPBundles(List bundles) + { + foreach (var bundle in bundles) + { + //todo check returns + ExecuteELPBundle(bundle); + } + return Task.CompletedTask; + } private static Task ExecuteFanBundle(FanBundle fanBundle) { object t = fanBundle.Type switch @@ -767,6 +801,15 @@ private static Task ExecuteFanBundle(FanBundle fanBundle) }; return Task.CompletedTask; } + private static Task ExecuteFanBundles(List bundles) + { + foreach (var bundle in bundles) + { + //todo check returns + ExecuteFanBundle(bundle); + } + return Task.CompletedTask; + } private static Task ExecuteFanBundleFixed(FanBundle fanBundle) { return Task.CompletedTask; From 6ed768f68c950a2ba53de046245645c927978d79 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 16 Nov 2022 14:59:19 +0100 Subject: [PATCH 013/224] return action from oc test --- src/NHMCore/Configs/Managers/OCManager.cs | 133 ++++++++++++++++------ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 20 ++-- src/NHMCore/Nhmws/V4/MessagesV4.cs | 25 ++-- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 54 +++++---- 4 files changed, 157 insertions(+), 75 deletions(-) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 3889883f5..3ed59bd06 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -1,9 +1,11 @@ -using NHMCore.ApplicationState; +using NHM.Common; +using NHMCore.ApplicationState; using NHMCore.Mining; using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; @@ -14,46 +16,113 @@ public class OCManager private OCManager() { } public static OCManager Instance { get; } = new OCManager(); private List _ocBundles = new(); - public void ClearBundles() + private List _testOcBundles = new(); + private readonly string _TAG = "OCManager"; + + private enum OcReturn { - _ocBundles.Clear(); + Success, + PartialSuccess, + Fail } - public bool AddOCAndApply(OcBundle bundle) + + private Task SetOcForDevice(AlgorithmContainer container, OcBundle bundle) { - _ocBundles.Add(bundle); - if (!MiningState.Instance.AnyDeviceRunning) return true; - //var miningDevs = AvailableDevices.Devices.Where(d => d.State == NHM.Common.Enums.DeviceState.Mining && d.State == NHM.Common.Enums.DeviceState.Benchmarking); - //if (!miningDevs.Any()) return true; - if ((bundle.AlgoId == null && bundle.MinerId == null) || (!bundle.AlgoId.Any() && !bundle.MinerId.Any())) - { - var contextDevices = AvailableDevices.Devices - .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking) - .Where(d => d.Name == bundle.DeviceName); - foreach (var contextDevice in contextDevices) - { - var okCC = contextDevice.SetCoreClock(bundle.CoreClock); - var okMC = contextDevice.SetMemoryClock(bundle.MemoryClock); - var okTDP = contextDevice.SetPowerModeManual(bundle.TDP); - //todo continue here - //foreach(var algoContainer in contextDevice.AlgorithmSettings) - //{ - // //stuff can be null here!!!!! + var setCC = bundle.CoreClock == 0 ? container.ComputeDevice.SetCoreClock(bundle.CoreClock) : false; + Logger.Warn(_TAG, $"Setting core clock for device {container.ComputeDevice.Name} success: {setCC}"); + var setMC = bundle.MemoryClock == 0 ? container.ComputeDevice.SetMemoryClock(bundle.MemoryClock) : false; + Logger.Warn(_TAG, $"Setting memory clock for device {container.ComputeDevice.Name} success: {setMC}"); + var setTDP = bundle.TDP == 0 ? container.ComputeDevice.SetPowerModeManual(bundle.TDP) : false; + Logger.Warn(_TAG, $"Setting TDP for device {container.ComputeDevice.Name} success: {setTDP}"); + if (setCC && setMC && setTDP) return Task.FromResult(OcReturn.Success); + if (!setCC && !setMC && !setTDP) return Task.FromResult(OcReturn.Fail); + return Task.FromResult(OcReturn.PartialSuccess); + } - // algoContainer.OCSetting = (bundle.CoreClock, bundle.MemoryClock, bundle.MemoryClock); - // //apply - //} - } + + //todo cleanup for many different tests if they come one after another + public Task ExecuteTest(string uuid, OcBundle bundle) + { + _testOcBundles.Add(bundle); + if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult("No devices running"); + var allContainers = AvailableDevices.Devices + .Where(d => d.B64Uuid == uuid)? + .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings); + //var MiningState = AvailableDevices.Devices.Where(d => d.Name == bundle.DeviceName)?.SelectMany(d => d.AlgorithmSettings); //for testing + if (allContainers == null || !allContainers.Any()) return Task.FromResult("Action target mismatch"); + if (bundle.AlgoId != null && bundle.MinerId != null) allContainers = allContainers.Where(d => + bundle.AlgoId.Contains(d.AlgorithmName) && + bundle.MinerId.Contains(d.PluginName)); + else if (bundle.AlgoId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName)); + else if (bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName)); + if (allContainers == null || !allContainers.Any()) return Task.FromResult("Action target mismatch, containers null"); + var distinctDevs = allContainers.DistinctBy(d => d.ComputeDevice.Uuid); + Logger.Info(_TAG, "Applying OC Test for following containers:"); + List success = new(); + foreach (var container in distinctDevs) + { + Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); + var ret = SetOcForDevice(container, bundle); + if (ret.IsCompleted) success.Add(ret.Result); } - else if(bundle.AlgoId == null) + if (success.All(s => s == OcReturn.Success)) return Task.FromResult("Successfully executed test"); + if (success.All(s => s == OcReturn.Fail)) return Task.FromResult("Failed to execute all tests"); + return Task.FromResult("Partially executed tests"); + } + //clear first???? + public Task ApplyOcBundle(List bundles) //tdp is null? can a value be missing?????? + { + _ocBundles.AddRange(bundles); + List processed = new(); + if (!MiningState.Instance.AnyDeviceRunning) return Task.CompletedTask; + var sorted = new List<(int, OcBundle)>(); + foreach (var bundle in bundles) { - + if (bundle.MinerId.Any() && bundle.AlgoId.Any()) sorted.Add((0, bundle)); + else if (!bundle.MinerId.Any() && bundle.AlgoId.Any()) sorted.Add((1, bundle)); + else if (bundle.MinerId.Any() && !bundle.AlgoId.Any()) sorted.Add((2, bundle)); + else sorted.Add((3, bundle)); } - else if(bundle.MinerId == null) + sorted = sorted.OrderByDescending(item => item.Item1).Reverse().ToList(); + foreach (var (type, bundle) in sorted) { - + var current = new List(); + if (type == 0) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? + .Where(c => bundle.MinerId.Contains(c.PluginName))? + .ToList(); + else if (type == 1) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? + .ToList(); + else if (type == 2) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.MinerId.Contains(c.PluginName))? + .ToList(); + else current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + .SelectMany(d => d.AlgorithmSettings)? + .ToList(); + if (current == null) continue; + current = current.Where(c => !processed.Contains(c)).ToList(); + processed.AddRange(current); + foreach (var container in current) + { + Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); + SetOcForDevice(container, bundle); + } } - return true; - + return Task.CompletedTask; } } } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index ee33337e6..547b09059 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -288,7 +288,7 @@ Device mapComputeDevice(ComputeDevice d) { "name", d.Name }, { "optional", GetStaticPropertiesOptionalValues(d) }, }, - Actions = CreateDefaultDeviceActions(), + Actions = CreateDefaultDeviceActions(d.B64Uuid), OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true).properties), OptionalMutableProperties = GetDeviceOptionalMutable(d).properties, }; @@ -443,18 +443,18 @@ JArray mmv(ComputeDevice d) Devices = devices.Select(toDeviceState).ToList(), }; } - private static List CreateDefaultDeviceActions() + private static List CreateDefaultDeviceActions(string uuid) { return new List { - NhmwsAction.ActionDeviceEnable(), - NhmwsAction.ActionDeviceDisable(), - NhmwsAction.ActionOcProfileTest(), - NhmwsAction.ActionOcProfileTestStop(), - NhmwsAction.ActionFanProfileTest(), - NhmwsAction.ActionFanProfileTestStop(), - NhmwsAction.ActionElpProfileTest(), - NhmwsAction.ActionElpProfileTestStop(), + NhmwsAction.ActionDeviceEnable(uuid), + NhmwsAction.ActionDeviceDisable(uuid), + NhmwsAction.ActionOcProfileTest(uuid), + NhmwsAction.ActionOcProfileTestStop(uuid), + NhmwsAction.ActionFanProfileTest(uuid), + NhmwsAction.ActionFanProfileTestStop(uuid), + NhmwsAction.ActionElpProfileTest(uuid), + NhmwsAction.ActionElpProfileTestStop(uuid), }; } private static List CreateDefaultRigActions() diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 7c3e0d0d1..2bbc763ff 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -170,7 +170,8 @@ public class NhmwsAction public SupportedAction ActionType { get; set; } [JsonIgnore] public Func> ExecuteTask { get; set; } - public static NhmwsAction ActionDeviceEnable() + public string DeviceUUID = String.Empty; + public static NhmwsAction ActionDeviceEnable(string uuid) { var action = new NhmwsAction { @@ -178,11 +179,12 @@ public static NhmwsAction ActionDeviceEnable() DisplayName = "Device enable", DisplayGroup = 0, ActionType = SupportedAction.ActionDeviceEnable, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionDeviceDisable() + public static NhmwsAction ActionDeviceDisable(string uuid) { var action = new NhmwsAction { @@ -190,11 +192,12 @@ public static NhmwsAction ActionDeviceDisable() DisplayName = "Device disable", DisplayGroup = 0, ActionType = SupportedAction.ActionDeviceDisable, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionOcProfileTest() + public static NhmwsAction ActionOcProfileTest(string uuid) { var action = new NhmwsAction { @@ -211,11 +214,12 @@ public static NhmwsAction ActionOcProfileTest() } }, ActionType = SupportedAction.ActionOcProfileTest, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionOcProfileTestStop() + public static NhmwsAction ActionOcProfileTestStop(string uuid) { var action = new NhmwsAction { @@ -224,11 +228,12 @@ public static NhmwsAction ActionOcProfileTestStop() DisplayGroup = 1, Parameters = new(), ActionType = SupportedAction.ActionOcProfileTestStop, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionFanProfileTest() + public static NhmwsAction ActionFanProfileTest(string uuid) { var action = new NhmwsAction { @@ -253,11 +258,12 @@ public static NhmwsAction ActionFanProfileTest() return 0; }, ActionType = SupportedAction.ActionFanProfileTest, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionFanProfileTestStop() + public static NhmwsAction ActionFanProfileTestStop(string uuid) { var action = new NhmwsAction { @@ -266,11 +272,12 @@ public static NhmwsAction ActionFanProfileTestStop() DisplayGroup = 1, Parameters = new(), ActionType = SupportedAction.ActionFanProfileTestStop, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionElpProfileTest() + public static NhmwsAction ActionElpProfileTest(string uuid) { var action = new NhmwsAction { @@ -287,11 +294,12 @@ public static NhmwsAction ActionElpProfileTest() } }, ActionType= SupportedAction.ActionElpProfileTest, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; } - public static NhmwsAction ActionElpProfileTestStop() + public static NhmwsAction ActionElpProfileTestStop(string uuid) { var action = new NhmwsAction { @@ -300,6 +308,7 @@ public static NhmwsAction ActionElpProfileTestStop() DisplayGroup = 1, Parameters = new(), ActionType= SupportedAction.ActionElpProfileTestStop, + DeviceUUID = uuid }; ActionMap.ActionList.Add(action); return action; diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 40993c43b..de95e2d57 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -18,6 +18,8 @@ using System.Threading; using System.Threading.Tasks; using WebSocketSharp; +using Windows.Media.PlayTo; +using Logger = NHM.Common.Logger; // static imports using NHLog = NHM.Common.Logger; @@ -65,7 +67,7 @@ private enum MessageType CLOSE_WEBSOCKET = 0, SEND_MESSAGE_STATUS, } - + private static readonly string _TAG = "NHWebSocketV4"; static private bool _isNhmwsRestart = false; static private bool IsWsAlive => _webSocket?.ReadyState == WebSocketState.Open; @@ -596,7 +598,7 @@ private static Task StopMining(string devs) #endregion Stop #region Actions - + #endregion Actions private static Task SetPowerMode(string device, TDPSimpleType level) @@ -688,17 +690,19 @@ private static Task CallAction(MinerCallAction action) return Task.FromResult(string.Empty); } //var typeOfParams = - foreach(var param in action.Parameters) + var ret = string.Empty; + foreach (var param in action.Parameters) { - ParseAndCallAction(actionRecord.ActionType, param); + ret += ParseAndCallAction(action.DeviceId, action.Id, actionRecord.ActionType, param).Result; } //some switch to determine command //handle each param in request //return result - return Task.FromResult(""); + return Task.FromResult(ret); } - private static Task ParseAndCallAction(SupportedAction typeOfAction, string parameters) + private static Task ParseAndCallAction(string deviceUUID, int messageID, SupportedAction typeOfAction, string parameters) { + var result = string.Empty; switch (typeOfAction) { case SupportedAction.ActionStartMining: @@ -721,38 +725,43 @@ private static Task ParseAndCallAction(SupportedAction typeOfAction, string para NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionOcProfileTest: - object jobjectOc = JsonConvert.DeserializeObject(parameters); - if (jobjectOc is not JObject jsonObjOC) break; - if (jsonObjOC.ToObject() is OcBundle ob) ExecuteOCBundle(ob); + var oc = JsonConvert.DeserializeObject(parameters); + result = ExecuteOCTest(deviceUUID, oc).Result; + break; + case SupportedAction.ActionOcProfileTestStop: break; case SupportedAction.ActionFanProfileTest: object jobjectFan = JsonConvert.DeserializeObject(parameters); if (jobjectFan is not JObject jsonObjFan) break; if (jsonObjFan.ToObject() is FanBundle fb) ExecuteFanBundle(fb); break; + case SupportedAction.ActionFanProfileTestStop: + break; case SupportedAction.ActionElpProfileTest: object jobjectELP = JsonConvert.DeserializeObject(parameters); if (jobjectELP is not JObject jsonObjELP) break; if (jsonObjELP.ToObject() is ElpBundle eb) ExecuteELPBundle(eb); break; + case SupportedAction.ActionElpProfileTestStop: + break; default: NHLog.Warn(_logTag, "This type of action is unsupported: " + typeOfAction); break; } - return Task.CompletedTask; + return Task.FromResult(result); } private static Task ExecuteProfilesBundleSet(Bundle bundle) { //todo check returns!!! - if(bundle.OcBundles != null) + if (bundle.OcBundles != null) { - ExecuteOCBundles(bundle.OcBundles); + ApplyOCBundle(bundle.OcBundles); } - if(bundle.FanBundles != null) + if (bundle.FanBundles != null) { ExecuteFanBundles(bundle.FanBundles); } - if(bundle.ElpBundles != null) + if (bundle.ElpBundles != null) { ExecuteELPBundles(bundle.ElpBundles); } @@ -762,20 +771,15 @@ private static Task ExecuteProfilesBundleReset() { return Task.CompletedTask; } - private static Task ExecuteOCBundle(OcBundle ocBundle) + private static Task ExecuteOCTest(string deviceUUID, OcBundle ocBundle) { - OCManager.Instance.ClearBundles(); - OCManager.Instance.AddOCAndApply(ocBundle); - return Task.CompletedTask; + var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); + return Task.FromResult(res.Result); } - private static Task ExecuteOCBundles(List bundles) + private static Task ApplyOCBundle(List bundles) { - foreach (var bundle in bundles) - { - //todo check returns - ExecuteOCBundle(bundle); - } - return Task.CompletedTask; + var ret = OCManager.Instance.ApplyOcBundle(bundles); + return ret; } private static Task ExecuteELPBundle(ElpBundle elpBundle) { From a261a26a7126a67d3d413ba8ede02135eba64871 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 17 Nov 2022 14:20:02 +0100 Subject: [PATCH 014/224] finished but not tested profile test for oc --- src/NHM.Common/Enums/DeviceState.cs | 1 + src/NHM.Common/Enums/RigStatus.cs | 1 + src/NHMCore/ApplicationState/MiningState.cs | 2 +- .../ApplicationStateManager.cs | 4 +- src/NHMCore/Configs/Managers/OCManager.cs | 37 +++++++++------ src/NHMCore/Nhmws/ErrorCode.cs | 10 +++- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 1 + src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 47 +++++++++++-------- 8 files changed, 66 insertions(+), 37 deletions(-) diff --git a/src/NHM.Common/Enums/DeviceState.cs b/src/NHM.Common/Enums/DeviceState.cs index ec36a5447..5e6713aed 100644 --- a/src/NHM.Common/Enums/DeviceState.cs +++ b/src/NHM.Common/Enums/DeviceState.cs @@ -11,6 +11,7 @@ public enum DeviceState Disabled, #if NHMWS4 Gaming, + Testing #endif // TODO Extra states, NotProfitable } diff --git a/src/NHM.Common/Enums/RigStatus.cs b/src/NHM.Common/Enums/RigStatus.cs index 8cf5ede7b..27bfc055e 100644 --- a/src/NHM.Common/Enums/RigStatus.cs +++ b/src/NHM.Common/Enums/RigStatus.cs @@ -11,5 +11,6 @@ public enum RigStatus Pending, Disabled, Gaming, + Testing, } } diff --git a/src/NHMCore/ApplicationState/MiningState.cs b/src/NHMCore/ApplicationState/MiningState.cs index 0688d4104..d398ccb31 100644 --- a/src/NHMCore/ApplicationState/MiningState.cs +++ b/src/NHMCore/ApplicationState/MiningState.cs @@ -120,7 +120,7 @@ public void CalculateDevicesStateChange() AnyDeviceEnabled = AvailableDevices.Devices.Any(dev => dev.Enabled); AnyDeviceStopped = AvailableDevices.Devices.Any(dev => dev.State == DeviceState.Stopped && (dev.State != DeviceState.Disabled)); #if NHMWS4 - AnyDeviceRunning = AvailableDevices.Devices.Any(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Gaming); + AnyDeviceRunning = AvailableDevices.Devices.Any(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Gaming || dev.State == DeviceState.Testing); #else AnyDeviceRunning = AvailableDevices.Devices.Any(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking); #endif diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs index baa72d26c..ff713caf0 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs @@ -194,7 +194,7 @@ public static RigStatus CalcRigStatus() rigState = RigStatus.Stopped; } #if NHMWS4 - var anyMining = allDevs.Any(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Gaming); + var anyMining = allDevs.Any(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Gaming || dev.State == DeviceState.Testing); #else var anyMining = allDevs.Any(dev => dev.State == DeviceState.Mining); #endif @@ -228,6 +228,8 @@ public static string CalcRigStatusString() RigStatus.Error => "ERROR", RigStatus.Pending => "PENDING", RigStatus.Disabled => "DISABLED", + RigStatus.Gaming => "GAMING", + RigStatus.Testing => "TESTING", _ => "UNKNOWN", }; } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 3ed59bd06..9e54f64ac 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -1,6 +1,9 @@ -using NHM.Common; +//using log4net.Core; +using NHM.Common; +using NHM.Common.Enums; using NHMCore.ApplicationState; using NHMCore.Mining; +using NHMCore.Nhmws; using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; @@ -28,36 +31,40 @@ private enum OcReturn private Task SetOcForDevice(AlgorithmContainer container, OcBundle bundle) { - var setCC = bundle.CoreClock == 0 ? container.ComputeDevice.SetCoreClock(bundle.CoreClock) : false; + var setCC = bundle.CoreClock != 0 ? container.ComputeDevice.SetCoreClock(bundle.CoreClock) : true; Logger.Warn(_TAG, $"Setting core clock for device {container.ComputeDevice.Name} success: {setCC}"); - var setMC = bundle.MemoryClock == 0 ? container.ComputeDevice.SetMemoryClock(bundle.MemoryClock) : false; + var setMC = bundle.MemoryClock != 0 ? container.ComputeDevice.SetMemoryClock(bundle.MemoryClock) : true; Logger.Warn(_TAG, $"Setting memory clock for device {container.ComputeDevice.Name} success: {setMC}"); - var setTDP = bundle.TDP == 0 ? container.ComputeDevice.SetPowerModeManual(bundle.TDP) : false; + var setTDP = bundle.TDP != 0 ? container.ComputeDevice.SetPowerModeManual(bundle.TDP) : true; Logger.Warn(_TAG, $"Setting TDP for device {container.ComputeDevice.Name} success: {setTDP}"); - if (setCC && setMC && setTDP) return Task.FromResult(OcReturn.Success); - if (!setCC && !setMC && !setTDP) return Task.FromResult(OcReturn.Fail); - return Task.FromResult(OcReturn.PartialSuccess); + var ret = OcReturn.Success; + if (setCC && setMC && setTDP) ret = OcReturn.Success; + else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; + else ret = OcReturn.PartialSuccess; + if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) container.ComputeDevice.State = DeviceState.Testing; + return Task.FromResult(ret); } //todo cleanup for many different tests if they come one after another - public Task ExecuteTest(string uuid, OcBundle bundle) + //clear first? + public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) { _testOcBundles.Add(bundle); - if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult("No devices running"); + if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); var allContainers = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings); //var MiningState = AvailableDevices.Devices.Where(d => d.Name == bundle.DeviceName)?.SelectMany(d => d.AlgorithmSettings); //for testing - if (allContainers == null || !allContainers.Any()) return Task.FromResult("Action target mismatch"); + if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); if (bundle.AlgoId != null && bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName) && bundle.MinerId.Contains(d.PluginName)); else if (bundle.AlgoId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName)); else if (bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName)); - if (allContainers == null || !allContainers.Any()) return Task.FromResult("Action target mismatch, containers null"); + if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); var distinctDevs = allContainers.DistinctBy(d => d.ComputeDevice.Uuid); Logger.Info(_TAG, "Applying OC Test for following containers:"); List success = new(); @@ -67,12 +74,12 @@ public Task ExecuteTest(string uuid, OcBundle bundle) var ret = SetOcForDevice(container, bundle); if (ret.IsCompleted) success.Add(ret.Result); } - if (success.All(s => s == OcReturn.Success)) return Task.FromResult("Successfully executed test"); - if (success.All(s => s == OcReturn.Fail)) return Task.FromResult("Failed to execute all tests"); - return Task.FromResult("Partially executed tests"); + if (success.All(s => s == OcReturn.Success)) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); + if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestApplyTotalFail, "Failed to apply test")); + return Task.FromResult((ErrorCode.TestApplyPartialPartial, "Partially applied test")); } //clear first???? - public Task ApplyOcBundle(List bundles) //tdp is null? can a value be missing?????? + public Task ApplyOcBundle(List bundles) { _ocBundles.AddRange(bundles); List processed = new(); diff --git a/src/NHMCore/Nhmws/ErrorCode.cs b/src/NHMCore/Nhmws/ErrorCode.cs index 5e8ad5023..ee67cb596 100644 --- a/src/NHMCore/Nhmws/ErrorCode.cs +++ b/src/NHMCore/Nhmws/ErrorCode.cs @@ -1,7 +1,7 @@  namespace NHMCore.Nhmws { - enum ErrorCode : int + public enum ErrorCode : int { NoError = 0, DisabledDevice = -7, @@ -12,5 +12,13 @@ enum ErrorCode : int NonExistentDevice = -2, RedundantRpc = -1, InternalNhmError = 1, + + ActionNotFound = -100, + ErrNoDeviceRunning = -101, + TargetDeviceNotFound = -102, + TestApplyPartialPartial = -103, + TestApplyTotalFail = -104, + + } } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 547b09059..e7cc0626d 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -410,6 +410,7 @@ MinerState.DeviceState toDeviceState(ComputeDevice d) DeviceState.Disabled => 4, // DISABLED #if NHMWS4 DeviceState.Gaming => 6, //GAMING + DeviceState.Testing => 7, //TESTING #endif _ => 0, // UNKNOWN }; diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index de95e2d57..2682b625b 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -681,27 +681,26 @@ async Task systemDump() _ => throw new RpcException($"RpcMessage MinerReset operation not supported for level '{level}'", ErrorCode.UnableToHandleRpc), }; } - private static Task CallAction(MinerCallAction action) + private static Task<(ErrorCode err, string msg)> CallAction(MinerCallAction action) { var actionRecord = ActionMap.ActionList.Where(a => a.ActionID == action.ActionId).FirstOrDefault(); if (actionRecord == null) { NHM.Common.Logger.Error("NHWebSocketV4", "Action not found"); - return Task.FromResult(string.Empty); + return Task.FromResult((ErrorCode.ActionNotFound, "Action not found")); } - //var typeOfParams = - var ret = string.Empty; - foreach (var param in action.Parameters) + //action has single parameter anyway FOR NOW + //in the future return multiple actions success/partial/failiure + var ret = (ErrorCode.NoError, string.Empty); + foreach (var param in action.Parameters) { - ret += ParseAndCallAction(action.DeviceId, action.Id, actionRecord.ActionType, param).Result; + ret = ParseAndCallAction(action.DeviceId, action.Id, actionRecord.ActionType, param).Result; } - //some switch to determine command - //handle each param in request - //return result return Task.FromResult(ret); } - private static Task ParseAndCallAction(string deviceUUID, int messageID, SupportedAction typeOfAction, string parameters) + private static Task<(ErrorCode err, string msg)> ParseAndCallAction(string deviceUUID, int messageID, SupportedAction typeOfAction, string parameters) { + ErrorCode err = ErrorCode.NoError; var result = string.Empty; switch (typeOfAction) { @@ -726,7 +725,7 @@ private static Task ParseAndCallAction(string deviceUUID, int messageID, break; case SupportedAction.ActionOcProfileTest: var oc = JsonConvert.DeserializeObject(parameters); - result = ExecuteOCTest(deviceUUID, oc).Result; + (err, result) = ExecuteOCTest(deviceUUID, oc).Result; break; case SupportedAction.ActionOcProfileTestStop: break; @@ -748,7 +747,7 @@ private static Task ParseAndCallAction(string deviceUUID, int messageID, NHLog.Warn(_logTag, "This type of action is unsupported: " + typeOfAction); break; } - return Task.FromResult(result); + return Task.FromResult((err, result)); } private static Task ExecuteProfilesBundleSet(Bundle bundle) { @@ -771,7 +770,7 @@ private static Task ExecuteProfilesBundleReset() { return Task.CompletedTask; } - private static Task ExecuteOCTest(string deviceUUID, OcBundle ocBundle) + private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) { var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); return Task.FromResult(res.Result); @@ -832,7 +831,6 @@ private static Task SetMutable(MinerSetMutable mutableCmd) return Task.FromResult(""); } #endregion RpcMessages - static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) { bool success = false; @@ -856,14 +854,25 @@ static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) MiningStop m => await StopMining(m.Device), MiningSetPowerMode m => await SetPowerMode(m.Device, (TDPSimpleType)m.PowerMode), MinerReset m => await MinerReset(m.Level), // rpcAnswer - MinerCallAction m => await CallAction(m), // call decision from here!!! + MinerCallAction m => await CallAction(m), // call decision from here!!! // MinerSetMutable m => await SetMutable(m), _ => throw new RpcException($"RpcMessage operation not supported for method '{rpcMsg.Method}'", ErrorCode.UnableToHandleRpc), }; - - string rpcAnswer = t is string rpcAnws ? rpcAnws : null; - if (t is bool ok) success = ok; - executedCall = new ExecutedCall(rpcMsg.Id, 0, rpcAnswer); + if (t is bool ok) + { + success = ok; + executedCall = new ExecutedCall(rpcMsg.Id, 0, string.Empty); + } + else if (t is (ErrorCode err, string msg)) + { + success = err == ErrorCode.NoError ? true : false; + executedCall = new ExecutedCall(rpcMsg.Id, (int)err, msg); + } + else if (t is string answer) + { + executedCall = new ExecutedCall(rpcMsg.Id, 0, answer); + } + else executedCall = new ExecutedCall(rpcMsg.Id, -1, "Failed to execute!"); } catch (RpcException rpcEx) { From b733feb3a3ec5340d70542aca6a94bcb26d4d9b7 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 18 Nov 2022 14:57:59 +0100 Subject: [PATCH 015/224] added stop oc test --- src/NHMCore/ApplicationState/MiningState.cs | 2 +- .../ApplicationStateManager.Mining.cs | 16 ++++++-- src/NHMCore/Configs/Managers/OCManager.cs | 37 ++++++++++++++++++- src/NHMCore/Mining/AlgorithmContainer.cs | 36 ++++++++++-------- src/NHMCore/Mining/MiningManager.cs | 4 ++ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 11 +++++- .../Converters/StatusColorConverter.cs | 4 ++ src/NiceHashMiner/NiceHashMiner.csproj | 4 +- src/NiceHashMiner/ViewModels/MainVM.cs | 26 +++++++------ .../ViewModels/Models/DeviceData.cs | 18 ++++++++- .../DeviceStatusVisibilityConverter.cs | 4 ++ 11 files changed, 123 insertions(+), 39 deletions(-) diff --git a/src/NHMCore/ApplicationState/MiningState.cs b/src/NHMCore/ApplicationState/MiningState.cs index d398ccb31..c92a6eb78 100644 --- a/src/NHMCore/ApplicationState/MiningState.cs +++ b/src/NHMCore/ApplicationState/MiningState.cs @@ -107,7 +107,7 @@ public void CalculateDevicesStateChange() // DeviceState Counts StoppedDeviceStateCount = AvailableDevices.Devices.Count(dev => dev.State == DeviceState.Stopped); #if NHMWS4 - MiningDeviceStateCount = AvailableDevices.Devices.Count(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Gaming); + MiningDeviceStateCount = AvailableDevices.Devices.Count(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Gaming || dev.State == DeviceState.Testing); #else MiningDeviceStateCount = AvailableDevices.Devices.Count(dev => dev.State == DeviceState.Mining); #endif diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs index ef247329a..453b2d90c 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs @@ -85,7 +85,11 @@ static partial class ApplicationStateManager public static async Task<(bool stopped, string failReason)> StopAllDevicesTask() { // TODO when starting and stopping we are not taking Pending and Error states into account +#if NHMWS4 + var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Testing); +#else var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking); +#endif if (devicesToStop.Count() == 0) { return (false, "No new devices to stop"); @@ -119,6 +123,9 @@ static partial class ApplicationStateManager return (false, $"Device {device.Uuid} already stopped"); case DeviceState.Mining: case DeviceState.Benchmarking: +#if NHMWS4 + case DeviceState.Testing: +#endif await MiningManager.StopDevice(device); return (true, ""); default: @@ -157,14 +164,17 @@ public static Task StopBenchmark() return Task.WhenAll(stoptDevices); } - #region Updater mining state save/restore +#region Updater mining state save/restore private static string _miningStateFilePath => Paths.InternalsPath("DeviceRestoreStates.json"); private struct DeviceRestoreState { public bool IsStarted { get; set; } public DeviceState LastState { get; set; } - +#if NHMWS4 + public bool ShouldStart() => IsStarted || LastState == DeviceState.Benchmarking || LastState == DeviceState.Mining || LastState == DeviceState.Testing; +#else public bool ShouldStart() => IsStarted || LastState == DeviceState.Benchmarking || LastState == DeviceState.Mining; +#endif } internal static void SaveMiningState() { @@ -207,6 +217,6 @@ internal static async Task RestoreMiningState() await Task.WhenAll(startTasks); } - #endregion Update state push/pop +#endregion Update state push/pop } } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 9e54f64ac..263d1b3de 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -29,6 +29,7 @@ private enum OcReturn Fail } + //todo if true is default its not good, as it returns partial success in case of 2 fail and one 0 (not set) private Task SetOcForDevice(AlgorithmContainer container, OcBundle bundle) { var setCC = bundle.CoreClock != 0 ? container.ComputeDevice.SetCoreClock(bundle.CoreClock) : true; @@ -44,13 +45,32 @@ private Task SetOcForDevice(AlgorithmContainer container, OcBundle bun if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) container.ComputeDevice.State = DeviceState.Testing; return Task.FromResult(ret); } + private Task ResetOcForDevice(ComputeDevice dev) + { + var defCC = dev.CoreClockRange; + var defMC = dev.MemoryClockRange; + var defTDP = dev.TDPLimits; + + var setCC = defCC.ok ? dev.SetCoreClock(defCC.def) : false; + Logger.Warn(_TAG, $"Resetting core clock ({defCC.def}) for device {dev.Name} success: {setCC}"); + var setMC = defMC.ok ? dev.SetMemoryClock(defMC.def) : false; + Logger.Warn(_TAG, $"Resetting memory clock ({defMC.def}) for device {dev.Name} success: {setMC}"); + var setTDP = defTDP.def > 0 ? dev.SetPowerModeManual((int)defTDP.def) : false; + Logger.Warn(_TAG, $"Resetting TDP ({defTDP.def}) for device {dev.Name} success: {setTDP}"); + var ret = OcReturn.Success; + if (setCC && setMC && setTDP) ret = OcReturn.Success; + else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; + else ret = OcReturn.PartialSuccess; + if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) dev.State = DeviceState.Mining;// problem, return to benchmarking? apparently it will be disabled!!!! + return Task.FromResult(ret); + } //todo cleanup for many different tests if they come one after another //clear first? public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) { - _testOcBundles.Add(bundle); + //_testOcBundles.Add(bundle); if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); var allContainers = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? @@ -65,7 +85,7 @@ private Task SetOcForDevice(AlgorithmContainer container, OcBundle bun else if (bundle.AlgoId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName)); else if (bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName)); if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); - var distinctDevs = allContainers.DistinctBy(d => d.ComputeDevice.Uuid); + var distinctDevs = allContainers.Where(c => c.IsCurrentlyMining)?.DistinctBy(d => d.ComputeDevice.Uuid) ?? new List(); Logger.Info(_TAG, "Applying OC Test for following containers:"); List success = new(); foreach (var container in distinctDevs) @@ -78,6 +98,19 @@ private Task SetOcForDevice(AlgorithmContainer container, OcBundle bun if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestApplyTotalFail, "Failed to apply test")); return Task.FromResult((ErrorCode.TestApplyPartialPartial, "Partially applied test")); } + public Task<(ErrorCode err, string msg)> StopTest(string uuid) + { + var targetDeviceContainer = AvailableDevices.Devices.Where(d => d.B64Uuid == uuid).FirstOrDefault(); + if(targetDeviceContainer == null) + { + Logger.Error(_TAG, "Device not found for stop OC test"); + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); + } + var ret = ResetOcForDevice(targetDeviceContainer); + if(ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); + if(ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestApplyTotalFail, "Failed to stop test")); + return Task.FromResult((ErrorCode.TestApplyPartialPartial, "Stopped test")); + } //clear first???? public Task ApplyOcBundle(List bundles) { diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 948482fad..cce74041d 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -77,7 +77,11 @@ private void ComputeDevice_PropertyChanged(object sender, System.ComponentModel. { if (nameof(NHMCore.Mining.ComputeDevice.State) == e.PropertyName) { +#if NHMWS4 + var miningOrBenchmarking = ComputeDevice.State == DeviceState.Benchmarking || ComputeDevice.State == DeviceState.Mining || ComputeDevice.State == DeviceState.Testing; +#else var miningOrBenchmarking = ComputeDevice.State == DeviceState.Benchmarking || ComputeDevice.State == DeviceState.Mining; +#endif IsUserEditable = !miningOrBenchmarking; OnPropertyChanged(nameof(IsUserEditable)); } @@ -121,7 +125,7 @@ public bool LastBenchmarkingFailed } } - #region Identity +#region Identity /// /// Friendly display name for this algorithm @@ -139,10 +143,10 @@ public bool LastBenchmarkingFailed public string MinerUUID => Algorithm?.MinerID; public bool IsDual => Algorithm.IDs.Count > 1; - #endregion +#endregion - #region Mining settings +#region Mining settings /// /// Hashrate in H/s set by benchmark or user @@ -258,11 +262,11 @@ protected void NotifyPowerChanged() OnPropertyChanged(nameof(CurrentEstimatedProfitStr)); } - #endregion +#endregion - #region Profitability +#region Profitability - #region EstimatedProfit NOT FOR SWITCHING +#region EstimatedProfit NOT FOR SWITCHING internal void UpdateEstimatedProfit(Dictionary profits) @@ -349,9 +353,9 @@ public string CurPayingRatioStr } } - #endregion EstimatedProfit NOT FOR SWITCHING +#endregion EstimatedProfit NOT FOR SWITCHING - #region NormalizedProfit FOR SWITCHING +#region NormalizedProfit FOR SWITCHING // TODO with this implementation WE ONLY SUPPORT dual algorithms /// /// Gets the averaged speed for this algorithm in H/s @@ -370,7 +374,7 @@ public string CurPayingRatioStr - #endregion NormalizedProfit FOR SWITCHING +#endregion NormalizedProfit FOR SWITCHING @@ -394,7 +398,7 @@ public virtual double PowerUsage { } } - #endregion +#endregion private bool _isReBenchmark = false; public bool IsReBenchmark @@ -422,7 +426,7 @@ internal bool IsCurrentlyMining - #region Benchmark info +#region Benchmark info private bool _benchmarkPending; public bool IsBenchmarkPending @@ -471,9 +475,9 @@ public void ClearSpeeds() - #endregion +#endregion - #region Benchmark methods +#region Benchmark methods public void SetBenchmarkPending() { @@ -491,9 +495,9 @@ public void SetBenchmarkError(string message) BenchmarkErrorMessage = message; } - #endregion +#endregion - #region Profitability methods +#region Profitability methods public virtual void UpdateCurrentNormalizedProfit(Dictionary profits) { @@ -526,6 +530,6 @@ void SettingsChanged(object sender, EventArgs e) NotifyPowerChanged(); } - #endregion +#endregion } } diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index f9d6f52b9..b7b7b4d62 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -749,7 +749,11 @@ async private static void CheckIfIsOnSchedule() if (shouldStop && _runningMiners.Any()) { +#if NHMWS4 + var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Testing ); +#else var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking); +#endif foreach (var dev in devicesToStop) await StopDevice(dev); await StopAllMinersTask(); } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 2682b625b..f2c9f31d4 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -694,7 +694,11 @@ async Task systemDump() var ret = (ErrorCode.NoError, string.Empty); foreach (var param in action.Parameters) { - ret = ParseAndCallAction(action.DeviceId, action.Id, actionRecord.ActionType, param).Result; + ret = ParseAndCallAction(actionRecord.DeviceUUID, action.Id, actionRecord.ActionType, param).Result; + } + if (!action.Parameters.Any()) + { + ret = ParseAndCallAction(actionRecord.DeviceUUID, action.Id, actionRecord.ActionType, string.Empty).Result; } return Task.FromResult(ret); } @@ -775,6 +779,11 @@ private static Task ExecuteProfilesBundleReset() var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); return Task.FromResult(res.Result); } + private static Task<(ErrorCode err, string msg)> StopOCTestForDevice(string deviceUUID) + { + var res = OCManager.Instance.StopTest(deviceUUID); + return Task.FromResult(res.Result); + } private static Task ApplyOCBundle(List bundles) { var ret = OCManager.Instance.ApplyOcBundle(bundles); diff --git a/src/NiceHashMiner/Converters/StatusColorConverter.cs b/src/NiceHashMiner/Converters/StatusColorConverter.cs index 1fb214bf6..9e38e5909 100644 --- a/src/NiceHashMiner/Converters/StatusColorConverter.cs +++ b/src/NiceHashMiner/Converters/StatusColorConverter.cs @@ -14,7 +14,11 @@ public class StatusColorConverter : IValueConverter private static object ColorForDeviceState(DeviceState state) => state switch { DeviceState.Mining => Application.Current.FindResource("NastyGreenBrush"), +#if NHMWS4 DeviceState.Benchmarking or DeviceState.Pending => Application.Current.FindResource("PrimaryColorBrush"), +#else + DeviceState.Benchmarking or DeviceState.Pending or DeviceState.Testing => Application.Current.FindResource("PrimaryColorBrush"), +#endif DeviceState.Disabled => Application.Current.FindResource("Gray1ColorBrush"), DeviceState.Error => Application.Current.FindResource("RedDangerColorBrush"), DeviceState.Stopped => Application.Current.FindResource("TextColorBrush"), diff --git a/src/NiceHashMiner/NiceHashMiner.csproj b/src/NiceHashMiner/NiceHashMiner.csproj index 8160373ae..d83002850 100644 --- a/src/NiceHashMiner/NiceHashMiner.csproj +++ b/src/NiceHashMiner/NiceHashMiner.csproj @@ -40,13 +40,13 @@ x64 ..\..\Debug\app\ - TRACE;DEBUG;ENABLE_LOGIN + TRACE;DEBUG;ENABLE_LOGIN;NHMWS4 1701;1702;CA1416 x64 ..\..\Release\app\ - TRACE;ENABLE_LOGIN + TRACE;ENABLE_LOGIN;NHMWS4 1701;1702;CA1416 diff --git a/src/NiceHashMiner/ViewModels/MainVM.cs b/src/NiceHashMiner/ViewModels/MainVM.cs index 5e5b9ccb0..c90f7781c 100644 --- a/src/NiceHashMiner/ViewModels/MainVM.cs +++ b/src/NiceHashMiner/ViewModels/MainVM.cs @@ -129,10 +129,12 @@ public int MinerCount /// Elements of that represent actual devices (i.e. not total rows) and /// are in the mining state. /// - private IEnumerable WorkingMiningDevs => - MiningDevs?.OfType().Where(d => d.Dev.State == DeviceState.Mining); - +#if NHMWS4 + private IEnumerable WorkingMiningDevs => MiningDevs?.OfType().Where(d => d.Dev.State == DeviceState.Mining || d.Dev.State == DeviceState.Testing); +#else + private IEnumerable WorkingMiningDevs => MiningDevs?.OfType().Where(d => d.Dev.State == DeviceState.Mining); +#endif #region settingsLists @@ -142,14 +144,14 @@ public int MinerCount public IReadOnlyList ThemeOptions => _themeList; private List _themeList = new List { "Light", "Dark" }; - #endregion settingsLists +#endregion settingsLists public string PerDeviceDisplayString => $"/ {_devices?.Count() ?? 0}"; public DashboardViewModel Dashboard { get; } = new DashboardViewModel(); - #region Exposed settings +#region Exposed settings public BalanceAndExchangeRates BalanceAndExchangeRates => BalanceAndExchangeRates.Instance; public MiningState MiningState => MiningState.Instance; public CredentialsSettings CredentialsSettings => CredentialsSettings.Instance; @@ -171,10 +173,10 @@ public int MinerCount public GPUProfileManager GPUProfileManager => GPUProfileManager.Instance; public SchedulesManager SchedulesManager => SchedulesManager.Instance; public ELPManager ELPManager => ELPManager.Instance; - #endregion Exposed settings +#endregion Exposed settings - #region HelpNotifications +#region HelpNotifications private ObservableCollection _helpNotificationList; public ObservableCollection HelpNotificationList { @@ -196,13 +198,13 @@ private void RefreshNotifications_PropertyChanged(object sender, System.Componen } } - #endregion HelpNotifications +#endregion HelpNotifications // TODO these versions here will not work public string LocalVersion => VersionState.Instance.ProgramVersion.ToString(); public string OnlineVersion => VersionState.Instance.OnlineVersion?.ToString() ?? "N/A"; - #region Currency-related properties +#region Currency-related properties // TODO this section getting rather large, maybe good idea to break out into own class @@ -256,9 +258,9 @@ public string GlobalRate public string MinimumProfitString => $"Minimum Profit ({BalanceAndExchangeRates.Instance.SelectedFiatCurrency}/day)"; - #endregion +#endregion - #region MinerPlugins +#region MinerPlugins private ObservableCollection _plugins; public ObservableCollection Plugins { @@ -316,7 +318,7 @@ private void MinerPluginsManagerState_PropertyChanged(object sender, System.Comp } } - #endregion MinerPlugins +#endregion MinerPlugins public BenchmarkViewModel BenchmarkSettings { get; } = new BenchmarkViewModel(); diff --git a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs index 1c7f887c9..d5be0461c 100644 --- a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs +++ b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs @@ -82,9 +82,15 @@ public bool AllAgorithmsEnabled } } +#if NHMWS4 + public bool CanClearAllSpeeds => !(Dev.State == DeviceState.Benchmarking || Dev.State == DeviceState.Mining || Dev.State == DeviceState.Testing); + public bool CanStopBenchmark => Dev.Enabled && (Dev.State == DeviceState.Benchmarking || Dev.State == DeviceState.Testing); + public bool CanStopMining => Dev.Enabled && (Dev.State == DeviceState.Mining || Dev.State == DeviceState.Testing);//problem? if testing running from bench or from mining +#else public bool CanClearAllSpeeds => !(Dev.State == DeviceState.Benchmarking || Dev.State == DeviceState.Mining); public bool CanStopBenchmark => Dev.Enabled && Dev.State == DeviceState.Benchmarking; public bool CanStopMining => Dev.Enabled && Dev.State == DeviceState.Mining; +#endif public bool CanCopyFromOtherDevices => AvailableDevices.Devices.Count(dev => dev.DeviceType == Dev.DeviceType) > 1 && CanClearAllSpeeds; @@ -92,7 +98,11 @@ public bool AllAgorithmsEnabled // TODO Pending state and error states public bool CanStart => Dev.Enabled && Dev.State == DeviceState.Stopped; +#if NHMWS4 + public bool CanStop => Dev.Enabled && (Dev.State == DeviceState.Benchmarking || Dev.State == DeviceState.Mining || Dev.State == DeviceState.Testing); +#else public bool CanStop => Dev.Enabled && (Dev.State == DeviceState.Benchmarking || Dev.State == DeviceState.Mining); +#endif public string AlgoOptions { @@ -132,7 +142,11 @@ public string ButtonLabel { buttonLabel = "Start"; } +#if NHMWS4 + else if (Dev.State == DeviceState.Mining || Dev.State == DeviceState.Benchmarking || Dev.State == DeviceState.Testing) +#else else if (Dev.State == DeviceState.Mining || Dev.State == DeviceState.Benchmarking) +#endif { buttonLabel = "Stop"; } @@ -303,7 +317,7 @@ public void EnableBenchmarkedOnly() } } - #region AlgorithmSettingsCollection SORTING +#region AlgorithmSettingsCollection SORTING private enum SortColumn { ALGORITHM = 0, @@ -372,7 +386,7 @@ private void OrderAlgorithms() } - #endregion AlgorithmSettingsCollection SORTING +#endregion AlgorithmSettingsCollection SORTING public static implicit operator DeviceData(ComputeDevice dev) { diff --git a/src/NiceHashMiner/Views/Benchmark/ComputeDeviceItem/DeviceStatusVisibilityConverter.cs b/src/NiceHashMiner/Views/Benchmark/ComputeDeviceItem/DeviceStatusVisibilityConverter.cs index 854662002..ed6ae139c 100644 --- a/src/NiceHashMiner/Views/Benchmark/ComputeDeviceItem/DeviceStatusVisibilityConverter.cs +++ b/src/NiceHashMiner/Views/Benchmark/ComputeDeviceItem/DeviceStatusVisibilityConverter.cs @@ -12,7 +12,11 @@ public object Convert(object value, Type targetType, object parameter, CultureIn { if (value is DeviceState state) { +#if NHMWS4 + if (state == DeviceState.Benchmarking || state == DeviceState.Mining || state == DeviceState.Testing) +#else if (state == DeviceState.Benchmarking || state == DeviceState.Mining) +#endif { return Visibility.Hidden; } From 3081148d188701300444c62f2ba4cdc2deffad64 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 21 Nov 2022 15:05:28 +0100 Subject: [PATCH 016/224] todo change getting for supported miners for device --- src/NHMCore/Configs/Managers/OCManager.cs | 65 ++---- src/NHMCore/Mining/AlgorithmContainer.cs | 106 ++++++++- src/NHMCore/Mining/ComputeDevice.cs | 8 + src/NHMCore/Nhmws/ErrorCode.cs | 4 +- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 270 ++++++++++++---------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 23 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 1 + 7 files changed, 298 insertions(+), 179 deletions(-) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 263d1b3de..4e8853cc5 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -22,62 +22,23 @@ private OCManager() { } private List _testOcBundles = new(); private readonly string _TAG = "OCManager"; - private enum OcReturn + public enum OcReturn { Success, PartialSuccess, Fail } - //todo if true is default its not good, as it returns partial success in case of 2 fail and one 0 (not set) - private Task SetOcForDevice(AlgorithmContainer container, OcBundle bundle) - { - var setCC = bundle.CoreClock != 0 ? container.ComputeDevice.SetCoreClock(bundle.CoreClock) : true; - Logger.Warn(_TAG, $"Setting core clock for device {container.ComputeDevice.Name} success: {setCC}"); - var setMC = bundle.MemoryClock != 0 ? container.ComputeDevice.SetMemoryClock(bundle.MemoryClock) : true; - Logger.Warn(_TAG, $"Setting memory clock for device {container.ComputeDevice.Name} success: {setMC}"); - var setTDP = bundle.TDP != 0 ? container.ComputeDevice.SetPowerModeManual(bundle.TDP) : true; - Logger.Warn(_TAG, $"Setting TDP for device {container.ComputeDevice.Name} success: {setTDP}"); - var ret = OcReturn.Success; - if (setCC && setMC && setTDP) ret = OcReturn.Success; - else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; - else ret = OcReturn.PartialSuccess; - if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) container.ComputeDevice.State = DeviceState.Testing; - return Task.FromResult(ret); - } - private Task ResetOcForDevice(ComputeDevice dev) - { - var defCC = dev.CoreClockRange; - var defMC = dev.MemoryClockRange; - var defTDP = dev.TDPLimits; - - var setCC = defCC.ok ? dev.SetCoreClock(defCC.def) : false; - Logger.Warn(_TAG, $"Resetting core clock ({defCC.def}) for device {dev.Name} success: {setCC}"); - var setMC = defMC.ok ? dev.SetMemoryClock(defMC.def) : false; - Logger.Warn(_TAG, $"Resetting memory clock ({defMC.def}) for device {dev.Name} success: {setMC}"); - var setTDP = defTDP.def > 0 ? dev.SetPowerModeManual((int)defTDP.def) : false; - Logger.Warn(_TAG, $"Resetting TDP ({defTDP.def}) for device {dev.Name} success: {setTDP}"); - var ret = OcReturn.Success; - if (setCC && setMC && setTDP) ret = OcReturn.Success; - else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; - else ret = OcReturn.PartialSuccess; - if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) dev.State = DeviceState.Mining;// problem, return to benchmarking? apparently it will be disabled!!!! - return Task.FromResult(ret); - } - - //todo cleanup for many different tests if they come one after another //clear first? public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) { - //_testOcBundles.Add(bundle); if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); var allContainers = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings); - //var MiningState = AvailableDevices.Devices.Where(d => d.Name == bundle.DeviceName)?.SelectMany(d => d.AlgorithmSettings); //for testing if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); if (bundle.AlgoId != null && bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName) && @@ -91,25 +52,29 @@ private Task ResetOcForDevice(ComputeDevice dev) foreach (var container in distinctDevs) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - var ret = SetOcForDevice(container, bundle); + var ret = container.SetOcForDevice(bundle); if (ret.IsCompleted) success.Add(ret.Result); } if (success.All(s => s == OcReturn.Success)) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); - if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestApplyTotalFail, "Failed to apply test")); - return Task.FromResult((ErrorCode.TestApplyPartialPartial, "Partially applied test")); + if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); + return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); } public Task<(ErrorCode err, string msg)> StopTest(string uuid) { - var targetDeviceContainer = AvailableDevices.Devices.Where(d => d.B64Uuid == uuid).FirstOrDefault(); - if(targetDeviceContainer == null) + var targetDeviceContainer = AvailableDevices.Devices + .Where(d => d.B64Uuid == uuid)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(a => a.IsTesting)? + .FirstOrDefault(); + if (targetDeviceContainer == null) { Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - var ret = ResetOcForDevice(targetDeviceContainer); - if(ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); - if(ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestApplyTotalFail, "Failed to stop test")); - return Task.FromResult((ErrorCode.TestApplyPartialPartial, "Stopped test")); + var ret = targetDeviceContainer.ResetOcForDevice(); + if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); + if (ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to stop test")); + return Task.FromResult((ErrorCode.TestPartialFail, "Stopped test")); } //clear first???? public Task ApplyOcBundle(List bundles) @@ -159,7 +124,7 @@ public Task ApplyOcBundle(List bundles) foreach (var container in current) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - SetOcForDevice(container, bundle); + container.SetOcForDevice(bundle); } } return Task.CompletedTask; diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index cce74041d..ed8b23a5e 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -7,9 +7,13 @@ using NHMCore.Configs.ELPDataModels; using NHMCore.Configs.Managers; using NHMCore.Mining.Plugins; +using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.Metadata; +using System.Threading.Tasks; +using static NHMCore.Configs.Managers.OCManager; namespace NHMCore.Mining { @@ -29,6 +33,7 @@ public class AlgorithmContainer : NotifyChangedBase public DateTime IgnoreUntil { get; internal set; } = DateTime.UtcNow; private List _powerUsageHistory = new List(); private List _speedHistory = new List(); + private string _TAG = string.Empty; // status is always calculated public AlgorithmStatus Status @@ -66,6 +71,7 @@ public AlgorithmContainer(Algorithm algorithm, PluginContainer pluginContainer, PluginContainer = pluginContainer; Algorithm = algorithm; ComputeDevice = computeDevice; + _TAG = $"AC->{pluginContainer.Name}/{algorithm.AlgorithmName}/{computeDevice.Name}"; computeDevice.PropertyChanged += ComputeDevice_PropertyChanged; SwitchSettings.Instance.PropertyChanged += SettingsChanged; @@ -530,6 +536,104 @@ void SettingsChanged(object sender, EventArgs e) NotifyPowerChanged(); } -#endregion + #endregion + +#if NHMWS4 + #region OC + + private bool _IsTesting = false; + public bool IsTesting + { + get + { + return _IsTesting; + } + set + { + _IsTesting = value; + } + } + private string _OCProfile = string.Empty; + public string OCProfile => _OCProfile; + private OcBundle _ActiveOCProfile = null; + public OcBundle ActiveOCProfile => ActiveOCProfile; + public Task SetOcForDevice(OcBundle bundle) + { + var ret = OcReturn.Fail; + int valuesToSet = 0; + if (bundle.CoreClock > 0) valuesToSet++; + if (bundle.MemoryClock > 0) valuesToSet++; + if (bundle.TDP > 0) valuesToSet++; + if (valuesToSet == 0) return Task.FromResult(ret); + + int setValues = 3; + var setCC = ComputeDevice.SetCoreClock(bundle.CoreClock); + var setMC = ComputeDevice.SetMemoryClock(bundle.MemoryClock); + var setTDP = ComputeDevice.SetPowerModeManual(bundle.TDP); + + if (!setCC) + { + Logger.Warn(_TAG, $"Setting core clock for device {ComputeDevice.Name} success: {setCC}"); + setValues--; + } + if (!setMC) + { + Logger.Warn(_TAG, $"Setting memory clock for device {ComputeDevice.Name} success: {setMC}"); + setValues--; + } + if (!setTDP) + { + Logger.Warn(_TAG, $"Setting TDP for device {ComputeDevice.Name} success: {setTDP}"); + setValues--; + } + + if (setValues == valuesToSet) ret = OcReturn.Success; + else if (setValues != 0 && setValues < valuesToSet) ret = OcReturn.PartialSuccess; + + ret = OcReturn.Success; // TESTING CODE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + if(ret != OcReturn.Fail) + { + _IsTesting = true; + ComputeDevice.State = DeviceState.Testing; + _OCProfile = bundle.Name; + ComputeDevice.OCProfile = bundle.Name; + _ActiveOCProfile = bundle; + } + return Task.FromResult(ret); + } + public Task ResetOcForDevice() + { + var defCC = ComputeDevice.CoreClockRange; + var defMC = ComputeDevice.MemoryClockRange; + var defTDP = ComputeDevice.TDPLimits; + + var setCC = defCC.ok ? ComputeDevice.SetCoreClock(defCC.def) : false; + Logger.Warn(_TAG, $"Resetting core clock ({defCC.def}) for device {ComputeDevice.Name} success: {setCC}"); + var setMC = defMC.ok ? ComputeDevice.SetMemoryClock(defMC.def) : false; + Logger.Warn(_TAG, $"Resetting memory clock ({defMC.def}) for device {ComputeDevice.Name} success: {setMC}"); + var setTDP = defTDP.def > 0 ? ComputeDevice.SetPowerModeManual((int)defTDP.def) : false; + Logger.Warn(_TAG, $"Resetting TDP ({defTDP.def}) for device {ComputeDevice.Name} success: {setTDP}"); + var ret = OcReturn.Success; + if (setCC && setMC && setTDP) ret = OcReturn.Success; + else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; + else ret = OcReturn.PartialSuccess; + + ret = OcReturn.Success; // TESTING CODE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) + { + IsTesting = false; + _ActiveOCProfile = null; + _OCProfile = string.Empty; + ComputeDevice.State = DeviceState.Mining; + ComputeDevice.OCProfile = string.Empty; + } + + + return Task.FromResult(ret); + } + #endregion +#endif } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 17091691f..d84b041f0 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -651,5 +651,13 @@ public void PrintMemoryTimings() mp.PrintMemoryTimings(); } } +#if NHMWS4 + private string _OCProfile = string.Empty; + public string OCProfile + { + get { return _OCProfile; } + set { _OCProfile = value; } + } +#endif } } diff --git a/src/NHMCore/Nhmws/ErrorCode.cs b/src/NHMCore/Nhmws/ErrorCode.cs index ee67cb596..44c72a74d 100644 --- a/src/NHMCore/Nhmws/ErrorCode.cs +++ b/src/NHMCore/Nhmws/ErrorCode.cs @@ -16,8 +16,8 @@ public enum ErrorCode : int ActionNotFound = -100, ErrNoDeviceRunning = -101, TargetDeviceNotFound = -102, - TestApplyPartialPartial = -103, - TestApplyTotalFail = -104, + TestPartialFail = -103, + TestTotalFail = -104, } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index e7cc0626d..d5014fe7e 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -62,7 +62,7 @@ private static string GetDevicePlugin(string UUID) return devData.MinerName; } - private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin) + private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin = false) { string getValue(T o) => (typeof(T).Name, o) switch { @@ -79,7 +79,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get string getValueForName(string name) => name switch { "Miner" => $"{GetDevicePlugin(d.Uuid)}", - "OC profile" => $"", //TODO + "OC profile" => $"{d.OCProfile}", "OC profile ID" => $"", "Fan profile" => $"", //TODO "Fan profile ID" => $"", @@ -141,109 +141,113 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u // we cache device properties so we persevere property IDs private static readonly Dictionary> _cachedDevicesOptionalMutable = new Dictionary>(); - private static (List properties, JArray values) GetDeviceOptionalMutable(ComputeDevice d) + private static (List properties, JArray values) GetDeviceOptionalMutable(ComputeDevice d, bool isLogin) { OptionalMutableProperty valueOrNull(OptionalMutableProperty v) => d.DeviceMonitor is T ? v : null; List getOptionalMutableProperties(ComputeDevice d) { - // TODO sort by type - var optionalProperties = new List(); - optionalProperties.Add(new OptionalMutablePropertyString + if (isLogin) { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayGroup = 0, - DisplayName = "Miners settings", - DefaultValue = "", - Range = (2048, ""), - //ExecuteTask = async (object p) => - //{ - // //todo - // return null; - //}, - GetValue = () => + // TODO sort by type + var optionalProperties = new List(); + optionalProperties.Add(new OptionalMutablePropertyString { - //todo? - return string.Empty; - } - }); - #region OMVMaybe - //if (d.DeviceMonitor is ITDP tdp && d.DeviceMonitor is ITDPLimits tdpLim) - //{ - // var limits = tdpLim.GetTDPLimits(); - // if (limits.ok) - // { - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayName = "Power mode", - // DisplayUnit = "%", - // DefaultValue = (int)limits.def, - // Range = ((int)limits.min, (int)limits.max), - // //ExecuteTask = async (object p) => - // //{ - // // // #1 validate JSON input - // // if (p is string pstr && pstr is not null) return Task.FromResult(null); - // // // TODO do something - // // return Task.FromResult(null); - // //}, - // GetValue = () => - // { - // return tdp.TDPPercentage; - // } - // })); - // } + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Miners settings", + DefaultValue = "", + Range = (2048, ""), + //ExecuteTask = async (object p) => + //{ + // //todo + // return null; + //}, + GetValue = () => + { + //todo? + return string.Empty; + } + }); + #region OMVMaybe + //if (d.DeviceMonitor is ITDP tdp && d.DeviceMonitor is ITDPLimits tdpLim) + //{ + // var limits = tdpLim.GetTDPLimits(); + // if (limits.ok) + // { + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + // { + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayName = "Power mode", + // DisplayUnit = "%", + // DefaultValue = (int)limits.def, + // Range = ((int)limits.min, (int)limits.max), + // //ExecuteTask = async (object p) => + // //{ + // // // #1 validate JSON input + // // if (p is string pstr && pstr is not null) return Task.FromResult(null); + // // // TODO do something + // // return Task.FromResult(null); + // //}, + // GetValue = () => + // { + // return tdp.TDPPercentage; + // } + // })); + // } - //} - //if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) - //{ - // var ret = rangeCore.CoreClockRange; - // if (ret.ok) - // { - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayName = "Core clock", - // DisplayUnit = "MHz", - // DefaultValue = ret.def, - // Range = (ret.min, ret.max), - // //ExecuteTask = async (object p) => - // //{ - // //todo - // //} - // GetValue = () => - // { - // return d.CoreClock; - // } - // })); - // } - //} - //if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange rangeMem) - //{ - // var ret = rangeMem.MemoryClockRange; - // if (ret.ok) - // { - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayName = "Memory clock", - // DisplayUnit = "MHz", - // DefaultValue = ret.def, - // Range = (ret.min, ret.max), - // //ExecuteTask = async (object p) => - // //{ - // //todo - // //} - // GetValue = () => - // { - // return d.MemoryClock; - // } - // })); - // } - //} - #endregion - return optionalProperties - .Where(p => p != null) - .ToList(); + //} + //if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) + //{ + // var ret = rangeCore.CoreClockRange; + // if (ret.ok) + // { + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + // { + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayName = "Core clock", + // DisplayUnit = "MHz", + // DefaultValue = ret.def, + // Range = (ret.min, ret.max), + // //ExecuteTask = async (object p) => + // //{ + // //todo + // //} + // GetValue = () => + // { + // return d.CoreClock; + // } + // })); + // } + //} + //if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange rangeMem) + //{ + // var ret = rangeMem.MemoryClockRange; + // if (ret.ok) + // { + // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt + // { + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayName = "Memory clock", + // DisplayUnit = "MHz", + // DefaultValue = ret.def, + // Range = (ret.min, ret.max), + // //ExecuteTask = async (object p) => + // //{ + // //todo + // //} + // GetValue = () => + // { + // return d.MemoryClock; + // } + // })); + // } + //} + #endregion + return optionalProperties + .Where(p => p != null) + .ToList(); + } + return null; } List getOptionalMutablePropertiesCached(ComputeDevice d) @@ -290,7 +294,7 @@ Device mapComputeDevice(ComputeDevice d) }, Actions = CreateDefaultDeviceActions(d.B64Uuid), OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true).properties), - OptionalMutableProperties = GetDeviceOptionalMutable(d).properties, + OptionalMutableProperties = GetDeviceOptionalMutable(d, true).properties, }; } @@ -304,7 +308,7 @@ Device mapComputeDevice(ComputeDevice d) OptionalDynamicProperties = GetRigOptionalDynamicValuesLogin(), Actions = CreateDefaultRigActions(), Devices = devices.Select(mapComputeDevice).ToList(), - MinerState = GetMinerStateValues(worker, devices), + MinerState = GetMinerStateValues(worker, devices, true), }; return _loginMessage; } @@ -320,14 +324,14 @@ private static List GetRigOptionalMutableValuesLogin(st DefaultValue = btc, Range = (64, String.Empty), }, - new OptionalMutablePropertyString - { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayGroup = 0, - DisplayName = "Worker name", - DefaultValue = worker, - Range = (64, String.Empty), - }, + //new OptionalMutablePropertyString + //{ + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayGroup = 0, + // DisplayName = "Worker name", + // DefaultValue = worker, + // Range = (64, String.Empty), + //}, }; } private static List> GetRigOptionalDynamicValuesLogin() @@ -354,9 +358,9 @@ private static List> GetRigOptionalDynamicValuesLogin() }; } - private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable devices) + private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable devices, bool isLogin) { - var json = JObject.FromObject(GetMinerState(workerName, devices)); + var json = JObject.FromObject(GetMinerState(workerName, devices, isLogin)); var delProp = json.Property("method"); delProp.Remove(); return json; @@ -377,12 +381,12 @@ private static List GetRigOptionalMutableValues() var list = new List { CredentialsSettings.Instance.BitcoinAddress, - CredentialsSettings.Instance.WorkerName + //CredentialsSettings.Instance.WorkerName }; return list; } - internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices) + internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices, bool isLogin = false) { var rig = ApplicationStateManager.CalcRigStatus(); @@ -426,12 +430,13 @@ JArray mmv(ComputeDevice d) return new JArray(deviceStateToInt(d.State)); } + return new MinerState.DeviceState { MandatoryDynamicValues = mdv(d), - OptionalDynamicValues = GetDeviceOptionalDynamic(d, false).values, // odv + OptionalDynamicValues = GetDeviceOptionalDynamic(d, isLogin).values, // odv MandatoryMutableValues = mmv(d), - OptionalMutableValues = GetDeviceOptionalMutable(d).values, // omv + OptionalMutableValues = GetDeviceOptionalMutable(d, isLogin).values, // omv }; } @@ -476,12 +481,12 @@ private static List GetStaticPropertiesOptionalValues(ComputeDevice d) { new JArray("bus_id", $"{gpu.PCIeBusID}"), new JArray("vram", $"{gpu.GpuRam}"), - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d))), + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d, false))), new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), }, _ => new List { - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d))), + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d, false))), new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), }, }; @@ -492,16 +497,41 @@ private static string FormatForOptionalValues(string name, string content) return "{\""+ name +"\":" + content + "}"; } - private static string GetMinersForDevice(ComputeDevice d) + private static string GetMinersForDeviceDynamic(ComputeDevice d, bool includeEnabled)//todo if include enabled return array of strings else return array of structs + { + List miners = new List(); + var containers = d.AlgorithmSettings; + if (containers == null) return String.Empty; + var grouped = containers.GroupBy(c => c.PluginName); + if(grouped == null) return String.Empty; + foreach (var group in grouped) + { + var container = group.First(); + var miner = new Miner() { Id = group.Key }; + if (includeEnabled) miner.Enabled = container.Enabled; + var algos = new List(); + foreach (var algo in group) + { + var tempAlgo = new Algo() { Id = algo.AlgorithmName }; + if (includeEnabled) tempAlgo.Enabled = algo.Enabled; + algos.Add(tempAlgo); + } + miner.Algos = algos; + miners.Add(miner); + } + var json = JsonConvert.SerializeObject(miners); + return json; + } + private static string GetMinersForDeviceStatic(ComputeDevice d) { List miners = new List(); var uniquePlugins = d.AlgorithmSettings?.Select(item => item.PluginName)?.Distinct()?.Where(item => !string.IsNullOrEmpty(item)); if (uniquePlugins == null) return String.Empty; - foreach(var plugin in uniquePlugins) + foreach (var plugin in uniquePlugins) { var uniqueAlgos = d.AlgorithmSettings?.Where(item => item.PluginName == plugin)?.Select(item => item.AlgorithmName)?.Distinct(); - if(uniqueAlgos == null) uniqueAlgos = new List(); - miners.Add(new Miner() { Id = plugin, Algos = uniqueAlgos.ToList() }); + if (uniqueAlgos == null) uniqueAlgos = new List(); + miners.Add(new Miner() { Id = plugin, AlgoList = uniqueAlgos.ToList() }); } var json = JsonConvert.SerializeObject(miners); return json; diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 2bbc763ff..b201f7859 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -394,13 +394,13 @@ internal class DeviceState [JsonProperty("mdv")] public JArray MandatoryDynamicValues { get; set; } - [JsonProperty("odv")] + [JsonProperty("odv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalDynamicValues { get; set; } [JsonProperty("mmv")] public JArray MandatoryMutableValues { get; set; } - [JsonProperty("omv")] + [JsonProperty("omv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalMutableValues { get; set; } } @@ -410,13 +410,13 @@ internal class DeviceState [JsonProperty("mdv")] public JArray MutableDynamicValues { get; set; } - [JsonProperty("odv")] + [JsonProperty("odv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalDynamicValues { get; set; } [JsonProperty("mmv")] public JArray MandatoryMutableValues { get; set; } - [JsonProperty("omv")] + [JsonProperty("omv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalMutableValues { get; set; } [JsonProperty("devices")] @@ -515,8 +515,19 @@ internal class Miner { [JsonProperty("id")] public string Id { get; set; } - [JsonProperty("algorithms")] - public List Algos { get; set; } = new List(); + [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] + public bool? Enabled { get; set; } + [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] + public List? Algos { get; set; } = new List();//for static + [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] + public List? AlgoList { get; set; } = new List(); //for omv + } + internal class Algo + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] + public bool? Enabled { get; set; } } internal class Bundle diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index f2c9f31d4..1584d53b4 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -732,6 +732,7 @@ async Task systemDump() (err, result) = ExecuteOCTest(deviceUUID, oc).Result; break; case SupportedAction.ActionOcProfileTestStop: + (err, result) = StopOCTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionFanProfileTest: object jobjectFan = JsonConvert.DeserializeObject(parameters); From 1f2c14d2f06f2c4a5471cf777b454638b98253bb Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 22 Nov 2022 15:03:43 +0100 Subject: [PATCH 017/224] implementing switch halt when benchmarking --- src/NHMCore/Configs/Managers/OCManager.cs | 92 +++++++++-- src/NHMCore/Mining/AlgorithmContainer.cs | 10 +- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 182 ++++++++-------------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 25 ++- 4 files changed, 162 insertions(+), 147 deletions(-) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 4e8853cc5..925cb684a 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -33,31 +33,99 @@ public enum OcReturn //clear first? public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) { + //find all algo containers for device with uuid + //find if specific container exists + // if yes + // if already mining + // apply benchmark + // disable switch for this device + // if mining something else + // switch to target + // disable switch for this device + // if no + // return error + + + if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); var allContainers = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? - .Where(d => d.Name == bundle.DeviceName)? + //.Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings); - if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); - if (bundle.AlgoId != null && bundle.MinerId != null) allContainers = allContainers.Where(d => - bundle.AlgoId.Contains(d.AlgorithmName) && - bundle.MinerId.Contains(d.PluginName)); - else if (bundle.AlgoId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName)); - else if (bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName)); - if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); - var distinctDevs = allContainers.Where(c => c.IsCurrentlyMining)?.DistinctBy(d => d.ComputeDevice.Uuid) ?? new List(); + if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); //if mine anything + + List specificContainers = new List(); + //in this filtering we can leave out stuff that we mine and is not in target + if (bundle.AlgoId != null && bundle.MinerId != null) specificContainers = allContainers.Where(d => + bundle.AlgoId.Contains(d.AlgorithmName) && + bundle.MinerId.Contains(d.PluginName))?.ToList();//if both algo and miner + else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); //if only algo + else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); //if only miner + if (specificContainers == null || !specificContainers.Any()) + { + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); + } + var distinctDevs = specificContainers.Where(c => c.IsCurrentlyMining)?.DistinctBy(d => d.ComputeDevice.Uuid) ?? new List(); Logger.Info(_TAG, "Applying OC Test for following containers:"); List success = new(); - foreach (var container in distinctDevs) + + var currentlyMiningContainer = distinctDevs.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); + if(currentlyMiningContainer != null) //if one of target containers already mining leave it + { + var ret = currentlyMiningContainer.SetOcForDevice(bundle); + if (ret.IsCompleted) success.Add(ret.Result); + Logger.Warn(_TAG, $"\t{currentlyMiningContainer.ComputeDevice.ID}-{currentlyMiningContainer.ComputeDevice.Name}/{currentlyMiningContainer.AlgorithmName}/{currentlyMiningContainer.PluginName}"); + //stop switching 4 this device !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } + else + { + //switch to one of target + } + foreach (var container in distinctDevs) //todo run only once { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); var ret = container.SetOcForDevice(bundle); - if (ret.IsCompleted) success.Add(ret.Result); } + //if one of the target containers not mining switch to one that is + + if (success.All(s => s == OcReturn.Success)) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); - if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); + if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); + + + + //if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); + //var allContainersGeneral = AvailableDevices.Devices + // .Where(d => d.B64Uuid == uuid)? + // .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + // //.Where(d => d.Name == bundle.DeviceName)? + // .SelectMany(d => d.AlgorithmSettings); + + //if (allContainersGeneral == null || !allContainersGeneral.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); //if mine anything + //List allContainers = new List(); + //if (bundle.AlgoId != null && bundle.MinerId != null) allContainers = allContainersGeneral.Where(d => + // bundle.AlgoId.Contains(d.AlgorithmName) && + // bundle.MinerId.Contains(d.PluginName))?.ToList();//if both algo and miner + //else if (bundle.AlgoId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); //if only algo + //else if (bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); //if only miner + //if (allContainers == null || !allContainers.Any()) + //{ + // return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); + //} + //var distinctDevs = allContainers.Where(c => c.IsCurrentlyMining)?.DistinctBy(d => d.ComputeDevice.Uuid) ?? new List(); + //Logger.Info(_TAG, "Applying OC Test for following containers:"); + //List success = new(); + //foreach (var container in distinctDevs) //todo run only once + //{ + // Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); + // var ret = container.SetOcForDevice(bundle); + // if (ret.IsCompleted) success.Add(ret.Result); + //} + //if (success.All(s => s == OcReturn.Success)) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); + //if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); + //return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); } public Task<(ErrorCode err, string msg)> StopTest(string uuid) { diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index ed8b23a5e..b39027af1 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -590,8 +590,6 @@ public Task SetOcForDevice(OcBundle bundle) if (setValues == valuesToSet) ret = OcReturn.Success; else if (setValues != 0 && setValues < valuesToSet) ret = OcReturn.PartialSuccess; - ret = OcReturn.Success; // TESTING CODE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if(ret != OcReturn.Fail) { _IsTesting = true; @@ -619,18 +617,14 @@ public Task ResetOcForDevice() else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; else ret = OcReturn.PartialSuccess; - ret = OcReturn.Success; // TESTING CODE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) { IsTesting = false; - _ActiveOCProfile = null; - _OCProfile = string.Empty; ComputeDevice.State = DeviceState.Mining; + _OCProfile = string.Empty; ComputeDevice.OCProfile = string.Empty; + _ActiveOCProfile = null; } - - return Task.FromResult(ret); } #endregion diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index d5014fe7e..efa192592 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -46,6 +46,18 @@ internal static IMethod ParseMessage(string jsonData) _ => throw new Exception($"Unable to deserialize '{jsonData}' got method '{method}'."), }; } + internal static int NHMDeviceTypeToNHMWSDeviceType(DeviceType dt) + { + //rig manager enum + //const deviceClasses = ['UNKNOWN','CPU','NVIDIA','AMD','ASIC',5,6,7,8,9,'ASIC'] + return dt switch + { + DeviceType.CPU => 1, + DeviceType.NVIDIA => 2, + DeviceType.AMD => 3, + _ => 0 + }; + } internal static IOrderedEnumerable SortedDevices(this IEnumerable devices) { @@ -146,108 +158,34 @@ private static (List properties, JArray values) GetDevi OptionalMutableProperty valueOrNull(OptionalMutableProperty v) => d.DeviceMonitor is T ? v : null; List getOptionalMutableProperties(ComputeDevice d) { - if (isLogin) + var optionalProperties = new List(); + // TODO sort by type + optionalProperties.Add(new OptionalMutablePropertyString { - // TODO sort by type - var optionalProperties = new List(); - optionalProperties.Add(new OptionalMutablePropertyString + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Miners settings", + DefaultValue = "", + Range = (2048, ""), + //ExecuteTask = async (object p) => + //{ + // //todo + // return null; + //}, + GetValue = () => { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayGroup = 0, - DisplayName = "Miners settings", - DefaultValue = "", - Range = (2048, ""), - //ExecuteTask = async (object p) => - //{ - // //todo - // return null; - //}, - GetValue = () => + string ret = null; + if (isLogin) { - //todo? - return string.Empty; + ret = string.Empty; + ret += GetMinersForDeviceDynamic(d); } - }); - #region OMVMaybe - //if (d.DeviceMonitor is ITDP tdp && d.DeviceMonitor is ITDPLimits tdpLim) - //{ - // var limits = tdpLim.GetTDPLimits(); - // if (limits.ok) - // { - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayName = "Power mode", - // DisplayUnit = "%", - // DefaultValue = (int)limits.def, - // Range = ((int)limits.min, (int)limits.max), - // //ExecuteTask = async (object p) => - // //{ - // // // #1 validate JSON input - // // if (p is string pstr && pstr is not null) return Task.FromResult(null); - // // // TODO do something - // // return Task.FromResult(null); - // //}, - // GetValue = () => - // { - // return tdp.TDPPercentage; - // } - // })); - // } - - //} - //if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange rangeCore) - //{ - // var ret = rangeCore.CoreClockRange; - // if (ret.ok) - // { - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayName = "Core clock", - // DisplayUnit = "MHz", - // DefaultValue = ret.def, - // Range = (ret.min, ret.max), - // //ExecuteTask = async (object p) => - // //{ - // //todo - // //} - // GetValue = () => - // { - // return d.CoreClock; - // } - // })); - // } - //} - //if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange rangeMem) - //{ - // var ret = rangeMem.MemoryClockRange; - // if (ret.ok) - // { - // optionalProperties.Add(valueOrNull(new OptionalMutablePropertyInt - // { - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayName = "Memory clock", - // DisplayUnit = "MHz", - // DefaultValue = ret.def, - // Range = (ret.min, ret.max), - // //ExecuteTask = async (object p) => - // //{ - // //todo - // //} - // GetValue = () => - // { - // return d.MemoryClock; - // } - // })); - // } - //} - #endregion - return optionalProperties - .Where(p => p != null) - .ToList(); - } - return null; + return ret; + } + }); + return optionalProperties + .Where(p => p != null) + .ToList(); } List getOptionalMutablePropertiesCached(ComputeDevice d) @@ -257,8 +195,14 @@ List getOptionalMutablePropertiesCached(ComputeDevice d } var props = getOptionalMutablePropertiesCached(d); - var values_omv = new JArray(props.Select(p => p.GetValue())); - + var selectedValues = props + .Where(p => p.GetValue() != null)? + .Select(p => p.GetValue()); + JArray values_omv = null; + if (selectedValues.Any()) + { + values_omv = new JArray(selectedValues); + } return (props, values_omv); } @@ -268,7 +212,7 @@ public static List> DeviceOptionalDynamicToList(List<(string name, List> result = new List>(); foreach (var property in properties) { - if(property.unit == null) + if (property.unit == null) { result.Add(new List { property.name }); continue; @@ -288,7 +232,7 @@ Device mapComputeDevice(ComputeDevice d) StaticProperties = new Dictionary { { "device_id", d.B64Uuid }, - { "class", $"{(int)d.DeviceType}" }, + { "class", $"{NHMDeviceTypeToNHMWSDeviceType(d.DeviceType)}" }, { "name", d.Name }, { "optional", GetStaticPropertiesOptionalValues(d) }, }, @@ -462,7 +406,7 @@ private static List CreateDefaultDeviceActions(string uuid) NhmwsAction.ActionElpProfileTest(uuid), NhmwsAction.ActionElpProfileTestStop(uuid), }; - } + } private static List CreateDefaultRigActions() { return new List @@ -481,12 +425,12 @@ private static List GetStaticPropertiesOptionalValues(ComputeDevice d) { new JArray("bus_id", $"{gpu.PCIeBusID}"), new JArray("vram", $"{gpu.GpuRam}"), - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d, false))), + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDeviceStatic(d))), new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), }, - _ => new List + _ => new List { - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDevice(d, false))), + new JArray("miners", FormatForOptionalValues("miners", GetMinersForDeviceStatic(d))), new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), }, }; @@ -494,44 +438,42 @@ private static List GetStaticPropertiesOptionalValues(ComputeDevice d) private static string FormatForOptionalValues(string name, string content) { - return "{\""+ name +"\":" + content + "}"; + return "{\"" + name + "\":" + content + "}"; } - private static string GetMinersForDeviceDynamic(ComputeDevice d, bool includeEnabled)//todo if include enabled return array of strings else return array of structs + private static string GetMinersForDeviceDynamic(ComputeDevice d)//todo if include enabled return array of strings else return array of structs { - List miners = new List(); + var minersObject = new MinerLogin(); var containers = d.AlgorithmSettings; if (containers == null) return String.Empty; - var grouped = containers.GroupBy(c => c.PluginName); - if(grouped == null) return String.Empty; + var grouped = containers.GroupBy(c => c.PluginName); + if (grouped == null) return String.Empty; foreach (var group in grouped) { var container = group.First(); - var miner = new Miner() { Id = group.Key }; - if (includeEnabled) miner.Enabled = container.Enabled; + var miner = new MinerDynamic() { Id = group.Key, Enabled = container.Enabled }; var algos = new List(); foreach (var algo in group) { - var tempAlgo = new Algo() { Id = algo.AlgorithmName }; - if (includeEnabled) tempAlgo.Enabled = algo.Enabled; + var tempAlgo = new Algo() { Id = algo.AlgorithmName, Enabled = algo.Enabled }; algos.Add(tempAlgo); } miner.Algos = algos; - miners.Add(miner); + minersObject.Miners.Add(miner); } - var json = JsonConvert.SerializeObject(miners); + var json = JsonConvert.SerializeObject(minersObject); return json; } private static string GetMinersForDeviceStatic(ComputeDevice d) { - List miners = new List(); + List miners = new List(); var uniquePlugins = d.AlgorithmSettings?.Select(item => item.PluginName)?.Distinct()?.Where(item => !string.IsNullOrEmpty(item)); if (uniquePlugins == null) return String.Empty; foreach (var plugin in uniquePlugins) { var uniqueAlgos = d.AlgorithmSettings?.Where(item => item.PluginName == plugin)?.Select(item => item.AlgorithmName)?.Distinct(); if (uniqueAlgos == null) uniqueAlgos = new List(); - miners.Add(new Miner() { Id = plugin, AlgoList = uniqueAlgos.ToList() }); + miners.Add(new MinerStatic() { Id = plugin, AlgoList = uniqueAlgos.ToList() }); } var json = JsonConvert.SerializeObject(miners); return json; @@ -559,7 +501,7 @@ private static string GetLimitsForDevice(ComputeDevice d) { var lims = mcLim.MemoryClockRange; if (lims.ok) - { + { limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index b201f7859..da51cd576 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -511,16 +511,27 @@ internal class PropertyString : Property [JsonProperty("value")] public string Value { get; set; } } - internal class Miner + + internal class MinerLogin + { + [JsonProperty("miners")] + public List Miners { get; set; } = new List(); + } + internal class MinerDynamic { [JsonProperty("id")] public string Id { get; set; } - [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] - public bool? Enabled { get; set; } - [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] - public List? Algos { get; set; } = new List();//for static - [JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)] - public List? AlgoList { get; set; } = new List(); //for omv + [JsonProperty("enabled")] + public bool Enabled { get; set; } + [JsonProperty("algorithms")] + public List Algos { get; set; } = new List(); + } + internal class MinerStatic + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("algorithms")] + public List AlgoList { get; set; } = new List(); } internal class Algo { From 14ec810d27591462c1e89c1746c4c07d1d4ec793 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 23 Nov 2022 12:36:40 +0100 Subject: [PATCH 018/224] locked switching for tests --- src/NHMCore/Configs/Managers/OCManager.cs | 94 ++++----------------- src/NHMCore/Mining/AlgorithmContainer.cs | 24 +++++- src/NHMCore/Mining/Grouping/MiningDevice.cs | 2 + src/NHMCore/Nhmws/ErrorCode.cs | 1 + src/NHMCore/Nhmws/V4/MessageParserV4.cs | 6 +- 5 files changed, 43 insertions(+), 84 deletions(-) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 925cb684a..60680f2c1 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -7,6 +7,7 @@ using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Reflection.Metadata; using System.Text; @@ -29,103 +30,42 @@ public enum OcReturn Fail } - //todo cleanup for many different tests if they come one after another - //clear first? public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) { - //find all algo containers for device with uuid - //find if specific container exists - // if yes - // if already mining - // apply benchmark - // disable switch for this device - // if mining something else - // switch to target - // disable switch for this device - // if no - // return error - - - - if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); + if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var allContainers = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? - //.Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings); if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); //if mine anything - List specificContainers = new List(); - //in this filtering we can leave out stuff that we mine and is not in target + List specificContainers = allContainers.ToList(); if (bundle.AlgoId != null && bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName) && bundle.MinerId.Contains(d.PluginName))?.ToList();//if both algo and miner else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); //if only algo else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); //if only miner - if (specificContainers == null || !specificContainers.Any()) - { - return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); - } - var distinctDevs = specificContainers.Where(c => c.IsCurrentlyMining)?.DistinctBy(d => d.ComputeDevice.Uuid) ?? new List(); - Logger.Info(_TAG, "Applying OC Test for following containers:"); - List success = new(); - - var currentlyMiningContainer = distinctDevs.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); - if(currentlyMiningContainer != null) //if one of target containers already mining leave it + if (specificContainers == null || !specificContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); + var target = specificContainers.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); + if(target != null) { - var ret = currentlyMiningContainer.SetOcForDevice(bundle); - if (ret.IsCompleted) success.Add(ret.Result); - Logger.Warn(_TAG, $"\t{currentlyMiningContainer.ComputeDevice.ID}-{currentlyMiningContainer.ComputeDevice.Name}/{currentlyMiningContainer.AlgorithmName}/{currentlyMiningContainer.PluginName}"); - //stop switching 4 this device !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + target.ForceMiningOnlyThisContainer = true; + Logger.Warn(_TAG, $"\t{target.ComputeDevice.ID}-{target.ComputeDevice.Name}/{target.AlgorithmName}/{target.PluginName}"); } else { - //switch to one of target + target = specificContainers.FirstOrDefault(); + if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); + target.ForceMiningOnlyThisContainer = true; } - foreach (var container in distinctDevs) //todo run only once + var ret = target.SetOcForDevice(bundle); + if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); + if (ret.Result == OcReturn.Fail) { - Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - var ret = container.SetOcForDevice(bundle); + target.ForceMiningOnlyThisContainer = false; + return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); } - //if one of the target containers not mining switch to one that is - - - if (success.All(s => s == OcReturn.Success)) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); - if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); - - - - //if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices running")); - //var allContainersGeneral = AvailableDevices.Devices - // .Where(d => d.B64Uuid == uuid)? - // .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? - // //.Where(d => d.Name == bundle.DeviceName)? - // .SelectMany(d => d.AlgorithmSettings); - - //if (allContainersGeneral == null || !allContainersGeneral.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); //if mine anything - //List allContainers = new List(); - //if (bundle.AlgoId != null && bundle.MinerId != null) allContainers = allContainersGeneral.Where(d => - // bundle.AlgoId.Contains(d.AlgorithmName) && - // bundle.MinerId.Contains(d.PluginName))?.ToList();//if both algo and miner - //else if (bundle.AlgoId != null) allContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); //if only algo - //else if (bundle.MinerId != null) allContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); //if only miner - //if (allContainers == null || !allContainers.Any()) - //{ - // return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); - //} - //var distinctDevs = allContainers.Where(c => c.IsCurrentlyMining)?.DistinctBy(d => d.ComputeDevice.Uuid) ?? new List(); - //Logger.Info(_TAG, "Applying OC Test for following containers:"); - //List success = new(); - //foreach (var container in distinctDevs) //todo run only once - //{ - // Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - // var ret = container.SetOcForDevice(bundle); - // if (ret.IsCompleted) success.Add(ret.Result); - //} - //if (success.All(s => s == OcReturn.Success)) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); - //if (success.All(s => s == OcReturn.Fail)) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); - //return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); } public Task<(ErrorCode err, string msg)> StopTest(string uuid) { @@ -140,11 +80,11 @@ public enum OcReturn return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } var ret = targetDeviceContainer.ResetOcForDevice(); + targetDeviceContainer.ForceMiningOnlyThisContainer = false; if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); if (ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to stop test")); return Task.FromResult((ErrorCode.TestPartialFail, "Stopped test")); } - //clear first???? public Task ApplyOcBundle(List bundles) { _ocBundles.AddRange(bundles); diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index b39027af1..81b38a86a 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -539,6 +539,18 @@ void SettingsChanged(object sender, EventArgs e) #endregion #if NHMWS4 + private bool _forceMiningOnlyThisContainer { get; set; } = false; + public bool ForceMiningOnlyThisContainer + { + get + { + return _forceMiningOnlyThisContainer; + } + set + { + _forceMiningOnlyThisContainer = value; + } + } #region OC private bool _IsTesting = false; @@ -556,16 +568,20 @@ public bool IsTesting private string _OCProfile = string.Empty; public string OCProfile => _OCProfile; private OcBundle _ActiveOCProfile = null; - public OcBundle ActiveOCProfile => ActiveOCProfile; + public OcBundle ActiveOCProfile => _ActiveOCProfile; public Task SetOcForDevice(OcBundle bundle) { + Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = OcReturn.Fail; int valuesToSet = 0; if (bundle.CoreClock > 0) valuesToSet++; if (bundle.MemoryClock > 0) valuesToSet++; if (bundle.TDP > 0) valuesToSet++; - if (valuesToSet == 0) return Task.FromResult(ret); - + if (valuesToSet == 0) + { + Logger.Error(_TAG, "Have no values to set"); + return Task.FromResult(ret); + } int setValues = 3; var setCC = ComputeDevice.SetCoreClock(bundle.CoreClock); var setMC = ComputeDevice.SetMemoryClock(bundle.MemoryClock); @@ -592,7 +608,7 @@ public Task SetOcForDevice(OcBundle bundle) if(ret != OcReturn.Fail) { - _IsTesting = true; + _IsTesting = true;//todo not just for testing ComputeDevice.State = DeviceState.Testing; _OCProfile = bundle.Name; ComputeDevice.OCProfile = bundle.Name; diff --git a/src/NHMCore/Mining/Grouping/MiningDevice.cs b/src/NHMCore/Mining/Grouping/MiningDevice.cs index 6ae1c3817..c99b535f9 100644 --- a/src/NHMCore/Mining/Grouping/MiningDevice.cs +++ b/src/NHMCore/Mining/Grouping/MiningDevice.cs @@ -55,6 +55,8 @@ public double GetPrevMostProfitValue public AlgorithmContainer GetMostProfitableAlgorithmContainer() { + var forcedContainer = Algorithms.Where(a => a.ForceMiningOnlyThisContainer)?.FirstOrDefault(); + if (forcedContainer != null) return forcedContainer; return Algorithms.FirstOrDefault(a => a.AlgorithmStringID == MostProfitableAlgorithmStringID); } diff --git a/src/NHMCore/Nhmws/ErrorCode.cs b/src/NHMCore/Nhmws/ErrorCode.cs index 44c72a74d..37393f3b3 100644 --- a/src/NHMCore/Nhmws/ErrorCode.cs +++ b/src/NHMCore/Nhmws/ErrorCode.cs @@ -18,6 +18,7 @@ public enum ErrorCode : int TargetDeviceNotFound = -102, TestPartialFail = -103, TestTotalFail = -104, + TargetContainerNotFound = -105, } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index efa192592..b66703d6b 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -446,12 +446,12 @@ private static string FormatForOptionalValues(string name, string content) var minersObject = new MinerLogin(); var containers = d.AlgorithmSettings; if (containers == null) return String.Empty; - var grouped = containers.GroupBy(c => c.PluginName); + var grouped = containers.GroupBy(c => c.PluginName).ToList(); if (grouped == null) return String.Empty; foreach (var group in grouped) { - var container = group.First(); - var miner = new MinerDynamic() { Id = group.Key, Enabled = container.Enabled }; + var containerEnabled = group.Any(c => c.Enabled); + var miner = new MinerDynamic() { Id = group.Key, Enabled = containerEnabled }; var algos = new List(); foreach (var algo in group) { From 367136d2838994940b0c3e78d116eb53e4847032 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 23 Nov 2022 14:44:10 +0100 Subject: [PATCH 019/224] working on forced switching --- src/NHMCore/Configs/Managers/OCManager.cs | 6 ++++-- src/NHMCore/Mining/AlgorithmContainer.cs | 6 +++--- src/NHMCore/Mining/MiningManager.cs | 17 +++++++++++++++-- src/NHMCore/Nhmws/V4/MessagesV4.cs | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 60680f2c1..099edb2da 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -59,12 +59,13 @@ public enum OcReturn target.ForceMiningOnlyThisContainer = true; } var ret = target.SetOcForDevice(bundle); - if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); if (ret.Result == OcReturn.Fail) { target.ForceMiningOnlyThisContainer = false; return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); } + MiningManager.TriggerSwitchCheck(); + if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); } public Task<(ErrorCode err, string msg)> StopTest(string uuid) @@ -81,8 +82,9 @@ public enum OcReturn } var ret = targetDeviceContainer.ResetOcForDevice(); targetDeviceContainer.ForceMiningOnlyThisContainer = false; - if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); + MiningManager.TriggerSwitchCheck(); if (ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to stop test")); + if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); return Task.FromResult((ErrorCode.TestPartialFail, "Stopped test")); } public Task ApplyOcBundle(List bundles) diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 81b38a86a..10bde8147 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -583,9 +583,9 @@ public Task SetOcForDevice(OcBundle bundle) return Task.FromResult(ret); } int setValues = 3; - var setCC = ComputeDevice.SetCoreClock(bundle.CoreClock); - var setMC = ComputeDevice.SetMemoryClock(bundle.MemoryClock); - var setTDP = ComputeDevice.SetPowerModeManual(bundle.TDP); + var setCC = bundle.CoreClock <= 0 ? false : ComputeDevice.SetCoreClock(bundle.CoreClock); + var setMC = bundle.MemoryClock <= 0 ? false : ComputeDevice.SetMemoryClock(bundle.MemoryClock); + var setTDP = bundle.TDP <= 0 ? false : ComputeDevice.SetPowerModeManual(bundle.TDP); if (!setCC) { diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index b7b7b4d62..98b2d9122 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -55,7 +55,7 @@ private abstract record Command } private record MainCommand : Command; - + private record TriggerSwitchCheckCommand : MainCommand; private record NormalizedProfitsUpdateCommand(Dictionary NormalizedProfits) : MainCommand; private record UsernameChangedCommand(string Username) : MainCommand; @@ -119,6 +119,13 @@ public static Task StopDevice(ComputeDevice device) _commandQueue.Enqueue(command); return command.Tsc.Task; } + public static Task TriggerSwitchCheck() // todo call this + { + if (RunninLoops == null) return Task.CompletedTask; + var command = new TriggerSwitchCheckCommand(); + _commandQueue.Enqueue(command); + return command.Tsc.Task; + } private static Task NormalizedProfitsUpdate(Dictionary normalizedProfits) { @@ -590,6 +597,7 @@ private static async Task CheckGroupingAndUpdateMiners(MainCommand command) // #1 parse the command var commandType = command.GetType().Name; Logger.Debug(Tag, $"Command type {commandType}"); + if (command is NormalizedProfitsUpdateCommand normalizedProfitsUpdateCommand) { _normalizedProfits = normalizedProfitsUpdateCommand.NormalizedProfits; @@ -682,12 +690,17 @@ or DNSQChangedCommand bool skipProfitsThreshold = CheckIfShouldSkipProfitsThreshold(command); await SwichMostProfitableGroupUpMethodTask(_normalizedProfits, skipProfitsThreshold); } + else if (command is TriggerSwitchCheckCommand triggerSwitchCheckCommand) + { + Logger.Info(Tag, "Switch triggered manually"); + bool skipProfitsThreshold = CheckIfShouldSkipProfitsThreshold(command); + await SwichMostProfitableGroupUpMethodTask(_normalizedProfits, skipProfitsThreshold); + } else { ApplicationStateManager.StartMining(); bool skipProfitsThreshold = CheckIfShouldSkipProfitsThreshold(command); await SwichMostProfitableGroupUpMethodTask(_normalizedProfits, skipProfitsThreshold); - } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index da51cd576..2bf2b7254 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -581,7 +581,7 @@ public class OcBundle public int CoreClock { get; set; } [JsonProperty("memory_clock")] public int MemoryClock { get; set; } - [JsonProperty("tdp")] + [JsonProperty("power_mode")] public int TDP { get; set; } } internal class FanBundle From d446e1cad03da2b5000dcbf183d178557dd659dc Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 25 Nov 2022 12:36:11 +0100 Subject: [PATCH 020/224] oc testing seems to work --- src/NHMCore/Configs/Managers/OCManager.cs | 34 +++++++------- src/NHMCore/Mining/AlgorithmContainer.cs | 45 +++++-------------- src/NHMCore/Mining/ComputeDevice.cs | 10 +++++ src/NHMCore/Mining/Grouping/MiningDevice.cs | 2 +- src/NHMCore/Mining/MiningManager.cs | 49 ++++++++------------- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 14 +++++- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 7 +++ 7 files changed, 77 insertions(+), 84 deletions(-) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 099edb2da..f0a64c394 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -20,7 +20,6 @@ public class OCManager private OCManager() { } public static OCManager Instance { get; } = new OCManager(); private List _ocBundles = new(); - private List _testOcBundles = new(); private readonly string _TAG = "OCManager"; public enum OcReturn @@ -35,33 +34,33 @@ public enum OcReturn if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var allContainers = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? - .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? + .Where(d => d.State == DeviceState.Mining || d.State == DeviceState.Testing)? .SelectMany(d => d.AlgorithmSettings); - if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); //if mine anything + if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); List specificContainers = allContainers.ToList(); if (bundle.AlgoId != null && bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName) && - bundle.MinerId.Contains(d.PluginName))?.ToList();//if both algo and miner - else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); //if only algo - else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); //if only miner + bundle.MinerId.Contains(d.PluginName))?.ToList(); + else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); + else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); if (specificContainers == null || !specificContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); var target = specificContainers.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); - if(target != null) - { - target.ForceMiningOnlyThisContainer = true; - Logger.Warn(_TAG, $"\t{target.ComputeDevice.ID}-{target.ComputeDevice.Name}/{target.AlgorithmName}/{target.PluginName}"); - } - else + if(target == null) { target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); - target.ForceMiningOnlyThisContainer = true; } - var ret = target.SetOcForDevice(bundle); + Logger.Warn(_TAG, $"\t{target.ComputeDevice.ID}-{target.ComputeDevice.Name}/{target.AlgorithmName}/{target.PluginName}"); + AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future + .Where(d => d.B64Uuid == uuid)? + .SelectMany(d => d.AlgorithmSettings)? + .ToList()? + .ForEach(c => c.IsTesting = false); + + var ret = target.SetOcTestForDevice(bundle); if (ret.Result == OcReturn.Fail) { - target.ForceMiningOnlyThisContainer = false; return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); } MiningManager.TriggerSwitchCheck(); @@ -80,8 +79,7 @@ public enum OcReturn Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - var ret = targetDeviceContainer.ResetOcForDevice(); - targetDeviceContainer.ForceMiningOnlyThisContainer = false; + var ret = targetDeviceContainer.ResetOcTestForDevice(); MiningManager.TriggerSwitchCheck(); if (ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to stop test")); if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); @@ -134,7 +132,7 @@ public Task ApplyOcBundle(List bundles) foreach (var container in current) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - container.SetOcForDevice(bundle); + container.SetOcTestForDevice(bundle); } } return Task.CompletedTask; diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 10bde8147..1cb526beb 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -539,18 +539,6 @@ void SettingsChanged(object sender, EventArgs e) #endregion #if NHMWS4 - private bool _forceMiningOnlyThisContainer { get; set; } = false; - public bool ForceMiningOnlyThisContainer - { - get - { - return _forceMiningOnlyThisContainer; - } - set - { - _forceMiningOnlyThisContainer = value; - } - } #region OC private bool _IsTesting = false; @@ -567,9 +555,9 @@ public bool IsTesting } private string _OCProfile = string.Empty; public string OCProfile => _OCProfile; - private OcBundle _ActiveOCProfile = null; - public OcBundle ActiveOCProfile => _ActiveOCProfile; - public Task SetOcForDevice(OcBundle bundle) + private OcBundle _ActiveOCTestProfile = null; + public OcBundle ActiveOCTestProfile => _ActiveOCTestProfile; + public Task SetOcTestForDevice(OcBundle bundle, bool reset = false) { Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = OcReturn.Fail; @@ -606,42 +594,33 @@ public Task SetOcForDevice(OcBundle bundle) if (setValues == valuesToSet) ret = OcReturn.Success; else if (setValues != 0 && setValues < valuesToSet) ret = OcReturn.PartialSuccess; - if(ret != OcReturn.Fail) + if(ret != OcReturn.Fail && !reset) { _IsTesting = true;//todo not just for testing ComputeDevice.State = DeviceState.Testing; _OCProfile = bundle.Name; ComputeDevice.OCProfile = bundle.Name; - _ActiveOCProfile = bundle; + _ActiveOCTestProfile = bundle; } return Task.FromResult(ret); } - public Task ResetOcForDevice() + public Task ResetOcTestForDevice() { var defCC = ComputeDevice.CoreClockRange; var defMC = ComputeDevice.MemoryClockRange; var defTDP = ComputeDevice.TDPLimits; - - var setCC = defCC.ok ? ComputeDevice.SetCoreClock(defCC.def) : false; - Logger.Warn(_TAG, $"Resetting core clock ({defCC.def}) for device {ComputeDevice.Name} success: {setCC}"); - var setMC = defMC.ok ? ComputeDevice.SetMemoryClock(defMC.def) : false; - Logger.Warn(_TAG, $"Resetting memory clock ({defMC.def}) for device {ComputeDevice.Name} success: {setMC}"); - var setTDP = defTDP.def > 0 ? ComputeDevice.SetPowerModeManual((int)defTDP.def) : false; - Logger.Warn(_TAG, $"Resetting TDP ({defTDP.def}) for device {ComputeDevice.Name} success: {setTDP}"); - var ret = OcReturn.Success; - if (setCC && setMC && setTDP) ret = OcReturn.Success; - else if (!setCC && !setMC && !setTDP) ret = OcReturn.Fail; - else ret = OcReturn.PartialSuccess; - - if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) + var bundle = new OcBundle() { CoreClock = defCC.def, MemoryClock = defMC.def, TDP = (int)defTDP.def }; + var res = SetOcTestForDevice(bundle, true).Result; + if (res != OcReturn.Fail) { + res = OcReturn.Success; // todo temporary IsTesting = false; ComputeDevice.State = DeviceState.Mining; _OCProfile = string.Empty; ComputeDevice.OCProfile = string.Empty; - _ActiveOCProfile = null; + _ActiveOCTestProfile = null; } - return Task.FromResult(ret); + return Task.FromResult(res); } #endregion #endif diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index d84b041f0..09247ab59 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -34,6 +34,9 @@ public class ComputeDevice : NotifyChangedBase // name count is the short name for displaying in moning groups public string NameCount { get; private set; } +#if NHMWS4 + public bool IsTesting => AlgorithmSettings.Any(a => a.IsTesting); +#endif private bool _enabled = true; public bool Enabled @@ -658,6 +661,13 @@ public string OCProfile get { return _OCProfile; } set { _OCProfile = value; } } + public void AfterStartMining() + { + if (IsTesting) + { + State = DeviceState.Testing; + } + } #endif } } diff --git a/src/NHMCore/Mining/Grouping/MiningDevice.cs b/src/NHMCore/Mining/Grouping/MiningDevice.cs index c99b535f9..e8eb78163 100644 --- a/src/NHMCore/Mining/Grouping/MiningDevice.cs +++ b/src/NHMCore/Mining/Grouping/MiningDevice.cs @@ -55,7 +55,7 @@ public double GetPrevMostProfitValue public AlgorithmContainer GetMostProfitableAlgorithmContainer() { - var forcedContainer = Algorithms.Where(a => a.ForceMiningOnlyThisContainer)?.FirstOrDefault(); + var forcedContainer = Algorithms.Where(a => a.IsTesting)?.FirstOrDefault(); if (forcedContainer != null) return forcedContainer; return Algorithms.FirstOrDefault(a => a.AlgorithmStringID == MostProfitableAlgorithmStringID); } diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index 98b2d9122..e0a4bbed1 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -4,6 +4,7 @@ using NHMCore.Configs; using NHMCore.Configs.Managers; using NHMCore.Mining.Grouping; +using NHMCore.Nhmws.V4; using NHMCore.Notifications; using NHMCore.Schedules; using NHMCore.Switching; @@ -119,7 +120,7 @@ public static Task StopDevice(ComputeDevice device) _commandQueue.Enqueue(command); return command.Tsc.Task; } - public static Task TriggerSwitchCheck() // todo call this + public static Task TriggerSwitchCheck() { if (RunninLoops == null) return Task.CompletedTask; var command = new TriggerSwitchCheckCommand(); @@ -665,6 +666,12 @@ or DNSQChangedCommand foreach (var miner in _runningMiners.Values) await miner.StopTask(); // START foreach (var miner in _runningMiners.Values) await miner.StartMinerTask(_stopMiningManager, _username); +#if NHMWS4 + AvailableDevices.Devices + .Where(d => d.State == DeviceState.Mining)? + .ToList()? + .ForEach(d => d.AfterStartMining()); +#endif } else if (_miningDevices.Count == 0) { @@ -922,6 +929,7 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary d.State == DeviceState.Mining)? + .ToList()? + .ForEach(d => d.AfterStartMining()); + _ = NHWebSocketV4.UpdateMinerStatus(); //todo maybe not needeed +#endif // log scope { var stopLog = toStopMinerGroupKeys.Length > 0 ? string.Join(",", toStopMinerGroupKeys) : "EMTPY"; @@ -950,34 +968,5 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary dev.DeviceUUID == UUID); - if (devData == null) return ""; - + if (devData == null) + { + var fallback = AvailableDevices.Devices + .Where(d => d.Uuid == UUID)? + .Where(d => d.State == DeviceState.Mining + || d.State == DeviceState.Benchmarking + || d.State == DeviceState.Testing)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(a => a.IsCurrentlyMining)? + .FirstOrDefault(); + return fallback == null ? string.Empty : fallback.PluginName; + } return devData.MinerName; } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 1584d53b4..cc35d7964 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -752,8 +752,15 @@ async Task systemDump() NHLog.Warn(_logTag, "This type of action is unsupported: " + typeOfAction); break; } + _ = UpdateMinerStatus(); return Task.FromResult((err, result)); } + internal static Task UpdateMinerStatus() + { + var minerStatusJsonStr = CreateMinerStatusMessage(); + _sendQueue.EnqueueParams((MessageType.SEND_MESSAGE_STATUS, minerStatusJsonStr)); + return Task.CompletedTask; + } private static Task ExecuteProfilesBundleSet(Bundle bundle) { //todo check returns!!! From 01fa2f44e89313bea5e85daf6381a785a39af7a8 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 25 Nov 2022 14:11:20 +0100 Subject: [PATCH 021/224] added error if nhm not admin --- src/NHMCore/Nhmws/ErrorCode.cs | 3 +-- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/NHMCore/Nhmws/ErrorCode.cs b/src/NHMCore/Nhmws/ErrorCode.cs index 37393f3b3..b0e19dc26 100644 --- a/src/NHMCore/Nhmws/ErrorCode.cs +++ b/src/NHMCore/Nhmws/ErrorCode.cs @@ -19,7 +19,6 @@ public enum ErrorCode : int TestPartialFail = -103, TestTotalFail = -104, TargetContainerNotFound = -105, - - + ErrNotAdmin = -106, } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index cc35d7964..356576123 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -784,11 +784,13 @@ private static Task ExecuteProfilesBundleReset() } private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) { + if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); return Task.FromResult(res.Result); } private static Task<(ErrorCode err, string msg)> StopOCTestForDevice(string deviceUUID) { + if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); var res = OCManager.Instance.StopTest(deviceUUID); return Task.FromResult(res.Result); } From 3aba963c6ac490b58c201e10a47d1b4bb6ee1a3b Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 29 Nov 2022 15:10:46 +0100 Subject: [PATCH 022/224] after refactor, setting tests and bundles work, todo testing --- src/NHMCore/Configs/Managers/BundleManager.cs | 28 ++++++ src/NHMCore/Configs/Managers/OCManager.cs | 52 +++++----- src/NHMCore/Mining/AlgorithmContainer.cs | 99 ++++++++++++------- src/NHMCore/Mining/ComputeDevice.cs | 51 ++++++++-- src/NHMCore/Mining/Miner.cs | 2 +- src/NHMCore/Mining/MiningManager.cs | 43 +++++--- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 7 +- src/NHMCore/Nhmws/V4/MessagesV4.cs | 2 + src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 39 +++----- 9 files changed, 211 insertions(+), 112 deletions(-) create mode 100644 src/NHMCore/Configs/Managers/BundleManager.cs diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs new file mode 100644 index 000000000..a74a1fdee --- /dev/null +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Configs.Managers +{ + public static class BundleManager + { + private static string BundleName = string.Empty; + + private static string BundleID = string.Empty; + public static void SetBundleInfo(string name, string id) + { + BundleName = name; BundleID = id; + } + public static (string BundleName, string BundleID) GetBundleInfo() + { + return (BundleName, BundleID); + } + public static void ResetBundleInfo() + { + BundleName = string.Empty; + BundleID = string.Empty; + } + } +} diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index f0a64c394..68643d99c 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -5,6 +5,7 @@ using NHMCore.Mining; using NHMCore.Nhmws; using NHMCore.Nhmws.V4; +using Org.BouncyCastle.Asn1.X509; using System; using System.Collections.Generic; using System.ComponentModel; @@ -19,7 +20,6 @@ public class OCManager { private OCManager() { } public static OCManager Instance { get; } = new OCManager(); - private List _ocBundles = new(); private readonly string _TAG = "OCManager"; public enum OcReturn @@ -51,21 +51,14 @@ public enum OcReturn target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - Logger.Warn(_TAG, $"\t{target.ComputeDevice.ID}-{target.ComputeDevice.Name}/{target.AlgorithmName}/{target.PluginName}"); AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future .Where(d => d.B64Uuid == uuid)? .SelectMany(d => d.AlgorithmSettings)? .ToList()? .ForEach(c => c.IsTesting = false); - - var ret = target.SetOcTestForDevice(bundle); - if (ret.Result == OcReturn.Fail) - { - return Task.FromResult((ErrorCode.TestTotalFail, "Failed to apply test")); - } + target.SetTargetOcTestProfile(bundle); MiningManager.TriggerSwitchCheck(); - if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully applied test")); - return Task.FromResult((ErrorCode.TestPartialFail, "Partially applied test")); + return Task.FromResult((ErrorCode.NoError, "Success")); } public Task<(ErrorCode err, string msg)> StopTest(string uuid) { @@ -79,51 +72,44 @@ public enum OcReturn Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - var ret = targetDeviceContainer.ResetOcTestForDevice(); + targetDeviceContainer.SetTargetOcTestProfile(null); MiningManager.TriggerSwitchCheck(); - if (ret.Result == OcReturn.Fail) return Task.FromResult((ErrorCode.TestTotalFail, "Failed to stop test")); - if (ret.Result == OcReturn.Success) return Task.FromResult((ErrorCode.NoError, "Successfully stopped test")); - return Task.FromResult((ErrorCode.TestPartialFail, "Stopped test")); + return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task ApplyOcBundle(List bundles) + public Task<(ErrorCode err, string msg)> ApplyOcBundle(List bundles) { - _ocBundles.AddRange(bundles); List processed = new(); - if (!MiningState.Instance.AnyDeviceRunning) return Task.CompletedTask; + //if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var sorted = new List<(int, OcBundle)>(); foreach (var bundle in bundles) { - if (bundle.MinerId.Any() && bundle.AlgoId.Any()) sorted.Add((0, bundle)); - else if (!bundle.MinerId.Any() && bundle.AlgoId.Any()) sorted.Add((1, bundle)); - else if (bundle.MinerId.Any() && !bundle.AlgoId.Any()) sorted.Add((2, bundle)); + if (bundle.MinerId != null && bundle.AlgoId != null) sorted.Add((0, bundle)); + else if (bundle.MinerId == null && bundle.AlgoId != null) sorted.Add((1, bundle)); + else if (bundle.MinerId != null && bundle.AlgoId == null) sorted.Add((2, bundle)); else sorted.Add((3, bundle)); } - sorted = sorted.OrderByDescending(item => item.Item1).Reverse().ToList(); + sorted = sorted.OrderBy(item => item.Item1).ToList(); foreach (var (type, bundle) in sorted) { var current = new List(); if (type == 0) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? - .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? .SelectMany(d => d.AlgorithmSettings)? .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? .Where(c => bundle.MinerId.Contains(c.PluginName))? .ToList(); else if (type == 1) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? - .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? .SelectMany(d => d.AlgorithmSettings)? .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? .ToList(); else if (type == 2) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? - .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? .SelectMany(d => d.AlgorithmSettings)? .Where(c => bundle.MinerId.Contains(c.PluginName))? .ToList(); else current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? - .Where(d => d.State == NHM.Common.Enums.DeviceState.Mining || d.State == NHM.Common.Enums.DeviceState.Benchmarking)? .SelectMany(d => d.AlgorithmSettings)? .ToList(); if (current == null) continue; @@ -132,10 +118,22 @@ public Task ApplyOcBundle(List bundles) foreach (var container in current) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - container.SetOcTestForDevice(bundle); + container.SetTargetOcProfile(bundle); } } - return Task.CompletedTask; + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } + + public Task ResetOcBundle() + { + var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); + foreach (var container in containers) + { + container.SetTargetOcProfile(null); + } + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); } } } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 1cb526beb..312eb30b3 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -101,7 +101,7 @@ public MiningPair ToMiningPair() Algorithm = Algorithm }; } - public DeviceELPData FindInELPTree(string deviceUUID) => ELPManager.Instance.FindDeviceNode(this, deviceUUID); + public DeviceELPData FindInELPTree(string deviceUUID) => ELPManager.Instance.FindDeviceNode(this, deviceUUID); public void UpdateConfigVersionIfNeeded() { if ((_powerUsageHistory.Count >= 2 && _powerUsageHistory.Last() != _powerUsageHistory[_powerUsageHistory.Count - 2]) || @@ -131,7 +131,7 @@ public bool LastBenchmarkingFailed } } -#region Identity + #region Identity /// /// Friendly display name for this algorithm @@ -149,10 +149,10 @@ public bool LastBenchmarkingFailed public string MinerUUID => Algorithm?.MinerID; public bool IsDual => Algorithm.IDs.Count > 1; -#endregion + #endregion -#region Mining settings + #region Mining settings /// /// Hashrate in H/s set by benchmark or user @@ -268,11 +268,11 @@ protected void NotifyPowerChanged() OnPropertyChanged(nameof(CurrentEstimatedProfitStr)); } -#endregion + #endregion -#region Profitability + #region Profitability -#region EstimatedProfit NOT FOR SWITCHING + #region EstimatedProfit NOT FOR SWITCHING internal void UpdateEstimatedProfit(Dictionary profits) @@ -359,9 +359,9 @@ public string CurPayingRatioStr } } -#endregion EstimatedProfit NOT FOR SWITCHING + #endregion EstimatedProfit NOT FOR SWITCHING -#region NormalizedProfit FOR SWITCHING + #region NormalizedProfit FOR SWITCHING // TODO with this implementation WE ONLY SUPPORT dual algorithms /// /// Gets the averaged speed for this algorithm in H/s @@ -380,7 +380,7 @@ public string CurPayingRatioStr -#endregion NormalizedProfit FOR SWITCHING + #endregion NormalizedProfit FOR SWITCHING @@ -404,7 +404,7 @@ public virtual double PowerUsage { } } -#endregion + #endregion private bool _isReBenchmark = false; public bool IsReBenchmark @@ -432,7 +432,7 @@ internal bool IsCurrentlyMining -#region Benchmark info + #region Benchmark info private bool _benchmarkPending; public bool IsBenchmarkPending @@ -479,11 +479,11 @@ public void ClearSpeeds() this.Speeds = allZero; } - -#endregion -#region Benchmark methods + #endregion + + #region Benchmark methods public void SetBenchmarkPending() { @@ -501,9 +501,9 @@ public void SetBenchmarkError(string message) BenchmarkErrorMessage = message; } -#endregion + #endregion -#region Profitability methods + #region Profitability methods public virtual void UpdateCurrentNormalizedProfit(Dictionary profits) { @@ -553,11 +553,44 @@ public bool IsTesting _IsTesting = value; } } - private string _OCProfile = string.Empty; - public string OCProfile => _OCProfile; + public string OCProfile { + get + { + if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Name; + if (ActiveOCProfile != null) return ActiveOCProfile.Name; + return string.Empty; + } + } + public string OCProfileID + { + get + { + if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Id; + if (ActiveOCProfile != null) return ActiveOCProfile.Id; + return string.Empty; + } + } private OcBundle _ActiveOCTestProfile = null; public OcBundle ActiveOCTestProfile => _ActiveOCTestProfile; - public Task SetOcTestForDevice(OcBundle bundle, bool reset = false) + private OcBundle TestOcProfilePrev { get; set; } + + private OcBundle _ActiveOCProfile = null; + public OcBundle ActiveOCProfile => _ActiveOCProfile; + private OcBundle OcProfilePrev { get; set; } + + public void SetTargetOcTestProfile(OcBundle profile) + { + IsTesting = profile == null ? false : true; + TestOcProfilePrev = ActiveOCTestProfile; + _ActiveOCTestProfile = profile; + } + public void SetTargetOcProfile(OcBundle profile) + { + OcProfilePrev = ActiveOCProfile; + _ActiveOCProfile = profile; + } + + public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) { Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = OcReturn.Fail; @@ -594,33 +627,23 @@ public Task SetOcTestForDevice(OcBundle bundle, bool reset = false) if (setValues == valuesToSet) ret = OcReturn.Success; else if (setValues != 0 && setValues < valuesToSet) ret = OcReturn.PartialSuccess; - if(ret != OcReturn.Fail && !reset) + if (!reset && (ret == OcReturn.Success || ret == OcReturn.PartialSuccess)) { - _IsTesting = true;//todo not just for testing - ComputeDevice.State = DeviceState.Testing; - _OCProfile = bundle.Name; - ComputeDevice.OCProfile = bundle.Name; - _ActiveOCTestProfile = bundle; + if (test) IsTesting = true; + return Task.FromResult(ret); } + if(test) IsTesting = false; return Task.FromResult(ret); } - public Task ResetOcTestForDevice() + + public Task ResetOcForDevice(bool test = false) { var defCC = ComputeDevice.CoreClockRange; var defMC = ComputeDevice.MemoryClockRange; var defTDP = ComputeDevice.TDPLimits; var bundle = new OcBundle() { CoreClock = defCC.def, MemoryClock = defMC.def, TDP = (int)defTDP.def }; - var res = SetOcTestForDevice(bundle, true).Result; - if (res != OcReturn.Fail) - { - res = OcReturn.Success; // todo temporary - IsTesting = false; - ComputeDevice.State = DeviceState.Mining; - _OCProfile = string.Empty; - ComputeDevice.OCProfile = string.Empty; - _ActiveOCTestProfile = null; - } - return Task.FromResult(res); + var res = SetOcForDevice(bundle, test, true); + return Task.FromResult(res.Result); } #endregion #endif diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 09247ab59..53c5b046f 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -14,6 +14,8 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; +using System.Threading.Tasks; +using static NHMCore.Configs.Managers.OCManager; namespace NHMCore.Mining { @@ -655,17 +657,54 @@ public void PrintMemoryTimings() } } #if NHMWS4 - private string _OCProfile = string.Empty; public string OCProfile { - get { return _OCProfile; } - set { _OCProfile = value; } + get { + var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); + if(testTarget != null) + { + return testTarget.OCProfile; + } + return string.Empty; + } + } + public string OCProfileID + { + get + { + var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); + if(testTarget != null ) + { + return testTarget.OCProfileID; + } + return string.Empty; + } } - public void AfterStartMining() + public async Task AfterStartMining() { - if (IsTesting) + var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); + if (testTarget == null) return; + if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change + { + var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCTestProfile, true, false); + if(ret == OcReturn.Success || ret == OcReturn.PartialSuccess) State = DeviceState.Testing; + return; + } + if(testTarget.ActiveOCTestProfile == null && State == DeviceState.Testing) + { + var ret = await testTarget.ResetOcForDevice(true); + State = DeviceState.Mining; + return; + } + if(testTarget.ActiveOCProfile != null) + { + var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCProfile, false, false); + return; + } + if(testTarget.ActiveOCProfile == null) { - State = DeviceState.Testing; + var ret = await testTarget.ResetOcForDevice(false); + return; } } #endif diff --git a/src/NHMCore/Mining/Miner.cs b/src/NHMCore/Mining/Miner.cs index dd9be514e..23ea34c6e 100644 --- a/src/NHMCore/Mining/Miner.cs +++ b/src/NHMCore/Mining/Miner.cs @@ -226,7 +226,7 @@ private async Task StartAsync(CancellationToken stop, string username) var maxTimeout = _plugin.GetApiMaxTimeout(_miningPairs); MinerApiWatchdog.AddGroup(GroupKey, maxTimeout, DateTime.UtcNow); _algos.ForEach(a => a.IsCurrentlyMining = true); - _algos.ForEach(a => a.ComputeDevice.State = DeviceState.Mining); + _algos.ForEach(a => a.ComputeDevice.State = a.IsTesting ? DeviceState.Testing : DeviceState.Mining); return ret; } diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index e0a4bbed1..5db0e069a 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -57,6 +57,7 @@ private abstract record Command private record MainCommand : Command; private record TriggerSwitchCheckCommand : MainCommand; + private record IterateSwitchCommand : MainCommand; private record NormalizedProfitsUpdateCommand(Dictionary NormalizedProfits) : MainCommand; private record UsernameChangedCommand(string Username) : MainCommand; @@ -400,7 +401,7 @@ private static async Task HandleDeferredCommands(List def //} await CheckGroupingAndUpdateMiners(new MainCommand()); } - foreach (var startMining in startMiningCommands) startMining.Device.State = DeviceState.Mining; // THIS TRIGERS STATE CHANGE TODO change this at the point where we initiate the actual change + foreach (var startMining in startMiningCommands) startMining.Device.State = startMining.Device.AlgorithmSettings.Any(a => a.IsTesting) ? DeviceState.Testing : DeviceState.Mining; // THIS TRIGERS STATE CHANGE TODO change this at the point where we initiate the actual change // start devices to benchmark or update existing benchmarks algorithms var devicesToBenchmark = startBenchmarkingCommands.Select(c => c.Device) @@ -667,10 +668,17 @@ or DNSQChangedCommand // START foreach (var miner in _runningMiners.Values) await miner.StartMinerTask(_stopMiningManager, _username); #if NHMWS4 - AvailableDevices.Devices - .Where(d => d.State == DeviceState.Mining)? - .ToList()? - .ForEach(d => d.AfterStartMining()); + var miningDevs = AvailableDevices.Devices + .Where(d => d.State == DeviceState.Mining || d.State == DeviceState.Testing)? + .ToList(); + if (miningDevs.Any()) + { + foreach (var dev in miningDevs) + { + await dev.AfterStartMining(); + } + } + _ = NHWebSocketV4.UpdateMinerStatus(); //todo maybe not needeed #endif } else if (_miningDevices.Count == 0) @@ -929,16 +937,22 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary d.State == DeviceState.Mining)? - .ToList()? - .ForEach(d => d.AfterStartMining()); + var miningDevs = AvailableDevices.Devices + .Where(d => d.State == DeviceState.Mining || d.State == DeviceState.Testing)? + .ToList(); + if(miningDevs.Any()) + { + foreach (var dev in miningDevs) + { + await dev.AfterStartMining(); + } + } + _ = NHWebSocketV4.UpdateMinerStatus(); //todo maybe not needeed #endif // log scope diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index e97c790a3..00f7b736c 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -7,6 +7,7 @@ using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.TDP; using NHMCore.Configs; +using NHMCore.Configs.Managers; using NHMCore.Mining; using NHMCore.Mining.MiningStats; using NHMCore.Utils; @@ -102,7 +103,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get { "Miner" => $"{GetDevicePlugin(d.Uuid)}", "OC profile" => $"{d.OCProfile}", - "OC profile ID" => $"", + "OC profile ID" => $"{d.OCProfileID}", "Fan profile" => $"", //TODO "Fan profile ID" => $"", "ELP profile" => $"", //TODO @@ -325,8 +326,8 @@ private static List GetRigOptionalDynamicValues() { Helpers.GetElapsedSecondsSinceStart().ToString(), Helpers.GetLocalIP().ToString(), - String.Empty, //todo - String.Empty + BundleManager.GetBundleInfo().BundleID, + BundleManager.GetBundleInfo().BundleName, }; return list; } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 2bf2b7254..24258b016 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -571,6 +571,8 @@ public class OcBundle { [JsonProperty("name")] public string Name { get; set; } + [JsonProperty("id")] + public string Id { get; set; } [JsonProperty("device_name")] public string DeviceName { get; set; } [JsonProperty("miner_id", NullValueHandling = NullValueHandling.Ignore)] diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 356576123..7665a4a69 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -15,6 +15,7 @@ using System.Diagnostics; using System.Linq; using System.Reflection; +using System.Reflection.Metadata; using System.Threading; using System.Threading.Tasks; using WebSocketSharp; @@ -735,16 +736,16 @@ async Task systemDump() (err, result) = StopOCTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionFanProfileTest: - object jobjectFan = JsonConvert.DeserializeObject(parameters); - if (jobjectFan is not JObject jsonObjFan) break; - if (jsonObjFan.ToObject() is FanBundle fb) ExecuteFanBundle(fb); + //object jobjectFan = JsonConvert.DeserializeObject(parameters); + //if (jobjectFan is not JObject jsonObjFan) break; + //if (jsonObjFan.ToObject() is FanBundle fb) ExecuteFanBundle(fb); break; case SupportedAction.ActionFanProfileTestStop: break; case SupportedAction.ActionElpProfileTest: - object jobjectELP = JsonConvert.DeserializeObject(parameters); - if (jobjectELP is not JObject jsonObjELP) break; - if (jsonObjELP.ToObject() is ElpBundle eb) ExecuteELPBundle(eb); + //object jobjectELP = JsonConvert.DeserializeObject(parameters); + //if (jobjectELP is not JObject jsonObjELP) break; + //if (jsonObjELP.ToObject() is ElpBundle eb) ExecuteELPBundle(eb); break; case SupportedAction.ActionElpProfileTestStop: break; @@ -763,10 +764,11 @@ internal static Task UpdateMinerStatus() } private static Task ExecuteProfilesBundleSet(Bundle bundle) { + BundleManager.SetBundleInfo(bundle.Name, bundle.Id); //todo check returns!!! if (bundle.OcBundles != null) { - ApplyOCBundle(bundle.OcBundles); + var retOC = OCManager.Instance.ApplyOcBundle(bundle.OcBundles); } if (bundle.FanBundles != null) { @@ -774,12 +776,14 @@ private static Task ExecuteProfilesBundleSet(Bundle bundle) } if (bundle.ElpBundles != null) { - ExecuteELPBundles(bundle.ElpBundles); + //ExecuteELPBundles(bundle.ElpBundles); } return Task.CompletedTask; } private static Task ExecuteProfilesBundleReset() { + BundleManager.ResetBundleInfo(); + var retOC = OCManager.Instance.ResetOcBundle(); return Task.CompletedTask; } private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) @@ -794,24 +798,7 @@ private static Task ExecuteProfilesBundleReset() var res = OCManager.Instance.StopTest(deviceUUID); return Task.FromResult(res.Result); } - private static Task ApplyOCBundle(List bundles) - { - var ret = OCManager.Instance.ApplyOcBundle(bundles); - return ret; - } - private static Task ExecuteELPBundle(ElpBundle elpBundle) - { - return Task.CompletedTask; - } - private static Task ExecuteELPBundles(List bundles) - { - foreach (var bundle in bundles) - { - //todo check returns - ExecuteELPBundle(bundle); - } - return Task.CompletedTask; - } + private static Task ExecuteFanBundle(FanBundle fanBundle) { object t = fanBundle.Type switch From 98e44f696f19578c2ddbe438ca281d8f8e354a7d Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 30 Nov 2022 12:59:55 +0100 Subject: [PATCH 023/224] added saving and writing bundle --- .../ApplicationStateManager.Init.cs | 2 + src/NHMCore/Configs/Managers/BundleManager.cs | 39 ++++++++++++++++++- src/NHMCore/Configs/Managers/FanManager.cs | 5 ++- src/NHMCore/Configs/Managers/OCManager.cs | 3 +- src/NHMCore/Mining/AlgorithmContainer.cs | 8 ++-- src/NHMCore/Nhmws/V4/MessagesV4.cs | 6 +-- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 1 + 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs index b2d0b587f..a4838c58d 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs @@ -5,6 +5,7 @@ using NHM.DeviceMonitoring; using NHMCore.ApplicationState; using NHMCore.Configs; +using NHMCore.Configs.Managers; using NHMCore.Mining; using NHMCore.Mining.Plugins; using NHMCore.Nhmws; @@ -257,6 +258,7 @@ string getDeviceNameCount(DeviceType deviceType, int index) => } SchedulesManager.Instance.Init(); + BundleManager.Init(); } catch (Exception e) { diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index a74a1fdee..dc886cf71 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -1,5 +1,9 @@ -using System; +using Newtonsoft.Json; +using NHM.Common; +using NHMCore.Nhmws.V4; +using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -8,8 +12,8 @@ namespace NHMCore.Configs.Managers { public static class BundleManager { + private static readonly string _TAG = "BundleManager"; private static string BundleName = string.Empty; - private static string BundleID = string.Empty; public static void SetBundleInfo(string name, string id) { @@ -24,5 +28,36 @@ public static void ResetBundleInfo() BundleName = string.Empty; BundleID = string.Empty; } + public static void Init() + { + var path = Paths.AppRootPath("bundle.json"); + if (!File.Exists(path)) File.Create(path); + var content = File.ReadAllText(path); + try + { + var bundleToApply = JsonConvert.DeserializeObject(content); + if(bundleToApply != null) + { + ApplyBundleOnInit(bundleToApply); + } + } + catch(Exception e) + { + Logger.Error(_TAG, e.Message); + File.WriteAllText(path, string.Empty); + } + } + private static void ApplyBundleOnInit(Bundle bundle) + { + OCManager.Instance.ApplyOcBundle(bundle.OcBundles); + //fanmanager + //elpmanager + } + public static async Task SaveBundle(Bundle bundle) + { + var path = Paths.AppRootPath("bundle.json"); + var text = JsonConvert.SerializeObject(bundle); + await File.AppendAllTextAsync(path, text); + } } } diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index ccb01928d..8b6cad012 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -6,7 +6,10 @@ namespace NHMCore.Configs.Managers { - internal class FanManager + public class FanManager { + private FanManager() { } + public static FanManager Instance { get; } = new FanManager(); + private readonly string _TAG = "FanManager"; } } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 68643d99c..d0d527c25 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -13,6 +13,7 @@ using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; +using System.Windows; namespace NHMCore.Configs.Managers { @@ -28,7 +29,6 @@ public enum OcReturn PartialSuccess, Fail } - public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) { if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); @@ -79,7 +79,6 @@ public enum OcReturn public Task<(ErrorCode err, string msg)> ApplyOcBundle(List bundles) { List processed = new(); - //if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var sorted = new List<(int, OcBundle)>(); foreach (var bundle in bundles) { diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 312eb30b3..0397f99dd 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -610,17 +610,17 @@ public Task SetOcForDevice(OcBundle bundle, bool test = false, bool re if (!setCC) { - Logger.Warn(_TAG, $"Setting core clock for device {ComputeDevice.Name} success: {setCC}"); + Logger.Warn(_TAG, $"Setting core clock success: {setCC}"); setValues--; } if (!setMC) { - Logger.Warn(_TAG, $"Setting memory clock for device {ComputeDevice.Name} success: {setMC}"); + Logger.Warn(_TAG, $"Setting memory clock success: {setMC}"); setValues--; } if (!setTDP) { - Logger.Warn(_TAG, $"Setting TDP for device {ComputeDevice.Name} success: {setTDP}"); + Logger.Warn(_TAG, $"Setting TDP success: {setTDP}"); setValues--; } @@ -630,9 +630,11 @@ public Task SetOcForDevice(OcBundle bundle, bool test = false, bool re if (!reset && (ret == OcReturn.Success || ret == OcReturn.PartialSuccess)) { if (test) IsTesting = true; + Logger.Warn(_TAG, $"Setting OC is successful"); return Task.FromResult(ret); } if(test) IsTesting = false; + Logger.Warn(_TAG, $"Setting OC is unsuccessful"); return Task.FromResult(ret); } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 24258b016..7a04777e4 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -541,7 +541,7 @@ internal class Algo public bool? Enabled { get; set; } } - internal class Bundle + public class Bundle { [JsonProperty("id")] public string Id { get; set; } @@ -554,7 +554,7 @@ internal class Bundle [JsonProperty("elp", NullValueHandling = NullValueHandling.Ignore)] public List? ElpBundles { get; set; } } - internal class ElpBundle + public class ElpBundle { [JsonProperty("name")] public string Name { get; set; } @@ -586,7 +586,7 @@ public class OcBundle [JsonProperty("power_mode")] public int TDP { get; set; } } - internal class FanBundle + public class FanBundle { [JsonProperty("name")] public string Name { get; set; } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 7665a4a69..25c4cb54e 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -765,6 +765,7 @@ internal static Task UpdateMinerStatus() private static Task ExecuteProfilesBundleSet(Bundle bundle) { BundleManager.SetBundleInfo(bundle.Name, bundle.Id); + _ = BundleManager.SaveBundle(bundle); //todo check returns!!! if (bundle.OcBundles != null) { From 1edea9329958e3e075e93e92b27e8def3c6103f4 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 5 Dec 2022 12:36:56 +0100 Subject: [PATCH 024/224] in progress enable-disable --- src/NHMCore/Configs/Managers/BundleManager.cs | 1 + src/NHMCore/Configs/Managers/OCManager.cs | 20 +++---- src/NHMCore/Mining/AlgorithmContainer.cs | 9 +++- src/NHMCore/Mining/ComputeDevice.cs | 1 + src/NHMCore/Nhmws/ActionMap.cs | 3 +- src/NHMCore/Nhmws/Messages.cs | 12 +++-- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 27 ++++++---- src/NHMCore/Nhmws/V4/MessagesV4.cs | 44 ++++++++------- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 53 ++++++++++++++++--- .../ViewModels/Models/DeviceData.cs | 5 +- 10 files changed, 125 insertions(+), 50 deletions(-) diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index dc886cf71..800cb1710 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -38,6 +38,7 @@ public static void Init() var bundleToApply = JsonConvert.DeserializeObject(content); if(bundleToApply != null) { + SetBundleInfo(bundleToApply.Name, bundleToApply.Id); ApplyBundleOnInit(bundleToApply); } } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index d0d527c25..83c8375a5 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -40,10 +40,10 @@ public enum OcReturn List specificContainers = allContainers.ToList(); if (bundle.AlgoId != null && bundle.MinerId != null) specificContainers = allContainers.Where(d => - bundle.AlgoId.Contains(d.AlgorithmName) && - bundle.MinerId.Contains(d.PluginName))?.ToList(); - else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); - else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); + bundle.AlgoId.Contains(d.AlgorithmName.ToLower()) && + bundle.MinerId.Contains(d.PluginName.ToLower()))?.ToList(); + else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName.ToLower()))?.ToList(); + else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName.ToLower()))?.ToList(); if (specificContainers == null || !specificContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); var target = specificContainers.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); if(target == null) @@ -94,18 +94,18 @@ public enum OcReturn if (type == 0) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? - .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? - .Where(c => bundle.MinerId.Contains(c.PluginName))? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? + .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? .ToList(); - else if (type == 1) current = AvailableDevices.Devices + else if (type == 1) AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? - .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? .ToList(); - else if (type == 2) current = AvailableDevices.Devices + else if (type == 2) AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? - .Where(c => bundle.MinerId.Contains(c.PluginName))? + .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? .ToList(); else current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 04dd2db48..ceecf0078 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Reflection.Metadata; using System.Threading.Tasks; +using Windows.Media.Protection.PlayReady; using static NHMCore.Configs.Managers.OCManager; namespace NHMCore.Mining @@ -240,9 +241,15 @@ public virtual bool Enabled if (Algorithm != null) Algorithm.Enabled = value; OnPropertyChanged(); OnPropertyChanged(nameof(Status)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } } - + public void SetEnabled(bool enabled) //for enable without WS (bulk setting) + { + if (Algorithm != null) Algorithm.Enabled = enabled; + OnPropertyChanged(); + OnPropertyChanged(nameof(Status)); + } /// /// Indicates whether this algorithm requires a benchmark /// diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 53c5b046f..08a9cc31f 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -682,6 +682,7 @@ public string OCProfileID } public async Task AfterStartMining() { + //TODO IF DELTA, IF ALREADY SET, IF NOT SET DONT RESTART ETC var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (testTarget == null) return; if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change diff --git a/src/NHMCore/Nhmws/ActionMap.cs b/src/NHMCore/Nhmws/ActionMap.cs index fb4c1327e..82cda9169 100644 --- a/src/NHMCore/Nhmws/ActionMap.cs +++ b/src/NHMCore/Nhmws/ActionMap.cs @@ -7,8 +7,9 @@ namespace NHMCore.Nhmws { - public static class ActionMap + public static class ActionMutableMap { public static List ActionList = new(); + public static List MutableList = new(); } } diff --git a/src/NHMCore/Nhmws/Messages.cs b/src/NHMCore/Nhmws/Messages.cs index 482b18287..2f871aa75 100644 --- a/src/NHMCore/Nhmws/Messages.cs +++ b/src/NHMCore/Nhmws/Messages.cs @@ -206,10 +206,16 @@ internal class MinerSetMutable : IReceiveRpcMessage //todo in progress [JsonProperty("id")] public int Id { get; set; } [JsonProperty("properties")] - List Properties { get; set; } + public IEnumerable Properties { get; set; } [JsonProperty("devices")] - List Devices { get; set; } - + public List Devices { get; set; } + } + internal class SetMutableDevice + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("properties")] + public IEnumerable Properties { get; set; } } // RPC response diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 00f7b736c..6d076b008 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -85,7 +85,7 @@ private static string GetDevicePlugin(string UUID) return devData.MinerName; } - private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin = false) + private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isStateChange = false, bool isLogin = false) { string getValue(T o) => (typeof(T).Name, o) switch { @@ -141,7 +141,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get .Select(p => p.Value) .ToList(); - if (isLogin) + if (isStateChange) { bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string unit, string value) dynamicVal) { @@ -151,7 +151,8 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u return false; }; deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); - deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); + //deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); + if (isLogin) deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); } foreach (DeviceDynamicProperties i in Enum.GetValues(typeof(DeviceDynamicProperties))) { @@ -164,7 +165,7 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u // we cache device properties so we persevere property IDs private static readonly Dictionary> _cachedDevicesOptionalMutable = new Dictionary>(); - private static (List properties, JArray values) GetDeviceOptionalMutable(ComputeDevice d, bool isLogin) + private static (List properties, JArray values) GetDeviceOptionalMutable(ComputeDevice d, bool isStateChange, bool isLogin) { OptionalMutableProperty valueOrNull(OptionalMutableProperty v) => d.DeviceMonitor is T ? v : null; List getOptionalMutableProperties(ComputeDevice d) @@ -181,12 +182,13 @@ List getOptionalMutableProperties(ComputeDevice d) //ExecuteTask = async (object p) => //{ // //todo + // return null; //}, GetValue = () => { string ret = null; - if (isLogin) + if (isStateChange) { ret = string.Empty; ret += GetMinersForDeviceDynamic(d); @@ -194,6 +196,7 @@ List getOptionalMutableProperties(ComputeDevice d) return ret; } }); + if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); return optionalProperties .Where(p => p != null) .ToList(); @@ -217,6 +220,8 @@ List getOptionalMutablePropertiesCached(ComputeDevice d return (props, values_omv); } + + private static LoginMessage _loginMessage = null; public static List> DeviceOptionalDynamicToList(List<(string name, string? unit)> properties) { @@ -248,8 +253,8 @@ Device mapComputeDevice(ComputeDevice d) { "optional", GetStaticPropertiesOptionalValues(d) }, }, Actions = CreateDefaultDeviceActions(d.B64Uuid), - OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true).properties), - OptionalMutableProperties = GetDeviceOptionalMutable(d, true).properties, + OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true, true).properties), + OptionalMutableProperties = GetDeviceOptionalMutable(d, true, true).properties, }; } @@ -341,7 +346,7 @@ private static List GetRigOptionalMutableValues() return list; } - internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices, bool isLogin = false) + internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices, bool isStateChange = false) { var rig = ApplicationStateManager.CalcRigStatus(); @@ -389,9 +394,9 @@ JArray mmv(ComputeDevice d) return new MinerState.DeviceState { MandatoryDynamicValues = mdv(d), - OptionalDynamicValues = GetDeviceOptionalDynamic(d, isLogin).values, // odv + OptionalDynamicValues = GetDeviceOptionalDynamic(d, isStateChange).values, // odv MandatoryMutableValues = mmv(d), - OptionalMutableValues = GetDeviceOptionalMutable(d, isLogin).values, // omv + OptionalMutableValues = GetDeviceOptionalMutable(d, isStateChange, false).values, // omv }; } @@ -404,6 +409,8 @@ JArray mmv(ComputeDevice d) Devices = devices.Select(toDeviceState).ToList(), }; } + + private static List CreateDefaultDeviceActions(string uuid) { return new List diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 7a04777e4..7593c6e4b 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -77,7 +77,7 @@ internal interface IMutableOptionalProperty { } internal interface IAction { } - internal abstract class OptionalMutableProperty + public abstract class OptionalMutableProperty { private static int _nextPropertyId = 100; internal static int NextPropertyId() => _nextPropertyId++; @@ -181,7 +181,7 @@ public static NhmwsAction ActionDeviceEnable(string uuid) ActionType = SupportedAction.ActionDeviceEnable, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionDeviceDisable(string uuid) @@ -194,7 +194,7 @@ public static NhmwsAction ActionDeviceDisable(string uuid) ActionType = SupportedAction.ActionDeviceDisable, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionOcProfileTest(string uuid) @@ -216,7 +216,7 @@ public static NhmwsAction ActionOcProfileTest(string uuid) ActionType = SupportedAction.ActionOcProfileTest, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionOcProfileTestStop(string uuid) @@ -230,7 +230,7 @@ public static NhmwsAction ActionOcProfileTestStop(string uuid) ActionType = SupportedAction.ActionOcProfileTestStop, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionFanProfileTest(string uuid) @@ -260,7 +260,7 @@ public static NhmwsAction ActionFanProfileTest(string uuid) ActionType = SupportedAction.ActionFanProfileTest, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionFanProfileTestStop(string uuid) @@ -274,7 +274,7 @@ public static NhmwsAction ActionFanProfileTestStop(string uuid) ActionType = SupportedAction.ActionFanProfileTestStop, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionElpProfileTest(string uuid) @@ -296,7 +296,7 @@ public static NhmwsAction ActionElpProfileTest(string uuid) ActionType= SupportedAction.ActionElpProfileTest, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionElpProfileTestStop(string uuid) @@ -310,7 +310,7 @@ public static NhmwsAction ActionElpProfileTestStop(string uuid) ActionType= SupportedAction.ActionElpProfileTestStop, DeviceUUID = uuid }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionStartMining() @@ -322,7 +322,7 @@ public static NhmwsAction ActionStartMining() DisplayGroup = 1, ActionType = SupportedAction.ActionStartMining, }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionStopMining() @@ -334,7 +334,7 @@ public static NhmwsAction ActionStopMining() DisplayGroup = 1, ActionType = SupportedAction.ActionStopMining, }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionProfilesBundleSet() @@ -355,7 +355,7 @@ public static NhmwsAction ActionProfilesBundleSet() }, ActionType = SupportedAction.ActionProfilesBundleSet, }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } public static NhmwsAction ActionProfilesBundleReset() @@ -367,7 +367,7 @@ public static NhmwsAction ActionProfilesBundleReset() DisplayGroup = 1, ActionType= SupportedAction.ActionProfilesBundleReset, }; - ActionMap.ActionList.Add(action); + ActionMutableMap.ActionList.Add(action); return action; } } @@ -486,28 +486,36 @@ internal abstract class ActionParameter [JsonProperty("type")] public int Type { get; set; } } - internal class Property + internal interface IProperty { [JsonProperty("prop_id")] public int PropId { get; set; } } - internal class PropertyInt : Property + internal class PropertyInt : IProperty { + [JsonProperty("prop_id")] + public int PropId { get; set; } [JsonProperty("value")] public int Value { get; set; } } - internal class PropertyBool : Property + internal class PropertyBool : IProperty { + [JsonProperty("prop_id")] + public int PropId { get; set; } [JsonProperty("value")] public bool Value { get; set; } } - internal class PropertyEnum : Property + internal class PropertyEnum : IProperty { + [JsonProperty("prop_id")] + public int PropId { get; set; } [JsonProperty("value")] public Type Value { get; set; } } - internal class PropertyString : Property + internal class PropertyString : IProperty { + [JsonProperty("prop_id")] + public int PropId { get; set; } [JsonProperty("value")] public string Value { get; set; } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 25c4cb54e..e0887606a 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -26,7 +26,7 @@ namespace NHMCore.Nhmws.V4 { - static class NHWebSocketV4 + public static class NHWebSocketV4 { #region locking private static readonly string _logTag = "NHWebSocketV4"; @@ -328,7 +328,7 @@ static public void SetCredentials(string btc = null, string worker = null, strin #region Message handling - private static string CreateMinerStatusMessage() => JsonConvert.SerializeObject(MessageParserV4.GetMinerState(_login.Worker, AvailableDevices.Devices.SortedDevices())); + private static string CreateMinerStatusMessage(bool stateChange = false) => JsonConvert.SerializeObject(MessageParserV4.GetMinerState(_login.Worker, AvailableDevices.Devices.SortedDevices(), stateChange)); static private async Task HandleMessage(MessageEventArgs e) { @@ -684,7 +684,7 @@ async Task systemDump() } private static Task<(ErrorCode err, string msg)> CallAction(MinerCallAction action) { - var actionRecord = ActionMap.ActionList.Where(a => a.ActionID == action.ActionId).FirstOrDefault(); + var actionRecord = ActionMutableMap.ActionList.Where(a => a.ActionID == action.ActionId).FirstOrDefault(); if (actionRecord == null) { NHM.Common.Logger.Error("NHWebSocketV4", "Action not found"); @@ -693,7 +693,7 @@ async Task systemDump() //action has single parameter anyway FOR NOW //in the future return multiple actions success/partial/failiure var ret = (ErrorCode.NoError, string.Empty); - foreach (var param in action.Parameters) + foreach (var param in action.Parameters) { ret = ParseAndCallAction(actionRecord.DeviceUUID, action.Id, actionRecord.ActionType, param).Result; } @@ -756,9 +756,9 @@ async Task systemDump() _ = UpdateMinerStatus(); return Task.FromResult((err, result)); } - internal static Task UpdateMinerStatus() + public static Task UpdateMinerStatus(bool stateChange = false) { - var minerStatusJsonStr = CreateMinerStatusMessage(); + var minerStatusJsonStr = CreateMinerStatusMessage(stateChange); _sendQueue.EnqueueParams((MessageType.SEND_MESSAGE_STATUS, minerStatusJsonStr)); return Task.CompletedTask; } @@ -835,8 +835,49 @@ private static Task ExecuteFanBundleTargetGPUVRAMTemp(FanBundle fanBundle) private static Task SetMutable(MinerSetMutable mutableCmd) { + //todo set mutable here + if (mutableCmd.Properties != null) + { + + } + if (mutableCmd.Devices == null) return Task.FromResult(""); + foreach (var device in mutableCmd.Devices) + { + if (device.Properties == null) continue; + foreach (var property in device.Properties) + { + if(property is not JToken token) continue; + var a = token.Cast(); + object t = property switch + { + PropertyString m => ParseAndActMutableString(m), + PropertyInt m => ParseAndActMutableInt(m), + PropertyEnum m => ParseAndActMutableEnum(m), + PropertyBool m => ParseAndActMutableBool(m), + _ => throw new InvalidOperationException() + }; + } + } return Task.FromResult(""); } + + static Task ParseAndActMutableString(PropertyString m) + { + return Task.CompletedTask; + } + static Task ParseAndActMutableInt(PropertyInt m) + { + return Task.CompletedTask; + } + static Task ParseAndActMutableEnum(PropertyEnum m) + { + return Task.CompletedTask; + } + static Task ParseAndActMutableBool(PropertyBool m) + { + return Task.CompletedTask; + } + #endregion RpcMessages static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) { diff --git a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs index e038de516..21f1e02b4 100644 --- a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs +++ b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs @@ -6,6 +6,7 @@ using NHMCore.Configs; using NHMCore.Mining; using NHMCore.Mining.MiningStats; +using NHMCore.Nhmws.V4; using NHMCore.Utils; using System; using System.Collections.Generic; @@ -76,9 +77,11 @@ public bool AllAgorithmsEnabled { foreach (var algo in Dev.AlgorithmSettings) { - algo.Enabled = value; + //algo.Enabled = value; + algo.SetEnabled(value); } OnPropertyChanged(); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } } From 8959402f4b94eb7eb6014b11d2018c8c8b79b814 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 6 Dec 2022 14:47:13 +0100 Subject: [PATCH 025/224] set algos and plugins per device working --- src/NHMCore/Mining/AlgorithmContainer.cs | 1 + src/NHMCore/Mining/ComputeDevice.cs | 19 ++++++++ src/NHMCore/Nhmws/ActionMap.cs | 15 ------- src/NHMCore/Nhmws/ActionMutableMap.cs | 28 ++++++++++++ src/NHMCore/Nhmws/Messages.cs | 4 +- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 15 ++++--- src/NHMCore/Nhmws/V4/MessagesV4.cs | 24 ++++------ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 56 +++++++++++++++--------- 8 files changed, 101 insertions(+), 61 deletions(-) delete mode 100644 src/NHMCore/Nhmws/ActionMap.cs create mode 100644 src/NHMCore/Nhmws/ActionMutableMap.cs diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index ceecf0078..8a3ae14b6 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -248,6 +248,7 @@ public void SetEnabled(bool enabled) //for enable without WS (bulk setting) { if (Algorithm != null) Algorithm.Enabled = enabled; OnPropertyChanged(); + OnPropertyChanged(nameof(Enabled)); OnPropertyChanged(nameof(Status)); } /// diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 08a9cc31f..93c206f9a 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -10,6 +10,7 @@ using NHMCore.Configs; using NHMCore.Configs.Data; using NHMCore.Nhmws; +using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; using System.ComponentModel; @@ -157,6 +158,24 @@ protected set } } } + public void ApplyNewAlgoStates(MinerAlgoState state) + { + foreach(var miner in state.Miners) + { + foreach(var algo in miner.Algos) + { + var targets = AlgorithmSettings.Where(a => a.AlgorithmName == algo.Id && a.PluginName == miner.Id)?.ToList(); + if (targets == null) continue; + if (!miner.Enabled) + { + targets.ForEach(t => t.SetEnabled((bool)false)); + continue; + } + targets.ForEach(t => t.SetEnabled((bool)algo.Enabled)); + } + } + Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(false)); + } private List PluginAlgorithmSettings { get; set; } = new List(); diff --git a/src/NHMCore/Nhmws/ActionMap.cs b/src/NHMCore/Nhmws/ActionMap.cs deleted file mode 100644 index 82cda9169..000000000 --- a/src/NHMCore/Nhmws/ActionMap.cs +++ /dev/null @@ -1,15 +0,0 @@ -using NHMCore.Nhmws.V4; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace NHMCore.Nhmws -{ - public static class ActionMutableMap - { - public static List ActionList = new(); - public static List MutableList = new(); - } -} diff --git a/src/NHMCore/Nhmws/ActionMutableMap.cs b/src/NHMCore/Nhmws/ActionMutableMap.cs new file mode 100644 index 000000000..d44e9631e --- /dev/null +++ b/src/NHMCore/Nhmws/ActionMutableMap.cs @@ -0,0 +1,28 @@ +using NHMCore.Nhmws.V4; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Nhmws +{ + public static class ActionMutableMap + { + public static List ActionList = new(); + public static List MutableList = new(); + + public static NhmwsAction FindActionOrNull(int actionID) + { + var actionRecord = ActionList.Where(a => a.ActionID == actionID).FirstOrDefault(); + if (actionRecord != null) return actionRecord; + return null; + } + public static OptionalMutableProperty FindMutableOrNull(int propID) + { + var mutableRecord = MutableList.Where(a => a.PropertyID == propID).FirstOrDefault(); + if (mutableRecord != null) return mutableRecord; + return null; + } + } +} diff --git a/src/NHMCore/Nhmws/Messages.cs b/src/NHMCore/Nhmws/Messages.cs index 2f871aa75..cf487db1a 100644 --- a/src/NHMCore/Nhmws/Messages.cs +++ b/src/NHMCore/Nhmws/Messages.cs @@ -206,7 +206,7 @@ internal class MinerSetMutable : IReceiveRpcMessage //todo in progress [JsonProperty("id")] public int Id { get; set; } [JsonProperty("properties")] - public IEnumerable Properties { get; set; } + public List Properties { get; set; } [JsonProperty("devices")] public List Devices { get; set; } } @@ -215,7 +215,7 @@ internal class SetMutableDevice [JsonProperty("id")] public string Id { get; set; } [JsonProperty("properties")] - public IEnumerable Properties { get; set; } + public List Properties { get; set; } } // RPC response diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 6d076b008..114f67931 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -179,12 +179,13 @@ List getOptionalMutableProperties(ComputeDevice d) DisplayName = "Miners settings", DefaultValue = "", Range = (2048, ""), - //ExecuteTask = async (object p) => - //{ - // //todo - - // return null; - //}, + ExecuteTask = async (object p) => + { + if (p is not string prop) return null; + var newState = JsonConvert.DeserializeObject(prop); + d.ApplyNewAlgoStates(newState); + return null; + }, GetValue = () => { string ret = null; @@ -461,7 +462,7 @@ private static string FormatForOptionalValues(string name, string content) private static string GetMinersForDeviceDynamic(ComputeDevice d)//todo if include enabled return array of strings else return array of structs { - var minersObject = new MinerLogin(); + var minersObject = new MinerAlgoState(); var containers = d.AlgorithmSettings; if (containers == null) return String.Empty; var grouped = containers.GroupBy(c => c.PluginName).ToList(); diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 7593c6e4b..3f3ed4483 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -486,46 +486,38 @@ internal abstract class ActionParameter [JsonProperty("type")] public int Type { get; set; } } - internal interface IProperty + internal class Property { [JsonProperty("prop_id")] public int PropId { get; set; } } - internal class PropertyInt : IProperty + internal class PropertyInt : Property { - [JsonProperty("prop_id")] - public int PropId { get; set; } [JsonProperty("value")] public int Value { get; set; } } - internal class PropertyBool : IProperty + internal class PropertyBool : Property { - [JsonProperty("prop_id")] - public int PropId { get; set; } [JsonProperty("value")] public bool Value { get; set; } } - internal class PropertyEnum : IProperty + internal class PropertyEnum : Property { - [JsonProperty("prop_id")] - public int PropId { get; set; } [JsonProperty("value")] public Type Value { get; set; } } - internal class PropertyString : IProperty + internal class PropertyString : Property { - [JsonProperty("prop_id")] - public int PropId { get; set; } [JsonProperty("value")] public string Value { get; set; } } - internal class MinerLogin + public class MinerAlgoState { [JsonProperty("miners")] public List Miners { get; set; } = new List(); } - internal class MinerDynamic + public class MinerDynamic { [JsonProperty("id")] public string Id { get; set; } @@ -541,7 +533,7 @@ internal class MinerStatic [JsonProperty("algorithms")] public List AlgoList { get; set; } = new List(); } - internal class Algo + public class Algo { [JsonProperty("id")] public string Id { get; set; } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index e0887606a..fdb7253ae 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -684,7 +684,7 @@ async Task systemDump() } private static Task<(ErrorCode err, string msg)> CallAction(MinerCallAction action) { - var actionRecord = ActionMutableMap.ActionList.Where(a => a.ActionID == action.ActionId).FirstOrDefault(); + var actionRecord = ActionMutableMap.FindActionOrNull(action.ActionId); if (actionRecord == null) { NHM.Common.Logger.Error("NHWebSocketV4", "Action not found"); @@ -835,46 +835,60 @@ private static Task ExecuteFanBundleTargetGPUVRAMTemp(FanBundle fanBundle) private static Task SetMutable(MinerSetMutable mutableCmd) { - //todo set mutable here if (mutableCmd.Properties != null) { - + foreach(var property in mutableCmd.Properties) + { + HandleProperty(property); + } } - if (mutableCmd.Devices == null) return Task.FromResult(""); + if (mutableCmd.Devices == null) return Task.FromResult("Success"); foreach (var device in mutableCmd.Devices) { if (device.Properties == null) continue; foreach (var property in device.Properties) { - if(property is not JToken token) continue; - var a = token.Cast(); - object t = property switch - { - PropertyString m => ParseAndActMutableString(m), - PropertyInt m => ParseAndActMutableInt(m), - PropertyEnum m => ParseAndActMutableEnum(m), - PropertyBool m => ParseAndActMutableBool(m), - _ => throw new InvalidOperationException() - }; + HandleProperty(property); } } - return Task.FromResult(""); + return Task.FromResult("Success"); } - - static Task ParseAndActMutableString(PropertyString m) + private static Task HandleProperty(object property) + { + if (property is not JToken token) return Task.CompletedTask; + var genericProperty = token.ToObject(); + var mutable = ActionMutableMap.FindMutableOrNull(genericProperty.PropId); + if (mutable == null) return Task.CompletedTask; + object t = mutable.PropertyType switch + { + Type.String => ParseAndActMutableString(mutable, token), + Type.Int => ParseAndActMutableInt(mutable, token), + Type.Enum => ParseAndActMutableEnum(mutable, token), + Type.Bool => ParseAndActMutableBool(mutable, token), + _ => throw new InvalidOperationException() + }; + return Task.CompletedTask; + } + static Task ParseAndActMutableString(OptionalMutableProperty property, JToken command) { + var mutable = command.ToObject(); + //var newState = JsonConvert.DeserializeObject(mutable.Value); + property.ExecuteTask(mutable.Value); return Task.CompletedTask; } - static Task ParseAndActMutableInt(PropertyInt m) + static Task ParseAndActMutableInt(OptionalMutableProperty property, JToken command) { + var mutable = command.ToObject(); return Task.CompletedTask; } - static Task ParseAndActMutableEnum(PropertyEnum m) + static Task ParseAndActMutableEnum(OptionalMutableProperty property, JToken command) { + var mutable = command.ToObject(); return Task.CompletedTask; } - static Task ParseAndActMutableBool(PropertyBool m) + static Task ParseAndActMutableBool(OptionalMutableProperty property, JToken command) { + var mutable = command.ToObject(); return Task.CompletedTask; } @@ -902,7 +916,7 @@ static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) MiningStop m => await StopMining(m.Device), MiningSetPowerMode m => await SetPowerMode(m.Device, (TDPSimpleType)m.PowerMode), MinerReset m => await MinerReset(m.Level), // rpcAnswer - MinerCallAction m => await CallAction(m), // call decision from here!!! // + MinerCallAction m => await CallAction(m), MinerSetMutable m => await SetMutable(m), _ => throw new RpcException($"RpcMessage operation not supported for method '{rpcMsg.Method}'", ErrorCode.UnableToHandleRpc), }; From 0a0412e7b1dc7e07b0706b6c47abcea155117f63 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 7 Dec 2022 14:35:24 +0100 Subject: [PATCH 026/224] todo restart mining for elp --- src/NHMCore/Configs/Managers/ELPManager.cs | 64 +++++++++++++++-- src/NHMCore/Mining/AlgorithmContainer.cs | 81 ++++++++++++++++++++-- src/NHMCore/Mining/ComputeDevice.cs | 6 ++ src/NHMCore/Mining/MiningManager.cs | 2 +- src/NHMCore/Nhmws/ErrorCode.cs | 1 + src/NHMCore/Nhmws/V4/MessagesV4.cs | 34 +++------ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 10 ++- 7 files changed, 161 insertions(+), 37 deletions(-) diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 7816cc843..18321c919 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -1,13 +1,17 @@ using NHM.Common; using NHM.Common.Enums; using NHM.MinerPluginToolkitV1.CommandLine; +using NHMCore.ApplicationState; using NHMCore.Configs; using NHMCore.Configs.ELPDataModels; using NHMCore.Mining; +using NHMCore.Nhmws; +using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; +using System.Threading.Tasks; using static NHM.MinerPluginToolkitV1.CommandLine.MinerConfigManager; namespace NHMCore.Configs.Managers @@ -61,9 +65,9 @@ public MinerConfig CreateDefaultConfig(PluginConfiguration pconf) } foreach (var algoPairs in algorithmDevicePairs) { - var devicesDict = new Dictionary(); - algoPairs.Value.ForEach(dev => devicesDict.TryAdd(dev.uuid, new Device() { DeviceName = dev.name, Commands = new List>() })); - defCfg.Algorithms.Add(new Algo() { AlgorithmName = algoPairs.Key, Devices = devicesDict }); + var devicesDict = new Dictionary(); + algoPairs.Value.ForEach(dev => devicesDict.TryAdd(dev.uuid, new MinerConfigManager.Device() { DeviceName = dev.name, Commands = new List>() })); + defCfg.Algorithms.Add(new MinerConfigManager.Algo() { AlgorithmName = algoPairs.Key, Devices = devicesDict }); } return defCfg; } @@ -141,6 +145,22 @@ public string FindAppropriateCommandForAlgoContainer(AlgorithmContainer ac) .Select(x => x.command)? .FirstOrDefault() ?? string.Empty; } + public void SetAlgoCMDString(AlgorithmContainer ac, string newCMD) + { + if (ac == null) return; + var target = _minerELPs + .Where(miner => miner.UUID == ac.MinerUUID)? + .FirstOrDefault()? + .Algos.Where(algo => algo.Name == ac.AlgorithmName)? + .FirstOrDefault(); + if(target == null) return; + + + var index = target.AllCMDStrings.ToList().FindIndex(i => i.uuid == ac.ComputeDevice.Uuid); + if (index == -1) return; + target.AllCMDStrings.RemoveAt(index); + target.AllCMDStrings.Add((ac.ComputeDevice.Uuid, newCMD)); + } public MinerELPData ConstructMinerELPDataFromConfig(MinerConfig cfg) { var minerELP = new MinerELPData(); @@ -201,7 +221,7 @@ private MinerConfig ConstructConfigFromMinerELPData(MinerELPData miner) miner.DoubleParams.ForEach(dbl => minerConfig.MinerCommands.Add(new List() { dbl.name, dbl.value })); foreach (var algo in miner.Algos) { - var tempAlgo = new Algo(); + var tempAlgo = new MinerConfigManager.Algo(); tempAlgo.AlgorithmName = algo.Name; if (algo.SingleParams == null) algo.SingleParams = new(); algo.SingleParams.ForEach(single => tempAlgo.AlgoCommands.Add(new List() { single })); @@ -220,7 +240,7 @@ private MinerConfig ConstructConfigFromMinerELPData(MinerELPData miner) if (flagAndDelim.Length != 2) continue; deviceParams.Add(new List { flagAndDelim[0], dev.ELPs[i].ELP, flagAndDelim[1] }); } - tempAlgo.Devices.Add(dev.UUID, new Device() { DeviceName = dev.DeviceName, Commands = deviceParams }); + tempAlgo.Devices.Add(dev.UUID, new MinerConfigManager.Device() { DeviceName = dev.DeviceName, Commands = deviceParams }); } minerConfig.Algorithms.Add(tempAlgo); } @@ -295,5 +315,39 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) algo.AllCMDStrings = new ObservableCollection<(string uuid, string command)>(parsedCommandsPerGroup); } } +#if NHMWS4 + public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, ElpBundle bundle) + { + if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); + var allContainers = AvailableDevices.Devices + .Where(d => d.B64Uuid == uuid)? + .Where(d => d.State == DeviceState.Mining || d.State == DeviceState.Testing)? + .SelectMany(d => d.AlgorithmSettings); + if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); + + List specificContainers = allContainers.ToList(); + if (bundle.AlgoId != null && bundle.MinerId != null) specificContainers = allContainers.Where(d => + bundle.AlgoId.Contains(d.AlgorithmName.ToLower()) && + bundle.MinerId.Contains(d.PluginName.ToLower()))?.ToList(); + else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName.ToLower()))?.ToList(); + else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName.ToLower()))?.ToList(); + if (specificContainers == null || !specificContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); + var target = specificContainers.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); + if (target == null) + { + target = specificContainers.FirstOrDefault(); + if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); + } + AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future + .Where(d => d.B64Uuid == uuid)? + .SelectMany(d => d.AlgorithmSettings)? + .ToList()? + .ForEach(c => c.IsTesting = false); + + target.SetTargetElpTestProfile(bundle); + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } +#endif } } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 8a3ae14b6..3421ee8df 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -560,9 +560,20 @@ void SettingsChanged(object sender, EventArgs e) #endregion -#if NHMWS4 - #region OC + internal bool IgnoreLocalELPInput //if ignore local ELPs for rig manager ones + { + get + { +#if NHMWS4 + if (ActiveELPProfile != null || ActiveELPTestProfile != null) return true; + return false; +#else + return false; +#endif + } + } +#if NHMWS4 private bool _IsTesting = false; public bool IsTesting { @@ -575,6 +586,7 @@ public bool IsTesting _IsTesting = value; } } + #region OC public string OCProfile { get { @@ -611,7 +623,6 @@ public void SetTargetOcProfile(OcBundle profile) OcProfilePrev = ActiveOCProfile; _ActiveOCProfile = profile; } - public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) { Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); @@ -656,10 +667,9 @@ public Task SetOcForDevice(OcBundle bundle, bool test = false, bool re return Task.FromResult(ret); } if(test) IsTesting = false; - Logger.Warn(_TAG, $"Setting OC is unsuccessful"); + Logger.Warn(_TAG, $"OC not in test mode anymore"); return Task.FromResult(ret); } - public Task ResetOcForDevice(bool test = false) { var defCC = ComputeDevice.CoreClockRange; @@ -670,6 +680,67 @@ public Task ResetOcForDevice(bool test = false) return Task.FromResult(res.Result); } #endregion + #region ELP + public string ELPProfile + { + get + { + if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Name; + if (ActiveOCProfile != null) return ActiveOCProfile.Name; + return string.Empty; + } + } + public string ELPProfileID + { + get + { + if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Id; + if (ActiveOCProfile != null) return ActiveOCProfile.Id; + return string.Empty; + } + } + private ElpBundle _ActiveELPTestProfile = null; + public ElpBundle ActiveELPTestProfile => _ActiveELPTestProfile; + private ElpBundle TestELPProfilePrev { get; set; } + + private ElpBundle _ActiveELPProfile = null; + public ElpBundle ActiveELPProfile => _ActiveELPProfile; + private ElpBundle ELPProfilePrev { get; set; } + public void SetTargetElpTestProfile(ElpBundle profile) + { + IsTesting = profile == null ? false : true; + TestELPProfilePrev = ActiveELPTestProfile; + _ActiveELPTestProfile = profile; + OnPropertyChanged(nameof(IgnoreLocalELPInput)); + } + public void SetTargetElpProfile(ElpBundle profile) + { + ELPProfilePrev = ActiveELPProfile; + _ActiveELPProfile = profile; + OnPropertyChanged(nameof(IgnoreLocalELPInput)); + } + public Task SetELPForDevice(ElpBundle bundle, bool test = false, bool reset = false) + { + Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={bundle.Elp}"); + var ret = OcReturn.Success; + + if (!reset) + { + if (test) IsTesting = true; + ELPManager.Instance.SetAlgoCMDString(this, bundle.Elp); + Logger.Warn(_TAG, $"Setting ELP is successful"); + //disable input and show message + //restart mining + return Task.FromResult(ret); + } + if (test) IsTesting = false; + //target set to empty where uuid match to string and reiterate + //enable input and hide message + //restart mining + Logger.Warn(_TAG, $"ELP not in test mode anymore"); + return Task.FromResult(ret); + } + #endregion #endif } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 93c206f9a..a69a2e6f5 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -702,6 +702,7 @@ public string OCProfileID public async Task AfterStartMining() { //TODO IF DELTA, IF ALREADY SET, IF NOT SET DONT RESTART ETC + //TODO NO RETURNS BC WE CAN SET MULTIPLE THINGS var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (testTarget == null) return; if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change @@ -726,6 +727,11 @@ public async Task AfterStartMining() var ret = await testTarget.ResetOcForDevice(false); return; } + if(testTarget.ActiveELPTestProfile!= null) + { + var ret = await testTarget.SetELPForDevice(testTarget.ActiveELPTestProfile, true, false); + return; + } } #endif } diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index 5db0e069a..1ffe1fb8e 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -969,7 +969,7 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary d.State == DeviceState.Mining || d.State == DeviceState.Testing)? .ToList(); - if(miningDevs.Any()) + if(miningDevs.Any())//todo if miningdev uuid is contained in both start and stop then dont do? { foreach (var dev in miningDevs) { diff --git a/src/NHMCore/Nhmws/ErrorCode.cs b/src/NHMCore/Nhmws/ErrorCode.cs index b0e19dc26..ad4d5b9be 100644 --- a/src/NHMCore/Nhmws/ErrorCode.cs +++ b/src/NHMCore/Nhmws/ErrorCode.cs @@ -20,5 +20,6 @@ public enum ErrorCode : int TestTotalFail = -104, TargetContainerNotFound = -105, ErrNotAdmin = -106, + ErrNoAlgoDataFound = -107, } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 3f3ed4483..b2c059247 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -554,20 +554,7 @@ public class Bundle [JsonProperty("elp", NullValueHandling = NullValueHandling.Ignore)] public List? ElpBundles { get; set; } } - public class ElpBundle - { - [JsonProperty("name")] - public string Name { get; set; } - [JsonProperty("device_name")] - public List? DeviceName { get; set; } - [JsonProperty("miner_id", NullValueHandling = NullValueHandling.Ignore)] - public List? MinerId { get; set; } - [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] - public string AlgoId { get; set; } - [JsonProperty("elp")] - public string Elp { get; set; } - } - public class OcBundle + public class GenericBundle { [JsonProperty("name")] public string Name { get; set; } @@ -579,6 +566,15 @@ public class OcBundle public List? MinerId { get; set; } [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] public List? AlgoId { get; set; } + + } + public class ElpBundle : GenericBundle + { + [JsonProperty("elp")] + public string Elp { get; set; } + } + public class OcBundle : GenericBundle + { [JsonProperty("core_clock")] public int CoreClock { get; set; } [JsonProperty("memory_clock")] @@ -586,16 +582,8 @@ public class OcBundle [JsonProperty("power_mode")] public int TDP { get; set; } } - public class FanBundle + public class FanBundle : GenericBundle { - [JsonProperty("name")] - public string Name { get; set; } - [JsonProperty("device_name")] - public string DeviceName { get; set; } - [JsonProperty("miner_id", NullValueHandling = NullValueHandling.Ignore)] - public List? MinerId { get; set; } - [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] - public List? AlgoId { get; set; } [JsonProperty("type")] public int Type { get; set; } [JsonProperty("fan_speed")] diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index fdb7253ae..716773352 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -743,9 +743,8 @@ async Task systemDump() case SupportedAction.ActionFanProfileTestStop: break; case SupportedAction.ActionElpProfileTest: - //object jobjectELP = JsonConvert.DeserializeObject(parameters); - //if (jobjectELP is not JObject jsonObjELP) break; - //if (jsonObjELP.ToObject() is ElpBundle eb) ExecuteELPBundle(eb); + var elp = JsonConvert.DeserializeObject(parameters); + (err, result) = ExecuteELPTest(deviceUUID, elp).Result; break; case SupportedAction.ActionElpProfileTestStop: break; @@ -799,6 +798,11 @@ private static Task ExecuteProfilesBundleReset() var res = OCManager.Instance.StopTest(deviceUUID); return Task.FromResult(res.Result); } + private static Task<(ErrorCode err, string msg)> ExecuteELPTest(string deviceUUID, ElpBundle elpBundle) + { + var res = ELPManager.Instance.ExecuteTest(deviceUUID, elpBundle); + return Task.FromResult(res.Result); + } private static Task ExecuteFanBundle(FanBundle fanBundle) { From 8b3ee64eeda836899d28e4840839f4d5813ff360 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Thu, 8 Dec 2022 08:39:59 +0100 Subject: [PATCH 027/224] NL-2031 NHM pid logic added --- .../PID/PID_CONTROLLER.cs | 28 +++++ src/NHM.DeviceMonitoring/PidController.cs | 35 ++++++ .../ApplicationStateManager.Timers.cs | 21 ++++ .../ApplicationStateManager.cs | 2 + src/NHMCore/Mining/AlgorithmContainer.cs | 30 +++++ src/NHMCore/Mining/ComputeDevice.cs | 106 ++++++++++++++++-- 6 files changed, 210 insertions(+), 12 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs create mode 100644 src/NHM.DeviceMonitoring/PidController.cs diff --git a/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs b/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs new file mode 100644 index 000000000..7d41a069e --- /dev/null +++ b/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.PID +{ + internal class PID_CONTROLLER + { + const string dll = "pid_controller.dll"; + + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_pid_init(); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_pid_deinit(); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern double nhm_pid_get_output(double actual_temp, double setpoint); + + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern void nhm_set_output_limits(double fan_speed_limit); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern void nhm_set_output_limits(double min_speed, double max_speed); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern void nhm_set_pid(double p, double i, double d); + } +} diff --git a/src/NHM.DeviceMonitoring/PidController.cs b/src/NHM.DeviceMonitoring/PidController.cs new file mode 100644 index 000000000..5f744976e --- /dev/null +++ b/src/NHM.DeviceMonitoring/PidController.cs @@ -0,0 +1,35 @@ +using NHM.DeviceMonitoring.PID; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring +{ + public class PidController + { + + public double GetOutput(double temp, double setpoint) + { + var fan_speed = 0.0; + fan_speed = PID_CONTROLLER.nhm_pid_get_output(temp, setpoint); + return fan_speed; + } + + public void SetOutputLimit(double max_fan_speed) + { + PID_CONTROLLER.nhm_set_output_limits(max_fan_speed); + } + + public void SetOutputLimits(double min_speed, double max_speed) + { + PID_CONTROLLER.nhm_set_output_limits(min_speed, max_speed); + } + + public void SetPid(double p, double i, double d) + { + PID_CONTROLLER.nhm_set_pid(p, i, d); + } + } +} diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs index bdf1273a4..637d3bd65 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs @@ -1,6 +1,7 @@ using NHM.Common; using NHM.DeviceDetection; using NHMCore.Configs; +using NHMCore.Mining; using NHMCore.Notifications; using NHMCore.Utils; using System; @@ -138,5 +139,25 @@ public static void StopInternetCheckTimer() } #endregion InternetCheck timer + + #region FanProfile timer + private static AppTimer _fanProfileTimer; + + public static void StartFanProfileTimer() + { + if (_fanProfileTimer?.IsActive ?? false) return; + _fanProfileTimer = new AppTimer((object sender, ElapsedEventArgs e) => + { + var devices = AvailableDevices.GPUs; + foreach (var device in devices) device.SetFanSpeedWithPidController(); + },5000); + _fanProfileTimer.Start(); + } + + public static void StopFanProfileTimer() + { + _fanProfileTimer?.Stop(); + } + #endregion } } diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs index ff713caf0..ffd92ab44 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.cs @@ -158,6 +158,7 @@ internal static bool StartMining() { StartComputeDevicesCheckTimer(); StartInternetCheckTimer(); + StartFanProfileTimer(); return true; } @@ -165,6 +166,7 @@ internal static void StopMining() { StopComputeDevicesCheckTimer(); StopInternetCheckTimer(); + StopFanProfileTimer(); DisplayNoInternetConnection(false); // hide warning DisplayMiningProfitable(true); // hide warning } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 0397f99dd..bf4381f91 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -570,6 +570,16 @@ public string OCProfileID return string.Empty; } } + public string FanProfile + { + get + { + if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Name; + if (ActiveFanProfile != null) return ActiveFanProfile.Name; + return string.Empty; + } + } + private OcBundle _ActiveOCTestProfile = null; public OcBundle ActiveOCTestProfile => _ActiveOCTestProfile; private OcBundle TestOcProfilePrev { get; set; } @@ -578,6 +588,14 @@ public string OCProfileID public OcBundle ActiveOCProfile => _ActiveOCProfile; private OcBundle OcProfilePrev { get; set; } + private FanBundle _activeFanTestProfile = null; + public FanBundle ActiveFanTestProfile => _activeFanTestProfile; + private FanBundle _testFanProfilePrev { get; set; } + private FanBundle _activeFanProfile = null; + public FanBundle ActiveFanProfile => _activeFanProfile; + private FanBundle _fanProfilePrev { get; set; } + + public void SetTargetOcTestProfile(OcBundle profile) { IsTesting = profile == null ? false : true; @@ -589,6 +607,18 @@ public void SetTargetOcProfile(OcBundle profile) OcProfilePrev = ActiveOCProfile; _ActiveOCProfile = profile; } + public void SetTargetFanTestProfile(FanBundle profile) + { + IsTesting = profile == null ? false : true; + _testFanProfilePrev = ActiveFanTestProfile; + _activeFanTestProfile = profile; + } + + public void SetTargetFanProfile(FanBundle profile) + { + _fanProfilePrev = ActiveFanProfile; + _activeFanProfile = profile; + } public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) { diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 53c5b046f..d3aee565f 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -10,6 +10,7 @@ using NHMCore.Configs; using NHMCore.Configs.Data; using NHMCore.Nhmws; +using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; using System.ComponentModel; @@ -40,6 +41,10 @@ public class ComputeDevice : NotifyChangedBase public bool IsTesting => AlgorithmSettings.Any(a => a.IsTesting); #endif + private PidController _pidController = new(); + + private int _memoryControlCounter = 0; + private bool _enabled = true; public bool Enabled { @@ -293,7 +298,7 @@ public int MemoryClock { get { - if(!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ITDPLimits get) + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ITDPLimits get) { var ret = get.GetTDPLimits(); return (ret.min, ret.max, ret.def); @@ -341,17 +346,17 @@ public bool SetPowerModeManual(int TDP) } public bool SetCoreClock(int coreClock) { - if(CanSetTDP && DeviceMonitor is ICoreClockSet set) return set.SetCoreClock(coreClock); + if (CanSetTDP && DeviceMonitor is ICoreClockSet set) return set.SetCoreClock(coreClock); return false; } public bool SetMemoryClock(int memoryClock) { - if(CanSetTDP && DeviceMonitor is IMemoryClockSet set) return set.SetMemoryClock(memoryClock); + if (CanSetTDP && DeviceMonitor is IMemoryClockSet set) return set.SetMemoryClock(memoryClock); return false; } public bool SetFanSpeedPercentage(int percent) { - if(DeviceMonitor is ISetFanSpeedPercentage set) return set.SetFanSpeedPercentage(percent); + if (DeviceMonitor is ISetFanSpeedPercentage set) return set.SetFanSpeedPercentage(percent); return false; } public bool ResetFanSpeed() @@ -634,7 +639,7 @@ public IEnumerable AlgorithmsForBenchmark() public int TrySetMemoryTimings(string mtString) { - if(DeviceMonitor is IMemoryTimings mp) + if (DeviceMonitor is IMemoryTimings mp) { return mp.SetMemoryTimings(mtString); } @@ -643,7 +648,7 @@ public int TrySetMemoryTimings(string mtString) public int TryResetMemoryTimings() { - if(DeviceMonitor is IMemoryTimings mp) + if (DeviceMonitor is IMemoryTimings mp) { return mp.ResetMemoryTimings(); } @@ -661,7 +666,7 @@ public string OCProfile { get { var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); - if(testTarget != null) + if (testTarget != null) { return testTarget.OCProfile; } @@ -673,13 +678,26 @@ public string OCProfileID get { var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); - if(testTarget != null ) + if (testTarget != null) { return testTarget.OCProfileID; } return string.Empty; } } + public string FanProfile + { + get + { + var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); + if (testTarget != null) + { + return testTarget.FanProfile; + } + return string.Empty; + } + } + public async Task AfterStartMining() { var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); @@ -687,26 +705,90 @@ public async Task AfterStartMining() if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change { var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCTestProfile, true, false); - if(ret == OcReturn.Success || ret == OcReturn.PartialSuccess) State = DeviceState.Testing; + if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) State = DeviceState.Testing; return; } - if(testTarget.ActiveOCTestProfile == null && State == DeviceState.Testing) + if (testTarget.ActiveOCTestProfile == null && State == DeviceState.Testing) { var ret = await testTarget.ResetOcForDevice(true); State = DeviceState.Mining; return; } - if(testTarget.ActiveOCProfile != null) + if (testTarget.ActiveOCProfile != null) { var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCProfile, false, false); return; } - if(testTarget.ActiveOCProfile == null) + if (testTarget.ActiveOCProfile == null) { var ret = await testTarget.ResetOcForDevice(false); return; } } + + public void SetFanSpeedWithPidController() + { + var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); + if (testTarget == null) return; + var profile = testTarget.ActiveFanProfile ?? testTarget.ActiveFanProfile; + if (profile == null) profile = testTarget.ActiveFanProfile; + if (profile == null) return; + + switch (profile.Type) + { + case 0: + SetFanSpeedPercentage(profile.FanSpeed); + return; + case 1: + SetFanSpeed(profile); + return; + case 2: + SetFanSpeed(profile); + return; + case 3: + SetFanSpeedWithLoweringMemoryClocks(profile); + return; + } + } + + private void SetFanSpeed(FanBundle profile) + { + if (profile.Type == 1) + { + _pidController.SetPid(10, 0.8, 1); + _pidController.SetOutputLimit(100); + var speed = _pidController.GetOutput(Temp, profile.GpuTemp); + SetFanSpeedPercentage((int)speed); + } + else + { + _pidController.SetPid(10, 0.8, 1); + _pidController.SetOutputLimit(profile.MaxFanSpeed); + var speed = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); + SetFanSpeedPercentage((int)speed); + } + } + + private void SetFanSpeedWithLoweringMemoryClocks(FanBundle profile) + { + _pidController.SetPid(10, 0.8, 1); + _pidController.SetOutputLimit(profile.MaxFanSpeed); + var speed = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); + SetFanSpeedPercentage((int)speed); + + var deltaTemp = Math.Max(Temp, VramTemperature) - Math.Min(profile.GpuTemp, profile.VramTemp); + if (deltaTemp > 5) _memoryControlCounter++; + + if (_memoryControlCounter >= 5) + { + _pidController.SetPid(100, 0.8, 1); + _pidController.SetOutputLimits(MemoryClockRange.min, MemoryClockRange.max); + var memory_clock = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); + SetMemoryClock((int)memory_clock); + _memoryControlCounter = 0; + } + } + #endif } } From d5afa1c8aafcfe6caeaf879dc4b68a16b91dc6cf Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Thu, 8 Dec 2022 12:57:50 +0100 Subject: [PATCH 028/224] NL-2031 FanManager added --- src/NHMCore/Configs/Managers/BundleManager.cs | 3 +- src/NHMCore/Configs/Managers/FanManager.cs | 121 +++++++++++++++++- src/NHMCore/Mining/ComputeDevice.cs | 6 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 47 ++----- 4 files changed, 139 insertions(+), 38 deletions(-) diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index dc886cf71..77f286a25 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -50,8 +50,7 @@ public static void Init() private static void ApplyBundleOnInit(Bundle bundle) { OCManager.Instance.ApplyOcBundle(bundle.OcBundles); - //fanmanager - //elpmanager + FanManager.Instance.ApplyFanBundle(bundle.FanBundles); } public static async Task SaveBundle(Bundle bundle) { diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index 8b6cad012..50dddc117 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -1,4 +1,10 @@ -using System; +using NHM.Common; +using NHM.Common.Enums; +using NHMCore.ApplicationState; +using NHMCore.Mining; +using NHMCore.Nhmws; +using NHMCore.Nhmws.V4; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -11,5 +17,118 @@ public class FanManager private FanManager() { } public static FanManager Instance { get; } = new FanManager(); private readonly string _TAG = "FanManager"; + + public enum FanReturn + { + Success, + PartialSuccess, + Fail + } + + public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, FanBundle bundle) + { + if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); + var allContainers = AvailableDevices.Devices + .Where(d => d.B64Uuid == uuid)? + .Where(d => d.State == DeviceState.Mining || d.State == DeviceState.Testing)? + .SelectMany(d => d.AlgorithmSettings); + if (allContainers == null || !allContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "No targets found")); + + List specificContainers = allContainers.ToList(); + if (bundle.AlgoId != null && bundle.MinerId != null) specificContainers = allContainers.Where(d => + bundle.AlgoId.Contains(d.AlgorithmName) && + bundle.MinerId.Contains(d.PluginName))?.ToList(); + else if (bundle.AlgoId != null) specificContainers = allContainers.Where(d => bundle.AlgoId.Contains(d.AlgorithmName))?.ToList(); + else if (bundle.MinerId != null) specificContainers = allContainers.Where(d => bundle.MinerId.Contains(d.PluginName))?.ToList(); + if (specificContainers == null || !specificContainers.Any()) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Action target mismatch, containers null")); + var target = specificContainers.Where(c => c.IsCurrentlyMining)?.FirstOrDefault(); + if (target == null) + { + target = specificContainers.FirstOrDefault(); + if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); + } + AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future + .Where(d => d.B64Uuid == uuid)? + .SelectMany(d => d.AlgorithmSettings)? + .ToList()? + .ForEach(c => c.IsTesting = false); + target.SetTargetFanTestProfile(bundle); + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } + public Task<(ErrorCode err, string msg)> StopTest(string uuid) + { + var targetDeviceContainer = AvailableDevices.Devices + .Where(d => d.B64Uuid == uuid)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(a => a.IsTesting)? + .FirstOrDefault(); + if (targetDeviceContainer == null) + { + Logger.Error(_TAG, "Device not found for stop OC test"); + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); + } + targetDeviceContainer.SetTargetFanTestProfile(null); + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } + public Task<(ErrorCode err, string msg)> ApplyFanBundle(List bundles) + { + List processed = new(); + var sorted = new List<(int, FanBundle)>(); + foreach (var bundle in bundles) + { + if (bundle.MinerId != null && bundle.AlgoId != null) sorted.Add((0, bundle)); + else if (bundle.MinerId == null && bundle.AlgoId != null) sorted.Add((1, bundle)); + else if (bundle.MinerId != null && bundle.AlgoId == null) sorted.Add((2, bundle)); + else sorted.Add((3, bundle)); + } + sorted = sorted.OrderBy(item => item.Item1).ToList(); + foreach (var (type, bundle) in sorted) + { + var current = new List(); + if (type == 0) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? + .Where(c => bundle.MinerId.Contains(c.PluginName))? + .ToList(); + else if (type == 1) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? + .ToList(); + else if (type == 2) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.MinerId.Contains(c.PluginName))? + .ToList(); + else current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .ToList(); + if (current == null) continue; + current = current.Where(c => !processed.Contains(c)).ToList(); + processed.AddRange(current); + foreach (var container in current) + { + Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); + container.SetTargetFanProfile(bundle); + } + } + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } + + public Task ResetFanBundle() + { + var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); + foreach (var container in containers) + { + container.SetTargetFanProfile(null); + } + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index d3aee565f..18e6dccbf 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -730,8 +730,8 @@ public void SetFanSpeedWithPidController() { var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (testTarget == null) return; - var profile = testTarget.ActiveFanProfile ?? testTarget.ActiveFanProfile; - if (profile == null) profile = testTarget.ActiveFanProfile; + var profile = testTarget.ActiveFanTestProfile ?? testTarget.ActiveFanTestProfile; + profile = testTarget.ActiveFanProfile ?? testTarget.ActiveFanProfile; if (profile == null) return; switch (profile.Type) @@ -748,6 +748,8 @@ public void SetFanSpeedWithPidController() case 3: SetFanSpeedWithLoweringMemoryClocks(profile); return; + default: + return; } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 25c4cb54e..ad9343de8 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -736,11 +736,11 @@ async Task systemDump() (err, result) = StopOCTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionFanProfileTest: - //object jobjectFan = JsonConvert.DeserializeObject(parameters); - //if (jobjectFan is not JObject jsonObjFan) break; - //if (jsonObjFan.ToObject() is FanBundle fb) ExecuteFanBundle(fb); + var fan = JsonConvert.DeserializeObject(parameters); + (err, result) = ExecuteFanTest(deviceUUID, fan).Result; break; case SupportedAction.ActionFanProfileTestStop: + (err, result) = StopFanTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionElpProfileTest: //object jobjectELP = JsonConvert.DeserializeObject(parameters); @@ -773,7 +773,7 @@ private static Task ExecuteProfilesBundleSet(Bundle bundle) } if (bundle.FanBundles != null) { - ExecuteFanBundles(bundle.FanBundles); + var retFan = FanManager.Instance.ApplyFanBundle(bundle.FanBundles); } if (bundle.ElpBundles != null) { @@ -785,6 +785,7 @@ private static Task ExecuteProfilesBundleReset() { BundleManager.ResetBundleInfo(); var retOC = OCManager.Instance.ResetOcBundle(); + var retFan = FanManager.Instance.ResetFanBundle(); return Task.CompletedTask; } private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) @@ -800,39 +801,19 @@ private static Task ExecuteProfilesBundleReset() return Task.FromResult(res.Result); } - private static Task ExecuteFanBundle(FanBundle fanBundle) + private static Task<(ErrorCode err, string msg)> ExecuteFanTest(string deviceUUID, FanBundle fanBundle) { - object t = fanBundle.Type switch - { - 0 => ExecuteFanBundleFixed(fanBundle), - 1 => ExecuteFanBundleTargetGPUTemp(fanBundle), - 2 => ExecuteFanBundleTargetGPUVRAMTemp(fanBundle), - _ => throw new RpcException($"Fan bundle type not supported for method '{fanBundle.Type}'", ErrorCode.UnableToHandleRpc), - }; - return Task.CompletedTask; - } - private static Task ExecuteFanBundles(List bundles) - { - foreach (var bundle in bundles) - { - //todo check returns - ExecuteFanBundle(bundle); - } - return Task.CompletedTask; - } - private static Task ExecuteFanBundleFixed(FanBundle fanBundle) - { - return Task.CompletedTask; - } - private static Task ExecuteFanBundleTargetGPUTemp(FanBundle fanBundle) - { - return Task.CompletedTask; + if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + var res = FanManager.Instance.ExecuteTest(deviceUUID, fanBundle); + return Task.FromResult(res.Result); } - private static Task ExecuteFanBundleTargetGPUVRAMTemp(FanBundle fanBundle) + + private static Task<(ErrorCode err, string msg)> StopFanTestForDevice(string deviceUUID) { - return Task.CompletedTask; + if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + var res = FanManager.Instance.StopTest(deviceUUID); + return Task.FromResult(res.Result); } - private static Task SetMutable(MinerSetMutable mutableCmd) { return Task.FromResult(""); From b8b384478ea47318afa50c15cfbe323f67ab39f9 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 8 Dec 2022 13:03:20 +0100 Subject: [PATCH 029/224] added resetting --- src/NHMCore/Mining/AlgorithmContainer.cs | 6 +++++ src/NHMCore/Mining/MiningManager.cs | 31 +++++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 3421ee8df..8ea5d0b7a 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -706,17 +706,23 @@ public string ELPProfileID private ElpBundle _ActiveELPProfile = null; public ElpBundle ActiveELPProfile => _ActiveELPProfile; private ElpBundle ELPProfilePrev { get; set; } + public bool NewTestProfile = false; + public bool NewProfile = false; + public void ResetNewTestProfileStatus() { NewTestProfile = false; } + public void ResetNewProfileStatus() { NewProfile = false; } public void SetTargetElpTestProfile(ElpBundle profile) { IsTesting = profile == null ? false : true; TestELPProfilePrev = ActiveELPTestProfile; _ActiveELPTestProfile = profile; + NewTestProfile = true; OnPropertyChanged(nameof(IgnoreLocalELPInput)); } public void SetTargetElpProfile(ElpBundle profile) { ELPProfilePrev = ActiveELPProfile; _ActiveELPProfile = profile; + NewProfile = true; OnPropertyChanged(nameof(IgnoreLocalELPInput)); } public Task SetELPForDevice(ElpBundle bundle, bool test = false, bool reset = false) diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index 1ffe1fb8e..1f6db3f7a 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -12,6 +12,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using System.Linq; using System.Text; using System.Threading; @@ -930,10 +931,28 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary currentRunningGroups.Contains(pair.Key)).Select(pair => pair.Key).OrderBy(uuid => uuid).ToArray(); - var toStartMinerGroupKeys = newGroupedMiningPairs.Where(pair => !currentRunningGroups.Contains(pair.Key)).Select(pair => pair.Key).OrderBy(uuid => uuid).ToArray(); - var toStopMinerGroupKeys = currentRunningGroups.Where(runningKey => !newGroupedMiningPairs.Keys.Contains(runningKey)).OrderBy(uuid => uuid).ToArray(); + var noChangeGroupMinersKeys = newGroupedMiningPairs.Where(pair => currentRunningGroups.Contains(pair.Key)).Select(pair => pair.Key).OrderBy(uuid => uuid).ToList(); + var toStartMinerGroupKeys = newGroupedMiningPairs.Where(pair => !currentRunningGroups.Contains(pair.Key)).Select(pair => pair.Key).OrderBy(uuid => uuid).ToList(); + var toStopMinerGroupKeys = currentRunningGroups.Where(runningKey => !newGroupedMiningPairs.Keys.Contains(runningKey)).OrderBy(uuid => uuid).ToList(); + + //resetting in case of elp profile set + foreach(var noChangeKey in noChangeGroupMinersKeys) + { + var miningPairs = newGroupedMiningPairs[noChangeKey]; + var miningPairsWithNewProfile = miningPairs.Where(p => p.NewProfile == true || p.NewTestProfile == true); + if (miningPairsWithNewProfile == null || miningPairsWithNewProfile.Count() == 0) continue; + foreach(var item in miningPairsWithNewProfile) + { + item.ResetNewProfileStatus(); + item.ResetNewTestProfileStatus(); + } + toStopMinerGroupKeys.Add(noChangeKey); + toStartMinerGroupKeys.Add(noChangeKey); + } + + // first stop currently running foreach (var stopKey in toStopMinerGroupKeys) { @@ -981,11 +1000,11 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary 0 ? string.Join(",", toStopMinerGroupKeys) : "EMTPY"; + var stopLog = toStopMinerGroupKeys.Count > 0 ? string.Join(",", toStopMinerGroupKeys) : "EMTPY"; Logger.Info(Tag, $"Stop Old Mining: ({stopLog})"); - var startLog = toStartMinerGroupKeys.Length > 0 ? string.Join(",", toStartMinerGroupKeys) : "EMTPY"; + var startLog = toStartMinerGroupKeys.Count > 0 ? string.Join(",", toStartMinerGroupKeys) : "EMTPY"; Logger.Info(Tag, $"Start New Mining : ({startLog})"); - var sameLog = noChangeGroupMinersKeys.Length > 0 ? string.Join(",", noChangeGroupMinersKeys) : "EMTPY"; + var sameLog = noChangeGroupMinersKeys.Count > 0 ? string.Join(",", noChangeGroupMinersKeys) : "EMTPY"; Logger.Info(Tag, $"No change : ({sameLog})"); } } From 23d55806960eb9b99c588300364e455d49d598e5 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 8 Dec 2022 13:26:22 +0100 Subject: [PATCH 030/224] added early returns --- src/NHMCore/Configs/Managers/FanManager.cs | 1 + src/NHMCore/Configs/Managers/OCManager.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index 50dddc117..d33665cd2 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -74,6 +74,7 @@ public enum FanReturn } public Task<(ErrorCode err, string msg)> ApplyFanBundle(List bundles) { + if (bundles == null) return Task.FromResult((ErrorCode.NoError, "FanBundles == null")); List processed = new(); var sorted = new List<(int, FanBundle)>(); foreach (var bundle in bundles) diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 83c8375a5..564672661 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -78,6 +78,7 @@ public enum OcReturn } public Task<(ErrorCode err, string msg)> ApplyOcBundle(List bundles) { + if (bundles == null) return Task.FromResult((ErrorCode.NoError, "OcBundles == null")); List processed = new(); var sorted = new List<(int, OcBundle)>(); foreach (var bundle in bundles) From cad443e512794e01f703d89e27ba133dd6f6b110 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 8 Dec 2022 15:03:42 +0100 Subject: [PATCH 031/224] fan profile ids added --- src/NHMCore/Mining/AlgorithmContainer.cs | 9 +++++++++ src/NHMCore/Mining/ComputeDevice.cs | 12 ++++++++++++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 4 ++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index ad0365605..f8e67f436 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -613,6 +613,15 @@ public string FanProfile return string.Empty; } } + public string FanProfileID + { + get + { + if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Id; + if (ActiveFanProfile != null) return ActiveFanProfile.Id; + return string.Empty; + } + } private OcBundle _ActiveOCTestProfile = null; public OcBundle ActiveOCTestProfile => _ActiveOCTestProfile; diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index bdb683562..218038942 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -715,6 +715,18 @@ public string FanProfile return string.Empty; } } + public string FanProfileID + { + get + { + var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); + if (testTarget != null) + { + return testTarget.FanProfileID; + } + return string.Empty; + } + } public async Task AfterStartMining() { diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 114f67931..23b522568 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -104,8 +104,8 @@ private static (List<(string name, string? unit)> properties, JArray values) Get "Miner" => $"{GetDevicePlugin(d.Uuid)}", "OC profile" => $"{d.OCProfile}", "OC profile ID" => $"{d.OCProfileID}", - "Fan profile" => $"", //TODO - "Fan profile ID" => $"", + "Fan profile" => $"{d.FanProfile}", //TODO + "Fan profile ID" => $"{d.FanProfileID}", "ELP profile" => $"", //TODO "ELP profile ID" => $"", _ => null, From 1ca0dfe4ac0cd39c9444613fbf35e9f1e1b753c4 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Mon, 12 Dec 2022 13:40:59 +0100 Subject: [PATCH 032/224] NL-2094 AMD pid controller --- src/NHM.DeviceMonitoring/AMD/AMD_ODN.cs | 2 ++ src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 2 +- src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs | 2 +- src/NHM.DeviceMonitoring/PidController.cs | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/NHM.DeviceMonitoring/AMD/AMD_ODN.cs b/src/NHM.DeviceMonitoring/AMD/AMD_ODN.cs index d598208d7..ce9820b45 100644 --- a/src/NHM.DeviceMonitoring/AMD/AMD_ODN.cs +++ b/src/NHM.DeviceMonitoring/AMD/AMD_ODN.cs @@ -35,6 +35,8 @@ internal static class AMD_ODN [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_amd_device_set_fan_speed_percentage(int bus_number, int set_fan_speed_percentage); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_amd_device_reset_fan_speed_percentage(int bus_number); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_amd_device_get_tdp_min_max_default(int bus_number, ref int min, ref int max, ref int defaultV); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_amd_device_get_tdp(int bus_number, ref int get_tdp); diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs index 94b464765..4d9ca21cc 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs @@ -240,7 +240,7 @@ public bool SetCoreClock(int coreClock) public bool SetFanSpeedPercentage(int percentage) { - var ok = AMD_ODN.nhm_amd_device_set_fan_speed_percentage(BusID, percentage); + var ok = percentage <= 0 ? AMD_ODN.nhm_amd_device_reset_fan_speed_percentage(BusID) : AMD_ODN.nhm_amd_device_set_fan_speed_percentage(BusID, percentage); if (ok == RET_OK) return true; Logger.InfoDelayed(LogTag, $"nhm_amd_device_set_fan_speed_percentage failed with error code {ok}", _delayedLogging); return false; diff --git a/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs b/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs index 7d41a069e..1e6c17c06 100644 --- a/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs +++ b/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs @@ -19,7 +19,7 @@ internal class PID_CONTROLLER public static extern double nhm_pid_get_output(double actual_temp, double setpoint); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern void nhm_set_output_limits(double fan_speed_limit); + public static extern void nhm_set_output_limit(double fan_speed_limit); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern void nhm_set_output_limits(double min_speed, double max_speed); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] diff --git a/src/NHM.DeviceMonitoring/PidController.cs b/src/NHM.DeviceMonitoring/PidController.cs index 5f744976e..67942ef76 100644 --- a/src/NHM.DeviceMonitoring/PidController.cs +++ b/src/NHM.DeviceMonitoring/PidController.cs @@ -19,7 +19,7 @@ public double GetOutput(double temp, double setpoint) public void SetOutputLimit(double max_fan_speed) { - PID_CONTROLLER.nhm_set_output_limits(max_fan_speed); + PID_CONTROLLER.nhm_set_output_limit(max_fan_speed); } public void SetOutputLimits(double min_speed, double max_speed) From 3fcf680b65a53e2375c96238a46f6c2aa312745d Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 13 Dec 2022 11:18:14 +0100 Subject: [PATCH 033/224] done elp commands --- .../ApplicationStateManager.Init.cs | 1 - src/NHMCore/Configs/Managers/BundleManager.cs | 1 + src/NHMCore/Configs/Managers/ELPManager.cs | 76 +++++++++++ src/NHMCore/Configs/Managers/OCManager.cs | 4 +- src/NHMCore/Mining/AlgorithmContainer.cs | 125 ++++++++++-------- src/NHMCore/Mining/ComputeDevice.cs | 113 ++++++++++++---- src/NHMCore/Mining/MiningManager.cs | 8 -- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 6 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 12 +- src/NiceHashMiner/ViewModels/MainVM.cs | 1 + 10 files changed, 250 insertions(+), 97 deletions(-) diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs index b63d24699..fb83ca286 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs @@ -258,7 +258,6 @@ string getDeviceNameCount(DeviceType deviceType, int index) => } SchedulesManager.Instance.Init(); - BundleManager.Init(); } catch (Exception e) { diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index d8f0b5d02..43b7030f3 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -52,6 +52,7 @@ private static void ApplyBundleOnInit(Bundle bundle) { OCManager.Instance.ApplyOcBundle(bundle.OcBundles); FanManager.Instance.ApplyFanBundle(bundle.FanBundles); + ELPManager.Instance.ApplyELPBundle(bundle.ElpBundles); } public static async Task SaveBundle(Bundle bundle) { diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 18321c919..1a373a192 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -21,6 +21,7 @@ public class ELPManager { private ELPManager() { } public static ELPManager Instance { get; } = new ELPManager(); + private readonly string _TAG = "ELPManager"; public event NotifyELPChangeEventHandler ELPReiteration; const int HEADER = 0; const int FLAG = 0; @@ -348,6 +349,81 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } + public Task<(ErrorCode err, string msg)> StopTest(string uuid) + { + var targetDeviceContainer = AvailableDevices.Devices + .Where(d => d.B64Uuid == uuid)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(a => a.IsTesting)? + .FirstOrDefault(); + if (targetDeviceContainer == null) + { + Logger.Error(_TAG, "Device not found for stop ELP test"); + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); + } + targetDeviceContainer.SetTargetElpTestProfile(null); + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } + public Task<(ErrorCode err, string msg)> ApplyELPBundle(List bundles) + { + if (bundles == null) return Task.FromResult((ErrorCode.NoError, "ELPBundles == null")); + List processed = new(); + var sorted = new List<(int, ElpBundle)>(); + foreach (var bundle in bundles) + { + if (bundle.MinerId != null && bundle.AlgoId != null) sorted.Add((0, bundle)); + else if (bundle.MinerId == null && bundle.AlgoId != null) sorted.Add((1, bundle)); + else if (bundle.MinerId != null && bundle.AlgoId == null) sorted.Add((2, bundle)); + else sorted.Add((3, bundle)); + } + sorted = sorted.OrderBy(item => item.Item1).ToList(); + foreach (var (type, bundle) in sorted) + { + var current = new List(); + if (type == 0) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? + .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? + .ToList(); + else if (type == 1) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? + .ToList(); + else if (type == 2) current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? + .ToList(); + else current = AvailableDevices.Devices + .Where(d => d.Name == bundle.DeviceName)? + .SelectMany(d => d.AlgorithmSettings)? + .ToList(); + if (current == null) continue; + current = current.Where(c => !processed.Contains(c)).ToList(); + processed.AddRange(current); + foreach (var container in current) + { + Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); + container.SetTargetElpProfile(bundle); + } + } + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } + + public Task ResetELPBundle() + { + var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); + foreach (var container in containers) + { + container.SetTargetElpProfile(null); + } + MiningManager.TriggerSwitchCheck(); + return Task.FromResult((ErrorCode.NoError, "Success")); + } #endif } } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 564672661..d68a2c8bd 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -98,12 +98,12 @@ public enum OcReturn .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? .ToList(); - else if (type == 1) AvailableDevices.Devices + else if (type == 1) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? .ToList(); - else if (type == 2) AvailableDevices.Devices + else if (type == 2) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index f8e67f436..33eba4843 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -574,6 +574,19 @@ void SettingsChanged(object sender, EventArgs e) } } #if NHMWS4 + public enum ActionQueue + { + ApplyOcTest, + ApplyOC, + ResetOC, + ApplyFanTest, + ApplyFan, + ResetFan, + ApplyELPTest, + ApplyELP, + ResetELP + } + public Queue RigManagementActions = new Queue(); //THREAD SAFETY private bool _IsTesting = false; public bool IsTesting { @@ -604,24 +617,7 @@ public string OCProfileID return string.Empty; } } - public string FanProfile - { - get - { - if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Name; - if (ActiveFanProfile != null) return ActiveFanProfile.Name; - return string.Empty; - } - } - public string FanProfileID - { - get - { - if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Id; - if (ActiveFanProfile != null) return ActiveFanProfile.Id; - return string.Empty; - } - } + private OcBundle _ActiveOCTestProfile = null; public OcBundle ActiveOCTestProfile => _ActiveOCTestProfile; @@ -631,42 +627,22 @@ public string FanProfileID public OcBundle ActiveOCProfile => _ActiveOCProfile; private OcBundle OcProfilePrev { get; set; } - private FanBundle _activeFanTestProfile = null; - public FanBundle ActiveFanTestProfile => _activeFanTestProfile; - private FanBundle _testFanProfilePrev { get; set; } - private FanBundle _activeFanProfile = null; - public FanBundle ActiveFanProfile => _activeFanProfile; - private FanBundle _fanProfilePrev { get; set; } - - public void SetTargetOcTestProfile(OcBundle profile) { IsTesting = profile == null ? false : true; TestOcProfilePrev = ActiveOCTestProfile; _ActiveOCTestProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOcTest); } public void SetTargetOcProfile(OcBundle profile) { OcProfilePrev = ActiveOCProfile; _ActiveOCProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } - - public void SetTargetFanTestProfile(FanBundle profile) - { - IsTesting = profile == null ? false : true; - _testFanProfilePrev = ActiveFanTestProfile; - _activeFanTestProfile = profile; - } - - public void SetTargetFanProfile(FanBundle profile) - { - _fanProfilePrev = ActiveFanProfile; - _activeFanProfile = profile; - } - public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) { - Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); + if(bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = OcReturn.Fail; int valuesToSet = 0; if (bundle.CoreClock > 0) valuesToSet++; @@ -711,13 +687,13 @@ public Task SetOcForDevice(OcBundle bundle, bool test = false, bool re Logger.Warn(_TAG, $"OC not in test mode anymore"); return Task.FromResult(ret); } - public Task ResetOcForDevice(bool test = false) + public Task ResetOcForDevice() { var defCC = ComputeDevice.CoreClockRange; var defMC = ComputeDevice.MemoryClockRange; var defTDP = ComputeDevice.TDPLimits; var bundle = new OcBundle() { CoreClock = defCC.def, MemoryClock = defMC.def, TDP = (int)defTDP.def }; - var res = SetOcForDevice(bundle, test, true); + var res = SetOcForDevice(bundle, IsTesting, true); return Task.FromResult(res.Result); } #endregion @@ -726,8 +702,8 @@ public string ELPProfile { get { - if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Name; - if (ActiveOCProfile != null) return ActiveOCProfile.Name; + if (ActiveELPTestProfile != null) return ActiveELPTestProfile.Name; + if (ActiveELPProfile != null) return ActiveELPProfile.Name; return string.Empty; } } @@ -735,8 +711,8 @@ public string ELPProfileID { get { - if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Id; - if (ActiveOCProfile != null) return ActiveOCProfile.Id; + if (ActiveELPTestProfile != null) return ActiveELPTestProfile.Id; + if (ActiveELPProfile != null) return ActiveELPProfile.Id; return string.Empty; } } @@ -751,24 +727,27 @@ public string ELPProfileID public bool NewProfile = false; public void ResetNewTestProfileStatus() { NewTestProfile = false; } public void ResetNewProfileStatus() { NewProfile = false; } - public void SetTargetElpTestProfile(ElpBundle profile) + public Task SetTargetElpTestProfile(ElpBundle profile) { IsTesting = profile == null ? false : true; TestELPProfilePrev = ActiveELPTestProfile; _ActiveELPTestProfile = profile; NewTestProfile = true; + SetELPForDevice(profile, IsTesting, profile == null);//todo change reset OnPropertyChanged(nameof(IgnoreLocalELPInput)); + return Task.CompletedTask; } public void SetTargetElpProfile(ElpBundle profile) { ELPProfilePrev = ActiveELPProfile; _ActiveELPProfile = profile; NewProfile = true; + SetELPForDevice(profile, false, profile == null);//todo change reset OnPropertyChanged(nameof(IgnoreLocalELPInput)); } public Task SetELPForDevice(ElpBundle bundle, bool test = false, bool reset = false) { - Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={bundle.Elp}"); + if (bundle != null) Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={bundle.Elp}"); var ret = OcReturn.Success; if (!reset) @@ -776,18 +755,56 @@ public Task SetELPForDevice(ElpBundle bundle, bool test = false, bool if (test) IsTesting = true; ELPManager.Instance.SetAlgoCMDString(this, bundle.Elp); Logger.Warn(_TAG, $"Setting ELP is successful"); - //disable input and show message - //restart mining + return Task.FromResult(ret); } if (test) IsTesting = false; - //target set to empty where uuid match to string and reiterate - //enable input and hide message - //restart mining + ELPManager.Instance.IterateSubModelsAndConstructELPs(); Logger.Warn(_TAG, $"ELP not in test mode anymore"); return Task.FromResult(ret); } #endregion + #region FAN + public string FanProfile + { + get + { + if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Name; + if (ActiveFanProfile != null) return ActiveFanProfile.Name; + return string.Empty; + } + } + public string FanProfileID + { + get + { + if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Id; + if (ActiveFanProfile != null) return ActiveFanProfile.Id; + return string.Empty; + } + } + private FanBundle _activeFanTestProfile = null; + public FanBundle ActiveFanTestProfile => _activeFanTestProfile; + private FanBundle TestFanProfilePrev { get; set; } + private FanBundle _activeFanProfile = null; + public FanBundle ActiveFanProfile => _activeFanProfile; + private FanBundle FanProfilePrev { get; set; } + public void SetTargetFanTestProfile(FanBundle profile) + { + IsTesting = profile == null ? false : true; + TestFanProfilePrev = ActiveFanTestProfile; + _activeFanTestProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFanTest); + } + + public void SetTargetFanProfile(FanBundle profile) + { + FanProfilePrev = ActiveFanProfile; + _activeFanProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); + } + + #endregion #endif } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 218038942..154d4d265 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -727,40 +727,99 @@ public string FanProfileID return string.Empty; } } - - public async Task AfterStartMining() + public string ELPProfile { - //TODO IF DELTA, IF ALREADY SET, IF NOT SET DONT RESTART ETC - //TODO NO RETURNS BC WE CAN SET MULTIPLE THINGS - var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); - if (testTarget == null) return; - if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change - { - var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCTestProfile, true, false); - if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) State = DeviceState.Testing; - return; - } - if (testTarget.ActiveOCTestProfile == null && State == DeviceState.Testing) - { - var ret = await testTarget.ResetOcForDevice(true); - State = DeviceState.Mining; - return; - } - if (testTarget.ActiveOCProfile != null) + get { - var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCProfile, false, false); - return; + var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); + if (testTarget != null) + { + return testTarget.ELPProfile; + } + return string.Empty; } - if (testTarget.ActiveOCProfile == null) + } + public string ELPProfileID + { + get { - var ret = await testTarget.ResetOcForDevice(false); - return; + var testTarget = AlgorithmSettings.FirstOrDefault(a => a.IsCurrentlyMining); + if (testTarget != null) + { + return testTarget.ELPProfileID; + } + return string.Empty; } - if(testTarget.ActiveELPTestProfile!= null) + } + + public async Task AfterStartMining() //todo make a queue or something!!!! + { + //TODO IF DELTA, IF ALREADY SET, IF NOT SET DONT RESTART ETC + //TODO NO RETURNS BC WE CAN SET MULTIPLE THINGS + var target = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); + if (target == null) return; + foreach(var action in target.RigManagementActions) { - var ret = await testTarget.SetELPForDevice(testTarget.ActiveELPTestProfile, true, false); - return; + switch (action) + { + case AlgorithmContainer.ActionQueue.ApplyOC: + await target.SetOcForDevice(target.ActiveOCProfile, false, false); + break; + case AlgorithmContainer.ActionQueue.ApplyOcTest: + var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); + if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + break; + case AlgorithmContainer.ActionQueue.ResetOC: + var resetOC = await target.ResetOcForDevice(); + State = DeviceState.Mining; + break; + //case AlgorithmContainer.ActionQueue.ApplyELP: + // break; + //case AlgorithmContainer.ActionQueue.ApplyELPTest: + // break; + case AlgorithmContainer.ActionQueue.ApplyFan: + //await target.SetTargetFanForDevice(target.ActiveFanProfile, false, false); + break; + case AlgorithmContainer.ActionQueue.ApplyFanTest: + //var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, true, false); + //if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + break; + case AlgorithmContainer.ActionQueue.ResetFan: + //var resetFan = await target.ResetFanForDevice(); + break; + } } + //if(IsTesting) + //{ + // State = DeviceState.Testing; + //} + //if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change + //{ + // var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCTestProfile, true, false); + // if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) State = DeviceState.Testing; + // return; + //} + //if (testTarget.ActiveOCTestProfile == null && State == DeviceState.Testing) // this is a problem + //{ + // var ret = await testTarget.ResetOcForDevice(true); + // State = DeviceState.Mining; + // return; + //} + //if (testTarget.ActiveOCProfile != null) + //{ + // var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCProfile, false, false); + // return; + //} + //if (testTarget.ActiveOCProfile == null) + //{ + // var ret = await testTarget.ResetOcForDevice(false); + // return; + //} + //if(testTarget.ActiveELPTestProfile!= null) // not the place for ELP + //{ + // //var ret = await testTarget.SetELPForDevice(testTarget.ActiveELPTestProfile, true, false); + // return; + //} } public void SetFanSpeedWithPidController() diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index 1f6db3f7a..c09733362 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -956,22 +956,14 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary properties, JArray values) Get "Miner" => $"{GetDevicePlugin(d.Uuid)}", "OC profile" => $"{d.OCProfile}", "OC profile ID" => $"{d.OCProfileID}", - "Fan profile" => $"{d.FanProfile}", //TODO + "Fan profile" => $"{d.FanProfile}", "Fan profile ID" => $"{d.FanProfileID}", - "ELP profile" => $"", //TODO - "ELP profile ID" => $"", + "ELP profile" => $"{d.ELPProfile}", + "ELP profile ID" => $"{d.ELPProfileID}", _ => null, }; diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 3df2b953f..7e55246df 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -716,7 +716,7 @@ async Task systemDump() NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionProfilesBundleSet: - var bundle = JsonConvert.DeserializeObject(parameters); + var bundle = JsonConvert.DeserializeObject(parameters); //parsing problem here!!!!, backend must fix it!!!! ExecuteProfilesBundleSet(bundle); break; case SupportedAction.ActionProfilesBundleReset: @@ -747,6 +747,7 @@ async Task systemDump() (err, result) = ExecuteELPTest(deviceUUID, elp).Result; break; case SupportedAction.ActionElpProfileTestStop: + (err, result) = StopELPTestForDevice(deviceUUID).Result; break; default: NHLog.Warn(_logTag, "This type of action is unsupported: " + typeOfAction); @@ -776,7 +777,7 @@ private static Task ExecuteProfilesBundleSet(Bundle bundle) } if (bundle.ElpBundles != null) { - //ExecuteELPBundles(bundle.ElpBundles); + var retELP = ELPManager.Instance.ApplyELPBundle(bundle.ElpBundles); } return Task.CompletedTask; } @@ -785,6 +786,7 @@ private static Task ExecuteProfilesBundleReset() BundleManager.ResetBundleInfo(); var retOC = OCManager.Instance.ResetOcBundle(); var retFan = FanManager.Instance.ResetFanBundle(); + var retElp = ELPManager.Instance.ResetELPBundle(); return Task.CompletedTask; } private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) @@ -804,6 +806,12 @@ private static Task ExecuteProfilesBundleReset() var res = ELPManager.Instance.ExecuteTest(deviceUUID, elpBundle); return Task.FromResult(res.Result); } + private static Task<(ErrorCode err, string msg)> StopELPTestForDevice(string deviceUUID) + { + //if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + var res = ELPManager.Instance.StopTest(deviceUUID); + return Task.FromResult(res.Result); + } private static Task<(ErrorCode err, string msg)> ExecuteFanTest(string deviceUUID, FanBundle fanBundle) { diff --git a/src/NiceHashMiner/ViewModels/MainVM.cs b/src/NiceHashMiner/ViewModels/MainVM.cs index 2e48bf7ba..81f7f243f 100644 --- a/src/NiceHashMiner/ViewModels/MainVM.cs +++ b/src/NiceHashMiner/ViewModels/MainVM.cs @@ -489,6 +489,7 @@ public async Task InitializeNhm(IStartupLoader sl) ELPManager.ELPReiteration += ELPReScan; ReadELPConfigsOrCreateIfMissing(); ELPManager.IterateSubModelsAndConstructELPs(); + BundleManager.Init(); //must be called after elpmanager stuff if (MiningSettings.Instance.AutoStartMining) await StartMining(); } From f859ccb14ae74bba3f8435033d286fd7095bdb08 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 14 Dec 2022 15:03:33 +0100 Subject: [PATCH 034/224] testing OC+ELP --- src/NHMCore/Configs/Managers/ELPManager.cs | 6 +- src/NHMCore/Configs/Managers/FanManager.cs | 6 +- src/NHMCore/Configs/Managers/OCManager.cs | 6 +- src/NHMCore/Mining/AlgorithmContainer.cs | 165 ++++++++++++++++++--- src/NHMCore/Mining/ComputeDevice.cs | 61 +++----- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 18 ++- 6 files changed, 185 insertions(+), 77 deletions(-) diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 1a373a192..a2b4b7504 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -349,12 +349,12 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task<(ErrorCode err, string msg)> StopTest(string uuid) + public Task<(ErrorCode err, string msg)> StopTest(string uuid, bool triggerSwitch) { var targetDeviceContainer = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .SelectMany(d => d.AlgorithmSettings)? - .Where(a => a.IsTesting)? + .Where(a => a.IsTesting || a.ActiveELPTestProfile != null)? .FirstOrDefault(); if (targetDeviceContainer == null) { @@ -362,7 +362,7 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } targetDeviceContainer.SetTargetElpTestProfile(null); - MiningManager.TriggerSwitchCheck(); + if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } public Task<(ErrorCode err, string msg)> ApplyELPBundle(List bundles) diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index d33665cd2..219124edb 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -56,19 +56,19 @@ public enum FanReturn MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task<(ErrorCode err, string msg)> StopTest(string uuid) + public Task<(ErrorCode err, string msg)> StopTest(string uuid, bool triggerSwitch) { var targetDeviceContainer = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .SelectMany(d => d.AlgorithmSettings)? - .Where(a => a.IsTesting)? + .Where(a => a.IsTesting || a.ActiveFanTestProfile != null)? .FirstOrDefault(); if (targetDeviceContainer == null) { Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - targetDeviceContainer.SetTargetFanTestProfile(null); + if(triggerSwitch) targetDeviceContainer.SetTargetFanTestProfile(null); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index d68a2c8bd..a36567865 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -60,12 +60,12 @@ public enum OcReturn MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task<(ErrorCode err, string msg)> StopTest(string uuid) + public Task<(ErrorCode err, string msg)> StopTest(string uuid, bool triggerSwitch) { var targetDeviceContainer = AvailableDevices.Devices .Where(d => d.B64Uuid == uuid)? .SelectMany(d => d.AlgorithmSettings)? - .Where(a => a.IsTesting)? + .Where(a => a.IsTesting || a.ActiveOCTestProfile != null)? .FirstOrDefault(); if (targetDeviceContainer == null) { @@ -73,7 +73,7 @@ public enum OcReturn return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } targetDeviceContainer.SetTargetOcTestProfile(null); - MiningManager.TriggerSwitchCheck(); + if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } public Task<(ErrorCode err, string msg)> ApplyOcBundle(List bundles) diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 33eba4843..d6367edf4 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -574,6 +574,7 @@ void SettingsChanged(object sender, EventArgs e) } } #if NHMWS4 + private readonly object _lock = new object(); public enum ActionQueue { ApplyOcTest, @@ -586,17 +587,40 @@ public enum ActionQueue ApplyELP, ResetELP } - public Queue RigManagementActions = new Queue(); //THREAD SAFETY + private Queue _rigManagementActions = new Queue(); + public Queue RigManagementActions + { + get + { + lock (_lock) + { + return _rigManagementActions; + } + } + set + { + lock (_lock) + { + _rigManagementActions = value; + } + } + } private bool _IsTesting = false; public bool IsTesting { get { - return _IsTesting; + lock (_lock) + { + return _IsTesting; + } } set { - _IsTesting = value; + lock (_lock) + { + _IsTesting = value; + } } } #region OC @@ -620,26 +644,60 @@ public string OCProfileID private OcBundle _ActiveOCTestProfile = null; - public OcBundle ActiveOCTestProfile => _ActiveOCTestProfile; - private OcBundle TestOcProfilePrev { get; set; } - + public OcBundle ActiveOCTestProfile + { + get + { + lock (_lock) + { + return _ActiveOCTestProfile; + } + } + set + { + lock (_lock) + { + _ActiveOCTestProfile = value; + } + } + } private OcBundle _ActiveOCProfile = null; - public OcBundle ActiveOCProfile => _ActiveOCProfile; - private OcBundle OcProfilePrev { get; set; } - + public OcBundle ActiveOCProfile + { + get + { + lock (_lock) + { + return _ActiveOCProfile; + } + } + set + { + lock (_lock) + { + _ActiveOCProfile = value; + } + } + } public void SetTargetOcTestProfile(OcBundle profile) { IsTesting = profile == null ? false : true; - TestOcProfilePrev = ActiveOCTestProfile; _ActiveOCTestProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOcTest); } public void SetTargetOcProfile(OcBundle profile) { - OcProfilePrev = ActiveOCProfile; _ActiveOCProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } + public void SwitchOCTestToInactive() + { + _ActiveOCTestProfile = null; + } + public void SwitchOCToInactive() + { + _ActiveOCProfile = null; + } public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) { if(bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); @@ -717,32 +775,95 @@ public string ELPProfileID } } private ElpBundle _ActiveELPTestProfile = null; - public ElpBundle ActiveELPTestProfile => _ActiveELPTestProfile; - private ElpBundle TestELPProfilePrev { get; set; } - + public ElpBundle ActiveELPTestProfile + { + get + { + lock (_lock) + { + return _ActiveELPTestProfile; + } + } + set + { + lock (_lock) + { + _ActiveELPTestProfile = value; + } + } + } private ElpBundle _ActiveELPProfile = null; - public ElpBundle ActiveELPProfile => _ActiveELPProfile; - private ElpBundle ELPProfilePrev { get; set; } - public bool NewTestProfile = false; - public bool NewProfile = false; + public ElpBundle ActiveELPProfile + { + get + { + lock (_lock) + { + return _ActiveELPProfile; + } + } + set + { + lock (_lock) + { + _ActiveELPProfile = value; + } + } + } + private bool _newTestProfile = false; + private bool _newProfile = false; + public bool NewTestProfile + { + get + { + lock (_lock) + { + return _newTestProfile; + } + } + set + { + lock(_lock) + { + _newTestProfile = value; + } + } + } + public bool NewProfile + { + get + { + lock (_lock) + { + return _newProfile; + } + } + set + { + lock (_lock) + { + _newProfile = value; + } + } + } public void ResetNewTestProfileStatus() { NewTestProfile = false; } public void ResetNewProfileStatus() { NewProfile = false; } public Task SetTargetElpTestProfile(ElpBundle profile) { IsTesting = profile == null ? false : true; - TestELPProfilePrev = ActiveELPTestProfile; _ActiveELPTestProfile = profile; NewTestProfile = true; SetELPForDevice(profile, IsTesting, profile == null);//todo change reset + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELPTest); OnPropertyChanged(nameof(IgnoreLocalELPInput)); return Task.CompletedTask; } public void SetTargetElpProfile(ElpBundle profile) { - ELPProfilePrev = ActiveELPProfile; _ActiveELPProfile = profile; NewProfile = true; SetELPForDevice(profile, false, profile == null);//todo change reset + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); OnPropertyChanged(nameof(IgnoreLocalELPInput)); } public Task SetELPForDevice(ElpBundle bundle, bool test = false, bool reset = false) @@ -785,21 +906,17 @@ public string FanProfileID } private FanBundle _activeFanTestProfile = null; public FanBundle ActiveFanTestProfile => _activeFanTestProfile; - private FanBundle TestFanProfilePrev { get; set; } private FanBundle _activeFanProfile = null; public FanBundle ActiveFanProfile => _activeFanProfile; - private FanBundle FanProfilePrev { get; set; } public void SetTargetFanTestProfile(FanBundle profile) { IsTesting = profile == null ? false : true; - TestFanProfilePrev = ActiveFanTestProfile; _activeFanTestProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFanTest); } public void SetTargetFanProfile(FanBundle profile) { - FanProfilePrev = ActiveFanProfile; _activeFanProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 154d4d265..e1e6a56e5 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -752,31 +752,39 @@ public string ELPProfileID } } - public async Task AfterStartMining() //todo make a queue or something!!!! + public async Task AfterStartMining() { //TODO IF DELTA, IF ALREADY SET, IF NOT SET DONT RESTART ETC //TODO NO RETURNS BC WE CAN SET MULTIPLE THINGS + //TODO THREAD SAFETY var target = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (target == null) return; + + //if elp bundle then do a reset before applying new thing foreach(var action in target.RigManagementActions) { switch (action) { case AlgorithmContainer.ActionQueue.ApplyOC: - await target.SetOcForDevice(target.ActiveOCProfile, false, false); + var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); + if(retOc == OcReturn.Fail) + { + target.SwitchOCToInactive(); + } break; case AlgorithmContainer.ActionQueue.ApplyOcTest: var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + else + { + target.SwitchOCTestToInactive(); + } break; case AlgorithmContainer.ActionQueue.ResetOC: var resetOC = await target.ResetOcForDevice(); - State = DeviceState.Mining; + //if not mining and reset will state be mining? + State = DeviceState.Mining;//this comes after the elp set so it is a problemo!!! break; - //case AlgorithmContainer.ActionQueue.ApplyELP: - // break; - //case AlgorithmContainer.ActionQueue.ApplyELPTest: - // break; case AlgorithmContainer.ActionQueue.ApplyFan: //await target.SetTargetFanForDevice(target.ActiveFanProfile, false, false); break; @@ -787,39 +795,16 @@ public async Task AfterStartMining() //todo make a queue or something!!!! case AlgorithmContainer.ActionQueue.ResetFan: //var resetFan = await target.ResetFanForDevice(); break; + case AlgorithmContainer.ActionQueue.ApplyELP: + break; + case AlgorithmContainer.ActionQueue.ApplyELPTest: + State = DeviceState.Testing; + break; + case AlgorithmContainer.ActionQueue.ResetELP: + break; } } - //if(IsTesting) - //{ - // State = DeviceState.Testing; - //} - //if (testTarget.ActiveOCTestProfile != null)//todo if starting... if change - //{ - // var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCTestProfile, true, false); - // if (ret == OcReturn.Success || ret == OcReturn.PartialSuccess) State = DeviceState.Testing; - // return; - //} - //if (testTarget.ActiveOCTestProfile == null && State == DeviceState.Testing) // this is a problem - //{ - // var ret = await testTarget.ResetOcForDevice(true); - // State = DeviceState.Mining; - // return; - //} - //if (testTarget.ActiveOCProfile != null) - //{ - // var ret = await testTarget.SetOcForDevice(testTarget.ActiveOCProfile, false, false); - // return; - //} - //if (testTarget.ActiveOCProfile == null) - //{ - // var ret = await testTarget.ResetOcForDevice(false); - // return; - //} - //if(testTarget.ActiveELPTestProfile!= null) // not the place for ELP - //{ - // //var ret = await testTarget.SetELPForDevice(testTarget.ActiveELPTestProfile, true, false); - // return; - //} + target.RigManagementActions.Clear(); } public void SetFanSpeedWithPidController() diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 7e55246df..b2155068b 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -737,6 +737,8 @@ async Task systemDump() break; case SupportedAction.ActionFanProfileTest: var fan = JsonConvert.DeserializeObject(parameters); + StopOCTestForDevice(deviceUUID); + StopELPTestForDevice(deviceUUID); (err, result) = ExecuteFanTest(deviceUUID, fan).Result; break; case SupportedAction.ActionFanProfileTestStop: @@ -792,24 +794,28 @@ private static Task ExecuteProfilesBundleReset() private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + StopELPTestForDevice(deviceUUID, false); + StopFanTestForDevice(deviceUUID, false); var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); return Task.FromResult(res.Result); } - private static Task<(ErrorCode err, string msg)> StopOCTestForDevice(string deviceUUID) + private static Task<(ErrorCode err, string msg)> StopOCTestForDevice(string deviceUUID, bool triggerSwitch = true) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); - var res = OCManager.Instance.StopTest(deviceUUID); + var res = OCManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } private static Task<(ErrorCode err, string msg)> ExecuteELPTest(string deviceUUID, ElpBundle elpBundle) { + StopFanTestForDevice(deviceUUID, false); + StopOCTestForDevice(deviceUUID, false); var res = ELPManager.Instance.ExecuteTest(deviceUUID, elpBundle); return Task.FromResult(res.Result); } - private static Task<(ErrorCode err, string msg)> StopELPTestForDevice(string deviceUUID) + private static Task<(ErrorCode err, string msg)> StopELPTestForDevice(string deviceUUID, bool triggerSwitch = true) { //if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); - var res = ELPManager.Instance.StopTest(deviceUUID); + var res = ELPManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } @@ -820,10 +826,10 @@ private static Task ExecuteProfilesBundleReset() return Task.FromResult(res.Result); } - private static Task<(ErrorCode err, string msg)> StopFanTestForDevice(string deviceUUID) + private static Task<(ErrorCode err, string msg)> StopFanTestForDevice(string deviceUUID, bool triggerSwitch = true) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); - var res = FanManager.Instance.StopTest(deviceUUID); + var res = FanManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } private static Task SetMutable(MinerSetMutable mutableCmd) From 60ad7c8185f9bbac954e604a70a6712fa14548cd Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 15 Dec 2022 14:58:59 +0100 Subject: [PATCH 035/224] changing afterstartmining --- src/NHMCore/Configs/Managers/ELPManager.cs | 4 +- src/NHMCore/Configs/Managers/FanManager.cs | 4 +- src/NHMCore/Configs/Managers/OCManager.cs | 4 +- src/NHMCore/Mining/AlgorithmContainer.cs | 45 ++++++------ src/NHMCore/Mining/ComputeDevice.cs | 82 ++++++++++++++++------ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 13 ++-- 6 files changed, 97 insertions(+), 55 deletions(-) diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index a2b4b7504..2ee86e893 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -414,14 +414,14 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task ResetELPBundle() + public Task ResetELPBundle(bool triggerSwitch = true) { var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var container in containers) { container.SetTargetElpProfile(null); } - MiningManager.TriggerSwitchCheck(); + if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } #endif diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index 219124edb..1c0bde591 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -121,14 +121,14 @@ public enum FanReturn return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task ResetFanBundle() + public Task ResetFanBundle(bool triggerSwitch = true) { var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var container in containers) { container.SetTargetFanProfile(null); } - MiningManager.TriggerSwitchCheck(); + if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } } diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index a36567865..47bcb4e77 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -125,14 +125,14 @@ public enum OcReturn return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task ResetOcBundle() + public Task ResetOcBundle(bool triggerSwitch = true) { var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var container in containers) { container.SetTargetOcProfile(null); } - MiningManager.TriggerSwitchCheck(); + if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index d6367edf4..1eeb91fc6 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -411,7 +411,8 @@ public string CurPayingRatioStr /// Power consumption of this algorithm, in Watts /// private double _powerUsage = 0; - public virtual double PowerUsage { + public virtual double PowerUsage + { get { return _powerUsage; @@ -575,17 +576,18 @@ void SettingsChanged(object sender, EventArgs e) } #if NHMWS4 private readonly object _lock = new object(); + public bool HasTestTarget() + { + return ActiveFanTestProfile != null || ActiveOCTestProfile != null || ActiveELPTestProfile != null; + } public enum ActionQueue { - ApplyOcTest, ApplyOC, ResetOC, - ApplyFanTest, ApplyFan, ResetFan, - ApplyELPTest, ApplyELP, - ResetELP + ResetELP, } private Queue _rigManagementActions = new Queue(); public Queue RigManagementActions @@ -624,7 +626,8 @@ public bool IsTesting } } #region OC - public string OCProfile { + public string OCProfile + { get { if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Name; @@ -644,7 +647,7 @@ public string OCProfileID private OcBundle _ActiveOCTestProfile = null; - public OcBundle ActiveOCTestProfile + public OcBundle ActiveOCTestProfile { get { @@ -683,7 +686,7 @@ public void SetTargetOcTestProfile(OcBundle profile) { IsTesting = profile == null ? false : true; _ActiveOCTestProfile = profile; - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOcTest); + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } public void SetTargetOcProfile(OcBundle profile) { @@ -700,7 +703,7 @@ public void SwitchOCToInactive() } public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) { - if(bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); + if (bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = OcReturn.Fail; int valuesToSet = 0; if (bundle.CoreClock > 0) valuesToSet++; @@ -741,7 +744,7 @@ public Task SetOcForDevice(OcBundle bundle, bool test = false, bool re Logger.Warn(_TAG, $"Setting OC is successful"); return Task.FromResult(ret); } - if(test) IsTesting = false; + if (test) IsTesting = false; Logger.Warn(_TAG, $"OC not in test mode anymore"); return Task.FromResult(ret); } @@ -756,6 +759,7 @@ public Task ResetOcForDevice() } #endregion #region ELP + public string DelayedELPString = string.Empty; public string ELPProfile { get @@ -823,7 +827,7 @@ public bool NewTestProfile } set { - lock(_lock) + lock (_lock) { _newTestProfile = value; } @@ -853,8 +857,8 @@ public Task SetTargetElpTestProfile(ElpBundle profile) IsTesting = profile == null ? false : true; _ActiveELPTestProfile = profile; NewTestProfile = true; - SetELPForDevice(profile, IsTesting, profile == null);//todo change reset - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELPTest); + SetELPForDevice(IsTesting, profile == null);//todo change reset + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); OnPropertyChanged(nameof(IgnoreLocalELPInput)); return Task.CompletedTask; } @@ -862,19 +866,21 @@ public void SetTargetElpProfile(ElpBundle profile) { _ActiveELPProfile = profile; NewProfile = true; - SetELPForDevice(profile, false, profile == null);//todo change reset + SetELPForDevice(false, profile == null);//todo change reset RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); OnPropertyChanged(nameof(IgnoreLocalELPInput)); } - public Task SetELPForDevice(ElpBundle bundle, bool test = false, bool reset = false) + public Task SetELPForDevice(bool test = false, bool reset = false) { - if (bundle != null) Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={bundle.Elp}"); var ret = OcReturn.Success; - if (!reset) { if (test) IsTesting = true; - ELPManager.Instance.SetAlgoCMDString(this, bundle.Elp); + var cmd = string.Empty; + if (ActiveELPProfile != null) cmd = ActiveELPProfile.Elp; + if (ActiveELPTestProfile != null) cmd = ActiveELPTestProfile.Elp; + Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={cmd}"); + ELPManager.Instance.SetAlgoCMDString(this, cmd); Logger.Warn(_TAG, $"Setting ELP is successful"); return Task.FromResult(ret); @@ -912,9 +918,8 @@ public void SetTargetFanTestProfile(FanBundle profile) { IsTesting = profile == null ? false : true; _activeFanTestProfile = profile; - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFanTest); + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); } - public void SetTargetFanProfile(FanBundle profile) { _activeFanProfile = profile; diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index e1e6a56e5..b70ca361b 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -754,30 +754,28 @@ public string ELPProfileID public async Task AfterStartMining() { - //TODO IF DELTA, IF ALREADY SET, IF NOT SET DONT RESTART ETC - //TODO NO RETURNS BC WE CAN SET MULTIPLE THINGS - //TODO THREAD SAFETY var target = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (target == null) return; - //if elp bundle then do a reset before applying new thing - foreach(var action in target.RigManagementActions) + + //this method eliminates multiple times calls + //we can iterate if we have anything to apply later + foreach (var action in target.RigManagementActions) { switch (action) { case AlgorithmContainer.ActionQueue.ApplyOC: - var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); - if(retOc == OcReturn.Fail) + if (target.HasTestTarget() && target.ActiveOCTestProfile != null) { - target.SwitchOCToInactive(); + var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); + if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + else target.SwitchOCTestToInactive(); + break; } - break; - case AlgorithmContainer.ActionQueue.ApplyOcTest: - var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); - if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; - else + var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); + if (retOc == OcReturn.Fail) { - target.SwitchOCTestToInactive(); + target.SwitchOCToInactive(); } break; case AlgorithmContainer.ActionQueue.ResetOC: @@ -786,25 +784,63 @@ public async Task AfterStartMining() State = DeviceState.Mining;//this comes after the elp set so it is a problemo!!! break; case AlgorithmContainer.ActionQueue.ApplyFan: - //await target.SetTargetFanForDevice(target.ActiveFanProfile, false, false); - break; - case AlgorithmContainer.ActionQueue.ApplyFanTest: - //var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, true, false); - //if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; break; case AlgorithmContainer.ActionQueue.ResetFan: - //var resetFan = await target.ResetFanForDevice(); break; case AlgorithmContainer.ActionQueue.ApplyELP: break; - case AlgorithmContainer.ActionQueue.ApplyELPTest: - State = DeviceState.Testing; - break; case AlgorithmContainer.ActionQueue.ResetELP: break; } } target.RigManagementActions.Clear(); + + ////this method eliminates multiple times calls + ////we can iterate if we have anything to apply later + //foreach (var action in target.RigManagementActions) + //{ + // switch (action) + // { + // case AlgorithmContainer.ActionQueue.ApplyOC: + // var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); + // if (retOc == OcReturn.Fail) + // { + // target.SwitchOCToInactive(); + // } + // break; + // case AlgorithmContainer.ActionQueue.ApplyOcTest: + // var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); + // if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + // else + // { + // target.SwitchOCTestToInactive(); + // } + // break; + // case AlgorithmContainer.ActionQueue.ResetOC: + // var resetOC = await target.ResetOcForDevice(); + // //if not mining and reset will state be mining? + // State = DeviceState.Mining;//this comes after the elp set so it is a problemo!!! + // break; + // case AlgorithmContainer.ActionQueue.ApplyFan: + // //await target.SetTargetFanForDevice(target.ActiveFanProfile, false, false); + // break; + // case AlgorithmContainer.ActionQueue.ApplyFanTest: + // //var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, true, false); + // //if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + // break; + // case AlgorithmContainer.ActionQueue.ResetFan: + // //var resetFan = await target.ResetFanForDevice(); + // break; + // case AlgorithmContainer.ActionQueue.ApplyELP: + // break; + // case AlgorithmContainer.ActionQueue.ApplyELPTest: + // State = DeviceState.Testing; + // break; + // case AlgorithmContainer.ActionQueue.ResetELP: + // break; + // } + //} + //target.RigManagementActions.Clear(); } public void SetFanSpeedWithPidController() diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index b2155068b..b3fe3228e 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -716,7 +716,8 @@ async Task systemDump() NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionProfilesBundleSet: - var bundle = JsonConvert.DeserializeObject(parameters); //parsing problem here!!!!, backend must fix it!!!! + var bundle = JsonConvert.DeserializeObject(parameters); + ExecuteProfilesBundleReset(false); ExecuteProfilesBundleSet(bundle); break; case SupportedAction.ActionProfilesBundleReset: @@ -737,7 +738,7 @@ async Task systemDump() break; case SupportedAction.ActionFanProfileTest: var fan = JsonConvert.DeserializeObject(parameters); - StopOCTestForDevice(deviceUUID); + StopOCTestForDevice(deviceUUID); //todo change as the others StopELPTestForDevice(deviceUUID); (err, result) = ExecuteFanTest(deviceUUID, fan).Result; break; @@ -783,12 +784,12 @@ private static Task ExecuteProfilesBundleSet(Bundle bundle) } return Task.CompletedTask; } - private static Task ExecuteProfilesBundleReset() + private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) { BundleManager.ResetBundleInfo(); - var retOC = OCManager.Instance.ResetOcBundle(); - var retFan = FanManager.Instance.ResetFanBundle(); - var retElp = ELPManager.Instance.ResetELPBundle(); + var retOC = OCManager.Instance.ResetOcBundle(triggerSwitch); + var retFan = FanManager.Instance.ResetFanBundle(triggerSwitch); + var retElp = ELPManager.Instance.ResetELPBundle(triggerSwitch); return Task.CompletedTask; } private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) From aa31921a57d312a4867ac3229a5d8e7c6338ecae Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 20 Dec 2022 14:56:47 +0100 Subject: [PATCH 036/224] solving problem of mining status --- src/NHMCore/Configs/Managers/BundleManager.cs | 2 +- src/NHMCore/Configs/Managers/ELPManager.cs | 18 +-- src/NHMCore/Configs/Managers/FanManager.cs | 18 +-- src/NHMCore/Configs/Managers/OCManager.cs | 18 +-- src/NHMCore/Mining/AlgorithmContainer.cs | 126 +++++++++--------- src/NHMCore/Mining/ComputeDevice.cs | 62 ++------- src/NHMCore/Mining/MiningManager.cs | 4 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 4 +- 8 files changed, 102 insertions(+), 150 deletions(-) diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index 43b7030f3..abf0b3d5d 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -32,9 +32,9 @@ public static void Init() { var path = Paths.AppRootPath("bundle.json"); if (!File.Exists(path)) File.Create(path); - var content = File.ReadAllText(path); try { + var content = File.ReadAllText(path); var bundleToApply = JsonConvert.DeserializeObject(content); if(bundleToApply != null) { diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 2ee86e893..d5b833f77 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -339,13 +339,13 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future - .Where(d => d.B64Uuid == uuid)? - .SelectMany(d => d.AlgorithmSettings)? - .ToList()? - .ForEach(c => c.IsTesting = false); + //AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future + // .Where(d => d.B64Uuid == uuid)? + // .SelectMany(d => d.AlgorithmSettings)? + // .ToList()? + // .ForEach(c => c.IsTesting = false); - target.SetTargetElpTestProfile(bundle); + target.SetTargetElpProfile(bundle, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } @@ -361,7 +361,7 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) Logger.Error(_TAG, "Device not found for stop ELP test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - targetDeviceContainer.SetTargetElpTestProfile(null); + targetDeviceContainer.SetTargetElpProfile(null, true); if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } @@ -407,7 +407,7 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) foreach (var container in current) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - container.SetTargetElpProfile(bundle); + container.SetTargetElpProfile(bundle, false); } } MiningManager.TriggerSwitchCheck(); @@ -419,7 +419,7 @@ public Task ResetELPBundle(bool triggerSwitch = true) var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var container in containers) { - container.SetTargetElpProfile(null); + container.SetTargetElpProfile(null, false); } if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index 1c0bde591..50f0eb393 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -47,12 +47,12 @@ public enum FanReturn target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future - .Where(d => d.B64Uuid == uuid)? - .SelectMany(d => d.AlgorithmSettings)? - .ToList()? - .ForEach(c => c.IsTesting = false); - target.SetTargetFanTestProfile(bundle); + //AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future + // .Where(d => d.B64Uuid == uuid)? + // .SelectMany(d => d.AlgorithmSettings)? + // .ToList()? + // .ForEach(c => c.IsTesting = false); + target.SetTargetFanProfile(bundle, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } @@ -68,7 +68,7 @@ public enum FanReturn Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - if(triggerSwitch) targetDeviceContainer.SetTargetFanTestProfile(null); + if(triggerSwitch) targetDeviceContainer.SetTargetFanProfile(null, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } @@ -114,7 +114,7 @@ public enum FanReturn foreach (var container in current) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - container.SetTargetFanProfile(bundle); + container.SetTargetFanProfile(bundle, false); } } MiningManager.TriggerSwitchCheck(); @@ -126,7 +126,7 @@ public Task ResetFanBundle(bool triggerSwitch = true) var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var container in containers) { - container.SetTargetFanProfile(null); + container.SetTargetFanProfile(null, false); } if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 47bcb4e77..e8fbbf04c 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -51,12 +51,12 @@ public enum OcReturn target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future - .Where(d => d.B64Uuid == uuid)? - .SelectMany(d => d.AlgorithmSettings)? - .ToList()? - .ForEach(c => c.IsTesting = false); - target.SetTargetOcTestProfile(bundle); + //AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future + // .Where(d => d.B64Uuid == uuid)? + // .SelectMany(d => d.AlgorithmSettings)? + // .ToList()? + // .ForEach(c => c.IsTesting = false); + target.SetTargetOcProfile(bundle, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } @@ -72,7 +72,7 @@ public enum OcReturn Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - targetDeviceContainer.SetTargetOcTestProfile(null); + targetDeviceContainer.SetTargetOcProfile(null, true); if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } @@ -118,7 +118,7 @@ public enum OcReturn foreach (var container in current) { Logger.Warn(_TAG, $"\t{container.ComputeDevice.ID}-{container.ComputeDevice.Name}/{container.AlgorithmName}/{container.PluginName}"); - container.SetTargetOcProfile(bundle); + container.SetTargetOcProfile(bundle, false); } } MiningManager.TriggerSwitchCheck(); @@ -130,7 +130,7 @@ public Task ResetOcBundle(bool triggerSwitch = true) var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var container in containers) { - container.SetTargetOcProfile(null); + container.SetTargetOcProfile(null, false); } if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 1eeb91fc6..8024d719c 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -576,10 +576,34 @@ void SettingsChanged(object sender, EventArgs e) } #if NHMWS4 private readonly object _lock = new object(); - public bool HasTestTarget() + public enum ProfileType + { + None, + Normal, + Test, + } + public ProfileType GetTargetProfileType() + { + if (ActiveFanTestProfile != null || ActiveOCTestProfile != null || ActiveELPTestProfile != null) return ProfileType.Test; + if (ActiveFanProfile != null || ActiveOCProfile != null || ActiveELPProfile != null) return ProfileType.Normal; + return ProfileType.None; + } + public bool HasNormalProfileToSet() + { + return ActiveFanProfile != null || ActiveOCProfile != null || ActiveELPProfile != null; + } + public bool HasTestProfileToSet() { return ActiveFanTestProfile != null || ActiveOCTestProfile != null || ActiveELPTestProfile != null; } + public bool HasTestProfileAndCanSet() + { + return GetTargetProfileType() == ProfileType.Test && HasTestProfileToSet(); + } + public bool HasNormalProfileAndCanSet() + { + return GetTargetProfileType() == ProfileType.Normal && HasNormalProfileToSet(); + } public enum ActionQueue { ApplyOC, @@ -607,31 +631,14 @@ public Queue RigManagementActions } } } - private bool _IsTesting = false; - public bool IsTesting - { - get - { - lock (_lock) - { - return _IsTesting; - } - } - set - { - lock (_lock) - { - _IsTesting = value; - } - } - } + public bool IsTesting => HasTestProfileToSet(); #region OC public string OCProfile { get { if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Name; - if (ActiveOCProfile != null) return ActiveOCProfile.Name; + if (ActiveOCProfile != null && !IsTesting) return ActiveOCProfile.Name; return string.Empty; } } @@ -640,7 +647,7 @@ public string OCProfileID get { if (ActiveOCTestProfile != null) return ActiveOCTestProfile.Id; - if (ActiveOCProfile != null) return ActiveOCProfile.Id; + if (ActiveOCProfile != null && !IsTesting) return ActiveOCProfile.Id; return string.Empty; } } @@ -682,15 +689,13 @@ public OcBundle ActiveOCProfile } } } - public void SetTargetOcTestProfile(OcBundle profile) - { - IsTesting = profile == null ? false : true; - _ActiveOCTestProfile = profile; - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); - } - public void SetTargetOcProfile(OcBundle profile) + public void SetTargetOcProfile(OcBundle profile, bool test) { - _ActiveOCProfile = profile; + if (test) + { + _ActiveOCTestProfile = profile; + } + else _ActiveOCProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } public void SwitchOCTestToInactive() @@ -740,11 +745,9 @@ public Task SetOcForDevice(OcBundle bundle, bool test = false, bool re if (!reset && (ret == OcReturn.Success || ret == OcReturn.PartialSuccess)) { - if (test) IsTesting = true; Logger.Warn(_TAG, $"Setting OC is successful"); return Task.FromResult(ret); } - if (test) IsTesting = false; Logger.Warn(_TAG, $"OC not in test mode anymore"); return Task.FromResult(ret); } @@ -765,7 +768,7 @@ public string ELPProfile get { if (ActiveELPTestProfile != null) return ActiveELPTestProfile.Name; - if (ActiveELPProfile != null) return ActiveELPProfile.Name; + if (ActiveELPProfile != null && !IsTesting) return ActiveELPProfile.Name; return string.Empty; } } @@ -774,7 +777,7 @@ public string ELPProfileID get { if (ActiveELPTestProfile != null) return ActiveELPTestProfile.Id; - if (ActiveELPProfile != null) return ActiveELPProfile.Id; + if (ActiveELPProfile != null && !IsTesting) return ActiveELPProfile.Id; return string.Empty; } } @@ -852,43 +855,41 @@ public bool NewProfile } public void ResetNewTestProfileStatus() { NewTestProfile = false; } public void ResetNewProfileStatus() { NewProfile = false; } - public Task SetTargetElpTestProfile(ElpBundle profile) + public void SetTargetElpProfile(ElpBundle profile, bool test) { - IsTesting = profile == null ? false : true; - _ActiveELPTestProfile = profile; - NewTestProfile = true; - SetELPForDevice(IsTesting, profile == null);//todo change reset - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); - OnPropertyChanged(nameof(IgnoreLocalELPInput)); - return Task.CompletedTask; - } - public void SetTargetElpProfile(ElpBundle profile) - { - _ActiveELPProfile = profile; - NewProfile = true; - SetELPForDevice(false, profile == null);//todo change reset + bool isTesting = profile == null ? false : true; + if (test) + { + _ActiveELPTestProfile = profile; + _newTestProfile = true; + } + else + { + isTesting = false; + _ActiveELPProfile = profile; + _newProfile = true; + } + SetELPForDevice(isTesting, profile == null); RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); OnPropertyChanged(nameof(IgnoreLocalELPInput)); } - public Task SetELPForDevice(bool test = false, bool reset = false) + public OcReturn SetELPForDevice(bool test = false, bool reset = false) { var ret = OcReturn.Success; if (!reset) { - if (test) IsTesting = true; var cmd = string.Empty; - if (ActiveELPProfile != null) cmd = ActiveELPProfile.Elp; + if (ActiveELPProfile != null && !IsTesting) cmd = ActiveELPProfile.Elp; if (ActiveELPTestProfile != null) cmd = ActiveELPTestProfile.Elp; Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={cmd}"); ELPManager.Instance.SetAlgoCMDString(this, cmd); Logger.Warn(_TAG, $"Setting ELP is successful"); - return Task.FromResult(ret); + return ret; } - if (test) IsTesting = false; ELPManager.Instance.IterateSubModelsAndConstructELPs(); Logger.Warn(_TAG, $"ELP not in test mode anymore"); - return Task.FromResult(ret); + return ret; } #endregion #region FAN @@ -897,7 +898,7 @@ public string FanProfile get { if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Name; - if (ActiveFanProfile != null) return ActiveFanProfile.Name; + if (ActiveFanProfile != null && !IsTesting) return ActiveFanProfile.Name; return string.Empty; } } @@ -906,7 +907,7 @@ public string FanProfileID get { if (ActiveFanTestProfile != null) return ActiveFanTestProfile.Id; - if (ActiveFanProfile != null) return ActiveFanProfile.Id; + if (ActiveFanProfile != null && !IsTesting) return ActiveFanProfile.Id; return string.Empty; } } @@ -914,18 +915,15 @@ public string FanProfileID public FanBundle ActiveFanTestProfile => _activeFanTestProfile; private FanBundle _activeFanProfile = null; public FanBundle ActiveFanProfile => _activeFanProfile; - public void SetTargetFanTestProfile(FanBundle profile) + public void SetTargetFanProfile(FanBundle profile, bool test) { - IsTesting = profile == null ? false : true; - _activeFanTestProfile = profile; - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); - } - public void SetTargetFanProfile(FanBundle profile) - { - _activeFanProfile = profile; + if (test) + { + _activeFanTestProfile = profile; + } + else _activeFanProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); } - #endregion #endif } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index b70ca361b..01caa4491 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -760,12 +760,12 @@ public async Task AfterStartMining() //this method eliminates multiple times calls //we can iterate if we have anything to apply later - foreach (var action in target.RigManagementActions) + foreach (var action in target.RigManagementActions) //can be added to while in here!!!!! { switch (action) { case AlgorithmContainer.ActionQueue.ApplyOC: - if (target.HasTestTarget() && target.ActiveOCTestProfile != null) + if (target.HasTestProfileAndCanSet() && target.ActiveOCTestProfile != null) { var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; @@ -773,12 +773,9 @@ public async Task AfterStartMining() break; } var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); - if (retOc == OcReturn.Fail) - { - target.SwitchOCToInactive(); - } + if (retOc == OcReturn.Fail) target.SwitchOCToInactive(); break; - case AlgorithmContainer.ActionQueue.ResetOC: + case AlgorithmContainer.ActionQueue.ResetOC://RESET HAS IT FROM PREVIOUS...switch isnt triggered, so here it resets 2 mining var resetOC = await target.ResetOcForDevice(); //if not mining and reset will state be mining? State = DeviceState.Mining;//this comes after the elp set so it is a problemo!!! @@ -788,59 +785,16 @@ public async Task AfterStartMining() case AlgorithmContainer.ActionQueue.ResetFan: break; case AlgorithmContainer.ActionQueue.ApplyELP: + if (target.HasTestProfileAndCanSet() && target.ActiveELPTestProfile != null) + { + State = DeviceState.Testing; + } break; case AlgorithmContainer.ActionQueue.ResetELP: break; } } target.RigManagementActions.Clear(); - - ////this method eliminates multiple times calls - ////we can iterate if we have anything to apply later - //foreach (var action in target.RigManagementActions) - //{ - // switch (action) - // { - // case AlgorithmContainer.ActionQueue.ApplyOC: - // var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); - // if (retOc == OcReturn.Fail) - // { - // target.SwitchOCToInactive(); - // } - // break; - // case AlgorithmContainer.ActionQueue.ApplyOcTest: - // var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); - // if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; - // else - // { - // target.SwitchOCTestToInactive(); - // } - // break; - // case AlgorithmContainer.ActionQueue.ResetOC: - // var resetOC = await target.ResetOcForDevice(); - // //if not mining and reset will state be mining? - // State = DeviceState.Mining;//this comes after the elp set so it is a problemo!!! - // break; - // case AlgorithmContainer.ActionQueue.ApplyFan: - // //await target.SetTargetFanForDevice(target.ActiveFanProfile, false, false); - // break; - // case AlgorithmContainer.ActionQueue.ApplyFanTest: - // //var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, true, false); - // //if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; - // break; - // case AlgorithmContainer.ActionQueue.ResetFan: - // //var resetFan = await target.ResetFanForDevice(); - // break; - // case AlgorithmContainer.ActionQueue.ApplyELP: - // break; - // case AlgorithmContainer.ActionQueue.ApplyELPTest: - // State = DeviceState.Testing; - // break; - // case AlgorithmContainer.ActionQueue.ResetELP: - // break; - // } - //} - //target.RigManagementActions.Clear(); } public void SetFanSpeedWithPidController() diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index c09733362..e4c8cd293 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -941,7 +941,7 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary p.NewProfile == true || p.NewTestProfile == true); + var miningPairsWithNewProfile = miningPairs.Where(p => (p.NewProfile == true && p.HasNormalProfileAndCanSet()) || (p.NewTestProfile == true && p.HasTestProfileAndCanSet())); if (miningPairsWithNewProfile == null || miningPairsWithNewProfile.Count() == 0) continue; foreach(var item in miningPairsWithNewProfile) { @@ -951,7 +951,7 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary systemDump() break; case SupportedAction.ActionProfilesBundleSet: var bundle = JsonConvert.DeserializeObject(parameters); - ExecuteProfilesBundleReset(false); - ExecuteProfilesBundleSet(bundle); + _ = ExecuteProfilesBundleReset(false); + _ = ExecuteProfilesBundleSet(bundle); break; case SupportedAction.ActionProfilesBundleReset: ExecuteProfilesBundleReset(); From a9bd2008426aa321b0f8a087a6337e36530cd5c8 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 21 Dec 2022 14:51:13 +0100 Subject: [PATCH 037/224] fixed status updating, need to test with multiple gpus --- src/NHMCore/Configs/Managers/BundleManager.cs | 6 +- src/NHMCore/Configs/Managers/ELPManager.cs | 12 +-- src/NHMCore/Configs/Managers/FanManager.cs | 23 ++--- src/NHMCore/Configs/Managers/OCManager.cs | 11 +-- src/NHMCore/Mining/AlgorithmContainer.cs | 86 ++++++++++++------- src/NHMCore/Mining/ComputeDevice.cs | 48 ++++++++--- src/NHMCore/Mining/MiningManager.cs | 3 +- src/NHMCore/Nhmws/V4/MessagesV4.cs | 16 ++-- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 16 ++-- 9 files changed, 133 insertions(+), 88 deletions(-) diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index abf0b3d5d..c27a65c0b 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -31,7 +31,11 @@ public static void ResetBundleInfo() public static void Init() { var path = Paths.AppRootPath("bundle.json"); - if (!File.Exists(path)) File.Create(path); + if (!File.Exists(path)) + { + File.Create(path); + return; + } try { var content = File.ReadAllText(path); diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index d5b833f77..6b5ab0ae0 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -317,7 +317,7 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) } } #if NHMWS4 - public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, ElpBundle bundle) + public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, ElpProfile bundle) { if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var allContainers = AvailableDevices.Devices @@ -339,12 +339,6 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - //AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future - // .Where(d => d.B64Uuid == uuid)? - // .SelectMany(d => d.AlgorithmSettings)? - // .ToList()? - // .ForEach(c => c.IsTesting = false); - target.SetTargetElpProfile(bundle, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); @@ -365,11 +359,11 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task<(ErrorCode err, string msg)> ApplyELPBundle(List bundles) + public Task<(ErrorCode err, string msg)> ApplyELPBundle(List bundles) { if (bundles == null) return Task.FromResult((ErrorCode.NoError, "ELPBundles == null")); List processed = new(); - var sorted = new List<(int, ElpBundle)>(); + var sorted = new List<(int, ElpProfile)>(); foreach (var bundle in bundles) { if (bundle.MinerId != null && bundle.AlgoId != null) sorted.Add((0, bundle)); diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index 50f0eb393..ce17b847f 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -25,7 +25,7 @@ public enum FanReturn Fail } - public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, FanBundle bundle) + public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, FanProfile bundle) { if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var allContainers = AvailableDevices.Devices @@ -47,11 +47,6 @@ public enum FanReturn target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - //AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future - // .Where(d => d.B64Uuid == uuid)? - // .SelectMany(d => d.AlgorithmSettings)? - // .ToList()? - // .ForEach(c => c.IsTesting = false); target.SetTargetFanProfile(bundle, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); @@ -68,15 +63,15 @@ public enum FanReturn Logger.Error(_TAG, "Device not found for stop OC test"); return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } - if(triggerSwitch) targetDeviceContainer.SetTargetFanProfile(null, true); - MiningManager.TriggerSwitchCheck(); + targetDeviceContainer.SetTargetFanProfile(null, true); + if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task<(ErrorCode err, string msg)> ApplyFanBundle(List bundles) + public Task<(ErrorCode err, string msg)> ApplyFanBundle(List bundles) { if (bundles == null) return Task.FromResult((ErrorCode.NoError, "FanBundles == null")); List processed = new(); - var sorted = new List<(int, FanBundle)>(); + var sorted = new List<(int, FanProfile)>(); foreach (var bundle in bundles) { if (bundle.MinerId != null && bundle.AlgoId != null) sorted.Add((0, bundle)); @@ -91,18 +86,18 @@ public enum FanReturn if (type == 0) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? - .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? - .Where(c => bundle.MinerId.Contains(c.PluginName))? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? + .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? .ToList(); else if (type == 1) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? - .Where(c => bundle.AlgoId.Contains(c.AlgorithmName))? + .Where(c => bundle.AlgoId.Contains(c.AlgorithmName.ToLower()))? .ToList(); else if (type == 2) current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? .SelectMany(d => d.AlgorithmSettings)? - .Where(c => bundle.MinerId.Contains(c.PluginName))? + .Where(c => bundle.MinerId.Contains(c.PluginName.ToLower()))? .ToList(); else current = AvailableDevices.Devices .Where(d => d.Name == bundle.DeviceName)? diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index e8fbbf04c..64e38f97e 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -29,7 +29,7 @@ public enum OcReturn PartialSuccess, Fail } - public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcBundle bundle) + public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcProfile bundle) { if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); var allContainers = AvailableDevices.Devices @@ -51,11 +51,6 @@ public enum OcReturn target = specificContainers.FirstOrDefault(); if (target == null) return Task.FromResult((ErrorCode.TargetContainerNotFound, "Failed to switch to target algorithm container")); } - //AvailableDevices.Devices //if we want switching for loose options we can set true to specific containers in the future - // .Where(d => d.B64Uuid == uuid)? - // .SelectMany(d => d.AlgorithmSettings)? - // .ToList()? - // .ForEach(c => c.IsTesting = false); target.SetTargetOcProfile(bundle, true); MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); @@ -76,11 +71,11 @@ public enum OcReturn if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public Task<(ErrorCode err, string msg)> ApplyOcBundle(List bundles) + public Task<(ErrorCode err, string msg)> ApplyOcBundle(List bundles) { if (bundles == null) return Task.FromResult((ErrorCode.NoError, "OcBundles == null")); List processed = new(); - var sorted = new List<(int, OcBundle)>(); + var sorted = new List<(int, OcProfile)>(); foreach (var bundle in bundles) { if (bundle.MinerId != null && bundle.AlgoId != null) sorted.Add((0, bundle)); diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 8024d719c..78fd96612 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -608,10 +608,16 @@ public enum ActionQueue { ApplyOC, ResetOC, + ResetOCTest, + ApplyOCTest, ApplyFan, ResetFan, + ResetFanTest, + ApplyFanTest, ApplyELP, ResetELP, + ApplyELPTest, + ResetELPTest } private Queue _rigManagementActions = new Queue(); public Queue RigManagementActions @@ -653,8 +659,8 @@ public string OCProfileID } - private OcBundle _ActiveOCTestProfile = null; - public OcBundle ActiveOCTestProfile + private OcProfile _ActiveOCTestProfile = null; + public OcProfile ActiveOCTestProfile { get { @@ -671,8 +677,8 @@ public OcBundle ActiveOCTestProfile } } } - private OcBundle _ActiveOCProfile = null; - public OcBundle ActiveOCProfile + private OcProfile _ActiveOCProfile = null; + public OcProfile ActiveOCProfile { get { @@ -689,14 +695,18 @@ public OcBundle ActiveOCProfile } } } - public void SetTargetOcProfile(OcBundle profile, bool test) + public void SetTargetOcProfile(OcProfile profile, bool test) { if (test) { _ActiveOCTestProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOCTest : ActionQueue.ApplyOCTest); + } + else + { + _ActiveOCProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } - else _ActiveOCProfile = profile; - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } public void SwitchOCTestToInactive() { @@ -706,7 +716,7 @@ public void SwitchOCToInactive() { _ActiveOCProfile = null; } - public Task SetOcForDevice(OcBundle bundle, bool test = false, bool reset = false) + public Task SetOcForDevice(OcProfile bundle, bool reset = false) { if (bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = OcReturn.Fail; @@ -756,8 +766,8 @@ public Task ResetOcForDevice() var defCC = ComputeDevice.CoreClockRange; var defMC = ComputeDevice.MemoryClockRange; var defTDP = ComputeDevice.TDPLimits; - var bundle = new OcBundle() { CoreClock = defCC.def, MemoryClock = defMC.def, TDP = (int)defTDP.def }; - var res = SetOcForDevice(bundle, IsTesting, true); + var bundle = new OcProfile() { CoreClock = defCC.def, MemoryClock = defMC.def, TDP = (int)defTDP.def }; + var res = SetOcForDevice(bundle, true); return Task.FromResult(res.Result); } #endregion @@ -781,8 +791,8 @@ public string ELPProfileID return string.Empty; } } - private ElpBundle _ActiveELPTestProfile = null; - public ElpBundle ActiveELPTestProfile + private ElpProfile _ActiveELPTestProfile = null; + public ElpProfile ActiveELPTestProfile { get { @@ -799,8 +809,8 @@ public ElpBundle ActiveELPTestProfile } } } - private ElpBundle _ActiveELPProfile = null; - public ElpBundle ActiveELPProfile + private ElpProfile _ActiveELPProfile = null; + public ElpProfile ActiveELPProfile { get { @@ -855,25 +865,24 @@ public bool NewProfile } public void ResetNewTestProfileStatus() { NewTestProfile = false; } public void ResetNewProfileStatus() { NewProfile = false; } - public void SetTargetElpProfile(ElpBundle profile, bool test) + public void SetTargetElpProfile(ElpProfile profile, bool test) { - bool isTesting = profile == null ? false : true; if (test) { _ActiveELPTestProfile = profile; _newTestProfile = true; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELPTest : ActionQueue.ApplyELPTest); } else { - isTesting = false; _ActiveELPProfile = profile; _newProfile = true; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); } - SetELPForDevice(isTesting, profile == null); - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); + SetELPForDevice(profile == null); OnPropertyChanged(nameof(IgnoreLocalELPInput)); } - public OcReturn SetELPForDevice(bool test = false, bool reset = false) + public OcReturn SetELPForDevice(bool reset = false) { var ret = OcReturn.Success; if (!reset) @@ -884,7 +893,6 @@ public OcReturn SetELPForDevice(bool test = false, bool reset = false) Logger.Warn(_TAG, $"Setting ELP for {ComputeDevice.Name}: ELP={cmd}"); ELPManager.Instance.SetAlgoCMDString(this, cmd); Logger.Warn(_TAG, $"Setting ELP is successful"); - return ret; } ELPManager.Instance.IterateSubModelsAndConstructELPs(); @@ -911,18 +919,38 @@ public string FanProfileID return string.Empty; } } - private FanBundle _activeFanTestProfile = null; - public FanBundle ActiveFanTestProfile => _activeFanTestProfile; - private FanBundle _activeFanProfile = null; - public FanBundle ActiveFanProfile => _activeFanProfile; - public void SetTargetFanProfile(FanBundle profile, bool test) + private FanProfile _ActiveFanTestProfile = null; + public FanProfile ActiveFanTestProfile => _ActiveFanTestProfile; + private FanProfile _ActiveFanProfile = null; + public FanProfile ActiveFanProfile => _ActiveFanProfile; + public void SetTargetFanProfile(FanProfile profile, bool test) { if (test) { - _activeFanTestProfile = profile; + _ActiveFanTestProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFanTest : ActionQueue.ApplyFanTest); } - else _activeFanProfile = profile; - RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); + else + { + _ActiveFanProfile = profile; + RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); + } + } + public Task ResetFanForDevice() + { + return Task.FromResult(OcReturn.Fail); + } + public Task SetFanForDevice(FanProfile bundle, bool reset = false) + { + return Task.FromResult(OcReturn.Fail); + } + public void SwitchFanTestToInactive() + { + _ActiveFanTestProfile = null; + } + public void SwitchFanToInactive() + { + _ActiveFanProfile = null; } #endregion #endif diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 01caa4491..40558df5b 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -765,32 +765,60 @@ public async Task AfterStartMining() switch (action) { case AlgorithmContainer.ActionQueue.ApplyOC: + var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false); + if (retOc == OcReturn.Fail) target.SwitchOCToInactive(); + break; + case AlgorithmContainer.ActionQueue.ResetOC: + if (IsTesting) break; + var resetOC = await target.ResetOcForDevice(); + State = DeviceState.Mining; + break; + case AlgorithmContainer.ActionQueue.ApplyOCTest: if (target.HasTestProfileAndCanSet() && target.ActiveOCTestProfile != null) { - var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, true, false); + var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, false); if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; else target.SwitchOCTestToInactive(); break; } - var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false, false); - if (retOc == OcReturn.Fail) target.SwitchOCToInactive(); break; - case AlgorithmContainer.ActionQueue.ResetOC://RESET HAS IT FROM PREVIOUS...switch isnt triggered, so here it resets 2 mining - var resetOC = await target.ResetOcForDevice(); - //if not mining and reset will state be mining? - State = DeviceState.Mining;//this comes after the elp set so it is a problemo!!! + case AlgorithmContainer.ActionQueue.ResetOCTest: + var resetOCTest = await target.ResetOcForDevice(); + State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyFan: + var retFan = await target.SetFanForDevice(target.ActiveFanProfile, false); + if (retFan == OcReturn.Fail) target.SwitchFanToInactive(); break; case AlgorithmContainer.ActionQueue.ResetFan: + if (IsTesting) break; + var resetFan = await target.ResetFanForDevice(); + State = DeviceState.Mining; + break; + case AlgorithmContainer.ActionQueue.ApplyFanTest: + if (target.HasTestProfileAndCanSet() && target.ActiveFanTestProfile != null) + { + var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, false); + if (retFanTest == OcReturn.Success || retFanTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + else target.SwitchFanTestToInactive(); + break; + } + break; + case AlgorithmContainer.ActionQueue.ResetFanTest: + var resetFanTest = await target.ResetFanForDevice(); + State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyELP: + break; + case AlgorithmContainer.ActionQueue.ResetELP: + break; + case AlgorithmContainer.ActionQueue.ApplyELPTest: if (target.HasTestProfileAndCanSet() && target.ActiveELPTestProfile != null) { State = DeviceState.Testing; } break; - case AlgorithmContainer.ActionQueue.ResetELP: + case AlgorithmContainer.ActionQueue.ResetELPTest: break; } } @@ -824,7 +852,7 @@ public void SetFanSpeedWithPidController() } } - private void SetFanSpeed(FanBundle profile) + private void SetFanSpeed(FanProfile profile) { if (profile.Type == 1) { @@ -842,7 +870,7 @@ private void SetFanSpeed(FanBundle profile) } } - private void SetFanSpeedWithLoweringMemoryClocks(FanBundle profile) + private void SetFanSpeedWithLoweringMemoryClocks(FanProfile profile) { _pidController.SetPid(10, 0.8, 1); _pidController.SetOutputLimit(profile.MaxFanSpeed); diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index e4c8cd293..d056760a1 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -941,7 +941,8 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary (p.NewProfile == true && p.HasNormalProfileAndCanSet()) || (p.NewTestProfile == true && p.HasTestProfileAndCanSet())); + //var miningPairsWithNewProfile = miningPairs.Where(p => (p.NewProfile == true && p.HasNormalProfileAndCanSet()) || (p.NewTestProfile == true && p.HasTestProfileAndCanSet())); + var miningPairsWithNewProfile = miningPairs.Where(p => (p.NewProfile == true) || (p.NewTestProfile == true)); if (miningPairsWithNewProfile == null || miningPairsWithNewProfile.Count() == 0) continue; foreach(var item in miningPairsWithNewProfile) { diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index b2c059247..095741ce6 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -251,7 +251,7 @@ public static NhmwsAction ActionFanProfileTest(string uuid) }, ExecuteTask = async (object p) => { - if (p is FanBundle fb && fb is not null) //todo fan bundle call here + if (p is FanProfile fb && fb is not null) //todo fan bundle call here { var a = 0; } @@ -548,13 +548,13 @@ public class Bundle [JsonProperty("name")] public string Name { get; set; } [JsonProperty("oc", NullValueHandling = NullValueHandling.Ignore)] - public List? OcBundles { get; set; } + public List? OcBundles { get; set; } [JsonProperty("fan", NullValueHandling = NullValueHandling.Ignore)] - public List? FanBundles { get; set; } + public List? FanBundles { get; set; } [JsonProperty("elp", NullValueHandling = NullValueHandling.Ignore)] - public List? ElpBundles { get; set; } + public List? ElpBundles { get; set; } } - public class GenericBundle + public class GenericProfile { [JsonProperty("name")] public string Name { get; set; } @@ -568,12 +568,12 @@ public class GenericBundle public List? AlgoId { get; set; } } - public class ElpBundle : GenericBundle + public class ElpProfile : GenericProfile { [JsonProperty("elp")] public string Elp { get; set; } } - public class OcBundle : GenericBundle + public class OcProfile : GenericProfile { [JsonProperty("core_clock")] public int CoreClock { get; set; } @@ -582,7 +582,7 @@ public class OcBundle : GenericBundle [JsonProperty("power_mode")] public int TDP { get; set; } } - public class FanBundle : GenericBundle + public class FanProfile : GenericProfile { [JsonProperty("type")] public int Type { get; set; } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 1acfab74f..cebcd473d 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -730,14 +730,14 @@ async Task systemDump() NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionOcProfileTest: - var oc = JsonConvert.DeserializeObject(parameters); + var oc = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteOCTest(deviceUUID, oc).Result; break; case SupportedAction.ActionOcProfileTestStop: (err, result) = StopOCTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionFanProfileTest: - var fan = JsonConvert.DeserializeObject(parameters); + var fan = JsonConvert.DeserializeObject(parameters); StopOCTestForDevice(deviceUUID); //todo change as the others StopELPTestForDevice(deviceUUID); (err, result) = ExecuteFanTest(deviceUUID, fan).Result; @@ -746,7 +746,7 @@ async Task systemDump() (err, result) = StopFanTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionElpProfileTest: - var elp = JsonConvert.DeserializeObject(parameters); + var elp = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteELPTest(deviceUUID, elp).Result; break; case SupportedAction.ActionElpProfileTestStop: @@ -769,7 +769,6 @@ private static Task ExecuteProfilesBundleSet(Bundle bundle) { BundleManager.SetBundleInfo(bundle.Name, bundle.Id); _ = BundleManager.SaveBundle(bundle); - //todo check returns!!! if (bundle.OcBundles != null) { var retOC = OCManager.Instance.ApplyOcBundle(bundle.OcBundles); @@ -792,7 +791,7 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) var retElp = ELPManager.Instance.ResetELPBundle(triggerSwitch); return Task.CompletedTask; } - private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcBundle ocBundle) + private static Task<(ErrorCode err, string msg)> ExecuteOCTest(string deviceUUID, OcProfile ocBundle) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); StopELPTestForDevice(deviceUUID, false); @@ -806,7 +805,7 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) var res = OCManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } - private static Task<(ErrorCode err, string msg)> ExecuteELPTest(string deviceUUID, ElpBundle elpBundle) + private static Task<(ErrorCode err, string msg)> ExecuteELPTest(string deviceUUID, ElpProfile elpBundle) { StopFanTestForDevice(deviceUUID, false); StopOCTestForDevice(deviceUUID, false); @@ -815,14 +814,15 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) } private static Task<(ErrorCode err, string msg)> StopELPTestForDevice(string deviceUUID, bool triggerSwitch = true) { - //if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); var res = ELPManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } - private static Task<(ErrorCode err, string msg)> ExecuteFanTest(string deviceUUID, FanBundle fanBundle) + private static Task<(ErrorCode err, string msg)> ExecuteFanTest(string deviceUUID, FanProfile fanBundle) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + StopELPTestForDevice(deviceUUID, false); + StopOCTestForDevice(deviceUUID, false); var res = FanManager.Instance.ExecuteTest(deviceUUID, fanBundle); return Task.FromResult(res.Result); } From 16599b6709407c9aa7f234a66c489f2230198934 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 22 Dec 2022 10:05:56 +0100 Subject: [PATCH 038/224] removing unnecessary stuff --- src/NHMCore/Configs/Managers/ELPManager.cs | 8 +++ src/NHMCore/Mining/AlgorithmContainer.cs | 64 +++++++++++++++++----- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 6 ++ 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 6b5ab0ae0..73c1043df 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -418,6 +418,14 @@ public Task ResetELPBundle(bool triggerSwitch = true) if(triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } + public void RestartMiningInstance() + { + var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); + foreach(var c in containers) + { + c.TriggerELPReset(); + } + } #endif } } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 78fd96612..7e47e8ebc 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -699,22 +699,22 @@ public void SetTargetOcProfile(OcProfile profile, bool test) { if (test) { - _ActiveOCTestProfile = profile; + ActiveOCTestProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOCTest : ActionQueue.ApplyOCTest); } else { - _ActiveOCProfile = profile; + ActiveOCProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetOC : ActionQueue.ApplyOC); } } public void SwitchOCTestToInactive() { - _ActiveOCTestProfile = null; + ActiveOCTestProfile = null; } public void SwitchOCToInactive() { - _ActiveOCProfile = null; + ActiveOCProfile = null; } public Task SetOcForDevice(OcProfile bundle, bool reset = false) { @@ -869,19 +869,23 @@ public void SetTargetElpProfile(ElpProfile profile, bool test) { if (test) { - _ActiveELPTestProfile = profile; - _newTestProfile = true; + ActiveELPTestProfile = profile; + NewTestProfile = true; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELPTest : ActionQueue.ApplyELPTest); } else { - _ActiveELPProfile = profile; - _newProfile = true; + ActiveELPProfile = profile; + NewProfile = true; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); } SetELPForDevice(profile == null); OnPropertyChanged(nameof(IgnoreLocalELPInput)); } + public void TriggerELPReset() + { + NewProfile = true; + } public OcReturn SetELPForDevice(bool reset = false) { var ret = OcReturn.Success; @@ -920,19 +924,51 @@ public string FanProfileID } } private FanProfile _ActiveFanTestProfile = null; - public FanProfile ActiveFanTestProfile => _ActiveFanTestProfile; + public FanProfile ActiveFanTestProfile + { + get + { + lock (_lock) + { + return _ActiveFanTestProfile; + } + } + set + { + lock (_lock) + { + _ActiveFanTestProfile = value; + } + } + } private FanProfile _ActiveFanProfile = null; - public FanProfile ActiveFanProfile => _ActiveFanProfile; + public FanProfile ActiveFanProfile + { + get + { + lock (_lock) + { + return _ActiveFanProfile; + } + } + set + { + lock (_lock) + { + _ActiveFanProfile = value; + } + } + } public void SetTargetFanProfile(FanProfile profile, bool test) { if (test) { - _ActiveFanTestProfile = profile; + ActiveFanTestProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFanTest : ActionQueue.ApplyFanTest); } else { - _ActiveFanProfile = profile; + ActiveFanProfile = profile; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); } } @@ -946,11 +982,11 @@ public Task SetFanForDevice(FanProfile bundle, bool reset = false) } public void SwitchFanTestToInactive() { - _ActiveFanTestProfile = null; + ActiveFanTestProfile = null; } public void SwitchFanToInactive() { - _ActiveFanProfile = null; + ActiveFanProfile = null; } #endregion #endif diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index cebcd473d..3c8da7b8a 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -796,12 +796,14 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); StopELPTestForDevice(deviceUUID, false); StopFanTestForDevice(deviceUUID, false); + ELPManager.Instance.RestartMiningInstance(); var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); return Task.FromResult(res.Result); } private static Task<(ErrorCode err, string msg)> StopOCTestForDevice(string deviceUUID, bool triggerSwitch = true) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + ELPManager.Instance.RestartMiningInstance(); var res = OCManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } @@ -809,12 +811,14 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) { StopFanTestForDevice(deviceUUID, false); StopOCTestForDevice(deviceUUID, false); + ELPManager.Instance.RestartMiningInstance(); var res = ELPManager.Instance.ExecuteTest(deviceUUID, elpBundle); return Task.FromResult(res.Result); } private static Task<(ErrorCode err, string msg)> StopELPTestForDevice(string deviceUUID, bool triggerSwitch = true) { var res = ELPManager.Instance.StopTest(deviceUUID, triggerSwitch); + ELPManager.Instance.RestartMiningInstance(); return Task.FromResult(res.Result); } @@ -823,6 +827,7 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); StopELPTestForDevice(deviceUUID, false); StopOCTestForDevice(deviceUUID, false); + ELPManager.Instance.RestartMiningInstance(); var res = FanManager.Instance.ExecuteTest(deviceUUID, fanBundle); return Task.FromResult(res.Result); } @@ -830,6 +835,7 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) private static Task<(ErrorCode err, string msg)> StopFanTestForDevice(string deviceUUID, bool triggerSwitch = true) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); + ELPManager.Instance.RestartMiningInstance(); var res = FanManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } From bf9349c027b67d4fa39132359829e92e324eabdc Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 23 Dec 2022 14:12:31 +0100 Subject: [PATCH 039/224] added instance splitting --- src/NHMCore/Configs/Managers/ELPManager.cs | 8 +-- src/NHMCore/Mining/AlgorithmContainer.cs | 68 ++++++++++++++++++-- src/NHMCore/Mining/Grouping/GroupingUtils.cs | 10 ++- src/NHMCore/Mining/MiningManager.cs | 32 ++++----- 4 files changed, 85 insertions(+), 33 deletions(-) diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 73c1043df..39174a063 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -154,7 +154,7 @@ public void SetAlgoCMDString(AlgorithmContainer ac, string newCMD) .FirstOrDefault()? .Algos.Where(algo => algo.Name == ac.AlgorithmName)? .FirstOrDefault(); - if(target == null) return; + if (target == null) return; var index = target.AllCMDStrings.ToList().FindIndex(i => i.uuid == ac.ComputeDevice.Uuid); @@ -356,7 +356,7 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); } targetDeviceContainer.SetTargetElpProfile(null, true); - if(triggerSwitch) MiningManager.TriggerSwitchCheck(); + if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } public Task<(ErrorCode err, string msg)> ApplyELPBundle(List bundles) @@ -415,13 +415,13 @@ public Task ResetELPBundle(bool triggerSwitch = true) { container.SetTargetElpProfile(null, false); } - if(triggerSwitch) MiningManager.TriggerSwitchCheck(); + if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } public void RestartMiningInstance() { var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); - foreach(var c in containers) + foreach (var c in containers) { c.TriggerELPReset(); } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 7e47e8ebc..08fe6cd4d 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -805,6 +805,15 @@ public ElpProfile ActiveELPTestProfile { lock (_lock) { + if ((value != null && _ActiveELPTestProfile == null) || + (value != null && _ActiveELPTestProfile != null)) + { + ELPTestChange = true; + } + else if (value == null && _ActiveELPTestProfile != null) + { + ELPTestChange = false; + } _ActiveELPTestProfile = value; } } @@ -823,13 +832,22 @@ public ElpProfile ActiveELPProfile { lock (_lock) { + if ((value != null && _ActiveELPProfile == null) || + (value != null && _ActiveELPProfile != null)) + { + ELPChange = true; + } + else if (value == null && _ActiveELPProfile != null) + { + ELPChange = false; + } _ActiveELPProfile = value; } } } private bool _newTestProfile = false; private bool _newProfile = false; - public bool NewTestProfile + public bool NewTestELPProfile { get { @@ -846,7 +864,7 @@ public bool NewTestProfile } } } - public bool NewProfile + public bool NewELPProfile { get { @@ -863,20 +881,56 @@ public bool NewProfile } } } - public void ResetNewTestProfileStatus() { NewTestProfile = false; } - public void ResetNewProfileStatus() { NewProfile = false; } + private bool _ELPChange = false; + public bool ELPChange + { + get + { + lock (_lock) + { + return _ELPChange; + } + } + set + { + lock (_lock) + { + _ELPChange = value; + } + } + } + private bool _ELPTestChange = false; + public bool ELPTestChange + { + get + { + lock (_lock) + { + return _ELPTestChange; + } + } + set + { + lock (_lock) + { + _ELPTestChange = value; + } + } + } + public void ResetNewTestProfileStatus() { NewTestELPProfile = false; } + public void ResetNewProfileStatus() { NewELPProfile = false; } public void SetTargetElpProfile(ElpProfile profile, bool test) { if (test) { ActiveELPTestProfile = profile; - NewTestProfile = true; + NewTestELPProfile = true; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELPTest : ActionQueue.ApplyELPTest); } else { ActiveELPProfile = profile; - NewProfile = true; + NewELPProfile = true; RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetELP : ActionQueue.ApplyELP); } SetELPForDevice(profile == null); @@ -884,7 +938,7 @@ public void SetTargetElpProfile(ElpProfile profile, bool test) } public void TriggerELPReset() { - NewProfile = true; + NewELPProfile = true; } public OcReturn SetELPForDevice(bool reset = false) { diff --git a/src/NHMCore/Mining/Grouping/GroupingUtils.cs b/src/NHMCore/Mining/Grouping/GroupingUtils.cs index bf6310a0d..c5709f649 100644 --- a/src/NHMCore/Mining/Grouping/GroupingUtils.cs +++ b/src/NHMCore/Mining/Grouping/GroupingUtils.cs @@ -25,7 +25,7 @@ private static bool CanGroupAlgorithmContainer(AlgorithmContainer a, AlgorithmCo var elpNodeA = a.FindInELPTree(a.ComputeDevice.Uuid) ?? new DeviceELPData();//state? var elpNodeB = b.FindInELPTree(b.ComputeDevice.Uuid) ?? new DeviceELPData(); - return a.PluginContainer.CanGroupAlgorithmContainer(a, b) && + return a.PluginContainer.CanGroupAlgorithmContainer(a, b) && MinerExtraParameters.CheckIfCanGroup(new List>> { elpNodeA.ConstructedELPs, elpNodeB.ConstructedELPs }); } @@ -38,23 +38,21 @@ public static Dictionary> GetGroupedAlgorithmCo var groupedAlgorithms = new Dictionary>(); bool isCurrentWithinGroup(AlgorithmContainer current, List group) => group.Any(p => p.ComputeDevice.Uuid == current.ComputeDevice.Uuid); bool isAlreadyGrouped(AlgorithmContainer current) => groupedAlgorithms.Values.Any(group => isCurrentWithinGroup(current, group)); - + bool needsToBeSeparated(AlgorithmContainer current) => (current.ELPChange || current.ELPTestChange); //todo if has something to set to? foreach (var current in profitableAlgorithmContainers) { if (isAlreadyGrouped(current)) continue; - var newGroup = new List() { current }; var restInGroup = profitableAlgorithmContainers .SkipWhile(algo => current != algo) .Where(algo => !isAlreadyGrouped(algo)) - .Where(algo => CanGroupAlgorithmContainer(current, algo)); + .Where(algo => CanGroupAlgorithmContainer(current, algo)) + .Where(algo => !needsToBeSeparated(algo)); newGroup.AddRange(restInGroup); - // save newly grouped mining pairs var newGroupKey = CalcGroupedDevicesKey(newGroup, current.AlgorithmStringID); groupedAlgorithms[newGroupKey] = newGroup; } - return groupedAlgorithms; } } diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index d056760a1..8c73da96a 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -50,7 +50,7 @@ public static class MiningManager private static Dictionary _runningMiners = new Dictionary(); #endregion State for mining - + private abstract record Command { public TaskCompletionSource Tsc { get; init; } = new TaskCompletionSource(); @@ -245,7 +245,7 @@ static MiningManager() MiningSettings.Instance.PropertyChanged += MiningSettingsInstance_PropertyChanged; } - + public static void StartLoops(CancellationToken stop, string username) { _username = username; @@ -267,7 +267,7 @@ private static void MiscSettingsInstance_PropertyChanged(object sender, Property nameof(MiscSettings.UseOptimizationProfiles) => UseOptimizationProfilesChanged(), nameof(MiscSettings.ResolveNiceHashDomainsToIPs) => DNSQChanged(), _ => Task.CompletedTask, - }; + }; } private static void MiningProfitSettingsInstance_PropertyChanged(object sender, PropertyChangedEventArgs e) @@ -316,7 +316,7 @@ private static async Task HandleDeferredCommands(List def .Select(g => g.Select(c => c).ToArray()) .Select(commands => (finalCommand: commands.LastOrDefault(), redundantCommands: commands.Reverse().Skip(1))) .ToArray(); - + var redundantCommands = deviceActions .SelectMany(p => p.redundantCommands) .ToArray(); @@ -625,14 +625,14 @@ private static async Task CheckGroupingAndUpdateMiners(MainCommand command) else if (command is GPUToPauseChangedCommand gpuToPauseChangedCommand) { _deviceToPauseUuid = gpuToPauseChangedCommand.GpuUuid; - + // unpause device if not mining and not selected var devToUnpause = AvailableDevices.Devices.FirstOrDefault(d => d.Uuid != _deviceToPauseUuid && d.IsGaming == true); if (devToUnpause != null) devToUnpause.IsGaming = false; // set new selected gpu to true var newSelectedDev = AvailableDevices.GetDeviceWithUuid(_deviceToPauseUuid); - if(newSelectedDev != null) + if (newSelectedDev != null) { newSelectedDev.PauseMiningWhenGamingMode = true; ConfigManager.DeviceConfigFileCommit(newSelectedDev); @@ -669,7 +669,7 @@ or DNSQChangedCommand // START foreach (var miner in _runningMiners.Values) await miner.StartMinerTask(_stopMiningManager, _username); #if NHMWS4 - var miningDevs = AvailableDevices.Devices + var miningDevs = AvailableDevices.Devices .Where(d => d.State == DeviceState.Mining || d.State == DeviceState.Testing)? .ToList(); if (miningDevs.Any()) @@ -698,7 +698,7 @@ or DNSQChangedCommand bool skipProfitsThreshold = CheckIfShouldSkipProfitsThreshold(command); await SwichMostProfitableGroupUpMethodTask(_normalizedProfits, skipProfitsThreshold); } - else if(!_isGameRunning && _isPauseMiningWhenGamingEnabled && command is IsSteamGameRunningChangedCommand) + else if (!_isGameRunning && _isPauseMiningWhenGamingEnabled && command is IsSteamGameRunningChangedCommand) { AvailableNotifications.CreateGamingFinished(); var dev = AvailableDevices.Devices.FirstOrDefault(d => d.Uuid == _deviceToPauseUuid); @@ -724,7 +724,7 @@ or DNSQChangedCommand private static bool CheckIfShouldSkipProfitsThreshold(MainCommand command) { return MiningProfitSettings.Instance.MineRegardlessOfProfit || - command is MiningProfitSettingsChangedCommand || + command is MiningProfitSettingsChangedCommand || command is MinerRestartLoopNotifyCommand; } @@ -760,7 +760,7 @@ async private static void CheckIfIsOnSchedule() { _useScheduler = MiningSettings.Instance.UseScheduler; if (!_useScheduler) return; - if(!SchedulesManager.Instance.Schedules.Any()) return; + if (!SchedulesManager.Instance.Schedules.Any()) return; var shouldStart = false; var shouldStop = false; @@ -779,7 +779,7 @@ async private static void CheckIfIsOnSchedule() if (shouldStop && _runningMiners.Any()) { #if NHMWS4 - var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Testing ); + var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Testing); #else var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking); #endif @@ -936,15 +936,15 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary currentRunningGroups.Contains(pair.Key)).Select(pair => pair.Key).OrderBy(uuid => uuid).ToList(); var toStartMinerGroupKeys = newGroupedMiningPairs.Where(pair => !currentRunningGroups.Contains(pair.Key)).Select(pair => pair.Key).OrderBy(uuid => uuid).ToList(); var toStopMinerGroupKeys = currentRunningGroups.Where(runningKey => !newGroupedMiningPairs.Keys.Contains(runningKey)).OrderBy(uuid => uuid).ToList(); - + //resetting in case of elp profile set - foreach(var noChangeKey in noChangeGroupMinersKeys) + foreach (var noChangeKey in noChangeGroupMinersKeys) { var miningPairs = newGroupedMiningPairs[noChangeKey]; //var miningPairsWithNewProfile = miningPairs.Where(p => (p.NewProfile == true && p.HasNormalProfileAndCanSet()) || (p.NewTestProfile == true && p.HasTestProfileAndCanSet())); - var miningPairsWithNewProfile = miningPairs.Where(p => (p.NewProfile == true) || (p.NewTestProfile == true)); + var miningPairsWithNewProfile = miningPairs.Where(p => (p.NewELPProfile == true) || (p.NewTestELPProfile == true)); if (miningPairsWithNewProfile == null || miningPairsWithNewProfile.Count() == 0) continue; - foreach(var item in miningPairsWithNewProfile) + foreach (var item in miningPairsWithNewProfile) { item.ResetNewProfileStatus(); item.ResetNewTestProfileStatus(); @@ -981,7 +981,7 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary d.State == DeviceState.Mining || d.State == DeviceState.Testing)? .ToList(); - if(miningDevs.Any())//todo if miningdev uuid is contained in both start and stop then dont do? + if (miningDevs.Any())//todo if miningdev uuid is contained in both start and stop then dont do? { foreach (var dev in miningDevs) { From 5fece5f37183f228c1e7bba789aafcc86e84912f Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 3 Jan 2023 10:15:00 +0100 Subject: [PATCH 040/224] updated bundle manager --- src/NHMCore/Configs/Managers/BundleManager.cs | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index c27a65c0b..878102093 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -15,9 +15,11 @@ public static class BundleManager private static readonly string _TAG = "BundleManager"; private static string BundleName = string.Empty; private static string BundleID = string.Empty; + private static string _path = Paths.AppRootPath("bundle.json"); public static void SetBundleInfo(string name, string id) { - BundleName = name; BundleID = id; + BundleName = name; + BundleID = id; } public static (string BundleName, string BundleID) GetBundleInfo() { @@ -27,18 +29,25 @@ public static void ResetBundleInfo() { BundleName = string.Empty; BundleID = string.Empty; + try + { + File.WriteAllText(_path, string.Empty); + } + catch (Exception e) + { + Logger.Error(_TAG, e.Message); + } } public static void Init() { - var path = Paths.AppRootPath("bundle.json"); - if (!File.Exists(path)) + if (!File.Exists(_path)) { - File.Create(path); + File.Create(_path); return; } try { - var content = File.ReadAllText(path); + var content = File.ReadAllText(_path); var bundleToApply = JsonConvert.DeserializeObject(content); if(bundleToApply != null) { @@ -49,7 +58,7 @@ public static void Init() catch(Exception e) { Logger.Error(_TAG, e.Message); - File.WriteAllText(path, string.Empty); + File.WriteAllText(_path, string.Empty); } } private static void ApplyBundleOnInit(Bundle bundle) @@ -60,9 +69,8 @@ private static void ApplyBundleOnInit(Bundle bundle) } public static async Task SaveBundle(Bundle bundle) { - var path = Paths.AppRootPath("bundle.json"); var text = JsonConvert.SerializeObject(bundle); - await File.AppendAllTextAsync(path, text); + await File.AppendAllTextAsync(_path, text); } } } From e488c13e3d39d2887cd00d6b30dce99e57623190 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 4 Jan 2023 08:40:52 +0100 Subject: [PATCH 041/224] added elp input disable when set from rig manager --- src/NHMCore/ApplicationState/MiningState.cs | 22 ++++++++++++ src/NHMCore/Configs/Managers/BundleManager.cs | 2 ++ src/NHMCore/Configs/Managers/ELPManager.cs | 2 +- src/NHMCore/Mining/Grouping/GroupingUtils.cs | 15 ++++++-- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 4 +++ .../Views/ParameterOverview/AlgoItem.xaml | 4 +-- .../ParameterOverview/DeviceELPItem.xaml | 6 ++-- .../Views/ParameterOverview/MinerItem.xaml | 4 +-- .../ParameterOverview/ParameterOverview.xaml | 35 +++++++++++++++---- 9 files changed, 78 insertions(+), 16 deletions(-) diff --git a/src/NHMCore/ApplicationState/MiningState.cs b/src/NHMCore/ApplicationState/MiningState.cs index c92a6eb78..ec61235a1 100644 --- a/src/NHMCore/ApplicationState/MiningState.cs +++ b/src/NHMCore/ApplicationState/MiningState.cs @@ -17,6 +17,11 @@ private MiningState() _intProps = new NotifyPropertyChangedHelper(OnPropertyChanged); IsDemoMining = false; IsCurrentlyMining = false; + IsCurrentlyMiningOrELPFromRigManager = IsCurrentlyMining || + AvailableDevices.Devices + .SelectMany(d => d.AlgorithmSettings) + .Any(a => a.ActiveELPProfile != null || a.ActiveELPTestProfile != null); + IsNotRunningOrELP = !IsCurrentlyMiningOrELPFromRigManager; } // auto properties don't trigger NotifyPropertyChanged so add this shitty boilerplate @@ -66,6 +71,18 @@ public bool IsCurrentlyMining private set => _boolProps.Set(nameof(IsCurrentlyMining), value); } + public bool IsCurrentlyMiningOrELPFromRigManager + { + get => _boolProps.Get(nameof(IsCurrentlyMiningOrELPFromRigManager)); + private set => _boolProps.Set(nameof(IsCurrentlyMiningOrELPFromRigManager), value); + } + + public bool IsNotRunningOrELP + { + get => _boolProps.Get(nameof(IsNotRunningOrELP)); + private set => _boolProps.Set(nameof(IsNotRunningOrELP), value); + } + #region DeviceState Counts public int StoppedDeviceStateCount { @@ -126,6 +143,11 @@ public void CalculateDevicesStateChange() #endif IsNotBenchmarkingOrMining = !AnyDeviceRunning; IsCurrentlyMining = AnyDeviceRunning; + IsCurrentlyMiningOrELPFromRigManager = IsCurrentlyMining || + AvailableDevices.Devices + .SelectMany(d => d.AlgorithmSettings) + .Any(a => a.ActiveELPProfile != null || a.ActiveELPTestProfile != null); + IsNotRunningOrELP = !IsCurrentlyMiningOrELPFromRigManager; IsDemoMining = !CredentialsSettings.Instance.IsBitcoinAddressValid && IsCurrentlyMining; if (IsNotBenchmarkingOrMining) MiningManuallyStarted = false; } diff --git a/src/NHMCore/Configs/Managers/BundleManager.cs b/src/NHMCore/Configs/Managers/BundleManager.cs index 878102093..9219dc1db 100644 --- a/src/NHMCore/Configs/Managers/BundleManager.cs +++ b/src/NHMCore/Configs/Managers/BundleManager.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using NHM.Common; +using NHMCore.ApplicationState; using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; @@ -66,6 +67,7 @@ private static void ApplyBundleOnInit(Bundle bundle) OCManager.Instance.ApplyOcBundle(bundle.OcBundles); FanManager.Instance.ApplyFanBundle(bundle.FanBundles); ELPManager.Instance.ApplyELPBundle(bundle.ElpBundles); + MiningState.Instance.CalculateDevicesStateChange(); } public static async Task SaveBundle(Bundle bundle) { diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 39174a063..d6ba054d7 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -418,7 +418,7 @@ public Task ResetELPBundle(bool triggerSwitch = true) if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public void RestartMiningInstance() + public void RestartMiningInstance() //not specific enough, just elp? { var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var c in containers) diff --git a/src/NHMCore/Mining/Grouping/GroupingUtils.cs b/src/NHMCore/Mining/Grouping/GroupingUtils.cs index c5709f649..27e8ebc93 100644 --- a/src/NHMCore/Mining/Grouping/GroupingUtils.cs +++ b/src/NHMCore/Mining/Grouping/GroupingUtils.cs @@ -1,5 +1,6 @@ using NHM.MinerPluginToolkitV1.CommandLine; using NHMCore.Configs.ELPDataModels; +using NHMCore.Configs.Managers; using NHMCore.Utils; using System.Collections.Generic; using System.Linq; @@ -46,8 +47,18 @@ public static Dictionary> GetGroupedAlgorithmCo var restInGroup = profitableAlgorithmContainers .SkipWhile(algo => current != algo) .Where(algo => !isAlreadyGrouped(algo)) - .Where(algo => CanGroupAlgorithmContainer(current, algo)) - .Where(algo => !needsToBeSeparated(algo)); + .Where(algo => CanGroupAlgorithmContainer(current, algo)); + if (needsToBeSeparated(current)) + { + var currentCMD = ELPManager.Instance.FindAppropriateCommandForAlgoContainer(current); + restInGroup = restInGroup + .Where(algo => needsToBeSeparated(algo))? + .Where(algo => ELPManager.Instance.FindAppropriateCommandForAlgoContainer(algo) == currentCMD); + } + else + { + restInGroup = restInGroup.Where(algo => !needsToBeSeparated(algo)); + } newGroup.AddRange(restInGroup); // save newly grouped mining pairs var newGroupKey = CalcGroupedDevicesKey(newGroup, current.AlgorithmStringID); diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 3c8da7b8a..3fec5fa39 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -719,9 +719,11 @@ async Task systemDump() var bundle = JsonConvert.DeserializeObject(parameters); _ = ExecuteProfilesBundleReset(false); _ = ExecuteProfilesBundleSet(bundle); + MiningState.Instance.CalculateDevicesStateChange(); break; case SupportedAction.ActionProfilesBundleReset: ExecuteProfilesBundleReset(); + MiningState.Instance.CalculateDevicesStateChange(); break; case SupportedAction.ActionDeviceEnable: NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); @@ -748,9 +750,11 @@ async Task systemDump() case SupportedAction.ActionElpProfileTest: var elp = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteELPTest(deviceUUID, elp).Result; + MiningState.Instance.CalculateDevicesStateChange(); break; case SupportedAction.ActionElpProfileTestStop: (err, result) = StopELPTestForDevice(deviceUUID).Result; + MiningState.Instance.CalculateDevicesStateChange(); break; default: NHLog.Warn(_logTag, "This type of action is unsupported: " + typeOfAction); diff --git a/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml b/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml index c1544c029..f3131b586 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml +++ b/src/NiceHashMiner/Views/ParameterOverview/AlgoItem.xaml @@ -166,13 +166,13 @@ + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> diff --git a/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml b/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml index da5a18275..49973165a 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml +++ b/src/NiceHashMiner/Views/ParameterOverview/DeviceELPItem.xaml @@ -52,7 +52,7 @@ TextChanged="DeviceELPValueTB_TextChanged" LostFocus="TB_LostFocus" Width="180" Text="{Binding ELP, Mode=TwoWay}" - IsEnabled="{Binding MiningState.IsNotBenchmarkingOrMining}"/> + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> @@ -71,7 +71,7 @@ TextChanged="HeaderFlagELPValueTB_TextChanged" LostFocus="TB_LostFocus" Text="{Binding FLAG, Mode=TwoWay}" - IsEnabled="{Binding MiningState.IsNotBenchmarkingOrMining}"/> + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> @@ -83,7 +83,7 @@ TextChanged="HeaderDelimELPValueTB_TextChanged" LostFocus="TB_LostFocus" Text="{Binding DELIM, Mode=TwoWay}" - IsEnabled="{Binding MiningState.IsNotBenchmarkingOrMining}"/> + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> diff --git a/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml b/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml index f7823c6e6..614d603f9 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml +++ b/src/NiceHashMiner/Views/ParameterOverview/MinerItem.xaml @@ -181,11 +181,11 @@ + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> + IsEnabled="{Binding MiningState.IsNotRunningOrELP}"/> diff --git a/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml b/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml index 2a6d6c030..97293cd31 100644 --- a/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml +++ b/src/NiceHashMiner/Views/ParameterOverview/ParameterOverview.xaml @@ -47,12 +47,35 @@ - + + + + + + + From 80e2d28479a861fe21c219efbeea4851a70e022f Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 4 Jan 2023 14:50:42 +0100 Subject: [PATCH 042/224] fixing according to report --- .../ApplicationStateManager.Init.cs | 4 +++ src/NHMCore/Mining/ComputeDevice.cs | 5 +++- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 3 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 30 ++++++++++++------- .../Notifications/AvailableNotifications.cs | 8 +++++ .../Notifications/NotificationsGroup.cs | 3 +- .../ViewModels/Models/DeviceData.cs | 6 ++-- 7 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs index fb83ca286..e9e544d94 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs @@ -256,6 +256,10 @@ string getDeviceNameCount(DeviceType deviceType, int index) => if (MiscSettings.Instance.UseOptimizationProfiles) AvailableNotifications.CreateOptimizationProfileElevateInfo(); else AvailableNotifications.CreateOptimizationProfileNotEnabledInfo(); } + if (!Helpers.IsElevated) + { + AvailableNotifications.CreateNotAdminForRigManagement(); + } SchedulesManager.Instance.Init(); } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 40558df5b..25ef2bc84 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -39,6 +39,7 @@ public class ComputeDevice : NotifyChangedBase public string NameCount { get; private set; } #if NHMWS4 public bool IsTesting => AlgorithmSettings.Any(a => a.IsTesting); + public bool IsMiningBenchingTesting => State == DeviceState.Mining || State == DeviceState.Testing || State == DeviceState.Benchmarking; #endif private PidController _pidController = new(); @@ -162,8 +163,9 @@ protected set } } } - public void ApplyNewAlgoStates(MinerAlgoState state) + public string ApplyNewAlgoStates(MinerAlgoState state) { + if (State == DeviceState.Mining || State == DeviceState.Testing || State == DeviceState.Benchmarking) return "Stop mining first"; foreach(var miner in state.Miners) { foreach(var algo in miner.Algos) @@ -179,6 +181,7 @@ public void ApplyNewAlgoStates(MinerAlgoState state) } } Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(false)); + return "New state is set"; } private List PluginAlgorithmSettings { get; set; } = new List(); diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 5ce753a6d..5cd83b93e 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -183,8 +183,7 @@ List getOptionalMutableProperties(ComputeDevice d) { if (p is not string prop) return null; var newState = JsonConvert.DeserializeObject(prop); - d.ApplyNewAlgoStates(newState); - return null; + return d.ApplyNewAlgoStates(newState); }, GetValue = () => { diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 3fec5fa39..a6614c902 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -853,22 +853,30 @@ private static Task SetMutable(MinerSetMutable mutableCmd) } } if (mutableCmd.Devices == null) return Task.FromResult("Success"); + string result = string.Empty; foreach (var device in mutableCmd.Devices) { if (device.Properties == null) continue; + var deviceTarget = AvailableDevices.Devices.Where(d => d.B64Uuid == device.Id).FirstOrDefault(); + if (deviceTarget == null) continue; + if (deviceTarget.IsMiningBenchingTesting) + { + result += $"({device.Id}):Stop device first\n"; + continue; + } foreach (var property in device.Properties) { HandleProperty(property); } } - return Task.FromResult("Success"); + return Task.FromResult(result); } - private static Task HandleProperty(object property) + private static Task HandleProperty(object property) { - if (property is not JToken token) return Task.CompletedTask; + if (property is not JToken token) return Task.FromResult("Property is not Jtoken"); var genericProperty = token.ToObject(); var mutable = ActionMutableMap.FindMutableOrNull(genericProperty.PropId); - if (mutable == null) return Task.CompletedTask; + if (mutable == null) return Task.FromResult("Mutable is null"); object t = mutable.PropertyType switch { Type.String => ParseAndActMutableString(mutable, token), @@ -877,14 +885,15 @@ private static Task HandleProperty(object property) Type.Bool => ParseAndActMutableBool(mutable, token), _ => throw new InvalidOperationException() }; - return Task.CompletedTask; + if (t is string retStr) return Task.FromResult(retStr); + return Task.FromResult("OK"); } - static Task ParseAndActMutableString(OptionalMutableProperty property, JToken command) + static Task ParseAndActMutableString(OptionalMutableProperty property, JToken command) { var mutable = command.ToObject(); - //var newState = JsonConvert.DeserializeObject(mutable.Value); - property.ExecuteTask(mutable.Value); - return Task.CompletedTask; + var res = property.ExecuteTask(mutable.Value); + if (res.Result is string resStr) return Task.FromResult(resStr); + return Task.FromResult(string.Empty); } static Task ParseAndActMutableInt(OptionalMutableProperty property, JToken command) { @@ -942,7 +951,8 @@ static private async Task HandleRpcMessage(IReceiveRpcMessage rpcMsg) } else if (t is string answer) { - executedCall = new ExecutedCall(rpcMsg.Id, 0, answer); + var errorCode = answer == string.Empty ? 0 : 1; + executedCall = new ExecutedCall(rpcMsg.Id, errorCode, answer); } else executedCall = new ExecutedCall(rpcMsg.Id, -1, "Failed to execute!"); } diff --git a/src/NHMCore/Notifications/AvailableNotifications.cs b/src/NHMCore/Notifications/AvailableNotifications.cs index 0f06bd0af..5e261803b 100644 --- a/src/NHMCore/Notifications/AvailableNotifications.cs +++ b/src/NHMCore/Notifications/AvailableNotifications.cs @@ -355,5 +355,13 @@ public static void CreateNoOptimalDrivers(Version v) notification.Action = AvailableActions.ActionNoOptimalDrivers(); NotificationsManager.Instance.AddNotificationToList(notification); } + + public static void CreateNotAdminForRigManagement() + { + var notification = new Notification(NotificationsType.Warning, NotificationsGroup.RigManagementElevate, Tr("NHM needs administrator privileges for rig management"), Tr($"If you want to use rig manager for OC/Fan/command settings, you must run NHM as an administrator")); + notification.NotificationUUID = Enum.GetName(typeof(NotificationsGroup), NotificationsGroup.RigManagementElevate); + notification.Action = AvailableActions.ActionRunAsAdmin(); + NotificationsManager.Instance.AddNotificationToList(notification); + } } } diff --git a/src/NHMCore/Notifications/NotificationsGroup.cs b/src/NHMCore/Notifications/NotificationsGroup.cs index 70f2640c7..2d6419e42 100644 --- a/src/NHMCore/Notifications/NotificationsGroup.cs +++ b/src/NHMCore/Notifications/NotificationsGroup.cs @@ -53,6 +53,7 @@ public enum NotificationsGroup OptimizationProfilesElevate, RequireAdminForLHR, NoPowerInfo, - NoOptimalDrivers + NoOptimalDrivers, + RigManagementElevate, } } diff --git a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs index 21f1e02b4..3ec330816 100644 --- a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs +++ b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs @@ -318,11 +318,13 @@ public void EnableBenchmarkedOnly() { foreach (var a in Dev.AlgorithmSettings) { - a.Enabled = a.HasBenchmark; + a.SetEnabled(a.HasBenchmark); } + OnPropertyChanged(); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } -#region AlgorithmSettingsCollection SORTING + #region AlgorithmSettingsCollection SORTING private enum SortColumn { ALGORITHM = 0, From 263d584d95ac6da3efad2387628ceb592f0cc0f3 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 5 Jan 2023 08:31:20 +0100 Subject: [PATCH 043/224] updating enabled state of algos in benchmark tab fixed --- src/NiceHashMiner/ViewModels/Models/DeviceData.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs index 3ec330816..b2cce1783 100644 --- a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs +++ b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs @@ -81,6 +81,7 @@ public bool AllAgorithmsEnabled algo.SetEnabled(value); } OnPropertyChanged(); + ConfigManager.CommitBenchmarksForDevice(Dev); Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } } @@ -321,6 +322,7 @@ public void EnableBenchmarkedOnly() a.SetEnabled(a.HasBenchmark); } OnPropertyChanged(); + ConfigManager.CommitBenchmarksForDevice(Dev); Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } From 72363629453501f8a9f11e57897948b250848b49 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 5 Jan 2023 09:29:11 +0100 Subject: [PATCH 044/224] testing status color is now correct --- src/NiceHashMiner/Converters/StatusColorConverter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NiceHashMiner/Converters/StatusColorConverter.cs b/src/NiceHashMiner/Converters/StatusColorConverter.cs index 9e38e5909..dfc827827 100644 --- a/src/NiceHashMiner/Converters/StatusColorConverter.cs +++ b/src/NiceHashMiner/Converters/StatusColorConverter.cs @@ -16,6 +16,7 @@ public class StatusColorConverter : IValueConverter DeviceState.Mining => Application.Current.FindResource("NastyGreenBrush"), #if NHMWS4 DeviceState.Benchmarking or DeviceState.Pending => Application.Current.FindResource("PrimaryColorBrush"), + DeviceState.Testing => Application.Current.FindResource("WarningColorBrush"), #else DeviceState.Benchmarking or DeviceState.Pending or DeviceState.Testing => Application.Current.FindResource("PrimaryColorBrush"), #endif From ed3843967a8a769737b8dad6263e04dcb03901a2 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Thu, 5 Jan 2023 12:36:11 +0100 Subject: [PATCH 045/224] NL-2120 Nvidia monitoring update --- .../DeviceMonitorNVIDIA.cs | 23 +++++++++++++++---- .../Memory_clock/IMemoryClockDelta.cs | 13 +++++++++++ src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 15 ++++++++---- src/NHMCore/Mining/ComputeDevice.cs | 11 ++++++++- 4 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index a231cd2da..b7870fecc 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -8,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits + internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits, IMemoryClockDelta { private const int RET_OK = 0; public static object _lock = new object(); @@ -285,6 +285,19 @@ public int MemoryClock return -1; } } + + public int MemoryClockDelta + { + get + { + int memoryClockDelta = 0; + int ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_delta(BusID, ref memoryClockDelta); + if (ok == RET_OK) return memoryClockDelta; + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_delta failed with error code {ok}", _delayedLogging); + return -(1); + } + } + public void PrintMemoryTimings() { NVIDIA_MON.nhm_nvidia_device_print_memory_timings(BusID); @@ -292,11 +305,11 @@ public void PrintMemoryTimings() public bool SetCoreClock(int coreClock) { - return NVIDIA_MON.nhm_nvidia_device_set_core_clocks(BusID, coreClock) == 0 ? true : false; + return NVIDIA_MON.nhm_nvidia_device_set_core_clocks(BusID, coreClock, false) == 0 ? true : false; } public bool SetMemoryClock(int memoryClock) { - return NVIDIA_MON.nhm_nvidia_device_set_memory_clocks(BusID, memoryClock) == 0 ? true : false; + return NVIDIA_MON.nhm_nvidia_device_set_memory_clocks(BusID, memoryClock, false) == 0 ? true : false; } public (bool ok, uint min, uint max, uint def) GetTDPLimits() { @@ -316,7 +329,7 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default(BusID, ref min, ref max, ref def); + var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default(BusID, ref min, ref max, ref def, false); if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks_min_max_default failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); @@ -330,7 +343,7 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default(BusID, ref min, ref max, ref def); + var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default(BusID, ref min, ref max, ref def, false); if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs new file mode 100644 index 000000000..da7fd1f2e --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockDelta.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockDelta + { + int MemoryClockDelta { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index 21b04c5bc..387e0a1b5 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -44,11 +44,18 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_core_clocks(int bus_number, ref int core_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_set_core_clocks(int bus_number, int core_clocks); + public static extern int nhm_nvidia_device_set_core_clocks(int bus_number, int core_clocks, bool is_absolute); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_reset_core_clocks(int bus_number, bool is_absolute); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_clocks(int bus_number, ref int memory_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_set_memory_clocks(int bus_number, int memory_clocks); + + public static extern int nhm_nvidia_device_get_memory_clocks_delta(int bus_number, ref int memory_clocks); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_set_memory_clocks(int bus_number, int memory_clocks, bool is_absolute); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_reset_memory_clocks(int bus_number, bool is_absolute); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_info(int bus_number, ref ulong free, ref ulong total, ref ulong used); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] @@ -64,9 +71,9 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_print_memory_timings(int bus_number); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_core_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def); + public static extern int nhm_nvidia_device_get_core_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def, bool is_absolute); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_memory_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def); + public static extern int nhm_nvidia_device_get_memory_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def, bool is_absolute); } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 25ef2bc84..81d9a5766 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -315,6 +315,15 @@ public int MemoryClock return -1; } } + + public int MemoryClockDelta + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is IMemoryClockDelta get) return get.MemoryClockDelta; + return -1; + } + } public (uint min, uint max, uint def) TDPLimits { get @@ -886,7 +895,7 @@ private void SetFanSpeedWithLoweringMemoryClocks(FanProfile profile) if (_memoryControlCounter >= 5) { _pidController.SetPid(100, 0.8, 1); - _pidController.SetOutputLimits(MemoryClockRange.min, MemoryClockRange.max); + _pidController.SetOutputLimits(MemoryClockRange.min, MemoryClockDelta); var memory_clock = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); SetMemoryClock((int)memory_clock); _memoryControlCounter = 0; From 6fef810f9f2c21438a08d9bbc662810671f7ec91 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 5 Jan 2023 13:44:20 +0100 Subject: [PATCH 046/224] updating login message and status --- src/NHM.Common/Enums/DeviceType.cs | 3 +- src/NHMCore/Mining/ComputeDevice.cs | 11 +++- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 75 ++++++++++++++++++------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 28 ++++++++- 4 files changed, 94 insertions(+), 23 deletions(-) diff --git a/src/NHM.Common/Enums/DeviceType.cs b/src/NHM.Common/Enums/DeviceType.cs index 2a6a91cb2..7f6327cf2 100644 --- a/src/NHM.Common/Enums/DeviceType.cs +++ b/src/NHM.Common/Enums/DeviceType.cs @@ -4,6 +4,7 @@ public enum DeviceType { CPU = 0, NVIDIA, - AMD + AMD, + INTEL } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 25ef2bc84..349879107 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -41,7 +41,16 @@ public class ComputeDevice : NotifyChangedBase public bool IsTesting => AlgorithmSettings.Any(a => a.IsTesting); public bool IsMiningBenchingTesting => State == DeviceState.Mining || State == DeviceState.Testing || State == DeviceState.Benchmarking; #endif - + public DeviceType Vendor + { + get + { + if (DeviceType != DeviceType.CPU) return DeviceType; + if (FullName.ToLower().Contains("amd")) return DeviceType.AMD; + if (FullName.ToLower().Contains("intel")) return DeviceType.INTEL; + return DeviceType.CPU;//unknown + } + } private PidController _pidController = new(); private int _memoryControlCounter = 0; diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 5cd83b93e..2bf0d5a9d 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using HidSharp; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NHM.Common.Device; using NHM.Common.Enums; @@ -121,8 +122,8 @@ private static (List<(string name, string? unit)> properties, JArray values) Get // here sort manually by type var dynamicPropertiesWithValues = new List<(DeviceDynamicProperties type, string name, string unit, string value)?> { - pairOrNull(DeviceDynamicProperties.Temperature ,"Temperature","C"), - pairOrNull(DeviceDynamicProperties.VramTemp,"VRAM Temperature","C"), + pairOrNull(DeviceDynamicProperties.Temperature ,"Temperature","°C"), + pairOrNull(DeviceDynamicProperties.VramTemp,"VRAM Temperature","°C"), pairOrNull(DeviceDynamicProperties.Load,"Load","%"), pairOrNull(DeviceDynamicProperties.MemoryControllerLoad, "MemCtrl Load","%"), pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan speed","%"), @@ -284,14 +285,30 @@ private static List GetRigOptionalMutableValuesLogin(st DefaultValue = btc, Range = (64, String.Empty), }, - //new OptionalMutablePropertyString - //{ - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayGroup = 0, - // DisplayName = "Worker name", - // DefaultValue = worker, - // Range = (64, String.Empty), - //}, + new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Worker name", + DefaultValue = worker, + Range = (64, String.Empty), + }, + new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Miners settings", + DefaultValue = "", + Range = (65536, String.Empty), + }, + new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Scheduler settings", + DefaultValue = "", + Range = (4096, String.Empty) + } }; } private static List> GetRigOptionalDynamicValuesLogin() @@ -341,7 +358,9 @@ private static List GetRigOptionalMutableValues() var list = new List { CredentialsSettings.Instance.BitcoinAddress, - //CredentialsSettings.Instance.WorkerName + CredentialsSettings.Instance.WorkerName, + "",//TODO rig-wise algo settings + "",//TODO scheduler }; return list; } @@ -431,6 +450,7 @@ private static List CreateDefaultRigActions() { NhmwsAction.ActionStartMining(), NhmwsAction.ActionStopMining(), + NhmwsAction.ActionRebenchmark(), NhmwsAction.ActionProfilesBundleSet(), NhmwsAction.ActionProfilesBundleReset(), }; @@ -444,12 +464,12 @@ private static List GetStaticPropertiesOptionalValues(ComputeDevice d) new JArray("bus_id", $"{gpu.PCIeBusID}"), new JArray("vram", $"{gpu.GpuRam}"), new JArray("miners", FormatForOptionalValues("miners", GetMinersForDeviceStatic(d))), - new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), + new JArray("limits", GetLimitsForDevice(d)), }, _ => new List { new JArray("miners", FormatForOptionalValues("miners", GetMinersForDeviceStatic(d))), - new JArray("limits", FormatForOptionalValues("limits", GetLimitsForDevice(d))), + new JArray("limits", GetLimitsForDevice(d)), }, }; } @@ -498,13 +518,13 @@ private static string GetMinersForDeviceStatic(ComputeDevice d) } private static string GetLimitsForDevice(ComputeDevice d) { - List limits = new List(); + ComplexLimit limit = new ComplexLimit(); if (d.DeviceMonitor is ITDP && d.DeviceMonitor is ITDPLimits tdpLim && d.CanSetPowerMode) { var lims = tdpLim.GetTDPLimits(); if (lims.ok) { - limits.Add(new Limit { Name = "Power mode", Unit = "%", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Power mode", Unit = "W", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange ccLim) @@ -512,7 +532,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = ccLim.CoreClockRange; if (lims.ok) { - limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange mcLim) @@ -520,10 +540,27 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = mcLim.MemoryClockRange; if (lims.ok) { - limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } - var json = JsonConvert.SerializeObject(limits); + var deviceType = d.DeviceType switch + { + DeviceType.CPU => 1, + DeviceType.NVIDIA => 2, + DeviceType.AMD => 2, + DeviceType.INTEL => 2, + _ => 0 + }; + var deviceVendor = d.Vendor switch + { + DeviceType.INTEL => 1, + DeviceType.AMD => 2, + DeviceType.NVIDIA => 3, + _ => 0, + }; + limit.Vendor = deviceVendor; + limit.Type = deviceType; + var json = JsonConvert.SerializeObject(limit); return json; } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 095741ce6..3f61d7ce9 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -33,6 +33,7 @@ public enum SupportedAction : int ActionElpProfileTestStop, ActionOcProfileTestStop, ActionFanProfileTestStop, + ActionRebenchmark } internal class LoginMessage : ISendMessage { @@ -319,7 +320,7 @@ public static NhmwsAction ActionStartMining() { ActionID = NhmwsAction.NextActionId(), DisplayName = "Mining start", - DisplayGroup = 1, + DisplayGroup = 0, ActionType = SupportedAction.ActionStartMining, }; ActionMutableMap.ActionList.Add(action); @@ -331,7 +332,7 @@ public static NhmwsAction ActionStopMining() { ActionID = NhmwsAction.NextActionId(), DisplayName = "Mining stop", - DisplayGroup = 1, + DisplayGroup = 0, ActionType = SupportedAction.ActionStopMining, }; ActionMutableMap.ActionList.Add(action); @@ -370,6 +371,18 @@ public static NhmwsAction ActionProfilesBundleReset() ActionMutableMap.ActionList.Add(action); return action; } + public static NhmwsAction ActionRebenchmark() + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Rebenchmark", + DisplayGroup = 0, + ActionType = SupportedAction.ActionRebenchmark + }; + ActionMutableMap.ActionList.Add(action); + return action; + } } internal class Device { @@ -606,6 +619,17 @@ internal class Limit [JsonProperty("range")] [JsonConverter(typeof(Nhmws4JSONConverter))] public (int min, int max) Range { get; set; } + + } + + internal class ComplexLimit + { + [JsonProperty("limits")] + public List limits = new List(); + [JsonProperty("type")] + public int Type { get; set; } + [JsonProperty("vendor")] + public int Vendor { get; set; } } } From b74f7a2c20592ef0938049c063262f1255e929dd Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 5 Jan 2023 14:00:47 +0100 Subject: [PATCH 047/224] prepared for fans --- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index a6614c902..6a64ca4ed 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -740,8 +740,6 @@ async Task systemDump() break; case SupportedAction.ActionFanProfileTest: var fan = JsonConvert.DeserializeObject(parameters); - StopOCTestForDevice(deviceUUID); //todo change as the others - StopELPTestForDevice(deviceUUID); (err, result) = ExecuteFanTest(deviceUUID, fan).Result; break; case SupportedAction.ActionFanProfileTestStop: From 9a2e90464dc7873ec4a3b83eac4e9b919d974118 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 6 Jan 2023 08:49:25 +0100 Subject: [PATCH 048/224] added new dlls and minor adjustments --- .../device_monitoring_amd.dll | Bin 463272 -> 453120 bytes .../device_monitoring_nvidia.dll | Bin 482216 -> 474624 bytes .../device_monitoring_x64/pid_controller.dll | Bin 0 -> 11776 bytes src/NHM.Common/Enums/RigManagementReturn.cs | 15 ++++++++++ src/NHMCore/Configs/Managers/OCManager.cs | 7 ----- src/NHMCore/Mining/AlgorithmContainer.cs | 24 ++++++++-------- src/NHMCore/Mining/ComputeDevice.cs | 26 +++++++++--------- 7 files changed, 40 insertions(+), 32 deletions(-) create mode 100644 pre_compiled_libs/device_monitoring_x64/pid_controller.dll create mode 100644 src/NHM.Common/Enums/RigManagementReturn.cs diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll index f373c32a7d156ab46382e0e6baef4a2056b415fa..c8d2b1239ee626d1686e8d091304840590366805 100644 GIT binary patch delta 171183 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

95hEL}Ms?@{8djql47=F%)jLgS!FF1QQVurUq;w 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 delta 183230 zcmeFa3v^S(_CJ2oG=0#*DbE%tG|&jeA_OW@EJy+gJ%I!&Z{<}%5frZl5-13ym{b}M z(dto)UKP0Ng?q0Lyec3nq!ilnE}-&Iq2Pm43sOXBK_tJ=o|B|4k1Jfi-}PPVzy4i4 zkDRk-X3w5Id-mS5XHMSd?bp7MSeWPh;gTBjvafFy&pMtHLibqapbtmxYkzQKlbnJI%@12?E3aN<$5psJ#yx> z8B`Xh{G|o19G7M0xCft#`XWf$#TsVGz_*4X!!r&sgN)>K=5uE)tTuURkwZm|Yi{wrtsXilu%XzL- z`!=g^lTLuazdSXU8}?kMc2Zne)LrhspwKwHA_S0q!#^#@W%ro#-~;vtIIc5~_ejab z;jl}?!`j`Y?+W0;2qn22*9LzE;MF5XNy@MTmRuJAydb?E)~?xQ03mAMZm2CwR|C@F-4TNQ4)?no{24|erB)D+2;x@2Y@eg%_;Ehz zsc=4Q%Xz6NT&rHJ50^HDCp#a;D?z*{cvRw1!Bre3UpTMgE|jS3O*bU~Z$aEAZ##^F z#ECk+AeNzI?Ua%RCE-@^YC2Ia9u;L!^${{?1c3L^`fyGtGg2b~&KQM9n^_WRqUJVj zbxs6oV%2G7RV~t9h5TEyrKRDmnymbps;e14M=fp9Xu}?2Pot+OPqSxBS2S%SZ9T&| z`S3oeV?>I2?1$kWSR$fT&PB*PZJXdR>9Vcj&p-3cC+gD07jzXs#fplHR$aP9ls%($ z2JxuXW7i2n{tm|@X})z`~&uOxb0yTOYm!x9g+_?8Qzdy}yLS0hKX=gkWb=}i0 znA5(i>I#mwh+9qGrF#G&Y(kd!i{lui5VJKuV~3SDSNKcP{4BqQiH)wh-TZPN7}uQd zThL-N^)r)qN-jvDHK*;U9w4oX(m9K(TDXea)}Gk^qw7Z%P}1@R47xDRL|!6=Gyg*F9VWasfo#WQ$`(Yb`sH`O z-{R>R;m;w7FdB_E~15k?BJ?X*n!ocx)m6KcRz~vV1^(UfGN;$>Kaxf zs-eHwwKW<<)DjVm-tedaXoBI~;`Xd{(Fp$UsdYi+s-4J+HGZ1UBz|R1{U-kcZ!SyQ zVG_%YK=i3YK-8Feo_FuXjY%w>&L@$0;y9^Ov&{DCg1=nIFSfVn?W>Ms@(wqV>_&1m zd%_uW+3z<)!n87pWk&D4dJ@(sW(87cmOcgDP8y}6(nNy@M6eFZd!U=d5L89%G-y6KXW@75)4 zhf&=2vPtxr(zcpXw+iAHmeemHogU<0E5^tYE@bTImuEGU zli%R?)VRAMvxT(XvVW(vGOkPPXEPyMA)O;l-hWE_<61|aFkblFnD?D@CN9&t_9WH) z3}5gCn8!SGyYWsHXDpUm7-#xMNG(`r${s2%FV=DqoVedA?kJX98ofe$W9oKGag|nG zZYKJan#G?j{CmY#{=Ka@ezp|LTC3V;L07;NOYu+mg@!+fcL&50oXai6KWc62{p~CV zWoqJV%fTNl2Y*5<@NVKdqj$LUcFRN*b+2D6Lr?$l1o86n{aQ}C*gQFUJ8^Ng(QA{s zwCLQW%INw%nqSroeYaX|7OOVy!T4(u_tu^&{xQrO{(MHALpQxp%4w0%b&r9UwpZ;& zWf_p!{hj@;+HV73haDXQj3YhXqHW|JBQKRzxukt9`Z@QArM%=brPfppL|Ws_Z#4UV zq2?~GZe>ze8^!Ilhi6t0#UKr42q2igO9VKPC}sl*#I0cR9BTAjaTjQE05oW&11(cQ zi7KtDIFU#ufGFSzq9oBrp`gIOXVP`ZMS@tJpsoPHgo8ht#GgSu5H0^J-u+i;P0N&K zag}IhpSaH=x>30FP0Qhf+PZ#An%l=a%+JK|!AgI5ewl%PVS9C=;Ug7QJ<7zdU!=>f zRvZ0$&2B%R?*#1)?lX>sj5^{m>Csm0!$wS(mbIGDQ9Nd>J*hmuWUT$6_^cXO7>j>W zn=)$WJ^Fm>--di=k3lZ>2xH!FnmHOakPh;OrwYZD+Ckpf2q6Y+ye+{v#W>kG$vAP! zFF+h5NCVq+ocy3Jg;Y1B5O+ef3%t1;<37K>%6Q=mW8U{F z44lL#oRELO5r;man%BhK`#Y0(Ts&SK^9h=WGk&NdS<%}sK#RyW^u9p4jg~m9V7IiT zO_Edl7R33?BaF>SW>iog-qR z&h=Yse%V;H^lW?w)m_p%@pm)_W0zL_8#OnHhs^FXcB^zQJ|U(npJd<^rk0u|+@|U& z-I*}RDOdeS6cUSV-a%othsAv$AiuKMIP(axHF!Gph)Fz;wu=$VJ>k0ABQuMMOx9^T zEX60n!M5lKf>+b?YYikKbVFm5rM40z5+DXd6_JQN2#`qdmm2eaDz}MSZK)+7%U%e< za)E#6SBp3s)h?AH+IDu9vSG0tIgna`LKmj(XDrQjhlW;TB*ZjcA{ws*xUVpQ5@Tt!Uq2a0}3acgLa<)Op=%+!*sNY4|6v z0K2MRa1uUl{ch%og{|Jrw2IpWw6}N=6~ztpht#d&acNImol2H|Zksx-)Uqi^OQ_O} z9$Oi&f*LZYu@kB}s8Kv`L}O|I*eV_YC5Q%)wrYq;@WfW5>!Jo#CcgBe8&u+v^k}=b z{p}ji-mcjKY@rT~)+G$}#`0pg&PsZu8r;wNKKiU@5V&Kj;AsM>p@-C%G-dMhiSZq> z!6WC%iphfA2FnFKD@)v8{9}^)fW4>GBe9J$8=|G8G~y009>3{a5`;?Dc|Hya#A3no zsxA)&!`jYs4xkgC|0I4d#rWdn9I=A8^{h_eocBI;_1(y?&C-hyh@7Jto=?Q{PhiDx z)mnbji8gcT*=TwO+k>m7ltbxPG-siDZ5PN~Dp?%&F=-;65mADtXVnVa!afq9VDyB= znzlpmhNrQ2k=0J6PFC1Rg#a^w8d*}C4n0-Fq#+$T2`@hZ70wFd3 zNik1Z<&`cGIx~yXAc&g5)1`lP=-4~sJ~Dcbz+#0}%q&m7d6?YiD6=r1p_d*sIPkQ> z=!GWX`b_$*gD&j*@nnhKdHe{2ORtB6QB0zonZi|Vpyf6;b)ULVE#0R{(Mn^3cJBM% zTx;i!VYxRMq2#VbntdJH#lJB=i0Xx{DtnVn)By5Ro1ahW=)8Xu+2zB=!(O#(lB8nJOQE&OIM!!pgc*(lN9C2=gN~5JV{WVY*n5l;7OG7WS#N^ z> zB0I(sk)4k#a0T^n^+d)fqaA}$b2LWHrKf8^5j1U^X#qRmt*gWni&#Sfj2ap24;$G8 zi&|^-bh3ILi2InQG@fAzrh?=$lTJ%r(JX##6ffKQY3EI~dIz*yaR3@-K#R7*@8KN{ z3lMypl`0LN7wPHxyLIKbwR+yv9cGUxAxtU3`+{y29uU*(zjuxVHna!Tu~nN0O&$XXR(neNI*4Q1LWcHII-KkEUG^JPsd@3Zcw=n3~N{;P9EeLlPiw zjT8+bLP%^9vfN1(hW9ZVH}9ksUE2g3Q{j48~ND{45^&B`UY%F6j1JJq|Sf& zCy^R?DS*^aIEMo*HN;Jnl6smngEp>5{#Ws5soBRFH@0Ei(E2?-z@b0DaZD|~*%iuX z6K)xYCQ2`MNpW_T^~lZYRmL)lI6-R>=fW0$0^Z4Q$!0(YY?6o$D2KE2mG*RB$Id^q z^JzK<{>amYA=j=;7(;S$EF`6OmTm_+Rs~@uUSb_<4Upe}cG|*osjO$MLCZKQ)1Dc~zGCpFB@@X^HC~J__dv^ypC0>m5n0vmjl6y?0 z5)UigswWsQN&f5S)G)Sq%a;0Xwa>B{N$D@n60;ZGDjwOD1vn@kO}h^qR7M`Ow4tZT)K znc={g6cq0m1<#KT5}xLGOLCbd2JTBU;k2d!PVWIH!o<7=I1zF-SnFn>GX`h@rB(ry zVwW}x;S^PmQvoEJyzm2R_e{9V`mBr%hs<^`LiPe)q1-KAL!8Ac#9F*rQ8up-PBsQJ z7gGds#)e36p+B{kSJSL1YY|pK2**GLA)jgm*J3_S;0NQ*1GG`QNYv}S_haRl>;~;b z6it$I4+PpNd7tG|WJ7;GOU&*->)bpg4#|6dRT^izGen5u6x@d`YL21~0j;xymhF(g z0t`3itl+v7H>a22habpxNa}T4r?#2RK&&*Fc;MPoXos^j9F&?5aYajqs(L%a=(YSl zqh;csBI2VN3K2huxfvn`Xy^nH71mKmS6k75buj&Ki>z}<9{Y@T>z1%l}@fi746^F{=##ss|lB3@g)%ksbv ze~Mg0LK)Drjh4S=& z+=yn2>2-U&2F+ghvo!l_Z-r)Gsq1N`zg3!bE&r1=dkWLdq^2%$glM)9x3@sE(PSi^ zhC*|Fx&0>F4Xcle{(Tv0GEzs-- zG8X6j{YErfO|QG+HE2f4*x8 zKwB;7oLFzhQp5@#fw+%h_#hm!>ZuC~5RQb`4d|N$LPH$yPWq(bLzGOvdvnad3Ymq#s`MT0vbNOm!Bs#wZMKyg*^A7%6}_ z7i_LSB1M1_W<)j+B?in2QX*nNKio4?NO6NT&b6;IN<476VQaw;6rzNo5hYg1ynNOzsz~oggB2Oj1GlUmL%&9b@@ua_ z$XzQXO2I3TnJkRa+j_=ts3wyWrA-w%@%kf5hL97lJQ9!-{T@@@9@9mRp&TJL_rz?Uu1_z?dpYq)eu<1zb?UHL%J0TM`Y zunOM6n2sX}HjGIy_=pf@q$sIAlu{|%U<#m=)*4pI0ef5502LLoC{A$YCdAFb>=)Ru z+7^5&J`~-ZT-(qmu&k^BwvGaC1HzX|lng75*QAx!GsJj6eF_#w&5{81s z8$jI_z@@2z%Le&t*sFxghYyEvS@&=_RlF!KS=C-THK^M#Cy}@_5W*<&K^-G8^N~_C zG$_l)2*|PPj1h_qV`D_5ys;a?uihBkv-S61EByP-^iY{crc0*=3&Oj|Q62{GHqdT_ zdZ~E>7#IFZB4j(l!E4(fFMu^o$lqI^kqx&B?t`7}(KbYj6ad#5D3gw8o5ap*0YjSj!MwBfkNwmAUSpcqmlG`42HK zaU|)0RYi=LO$got?+?7h7L>pQZkZV2F?Ypy_O*%142)-8QQ_mVg+gbbCe08q%DP-Lj(vDlcn8Q`Bp-)zML2Gl8p81d+^U&-w+Qat_n3RPsOV59RUhYZ;)~l}WPH(u zs_8KoA^(-bPyxml8;CFB!50aG8t?@i7q)$JJ~{D4^M?P(7aKx+v4!ykeE7r{`|9~3 zULK%iv?bKUTk83ujPV6h5nmuxfG^_ZC?!!@C=p4VQvtp}H-=w2#e9nR;uQFz2sgGO z%n6(VUlaj>TKVBa{??2yraTZL)dbwCm3ay;$)7zE;t<8J`%RAGpDAP9pc#3-o=gTj z;!_+&(+fS5;)Q7?2r&z{dWXj%8VTh&iY#6urV1=k7Vo`R>##rtR1BcfqXTQS)-Pof zCTtvN^E~d=*9-(js!6J}2R}x+vIe;MOEQ4k@{v$9!5WR&qtsjk;T6x2ZrzKJCiX}H zfrvdgRuY?{y*%YQ?BTDFECYKx)8#qOHxg#daxwBLb88xzFG3yh^&occ&(3$zdADIK z1=I;FoC-1i7L0yIX!iHUSu$$ow-j6pltC_9@boSXZ^l(mwThMmij;$OgqS<$PnJ}l zB~=zOJy z46nVQ;-trx-reNazayAdbbG$LPkMjpLFdu?I4%K47aVuu7>r{ijt6k$;8=pgi{n)s z|H82e$4(q10Su!sJ4kbbY_Z791e;i66)z!Z!kV#tes@|H;`*Icxu4ZDJC4?ZG$H4> zSYj*;+K~ zJQRLA6_9~QxIuNunkFk}NK2mWH1S1Z9kETri3#(?WpML8d;I`q2Dg6tj7 zAhjor#Xq2ER+~U&WYv1VAF&X>5OckVduf7AuRixkxb%$e1@-;7-Zp%Nb3__Cjk2;N z1u<|4E~{YtcEs%7u^`csQQ_dN9#xr9St{~6x-|l_O2h8BaF}Aiv#n4@p_yT+fz{jL z;NQ@wUg3)CVn=>i8v>oS19>iwktb82$qQmRt_UIVpJc&j6q!Qa4~}17Zt?G6QK_{j zg7Igm6l8~RYhyvQ`+(zX$v$Gy-EGS$%pVVYj_<0cOfOUtx=tkdWX&KH)ad;{dhbKV zFB@y?q}#KS2G$AFc3uVct>9gxOF>kdCG{c;_9|N(YxT4&8_eokod}c0f)y@kiqd~d z1zDZ$PwN5j3`3I*bd%zW+p^+BvV zs&9#~NqIOUmWBwtGw*~7^sJDL1x=*)?``G81GP^MV>E68lKxn=nx%mb!w8G_kv>`7 z;Qi9Z?_DQ&pB!FKcgp1Z>M49uAidHsSHB;~-uo=E{+(!<-}1JiiCainBU>l3-)N)8 zDZUe+Q>REJV|Dj#SPSBN!#iT-64guaU;zMBCt^WF{ak!XX&Qq-VRzI%Q%VX~O@R`f zjR{{|D{CF7{}77P#pUN_bvBGj$R8r%{6~i^WBts48jIsMUQH&JCj_3g1>wDMZ*VTEtbE zWGt@IAW?dw_X7*l4gkVfTO;L;P8w7LP^^*w*xe1lP7>=v(wA6LFV(Yd`^Kyb0l!zy z|GRW#bSM2*w?dyBkS1$#37Vne0T5&=I2PA9Tvy?$$2AK_;Z#N(>zH_B_j=-(5LH!A z2gLb$J3R3!EgQLL^bS@C5fdbYy8lB&2v_1m(wk%6>D&PI>ro(~ytOoU?7%QwJ{+4C z=6F-88k>0Mh9?!Av#CuP;!_CmO3*g%L9_=BEsk~gZNN1f$12HtU$QiDTnp9h(&OWX zXHa3&eVaRL;`!*vyo>ggb8A7e_0nAz58 zuj*Ez62w%fAQ7|uipIoD2odw`nT(jrXG-Dsf7TFRB4#6m1NeS>KO?4YLRy$+m2}^P z#6FozNE-=pLR>(c8}lcaAaHV=zUl2$*^y4z$W9F<1+fF5*-h1U`e6x14w7rsM! zY)Xg6{bhkLVLb~I){DirQDpD{I`R1{Q5+4~2g7P9Bf*({%F_{`fk<`B+B`NS%Pstm%=3`SD zx900p^y;BstEK%@5_M@`2T2oZ&F=IlM48S2B+6WQB}kc0$)HTIG>`_$P-EI00d0m2 z@?K3B(&R_7D$l7W%$mO|guxtVaBvF}#wxXaptq_m5vIf1^VcH`R298!YX{!C%{iX6 zl|kVoTz(c`(5*nGCUFNOauSpu`yJ4-9j&Y^zBeFLLFw_}%0^M?2F7lN#_YBVS&>$h z)qvf;Is$fEpsvn9=2E|@O>f(Y2TIqd=d-Q!EJV$XN2qVKHfEtQfk?k!5l&oMYF4q-G#Zx=98yVsXs)RfkE-i&g#!GcmyM#SYlxd|JFZG$G z8@pk3kb(poESO;tAVQF(XzdSKDZwVjDjOyqh@u5R2#cp6MF$c^uay*EPSdM@KBShS zAMBtzdMHSa5N{o%M{-XI=;p5;;g^*kvT(-=`2{BtO;&CAv z!P`#rvtlGAg93-lY-l;pB-qho&dO;@ChSMZ{NRO;sV(srCm?7~eVo=%B_C)01>_<| zARlCctdP%2`Roe}k(I23WbziB6*epBF=2w#PK5ojc-Dk@q{H%b~or|EZ;pv6eEgWeru%8cK#i z1_G}`4P@D?@<2nCBCJkEMjK^PDuKvGP`jf-ZJ9_NYAk``Gi^T9 zX(P%uQt&BiVFo(oa#NNTFEQByx?>?BQkI$JaH2cKnwo1sWf^2gSp+r)3)S`z(dEvd z`eFGo*nk$SX>o1Ky_Vuq?6ZFjdof4)$FoUc_8e*Fvt3lrN#~wTjg6Y4;;N$r@k{xo z=cJUvPR>Jz$e`>1wQ9FK|7Dz&KZpT}(Irt}6(5KbJ_&RRCzD-p-CI((*~D`K{xi1n zPfjAm#`Cr=57-a&cJB<^nsy3Ew~8|p1lLX&+z00;0e|Y<`>TZ1Vk;TkL%rdN-QXw} zGAdwkAI4b6Y)>q#RngpuUW)m(LyL1n5ZK0PkAv7`dVemx|7?6#3;HS6!O*5fy@Ka2 zas1}D+3JMh-u_($&t!NGw!wzCkf}Xf5IYLuL3vUkR3?n*TCC%R=inz;^A=d(gGrV#Ct-8mprB9W;@<0Nk&34x=w_h6kI$!CKVCulKB?X6f0lulzfI>AJe zVtu|O0zUywaJT$LQGmekax{=&uG1jYhq_gqlRS-9@l)MeRGK;kGFAMi=dduyBG!pv zkYB)GzMKf#+iQbY2dsf5Y&v+Ijsh3{#*wP6ddLuHUzc@>@86J?Y(KSFDi)Rvi zaW*}A2*eoWner^=8G_qBU{wKLS~}4*8fB#ZTG*mwL-{O@5|R%ihd87q0kn-}Ad~xI zb5MLL=^b!!QTph`kXJx^Y)UQB9>`dH|~M@+o?W{!)mm_|sC%z&qJ=VYW$BqZsLX z;33EhyFjb%hV26O$Xno6fWnLPRvq~SQ>-F+e@*BnTHc&<5MXH#Q@vrWAkygqgSQH)C0(H}+{-rbSKZ}B)37WOGfEp_TX5#I3&xLBM(<32hRlzU#qIfL7DO5`rw~ycwe)w|-(hjr z^Zfl^S-o!E7l0>bBp%DACNao$n86jqgevAK#Iy&2RFTHC@o}6eTXXL-^*Kv#{e^dS zxnX{K`N|8l8w*;zy0z8&AF-G5XjyH+mw@YpFujij3W{3jmmvqT{!jEKw{f;Pk93O6 zCXICA)6x%*bPgN)wAAF$y9QUH6!Ol@n}LFsZX@0?PJypD*o$`WX3V06d<%GS^#NZC zIufn5&-Y1rk1oEWt>Eba`B^rEdFH^Gw3>7>Ek955nX%2yN}nYa<0P7}e9`BUcGjTi zg{5j3QysEilpdYcIcfyGTWP2Uft1@QBJIj%3P5&(vOen+Gbi(4+_PX)UcA4 z3~#uUSL*l|^B58o1(a9uMYXF+W5v&0{Ip_KUJkCNj2%lJa9zB-Xrd`~$HqZuAVeso zong#8+n-UxkEjt#^DivWc+JGhR~RcNOG%H%_xl}21~Kh()T&_GG03ipSZw1J)WPVT z&6qZnL*&K?yrVp%wvV@W8sx}AqAO-7sxkTcHcJjB6(|QbaY3wxW`CXK=RoEx!cmXLbbqQ)2|y$?KSbC803jO^<3Sbgn) zp0Ul6dX{YhvV9SPU$(;qPcRQMm|v})z5$P;6f;HK5AuMFYNPn@r^UKA4vis|qs~O77V+!uX}qPqRBa zGrl1T!iC&`J!xTMfIR~yPH^p^=5%y`J59P7R_g0jnL_7J8bGJ@+ad}*rTSF zcVnk6g$Y?(ysaZ8fLtcIq+;a+mytS+dG|bF5wY$b&Lj>k+28fM%HG%Yd$_$f6B2lB z?@SgBWK25gLs-zoK?^JJQT{6gb&VyX)^UVVRwn~)(-SDimRd^m=E%98@3V-t0&lLt zQhgImz+9;>!J6T`U>}+{aIw9!6}?j_;*d-O1r@P0P(+=OaV1bh2f%GwTwlcN1*`}` zyn-SK&OV1Na=pU4e+Lw@=JS8SjYXV4%*I6beA$g8vYr?_QOVF)CqR ztRN!JWS2jV-~@3nc8w@C6m(Y!{=w`K@^I{>%92uI_0CsS-2rt+$^C-;E=q;`?)iiK z`iJtv%+v+PUdjw)w70V{UL~npgs2c0JC=+xK7Rr{Cgd=M!4zmm;!o6y1Y8ao=rf2t zADqJ2GY>Bm6$fj^TAwYZVH8@C{KXr{#oPMt7d3$g;qZ4l5$x6abO`3(3Ji7$2*8|x zMo1t#LLkp7AlV_1%>>fu4@SdyNK$iTh*u#s4~X}MW1BACeHQq!8?qIhu1jHj{x^g& zzdo#g-rTlKOQ88q460PC!pW!=TpuO2)UEw1=l1XKo0DX5)rHMz`!P5XJ3ECSrw1XK z3f$m@tgXq_#RUeEi_@2C$ujuu6OqV@aI!6e^aE6yR<60S?HUN2xfm zBH!n1o_}B?_>^OX@D)_@=3a)%F!3|ghJ{*0d2HMFE*XxQ$yVE@bIv#`1MUk`_z)gC1Nv*=Um-d z&0kV`L@D`TrLxV2W0rKl)hja1C{|!LNs4tF!q&Yc4R`Cpc6N~LZvCiqL>>hu5NDVm zlq*pva8U4qDoA9(6gKc9q98yr3-g|iF*ImjfD6>`Gh$0Mwl^J{RmGlEcS~p8TIY)k zq2sHs2%Zce8gOn^LE{9I?}wv&-dr%}wHwZX2FSfBXs@Gf=Bh@Z$uYafCb6&CSPmW< z6O=MtKHFE00-yBCK5}itU|2zAUCw#2@#cah*}|1$)ufL--AE4x>%v%&G7x9A$Y}u$i3Ebq4$6 zVYR(U{eAt;B$jF0u!@rHDR+?el*3jg*m>+=U{5*xf(fVWDR;1jUSsnXY<2<_LEIw^ zead+kP2OwWK08d9G9i^b(AY+9B)AtIVh9S;9&8FgAcCtby6P1)7aGF-ymaBICC(2p zQo%@o)OK{jB!Eg#|5gAn!v^;sj zeDpjdMZQ_c*P_0hagKLw1f&r=!p)!^;cVh5Gr!^OnKNjwIBV)DQ))E|LpU*wK-fa3 z2doCy5TqbYPEXsy4HMmm*|u=SCuyG>`g!%%aA+8qCC483`_X)dbCf;g&`!WbCsh=* zQKd_#3Krh;2@P6knLYA5JN^BC@*5~P}(n+$XgGw(&Je}H>1ShrT7e;Z1yabsG>MOL@RH-!d=~UGK zY2MRG14O`(2`DJd*C6XWyup4wcFl!im3{1$;sQ8<8WmpsfVA)FPKkPI@^}PhGHO$N zMUh<<@Xkvb@s8HoF-)d4a5_P0FH*HswQ>sHS-N7V(&Y>b&G_Fjj8HIwIZ5y?fcpZ{ z48ERAy!$KAo?jnN8>^6Bl6Psbqq9ZK!e$=__yUT; zUYXm~Igx6S@f+{PiUZU&vj1XxRR6pA{AB#JAfT1wpRGmSCX790K6051-37T@z4Nqrmzp{{T1E3&Y)FW_{bOnc@g9cqS16!rIZkQ5 zf-&(0<`eKjLU%Cl!_ss-1&19(qe3UagM);78CE>wZ+e*-Nz2UNsI*Y55R4v)^)ag{W{lUES#f~Z1GvpLyhqoIr$!M!Z{^T;>z;~mojUpMhV93F0k~TnA5TgXo za4nQMhnf6jOqKO!s;~+>iByECBbnkuTnFdIBvN~v&W{2?USGb%)Sfk`Nu@#1SHxUJ zqq!#t@R0)WR1n~Mct}a*84v_`K>>Iu2(T>x@ZE=jBIYUprXau@0APw$`(PF$6^P^@ z#FK$69ti^UQUJn&01pHJmIlj+Qvgm>2dZHR0AvSqIQt^2r!N5Dl#>Dw1A|%YRUlRd zv$%pSxu~M^f&lL*084@Z-vj`>L4f57z@#9+rv%X84`DB^x~B6}sR5c}i$ihwlLdo>$NU6RjMLh=uANuEn2Yi@y@;$X;_z zsd*!+WUc_@I?M$e#$)tUGkX3md1hb0(Ed-hI^y|-!zJeeeORtmdVfKuF!Sxw=L%W*o5QrdnmUtxHZwOYhgGrxnFtO z6i;)M+gRMfox-^Woc~qBX%uuirp0PPfjb@GA$!0aGEiUM%)2bRM+dHiE4 zC+ki*L5N5N;&2e6Zy<|hL4Y5~d*W@qAqdbW0Psu@V7mhFQV`(RSqhdf1_9nw02~T{ zbDjJ-L16TI37z9j97k|8gP}DTM=p+cag2MJ;}+t04MzzMCzQr_aqPqq?92%LghvdG zCWspCFRVui9=9%!JvqY07AtfzxIbqQJLkgvn!-Dq!z&>_kCk3|i*z$M`$K%(U_`|Y z*3zmiEd;$4fJh?n0L-Fv0-2@;J`U*smrjqeX-_BsH>c_SA*?(||6y7|T&@%k=1&^N z1U})1KnZW_qIa2*>qNJD@mWUG>EBbcklDNKQBVYbil~6go4hj(wsX=9J|C!_xh5np zE;4zc!yG7+7d2Cvytwmk4djJ~ubyoY5pOAVT6$5CM(=rfe5k3!Z2%Cd=qlTo2jVQtHB{P{@9|z%Rj0*mDm@vBt8hub^Y|?)X5h z>iH)`L1#l}t&BF-2E zOpZhmPUU#K(T`yj8?t#Kt3+f8vFiVqnsXwrb@E+Lvj>rtfx&M2bO=@Xg?E&}Ch;|V zT?5A_IJ&;haYZ;HS90789Dl_Ty^7=J<2Z%mHyqGu`d?hPMc2bmuGSYRd5OR}y&wD98*0D=lwF&t7?DG`;)a+$*tR z%?n`e*gO%&GG$(@szhq`TKo99qY-6zA-9#d$KtxAa&$lqI~JmbhSxIGm097^lGi#! zoH!2um|j}_+TxZ}0xC54N&^gfy`IE~K+i8(T-8wx-aY*KfCdB_3<6b$2=vM8Ap)t5 zu1gAmLiLJTnLJ_keJX@}fF#cWcl(h1GfR?$Y2OG4iKNw?@E@$3pa7JHC-tbB1)$n* zrk6$PdjJwM{UgGx)3z&~ovz3!5aZ4=G)T^su>VF%MJs13mGYSSHY98NRY^TqW%2yC z`U-K=@%y52>7}@?95?5&2JU`NnzCv@sEN`W=Cy8BdbdDc_xM>&JK!q=E#QYBexf%@ zqrJcyt@-L%tU>cucW2l4RtxGrZNjBXt1med$dhY8_yF^E?Bv~ZQ0KgUi+T4<+{hn8 z7slj0tYO|Ag9ort`fKg&`ls5P_P@i?Nf0AT4NbzTrPge&F!qxfay8371hml|SJm{Qs0XvP){(WH`Vn_)@`Qs^6|Xw@J^Q>3^y0lyxr zknFngX&1c4eN+gU{o-CImT+@0FUNWCzY&YCy|EsY?6t_=Sb@-MVs!HBRo(Udqvw6G z^dbg&C%>#5u)xq01pwaNoKoiX>%r%@!<|wq-aQI9VF--&8kvjbEtIFo_@!5r0#64E zymLJjI8XN8nWGd~UmiwMzY_&w&jFBiM1t4o@2}>cLRbu!cd-fYCOd`@$qBDoh63^~ zKEdbHPW)JwhT$5x4FZ6&KLRGnAb$?Zdpp&)mX7jC$Ba^Y+yDtS_ro&5QpZqDoDbti zqf9LD*Bwf(&u2(59}*%80URx9f@l0S?PhhrvCjjh)EG-GWj{s?rtE+}iTnZH5J<8D^2?qe z$jAW5oT6YZoC2~x1k%$PfEn>p5ayfttfY5CFtGuU(V>zyDIj79qzdyZgiLg(q#^}m zMhK)d0P@3&!Gi1r;`FvQhhW|a!2A|M=3XV6&LNPz0EiF*>7ju5cL%FIi9j0uDWNm2 z)7grb4bvg8Tnq??!^J7E$fL9!WaVfvWkOfI{LgL_ddB8awKR`-!FjNWlUy z%+Qp_D3nDFO@9`B+yxFYTKdA9kMQf&{rlS!``=@4*?+RViI8#3{urREPZ>T^S4SB> z3aeJ*`vLS=aAL}qcfXJ9tm1iV>IIAIO8ERK7I7ejKf21mPw@8blP91~Hi!*x>^&Bj zuVvZ+YihCl0|I_5Vx*}crx~_#7mwjy@Xl2k3TD7TLMS2L1bm8~5kT0rEt`dZprsB3 zT56J3u5qviFWwa-VA4pXH3z;BY^ps9$m=1H%l9fEcZOQ?p9;tmA&?^gkxuy0z+vH@Dc%2uu9dSpEF@Zu?X_)@=iN^9t&yI8qic%@ zxI4|*$Ne@aOp*Sq^uo>3t~Ye5%~H)9$+tOMZ1LvW-H$7LN zmMY#%QI$#;-|U#V3zCD_oR{b&&>TV&Vcyp9JBW0I_6QX=ta%e)g$)@H_iS}$Hgu%( zUuvZOZ<(DUtmW!%j2Mn|7I|STHAXQ}q$mDV<}g7dPOiaTu*{i+FS(E{$-x^05s}TT z>1od^jii?s%wfn3Emzu6FRvY5-x0{5j%yIbC{?@_?yP~xhv$GkF~)cMP)A=M1BNZW zLrY_8j9K^8okx7pEl;_N(^R9Puhqs{3#pQYHaK!|T(|-b=BiKY!yT%PU)yedODqJ0d zJA5;yI)bhn9&-8pER=;e)p?iE%p#G80>D1)jkLy$%g$a#et0Q8HHoJH?dU{%!SE@^ ztls=8;2?Nk%tOA+eIe`C!F#Wx&Ago{{{d|Chw#CtKu%B)F9NZ=EC-J*PBiONi#=u& zpHeDoo>x)q!;5A?5EsW`U41mU_C1T^s-yE38^Y{rzu824^`|0uT2Ju~E%?p6ob;TE zD~J^Q*joUh5be`P9|WVDKiwWP0oQRw7;tH-9r zkzf?}dTdsc$AR6A9JD>+4DfUg@ifxV?42V9r90w{>5f=Ob0GRGkAWK^L0@$qgm%)C zE4U#)MaHGMU7+QnPuBHtL|ZX|;W1-Ba`W9~n0LjGF_^XRSu%>};JX@IEg1(80*o&U zm=maa3vC(u9ZgVI;|D6j7A2dbx@WFE?#LFmrk0uAUpd135(yWT!5$P{Ry6W)$J@7RF zKWyiVbAG^Qv5>1VZ!yV{POK{VInvCviM@a5LgFOow35HlQ8mkHR}ylA`Lj~6FA3JP z)o&3yo;L98-4_Is7eW*-?PBPqbMT zq77MloHtRcV!H26mCb~zHRbF)F43GL3K0z9>r~ZYy?q5{3nY#K{?sh6dt6Sc*-RfkZJBz_qUp7IyB zqkYKa@RF1vvGz#{J$Y3(p2Sf~KpY`x5kDIQ0YfcPHl0F8*kcmSCYs(-Lb7(rGln)q zVU@D?FUG+pnCHBN2t;m9K@n85R?e8Jzd)0e2NsgN?uRpp_0N_oqSPRNFpG&&_f|!e z8sw7#Kng$Fgb8jO&*OL%$D23`aJ-0PC5|;XmP592(SPvg{Db$=DgcD3!*2+t!JCLk zxLPM-hoFF)lx-5EIkGPxz2Tg-(4N@{{=ohP#wdP0j1(2WJ_^eQojSPf(HjsY+N@W?Wu+8fPDk%?uJmpp>Z< zqcZj{Hl^+qrk%^*u>>I}!{Pz~Uto-S|Jq|a+KwiVn}09-K29vI&D7@QQorxR`h6yP zH2c~F<|izm42yhG`Lm*`W3dUyL@YmTAP(-;k~pXdcHksurXV6csT%$)$QuZXOoJe1 z#Wmb+fw{riR~$020s!eV^$j)^qqfjftapJGK^yR9X9=htdCcV_W-2W~5Xa$JCipQ* z=-0#nB`q^MFP(#Y5EGP=F@Fr4P{;aOYY(<{0iX2(Fia?+MaeJA&xkV9P&pV+Y-x3FzVa*F*y4x@$V$o8(+zi^dJJdpi93dU zm&OQR9g+uDLKq6g<7MW!(zzvl8iPw{Rn#xX9~A&_;sYT>BD4l7B&G`)zthLw2FKCT z`@VuV>l#-r$k z^|xpX#5yn;2 zDWDgfNo*ttPqw3X5OphxDSQ5TduF7Y+E2dXXWh7xjf+6qHc^-&K!l*)DE3 zs~%}dRy9(OIx5oZ&!|U+TU3wWf`fX5GgFVA45>$$VTHcr-WXDk?jiN)t!*6V!0{xG zen0jZu|p-A;O zT>sCE+*a5P=q8NZd$1GK9~!wfME2jhk-HD^>Q@`NpW;~qsXiMS|1V4RfRX!uCe>kI zk)<1y>c+n)QoSv%|D#gf+oq9Jf3nprNcBz_5&nOv{$Cos-Ok;LRCiz!rLk0>fFQ3w zY4k?jeQQ$vIF^7E%0~igMJ6o@O7&3_nN-*PJ1EtkOed+X*~M{R?BuwUI8NjE1;=3= z-{UxoqZY?$nsNFgq5VH)^kN?sw$wcb9us^wm8@G@^vj~==JNUQ+>>LOqUMasEk(^? zvJwF|c?&33ZnpB6V&#qkZ=+}ohkWyp)@F3|353!L4S-nY~^GQOdIAO)&|-) zU3Sj9pEYpiI;DZr<+tuqM)rrWgn$Z5mq#fex)8{d0g(GcAbJHv6#|(O02vnoX{vx6 zdoNf}e*zf*m0?y0=10T=;K3&$n6?BH{8JnoN;`v4npZ!QMs7}RaTd#LuV+6tw3x3p zK-o@RL~A`v(OhPbD>kA}@W52e*kgy6>qE9(%1t(8!*-;EQkN~wou*bwM=k^xk#ipO zXX^r)<6qDG=kQ4j;=L&p=&fdDmkmxJUt)pUq6C%G+&8{vJSeY!80Ww$%U$yDr>MfT z%aA^}4tx~ms~hI0W%)U8GQ%tRf0$w1tswYrAit;}hSIxRdOC~V!)HTjdk_`o4Ma@icQeD;%EL$DhrQkdtqY!+XC%1-?odxQTl zhH!4Z;a}7-@w-iLMF5mKgAm&lh?jy8zxGlfzEJ=wnt^k}|8)#c&PnD5j@jx((8f+R2tcrsW+CUa7 zf&lvzfK@>Ne~%)63st-&^cl-M%zDBWLATM&S&wqqvZoxjLk?7l6DF*?%f&RNF{=MG zJ|98Z5G{3xRCziaccsP{PSR|%bol%>%xGg8opUYHjmC`jFucWD$MK+@IZsObysfjx z1w?s00EobxcRHmf)x@DeHci4dH9^*f-hNkIF2C&G6lvsbdjD;T9jUr}48Y>@rIol^ z)H^oA0mH#VxIra;SWyrq`1NFScg^G=)C5p?S(#vlSB#Q*D07Pnc_29{K`7 zxiNi74DWuDNW-rm64if@eO&+X_M!c!+6VN1+}^%_E_NGqLRw=cX%W^H)>aRNuun(- zt?p|`U!=>mV+T!*p87LFu%Tyi+-5pecf{jp0)r1+6H7OUY0&&e%mIaq#hf#zyPl?H zeI|7&)y1>85RV3`GU;@wHg$0!QO%^r&M%;N-V#jZ#o&UeywEgWffe6#z|^hO7yE%@mjFbAe~!*q zAy)#kLQJQvW0REl6gw7G+E!R4V`j@44W`rP=gKuP6bFLslWaNU<~|aQiZ0zo{LSXg z@abi?%*tHBltdepMGBJGEw92(e)T1M7AOJVwhvC0y`@Z+MO8l|F9a_X%66PdAQ-Uk z0+BIG{>jGr;+8k4x6*?SnAanaJ&y-Lb}1mQhCnVswh_qlk0~ICR8T+`1VHrip#aEx z$fduMalQgGHk8eW1OqSVAt>?1ILdKs!*Kw|E*$rw<8ab!DP78wqE#x~wU&HRbb5q3 zf{O_Kg$M66LERJA>&&aYyiRhICkg*k^I=kKWxM#hNtb2o5&8A_Tx=+keD%8turZ+2 z(k%BCG8cwuX`%>oWT-%oR9L-b;LzMp?)owQ;{vh#A7 z(kI3%Bt8d%(WDi=+c6T8U=@Nm+<>V=OoG+#c8>WhVk6idL(+q;BZ{VCvtQWGxd5Vw zX1@$pnoYw>$bIrZyD&bZ=oR#uX;{4F9~p@zb2>K2># zVLLP^(>@{EU_R`2g*3_(k0*&%T8E~1G^h~fkk?U7FvU}pbDyd;bmLh%%z4{&S{CdH zso&?_fYc{5ORU0P>_Ay3-+hH)+Nbm&UIRWw5C{DHIqviQjsXggR&EU-q2GX`cq1nA=nk4IzkunC!G`D0&PtXJ1ghDRS-|RJ%IA9UGuwduF0NFx@5Z z=BV}vPTb`m2|cs}N7e9Jd!uGYe8+C6`=5Cm$r}%iRS;wap^4~Gj}yP_mCy*e?cmUaOe`g>daZthygx8P zN^L$*a;`d!!Et*1;5g)ZgCjzU*x-nL6KHVU-99ilu8@_%aS^WdgQHOy9C5j3aK!#w zjmE~mITw-O!iWbckFoJVL==hJOsOQP-J-1^e@8CQhR7Dm5b3Ut26QI|O~GhMw2Zl3 zAq|tCKO7n+FSB8i(l;I{?atsRIU1v6CPvA-ouOf};V7Aj!EW_TjCyyXr+kkeuj0pb zhDZm&&=8qRH#9^(On^5WBHh;vk=T#46k}vyi0ny2WXm4Juk}M@G8Q^WZAwkuzNSHP zv-+k6NlV+l!C|onhQ+IgL_Hf4-O7;YzW$JyhYv!~ka!s5V1ab`%Oq)HnLhqpqwz5C zU1yAk2rtn!7!UbnOTmfqBuF;eZ!s_?4&hYNGe351q6~d|sEIEN-FseQD9mkEpF&4*29N9ST!*S*ms(0DP*`|Cf;;LlOj0YFF8`wKD7(U`hR-jC$QKDr_DY^*Uif7 zXw*x*@u=7Rvb1_<$KkE8$^+7Qef#-_vyE| zz>cpbXgcH9bp-cs*#W_Qg>Fc2pTW(o2=0*F*09(oCb&QRwUOZd$9Y9?M}9$q+w`0C zKxwOH*P1hTG&W}j1m*UfklTu9`@fXl%%Eu~y>*Q&oBhg1uy4Y$If0(qz_Qtixb2&= zY@X|U^Ont{;DbW>A)ILp=ruVw1{_D24j!y~E;t4>OHe>IPYQy3s(^SyAl2~-h--oZ zqL*J*KpqKz=;iVN$SUN5Kyw;x<|#0lp={nF82L0z85~D&e1YRz9AD$eMu)kT0YEB# zuT#;}3sp@F(0doZevKfgveIJ1ptIv|$lRi+bV5L<`v-Mv=Jg1)Nz)sa#+6%JvVzJ>u7Q0gdyKadd4t3||B65@8S1=M(`b|fKm#3a{xKYqVIAR#z{ zCJAvCPyVBXD1hgKJRq%C!TqsTaeovBRlB~-`?3CPBMI@ZGt#KkF@{pXu%G8XaOw+EWP&P>i1CrD3Bt^EZsl=wzW}1nni)5K7CYq+CQ`&S9yNrvl zq^6X#JpboeYo7}UM3?#g{(L^{v-e(?z1F+l_g(LL-*>$WhmPRC3jdY(e-Hof;Qtne z{rR zwRL3T0R{9$wQUsBy1-2dL}z}%R6yfJa|-A>AV9JB5?9UvFCjXV5}vL(OU?m_`TjZJ zL8!l(<-9k@LvO6%CDIKD5kk@jxUB~Y5}Bn%m6@eArSvCzeMW*O431@*P7 zqL0W!YXf9&yZ0f+Q<2uKVq;UL7Mq$SUicCd*)@FcbyTps*zDz3-6cRJ5mI_=uyhFH z*xN^(nvH#R=?YDrDEv*gNcy|w#G2Gzy=|3T*KZN|PT z03)Ht!~YY>@9@V8*G)a$!GB}G^yoj@I`ud@2z>g#(9<10K*`U@o2f-iiIpeHn8D}4 z?GuVjZVzNn)t{06Xh}!Y^szX?K(cbgCP4IM{R2ng7x$dy!WK8!E7HSv!)L6-_w_(G zn0YaJ;+(xXeOQBZUPNH|Y)l5Gg%P4r+XJVgC?l-WtDx`;+kJ}<$4hL-BKUHpyHb}^3QZ5)@K8?vUrN%I&^Q;p9(6VU=#=g_`nhjFWcDviRGd=uAyZ!?ky!=}FX2DZ3mgoC`E%mHx zm*(k>jmy&Kl7lS|Ej{y7_Dgw6$rCMbOhE8(44T!VLrjN(Bg~}#U4a^*uN`_9IG@7T z0R}(m<%jWGPhSlH+9Ucp#3Qjk+%GhAxOtrD@FJ?=T3~rUYBkWS8Zj8tS|1#CWK-+6y_iV7U9hg zfpjizZ3tcm)a!_^wCM%CAK-k>qM_T==AtcYz5dhgz%%!NOOI9gI{*^!{3+Gmj^)%I4n zU4KUs7S8g?Hh}Yj0O)EvL3DHLgP9Nc#9a_w-r#i$O)Apb-cE)i%i@Ukv9I_oFlTD^?I@}3AB`_efr96`4~ zu@$yQGLB!;Pu6w9fh)GOI-3)q{Dce*UP30wFfuqX>UuUHbFN>{xJ;_i=YhzipNQS5yG;&d?sIO1Q=LMVl2QG3 z&Zp|T^7nJT9SDfkl=F1~7L-gmIw34)Uy0}F=*}M|hFko8D64muY(IL@l$rm6{8HtB z4I7B;Srm!&#(9hAR2?q98V@HAuWPq>=zY@JB23_mV)37V^AO!g@QKApkf^V}Bj$}Q zx%yZi_mr{p4B6(ymWTofwHDnv3Lo`owsqFwxS8vL2dQUDtSsfdC_?lJ$q(Oa{#M+|p@^OM<$<9j*tx;9c5ZWS+}omg#b#G4o0>eb`w)r)wwO1&vk zZ&u;Wa`om8^=3IyKUuw+Enm@5P)={M_DjrnnCo(7+^Pr1`r4vT!?qtg0^=b3?@-KR*!u&W zFI1@cKjN^2u9&DHk$(1{lQ_oV{>0vxmcrdQ$H6%p%hAG$#dZYB!W~Td5IXO?q7Fe@ z_=uES>b{cqb)WNGqJ+ASv7E+lLB--b>Z&oFIV(jjma|lh6`rjWW3gh#=>VKJ=81U_ z_SJljeJ{*%W+2Pj)7>)9U4cCN%sl4@@)W9St_Wm##mv$-kmWj+B`J{QA!ZSE=t0;7;MLl0PdD9%$#SSaF|;|FiKw3ICVi{|fwP;@<*jwZnfW{GX2h zp7`&N|9JfS7dlwov~dWo`%(@;SsxrQAdk}cLx$iib_MV~dyIbwra&~ri@rDbhu}}x zn8qxBO)|5%MS{xn<6M89>1LiI{yf5}vV0K8GRDlZGmz!8X!)g=16jH-i}*7{r=4Pj zye^klkG$r~Yc2!a z|4-rn8T^M10lN3)=l}#%yZQ#&^(T18_;bUD-;FVARG^P4aCnX%92Ye%FnfFL7fB%> zr2Z%5xDv4g=2iH2AEvJ+q~pSWpmXB6_VVRE|4Z6togN3Y)@NeF1&#%=;l)-*g~eXp zn@QdnS4VyyyYH?7H5OydJmzsDHdz~JjBl?EZ6AY=h`;SLZfdXfaevbRS>cTz^F9t4 z!lyr2$)Yhwz+i7oSC#gROuJa6*;KJumE@60Nh+z6N;*p=-71rMs-*3BK!xK}(q%H~ z=WAuhMyRC8Dk)heeRi!|rroX5E>~&&WLg!Ad1JEFyVK;mmsM3;4EdEgD(M?M`C?Y8 zB#%nEQ6=q_Nx3TN3YB!5N-CF0*SS^Ne^uJeD(y*`Hd!UrtE9VB(!DZixJvp`CEcTv zZjeb`R8j|(l&_M~Wzx|s*;$)PDwav^s8KTQBb9c!N_$cj>n@WjRFdaW+3CNkq!W1Z z#XPH$I;&DIs-zm3biYdKs*+w&NpH)f+f-6LD@1VKO)BlLGVOAe_AJx9F}qaKa+x$% zC0(GB_Nt_8nbcn;O;<_#RnknE6t0ruRnjLa={%Vvt_edpdynEc0g5Qsvl0^JU1JqdPDOQ{P&T`F{zMn< z!;Hn}YL52UYG@G~w;4qpwb<(ioxpTjt?%bj`4d@>RU$XZzsj*~7+!HNwWAbAuOkNC zeK|amp+ea^U2DZrX@qr@hMWQ)x5@cBO7Sn+*>MxfmRu9pYhalz!G-8gZdV0%F_g)T z!q^8a>`<1Hfs9>Ybn2u{alcZ9dl4Mk9bziftR48KJJZ5zQL9x!glEvf*3>c{4fs5UvMoM*shzq znL+sCrWOZbemDoAWL9&7@SDcKIuHJBzh)4A3{!(}?H4T$!UxE5${>t-?NM>Sf*lTZ-?Cdr9k{fk|NELVp&0Uzx;{IaT~V8cxbTZJZq@1ppE79uYio5GOLno z1e5dq_?|Cj!ptzzu}lzq6XfRQd6%1~OXJkWgCNyy_@qleD6N7B&um@hZ|S45rH*Az z4^HQ+a;#GF$1=3Ck7{KuNEobcnbtma%;(sp_ARx7pcQ$vx)Lt#dJhW zj&jZhqKk&V6VEnE%PW?by+$T^~zG&Cmc^vKez|#i9cgV=> z)7pzLS&`$#w79p^Xrts`bXv!)Xv>Q@QC^i^XU7==&6VC#!)7?vv9v6+>zmfKBnZ zT^sFsM7%8aF8CNeik(bVU|Q|PgR0oZK(USJ_Pz*w8X4E%(+6w`j(yyoyboM^8M*c{ zaP564ybSF>B)$$;VE@vqPy=8;h}*CwU6_n8!oKK|A0~AvNuHcAxR01#0iM1UjDrI% z_w&+PCKZ;+gNeSQ2W!TA=V)Esfk3dpkPtVb+bJK*U3^)vB;$Z$ed2Qu@XOe;4!K+o zmfXNeiw&6Q3?d9Rz^9~oC!YzVwu9M_3R6UnMAh&kvUmk?x(>HtOS&=LuwSF4PM-se z7Be=Y+CBF2Y6%pC26oeuj~KypRq7IMi%tXgg~C4C9&76|DHhL(cuvG~3Z7H&jGfq1 zGVqLz*psrH-V)>b?%E`GJ}V^6)ULpiw9yx8J|gFL6f<0YRFV$V+=pn|*m6!r1(Ho+ z*PQ+t8FcK)%>#CNa3&Vwz$)y_V>c4S517iSCx}gZOQ9$6b646%OBBA2KVTTb@1z@| zyEb49HlqVH7-a5v#Y~h)BUcJ5$`WHV1+U>~4kZb|D*?Bf@zWx$r;*u18|_|;0T3%T z5IWNkI37kH3`+s}f*00lnrgdZH>2>9gr(XpPhjVa%oa;W37Wgp;Yb+4# z+i$UW26*m_@Z1)e<~cv9BF!@yHwYiNzO&OL&u5g@_SF>s4$AAEAGSh^h`jrQj(?>&*rT0 z^v`G;@KSM|P}0na1!>NjOKI68%~-5Oi0M@TxuVUDLE7A%2IQ1~AWdKhhrVU(cT^Dh zGsu^5bSETro^0uL<%y0zos>-uXOorS?<)kkO1_+j7+tw5C5ZAAh*pMzC{Kdu4pQ^& za>VzFhtA+JP_}~i&@vG7J3p!3E@0CZ2Z=e+lLP0rt!M>Mk#g$xee5FeF)gktt)sN0 zO9qhTC+0)~Z61jk@yFbb8g^#^yOUUt{?wqRdi1AM48-w!9D-ix1pCA3r4+p=m%S)O zFG~7-GCG4=8&M3)9S$rcDydNgfntmP_Uy=dpB+v&c+edfZbU)yToUcMvnSI=N&cvB zt+#Em}_=dqTF%b{Z)Ko=@w$PoW{&aEW97x^L|DQ!eVg@ zR}evv8Z~VFcw_2Il=G zdgymtea_0yh0sIcy#abyf4o(C_~^Q3=wUMKxBn}8&>Ix~i~P6S_dp6(|`G&63L}h--EM%mr0oYA-8pzlnA4QqX%pelTxZCIpsW% zfFd9Xo~Q%~7{{68pU0YG!f^GFg0LR-BM$n&EIoMYiT04wD!vZ2s73P3(Q?Ch; z&mezu4%h&W+N^wr()bG%&k`Y?1w?QuoJkpcjj;TnaG?PWF>(8Q+-fCLhdE}DMTxl_ z9`Ce$;>#!{l_Xzw>i72ZmooID0EgDqAi(}f4J7grMmdV&j(gvgaZXae{NuJ#m~g9G5X+bJ~ zoBc(|RnP@ZiJ*vYK_kRmK))(K0=E*!`XC$A_yV(9vA7WF0rCH_y946?(eKr0De*r( zbhIe`AK`ujzl@RR^qxulnzf6)Zbtq`Y5axaSF7Ux`d>G9kjzRo?5VxV?|0rVG ziN7O6Hl%*c`$VvAW|I|yor#wL1j}nA_0M{j?F>b*_}1he3`Zl(!*fiC)c=oq)!OI& zM5%v}v8%H-wEKmkFB%8o8I(}0z%8EMX&f1>b$5UDSEf7>U(YdEx`ntBK(IaBhbeZ- z>sDSHM^wTBl{~DJ9oDT~E;G@~F;ej`%Uu#+wnAo*8#eY~!^R;Hd^z6z^WsIuf?58+l#=ldY_9FbDbJ|(*y36E>WK7x)<~6|M8Uh>}fCc8F#erEngDvo2d0*u?Fof+zVaGa8P7k2h&KX26 zQ}@vW?c6BF?qHu?>zb}DFGW%ODdcjkLv6HPqHm6MsBbr@9&u>hjw+BnbqlV2XbBk2 zG^iC^$3($5YVekzT_!tQyx4fqt~uS3c!y1vicr!d(}FvU zQkQl{IQFI(4-L~|O6n)}xav<(@rbY2Liund`i>=7R*n=opKAVFV1J2Ve?$pToS?`gexC6LP;^^!@PJm^3Tgc%a5H$xB7|j>JS?j-@Ntsn8Ro|`#DX5`<4)Cb zGQ!ksW8%$Pd|wy3W~$ILg4=g&_d?So0WdBeWLXQO_2DQt3-0Z56`5$Z$ySIpn=e(b zw5^k=bHQfg$*%Oh#YX*E+UV=ALr$EN3_&xNQOOnnF)LIZ6$`BvyKfIVQ$QnjGo8T@ zW?%@F2_a_j*9w>!;==B#Km8RjvJLyqT5R9pXi0NjvEe<(G6A~r#2WTV8YI^)_CE ze<>lh@w|yqXrU#$vvh3+)#jlgFmvqx0Q{yRJKCx2K!Jp<)=w5-Dg;JdjbEpmJ@aCC zK~`2)gfmq5fWYzJnW!IvP)S+uU#ta6w33w%0bE(Hc16y52V*}f)O4Ok{S~swj zqNbABaWUt%U}Sp^J~e3PDz;O01(r9=Ck=8wsqs~p#10xgVjx;8di(|Ya*Q@CXvcP_`c`4fy=MrnQB7Xl&ZXzQ`oBM<7%>EyNl6k2vM-lxy6h;N5( z?h*fnRuv5?!OQtEGjZj6Oh*62Z6gr9{*?q#89G*eZW9pYT;c~2mgrs>A-~+zMi^B9 zeK8`AQYQ{1$9zP4q@x1!Q5iXY83_yXQ5h<&5s7euK~smKWzE728m5Ml_(3DChmdU% zt5*YVG^Gamj(NxrLOCT>;G5Oxj&!B~f0+y%kERqfekvD0Nqp;$hI5hTew-|eqv?Qgo z4_J2Qt%g*DWdly*Tu^Qsx_B*eK5`+tC0BURh8@>`)ZgRc3ZUk4z;OtGIVNIBD|+Uk zbUo)t+W1d%I=m&&&)R&97zE1o0)T=cC=M0Bq@jQzj->P4j~v6Dt_!DZF&b?{rZuPu zW~DDZxd+nYYTlCIQu<@Zi?)Q^HFJaUvvo-5)Al7*cyjl-uqT5Y7L8gax=A#ZPty(r zP1`gdB{<_YF>k=c?WTJyB+617}nqXmISne7W#&3=hERF^kss;#2 zC?v*yCh>0c%?cHI>A!PloUZ zWW;>#(yR1+;zfW@Zy3KddjQD3E40Yiyz!~6P>|09*ma$GP4d-Yw@l_C{Up7@$DrP0 z#<1J8Ar2g4w?ibMG9A$=T|UmJ{UDa4d!LBs2&d_@GVHd5MfJGcU6ZDNP7%j0O*>$l z$GFc_d>dXe^@46T?i^O9lmi{cr5fL#t(_Bg-HpcZbF@A~avp%h3b7`C;qco-i^ks=V(L55AmWo$n2|R5xsJJzc1%oElXaOS~~jBqmkj5*}45^ zhB~7lpC?g^UAj?yj@HvHh=wv35G!peA){mm{F@Ro-6Ae)mSb0oSqGH3 zd6{Y%*8-Q|Rw=IF)0itHYp7Oh0TH?usFrJiqxg>4BmuEc9IQF%EBq)RGGFwC?2Tlu zex0?0y-{m3)rWp>un&&XfXK{Arp*lW97O+J@~P@WHXR>63eG17np{jPv5b~iysuIYG zK6DoD!Kl}g)xfVwDt#*4U`m`J%6K#dl+br$do~2m+|qP?&RWJ&>S$NY={v=ox_(Y@ zVl66#bj6~?g_F?&$xygSihnjRs`R+8JekD^X5fr_$LUpGApz+#gNzFTy&Fsh27noM z$-8U`*R(v{7d z2c*p-(&AQOZJxy1(WbyTFCaUYj2qO`{WI}*|4MQjM2z-2%E2h#)OU%W-}m|Gt&}qk zwv6`K?cX?zv8y`=A~nv274H2=eX<5+5tz28d|4rSe~Fiwk$BTickH)&+S_qzc|2Gh zEJRgch(7@{B{0A;vT7dy>Lh*Co#Tzb2e{gCMtY%7^2IXa_Ep*t_j$CO^+nr=qF&;X zhNjV1mjnD~1I0)M9KHH|R|$g>#R zuC@_1fV~;caC|2-kL3~-@{$UWD>;a}(DE&TllOoW>@zF?r~tKd$v%T^CQFTXr!W&jI$%kx%5NhM4>n6XTQBY8L|n{SxD;qrjIWpS z>odfCA1d^{XSPCLEb;z?Thlcl#EYsY+^A?_^gB@bF<73y?53_o9Kv!8h)d%fxaqX- zfw-NppGCUa6~-e+er|PSb_a>PwXhypB&xz_OH_T5DnYR8!V?5mVJWV5j{_qWRrD!G z3Q;T|6?epI#Rpt#-(s{Du$Tsz5FU>G3LX<_ zn+E#^JZPpq6&|gDV*->Ua4>!ZT>#Pb2hp9bh|ZVY5i&{>W~QLL2$>UbQ?0IoWRIRQ5O_>02z+x)O8&YxBnn1 zGV=hW-9tfX*IoM{3V5OF3INdGR z06h#pImY6}Dsv*qf!;pXfNW*bq0|y$7VzZ4BMMuR-4G}-^oim!SWA8xf1r+_KrD+w zi3e{e(c3JT&^iq!kOt8ZcMjc(4B#A02(A|=io4%eIJf8;g>w*lZo{oofxd_tq)LiC zFRBRy2kQjSK7Wy7kC8D^vvxfAkYD~?WxRW()}zlM@^nhP2c)EXASme`F??5oqf1G5 zF^Wk^_ZSiEy5$PNINGfv*o0$5t#f!)h(&2PcG`68mo&rJ`ZdLAFc<08JX(OEEhxl< z0dmFy=v?3q2F+)~i>;1BP}n3e$s6;{hd=~6T%B$D;Y3{>0L*DuTT8^G$?hIt`{M3m zzn|NGF!DHD%K;vXRo_)ogar?>KE$f{F{q%2qIN05R(W!UK!lw(k;r9=u+X|;yY1!| zi2|;ww2giak`~w0Ndb;*RgTnkz*#gBs$7p_BNo-`Fs_buU@C`j<2r-^UWWlbgj(B+ zsJ&`@tqKGbYc9eRVFOhb>*8_OQmn}%6|LHT}`wPciivb!^YBIZ5_J`PRw76~Bh zF?iUaHL@EcgWbpp>BesHjx<&{&<*7|frg+_At3&xMh$%rjRJ4A4m4X;a`lCMA}2^G z%hg^A*v`@72`r=PqV)Cv^Pcd{n;IfL?e(pcUP{q0pgRI?EpqyobXVaRFfsSP+$)nM zuUE?J<^MJMUyT)26WP0Y*=1=GU?gSlUn9Dl_@;HyrR4nxde~Ev4Ut{8j%`tP`5%Zb z^ytkF#Ph=^9!QOtM4js{C#==9M9wS*MUQc zF5U0{y`sy@o+hHp~4xzV?4DxlD7Ll1t^9wxCZllFR*O!QUpihzWJ? zD3tsBa)ol3*$&|LS4u8Zff`D4_p2lqabKw9vIpWFS$Pe}taZudg~P9qz{yMDl6CNu^%b08E59ZEKo)2v%NCSJFaaEBqL9XMXO0_SqfExhk*S ziDwkQ`%(!Kzjp04yoG>bmu40$QT3?J$UsHgT-&Yf|7-hC#do%=tyf^O{LVIfo5uzL z;M?62tEB8g$;gylGJCu&>Nn%13$$Lt z>EIp^RQ8#I$}zEFn;OnnRof}3ymYCuM(^O%9#@Djc&%ep!}bB)4@j<7feF5f&iXx+ zE={$^`wZK|N!>I*w>qisqohIOI3*1<3D)PsRjN5(OtnVI#TeRCGZpA%JY?4#ZfL@A z0vLupM9H^kmxP&Y+K5n?g*NQ9zx>XI#js&G+Q%9-RocbfXNsbH#qX3QeBn}l;feSP zGyzr%VpKqncV#U_ip%BoVqOD(&2g}`EeIAvP2`k15qDFi$Yda*e+d?<6gh!|AE?wj zMJckMNb7~`7{S+6uo(GEf`$7JSBmUiO#rr4uy8j~iactT{!Nkv1&b{T@xHlOu{8=7 zxNUJJ?b5tbG{uTOa+q2b zE1)PHBC<;r6k}UmnErxTQC_KlQRWH&;|1Kd2#jW7p~Q+_c`b?+&;61{WS-QByyjM9 z=Jjhtp3H5lSaIirJ?tWOu4k9p$t_uhG>5N7I?7-$}gOGC*V@bITdpSnfB6194`(;{A*wq&rDVJ+T*q}R&4=>k7pMC8Bf9s>s`gDEb zHis3i{`G0IdGxkZ|JFtKwO81){E5Sm2J`)MM#?m;ce{u2vNp@enx^#%t6X8+Jx%-9 z#mn)nvDiQI0483GC%xMk9In<5D)}XKok6PU`995-x(TG14!{gVNOQTZCSBhFPYAnj zAGFsv^(-n93E(u_HyLkUq4n(Z;v@j9f^pH5E!4}FQWG&E$2f9@7HdRL*ZOz8x}U!z z^@OK>_S=&T`*f{$Si&SDbGp`}yC}i@2#|QYp}4(V?t=SQiE;mQZD3fJNygu&Yl&e) zCapU#9YcHGdRRnc+dQe=#;ErBK0xz^p?Oas&5^Vny-1(~2ln!8G+Cm@U=qDf>%$r(`EL=>^nfU=?`L zvbxMPyX5XxW)~@QCW}dcIHI=!POUPRCUzI4FpHFBsk&=TQ_Fo$%_+>p{MQsmx;Di+ z$}bmWrjRAk*wzMx*_1L;&F+O1J9nq*Rd)Sf;(5F}#b}%j_qNpd*jm_l+Mr6yM1?_B z+T;a_Gu5DC2&6MwHX0AyPtMebSH+YhPikH&y|$+xksy^KZ0dec?)T@pLAriP^FvZd zm177#YpHS!h{lg+8l+b1NFt1>3yZ>AQ=XhghsQVipCV2sKr#4>;v_{ncoZ7t7ig!C zY(c7A^okm;n`p>^N*z+%4Y)O>xJWctdpxTpS z^M!ae?bC5@$PP(iZ&0v9nT@2-?!{&|;&#dHe^PxHR4qXX*+{q4j2N2pvTFY=__Epl z`4g2?OlBoMx(#2Tk7jS^`6!E;ny;JI2b(vnrRJRjruv(OWa*>1;-9K{-U*aN2O6(u zY6AUh;#jD>+7x|0aEh5H`lqPp`w}HLo zRkzCCdaaYtTLyISuc*b^U|Liw@C>|=R^Vc> z7H5^}h2$|@s-J5nc%#X5o_K>2b~k*2W=F=8%J+57iPQ^=kXqOACi#2)W5;q+5Lef0 z&7AofF_LQ%XkDG;tK^`V9szu}_&2(~J@z;0`u6bIYGmR1_8@MR>sz1ZeBVxWebX@1I3S*`Zy1PEq?oq4zA1xX z$qgofOV_vDIf}qJ!mX>-roYSiV=Awqe^QnS+6JfDuW*`rwt7?vYS*Lu$l^wn>;0+R zrew8^k>s$jMEA&J)5D;w2_IE2Xnj6&KcuCP~ zBIz}GD6&b3XPGDW7-;qFt|1c7G02U}#h}qx*g)i2miA^)gSInm14{A_8Z<f-Lxo%c z(1X?4M28)aD}wusJ}*=Kij~%%k!V?J z0X$2d15PO$@7bGJ+~S&Umu7WvG4#o`O6YJb!$QQGKU#H%Qg&N$yF~AFz3Qq6y%qV;gnj+F&;_;ZeYC)$E2L6?{#)K?^7R*&NF;lDtDU8RkP45(5il zzn7=E{T*K}I}WD)iyaT`_dc zL<{(P#D?Fkj(rwAvxlDB2QYcigvos`h7N52CL2AWFxf3e=F2W3l8HIA8=ZcbR0UwN zn=o-JNQ#s9$`a7Unk68(W6({QY-|k~LSeE>OnXkj#FZF?Nh`Pz0di6(eF?rLwp=Fx zKrTfmR5_0cgDFzof z?h^-~YviI~Cz=kbsQG(ne}=WxpC9wsoj-!OGoDfXaRSKfPbC(zxhL5`RS{GdSJeSAMla7M6g1dl9(6-nL7Ra0J zwt^dQ<5#$pfs<4qFcQv55*;=x{dgIi2FpX829M&C7@eors?kYtR)J?aO|8rOoj8?L zOIa{2;FO;hC#AzIPi84Li=@$6Dd_sTfaI4!6sHRl^e?by2fYWC=j+^Jzt13iURS2$ z3>5FQl@u$J#pm~!ON?Jyo>2D8V(kIXS2Sjacm~SJHm*=waC}|dTUee}nA0#!VGcZB zzsD^iW%YYTo9u=syhY5G*x*_Vu^s)Nwi7OaMSoV>Z~C&XZQ{#XEjm0!p}Z7;k-n^s zp4`wo&!g#%zIIPUyzYpn4!nsktB<~{oUP!?x}bI$l{M0rwM=@~VJB9=m$gFqvZm6P zbxo#;zSO}vbuW>Jg7dOjK#qi0;;V^f32(+r&F|7J#JZrbKjY3{SIH&KRlK%{vdPeE z17(Zw33$($80)q^67EM?BEj!L+2e1ujrF7=Fl;p(wj}WeCbfHg>l&l%r4>Zk zbY6k7M%jR{p7Ck=htfswJH1xygx5bNfoN#OxszD`04ETxg(tNUH8-q>VOy-VZ|eAD z^5l9FOK|hkD2pGz@hMmyTG(^|F&<3PQ7u>N72t1pXU9 zW^qS5;4)ZTtn-vj2P^$b?;z*RfZS207%vv+kmt)A@!j0A(4A7jJqN`~`CTl-86}JS z#X)Rt4VfElI>21DL!_A{+l0p{5Xf`#%s5{vXxO9~V$Giw8m}6puo%jKKjZe-S>)7S zgGe9_ki8WAc|Z8`$KcOrtq3A}X%qfjBVII!>|~XJy#{6C_+Rld^G&ta;FZ?*8f1j* zHK>sM8A4rvKUatBHAtUMWCvp=3K7ebrkSDzaIN*VXcX3L#iBj0el2Dbf4u~Z8u)T) zW3;t1vQ^R+IM+EAG(}npuzs1L6dC**W!}P!Poynvx>2SEbwg&jV%4b(Sa=XhumzmO zMj3ajJ7tKq&1{ru9&a1(l_|+-6WY3)*(@{DEZQc#ZDFs>t1A`a{++f?uo*}U&*S!# zy)r#o*eoO0#$N&(L{EtdjrPb)eAvX>LD(Y`VA2E4?Jy%hB#LG!6cw$bXjbiNDMD~i zC5DFXhSAh^nAvci-YsswT%o9I0r7Lzr3ycZRITIZ+3Sg)BY8C?2mG9BiQcq??)hN9 zflST1h^z$DruGy|><|__kWs0mRBXXCpnn&-19dGJ?^@t+x%k_wD640#g}_^uHvT|h zmrNLE7Oyq+2{&p1vz-wKuyYeC#8w1{rzS2tKBI{$4zeaWtK5dV5`OxMvnnTj6h!E= zCGlBu`)M(^pBB@Jp0X*0+7z)G<})RfQqJ{T2HiIL+b2U*VD3h{Vpz)DfSM?-H%ljz zTV@4{+rUBbQ544wS{zaX^cxvcmj|^nn~^LkR!CLc>ol7KJ^SQOe09KJ;wQFm3li!Axe?V(e-1H7qJgVa-wm!>0j|15T(lh6=P1o@XrI$56=7KS ziAdzEyE?xiGUos$ib#nV zd;bR5a=8K4?cg+(G8Li&ln1((*hB0de2KztqFL+MZCS?^-f`?qQg|CMXI^ffPHjIn zbr4@G(0-?GJ&$pu0;@N>?%od#Aa)UnM~exKQuK$qdvHOA<%tkc> zBibi+pvu2!kZw=vn$F}myw(#>C>|V3R8BY_d8C#g55YO03cTfK4m*6JI9O#oU#nRB z`!+TXaj^X!>3IlrLU($PqsRkN!5y+mwNoWaiRV>;qCkNnek+Ca0Cig)5iBH*XCrl6 zh=KvpM>`7N!-`EF>nr1Ux;+>HF(2S(jSJX8-YmA^29YkZEcyX-w=dO5W_PV-cTY3;7?%I&b11QP%X>FXgxB!@=&Z zWOox7>5wW#Q@coEhT6qO-AxhOA5y*D)W?Wks$Jqn2xW^%x>$8G!{6H(W^Yr_TkHb^ zM4%jc6X-LQo)yxSf?9~$S`0YIt{iM%k19l(sVDmCafJa&89W5Vi2)cO1(T1C6DAEn z0SrH5A*9DU#pGKE6*3ufcLi=`FYyiZl9r&x-HdHPCCr$zj~Aq)eh!g4j*0geQCCunl6z!8Aw{|r<6w4MRoYkm9DhQC-i%Vg! zBU?o;)KIbAC}V1Z&0aL43TBMiCZm-lo?WiG@no-Hv?=#lqAOY{Wi|gI`gj_@iXc-Y zz@=MA>sW~(bR^czpS?u>@UgspAg|TDhWx2%u8HCKdGHJi>Is?SA{fId$xUT2EYCl> zbfF&yOH70)=9U_tF+e6)Av8Y2E2IBnGsC3I`@5uzTq)mNjzF29jl-$1%b*Pl)14|Ixt z834_Czfc*hOMwIVxn%*5@nSs76>z<{w1{(F1#0B%b|(^2byqz>v-dnef1CKs3q*y= z2ibCKU=%9shdf~aIQG$(Jv~*wB+~BN?wY+REx*Bc&*U_(Q*&-Q7~u@xZOpz8ej#ho zDr89WZFA<=Ml+N9J*>XG)|3?i42PiB3k^{GG1ik=4rKoj5f0V-SWe!UAe=WSG;H0q zG+uJ24184LeC+u|$Qhg$xI#csY8aiea3>d_#lX>0DPsx!euZQC-4u>tq2R`CSjlN= zPS;3OC%(B5Fg$_&Kgp(IErspYDwZLqJWduVMR}I#u(3x~iIu z8jqIdhCdpDpQFl+-(V7{8)Wy+)M~E>g~O$A+Hv&e@gD@CrS(3a=vKxwF!> zpHXFoHwmP>->G*67Wz&{c-=*v@=t0x9b{I$i|^7%DpkD17>ZP%PEsi8CQbn-x&JJ= z(f+ede>37LvY#U&UZ3NTREF;p*R4@JaUb^U9tiH&t$hZKrA*~j7z2e$V0j=$eCKD12!q^M z749&=%7Q%6sd(Zla#V(lk_ZCNM91;~Q_KKUTvn``oG{swTctQ5L@!RyldeZ0$=m#E zg=Q6s$zX&A@h*joFcCyf6bPs*pj5J{^D=V64A9~lF&mm@ zto*IBy7)Qa#OYnEB@d05dpj`4@ex`ucF{hvgzrCW#=jrD(Bo+mzasF>wFGs#d7Ro{@?IJGh;im)FZ#wEADkb6rP|}2Fo8tviXBlV|82Q<9g^^Oc zaYmu@CJ)2b6y>0kc*JC50SBF@u2o3X20mtd-CgV5s+Z0u1qvbF@2n64in;eX2fcKL z$BPT>XgqaVelMM&kj_o-9RG2)z1NW1shjO_COAS+IXmHmRL=ImJ|ZruVqqrN-+vw8 zu!t@{7`YE<7lpll+}QqrHYn_=?~VEg5bLvv)~k6i|%aKLC@RnYrszp7vk zR0SXBbhd9~v?{xPtTqLsfdMEhLPbGtfa5r*E%^NKNu@0aN*vT1AYT^gK0U6M)Ct0b zWy_O`r2`B;Nk^rwz`l_}y^4!u>J7F-Z@?_caylX(2*1Y92cS1lH11~zZc;RLupn}L ziht4OlHZvY4sQ;w`nSMFB_*ogtT{*#vGwWb2$P8c7QNfTs z2(s2;jFi$Ye2k!5WVN*;z|p8+0E*PLYocpl+|Xfro%x?3aNco?G4?jC*G1Uku|wQC z5j_f3JWLx;s5}w>%Zi7Qf8oMnD6Ymw3$@;EWqYe&!*uJ73|OS}3_v^Vf=JcBLZ7P% z__vl2Zl!on_LC4vD%ijjhm0v;*WX7@%1$En-hlkIp#m=`f|a+&>>Y3!0*Cw<38~|c zxouu@G7!f3_meX@z?d9Ph@t+qXR7DbB4mJkbx$qvN2wrI@ExfkLmYxFN}?wHHr_%( z{=p9k2jy_x#x*)-c?dk74aF$LCzdnU>2B`|z7D zK!r7UiQR#m^<4lx8#sr5QmexwAYQN>R!L(>%XAV+CJ|>&#lRf>6prOEUaWnt`T4baha2 zEwrEnpj1sLMdO}9PVoaM@ySn0FXk#ht!Xa-m6YAvOmXIKSP5uyy)TJQf@}p}NtNOl z8Mi>D0B&c%?aCr-<4mwUNj#*=4$}UV7Nq?hO4_eN&QqlQlfXyIG70H=^sgZ(>o4$Z zSb!1$^h$)zL>wf^Vps4T0lipgGjT_4XGrM5xNVINfFf&NfNE<{C=11SP5^>30d6&f zTP$7!ZuNv)BJKeH4yetKpl}qQjQoxMIV9Xd3 z0qFcC8MKA@EPx(K!$W@vTJ$2zzct}UH5V!>^0M0wfDjlz|spkx=556b_JkZ5h z@lVs&?S89q{-cPd{nH@rOm_)5i1_JTb9qo3hDW>iF0J+g@VE5YRj%-g3q9GDKUGbN zK#IkI(6Idx1if3DzRxxQ^W&zmnr&5uM{|195YO-{E$8qBM^h^!HCv(4eAA%Si^VRc zen>^*_I3@l?mg2Z?fHn1)|CT8MIW~A2tHrSh^9`&8{}zw)Qia}w6-JOrt6jDWO~$n z@IEk|Brjv#2*QdX>lyGi%JXbkjNx!$bCY)k?=Ub$BI62H43+3xN?PXWN?X%5LM)Si zU`y1F=AkB%0?JV9>4?P8V+MB@rr;%pKAJzE^~oDu>C>ncr)@xj^=@0xjD% z3a_N@x7f2G4`oyzd51o(6k}mmLLZ9*dzOn)C>E(mM%XNm14>OtEW4A1m*`Ff?twS` z(Hp+u;vg0+tw0IkU99?27-rn{kakwbQHrdYrd+5Nh;PS05_js}a+bwfa&*XAa zQoe7xoQ(1p2(Bn8IddWK*l7Gh?PdW{Q0+!c4UJEk`#9zQJ8|79Zg&;)Kg>y3=DlAb!HQZ0IJp&vqso_>E;Xu;76I8=(N0dj?`Rdnd z;oM4v`CmYnuU6}36YYO3QB))z#1E}4c{%!szP4sX3FH!i{hIMN^`71aRCY848-})?4 z$kmnp5I`>I-)y)I(ZAh;0c^Yet(t_3`882IwMx}|$4{!}5dE7N@qevB_uOTnB0 zTw8(R#+|fMJct{=Do!AKgH*){aR~Nf@WosKGktxiUur+r;kCN&z}LVSV=3Jv#9_E0 z#QpQ%#2L|;K_L@@S?(vVf;%c!3i}bu(v4XT>ouURM3WR&)l4u;E+Ik7!9bSPG|5Zr zGZ!nBumQD=C87;-)uM{;2P51e?lVibg&~$=(#@e}y%b+BBVx@E|G7;e)~7!z#DebS z-?(j)QxrmZpbEJ}83iDS$r3MIHTVJmGA#mLQ8&-W3X$hU7v2bJ%FnF{1hSlsXF8dv zIsc0nknhQ43=4Ht=b32;(mK8j3Cxy)H1RH%^-rb(HJGgjvlY%jf?IkF7D|aocjdwF zweYayD6S&PkJkJC#DP{JnQa&hQ^BRqJPjR=1kq=T8jiMbh(t6%4!v=#yVm(iN0}+v zNWDA&?2i_D&8-T^(|H0F_yT}@8E)GI zHAw%kE2T4JCTfuG=gP|Cl^fk415HezWcEt@0#YQMA@NIRNc;q4A^Pw3EGBWEF0Y+% zC5bnqc6*{_wcG7V?WUb=YU+LDYf6gO%Z;nsLv;iomaB3;O45!HS;T;rICG#NMQ|Y&?<**heiJ zZclN~=^Edve@@{La{b0yw(CKTj$ic8iCc?oe)XE)Kj)sm;iXgpDF2*JBxd^O@CGZ+ zCjL2*Kz{n?2w0qdlYh<>>7P?N7}(rMO?F?rn#_J#O_ucl#s4dDHU3RCS%uP*kuf=S z>*G89c*zODPCeOiur0DA@y#3pAQtb*3EN?jk*dGS6omKi-N93%9Z6q6{j&gR(EfPc1umZgrY8eNr) z5pyCAu}E-G<5LJ;!L?rv?&X>ki$A`?Qnpn7z<+4)JjE&d(?bEcY7FnIrMfp#le2;Y z<(X58>erHoZ*>$~q&_Sg4WT;BgvYasBs@Uhj>sT9W_VtWMn1q}4q{#g;K6t7*F3Rn z67G~XtSLO8j#uh12@q(*dZLsGkf1h}7_Y*Wmb1pqG~7AwL^)L8xd zNQ9B{s1~o3KKBA;MLIG|n=qE#DY8l1v(J_Kk0uLsnb_PyT_prezoaQH)awS|7Yp?~ zdTD}=_t-3kqV{{{9%pl`j%$3Og#fy zrt7HyYX%&qmg(i&{NQ*=I%HXOtLK|gc$|xtixaVaHPc_wGz{m$uO)u_)l84ztyD9? z*(7Q%(o8ke6aw4hh{ZT33ei*vsl zssP{R*E16Dky)u3djcV;Uy?2vK*(4kWDPO^A**G+6?_6hW{4YSt3kg`b%1Kdt8uIL z@nt~GI8Uk>Gn6)ap0iU()a48*D$)=ss^vKD74;saa=MGW)N8$+&@>hP0hJTfY6&O< zvmGddcW6kF7<@kaNKZraH2XXNiRh1HsX=pK_hNqm zrwPVY#EF3Nx>a5)NU>n>5eev9{^%3YTa0{v=!%RqOA$Ja=Q$m@C?D8@i|*m%Hh< z98EM5GxLajj-FT#@kMF+_y)wkk%#9b!pMLTI5HO>ho>MI3`e32mNAYDmPelRO)|?+Ud;12OI7v-l`_a!qP=`A8Z5pVOFF_DQ?gOC87DdK68~E0^X0*T z%aVPa?z&u;2l#o~**z{x;r5(PdS`tTw3?mytha+UI>LiDTt~UvdCr4Z(*e8gf(-F( z;dXZv$3x$(w{ycfB(rqF+erJHz$sr{XUGh7r#bW-fy&`Z*RxR-*28`au{)ZE0R#pG;7Mj( zAv+<`!?TeArslYBJ(&&MhKR<|TQo4-=`gh>%i-R|w#u4-IpXLz)i8*~bcaGrKiFbJ zhMm}nxxu1F-h~uA@Xs${%Tb4WAA1~fzE`oBc(ufXb3_0SM&q^(cn}^ygemy4DD6#? z20SPKOse);*WM@zOF*6{=xflOda!fZUBVr`(jE04N4+=+jPV1#J_vLYObEEy5#V0D z$5kJ!gvA!P10a9ZtSONn3#my0HEvU?XAa&&?f)4m*T_wT%3VkR*Zf&Qs{hU6A^ukAR9!vW8+|uk0 z={lH8?G&sxQ-PH6Xd~qBT_6jw4vKNq-phO?s-O_U^J(ONwcl_gyw*wc<-qKpqz0y% zunJ*Oj#3cwTH%7F44kvnZ6X}A$$l!Eoh1lIf*>#0eU`_6(3pqLubw44|M-_}@4TFD zHaV9XLwS_m7PM7F^~8$F0WUuGhRnlZsf*-2LVh(MM4>!|CN@p4N*jjo3(8?2+G1H4 z#?&iu_o(uUzsgbLg?47f8h4f}H5=)sxtm3RwK7VZuDoAL8-myX|P`TI(IPx$L|kp?MaQ` zH>~ro;bzJzM^T)@mpuDhfhjW8bB>%NS9)?Akfj(OwTPt%1d8b~4~Ah(kHs$ir_h

49!^tDQFe{ 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 X6N-#@7tk+!b*~f`oj+7K3=i)=|Grpv diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll index 9edfe1881f1287742798ff1715efd5b3e499a700..8d84a456d2b78c35e89ba2542854e4508b56fcc8 100644 GIT binary patch delta 182813 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 lq$O|*rWCZf>JvEQL+}f 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 z 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 z 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

@|Ot==3uOMgHUPns{z(#JSnp(83YCQnZ_ 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 diff --git a/pre_compiled_libs/device_monitoring_x64/pid_controller.dll b/pre_compiled_libs/device_monitoring_x64/pid_controller.dll new file mode 100644 index 0000000000000000000000000000000000000000..8ebc6955dcf9995bdd2737b49b8296f005eafffb GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/src/NHM.Common/Enums/RigManagementReturn.cs b/src/NHM.Common/Enums/RigManagementReturn.cs new file mode 100644 index 000000000..38213e998 --- /dev/null +++ b/src/NHM.Common/Enums/RigManagementReturn.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.Common.Enums +{ + public enum RigManagementReturn + { + Success, + PartialSuccess, + Fail + } +} diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 64e38f97e..3c2f83d56 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -22,13 +22,6 @@ public class OCManager private OCManager() { } public static OCManager Instance { get; } = new OCManager(); private readonly string _TAG = "OCManager"; - - public enum OcReturn - { - Success, - PartialSuccess, - Fail - } public Task<(ErrorCode err, string msg)> ExecuteTest(string uuid, OcProfile bundle) { if (!MiningState.Instance.AnyDeviceRunning) return Task.FromResult((ErrorCode.ErrNoDeviceRunning, "No devices mining")); diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 08fe6cd4d..2e1df49ba 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -716,10 +716,10 @@ public void SwitchOCToInactive() { ActiveOCProfile = null; } - public Task SetOcForDevice(OcProfile bundle, bool reset = false) + public Task SetOcForDevice(OcProfile bundle, bool reset = false) { if (bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); - var ret = OcReturn.Fail; + var ret = RigManagementReturn.Fail; int valuesToSet = 0; if (bundle.CoreClock > 0) valuesToSet++; if (bundle.MemoryClock > 0) valuesToSet++; @@ -750,10 +750,10 @@ public Task SetOcForDevice(OcProfile bundle, bool reset = false) setValues--; } - if (setValues == valuesToSet) ret = OcReturn.Success; - else if (setValues != 0 && setValues < valuesToSet) ret = OcReturn.PartialSuccess; + if (setValues == valuesToSet) ret = RigManagementReturn.Success; + else if (setValues != 0 && setValues < valuesToSet) ret = RigManagementReturn.PartialSuccess; - if (!reset && (ret == OcReturn.Success || ret == OcReturn.PartialSuccess)) + if (!reset && (ret == RigManagementReturn.Success || ret == RigManagementReturn.PartialSuccess)) { Logger.Warn(_TAG, $"Setting OC is successful"); return Task.FromResult(ret); @@ -761,7 +761,7 @@ public Task SetOcForDevice(OcProfile bundle, bool reset = false) Logger.Warn(_TAG, $"OC not in test mode anymore"); return Task.FromResult(ret); } - public Task ResetOcForDevice() + public Task ResetOcForDevice() { var defCC = ComputeDevice.CoreClockRange; var defMC = ComputeDevice.MemoryClockRange; @@ -940,9 +940,9 @@ public void TriggerELPReset() { NewELPProfile = true; } - public OcReturn SetELPForDevice(bool reset = false) + public RigManagementReturn SetELPForDevice(bool reset = false) { - var ret = OcReturn.Success; + var ret = RigManagementReturn.Success; if (!reset) { var cmd = string.Empty; @@ -1026,13 +1026,13 @@ public void SetTargetFanProfile(FanProfile profile, bool test) RigManagementActions.Enqueue(profile == null ? ActionQueue.ResetFan : ActionQueue.ApplyFan); } } - public Task ResetFanForDevice() + public Task ResetFanForDevice() { - return Task.FromResult(OcReturn.Fail); + return Task.FromResult(RigManagementReturn.Fail); } - public Task SetFanForDevice(FanProfile bundle, bool reset = false) + public Task SetFanForDevice(FanProfile bundle, bool reset = false) { - return Task.FromResult(OcReturn.Fail); + return Task.FromResult(RigManagementReturn.Fail); } public void SwitchFanTestToInactive() { diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 349879107..eb95032d2 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -778,7 +778,7 @@ public async Task AfterStartMining() { case AlgorithmContainer.ActionQueue.ApplyOC: var retOc = await target.SetOcForDevice(target.ActiveOCProfile, false); - if (retOc == OcReturn.Fail) target.SwitchOCToInactive(); + if (retOc == RigManagementReturn.Fail) target.SwitchOCToInactive(); break; case AlgorithmContainer.ActionQueue.ResetOC: if (IsTesting) break; @@ -789,7 +789,7 @@ public async Task AfterStartMining() if (target.HasTestProfileAndCanSet() && target.ActiveOCTestProfile != null) { var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, false); - if (retOCTest == OcReturn.Success || retOCTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + if (retOCTest == RigManagementReturn.Success || retOCTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; else target.SwitchOCTestToInactive(); break; } @@ -798,26 +798,26 @@ public async Task AfterStartMining() var resetOCTest = await target.ResetOcForDevice(); State = DeviceState.Mining; break; - case AlgorithmContainer.ActionQueue.ApplyFan: - var retFan = await target.SetFanForDevice(target.ActiveFanProfile, false); - if (retFan == OcReturn.Fail) target.SwitchFanToInactive(); + case AlgorithmContainer.ActionQueue.ApplyFan: //ok as whole + var retFan = await target.SetFanForDevice(target.ActiveFanProfile, false); //not ok + if (retFan == RigManagementReturn.Fail) target.SwitchFanToInactive(); break; - case AlgorithmContainer.ActionQueue.ResetFan: + case AlgorithmContainer.ActionQueue.ResetFan: //ok as whole if (IsTesting) break; - var resetFan = await target.ResetFanForDevice(); + var resetFan = await target.ResetFanForDevice(); //not ok State = DeviceState.Mining; break; - case AlgorithmContainer.ActionQueue.ApplyFanTest: - if (target.HasTestProfileAndCanSet() && target.ActiveFanTestProfile != null) + case AlgorithmContainer.ActionQueue.ApplyFanTest://ok as whole + if (target.HasTestProfileAndCanSet() && target.ActiveFanTestProfile != null) { - var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, false); - if (retFanTest == OcReturn.Success || retFanTest == OcReturn.PartialSuccess) State = DeviceState.Testing; + var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, false); //not ok + if (retFanTest == RigManagementReturn.Success || retFanTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; else target.SwitchFanTestToInactive(); break; } break; - case AlgorithmContainer.ActionQueue.ResetFanTest: - var resetFanTest = await target.ResetFanForDevice(); + case AlgorithmContainer.ActionQueue.ResetFanTest: //ok as whole + var resetFanTest = await target.ResetFanForDevice();//not ok State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyELP: From fe0478951acbc8a03e7f31731e6a0436483ac406 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 6 Jan 2023 09:21:14 +0100 Subject: [PATCH 049/224] fixed computedevice --- src/NHMCore/Mining/ComputeDevice.cs | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 280eede8f..172a83f1b 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -800,33 +800,34 @@ public async Task AfterStartMining() var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, false); if (retOCTest == RigManagementReturn.Success || retOCTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; else target.SwitchOCTestToInactive(); - break; } break; case AlgorithmContainer.ActionQueue.ResetOCTest: var resetOCTest = await target.ResetOcForDevice(); State = DeviceState.Mining; break; - case AlgorithmContainer.ActionQueue.ApplyFan: //ok as whole - var retFan = await target.SetFanForDevice(target.ActiveFanProfile, false); //not ok - if (retFan == RigManagementReturn.Fail) target.SwitchFanToInactive(); + case AlgorithmContainer.ActionQueue.ApplyFan: + //var retFan = await target.SetFanForDevice(target.ActiveFanProfile, false); + //if (retFan == RigManagementReturn.Fail) target.SwitchFanToInactive(); break; - case AlgorithmContainer.ActionQueue.ResetFan: //ok as whole + case AlgorithmContainer.ActionQueue.ResetFan: if (IsTesting) break; - var resetFan = await target.ResetFanForDevice(); //not ok + //var resetFan = await target.ResetFanForDevice(); + target.SwitchFanToInactive(); State = DeviceState.Mining; break; - case AlgorithmContainer.ActionQueue.ApplyFanTest://ok as whole + case AlgorithmContainer.ActionQueue.ApplyFanTest: if (target.HasTestProfileAndCanSet() && target.ActiveFanTestProfile != null) { - var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, false); //not ok - if (retFanTest == RigManagementReturn.Success || retFanTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; - else target.SwitchFanTestToInactive(); - break; + //var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, false); + //if (retFanTest == RigManagementReturn.Success || retFanTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; + //else target.SwitchFanTestToInactive(); + State = DeviceState.Testing; } break; - case AlgorithmContainer.ActionQueue.ResetFanTest: //ok as whole - var resetFanTest = await target.ResetFanForDevice();//not ok + case AlgorithmContainer.ActionQueue.ResetFanTest: + //var resetFanTest = await target.ResetFanForDevice(); + target.SwitchFanTestToInactive(); State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyELP: @@ -850,8 +851,7 @@ public void SetFanSpeedWithPidController() { var testTarget = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (testTarget == null) return; - var profile = testTarget.ActiveFanTestProfile ?? testTarget.ActiveFanTestProfile; - profile = testTarget.ActiveFanProfile ?? testTarget.ActiveFanProfile; + var profile = testTarget.ActiveFanTestProfile ?? testTarget.ActiveFanProfile ?? null; if (profile == null) return; switch (profile.Type) From 4e4f595c4a9cbbc0c8e8bdea9ca4e602851984db Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 6 Jan 2023 09:59:19 +0100 Subject: [PATCH 050/224] added post build event --- src/NHMCore/NHMCore.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHMCore/NHMCore.csproj b/src/NHMCore/NHMCore.csproj index 103aa2af8..8b6c706e1 100644 --- a/src/NHMCore/NHMCore.csproj +++ b/src/NHMCore/NHMCore.csproj @@ -66,6 +66,6 @@ 1701;1702;CA1416 - + \ No newline at end of file From df40ab0207cf61ece8b4d56647c07dcb6ea38f42 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 6 Jan 2023 12:19:49 +0100 Subject: [PATCH 051/224] took out scheduler in V4 temporarily --- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 2bf0d5a9d..bfe4bfda0 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -301,14 +301,14 @@ private static List GetRigOptionalMutableValuesLogin(st DefaultValue = "", Range = (65536, String.Empty), }, - new OptionalMutablePropertyString - { - PropertyID = OptionalMutableProperty.NextPropertyId(), - DisplayGroup = 0, - DisplayName = "Scheduler settings", - DefaultValue = "", - Range = (4096, String.Empty) - } + //new OptionalMutablePropertyString + //{ + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayGroup = 0, + // DisplayName = "Scheduler settings", + // DefaultValue = "", + // Range = (4096, String.Empty) + //} }; } private static List> GetRigOptionalDynamicValuesLogin() @@ -360,7 +360,7 @@ private static List GetRigOptionalMutableValues() CredentialsSettings.Instance.BitcoinAddress, CredentialsSettings.Instance.WorkerName, "",//TODO rig-wise algo settings - "",//TODO scheduler + //"",//TODO scheduler }; return list; } From 42612f4e3a12f9519384ece6429967ac6fa12f46 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 10 Jan 2023 13:36:36 +0100 Subject: [PATCH 052/224] per rig miners settings work --- .../Enums/DeviceDynamicProperties.cs | 5 +- src/NHMCore/Mining/ComputeDevice.cs | 2 +- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 128 ++++++++++++++---- src/NHMCore/Nhmws/V4/MessagesV4.cs | 16 ++- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 3 +- 5 files changed, 119 insertions(+), 35 deletions(-) diff --git a/src/NHM.Common/Enums/DeviceDynamicProperties.cs b/src/NHM.Common/Enums/DeviceDynamicProperties.cs index 33f4bf511..632ef2d1d 100644 --- a/src/NHM.Common/Enums/DeviceDynamicProperties.cs +++ b/src/NHM.Common/Enums/DeviceDynamicProperties.cs @@ -15,6 +15,9 @@ public enum DeviceDynamicProperties FanSpeedPercentage, PowerUsage, VramTemp, - HotspotTemp + HotspotTemp, + CoreClock, + MemClock, + TDP } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 172a83f1b..d44cf04a3 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -189,7 +189,7 @@ public string ApplyNewAlgoStates(MinerAlgoState state) targets.ForEach(t => t.SetEnabled((bool)algo.Enabled)); } } - Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(false)); + Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(false));//todo not needed return "New state is set"; } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index bfe4bfda0..92499b36b 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -97,6 +97,9 @@ private static (List<(string name, string? unit)> properties, JArray values) Get (nameof(IPowerUsage), IPowerUsage g) => $"{g.PowerUsage}", (nameof(IVramTemp), IVramTemp g) => $"{g.VramTemp}", (nameof(IHotspotTemp), IHotspotTemp g) => $"{g.HotspotTemp}", + (nameof(ICoreClock), ICoreClock g) => $"{g.CoreClock}", + (nameof(IMemoryClock), IMemoryClock g) => $"{g.MemoryClock}", + (nameof(ITDP), ITDP g) => $"{g.TDPPercentage}", (_, _) => null, }; @@ -123,11 +126,14 @@ private static (List<(string name, string? unit)> properties, JArray values) Get var dynamicPropertiesWithValues = new List<(DeviceDynamicProperties type, string name, string unit, string value)?> { pairOrNull(DeviceDynamicProperties.Temperature ,"Temperature","°C"), - pairOrNull(DeviceDynamicProperties.VramTemp,"VRAM Temperature","°C"), + pairOrNull(DeviceDynamicProperties.VramTemp,"Memory Temperature","°C"), pairOrNull(DeviceDynamicProperties.Load,"Load","%"), pairOrNull(DeviceDynamicProperties.MemoryControllerLoad, "MemCtrl Load","%"), pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan speed","%"), pairOrNull(DeviceDynamicProperties.PowerUsage, "Power usage","W"), + pairOrNull(DeviceDynamicProperties.CoreClock, "Core clock", "MHz"), + pairOrNull(DeviceDynamicProperties.MemClock, "Memory clock", "MHz"), + pairOrNull(DeviceDynamicProperties.TDP, "TDP", "%"), pairOrNull(DeviceDynamicProperties.NONE, "Miner", null), pairOrNull(DeviceDynamicProperties.NONE, "OC profile", null), pairOrNull(DeviceDynamicProperties.NONE, "OC profile ID", null), @@ -195,7 +201,8 @@ List getOptionalMutableProperties(ComputeDevice d) ret += GetMinersForDeviceDynamic(d); } return ret; - } + }, + ComputeDev = d }); if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); return optionalProperties @@ -258,40 +265,52 @@ Device mapComputeDevice(ComputeDevice d) OptionalMutableProperties = GetDeviceOptionalMutable(d, true, true).properties, }; } - + var DevicesProperties = devices.Select(mapComputeDevice).ToList(); //needs to execute first _loginMessage = new LoginMessage { Btc = btc, Worker = worker, RigID = rigID, Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, - OptionalMutableProperties = GetRigOptionalMutableValuesLogin(btc, worker), + OptionalMutableProperties = GetRigOptionalMutableValues(true, true).properties, OptionalDynamicProperties = GetRigOptionalDynamicValuesLogin(), Actions = CreateDefaultRigActions(), - Devices = devices.Select(mapComputeDevice).ToList(), + Devices = DevicesProperties, MinerState = GetMinerStateValues(worker, devices, true), }; return _loginMessage; } - private static List GetRigOptionalMutableValuesLogin(string btc, string worker) + private static (List properties, JArray values) GetRigOptionalMutableValues(bool isStateChange, bool isLogin) { - return new List + List getOptionalMutableProperties() + { + var optionalProperties = new List() { new OptionalMutablePropertyString { PropertyID = OptionalMutableProperty.NextPropertyId(), DisplayGroup = 0, DisplayName = "User name", - DefaultValue = btc, + DefaultValue = CredentialsSettings.Instance.BitcoinAddress, Range = (64, String.Empty), + GetValue = () => + { + if (isStateChange) return CredentialsSettings.Instance.BitcoinAddress; + return null; + } }, new OptionalMutablePropertyString { PropertyID = OptionalMutableProperty.NextPropertyId(), DisplayGroup = 0, DisplayName = "Worker name", - DefaultValue = worker, + DefaultValue = CredentialsSettings.Instance.WorkerName, Range = (64, String.Empty), + GetValue = () => + { + if (isStateChange) return CredentialsSettings.Instance.WorkerName; + return null; + } }, new OptionalMutablePropertyString { @@ -300,16 +319,76 @@ private static List GetRigOptionalMutableValuesLogin(st DisplayName = "Miners settings", DefaultValue = "", Range = (65536, String.Empty), + GetValue = () => + { + string ret = null; + if (isStateChange) + { + ret = string.Empty; + var minersSettingsGlobal = new MinerAlgoStateRig(); + var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null); + if(mutables == null || mutables.Count() <= 0) return ret; + foreach (var mutable in mutables) + { + if (mutable.GetValue() is not string val) continue; + minersSettingsGlobal.Miners.Add(JsonConvert.DeserializeObject(val)); + } + ret += JsonConvert.SerializeObject(minersSettingsGlobal); + } + return ret; + }, + ExecuteTask = async (object p) => + { + if(p is not string prop) return null; + var newStates = JsonConvert.DeserializeObject(prop); + //for each device thats inside apply new algo state + var devices = AvailableDevices.Devices.Where(d => newStates.Miners.Any(m => m.DeviceID.Contains(d.B64Uuid))); + if(devices == null) return null; + var successCount = 0; + foreach(var ns in newStates.Miners) + { + var targetDev = AvailableDevices.Devices.FirstOrDefault(d => d.B64Uuid == ns.DeviceID); + if(targetDev == null) continue; + targetDev.ApplyNewAlgoStates(ns); + successCount++; + } + return $"{successCount}/{newStates.Miners.Count} operations succeded"; + } + }, - //new OptionalMutablePropertyString - //{ - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayGroup = 0, - // DisplayName = "Scheduler settings", - // DefaultValue = "", - // Range = (4096, String.Empty) - //} + //new OptionalMutablePropertyString + //{ + // PropertyID = OptionalMutableProperty.NextPropertyId(), + // DisplayGroup = 0, + // DisplayName = "Scheduler settings", + // DefaultValue = "", + // Range = (4096, String.Empty) + //// todo get and set + //} }; + if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); + return optionalProperties + .Where(p => p != null) + .ToList(); + + }; + + List getOptionalMutablePropertiesCached() + { + //if (_cachedDevicesOptionalMutable.TryGetValue(out var cachedProps)) return cachedProps; + return getOptionalMutableProperties(); + } + + var props = getOptionalMutablePropertiesCached(); + var selectedValues = props + .Where(p => p.GetValue() != null)? + .Select(p => p.GetValue()); + JArray values_omv = null; + if (selectedValues.Any()) + { + values_omv = new JArray(selectedValues); + } + return (props, values_omv); } private static List> GetRigOptionalDynamicValuesLogin() { @@ -353,17 +432,6 @@ private static List GetRigOptionalDynamicValues() }; return list; } - private static List GetRigOptionalMutableValues() - { - var list = new List - { - CredentialsSettings.Instance.BitcoinAddress, - CredentialsSettings.Instance.WorkerName, - "",//TODO rig-wise algo settings - //"",//TODO scheduler - }; - return list; - } internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices, bool isStateChange = false) { @@ -424,7 +492,7 @@ JArray mmv(ComputeDevice d) MutableDynamicValues = new JArray(rigStateToInt(rig)), OptionalDynamicValues = new JArray(GetRigOptionalDynamicValues()), MandatoryMutableValues = new JArray(rigStateToInt(rig), workerName), - OptionalMutableValues = new JArray(GetRigOptionalMutableValues()), + OptionalMutableValues = GetRigOptionalMutableValues(isStateChange, false).values, Devices = devices.Select(toDeviceState).ToList(), }; } @@ -499,6 +567,8 @@ private static string FormatForOptionalValues(string name, string content) miner.Algos = algos; minersObject.Miners.Add(miner); } + minersObject.DeviceID = d.B64Uuid; + minersObject.DeviceName = d.Name; var json = JsonConvert.SerializeObject(minersObject); return json; } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 3f61d7ce9..96a5e6218 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; +using NHMCore.Mining; using System; using System.Collections.Generic; using System.Runtime.InteropServices; @@ -99,9 +100,10 @@ public abstract class OptionalMutableProperty abstract public Type PropertyType { get; } [JsonIgnore] public Func> ExecuteTask { get; set; } - [JsonIgnore] public Func GetValue { get; set; } + [JsonIgnore] + public ComputeDevice ComputeDev { get; set; } } internal class OptionalMutablePropertyInt : OptionalMutableProperty @@ -171,6 +173,7 @@ public class NhmwsAction public SupportedAction ActionType { get; set; } [JsonIgnore] public Func> ExecuteTask { get; set; } + [JsonIgnore] public string DeviceUUID = String.Empty; public static NhmwsAction ActionDeviceEnable(string uuid) { @@ -524,11 +527,19 @@ internal class PropertyString : Property [JsonProperty("value")] public string Value { get; set; } } - public class MinerAlgoState { [JsonProperty("miners")] public List Miners { get; set; } = new List(); + [JsonProperty("device_id")] + public string DeviceID { get; set; } + [JsonProperty("device_name")] + public string DeviceName { get; set; } + } + public class MinerAlgoStateRig + { + [JsonProperty("devices")] + public List Miners { get; set; } = new List(); } public class MinerDynamic { @@ -579,7 +590,6 @@ public class GenericProfile public List? MinerId { get; set; } [JsonProperty("algorithm_id", NullValueHandling = NullValueHandling.Ignore)] public List? AlgoId { get; set; } - } public class ElpProfile : GenericProfile { diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 6a64ca4ed..0b4568fcc 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -873,7 +873,7 @@ private static Task HandleProperty(object property) { if (property is not JToken token) return Task.FromResult("Property is not Jtoken"); var genericProperty = token.ToObject(); - var mutable = ActionMutableMap.FindMutableOrNull(genericProperty.PropId); + var mutable = ActionMutableMap.FindMutableOrNull(genericProperty.PropId);//this is null if per rig if (mutable == null) return Task.FromResult("Mutable is null"); object t = mutable.PropertyType switch { @@ -883,6 +883,7 @@ private static Task HandleProperty(object property) Type.Bool => ParseAndActMutableBool(mutable, token), _ => throw new InvalidOperationException() }; + Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(true)); if (t is string retStr) return Task.FromResult(retStr); return Task.FromResult("OK"); } From bbff6231e02124a6adf9542fcf0e35d4cf46de66 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Fri, 13 Jan 2023 09:31:15 +0100 Subject: [PATCH 053/224] NL-2140 NVIDIA monitoring update --- src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs | 2 +- .../Memory_clock/IMemoryClockRangeDelta.cs | 13 +++++++++++++ src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 10 ++++++++-- src/NHMCore/Mining/ComputeDevice.cs | 15 ++++++++++++++- 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index b7870fecc..c41f2f728 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -8,7 +8,7 @@ namespace NHM.DeviceMonitoring { - internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits, IMemoryClockDelta + internal class DeviceMonitorNVIDIA : DeviceMonitor, IFanSpeedRPM, IGetFanSpeedPercentage, ILoad, IPowerUsage, ITemp, ITDP, IMemoryTimings, IMemControllerLoad, ISpecialTemps, ICoreClock, IMemoryClock, ICoreClockSet, IMemoryClockSet, IMemoryClockRange, ICoreClockRange, ISetFanSpeedPercentage, IResetFanSpeed, ITDPLimits, IMemoryClockDelta, IMemoryClockRangeDelta { private const int RET_OK = 0; public static object _lock = new object(); diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs new file mode 100644 index 000000000..84c70b4be --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockRangeDelta + { + (bool ok, int min, int max, int def) MemoryClockRangeDelta { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index 387e0a1b5..da1afd9c6 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -36,6 +36,8 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_fan_speed_percentage(int bus_number, int set_fan_speed_percentage); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_reset_fan_speed_percentage(int bus_number); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_tdp_min_max_default(int bus_number, ref uint min, ref uint max, ref uint defaultV); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_tdp(int bus_number, ref int get_tdp); @@ -71,9 +73,13 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_print_memory_timings(int bus_number); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_core_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def, bool is_absolute); + public static extern int nhm_nvidia_device_get_core_clocks_min_max_default_absolute(int bus_number, ref int min, ref int max, ref int def); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_get_core_clocks_min_max_default_delta(int bus_number, ref int min, ref int max, ref int def); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_get_memory_clocks_min_max_default_absolute(int bus_number, ref int min, ref int max, ref int def); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_memory_clocks_min_max_default(int bus_number, ref int min, ref int max, ref int def, bool is_absolute); + public static extern int nhm_nvidia_device_get_memory_clocks_min_max_default_delta(int bus_number, ref int min, ref int max, ref int def); } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index d44cf04a3..04ea7473f 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -369,6 +369,19 @@ public int MemoryClockDelta return (false, -1, -1, -1); } } + + public (bool ok, int min, int max, int def) MemoryClockRangeDelta + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is IMemoryClockRangeDelta get) + { + var ret = get.MemoryClockRangeDelta; + return (ret.ok, ret.min, ret.max, ret.def); + } + return (false, -1, -1, -1); + } + } #endregion Getters #region Setters @@ -904,7 +917,7 @@ private void SetFanSpeedWithLoweringMemoryClocks(FanProfile profile) if (_memoryControlCounter >= 5) { _pidController.SetPid(100, 0.8, 1); - _pidController.SetOutputLimits(MemoryClockRange.min, MemoryClockDelta); + _pidController.SetOutputLimits(MemoryClockRangeDelta.min, MemoryClockDelta); var memory_clock = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); SetMemoryClock((int)memory_clock); _memoryControlCounter = 0; From 5205a7e7b0f7d462299d479d9a6db5715757a0e0 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Fri, 13 Jan 2023 09:35:20 +0100 Subject: [PATCH 054/224] fix --- .../DeviceMonitorNVIDIA.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index c41f2f728..b9c11ae7f 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -329,9 +329,9 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default(BusID, ref min, ref max, ref def, false); + var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default_absolute(BusID, ref min, ref max, ref def); if (ok == RET_OK) return (true, min, max, def); - Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks_min_max_default failed with error code {ok}", _delayedLogging); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks_min_max_default_absolute failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); } @@ -343,9 +343,23 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default(BusID, ref min, ref max, ref def, false); + var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default_absolute(BusID, ref min, ref max, ref def); if (ok == RET_OK) return (true, min, max, def); - Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default failed with error code {ok}", _delayedLogging); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default_absolute failed with error code {ok}", _delayedLogging); + return (false, 0, 0, 0); + } + } + + public (bool ok, int min, int max, int def) MemoryClockRangeDelta + { + get + { + int min = 0; + int max = 0; + int def = 0; + var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default_delta(BusID, ref min, ref max, ref def); + if (ok == RET_OK) return (true, min, max, def); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default_delta failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); } } From dbed9ca6c66f7c71ead32a34d3255ef8d7ce1e25 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Fri, 13 Jan 2023 12:29:10 +0100 Subject: [PATCH 055/224] PID controller fix --- src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs | 2 ++ src/NHM.DeviceMonitoring/PidController.cs | 4 ++++ src/NHMCore/Mining/ComputeDevice.cs | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs b/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs index 1e6c17c06..797da6672 100644 --- a/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs +++ b/src/NHM.DeviceMonitoring/PID/PID_CONTROLLER.cs @@ -24,5 +24,7 @@ internal class PID_CONTROLLER public static extern void nhm_set_output_limits(double min_speed, double max_speed); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern void nhm_set_pid(double p, double i, double d); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern void nhm_set_reversed(bool reversed); } } diff --git a/src/NHM.DeviceMonitoring/PidController.cs b/src/NHM.DeviceMonitoring/PidController.cs index 67942ef76..bada0d1a3 100644 --- a/src/NHM.DeviceMonitoring/PidController.cs +++ b/src/NHM.DeviceMonitoring/PidController.cs @@ -31,5 +31,9 @@ public void SetPid(double p, double i, double d) { PID_CONTROLLER.nhm_set_pid(p, i, d); } + public void SetReversed(bool reversed) + { + PID_CONTROLLER.nhm_set_reversed(reversed); + } } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 04ea7473f..a3f73a2bb 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -892,6 +892,7 @@ private void SetFanSpeed(FanProfile profile) { _pidController.SetPid(10, 0.8, 1); _pidController.SetOutputLimit(100); + _pidController.SetReversed(true); var speed = _pidController.GetOutput(Temp, profile.GpuTemp); SetFanSpeedPercentage((int)speed); } @@ -899,6 +900,7 @@ private void SetFanSpeed(FanProfile profile) { _pidController.SetPid(10, 0.8, 1); _pidController.SetOutputLimit(profile.MaxFanSpeed); + _pidController.SetReversed(true); var speed = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); SetFanSpeedPercentage((int)speed); } @@ -908,6 +910,7 @@ private void SetFanSpeedWithLoweringMemoryClocks(FanProfile profile) { _pidController.SetPid(10, 0.8, 1); _pidController.SetOutputLimit(profile.MaxFanSpeed); + _pidController.SetReversed(true); var speed = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); SetFanSpeedPercentage((int)speed); @@ -918,6 +921,7 @@ private void SetFanSpeedWithLoweringMemoryClocks(FanProfile profile) { _pidController.SetPid(100, 0.8, 1); _pidController.SetOutputLimits(MemoryClockRangeDelta.min, MemoryClockDelta); + _pidController.SetReversed(false); var memory_clock = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); SetMemoryClock((int)memory_clock); _memoryControlCounter = 0; From 67b1ce2525c84b99981513c805d9e6a5c5c8d8cc Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Fri, 13 Jan 2023 12:34:49 +0100 Subject: [PATCH 056/224] Pid controller fix --- src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs | 2 +- src/NHMCore/Mining/ComputeDevice.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index b9c11ae7f..121d3acd3 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -343,7 +343,7 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default_absolute(BusID, ref min, ref max, ref def); + var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default_delta(BusID, ref min, ref max, ref def); if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default_absolute failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index a3f73a2bb..97a13f126 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -920,7 +920,7 @@ private void SetFanSpeedWithLoweringMemoryClocks(FanProfile profile) if (_memoryControlCounter >= 5) { _pidController.SetPid(100, 0.8, 1); - _pidController.SetOutputLimits(MemoryClockRangeDelta.min, MemoryClockDelta); + _pidController.SetOutputLimits(MemoryClockRange.min, MemoryClockDelta); _pidController.SetReversed(false); var memory_clock = _pidController.GetOutput(Temp, Math.Min(profile.GpuTemp, profile.VramTemp)); SetMemoryClock((int)memory_clock); From c56711b960b9a991c385d3a50e33a844251d04d8 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Fri, 13 Jan 2023 12:48:38 +0100 Subject: [PATCH 057/224] Precompiled libs update --- .../device_monitoring_amd.dll | Bin 453120 -> 447488 bytes .../device_monitoring_nvidia.dll | Bin 474624 -> 470016 bytes .../device_monitoring_x64/pid_controller.dll | Bin 11776 -> 11776 bytes .../DeviceMonitorNVIDIA.cs | 2 +- src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll index c8d2b1239ee626d1686e8d091304840590366805..9a08b3ad2dc05f6001085a0e5efe8f65aea77cbd 100644 GIT binary patch delta 126710 zcmeFa33yY**9V-NG_=r`+X|(n3oTHfr7VTA6iT6?4ctH~Ae2S6B8aG{ED0i8ifN_s z5-DCZhzsC`3kr%BM1>ZxWs^-s5Em4bTZ>XRHj#Y4Gjo%+2)^q3f8Xc(-sj8n%w1;A zJu`FW%$b>U&P)nEjwyI4rli0zA?!#{^vw6h`aaxGTSaz%=hg>tpBKF4 z)~4*v)8_@hbL(i9{{F4aagUz){#Y~ai-O<2wFSGscWVs0XOHFgZS4J)J10-0ymb7R zrrmYAp=O$1`yy*}trCLujT3ZJ4LV%`0)DY4m99cNAxpVc=+XV;iUzv$ z0G%%Ci3YkPN=*pVofL3C*+93eEk$U*)IeQH5TXY+(9KxhGN##@K@D_S1nBz#`wac^ zmeER>KBz~xDab1fNt7?p*Zn2vborfTO_^kyq|@EiQY%+0-0xCu)<^d!ZU^9v4RpGj za9@ghonMwtSJr6;|CE&urDVl^MtMdb-!Lptr_%$xLaD$TYQo-jD?jR^8&lzRsD!Q& z?t7JHhMyd5kc--FhoF<(p~;gCI?1^!sp|QU*!yCJV?FzouE6vQ?P|@jY6>{`JnpVKIAKpOH7sIN)$L@;?6o5;ZbrM zyAT$aKnSYd2ZDM4NWZgRfKIA3QS$)K6ojbn*eA+3W1EB~&ITZeH8DXosrdGqvcEl3 zDNl%K_$^i5STM_=Y&Rz8?K73d0Zkj;!DDC4RIVDE2fo%fK&P(Up|og_WH`SgV3Vam zLqT{-86IfU8-LuiCooGe%*YQ=LK-HwD!2^=x^QZcT=;1*J<5CWW|hmV@?MH7xh+5$ z)$nEg(yUGTMk|E&35gAKi!bj+=|$%Vw72BW9Ikr3IpXHRAwN$F(76MSh?|!VshJd@ zlm)kIqpJ$gS<1f&vRwEE*uDzFD{{b_KZmcvs+5qBL;8)Go4yR`rjOVPqFD_Ws)y&w z6(;$xN#3Uh_EFl2)rPE30+fibLF|58ScYEQrmPNoUtiW(nGpU2ZksNJn*^bolF?+X z&~4KfO$3AC%S{2BzHauFV7T(VansJIQbXq5T~Nj`hU(shM{La&U()HaboR!QJ7O&2 z-z7G!P7t?#-E20+4W~Ht4PA8z-Yi`Ll+xHV{ief8b?gFtce`?DoJn{{c{Q#@S9uKa z&T%w6c#Acl7_L_re#lztJSDmelDt!rt>B%s{pzNT%I|TB`tD<>?Ygz&aBFJez*}P( zZ=s=GZU4kEKaMddV~ol1(|p|0<=~&W<%Q9Nypd-=D?~9qIoKjPGT2|z^E(7vqpehB zb=w<{#4-_RX`>HadRl5A*s@Q zOhjZ>@xrnk_rNGLYpXUOuRFI)btUO^CBXW|D;#UIGxIe(>OFIN3g+lLzz6E)4WN)~ z{7cd{;Go||$z@k2wvIErkQksiT1Q6&<#HstS|nFqR$gx{MZSm5qBbA|Zl?~iTXLDV z(AS}fafWz&-7zsb;#MpF`j(gdMYx%N-ITr_{W|}ex?P>G*R~E&PT=eHgZbCbzvTaV z%}Xrr>Bvugg_;+6qat;`j=|TI_tioC>+|dUU;n(0z8<&>6;-dSr>fVdVuiU(XWG&X z$)Mw_tu#9JZ^IGYRf}jU9vK~DmB-p9<+V_4z-Dznl~{mpE%MkXi#$8QBF|5<$fw5d zR3Aod_p62Mx`kQZ{ z24pEtU}QO?9&E+Qa^ZPDeSdjgIg>5LZoy!n{_(P)lMSw%#B@J%g-I@(Ql8XehzEra zAUsG;kScQ$lX{~ZR<{`mBM^fDBTLO5$nj@r_+y=!J@Ket(1fK+&V|duBrzMH%HhnW zo~QGLR$)|FwJ+tI9RS=(o^P882}233@sW6*Un=F79$zQFRGy!E0MD=JIbI*+w-}Fq zm7ik>1{h~h&1^pVWV?A*Rm~9y`TSZP{mQI;5 zpsQm!C2xBX3+)f@l!7A zKSa46{W;|xiK$Du*7bSrFxDU7vVYEVADDQbeg7Fh<=(;LUsCP`%-Pkl=Wax~iIi+Z z^0k!9@ly^()p*Y8r`%9KJpLu&x?--O#yx!_!ksk`U7sStm3Q|OZY84#7jDj{*o#KEHS9$r z-1F?^`g0OigiA#RbqF_a_`f9Fy$rolsBf!fj+P8sXkzFB;)!PW2z)IGS#?PbbRtaT_1JsV?O@ zAP32f859O7n$GPS_Sd8vb-n2vW<2loWDS!S_zuXSQ|DEAy_h;8;ZQhBpdx&LN6D?c z$Fih|DL*o((2$z~l=bP+Lj%=Nlm~0jLmW%IAB(*f%Uujh#4q8f24%37C;4)&hBAid zYzkK*dL=p>0xhNK*JliCxFCYaY7}VOI;gX0vN1yY^()F6^4Zu5H*g zo?V->YZF|3OEc}Rgqe-X+r3(6Vv)1}Q)t&h|HL(`7!g<|MPr%NfK>;?RnKDLPRsD7 zik}C=6y?3l!44w{ugI0)G`DeM7;i#m*bXJ}PpjI+R{{u1k)&DMz@GxyYVug zUG6Wlx}25y6v>TqkJAb(ik2N%($NymycyksFRc^P~(agb9TJ z_J`|W-vjJ&HWmkwSag9}380qMMKr?VARfyEP$tP`Zq4a|#X&nP6F>w^imxHUD}7>e zP)ac=m+HY*QmoKyb&68o3{5#T>VOhXAe6d49{*Ho&!;Vg?%k{;Qml^=(J{z8>)(v5?kgw`cHB`&I*>ku+Xkuy4YUf)ekEo@duOP0jydaC0`3tfTkJm3q zw3~$2k`+{tELujgf?#61&#JWS8|V45Kxkm8Y+RQUQ~sRgfi67Dibwoe?!e>qvmAH~ z2-N)wiPLMk3)Xq5P`5;}3P%j1Y_af9RYkBZ(YB|CAJc@iN5Fh78+MYsJDAGRQ$Aiu z2xzPJRTM|RM2GcvXbaT=?3%@{z1g)JyLMvNB)Z}!xyB`84ZR>SDo=7xPkb3lkTp~S zO{;e1I%*Fn93mEmQt@)nsIgdCQR#Br{@Uxa+@$vi1Vif7L60iSv+gmx8xo)hrs#+X z;CKQb3F8CJdB7;QELBoXQqJo{m~qS5I8!gz3iBC|1yT?hMvM*7@_iPQZ$h+J_9Lp0 zk!`$^J}@aITK%{LLlQJlR2i;;nhy;WX`g<)NYqi;^_z===Wq|9N!~RiD5Kmo5^M$u zz>DUCv>1nCaWh2PO(@FK!K^5o)%}n)RFq#I_7|lFkNO3kg4RNea;AT>SV^R~yo~kG z?BD<;K6_Kd7kn%*e&X_fcGyLPlNc#ZJi zYY{bC;$wvl(P|VhU7r=Y{z}#Fz^-j^RUR1_cgtFIfkVhbOrEh@OrE<%l7BX*orh>z zg5UuotR_atDYh>$y9YE!{nL3tmZ*VRK{`L=uTcsf4a$efW=A;*z3wt(O#@6tEbjvc z{V*8a^Qk-l1KBUq7T-W7VNxUy2x2M#-#~`AGst|MCJ;Zx`v#0F>qy771cHARa!1@c zz-)k`7&WHoymjcMo7M42k(@?(MgF1o7a|SQy769Cvw;^~X2Uf#8+gS9 z{o0ngHIoBf=3of@bMiotLd1x40TlyA5vc1`B^%2xYVC|de@%K82Gpy{$VwDIHMsgmp1qRvIVDTg&=tm883DLhg$#s+m{ zGBzhh(L1AZdBvo~qZEZ9ClpRurdOxgc0qrS+ zjNOvh{~}P+glL+wXj#i~j}e*W-Rh}ANR>sChnX{*<}U%l@~YNMiey>dYPV!b%=sTW2mLrcy%(r4(#!PQPViv5UJJ)%=CikGL&Py%CCCvzQ@*c5t zsTcrNl)Pfu=`n~ge5yUXyWMGoZC>A$q^4=#*;TJB~M|NBpKQvi?c8yXzv}Nbx1=Jkl5{H76sS|ci zEm<=f;~=V4hWkl`NeDW;Cm`gHQ63r7%Hd;py3-6JNODal(;X(q#FeS&UEk)_k~s(H zLDdnUDtN~o_rwdJsaRTWkyS`vlY20yZYxmNI(bijv2;bSG!EolswCki8TNUL$cpsL7Fc7nRvhR=24Gf$w`0{jU+5IyBGYmUl=Ay!vRWwyUL zDz)aA{*-cjM9a=&7I3=H0JVow$4eNGPKS_%kdIIU<}bi~4Z=6$spH*!osI{aIrTX- zobj$AeEbU>3kn^Qd0M{&dR`9yJNA#SXd~C)VLqyBa3_>)Ba`*kRZ7*!*lvC2af;>>6Em_-1X;6S z;ya0uk5GURhOh>q3_+hyWR1C&tWhID(HWrVkRi%_quK~Zl*dLTw*2TBuh-q5)2=GuFyx6 zT(IglRn%>LAn^b({t2Xd3cPP>MPb?zfJ+yC0)_D4<6J~o<=q&9?O#=QBY0RxwOL!8 z4+ytLQ;?M7(LOt_h+~rVpL>+vV-iyDi?<~8$jgy3`+)Wtj)Jh=BqW50B9g$NcpMy44EKkBET@>cE*t1ZdU?s z9VlE-Vn;^_UowhrWfWa?J&ImK&{Ng-m((NYpVCKJok1#i$NJSE;jMtF9sdceO1RxMZ0a}<+PikXw|^HoVEdQ`M56n_A8WUZi`n= zjSJTwYo)B66rlu6^c&JUwBN{_EeAxQQ|Pw;CwDC$2C|tuZKvC&nfYsqta+7gC}qKeE064A1YPf29P- znk(b;pV7bbj`BzTlDN6Q5J%8-SDJ{~sr)IFZV6mZ(y;}qvD6Uwqd`f%ty!D%Klmt7 z>+tm>#rbnN{R1b(&__UutnkKxU@ne&!q}av7@(ZHt+Rd+VU1A2Zf~UYn;flAdr=uX z`Bg)wvj(N%l(@uZXMLIYYa&vVKMx}SiQF@nB9HdUx+%@VMOakpI^Zg5&0UVg7Gmz8!sf{hALxlq+xOkV(E9tin!5~FjUhf;z>+~ z4w~Z9G4m&P2y%kJRsGptfEnBgP06_9wy@49x8%On=+cX&#C(B3W z57oT&O7m$ggf>e0w5%8%bwt^CPd}~u7ADe)IY(X!?-ONO+aw1TyOO)VP@#uLSg16y zX+_nY6zh5_k-D+f^;Y6Zo$~dx{x`YK8PEX&imMZIGIm?t#wVsI-S5nFNUrsX7lBnO zzo>VrMyu=j#2UO>5v@{Y8M_zFbY8r&V0uoYlE08d^D(P@3YDJeUl}}ogA@@YLTYp_Pd0bqpzTLufXz{U}iHI zXsT-4omW``{}3gtGOs$dJ0mV{cWNJM_w3tPyO-eAG{H2^=lr~B=!`T$ctt6kIZeND ziSpyjR{H6um78WIDo5>+`VHNcbM{sSt1DTFoYS)T7^}NYT9Ma_wJ4Ss)VD?xOCB;R zH_wUJU!1SpHzz&v?PzM)iD8&FZ%HCa;?CWu7CfYEo73E2JZ(@un`3f>ch=%}$B;J0 zHGU&(A7wgQBL=*QMN;wICy9|!`a=^~>7hZP(vL^^Cya%*_mACJ>^GT@*~i}u4FDH1 z-@!lNT#wZV_c(Q)#rz#wjnAZvy<*{Zut7nug<@eT9@N87BhmaQW2aa+1QBAXu1|uk zZ=V!fe4mc?aboGfsH?jx1~wP^1c^&L0FdOsimXQZ>TdOuo@Pl7N)xJ^*H7C|EyX@F zY(YK25xcD!`)ut@1-)9^ufcOa&%)v@ugD4(0A_DOlQ>#wOY#Dy7|9yH6JMrY`{e|D z=|DE@)6g4#DwZ~+75(V6^KR2Ys?}Z;Nj|Xn5+)`g;*wrKV-mLs?hqF+xh<+YM559* z!lYQ}klLr=oKF^CBF&Pxq%kk6D+uXgVKA!ZK*2hRMa}Vuk6H9GhOe}t+jOW;LvhJk zmf6%2Uv{1Tes%_cilw8X-2J_MjN(HdA(Mj3jl{yectE{fQb3i%3G@Y*=8Hvlqlgx_ zMUbdy#eje|64ru+VUqljs_RtS=+g;J`a-d2G9FOqsxJ7Fp*YGTSS{d;Sr>yv-lM(> zR`+oZ^sfwwqiC`JBRkw@(Qvfv{&VYD?JdO8AyHTN6kI|JVDLZ{Q8-OA%+8d>;o9A0es{GxV({NvB?L}-l0LP@rwTj=%5D~enFS_D=z z9P)lcDp)yOay6?WR}tC-V1+!F8yxyaN%Bp+e!syGT$NZCO8NSMrZ;WRK=f6J6Oe>|Owo?xCPW`Y zv_+PJwt%`U9SZPtXXe?I20B<&voaS1{vwI*msdBjitq2S8=>l}4%*TWu%?vqoRl)l z3^yNB<4_Q*d@x5wy!;W$rht6HgpQX`-?$N zd4+RhvGU#W495nd)=E+^NiJ{`DZ|ZVURjQK=VgOf_y~It#3E{rssdb)ZVxhHLJh8% z?YwNX-Rr!J^nLU`SxZC-bk!pfZyN>(vFI?p56}`(B3*Sa=ViTE0&%b?^(6+g)(;b@!SwT^`GA8g@`L<3lcTZvL7wFx zWBnk9HIQL`5C;cI_k%cI*I*|2Va9Qo2tSOhflT&;^x_~t2m9(YO#_+c2WiGZ4*EgN z8c5s`A7y@l?FlQ3i1mJ$Rs>U`JfzbVAuL3&Be)UnL0AgT(J3>PbfrKEQeIXvy8VRM zy5TLne~i$0Np0wX=eAlPURBM=Q;YCeCP*ikoj3nI~+mzIzQnpdCs;Fz7jfzLFvr+LV zZB)#B=;@FFU@7Q*Ak@^|%6AVva`$=zb=FGxsCsVc8oi*i5PD(Y+*}*U6&#LZI@qQ+huw2nn;KyMy?OlNfj8lffZ$_xKEkuYAY;PR=XZ; zPW_eW_lXH}(M|x83|EUzh=mo(pode0Ol8i)@tI^wkw6cLQ%iECS7rqvj*AoL?}E*E zzFe@4yjorisSUVVi0Vno!G~MMrV@oCu_pABC2)oS^GpGdC`P$s#6}5YhI7|k8YuYk z4d!R1WrL;;OjO7<=^f24Lz0cZ#rdWwJtetOT3NBVp#%fBE3X}dG)A*qf-G_k#C9a+ z>X8&xX}&3- z3bJBF2kQV1@x zk-%6~Hn)=%13o^G+`ur4W57%9X2P%z81N9DSE&XDl3#6%8DhP3bO}0V40iXW|Vm~V7H@Yo~dHQ9?_9(rh?_JQ-{HyRg%f;qX9q9ak4`;~g)b}n}BexCt&)Q34h zHV5#iTM5Ab%XP@Rtup-F4p;sB2h8{TnP0q|q~}`X!xp(G89yb-SpmuVJEk2L zN6IC1PxXFKC07oV+#x+J&ax(HN31F3>Z4e6S`dkqn?x(bxmm^28dn=o6~tQIgN2;p z8R!}y1eTCi0A%sS9t?`6iPTERD|}-~AStli5oK46+9=y&3U8tQHg!5`_(Vzk*h{ey7C_kZb?{vv>~>FQ;hS0FrBS|+7@&yf!IjeDJ@0}^~gdx z+hFH@f>-AgF711!!1Q?_fDXo0QJNHiQrs#J3xm!N?l8)h5~b}VsKTIF!#G2Vwc+dy zy9nu3H9ct!n%FN}Fj>2?mNjPd!cWBq2x&u?OaNm=xi91z&6wUEa9!V_K zv&9r?2&`_S+JgZEBFA~$nYmHD_^P8 z9YFXL;TwdX5WEOgNIQq{8^Z4h0@@=GArwL59(H3*7}gNN))Y2XTmM_n1hjd#3f&A?S&eYU{;m;VCFu? zK)U!r)@dM}{b=$yNMk=pp#~D-2kFW|sxSI7nnWP#d`AQ|g`HjRW7j*`buzn-XV+2e zng`X_{x3n&RR}L2Y(m(MP=W9v!VC~=4#EP22N8-99zj@v;A;lBwvE(W+lHbGXExo` zWyKLes8RwRPc)3^3D45USL<8#*|h)hzCujbd`$L=j?9ge4`3xF*jrjA?;snmIv$>0 zEBhJJaYV))E9XYy;0c{O?Z| zNYzfI@zXJpO~!h?Md#->l|Qs#wPue)4O^s62vD+~&M*{A3{Vz5-NN{-*ISjUtbKZ6 z6RiZHDWs9>qs7~4)&t%r2Pd4aN?WfPX&-m$MFgY)C`uM9Aw7T`! zuWuD}gNP!_QFPmYq8}E;OOwBl+@l1t4q$FvGMocc1jKi$nhu}~UrenGOzi|n9NsWQ zZ=KBN(W(cSv;mwU%u*byo9Wk#Ry?a`@=CdKde)_C%$oR4tg?vzy|zNSsd&F+T6{UI zolZCF9`XxDZI^Aur>={JDs&> z!P*Y&zG1Cou%`qlm)Bl!$h*i+rupOaf>)+ho)ly?oUvqF5eqX&cDP1INv>%Ll556E zt82!wf`0R@@&&Q58d5!1-nDf;?$#72U=FJBBQe+%mF3F6T19gWQ`5j-a_hoch(AaV zQ&eV=&tv{mW63z5U>gljMm&gx#{pK*7wT%7vsvVc2~x&YTdGoXdoP@M(thd~M{)v6 zBVV*+?82HJ%O;v%V3Gmr6h0vBP66(GPQj)VWHEx^`Q~|_;2B-W1W&l?6B$c#Ap!Ug zqI5J(;rRRwHk6lu3{#`tV&OCNwE|L>{{=mPj4rq z&oAHk=yRu)%kE(t0Kx~>NDgzz4>Lf6dFDAEnqMDeXkPP!wAMfre@=%v$isdRodz=6 zkL7g^a)%$p@x@?X8n+)t<}f*an5`Pfv#;~Qq^r|7NJ|YQUG)&i4cdGgwF7JOx9G{; zpEdao-sFxOxA~&K-{uf6yv^IOZ))2-67Oh5@L>NaQbUm;=p-x8MOcE4(y|L}2Y#3v zr4yGeMv7FKRfi?SB_)Wf?gboT>7XdL2^i+|F1Xal*1aBQG)F#v;tVPb=L}}rA&vrP zG<(fQ#l*!}{2}Ix)0{QZ)#1=S)37eT;%jyRFo@Wyfh4G@8c39eCPDqOfPr}YAfXz_ zYktmnmxI{+Am3YfM*SUYeL1be_`w#q>~@yc@5;s8XuNhI7qM`WU&U) z#h+1U4x*l-S`Q>m-vkY2fL7piHH5=_z+j-wP%{Xm_D9ox90O*?2Wkf>XFos3` z3Fd|x7*MS8*Ohwn1|{mb&O`RAQ<5;<{21e$so;SStW`qj5w<$8gV`Zr%8&IrbfB)> zb&@Q2hXz##zagk%8;Eh*+TqS!t?FSdgjmJ`e4X<6bIFeLwzgQ#d%Z)`OHA8Hql<;S z7q;?9+9!x7mw7dCi`7tv<$dKHnhGfR{}9wyfV#k-zS5wuLv|r8{@3NW>>IEt1$y^s zWDJ-rhKWx!G$!WO2nNR%c+R zh!_?K75jD+WErZmU2QTF%e8Ps&?Z1P-7(>{$_Jo#Uk1IqMTS*>6xMg9^A&pAaFg@9 zKRnKdaelGZ)f8c~P^G_{}3G*%AQ5$S{+$m(DTR>h1=^$W>b( zsT<6+$PQh%r(bHLxhX1qLB({umxL z2dj8!nv_8W!AioOh7MPY>al21D5yu!1(}m88+s2_pSEPP%zW|FeDV3JV>mesu~j(? zOF8h=g%JjD`DBH`dy<-&M>WOzd}(3TWDQLgep3Oo?|7QtC;jNkq3`b+IgZ}BYC%pDSryfOk&RN z;@o6&S8tAcssY|VW_e}+CLg9CXW4e=#kThklU71@?6*L*S6Zll5AzIp>4PhAbFf9A zX|rH@k2FQ5w`WwhWp7mJ>R>#Y<&!Xu0O0N0P0p)c=Czh1=D>~ZDs&dz;J!vD7%Z}x zw$VKYaY;F@DTxVU(wA0u(H>G6y7Tghq(jyB-hv-@L@q$90;6yez|yd-pBh{L_m>q5^*w*&;8%ihgpPsd)}EQF!x`lG4q13t?NHCQ^T zuxvD>D#Y)^U~}OKdn0rDL`R5N=w>3JQp&hIyB%$Wfe60X$=;AWFI?t?>R@y44oZLEEE#*Slc^jakPatoA|{abMyRCeP3YG0l1v2-660MM?xLZ@R-jxs z7viihF)7|71Y-Pw79_?s#!px8!cahl5KKJD1<^Z{>WiHfm&0at;le6Q>C&cU+BsB4 zZHb{w3`6rlUS^45*2H{hWQUU0FrPZrG$#F!42;NCne$o;hufS50Y91vc#y`7q=hwD zI#}i0q3|cS^@4&S%$l)dPHL{ZsZd9JBYrQGi{1(e<_$~6UK_N%<(R9p_>A)VzasLZ zX+T42quh(Ky_?B-7E%{pQ&=d|)8m*w;qi)KzYin|28qZDDVL{Inz0>6@7+!PyBkc{ zW&=)vtihh^Zcx?Qr;AAk#1Ww16LlteSCo)_2wI2``!;&QZ5UUTA}JFXp5t+ka&Wm~L_nawHKW*gK$r zp*ow0TSJ{asHn^luu-VicZF4<3;GHC2(6Gn?%Y&*n2U!lz*T^I2i%LXXR$qOo&dLIn5}#%^~mcs6$n?g_Y;;U0$jZrqb_KZN^5+>hbj4fm7K zImH3hl}`PjCCNc7uH7WlNHRVb&n06zB%+w43BSd= zNEX&HwqOQIl9t44E;D^&qu@uR%S6`u)FGC-xvtju6MP{pzD#G)&RQZlJ=r0`O+ACF z?!mfAo$8{oDj!$UzDcDz-AIH<2zMe3Mi_%I1z|eEf>P!CSBDx}{c7BlxxR%Ez8uqL zD#}o*v!p)QTABWuOMf9px$xTC#vn3bC~v%;V}x|b4pJ_^-btCer?Jvw!vKmI9HcDX z&{E$!MtOci)(r&zZ8iTBg8%b=T=1{|fC>I$-2Qh3|I+pUM(}6A)$HF1{vTj}{;vi9 zih@50{>6x@Blw@e>;GZF?`m34@Xu@U4+MXg=>IPW{>9f3{4@WB;Q#$0qYmnI<38M{ zlH?x&$v>5gehZ0yj5*hc{;qz}pTtGK!xrPy=wZ_Te@F0}F3`z8*P9}6!T$+V8ubPL zrilN(;GYO@v)Ww$hTxy$Ai+NaR}%c`WjfsegkcC{5Hb)f2qO^2Axtk*F26nK22#4! z_x}@8`l()AN}q+h6Q<|8ar@tu($*LMjgE2QQKuZ4vv)}*wr|17EDgAB%m(nus|G$*h=E&OgT=?m)rSxOr*GlQx z;(uRC$M^b&Qo0Ac%1hK#TuDmLtDwiB& z97wddv*bQjyx$}H}iu@=HXOVA0bEuh3GShyW4$Aee^S7i&j4!|+rZnMav z6D0Wp?FZZqyjJ%eSfpOD4W^A<7*U{zB&D1ZJ9|*KV0_8!3&i=Fd4W8=()N&XAs91< z>I^{V=yX1FQUmO~n%&Ov1wNEAeisWj;enRrx)YWiC(yDff zU{E!x7yA^eTKdxfUk!a4Pxa`Vz8W6JCs4r+NV3QS65yoe_!N_%T*j>2OQwy5pL?o?#X9uHuE#5`!3J-K_34?|%@h0D}fF z)(7w=2e{h@@J%vJo>0t3eGtnz#2_C;In>t#aLJ_=Vg?6D_5rNX04^4207E!HkPpD2 z0i5$;=)?ie>?BG!K#B<(M5zx&D2J$E5CF*30DkZRoSn!h@q!N^Rs%S_R4c?j4p8U= z_&teNW2X<`6%H^t#0T*iAe1@3Zfz9X5UmKoQTVI!#IzZ#BV)1K8kd!T$s2L zt!u$yLvWH!P!}T7;%*vikv|0I2`s%3K1L^Eb z=vsh8ZHxCo?xt;h-#1GVl!oV%9ev5ATpiJm9MfL!>vv4kRPpT4rc|aohNmuim^=)^ z3~rZjx2()&r#BTFwDX%tCt7=k6X{o4klmDRK2PO)viX0*)WzqJhe31ncM%>S^Wa}2 zgv;CC$G2#45OAPc-bORoz_5P>&9@uc%>*)7sjs6x$Z3>|fY0<08ChY4_4-kT`E6z9lLXwbk5V)Pe0At#UdM z83e|jNI?6S)4U2YqJF+Ef}xLGr|{zlL#=U;7A;S#(8dSSp+~f%!*o*rqyuOf-}wv zBPlOGwH;L_U`N3xQV{wy2!_GuBvA`@m1ZxpK%096v{CgWkfeG0Zd@H5KGx~FA?!uy z@rh3NB0{sHI^F#UFC#R=xcd;od4xt7a$aMeP^>f zOE4dVH$Re$9gq4te||19BKvn0Gdyx@T2Pgm1hLxYGq|u>m5h(A*b|LYBFw|k7-6IyPE}_)hvz(P`*CZw9`fyFkrnXblHo6wFF@eOj0i~dyKgRHYR2t zqOAgwTy#kJ{PWl*$1hXm=v)p~`n{lol6Tr-Sf~?}wWpgju5Z;*Oh-E@HK${g{S_wV z!=r7-m%-$K{z|q8ZZ|-6nBAa&>;_;>R54e@9R-3h0)R8{a1jwG9gGrgjk>u(umIcH znD+@1%hVdwRyp`>dUjLv8jJh^W>EPwgZk|X6&{vVs>I@5)X??q2IexK*#Of&YOLqF zD}%mE@9-grU!qpxN|Tjr%=vkZhuy;1y-_K#J2hZIjNsY6NocN2+Z`et-eliBK+xk* zpZE9Nseinca_q?c`q0bD+P&Q!2Q}tmw&9=Bj?m|c>dK$k>Zhah8r3AB@7u9c1;G0Pw1q*M~0%DKhZ ziXxiR?{8$g$>c4gxax+0Zpom{g{N&TEg655#`%z&Cd*bV2|?K zp`)4^D`C%*O_u-2D>|C^Z>aj!_5dsBWNNxk~qjQ%FjVe1OpJwz7b)IDgFLnvCs+D#uQ~>P@n#`QGG_+ z2K7<;eIA#QF&iAyqnEwdb_#6M9dFlTuuy^`1`DGHVlXfMI1!S$GndTB&1Ek@X2fsT z6U`**eWE$s1vlF|EI02rW%%gV$><>!Xd%ynu@4@YT^?z)KER0OX9|~=(6^0fI7lzn9!K7haEqgO*sP06W zAPpx&8V*)AoM@ngoC==w5%yu-NE)J_Z-fKyU(3UIl84d6%7sJytgHz`LZGN0XJ%wh zCvF8U#;rZ^c0Fzt35vM&CVC)l6{Zun#>f5zhxQ_A7{By%J=R>v_TphvqA7`;vZG8o zo!+sA7&Y~Kj1+Jc8I3t-3Au_)gQ{fB4Mb(l>Cjl5Kt+5h=dK~Q5R*@ErbBQ}RXj(> z)=JBbkd{deY2JZRF}FmC`@VI6#&K!Q9zvU_Wh(KRUw*Frj^t;v_K93Q`4aPP*}%OA zN|a;YCt7SEX^DC-uEby8PxJBD#SF$@Z>;w5S39ifZY)#pd{?o5Rad4iK3R{)W_{0P zs=iqWn@_k;T`N>S#CG^=g(}$ZrCRpOwEPR9TJates_%YNPpBqhDf!q}&d^>nZiJzhwIc+?R;g>+$K8DH@-8>4Et4$0^s9sx;|c zi4lAaAHj=#BY4j`Qnk(8FY2-GooA?<`dN1fwFQ@*U|{Le-7OW^f?D561< z8_lwri2nR%uh%oSKu8<6n0m~{uj>iwt*<8e`qmHKSl@barLS+rUd4J*d0}UJeePS3yF>MZwv7Hu0wM`Fn;wXBZp+8flq!>OH=6JDX7jxtuxhO{_Itj+Ksn79e0D&{chni|HL?<*kn6_kv3`vl{`%kRxXA#cp2b z#Q-y&U?0Ju0?sNp1g^t3?BN;yU~7yWd14V&+-+)5ZQMcvB&T&*?&QN;sTkIbBa7li zM?B6**cK9PlFOW5_bWfyfGjTF9XY{emW(3{PSc7MUWS(p_Ea$VEr~EkmWZ1h*IgRZ(A_6Q7O@HrX6tkVp*JiwCiq5WL-VNOQ+Xe7Ly zcUvYOPT8HYZ$Yf#SjJb20*bs3gjx-sp$Tk}Rj-mNPX4kwviVw_mz%kS6l?#f!{utvmUGlO zlWsrQ2^{|Tv3ibu|3in%eK3c{_?_23T+SVFbP$b2xhEa!9|>$M zDlMe32xqQ!#O#$utG6`>^>YsJm=7RC16bh$c$Wj%d;rx|9K&oMz$y+f+y}5%1L!@- zfK6VM=>r_1s}JI34MH&SVydG#K)4T}SOZA1Y5+YsK#fzY#vK~Krxp#M83#D%0~o*n zaLnE_SsKJ|@r)9$`ykqAD2fJa03UMzw+|pd16b5KL#uJc_RkLhQ?$@N?f_D7kr=lr0-<6-|VsWjgKmch0I92({}J~WGT z!v?i?DyfQd52}wx@|0zwjw>vSN&t1dtS6X)_?bxTKO!i5;elO0KgOvjIl zg=9^}AF}r~=v;!h*|;7LQ(dM2$u&5EedQh$px#{velyA-8(kc})L4jzVg{Zx6(+V$ zaL9(TmQ;9GKOk9_yPei!M)gW(SPAjhVu;y*O;!~3J&)ResMS2?7>`+vm}NYsg2yZ) zgOO{QwHAkU7-fBWJLtvE1A(rTRH_)$*-506%W0lwc86}t#NM=R z^rjBQb-y}@uH4|4Ad%tXgbnw>VX7IZ@sObQ;SWiqb01sPsq?0gD{+E;=bp{MdSSI7 z9NLuf$1{Tdqfhuf?F8rTva1$J+v^obj1hh@B(sSQX7n0{>fpc?M`S z5HkU`e=?9Dwf&RO+n>ZRPCgOxkT4ikoaI5VnABjodQwfALOu~EVZr(hC4wu!Nr0D; z7eEcH|9A+8o$8nQ=qZ_A2Rk7LdJfP?bP3h>u{?*+!h$=QjHYsMClmaMP84N)oh(Zy z`?ADD`9@hTrYym=nO$ug%5+B19b8Myubh;yz+byBRE8;528>* zVda!Ksitv&vvy5DP9^|8;f89lb`HcClpV6G@hD7O8jtR$CyhsYfJfsrCJiAb#csR; zr28Fteq$WEpZJbA^jT_J9Q>nks6z2_KVm~1p2{}wiVuxPBsTDhg(Fz1pLwzMrXKSW z4{;|Na4vBzaj!ZQjv}0M-$XI0M}rwfM=f$l1&+KF55Q2%rLgk-4KDpTpQE?+D%wGzfvC*y;o5q5-&4HGq>ME9DbDfG`c9 zz?a8%4lvgTaE|Pr$aA2E!J$6GAx8Ni4rmaIe0eP706lyFuhlV~ay{ncJyqSn0=`8e z={3XhB>$c_RPe8Q=!fJ!qJYVeN)bOtHWeA6$F*!yHo?>%Z zjys$FAoaVZ8X?_j%z@DO_S>F>bfKjuBTz^VJcdP!x@)WF?m!{Nv4lY7-QI}v<7pf= zj(UqejVNZ(q08~+jX1%RVtJCAC(U6=Wjv`NPg=#3#-~|Xz z@}zfIl3_glTL6{5!qa}>Y0t1UbsUo56~*HoW^o@=oXcqD;8%IleJtr6p45mZ86t?P zp(9w*Gd$_jH(3FKcv3Hxf8~@D6(^{~!X*_8rPr8XG;b276HkT(&GbssT|5l!s!qV(Ktu6oT4xSXol5XWmJKtbroX(Se z!<#pvA5S{QlV1b@m5BUNM4Qtp5$Ul zAMvDd^c7qb=tli?^^JODRy^2fBw?UI{I$-!M}ES;Ye;`udKk}o&)lAZIglnQ>WNZM zaj=k}PyXHWO0ba8j`a^1FVNAqqyPX83uTypY-G~cJDelDu+b9|A`Esk!k9o>s;8JA zo93{Dv+LWofY?zJ*fpB2Tp*D{2Mw8!Lhkj67#C<~^BOj089PH3F)cRJtfYBOTTW6X z-FXF2c(fOZ@}FaOEPb9%7YRDNbnGex5dB?qI+W4{7Vgptr70VH;0)bfFp$`EBvs0M%=@c(OP(Ev4B%w+F28PQFy37^BaA*KFgTo~!OboXg zDSEDFQez>jMG?MJ?Qijq^Cc&ssVvwn>y3DQlxKTmA-zWjwG{ynz1>Xh1~ab?LpJ+| zP#TKazwpe*!5s8wvF-6EnETblSfxdS=8hYX9RG%SW0Hq5l8?NGGdhT@rD$SW)!FEH9zKInS~BK z`&HD8I`GrPC*ZsUx}-97G;uQiNjU-k>zP2Q?ugdLFo3hQS#W#a@zT~a1hzP5W@kL& zpK_PC6{HTyYWf@ahnH$nggJL*jos-zBp<_=&>s1DBNmL%Q!ix+YPRRS)o7I?PUVv==9Z8aYc&zhR!GRsXgQ{ht2U|+o z=v%$wiE1j`(_=DqAMMXw2O%qnlg;Ri>wxqtwMQ;T+UXTuDFMHA_3b|3gVD7Hc|2@2+5=CE5^zBIIzQI; z@hEt%%od_N<0FNh!8_Iy!n_i-q29APQs|~X73{&*xP(T6_U)w?J>E!Rgx;{;lNTjC zDouPDA3*jp3Ci7@=-dcZCMOQHh+Q4E4jsgld=99cpU?IBPb~7ZX)d(YcYoEB+gwNz z&UofD7g{yz76m6FR|AV{Q5Za}pjv?w-Nu8S*P9Dd^zC2rG>sOP=vyxI{17L^$>bU2v~HOgNUE;U&A%{uVEr^gN8)l+#2+_6o`Zw2lR>cX?VV?yP)9zNHm9>)|*$`FPqM6lCkutRP|$sn;Y| zt_OkrjWqFIvDuU3HgyE+83F+2#-@vBV|WGj^6!X(6?o(n^nmp?FxK;U522cQ8|t2D z;qg?X5P@ODj)$K0G-)MtNF*&1sEdX483fw!5{Q6(L%HoB2hM;c3!d`iw-S2v$TFY= zF6;rRG%tg*FNp~c_-F}AwOQTQkC$raQ>->rs_l3b_&;2G&a@Ib1@Bpl3cB;os5L>J zgw{f8`%*n&qyYrNEUB9x=Lp0Q(#9In22XkBwH5~Jo3Hg$w#JZl09GuL8Sv93m&h7? z$YjRlAd(rsvg?m@_5YYV44JSKm@yC&x1n(J!o+Q35TP=%g*3HG(HblqN%$VezmCHV z@yS(GA1`kmZq9S{wAB&6G;hm-cxa6_S|Zg5pfezw3VtW*5A0BH(ch@L*cz`WHT2#0272v>h z53^L8Ql1pom0>du((>UA*1m2&XfetsO3Nqg2@>;dJO>&J$;}3;Em(`~qmhBvNImbYwI`zj9-y;?50J@5Fv+l1Gys=MAGw7!c#RKUruWYXfCmX_y1J zvIAW6L%1cqANfTNdcyO5vJewC(?I0Gf5PECq_CoZ)d5@7`=2Ii` z8OOpUi#nRbXn`2$KA<&^nD++}gB*cVp$?_8jK-H5lZ<%GvnE$)We^`+?pdB9L?|_x zk>lnCfHZllz@)cQ4|Haxt}sH16p?Y6vbiQNObAmkA#6vf?ub9G__A|CDM{JAim$co z)~#UK1&9xx)_KIcg=PWMu)tEjZXGfH4eAt_M0oLMWTpxoc9gx?g(H8)y77V71d&~sJ~Zh+ z%(DxaH@Uxi?;n?sK09-!otZgv&Y3ff$gPI0@SaL3jBZqA@AASuR*J~+EZ84vq*d-7 z!6wx5n_YAZn%WwmZ7>)|F`CSZ8>bxLj+Q!_gAFHL)+;QA$KW}LTp2nNgFF~>KI{q4 z5v7e-^AXJv6DJ^u-_pMR$>1eeWSLRp=DX;HHVfKkF}l2 zai)9^Y#SBI7Zp`^bRW{BI3!!_`1F$<{A#8oBKms%Eotz(7F4ArE{-wQ_83j>fTQHc+0jSgf={Id~?OgB#YOm4PA6 z8_WG(JKn>r3q1pIcrXLmU=1Zjb8eXix6-6n+m1H22Z#yHnE%MYzkm(aV$7Nsh=aV- zs%A&Os+e{G;PGSf@K6T?n9_F##n*fY;23=hz66I_u^UcXbxC1i29i6#rQ~O^qaBRR-sa7wL<+DQqdm-yHys$ma{;eG8r0wjxtt$N0f@!k!%jH zJxI)H&(a)MmN^VQPOqwmfaojS1YuKz)P33zhng7S$tF_3wQEge`F zx8{JB6TL^KBzl)dI2@9r)V(hvqFAkgU!}{;bXnjiV7)lvj%gD3MiW)N^uk^BTY=}tTaMusGLUfH zbWtxF+UF0&PGV>@w9mBKYUL)V_z<~{Nf*naSpuJyDXvDdPAzH{%g&HWr)}2ng}xxA z^QrQ^&3v(8UKw7W!^y>pXqeQmpmNG4llY_~$o(tDNu2J;e5*Lx(!882s&&K4m}e(e zpI0-9j-6OtPoEMZdUyHN%C9rN;$BN|^IlC;Yw`Qy4H7cV5dAVf# zjlAy8{Tq2XDAeaK?$Y;DKb`EVb3ucZ<%?!0^EYelwCn66fGYPT<)s zBBPhT(DzS##e=r2F}Eg&eceDo&cBJL-9SN8u2rC*(OxQU!&1w-eQ>HuL0?gghR^&j z3hG|CIst5J=0y>bz`F2^YbpT^_f&HlFs&@7#Azx44VSkKRUC-y6-Qj7fa;m>?eXV;$U=b+i{* zN;S8%NE{=g`=iM1qeXIm=H;n?2@~?TK9$<%9KOoAm10SMQ0^zA#m4>+zqzAxulHv` ztbNx}Hnhw!9^oo#)}Me`17Ow|Vf2_DY)~}C$ku4i(h$NtDHe|kSoJ@R6j1{({H~7` zLkBP;*GGvB16UXf6jukZRy?PO$k9tQ8ps;!S5#Js$UIUuFAcD)kz(>d)}1dKC-Mfe zac;H7*+#yOs_QsLL=0ke(gQGzaugr>lC&n>%0;zRsc)~*7(sW2x3{%QYzN#a9gPJN zQ)Jz@pE+SU+mi!LJSA-5>E%?v~F?0xP#YPG-ghjFgh3o3@FMhhp^XJtS@nWkdMH<05JpWZ80B zY(z^g8djEzX_z!0ik^{7!xz6T4i96=?)Bcbv7(GBr~s(RB}KFx&gxaGb%LnLPk!|$ z#DwAO1Ygifw0jF<;X^U(E!L6qLb3iW*2Y7}OnjRbpACXlE3*h5+5~pQ zZmTYc_41Y!kl>~2OkM{N5km4A#&PSoeF&pJxA>L&LIdM-F~}VXZG&7IpX(tIwM0PQ z;6P%Cii=g%-5gW|Xe7TvmTXRS3NE*^iwm__i-2Gtq*NL%$<<3qE&{p2in;k$kJAE_wkFszmvQxRtb(Jv`I9QScEU`hrZrL7*ofT)m zADCltqt0AdXbCrf!Hymf=MAOH(gW$Tbi#Gf{}xxFvf;l*4`l! zvoFCiHmR5iU=|c(PIE7ab#?;^cz=>GF(+d)pQcNaWM$68%4kJ29e&ch2u0bcl9Vdh z@KZZA1gY($q;~2_TsuSf9Y$)K{?zE24!Tyh{wm8~-I zP(@O*@jpqxYN^$1rB^TcL~4~oKB0gbxyZb@iDjO34jDF4kR7W*AO zivJ-R*`D(2CcjnW*GYa~9|W6xXAEn|t27ns$FLyxtoiCn21#fTd5n@eU;I3V8KTbr zig|6;j7pf-!j2jaO14};gdC-zf`Hhj1g#0^(<~=R;JD>6lO`voxxsi?`HX|;F`4-! zhxe0xl!G>pLVAn#aw2sS+0md{L6E1CL7E<4v>U&p76XK(fWDZk?LB~2l=D-Mb80WO zLw?jtVBM|zk^V>4ZwQfbFcWqLX^;go;%zvJL-8?MvU_UiCo3L55eIb3X&*D5q+J>< ztDEJG3hY2o*%KXN;yBjPQv)O+4S;nPQNBccLtk-t9E;*l_Y1>RR@1Aea{H-@)78FZ zI9=*X_TtZ4{h42J0M|hQQth%aFuKXW)t1SHJQeVqrl_;Lc~J-nf~G66dQ0t-oKB;!<6nsZ#lwX`aG6;!j> zPk2m(e4M>obeqVUc)a`PYqCLFdaKAov@GgPqQy&mK9MzTbr?7+@AfCe6DkUs^e?FQ zpPHUIr&Y!zeKVq!R5d+wNppvZINX$cRz@gaFOK=PnsBzd&;fuNK;UGR=A9=Ju1f&z4zPf;l-SmD&ey3Atu z>_VrB(VWl$`jt)SkgfyD>x+nB4=ERMzuz1B7EQx*K@Y^>@TvpecMXlrCHCeF_9pNu z1z@>|v(F}n0LE^XY}_yS>0^}w)~Yy>7+MV{Tlrh3*!1qeNLiOi*+NNrdQfE*>rsw5 zc^?=sWm#Y=HWx*lLa}(dT`ks4Emm3xY=Vf2Es({QJW`9j)kEz&Vjg$F{;iVz-&NWF zyD?4DzX0(nkNOe|DNZ3mj%{U0h`_ta%MKA5u@`_wfjQx_Q69RBgcMhiU`1>8>^) z`mF_=YQNn?Y^6gV*>3?#=RCFF+QA6_f6#AtafT9YDErOE^~?KhNvT@w0@TBr~geLym|+{Bl%!mWLyv%ML(E3 zWM?~o@hiz#Iw_YE#Dggea$@V%GC9!{(0`K?l=(Bz2>!wKhZr)MRY~66&CY-!HfZZj z3IG+w26QK485P9_Krz`}NNjZ8fliQOMxdCJ21J~8tB6e8Tmg~M#VR7h zI+r0bxU-7Lux?b*HxNl!D^9-yME0E(58eSHUw3^Ikth%hA+o?ImQH7NTtE7O5LrWC z@qGaI66dC~F}#OCbeMq_>c2xgZH>9!M#86ue)}C2mCc>XQ2Dl#YR2Del&EB&P1d1J z$c+D?5c6j;|DZ|lgIqt%K?{`G@xM~O{u;pKt$Mt-AWm;9@WU1D?@cDBz>)_Z%bih+6u+1gGj9c3_Sfv>D=*+_V7+$cVu!)EYF-XdTw zc1bMSD!R;tu~hj=ESt-sJ?`C<^8XImEL39srM-BOjk)rkPgrXYnQ20foL)-uQO>_B z;^wj1UeU*Cz$@q>m}sJOiceXm8pwqdfNW_cLVqez zB564bO;^}AMB*>MwkrXuO+~I((YOvwluv8?VQJA+@&vZhP)CY~oQZD#?BeirUs97$=zY_c>KpZ;<_%o03p!g zC*!^VaW5S@^4YJ2Uk2_)%}^FxS37N1JGHe);$}eNu8|TqLzTE|Do(gEXu{R(2wF)o zM+5hQSRyU@U8BSA;n)lZ%XO6OkCK-iqmq-itvlS}dZiSUR8i>L#_d$xfOap@NDh z3#c><3QqP0@$-CeuU%Kwa<(9%ja6=HD|8E3Z~v_wPzcT%Dwgk6VTf*{mTHZRY#Wd$ zr+Z(K?8DTM5DIOCIHdF_3s?j9=k3v3G@htSY0zJ6Cz_a; zzwcm3truSqo%|uc_vKf?SBy8Y2K>+J;(ZfLekB{lEfZ_a2YgB+%u9r4vZg*sm(`+r zwpObH5g!kyx}DfV^jZTGQKT@hVKY42q5J|&u~a6Q;7mB=wiW%ezyZ%fU&~QWtQT2X zSXP;l&Z?zf)FH<*8ceV}Br?QfwR=?S>*wC+Ah5f2;4$mbYF}Y%e+vt3FVJO;1v%ha z7U$F|+kZzF731uMDlLl?o?VfGqY)5eNhpfJN*GDg%}VWeVRhPv!Qf`Kq!r@+&MYz! zVw2@&(P<$wvZ-R}Lgt-rthi85`@)Dw5E1=HKJ-pf*;8jZ=(E!GYM%|Gh@*XEpT#1e zFZCO}sZ?-LZO45r)OLhW+XW||<1WK71{Tv8KvWt8D+A)1C$vC$%Ko;f>Pzg+`-}=l z=7IQ?j;3};YdH`o1e={`i(WrM2BiinfBc}9>fb_iSPepX6~gMLuS7zn4)Wc5AB|TM z5}iGO6$|KPme?!NW-#a*(Pn33$^oNeo+ak+t7x-RFzq|TgHl+tZ)hnf)#c+kx@Rmc z5VNB^+eL&m0G(acWMyepWK>Ia+)XHXmYp2ew^I3Q1L8pycfk#f9)gE`L8Jwr5Rv5L zYd5BeU5i;0zQ3yYeKCy7KYS(HnIQuFKO_S6A!DSk*l5ODp&q7FGCpX-)YiqcwsM%d zK;lTOqgrc8OL?HB8=xgJOTJtvIxS&!TBYQn;vdokmiC|PftzG`rOHlR^<@`i*m#6S zqk!x{#8mFD7VDOnxX0B~oy{TDQ`QJ2?e|X@7L2oAEyc$l zGf!SGT;zVt>Qs;Yh^pN|e%s)CTx=%M+-E5`SoNo3?ou{|eIy<%W$k&oi)fM!Atcs| z{@Ji^zFZ^zlg+w$JUK0e(1XTh#8uLmgivpNX_%~eMFDhmff&9F0w``b4HcUJO0o%{ z_4~xyWvosu|NV6J3O#9F6UzoMkR_oQM8v%?j3z6FgW~2gHp2aBb2Lju$@EiGl1$BA z?yMz-b7QS|cR33ll}Bp${NJO{cIYKV12pBxCxtc^Z?jo`L(9_mQsPa76j=*spl4O0 z@hd|xd5N~*7SZgc6z%QB7{<{wj;)qGMnGVR%<>S19Oj!o7~YtO$GYqTXnK0aa0ZRn z(O|T=^Nx=A6vVDW{um;F8gc&?CXDMaVazI(K+U25&{&4Dhl5qnQNV<3A#&HzWF_{L zN^Fr0)zGsg$p<`FkI+$KrRjhw2{;~54S>e_pq$$iCRWm^4l=o$9ZOE%#OqJ&cCs=-#b2u zIqZVVh{Qjm2aO{T%Xu|H*4wxXh0q^t6v=MrhCoE5-Xfa?OwzGrksG&1BdSk%A=nu4&1wJVolyd~ay7G+R}1(_mG!O7;}%(1GAnD!LP@^qb~ zUut=)2qXsw9#+IwQyC)1MbFNES&{_9*yqGu8r@1W>UgScM@h zLqvWu3k*(Gw7?M+$L$Y@1JT$bx`J%PMZF(JiSJi4-(fObm512ml}$X4RHLt91|u^A zF-4m=jG|59Bo32F9G-xn#@)vF9#`_^cbEKbliyA9y8&M@&cqrzZo{tawI(d}f3sG6 zCRiJ`yn+_zU8wevTZr06(Bi7XY1iUbWI~IpFOFnFivw2wrNvFJt7>s8R}e2bGL zu+IOldfes}L_ef$|BD{C=#biy>9y6CgdR5=&i_%5TTu7^UXSx6WTYOq^<%ZvE43=H z0d&2Ca;MJ!Z#`~Auu8Z8uE#CHZo(X8KE7po-0Tlv_;~IlHhzHZTT@qwS06x+yMkSd zZ|ZU9_p9|h5umm%^tdAdsvh?zv4xYe>^GK|cTE$HAF(?1f;NH@%JevA#J1^ivo<53 zOmo|961_iy<`%qM?EDCtTUNeW;@p~LCC;o_L35iIM4DSN4+v6~wx@woX>)V8P#v}M z>x?g%Q#^&^I-JX^B^s_{Q`vXo<8@f}#)j0uxv&e4TA|tv3bRzZ!HK<6WjpLwMo0Vo zRJ*}nb6G2WVIZ~g8-{~zlT^b&tqrJWYLl7x%)xp@Hyitf$-mvVY^56wCtm)Pqi)6T@x6zYF<;%Nqdys(s z+`vLfYamtb5d63XG~PU6u{rqzXhb>S@OF)8F~mTbMzjtwAqcEy8p!H~=WYN&a;YJt z5yb~rjZ(VrR(rm)k2DCRUnWhcXH7)KJ%>HZR14J@0Nv1#1s@K)iEOA;@(`%NdwWlfHO9l0YGe42 z`3$NKG=Hd-qT6arM&;C+NM8x^vukE+Y4BJyTrZ>BHM2}oBymrpT#I?)Vb{!DKv1L> z6Uh@L5&3$9lH7=r@+3^NhETy%;)oX703cAc8j=`j#Cz+J(8W~@qtqg4C9NHt>MHy& zSQ+GP1qs7cOB=3}D&N{LjI=MmV&tlHMi1ajjnaLYs(s~R`evRhe7|D;6JmlY?0JNhoO&dplK8cX9p!`t1QS|y{w?D>arl`37~Mr z;wenuvLwD@fw=lDt6TZ2Ei(EiZbG|}^=bO8o|@*clQAL7k(=j!TyI>lqh#&V!9)nHAk9-(5x|w#|MM75*=WiiI^@v z+sr06emGCI>N>QlocC@;V#*KLr61=e4*kHQT0YgvmbpPK1M?Kr@p?0;MS|ql zAirMp#WqHqa>+WArcoXzi-;{~<#{@hvxRwjubpnEMv8*dO?&1zIVeVFv3Co@3lGAu zl?C}-sfvOu7fU!@zw3#^Z1I-PF7XZaD=Qm{L0hr)a#l6*9wNG!v3_`5v33;uwlW|2 z+zz&%&J;JcGVhRr1WU2e^3WKuU$>wmP^LS3CwI+m*w$z{FLwjPTc&ugJoQJTm9v)z z*SLlX<8+hqg)4p`sWbEG#j_4ss#f)mukqyBxM+MuzaLpH(}`-i*uPv-S%l@XCi*4yF!*rUAD$a@O29jV z*d#H%o|vAC_8HQtDEY;PJ_o|jrRUtw!r8t&{dT&DvdutgU*BLUuo zc;F;f?qK!2b5MMVzv+d`TrXqFeq(mk41_Mf=OoVUV6|#CKysK&XHpJBZ8>yMbI7^x zB;0qhT5ZCS19pJS#bB0+{V85{)k4LOBAVn$D5Gh(8x}h9+hteNyHj%7GLaSwfW{v;wXYEf1rYIZxZ)*vYLE?E%s0qoU=*P--YeJ&1~Qx z6`Z+A&7|}@HIpmQ4^U*}Cb4lB3v9fLc2~#=icbid8&qyIT28Bw0+M~%`e$WPo`{#b zn9qQAd+ce>K$(}Lr##W}z8IO=`i!zT->Gq^Gl-_$)K{i#jd1BZG=gckH*jcl`#UjV zH*3!CO%k8%W}d9F*uI-Z@Jr*xpSxL*cj_b{ZmvX=(!=J|iitRp+JQ7Gjk0i@Fz#jkeL^QvrZ~+^dB)SA#ONzjVyUOhhB|Z{$Kogt!$!GS z_0@2o3AyVCY}T~KPgLd;?6j;9rQ~aoyBAZNrC*CddAQAC^4Ca$C0bZxdblae#)_zY ztdaKaWaOWf2kte01{bsTF@N1&0%2En)@3xx#&5*u`&bkI3<9b|Y8!D&F72Q;QaBf- z`&ekuU4@#(aw!c<9@_p0IjlJc5L3EHj%CQhDV&Hr&}Nqn5}`&7HUJ?z-Txj+VuQ|D z`9CMh(!Pzf%2&`gji!(!B>gmxg*E&PSm4@Nhbj2!prU17dTmt`N__8(6Eixkjmu8@59e4{$^`d+;wsQdjKCdMXo=OnxxjX z>VHQhnAcXp53;?3DDpXYZ6*QCPDds7O1}@F$*h>oJ#^*QoEjsvGtZ0j`K*5Zo9k%4 zl6A4!ECs9R>U4)4IA$R$W-W3p!p6CM+(w>3s>}$1A(cnO@)C4npN;>WWdU^;^PC% zzfCG2QD(zf{KzM(Xu}xoOf(&I8+xGl!P}B27e7X)fyK(pmI6USpXD;~#{t&0@^2`n zM5F9-6kQIoPGJMl%9#*Pg(yS03GHFY#l={Ci^^rDNW&cj>aq?Ys6eBIhiaxY6nhRb zpY-n3E!o-t{3wTE5yk?0J%!eg@f;Zn)W2RY!wc}EbVPW8X8Ua?2ZTFBHMcG~reG}} z!^N7`K{+VJ0uCUwc1XoZ^FqZUaZ2@uX>}(hz}vMLQ}GsUZ)6s2J#E!YxXqkIze6nY ztwzWc=Zm$}3Un_4NpH zfpfQ3ea%nAt3qtqGUDWg%*;zh#WD75Z77{I1OCM(Xsb&1k7XVjr5+q*g@+wczW-YF z7oUU5uM)QIN6oF9Ab=ygsOfbv2NrA2!mrfEU{<0L%~mZB#R-Yw(Nso8GsU_iSbtuF zm=0i-qp$)ueXNq^B3mXD+!?Q5X%|pF1|Wp`5RyyCua*AP#%QUqk-ABmMn9m-Ooi6R zx^zu1M1U9=h#&IOFT5%EIjm`fFO#hXh9fueDsAh46-dzxI?vypFc2Gi+h`IDudQh_ zj49d-I53JL4I=p{%Sayz^&|`zE2O$+UQTm1F47OYA=?busV$Ka*#i)VC6`j2GS8${ zRrUi@5Vd27t+!N-%f=3Hvlt?S<}Rfv+uQ>7j#J_j7{9DTxQ}Sp)zRN^JbZ(?I@S|cj|6U_HbDBM(Hiw zS=q@UkFpsAp5KmOSU19*(!aOffe9euH3f`lRlZAcq8<==at(+aL8lt=7#A*&(OktM zn!Ih$Xv!n`K7st$2~R&}O)Er4%oen5KobF2fu=e@RBnOB6)qx=0*&70+K#SvFpkS3 z2By6xYMo%7!TO_=Q@m54JrIhD*2NA)#1Y>yG3W$qnjW`SV(S9Tnpz4ay48@e0(mIW z4FwK=0zl|Ol1X&4$ZyeHqaU-T2Q<|JO$&Tg44c5EV%Wy!vLitlHUrE;7x0)pu-c_{ z{9z*#+LO%JH|>3D?Oo5PTzR3FKiUxj(x<}e19KtOd+2jD&mr!DzD6p!c`2k-3o%lBB~WJ7rs{r?;=*K z&K7UVJE7F7AAlt~n8y^^M5`_$1CXa|q%J}XErRX1nh@)XSks>Vl*W=(NKt5U0{pxu z%mPvP?Mr=Q)z?5?VEfdqJt;~Q3`nKA_ka=Z!U;QK)o)mh!k|7yS@o+|i@?*YnNPPV zsCsr}41P*#kYWfjuVmGSuMuNUvml=UHQ4)a!Ow*F;xr5Z$6;4FcA7PEkHUPMdM(M~ zYP3Y58&(4QGuW9Ca)#A){~boOH$pqe&<<>^`1lMP#tj~Von`*6o8NPE=(uEQv%L2l zMd(@9^9_LMEQ@^uaP};=DOMHL&#`#6PYgMSEfH&C#KLpX`0vJw1LtsXv5t6p4r>fk z-W4s*v;Eln^6WhO%SpEgs@Rm99Gmzr;68&rIx+kLYZ+!My*f&Fh;M+622rohD)Htn zF6J)Yc;d>%bW_(=w>PtTg?QrV1!k}#MG3{D3v7}8>|Qh~S;%8`@s`Btpb)m6iDehD z9I4WBk|IL?Q|D5M}qfL{bNDpudw3 z9LEjxZt>X$bJf>4V-$_6zK>ME)5nIV&l~kgK)h&NQvWXz#kHSVO?!nXrEtE?BHjQb zT>e{(|4Q=lW!A8H#nO!piYy(`m~rM_vT)sxRcwt}5lJzz2KTG_1|;|jYh$?V4(f?W zN}A@X6p_>PTXdBEXiZB_hqvl1C%fuN?603;@S6P_X&tyL{Ck?|! zsMg8})iYW-DAKNCxocWu@#R(4-%A?V?2#JTBLxfnHP(}tG!dh&vA&H@BvAD*r^0^c zcuOT?c7O2rLghEyTZ74E^x@7f43|8Tjp&$iv#Th+#@hOR-W7qSAl!EAA{m-$xUgs* zo)(eUnU}K>udyiK%oBsIvoU@b%^)SyL8CNoSbwo=->Az#as4_=?Q|RSAJdGc4)a`; zpW(C`o5}_ROIDlk5Y3OwGXjm4K`zR6=}Cg#wNmQzQf+b;t8cKDHIf#gB-8^F8gHt@ z??!R$2J7mUx|mo{Ul@Q$3O`vWTHjZKbA_e`WDS4~5lt40`>S zn4_RlZeoMNme-oLQC96LSa*DcW+Hs=c)~FO4yxL(d162@w!MXK6ibR(DpFaC**;cX z?E8(4sIuZ4L`N*QeWFnb%K~^y2}>56e`kO2prXNyk#cRTniI9_t|Z)u&^>kwT1$X zk`z^E+6tMVs~|CX&yssbOSXsHXf9 z4wOy4xejCxNlm(=3oghi9d~3661u{i)`t&0)+Q%4a&YK)fBl4Oha7-A?(5Dr-Pof$}* z-F3ba*^=Z32-1AMY#gEqSlCf%BqifTwq&4(eNuOo(G2@e?m`01w z{=^Ow;PEHnaaX+jlXce4rZYY&9+Rhu?oZfo)<|rAf(sUUiJ~X4;nf#+pRllyO2rkC z*!tT)A#p}@c*?rfT00VjuA)y4eJu1@h!3s^qAy(ybd7n6{HLs$t})JE##>6;4E07= zRKG3QGv*WaRwyPMO~HL#@Gf_#@)R<+EY8n3$!Sa(>TPtqm_U0TF#$QLgoKJ}&zY}g z&)djfWL(1qKl7il=G7)tOxaW9KV!blKcQJ`dFCxEM)CQl%tr|AbLOXcHG=YHFIYR4 zF516*RE*Eb#mbTum_J z1M%bqi(<<}tCwsxUvhKRpFCJxe97u-2iBHDTpx#9gxd?e;x+n8Rl4gA;ZVi@OM zKF6+8cXVrNOzBnCQq>L9r4d<2=CxC{h#`NmTS2=}lrg18pwTfut(K)raK6I7!sC1w zG0LRT^`x>xjCjogeP&QZOOY|93*r`)IKrk+BP%~ZeE6DqvoP`FYZk#)ibt^88E*aYuI9`qi^QLgdfBNfxqJso)gKiBd!|Cj}}8$$?w7MjOq>P{mgU z&Ji1|&=zr8<+PPq_>DWOhHx+YkYUhzR%P&MEN;~wyhk-3=&oRQvMv5Hh+d2bVqIb? zG+v|Ot;j%YPjHR7hEUx=&tC++x&Lh!l$2ot;_r_Z@jM`$WV$aYK9e z%d(*sE48c1hFX~>8)~t#1lMdGSHdSzLmj2jO%0U~N4$A-sNyf-^Td}qv}>K1}RRur<{>Om9K;Xrb6u1;^UnRxx)71zraJ7@hX%b} z`Hrx+0W8TXY%O4>5|*l?Sjtk00dLwv)7&D5)KF#7IaDeIyF48Cr}}1{0g7p2u?rtp zGw#}7);LQ~mvRlXvQ1H~Ov-Nc%DikAA_1-c4j5XQw>9*^VPa_Etsx1qhJ~Ga*peXM z-kRDM{QC6}?kkEab6?*YXNhwZ#yg(W(L+TJV3#^$%5*2?xp1n&8+1H@13nN(pnhzr zEiHlJ{;{IM3XLhTfZ*NG`r_zvGQr_0N^QC^MbK>Jx8?1=YywLN6%8MW7oGV|zqjHz49SKz!!LhdI@P z>MX`p=PhbF`~(y*(J1d?Wg^$$^T8bU^KPC5NSFpwZGhl$vLlqCG;%Z_tFlb$pxjq*VWc zOnLVdX?V(I413I;CL7I5g9`z`b7d`k)w{hgRM8VVqRFve) zVz{37Zd6MPG@N8qROBUbN;4|*NU}_OMV89P&XkAZhMpTRvwyAUek@n`dh!OryWEHu z;JW5`e43Wbf$<|y)@=x~Fb#{sk-wkC7*8I|`y3I=J;7F-dW#=Dc>r&97&l1sy2JaS ziJ))Ta6gA?Dc@W|s}b&>!huSJD(}N#SsHu;jbt{?P?o@35H;g9*?ph|%|G}RwVqtP zre{`_mR(4%z$H)FhE7Fds26{8#{9V#Z)vA)Ij6qk#pk>MnBdKuzXAB#o7Z{+@RK)R z00uk2hqvMlFNk-2AWT+>A|I}I3AhMkpD9J+o)2%F9*YwzPzYSQW;>Ny+A%u+r!=bo zGtFU64ypc%p#sd9GMG6jt^{#BfVp)ZX=DTFsE6ez(gBJupp|~dVGw)9_Dn8TfT@|( zI!qunm+0-dsu}bpS6NSDEh7#a1x|`xzPwS#bLY`t>O}JhoS0~utkzUbbi}Ll;PQgI zqF_uVXs3Xk%N|hP?u6C`&#LdoYx7KOz47DqLW}be6SOuOD3bKNDk zxRl0pZgqb?o^i*@BHe&)osCrjsa_~YM4o}y3H%9c+E%e+aLO69N=dY>Eq=YIRFl`# zjEEv_PM*Gvs>!v%eNZ~xRcw@Nx~Rbk%SGk4A89mGC%~`l7E@|+_uA(mQ(|a?h#h_k zfD*TI|03~4P2QhR-z%&&xtHKt7-%ediVg@>(oiN4tg{jBUWZ7iGc~XNkfr@Mv5E?Ad6rAJfaZ zEu(dAoZjUL9I2aj(FIfWd3nZ&qIVLh69UPy5UNzcKqa$$sP%xcO&6Exzn0)JJLhQ2 zrN5<%YZK-2j(>%O?6gRz&6|sbwRyBl3#>?^Vr#{z+PpQ_EEko7xPez&E<%HNa4lsS z45kLK?p!#mxbMB{e`uSARX;rj3k%vK%fy5r-qh>C0q7g1lhy>w%{Yq^Z}~0Gl4&hG zDz*mkko3(*E8*+_=1;D;SwxrhJ}O)?F2S<qO5L%S^6lM2<&U6TG zQU6{%N@Z*au2mi^r)7A<6K0wQofx_TI}PCWf}7X__HGu&En14oRB|Y(lCWqiRck{q zZ<4-r6vMlo@!6W$Z~(VC_)#p>CrE~MoMU85qLmicScKc$xyTk~6V+m1xrBF`l96l& z@pj}Cr{>g^a>Di?EAl{IRqcuQQ#EZFEsT>nRmdoWGJ@_&8C6#^szDh&|LeapnpGjA z#+}5v5bWkC#r3+D=cvbBICfxhn({ddxAHYIzzh%_0A#S;qA^mJz<7SYBNNeI^5BR~ zl=Npr{|F8|bAwDipiE%G$1)-nkLjaK?HXe_Y}KCv>XgBBWU%f_?vXpV4zJ31@jkJ- zE^p|$5v1mjrq#J=GN;Nlyhhn50euDU@ zKKBVZ{W-2=mOC#dM{i$4*zW^7kz4p+KB7Cyl<)S6EA_dbZ*(Lc!L@92LC?`>jKWf~ zT+V0~DXKT%ZTRbUBEA7{)y9B$VMi>_tomc^h)lrytorS6(sE{&HLWV`dT<6Ozk*Ze zM(i#|A;dv9iroz$&d)CtR~tagTL%cohP(l<(q1%e$bD;kG|mb8&2b^)QEWW_|$S@Y5C8E*LM@}iY@S-daiy?lIjYqg6N<|*g2l1@hMvKIrM%<_E zFPUW-c&QmkL+Y*B)PmX(ls&9z$o^p)WDig;0$D?T!@=*yd(-eJ+CDfj1wu_B=x>Sh%209YDji$$oxhNJdiqb8KdP{vTBIIB_EY9X5QFkbU*alAQCN`G%Y^{Orl zry?C-kfPjADt>XYC81O#DVtz^+>?RKAEfAZ+A(kV>AK|z`Y{ z1>eaVxs9RXmb=M{ke(Bj zq=(|`GBaFc;^#OTjKoOr04_X101YnQqW=XR6c`_&-wv0jZaJ6H^~cKK8wN8`vn}^e zKZESBxuOU+5I zr1=HhVPgcJnEuHGN&uBD3dx=su~Q(5Dlisc-69VNX7Y_E--0`!okzMmcjL45eru@O z29LE2>oa$bqXhkEnbCmLBX#p`8Vm9|p!I_CQ9V>~fOe1!bSr95nE$*Ia5|0uKOxmo zFMKr1)KJ4n^*5yb1SY<3#|`1jfH7hkI;(jX!yV$Qx+&XB_u7?0b6 zBYA}5#{-#&isUij7eV(r(|*~P{WM3%5pnbbNtWyynGIailU|BPA`3j~$erJx zi6I?$bH`V3tn9#pyR6Ejn!6bcYR$E`kqi2+!YEKjz(r#13ZalMqx0 z=29E3I9*I0@a{rkL4~PWFoHpF+&G2{nk=*Xx@(gn&uu#2o5>u#&`-|^^6zIeh z_9@S&h_3YhURYj&T!h%{B>9T60Qfg+O$jmY^B4oe$ z$S71P9bCH1HY8#q^lv3H+~Ci>(nA4_v1mWXHWp>+e6&nYnLfjo{0QJ`752e}+X>ZN ze^$Y%jgZxA8PF8d7|c1*%6lm+Li;6wmx3Z3ic|5S`k^*60i~)*WO z0W<1iHKTDO_@a(H%<-o_Ozi2%ef+9X8eNQrep7d&En?w7qMC^Lup2TQ^c0I}-*NNA290rHz z!~@bjZP9eG2Hb4!P*SgK>?VX=Ms81fm*L=w@CrPntiW4{f&v@ba*EKO0l-$^Qwj?z zO3=k#(q&;cqEzW(iuQN)VT#cId)W+FC*M|<}JKt(>jJg+GT{V0a} zI$r6;#I6|BVk;bXV|YNTY7}1=b1AhhdWfl>V+pVp1nIx&MM1IforUj1)prT4{RoLq z#c+LaSHP4O^U$HspIWUL@J09!V*tL`6%I68Am%%#sq38WH15p5eNx1K@3wP8;(-E<3!oBV=CPL$QO~=k~#KrN5j?aeL6BQdk5>kBI z*)@dw5d^Ek9hbcSgK+oh&ctD4m_DOB@+ldtpG?2cLw`F|d|B@VHwa^1(V^22?uSml zX!M9eUqHBbgIFkI5a13w;_dXg94_5*dU^}sqbgVx?tj6f3ip>3XEFB9)9CmDo-*MM z$^L+%S&mBKULupI!hJfTV}RT!14-fDj8fCs0;669w=VMmWgDT-ke){>JNJV}9g@}K znK;>%`=vkbMlEA#hY(e!{sMqaraH^$s!XM%x=amPulP$c$=GG;7B&4V`jH~=Q@Ct0 zwLk*Z^q1k*Wu}2XKP7Kg4a4xGa*axG**I|n3X?Lmd0A$s(4FN}qrKGCUa3=X=`u;kp-F3Z zW5N&*nW_K^cK9}alz1FLES@LRXP~jEi_B%o(`E9?YR|1z!BVE~l>y~4bsmL9Xh#uv z=@`T>hRS7^scir)lc^26+GVOcz^EO`)X=U>6vRWOu8w2kuXyg`e=-iTG#sq?1UVwm z7*14#MSm4BnkVquj%(oPpTGkW`ymFk5~S-mI92I7pIok*wfHHMu8pV}?9#OG z;zw=b0Jv;T9D}TnC2-uJ3|R5e7u2{8su(?Nv=tU>xD4liiP5+T?sf! zzG90RpiB$tW3<-Mt_j$q)g7%qTnpUEc}p|^))iFsyoDNB>>b~yy{Yx7b1)M z-63X|c45M`2d`Ik1Ok;lspy@o=b|)*d$!sONSVC-UiH}I?I7v1%i9FiNAmVlWEao_ z^7ch%WOsWSvh#XwwSwyuVTeH9;;YKr+nvFkdhmvP{&?|64?fiK2xL&dp1gK?CT1Df zWcTxZ%sb9v-tp3~K%IBMwx+#nmJ=14pjOQvsSCwy%`N0dsk;xj2_OQJLOLQo+?e|% zQAEQ>2uIpM5}f2uQ$L!Y;ia|4nk5LszFy+5@L@O%anLQ?PqQUmD4q`*V7MbQzjF%{ zpL0m09}7QCBx(MLIG6&v8HUI>11=&QnI{?ctA0#xlk$!B2`4b9zle#%UVLeX0?Z;% z$BXxoi{WeXU_Ihzqi*M;4j7Cp0MMDpUX21GH_5o6$KZa947DcAEdqP<`i=|WNa)S; z9h>)Oxz+o?>gN12G-4%ovY6kGyNisze7s{4l;sC~d6cuBg62$8gW?jouk&rFqKeT5 znVZPps}x3%wIZV*_Ye*GaeXBh0*oVorx@H1!s!fj%DMe`-AZ3U6T~qagy_Y-e%#e@ z2|`ZvU>YdRoIw@8m3CSM!!^;viUJ$&f-0K>W&8?OO_AeVU2y-;$T{8ecM@>^_6XBVW9RpoT#Vn9^FYN5u&q=T*(%tL-<9l z2V!C8<2GzLQ3A#Jq5KclKpY*$A1O)9R7DU5$1HGRIR2_KrE^SX`BK(S0QMNnhU` z>Vqx|C%PQALxwmk(wG1-TA0Np>quHSl%SMmw3m}`u;?dISVR$aH;3&vo-LFMZgjw6 zxuc}toF1@kSEYLswKNXkQ+%-ejhZ;(3?UtT)$4&H!tNu1f;%m0(OIe*D$Ef-%6*7y zqotDz#jkc)Q>nXf9>qI5j$%yo9K{b9dch)#bqvc{tG+v&SSLXN__69AI55$4H23Xx z6dg)Pok2JZx&gG%*&4+V+^QdMm4YYLh0+u-%8i0?EEWq;{V9+Z)L>aRYp2AERik+= zP3L$VbD^VE`rM+?yakVZaM)_i9_nfKR-j&6Eia2(py`w`Q;|5^@B$MlJb_ID*>V=W zRb?!>T9|sH>CA?~y+y}yyeE50tQ^OqTrQzg&6;Dq#N~0kw{ALoSi>;S#lb55)Lx?9 zcVLX;Suo>^n1m1U$rxDv4G|HE>lv!@@H(Dw~n}5_r zhFSg=maRR40EJ$LKvx_hH@1VI*;V*p)xE8Ym_Ly>a6gU}FZAFkr4KdqGmuU-v2P-; z=aFL%C_r6hz?r=wZz4vV+awsgzYi6WllTYRJycwtgf)k2b%onx-iU9iD>_W(fjqme z7(N-6?@4t<`eZ(lTkD7ilX>6D&!3T|runpvh@Zl{@_u#1nkk_2u`%Mx6h46GhKN>E z`QSQZ>d5B!rIQm*J<5IkI0=dBybpka!*5iz&pU}7Q+dP6&LM~kQYjJlr}Ad$hPl`V zXy2o)9om(S`dV>055plMTytR2#sh?&yj>4J5y!AY_RB`-L$e_qaQk6FT6sa#hcPH_ zF$H7uHQYFleHA~ra#DrWqO43IrzLEdgf-FXRiFkx&{7F#3UMHh?ffPdyYw@o6FO#LNY+-<|t#E_Sc+ z#R;NLIzPpycN9<4`CF`$7?{DA`Q&^niOkt(!Sc!c#mKbO>HtzZF4%lt*Q=)*ti#Hy zrLsaVQVRffDKUW9i$*gReY7Wh#qb6EW5;$)S+1jryD--&%`t*-E2T#95T2R5t?vg| z=AaGi^_7XWsMF=46@x{KOJ&Ap@-UYUzhW$C<2=OYnOLO_@({-|LF>#z+{@&l{DQmi z$^v}DEfJZ8F_P&n#%A%Fe1yALl7)C3-Nm;BDcrMyjU@P$`aos&@)xpZHtwAiM~d<4u%s=g|K|fZ$!j1e}%i15}4? zXl!?v4c{gwIPiOIH*A-;xW0bKddHq`Xe;}v@IrZ&v8kU!U0*1Zj75k%R47MD<017$ zA&ucLQ{g-0e++*ghibD^j&aY8AMTXNVP8DZbg|^9#DB=|h8$1CYw_i%SU5b9etQs~@O8e@9n+Y? zcZrkWzZ_#Je8A%oC}O+B-tG=Ha<`n{ZHm^Jy7^dwrI%JXL-@bKv>NHRCOTBPtYn1@9j30iQ+B|Ua@QW&%XqQTC>yayKIAZ#cEK|BJ#uV^>I>Kiif=!o zmmgPt0fq5jP#4`RCwExTg)W}=rtb{O@)iaiYK(gEJyigKe4w|gx>qI`xs8VU_q}or zwpA>>Pxg#k{wFM1?+12HEBs|#`CBkam-NT}x*6(``;dJH?07tW9|kirsi&HDzs!`w zZpSwW@lx~A`{i2a{#`h+`W42x58ymqum16XTwvVx4t|OD0eOkzVKw$aJfiyjxKNuO z1a7b1dk|fptL(1_WuznFwK!Y|QOT9`(0fB?|3^i1)2oKx$8ecd`Xki9hvbAgmqH6& z+mI93mjMCwYbVjKt%CM3fe#kpDKC!^j-xrx_#JOe7QR_XgCXw_=dMn;_AplZppv#C zy@~A#HzGS#wMIr?vKKdE+)3M{;mL1dltjY9Lz`>HzT|<;ew9-{s7xDjC~cc_1Wde) znxPA48*XHcQM1TDJV6Y97Y|TysdR=0`oCg@&q@vLvS`v@&HJpT7w))_^PUNpqSpOp zs7()}nO9-&;lna!TE!{7z3N?id(}m6AQQb~Vpd~R?NM|V*j_b$XGSR+=tS)J+!>XN zrw;yZ*awPQ=%ZN+(Z0GqB0G=#0tt|uzTT9!bLhs2*jtR3oUlRa7^$hg8oR@I>j`&D{BcyH>EKc;UzfYMvru{u?t^}iH{YQ%+AiZ}}M6g- z4LmRJDMj;%#N8b0$uV7d3s)E-NDvObHGzPN&_JfI0;@mXA2njrdNe%l|1m`6{XS zGyp|DxrgnqDOmf$=20??0VvrxoheN;ww+zCy5k^*UNpcwYa#W~b{kIMMCEu`KVFPi-WH~7Lzz1x#& z?gnH%s6XcLXCIZ3L#J8>$bqqly@WmDJ2 zb5LDgB1d;T7i-tacNE(h<&Sl!XG-K^Iq0AYe_Rfh&I&c|aoNka+|v9QDwiVm5{=_v zcM9VEmm8WK3oZPpG3tp56v*jcpG{Y3)7!u_ZiP#~MI$wJGD!U;;xPCXh<^ha!Iq%A z=+eLjBWwE*^dE;1`+j`5Nono-N!tr;7TU({(&D>G+((NaM%>aPqWzU|SNrKM{V1|nCsblDg z3u?{*>Lz+197ba2?zZaQC*^`fsPPx7_WLm-8+bsK z?w40PK2~v0$vKW&RnAkg$gx-972>$AA7MYbHFKz=*Bm#z;D5trU@9?RjeJ@rV*`HH z)0kweB1v}?9+E%RT~EuM##??v^?XJSN!*K1RP!`rz$SL(9bDGhm7n}cYU4BVR>$wE z@fpkp+Lf!SQu(JNS-tZt##_}Y{yB_qd%M(>=j7Hdy?p55MBM`XR(9?){%9b3YEz$7iqU-nh8Hu?M-{%0&-9|`!XK+PKac6lTk7lQv#kEv+s+hXA{)KAqD{@8W)t?)f zzV-b5peHxMzX{)zsY`srnen-bIUw)C)a982a-i!cK?4uEUC`L$=Kbo219-)#{8QES zRe5)`egN{TUduNdfg`&6zv>(90VUNbYp0wcaaw2txvS= z9ni-Gb3cgs;B|TJYtBMYe!4pd_H=^`xpkD zhS+}ty$-p#=X?4m9QB$F)N$jy4EpG|toTC2Y3Zi3daXi+$*&$$$1CKh(5&-@h?q6{ zvh#*&e^B;_oKj+KZ|&4-XY3&`V=Nr=9 ztp|3l)B51;?_&&UuMc88iS@z42sF9eH{_J)gL<%dNRz{w96|OUydfVq^1m0#cT6UD z=D}IMQoqf@D-}x3$(lnGrXz6Wo&wW%}5 z9dKbIA|(s821Qt|I9!Pd{M?5y-Ds?;YlmAcy>J{g;URUtQVz$rQ--`L`-k6^-P{fI zRIA>UgYmBJgKy%!)b0X6dWpBJIPdJ?3 z#Wc_PvJgXwcTPD%%U-F%G}G~#>TyE$mJc6QX(#Z$;{A7jfWGU`yVRW@V5)=lmJj4> z@|WFe-$}f`x^uTWcM=ag=KXL%y??KaQ^QUn>FtNq6{lpk_D}!AngZdAXmb(6)aN%< zbPD^NtJTp{GGF%oUQPK>4vG^CtdolOGwoFw>~F?rEyC-*HPr48evWGDp@=+hj%*gsk$mcZ6�#$my3_86CcSDj)N+!S|&`(nT5`)=aO%5o;IJq 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

=>2s6O|i@Yo@rV{qqWxN|buvV=u& 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 VzNS7@uNVXcbb8ZPnRF)E{tuRt)>8lg diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll index 8d84a456d2b78c35e89ba2542854e4508b56fcc8..61e1c53570b25b71ec5acda6081e7f41dd18f026 100644 GIT binary patch delta 136346 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 delta 140230 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 diff --git a/pre_compiled_libs/device_monitoring_x64/pid_controller.dll b/pre_compiled_libs/device_monitoring_x64/pid_controller.dll index 8ebc6955dcf9995bdd2737b49b8296f005eafffb..5af5144c05caada6e91975e5678a803fd68cb295 100644 GIT binary patch delta 3915 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 I6a7K|1sCPU_W%F@ delta 3902 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 diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index 121d3acd3..dd05df45e 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -329,7 +329,7 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default_absolute(BusID, ref min, ref max, ref def); + var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default_delta(BusID, ref min, ref max, ref def); if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks_min_max_default_absolute failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index da1afd9c6..33c2561a7 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -36,7 +36,7 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_fan_speed_percentage(int bus_number, int set_fan_speed_percentage); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_reset_fan_speed_percentage(int bus_number); + public static extern int nhm_nvidia_device_reset_fan(int bus_number); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_tdp_min_max_default(int bus_number, ref uint min, ref uint max, ref uint defaultV); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] From 1fd5ffcc97e03bff95224102a0306899f688c50d Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Fri, 13 Jan 2023 12:55:43 +0100 Subject: [PATCH 058/224] New libs --- .../device_monitoring_amd.dll | Bin 447488 -> 447488 bytes .../device_monitoring_nvidia.dll | Bin 470016 -> 470016 bytes .../device_monitoring_x64/pid_controller.dll | Bin 11776 -> 11776 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll index 9a08b3ad2dc05f6001085a0e5efe8f65aea77cbd..8a4f68be111d2e5cc1c0e6df3a0e6b58a5fe5774 100644 GIT binary patch delta 149 zcmZozA>FV-dV>HX(|osPA;xwgMi6EKVrC#_0bWmIALn|raNXZ+i!0$W3%BF2$inbbE8Jd UX~xBsB8m5f|7<_w$YwGL061VHIRF3v delta 149 zcmZozA>FV-dV>HXQ=dz-5M#R#BM37AF*6Xe05R)!Ax5@KCRTke2a_3qfC-2*fOtnZ z8^aDqHjoelOpXW076D>~2sQ=5du9_S+lG*lf537UtRKauuHS TXmRs1PCVadz5R?Mo5>^q3l$-l diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll index 61e1c53570b25b71ec5acda6081e7f41dd18f026..8ff6798255de072c21557d2dcd719596baf467b8 100644 GIT binary patch delta 148 zcmZp;A=7X}W`hAE(;~NKBgS?kMi6EKVrC#_0b9m>ds~Eds**Yz!ieFuCdb3fQDLVQToMZ(PbOzpapM4ZpyZ`*}CTwSC6>6((E& delta 148 zcmZp;A=7X}W`hAE(?pkMBgS?kMi6EKVrC#_0b9m>ds~Eds**Yz!ieFuCdb3fQDLVQToMZ(PbOzpapM4ZpxmCox0CjBtlV SceDFsJULfw-_yY6vKj#T>m=&{ diff --git a/pre_compiled_libs/device_monitoring_x64/pid_controller.dll b/pre_compiled_libs/device_monitoring_x64/pid_controller.dll index 5af5144c05caada6e91975e5678a803fd68cb295..7e10130099deb94a96dd233a7c424858bcd2d0a1 100644 GIT binary patch delta 107 zcmZpOX^7b%z{oV$ZL<*LCrPWhZU>VYfPe{z6M^`SF%V0GL>L%gay&q`2oO7%0I>{6 o1|&DxPFf0R%;YHPHi7jPhQHUiM>ylm`Kr922 o0m)6ala>M+GdW7SO`zpeZA5lSm& Date: Fri, 13 Jan 2023 13:05:59 +0100 Subject: [PATCH 059/224] preparing for deltas --- .../device_monitoring_amd.dll | Bin 453120 -> 445952 bytes .../device_monitoring_nvidia.dll | Bin 474624 -> 475648 bytes .../Core_clock/ICoreClockDelta.cs | 13 +++ .../Core_clock/ICoreClockRangeDelta.cs | 13 +++ src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 10 ++- .../DeviceMonitorNVIDIA.cs | 22 ++++- .../Memory_clock/IMemoryClockRangeDelta.cs | 13 +++ src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 5 +- src/NHMCore/Mining/ComputeDevice.cs | 20 ++--- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 80 +++++++----------- src/NHMCore/Nhmws/V4/MessagesV4.cs | 4 - 11 files changed, 110 insertions(+), 70 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockDelta.cs create mode 100644 src/NHM.DeviceMonitoring/Core_clock/ICoreClockRangeDelta.cs create mode 100644 src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll index c8d2b1239ee626d1686e8d091304840590366805..0087c747874793739b58ea77ff98981307fe67ec 100644 GIT binary patch delta 125514 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

FN{7 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 delta 57916 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 throw new NotImplementedException(); + + public (bool ok, int min, int max, int def) MemoryClockRangeDelta => throw new NotImplementedException(); } } diff --git a/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs new file mode 100644 index 000000000..84c70b4be --- /dev/null +++ b/src/NHM.DeviceMonitoring/Memory_clock/IMemoryClockRangeDelta.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHM.DeviceMonitoring.Memory_clock +{ + public interface IMemoryClockRangeDelta + { + (bool ok, int min, int max, int def) MemoryClockRangeDelta { get; } + } +} diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index 387e0a1b5..11efc8bbc 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -44,13 +44,14 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_core_clocks(int bus_number, ref int core_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] + public static extern int nhm_nvidia_device_get_core_clocks_delta(int bus_number, ref int core_clocks_delta); + [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_core_clocks(int bus_number, int core_clocks, bool is_absolute); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_reset_core_clocks(int bus_number, bool is_absolute); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_clocks(int bus_number, ref int memory_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_get_memory_clocks_delta(int bus_number, ref int memory_clocks); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_memory_clocks(int bus_number, int memory_clocks, bool is_absolute); @@ -59,7 +60,7 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_info(int bus_number, ref ulong free, ref ulong total, ref ulong used); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_restore_fan_speed(int bus_number); + public static extern int nhm_nvidia_device_reset_fan(int bus_number); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_set_memory_timings(int bus_number, string memory_timings); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index d44cf04a3..b7b08076e 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -41,16 +41,6 @@ public class ComputeDevice : NotifyChangedBase public bool IsTesting => AlgorithmSettings.Any(a => a.IsTesting); public bool IsMiningBenchingTesting => State == DeviceState.Mining || State == DeviceState.Testing || State == DeviceState.Benchmarking; #endif - public DeviceType Vendor - { - get - { - if (DeviceType != DeviceType.CPU) return DeviceType; - if (FullName.ToLower().Contains("amd")) return DeviceType.AMD; - if (FullName.ToLower().Contains("intel")) return DeviceType.INTEL; - return DeviceType.CPU;//unknown - } - } private PidController _pidController = new(); private int _memoryControlCounter = 0; @@ -316,6 +306,14 @@ public int CoreClock return -1; } } + public int CoreClockDelta + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreClockDelta get) return get.CoreClockDelta; + return -1; + } + } public int MemoryClock { get @@ -814,6 +812,7 @@ public async Task AfterStartMining() if (IsTesting) break; //var resetFan = await target.ResetFanForDevice(); target.SwitchFanToInactive(); + ResetFanSpeed(); State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyFanTest: @@ -828,6 +827,7 @@ public async Task AfterStartMining() case AlgorithmContainer.ActionQueue.ResetFanTest: //var resetFanTest = await target.ResetFanForDevice(); target.SwitchFanTestToInactive(); + ResetFanSpeed(); State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyELP: diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 92499b36b..30094e936 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -273,7 +273,7 @@ Device mapComputeDevice(ComputeDevice d) RigID = rigID, Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, OptionalMutableProperties = GetRigOptionalMutableValues(true, true).properties, - OptionalDynamicProperties = GetRigOptionalDynamicValuesLogin(), + OptionalDynamicProperties = GetRigOptionalDynamicValues().properties, Actions = CreateDefaultRigActions(), Devices = DevicesProperties, MinerState = GetMinerStateValues(worker, devices, true), @@ -390,28 +390,31 @@ List getOptionalMutablePropertiesCached() } return (props, values_omv); } - private static List> GetRigOptionalDynamicValuesLogin() + private static (List> properties, JArray values) GetRigOptionalDynamicValues() { - return new List> + var dynamic = new List<(List prop, string val)> + { + (new List { - new List - { - "Uptime", - "s" - }, - new List - { - "IP address" - }, - new List - { - "Profiles bundle id" - }, - new List - { - "Profiles bundle name" - } - }; + "Uptime", + "s" + }, Helpers.GetElapsedSecondsSinceStart().ToString()), + (new List + { + "IP address" + }, Helpers.GetLocalIP().ToString()), + (new List + { + "Profiles bundle id" + }, BundleManager.GetBundleInfo().BundleID), + (new List + { + "Profiles bundle name" + }, BundleManager.GetBundleInfo().BundleName) + }; + var props = dynamic.Select(d => d.prop).ToList(); + var vals = dynamic.Select(d => d.val); + return (props, new JArray(vals)); } private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable devices, bool isLogin) @@ -421,17 +424,6 @@ private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable delProp.Remove(); return json; } - private static List GetRigOptionalDynamicValues() - { - var list = new List - { - Helpers.GetElapsedSecondsSinceStart().ToString(), - Helpers.GetLocalIP().ToString(), - BundleManager.GetBundleInfo().BundleID, - BundleManager.GetBundleInfo().BundleName, - }; - return list; - } internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices, bool isStateChange = false) { @@ -490,7 +482,7 @@ JArray mmv(ComputeDevice d) return new MinerState { MutableDynamicValues = new JArray(rigStateToInt(rig)), - OptionalDynamicValues = new JArray(GetRigOptionalDynamicValues()), + OptionalDynamicValues = GetRigOptionalDynamicValues().values, MandatoryMutableValues = new JArray(rigStateToInt(rig), workerName), OptionalMutableValues = GetRigOptionalMutableValues(isStateChange, false).values, Devices = devices.Select(toDeviceState).ToList(), @@ -613,23 +605,11 @@ private static string GetLimitsForDevice(ComputeDevice d) limit.limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } - var deviceType = d.DeviceType switch - { - DeviceType.CPU => 1, - DeviceType.NVIDIA => 2, - DeviceType.AMD => 2, - DeviceType.INTEL => 2, - _ => 0 - }; - var deviceVendor = d.Vendor switch - { - DeviceType.INTEL => 1, - DeviceType.AMD => 2, - DeviceType.NVIDIA => 3, - _ => 0, - }; - limit.Vendor = deviceVendor; - limit.Type = deviceType; + //if(d.DeviceMonitor is Imemoryc && d.DeviceMonitor is IMemoryClockRange mcLimD) + //{ + // //nvidia use only DELTAS + // //here CONTINUE + //} var json = JsonConvert.SerializeObject(limit); return json; } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 96a5e6218..ce093ecbf 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -636,10 +636,6 @@ internal class ComplexLimit { [JsonProperty("limits")] public List limits = new List(); - [JsonProperty("type")] - public int Type { get; set; } - [JsonProperty("vendor")] - public int Vendor { get; set; } } } From 6ede9dd521ef3fe669747527edec18695b7c28b4 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 16 Jan 2023 12:48:41 +0100 Subject: [PATCH 060/224] preparing for test --- .../device_monitoring_amd.dll | Bin 447488 -> 454144 bytes .../device_monitoring_nvidia.dll | Bin 470016 -> 473600 bytes .../DeviceMonitorNVIDIA.cs | 16 ++++++- src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 2 +- src/NHMCore/Mining/AlgorithmContainer.cs | 6 ++- src/NHMCore/Mining/ComputeDevice.cs | 18 ++++++++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 43 ++++++++++++------ src/NHMCore/Nhmws/V4/MessagesV4.cs | 12 ++--- 8 files changed, 71 insertions(+), 26 deletions(-) diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_amd.dll index 8a4f68be111d2e5cc1c0e6df3a0e6b58a5fe5774..50fbe5e4e4cd50521c265beffd7c88cfe451605c 100644 GIT binary patch delta 134829 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

!5(0?9ZG?-Gz^8$9WVH6w(VgT}e6{|69@ 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

FOcrW96#=95?kI)Vt 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 O2m{qV;CZVwiBP5yo( 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 ResetNiceHashStatsCredentials(); static void ResetNiceHashStatsCredentials() { if (CredentialsSettings.Instance.IsCredentialValid) diff --git a/src/NHMCore/Mining/Plugins/MinerPluginsManager.cs b/src/NHMCore/Mining/Plugins/MinerPluginsManager.cs index 243d7b95b..05e08866a 100644 --- a/src/NHMCore/Mining/Plugins/MinerPluginsManager.cs +++ b/src/NHMCore/Mining/Plugins/MinerPluginsManager.cs @@ -592,6 +592,7 @@ public static async Task RemovePlugin(string pluginUUID, bool crossReferenceInst finally { PluginInstaller.RemovedPluginStatus(pluginUUID, true); + ApplicationStateManager.ReSendLoginMessage(); await Task.CompletedTask; } } @@ -857,6 +858,7 @@ public static async Task DownloadAndInstall(string pluginUUID, IProgress getOptionalMutablePropertiesCached(ComputeDevice d - private static LoginMessage _loginMessage = null; public static List> DeviceOptionalDynamicToList(List<(string name, string? unit)> properties) { List> result = new List>(); @@ -248,7 +247,7 @@ public static List> DeviceOptionalDynamicToList(List<(string name, public static LoginMessage CreateLoginMessage(string btc, string worker, string rigID, IOrderedEnumerable devices) { var sorted = SortedDevices(devices); - if (_loginMessage != null) return _loginMessage; + //if (_loginMessage != null) return _loginMessage; Device mapComputeDevice(ComputeDevice d) { return new Device @@ -266,7 +265,7 @@ Device mapComputeDevice(ComputeDevice d) }; } var DevicesProperties = devices.Select(mapComputeDevice).ToList(); //needs to execute first - _loginMessage = new LoginMessage + return new LoginMessage { Btc = btc, Worker = worker, @@ -278,7 +277,6 @@ Device mapComputeDevice(ComputeDevice d) Devices = DevicesProperties, MinerState = GetMinerStateValues(worker, devices, true), }; - return _loginMessage; } private static (List properties, JArray values) GetRigOptionalMutableValues(bool isStateChange, bool isLogin) { From 64743b106baba1f5db4240cacfe21f4702258d00 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 18 Jan 2023 13:48:07 +0100 Subject: [PATCH 064/224] added rebenchmark option for rig --- .../ApplicationStateManager.Mining.cs | 18 ++++++++++++++++++ src/NHMCore/Mining/ComputeDevice.cs | 5 +++++ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 5 +++++ 3 files changed, 28 insertions(+) diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs index 453b2d90c..4116e1faf 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs @@ -2,6 +2,7 @@ using NHM.Common.Configs; using NHM.Common.Enums; using NHMCore.Mining; +using NHMCore.Nhmws; using System; using System.Collections.Generic; using System.IO; @@ -154,6 +155,23 @@ public static void StartBenchmark() .ToArray(); _ = Task.WhenAll(startBenchmarkingDevices); } + public static Task<(ErrorCode err, string msg)> StartReBenchmark() + { + //check if any exist + var startBenchmarkingDevices = AvailableDevices.Devices + .Where(device => device.State == DeviceState.Stopped)? + .Where(device => device.AnyAlgorithmEnabled()); + if(startBenchmarkingDevices == null || startBenchmarkingDevices.Count() == 0) + { + return Task.FromResult((ErrorCode.ErrNoAlgoDataFound, "No targets found. Stop mining first.")); + } + foreach (var device in startBenchmarkingDevices) device.PrepareForRebenchmark(); + var completeBenchmarkDevices = startBenchmarkingDevices + .Select(StartDeviceTask) + .ToArray(); + _ = Task.WhenAll(completeBenchmarkDevices); + return Task.FromResult((ErrorCode.NoError, "Success")); + } public static Task StopBenchmark() { diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 284b6ed7f..fba0db9a8 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -695,6 +695,11 @@ public bool AllEnabledAlgorithmsZeroPaying() } public bool AnyEnabledAlgorithmsNeedBenchmarking() => AlgorithmsForBenchmark().Any(); + public void PrepareForRebenchmark() + { + var algosToRebenchmark = AlgorithmSettings.Where(a => a.Enabled); + foreach(var algo in algosToRebenchmark) algo.IsReBenchmark = true; + } public IEnumerable AlgorithmsForBenchmark() { diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 0b4568fcc..a3c628a3a 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -715,15 +715,20 @@ async Task systemDump() case SupportedAction.ActionStopMining: NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; + case SupportedAction.ActionRebenchmark: + (err, result) = ApplicationStateManager.StartReBenchmark().Result; + break; case SupportedAction.ActionProfilesBundleSet: var bundle = JsonConvert.DeserializeObject(parameters); _ = ExecuteProfilesBundleReset(false); _ = ExecuteProfilesBundleSet(bundle); MiningState.Instance.CalculateDevicesStateChange(); + (err, result) = (ErrorCode.NoError, "OK"); break; case SupportedAction.ActionProfilesBundleReset: ExecuteProfilesBundleReset(); MiningState.Instance.CalculateDevicesStateChange(); + (err, result) = (ErrorCode.NoError, "OK"); break; case SupportedAction.ActionDeviceEnable: NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); From bad0ecd0cc0528a743f3e51fc5222111ae1c4075 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 23 Jan 2023 10:42:05 +0100 Subject: [PATCH 065/224] Scheduler working --- .../ApplicationStateManager.Init.cs | 5 +- src/NHMCore/Configs/MiningSettings.cs | 3 + src/NHMCore/Nhmws/V4/MessageParserV4.cs | 65 +++++--- src/NHMCore/Nhmws/V4/MessagesV4.cs | 12 ++ src/NHMCore/Schedules/SchedulesManager.cs | 153 +++++++++++++++++- 5 files changed, 208 insertions(+), 30 deletions(-) diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs index e9e544d94..b5768bffc 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs @@ -177,7 +177,7 @@ string getDeviceNameCount(DeviceType deviceType, int index) => ///////////////////////////////////////////// /////// from here on we have our devices and Miners initialized MiningState.Instance.CalculateDevicesStateChange(); - + SchedulesManager.Instance.Init(); // STEP // connect to nhmws loader.PrimaryProgress?.Report((Tr("Connecting to nhmws..."), nextProgPerc())); @@ -260,8 +260,7 @@ string getDeviceNameCount(DeviceType deviceType, int index) => { AvailableNotifications.CreateNotAdminForRigManagement(); } - - SchedulesManager.Instance.Init(); + //SchedulesManager.Instance.Init(); } catch (Exception e) { diff --git a/src/NHMCore/Configs/MiningSettings.cs b/src/NHMCore/Configs/MiningSettings.cs index 127c6f082..a3cf62d7b 100644 --- a/src/NHMCore/Configs/MiningSettings.cs +++ b/src/NHMCore/Configs/MiningSettings.cs @@ -1,6 +1,8 @@ using NHM.Common; using NHMCore.Mining; +using NHMCore.Nhmws.V4; using System.Collections.Generic; +using System.Threading.Tasks; namespace NHMCore.Configs { @@ -101,6 +103,7 @@ public bool UseScheduler { _useScheduler = value; OnPropertyChanged(nameof(UseScheduler)); + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index e25bbe944..74470575c 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -8,13 +8,16 @@ using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.TDP; using NHMCore.Configs; +using NHMCore.Configs.Data; using NHMCore.Configs.Managers; using NHMCore.Mining; using NHMCore.Mining.MiningStats; +using NHMCore.Schedules; using NHMCore.Utils; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace NHMCore.Nhmws.V4 { @@ -352,17 +355,37 @@ List getOptionalMutableProperties() } return $"{successCount}/{newStates.Miners.Count} operations succeded"; } - }, - //new OptionalMutablePropertyString - //{ - // PropertyID = OptionalMutableProperty.NextPropertyId(), - // DisplayGroup = 0, - // DisplayName = "Scheduler settings", - // DefaultValue = "", - // Range = (4096, String.Empty) - //// todo get and set - //} + new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Scheduler settings", + DefaultValue = "", + Range = (4096, String.Empty), + GetValue = () => + { + string ret = null; + if (isStateChange) + { + ret = SchedulesManager.Instance.ScheduleToJSON(); + } + return ret; + }, + ExecuteTask = async (object p) => + { + if(p is not string prop) return null; + var (schedulerEnabled, returnedSchedules) = SchedulesManager.Instance.ScheduleFromJSON(prop); + SchedulesManager.Instance.ClearScheduleList(); + MiningSettings.Instance.UseScheduler = schedulerEnabled; + foreach(var returnedSchedule in returnedSchedules) + { + SchedulesManager.Instance.AddScheduleToList(returnedSchedule); + } + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + return "Schedules added"; + } + } }; if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); return optionalProperties @@ -411,7 +434,7 @@ private static (List> properties, JArray values) GetRigOptionalDyna }, BundleManager.GetBundleInfo().BundleName) }; var props = dynamic.Select(d => d.prop).ToList(); - var vals = dynamic.Select(d => d.val); + var vals = dynamic.Select(d => d.val); return (props, new JArray(vals)); } @@ -521,23 +544,17 @@ private static List GetStaticPropertiesOptionalValues(ComputeDevice d) { new JArray("bus_id", $"{gpu.PCIeBusID}"), new JArray("vram", $"{gpu.GpuRam}"), - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDeviceStatic(d))), + new JArray("miners", GetMinersForDeviceStatic(d)), new JArray("limits", GetLimitsForDevice(d)), }, _ => new List { - new JArray("miners", FormatForOptionalValues("miners", GetMinersForDeviceStatic(d))), + new JArray("miners", GetMinersForDeviceStatic(d)), new JArray("limits", GetLimitsForDevice(d)), }, }; } - - private static string FormatForOptionalValues(string name, string content) - { - return "{\"" + name + "\":" + content + "}"; - } - - private static string GetMinersForDeviceDynamic(ComputeDevice d)//todo if include enabled return array of strings else return array of structs + private static string GetMinersForDeviceDynamic(ComputeDevice d) { var minersObject = new MinerAlgoState(); var containers = d.AlgorithmSettings; @@ -564,14 +581,14 @@ private static string FormatForOptionalValues(string name, string content) } private static string GetMinersForDeviceStatic(ComputeDevice d) { - List miners = new List(); + MinersStatic miners = new MinersStatic(); var uniquePlugins = d.AlgorithmSettings?.Select(item => item.PluginName)?.Distinct()?.Where(item => !string.IsNullOrEmpty(item)); if (uniquePlugins == null) return String.Empty; foreach (var plugin in uniquePlugins) { var uniqueAlgos = d.AlgorithmSettings?.Where(item => item.PluginName == plugin)?.Select(item => item.AlgorithmName)?.Distinct(); if (uniqueAlgos == null) uniqueAlgos = new List(); - miners.Add(new MinerStatic() { Id = plugin, AlgoList = uniqueAlgos.ToList() }); + miners.Miners.Add(new MinerStatic() { Id = plugin, AlgoList = uniqueAlgos.ToList() }); } var json = JsonConvert.SerializeObject(miners); return json; @@ -608,7 +625,7 @@ private static string GetLimitsForDevice(ComputeDevice d) } if (d.DeviceMonitor is IMemoryClockSet) { - if(d.DeviceType == DeviceType.NVIDIA && d.DeviceMonitor is IMemoryClockRangeDelta mcLimDelta) + if (d.DeviceType == DeviceType.NVIDIA && d.DeviceMonitor is IMemoryClockRangeDelta mcLimDelta) { var lims = mcLimDelta.MemoryClockRangeDelta; if (lims.ok) @@ -616,7 +633,7 @@ private static string GetLimitsForDevice(ComputeDevice d) limit.limits.Add(new Limit { Name = "Memory clock delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } - if(d.DeviceType == DeviceType.AMD && d.DeviceMonitor is IMemoryClockRange mcLim) + if (d.DeviceType == DeviceType.AMD && d.DeviceMonitor is IMemoryClockRange mcLim) { var lims = mcLim.MemoryClockRange; if (lims.ok) diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index fb76d9aa0..f4558bde4 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -542,6 +542,11 @@ public class MinerDynamic [JsonProperty("algorithms")] public List Algos { get; set; } = new List(); } + internal class MinersStatic + { + [JsonProperty("miners")] + public List Miners { get; set; } = new List(); + } internal class MinerStatic { [JsonProperty("id")] @@ -634,4 +639,11 @@ internal class ComplexLimit public List limits = new List(); } + public class SchedulesWS4 + { + [JsonProperty("enabled")] + public bool enabled { get; set; } + [JsonProperty("slots")] + public List> slots = new(); + } } diff --git a/src/NHMCore/Schedules/SchedulesManager.cs b/src/NHMCore/Schedules/SchedulesManager.cs index 014d17fb2..4331c949f 100644 --- a/src/NHMCore/Schedules/SchedulesManager.cs +++ b/src/NHMCore/Schedules/SchedulesManager.cs @@ -1,6 +1,8 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using NHM.Common; using NHMCore.Configs; +using NHMCore.Nhmws.V4; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -30,11 +32,19 @@ public ObservableCollection Schedules return _schedules; } } + set + { + lock (_lock) + { + _schedules = value; + } + } } public void Init() { - if (File.Exists(Paths.ConfigsPath("Schedule.json"))){ + if (File.Exists(Paths.ConfigsPath("Schedule.json"))) + { var schedules = JsonConvert.DeserializeObject>(File.ReadAllText(Paths.ConfigsPath("Schedule.json"))); if (schedules != null && schedules.Any(s => s.Days.Any(d => d.Value == true))) { @@ -51,16 +61,153 @@ public void Init() public void AddScheduleToList(Schedule schedule) { - _schedules.Add(schedule); + Schedules.Add(schedule); OnPropertyChanged(nameof(Schedules)); ConfigManager.ScheduleConfigFileCommit(); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); } public void DeleteScheduleFromList(Schedule schedule) { - _schedules.Remove(schedule); + Schedules.Remove(schedule); + OnPropertyChanged(nameof(Schedules)); + ConfigManager.ScheduleConfigFileCommit(); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + } + + public void ClearScheduleList() + { + Schedules.Clear(); OnPropertyChanged(nameof(Schedules)); ConfigManager.ScheduleConfigFileCommit(); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + } + + public string ScheduleToJSON() + { + var schedules = new SchedulesWS4(); + schedules.enabled = MiningSettings.Instance.UseScheduler; + foreach (var slot in Schedules) + { + var from = TimeSpan.Parse(slot.From); + var to = TimeSpan.Parse(slot.To); + var days = new List(); + int counter = 1; + foreach (var (_, enabled) in slot.DaysFrom) + { + if (enabled) days.Add(counter % 7); + counter++; + } + //if (days.Count == 7) days.Clear();//if empty it assumes all days are selected + days.Sort(); + var newSlot = new List { + from.Hours, + from.Minutes, + to.Hours, + to.Minutes, + days, + }; + schedules.slots.Add(newSlot); + } + var ret = JsonConvert.SerializeObject(schedules); + return ret; + } + + public (bool enabled, List schedules) ScheduleFromJSON(string schedule) + { + List ret = new List(); + var schedules = JsonConvert.DeserializeObject(schedule); + if (schedules == null || schedules.slots == null || schedules.slots.Count <= 0) return (false, null); + foreach (var slot in schedules.slots) + { + if (slot.Count != 5) continue; + if (slot[0] is long fromH && + slot[1] is long fromM && + slot[2] is long toH && + slot[3] is long toM && + slot[4] is JArray days) + { + var daysConverted = days.ToObject>(); + if (daysConverted.Count == 0) daysConverted.AddRange(new List { 0, 1, 2, 3, 4, 5, 6 }); + var formattedFromH = fromH <= 9 ? $"0{fromH}" : fromH.ToString(); + var formattedFromM = fromM <= 9 ? $"0{fromM}" : fromM.ToString(); + var formattedToH = toH <= 9 ? $"0{toH}" : toH.ToString(); + var formattedToM = toM <= 9 ? $"0{toM}" : toM.ToString(); + ret.Add(ScheduleToLocalFormat($"{formattedFromH}:{formattedFromM}", $"{formattedToH}:{formattedToM}", daysConverted)); + } + } + return (schedules.enabled, ret); + } + + public Schedule ScheduleToLocalFormat(string schedulerFrom, string schedulerTo, List days) + { + bool cboxMon = days.Contains(1); + bool cboxTue = days.Contains(2); + bool cboxWed = days.Contains(3); + bool cboxThu = days.Contains(4); + bool cboxFri = days.Contains(5); + bool cboxSat = days.Contains(6); + bool cboxSun = days.Contains(0); + + var isNextDay = Convert.ToDateTime(schedulerTo) < Convert.ToDateTime(schedulerFrom); + if (isNextDay) + { + var schedule = new Schedule() + { + From = schedulerFrom, + To = schedulerTo, + DaysFrom = new Dictionary() + { + ["Monday"] = cboxMon, + ["Tuesday"] = cboxTue, + ["Wednesday"] = cboxWed, + ["Thursday"] = cboxThu, + ["Friday"] = cboxFri, + ["Saturday"] = cboxSat, + ["Sunday"] = cboxSun, + }, + DaysTo = new Dictionary() + { + ["Monday"] = cboxSun, + ["Tuesday"] = cboxMon, + ["Wednesday"] = cboxTue, + ["Thursday"] = cboxWed, + ["Friday"] = cboxThu, + ["Saturday"] = cboxFri, + ["Sunday"] = cboxSat, + } + }; + return schedule; + } + else + { + var schedule = new Schedule() + { + From = schedulerFrom, + To = schedulerTo, + DaysFrom = new Dictionary() + { + ["Monday"] = cboxMon, + ["Tuesday"] = cboxTue, + ["Wednesday"] = cboxWed, + ["Thursday"] = cboxThu, + ["Friday"] = cboxFri, + ["Saturday"] = cboxSat, + ["Sunday"] = cboxSun, + }, + DaysTo = new Dictionary() + { + ["Monday"] = cboxMon, + ["Tuesday"] = cboxTue, + ["Wednesday"] = cboxWed, + ["Thursday"] = cboxThu, + ["Friday"] = cboxFri, + ["Saturday"] = cboxSat, + ["Sunday"] = cboxSun, + } + }; + return schedule; + } } } } From 52aa56bd441fbec6d110ed0dddd2903f7207d743 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 23 Jan 2023 15:01:11 +0100 Subject: [PATCH 066/224] fixed restart miners temporarily --- src/NHMCore/Configs/Managers/ELPManager.cs | 3 ++- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index d6ba054d7..67bc16a7b 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -418,11 +418,12 @@ public Task ResetELPBundle(bool triggerSwitch = true) if (triggerSwitch) MiningManager.TriggerSwitchCheck(); return Task.FromResult((ErrorCode.NoError, "Success")); } - public void RestartMiningInstance() //not specific enough, just elp? + public void RestartMiningInstanceIfNeeded() //not specific enough, just elp? { var containers = AvailableDevices.Devices.SelectMany(d => d.AlgorithmSettings); foreach (var c in containers) { + //if (c.ActiveELPProfile == null && c.ActiveELPTestProfile == null) continue; //WILL NOT WORK c.TriggerELPReset(); } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index a3c628a3a..a5f2874cc 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -803,14 +803,14 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); StopELPTestForDevice(deviceUUID, false); StopFanTestForDevice(deviceUUID, false); - ELPManager.Instance.RestartMiningInstance(); + ELPManager.Instance.RestartMiningInstanceIfNeeded(); var res = OCManager.Instance.ExecuteTest(deviceUUID, ocBundle); return Task.FromResult(res.Result); } private static Task<(ErrorCode err, string msg)> StopOCTestForDevice(string deviceUUID, bool triggerSwitch = true) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); - ELPManager.Instance.RestartMiningInstance(); + ELPManager.Instance.RestartMiningInstanceIfNeeded(); var res = OCManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } @@ -818,14 +818,14 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) { StopFanTestForDevice(deviceUUID, false); StopOCTestForDevice(deviceUUID, false); - ELPManager.Instance.RestartMiningInstance(); + ELPManager.Instance.RestartMiningInstanceIfNeeded(); var res = ELPManager.Instance.ExecuteTest(deviceUUID, elpBundle); return Task.FromResult(res.Result); } private static Task<(ErrorCode err, string msg)> StopELPTestForDevice(string deviceUUID, bool triggerSwitch = true) { var res = ELPManager.Instance.StopTest(deviceUUID, triggerSwitch); - ELPManager.Instance.RestartMiningInstance(); + ELPManager.Instance.RestartMiningInstanceIfNeeded(); return Task.FromResult(res.Result); } @@ -834,7 +834,7 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); StopELPTestForDevice(deviceUUID, false); StopOCTestForDevice(deviceUUID, false); - ELPManager.Instance.RestartMiningInstance(); + ELPManager.Instance.RestartMiningInstanceIfNeeded(); var res = FanManager.Instance.ExecuteTest(deviceUUID, fanBundle); return Task.FromResult(res.Result); } @@ -842,7 +842,7 @@ private static Task ExecuteProfilesBundleReset(bool triggerSwitch = true) private static Task<(ErrorCode err, string msg)> StopFanTestForDevice(string deviceUUID, bool triggerSwitch = true) { if (!Helpers.IsElevated) return Task.FromResult((ErrorCode.ErrNotAdmin, "No administrator privileges")); - ELPManager.Instance.RestartMiningInstance(); + ELPManager.Instance.RestartMiningInstanceIfNeeded(); var res = FanManager.Instance.StopTest(deviceUUID, triggerSwitch); return Task.FromResult(res.Result); } From 238918b40c32db5d44c1367507f9c7189ba1c0e0 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 25 Jan 2023 12:51:40 +0100 Subject: [PATCH 067/224] modified status sending so it sends only changed fields --- src/NHMCore/Configs/MiningSettings.cs | 2 +- src/NHMCore/Mining/AlgorithmContainer.cs | 2 +- src/NHMCore/Mining/ComputeDevice.cs | 2 +- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 2 +- src/NHMCore/Nhmws/V4/MessagesV4.cs | 10 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 101 +++++++++++++++++- src/NHMCore/Schedules/SchedulesManager.cs | 6 +- .../ViewModels/Models/DeviceData.cs | 4 +- 8 files changed, 110 insertions(+), 19 deletions(-) diff --git a/src/NHMCore/Configs/MiningSettings.cs b/src/NHMCore/Configs/MiningSettings.cs index a3cf62d7b..ba4665902 100644 --- a/src/NHMCore/Configs/MiningSettings.cs +++ b/src/NHMCore/Configs/MiningSettings.cs @@ -103,7 +103,7 @@ public bool UseScheduler { _useScheduler = value; OnPropertyChanged(nameof(UseScheduler)); - _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } } diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 31b2f0d2a..7b2bc1342 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -241,7 +241,7 @@ public virtual bool Enabled if (Algorithm != null) Algorithm.Enabled = value; OnPropertyChanged(); OnPropertyChanged(nameof(Status)); - Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } } public void SetEnabled(bool enabled) //for enable without WS (bulk setting) diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index fba0db9a8..efab39f3a 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -179,7 +179,7 @@ public string ApplyNewAlgoStates(MinerAlgoState state) targets.ForEach(t => t.SetEnabled((bool)algo.Enabled)); } } - Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(false));//todo not needed + Task.Run(async () => NHWebSocketV4.UpdateMinerStatus()); return "New state is set"; } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 74470575c..b81ea3eef 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -382,7 +382,7 @@ List getOptionalMutableProperties() { SchedulesManager.Instance.AddScheduleToList(returnedSchedule); } - _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); return "Schedules added"; } } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index f4558bde4..3741886ea 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -399,13 +399,13 @@ internal class MinerState : ISendMessage { internal class DeviceState { - [JsonProperty("mdv")] + [JsonProperty("mdv", NullValueHandling = NullValueHandling.Ignore)] public JArray MandatoryDynamicValues { get; set; } [JsonProperty("odv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalDynamicValues { get; set; } - [JsonProperty("mmv")] + [JsonProperty("mmv", NullValueHandling = NullValueHandling.Ignore)] public JArray MandatoryMutableValues { get; set; } [JsonProperty("omv", NullValueHandling = NullValueHandling.Ignore)] @@ -415,19 +415,19 @@ internal class DeviceState [JsonProperty("method")] public string Method => "miner.state"; - [JsonProperty("mdv")] + [JsonProperty("mdv", NullValueHandling = NullValueHandling.Ignore)] public JArray MutableDynamicValues { get; set; } [JsonProperty("odv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalDynamicValues { get; set; } - [JsonProperty("mmv")] + [JsonProperty("mmv", NullValueHandling = NullValueHandling.Ignore)] public JArray MandatoryMutableValues { get; set; } [JsonProperty("omv", NullValueHandling = NullValueHandling.Ignore)] public JArray OptionalMutableValues { get; set; } - [JsonProperty("devices")] + [JsonProperty("devices", NullValueHandling = NullValueHandling.Ignore)] public List Devices { get; set; } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index a5f2874cc..21d55fc13 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -80,6 +80,7 @@ private enum MessageType Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, Btc = DemoUser.BTC, }; + private static MinerState CachedState = null; static private ConcurrentQueue _recieveQueue { get; set; } = new ConcurrentQueue(); static private ConcurrentQueue> _sendQueue { get; set; } = new ConcurrentQueue>(); @@ -327,8 +328,98 @@ static public void SetCredentials(string btc = null, string worker = null, strin } #region Message handling + private static bool AreEqual(JArray first, JArray second) + { + if (first == null && second == null) return true; + if (first == null || second == null) return false; + return JsonConvert.SerializeObject(first) == JsonConvert.SerializeObject(second); + } + private static MinerState.DeviceState GetDeviceStateDelta(MinerState.DeviceState first, MinerState.DeviceState second) + { + if (first == null || second == null) return second; + var devState = new MinerState.DeviceState(); + if (!AreEqual(first.OptionalDynamicValues, second.OptionalDynamicValues)) + { + devState.OptionalDynamicValues = second.OptionalDynamicValues; + } + if (!AreEqual(first.MandatoryDynamicValues, second.MandatoryDynamicValues)) + { + devState.MandatoryDynamicValues = second.MandatoryDynamicValues; + } + if (!AreEqual(first.OptionalMutableValues, second.OptionalMutableValues)) + { + devState.OptionalMutableValues = second.OptionalMutableValues; + } + if (!AreEqual(first.MandatoryMutableValues, second.MandatoryMutableValues)) + { + devState.MandatoryMutableValues = second.MandatoryMutableValues; + } + return devState; + } + private static bool AreDeviceListsComparable(List first, List second) + { + if (first == null || second == null) return true; + if (first.Count != second.Count) return false; + return true; + } - private static string CreateMinerStatusMessage(bool stateChange = false) => JsonConvert.SerializeObject(MessageParserV4.GetMinerState(_login.Worker, AvailableDevices.Devices.SortedDevices(), stateChange)); + private static MinerState GetDeltaProperties(MinerState prev, MinerState next) + { + MinerState ret = new MinerState(); + if (!AreEqual(prev.MutableDynamicValues, next.MutableDynamicValues)) + { + ret.MutableDynamicValues = next.MutableDynamicValues; + } + if (!AreEqual(prev.OptionalDynamicValues, next.OptionalDynamicValues)) + { + ret.OptionalDynamicValues = next.OptionalDynamicValues; + } + if (!AreEqual(prev.OptionalMutableValues, next.OptionalMutableValues)) + { + ret.OptionalMutableValues = next.OptionalMutableValues; + } + if (!AreEqual(prev.MandatoryMutableValues, next.MandatoryMutableValues)) + { + ret.MandatoryMutableValues = next.MandatoryMutableValues; + } + + if (AreDeviceListsComparable(prev.Devices, next.Devices)) + { + if (prev.Devices == null && next.Devices == null) return ret; + if(prev.Devices == null && next.Devices != null) + { + ret.Devices = next.Devices; + return ret; + } + if(prev.Devices != null && next.Devices == null) + { + ret.Devices = null; + return ret; + } + ret.Devices = new(); + for(int i = 0; i < next.Devices.Count; i++) + { + ret.Devices.Add(GetDeviceStateDelta(prev.Devices[i], next.Devices[i])); + } + } + else + { + ret.Devices = next.Devices; + } + return ret; + } + private static string CreateMinerStatusMessage() + { + var nextState = MessageParserV4.GetMinerState(_login.Worker, AvailableDevices.Devices.SortedDevices()); + var shrinkedState = new MinerState(); + if (CachedState != null) + { + shrinkedState = GetDeltaProperties(CachedState, nextState); + } + CachedState = nextState; + var json = JsonConvert.SerializeObject(shrinkedState); + return json; + } static private async Task HandleMessage(MessageEventArgs e) { @@ -766,9 +857,9 @@ async Task systemDump() _ = UpdateMinerStatus(); return Task.FromResult((err, result)); } - public static Task UpdateMinerStatus(bool stateChange = false) + public static Task UpdateMinerStatus() { - var minerStatusJsonStr = CreateMinerStatusMessage(stateChange); + var minerStatusJsonStr = CreateMinerStatusMessage(); _sendQueue.EnqueueParams((MessageType.SEND_MESSAGE_STATUS, minerStatusJsonStr)); return Task.CompletedTask; } @@ -850,7 +941,7 @@ private static Task SetMutable(MinerSetMutable mutableCmd) { if (mutableCmd.Properties != null) { - foreach(var property in mutableCmd.Properties) + foreach (var property in mutableCmd.Properties) { HandleProperty(property); } @@ -888,7 +979,7 @@ private static Task HandleProperty(object property) Type.Bool => ParseAndActMutableBool(mutable, token), _ => throw new InvalidOperationException() }; - Task.Run(async () => NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => NHWebSocketV4.UpdateMinerStatus()); if (t is string retStr) return Task.FromResult(retStr); return Task.FromResult("OK"); } diff --git a/src/NHMCore/Schedules/SchedulesManager.cs b/src/NHMCore/Schedules/SchedulesManager.cs index 4331c949f..71d85e97c 100644 --- a/src/NHMCore/Schedules/SchedulesManager.cs +++ b/src/NHMCore/Schedules/SchedulesManager.cs @@ -64,7 +64,7 @@ public void AddScheduleToList(Schedule schedule) Schedules.Add(schedule); OnPropertyChanged(nameof(Schedules)); ConfigManager.ScheduleConfigFileCommit(); - Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } public void DeleteScheduleFromList(Schedule schedule) @@ -72,7 +72,7 @@ public void DeleteScheduleFromList(Schedule schedule) Schedules.Remove(schedule); OnPropertyChanged(nameof(Schedules)); ConfigManager.ScheduleConfigFileCommit(); - Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } public void ClearScheduleList() @@ -80,7 +80,7 @@ public void ClearScheduleList() Schedules.Clear(); OnPropertyChanged(nameof(Schedules)); ConfigManager.ScheduleConfigFileCommit(); - Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } public string ScheduleToJSON() diff --git a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs index b2cce1783..af3099759 100644 --- a/src/NiceHashMiner/ViewModels/Models/DeviceData.cs +++ b/src/NiceHashMiner/ViewModels/Models/DeviceData.cs @@ -82,7 +82,7 @@ public bool AllAgorithmsEnabled } OnPropertyChanged(); ConfigManager.CommitBenchmarksForDevice(Dev); - Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } } @@ -323,7 +323,7 @@ public void EnableBenchmarkedOnly() } OnPropertyChanged(); ConfigManager.CommitBenchmarksForDevice(Dev); - Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus(true)); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } #region AlgorithmSettingsCollection SORTING From b0b0f0426a29afb01bcc0f12971afc294061bd56 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 31 Jan 2023 13:00:35 +0100 Subject: [PATCH 068/224] updated mutable setting --- src/NHMCore/Mining/ComputeDevice.cs | 6 +- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 109 ++++++++++-------------- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 24 +++--- 3 files changed, 63 insertions(+), 76 deletions(-) diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index efab39f3a..bd30a0767 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -162,9 +162,9 @@ protected set } } } - public string ApplyNewAlgoStates(MinerAlgoState state) + public int ApplyNewAlgoStates(MinerAlgoState state) { - if (State == DeviceState.Mining || State == DeviceState.Testing || State == DeviceState.Benchmarking) return "Stop mining first"; + if (State == DeviceState.Mining || State == DeviceState.Testing || State == DeviceState.Benchmarking) return -1; foreach(var miner in state.Miners) { foreach(var algo in miner.Algos) @@ -180,7 +180,7 @@ public string ApplyNewAlgoStates(MinerAlgoState state) } } Task.Run(async () => NHWebSocketV4.UpdateMinerStatus()); - return "New state is set"; + return 0; } private List PluginAlgorithmSettings { get; set; } = new List(); diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index b81ea3eef..f53fbc3e8 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -89,7 +89,7 @@ private static string GetDevicePlugin(string UUID) return devData.MinerName; } - private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isStateChange = false, bool isLogin = false) + private static (List<(string name, string? unit)> properties, JArray values) GetDeviceOptionalDynamic(ComputeDevice d, bool isLogin = false) { string getValue(T o) => (typeof(T).Name, o) switch { @@ -136,7 +136,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get pairOrNull(DeviceDynamicProperties.PowerUsage, "Power usage","W"), pairOrNull(DeviceDynamicProperties.CoreClock, "Core clock", "MHz"), pairOrNull(DeviceDynamicProperties.MemClock, "Memory clock", "MHz"), - pairOrNull(DeviceDynamicProperties.TDP, "TDP", "%"), + pairOrNull(DeviceDynamicProperties.TDP, "Power Limit", "%"), pairOrNull(DeviceDynamicProperties.NONE, "Miner", null), pairOrNull(DeviceDynamicProperties.NONE, "OC profile", null), pairOrNull(DeviceDynamicProperties.NONE, "OC profile ID", null), @@ -151,19 +151,16 @@ private static (List<(string name, string? unit)> properties, JArray values) Get .Select(p => p.Value) .ToList(); - if (isStateChange) + bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string unit, string value) dynamicVal) { - bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string unit, string value) dynamicVal) - { - if (dynamicVal.unit == String.Empty) return false; - var ok = Int32.TryParse(dynamicVal.value, out var res); - if (ok && res < 0 && !dynamicVal.name.Contains("clock")) return true; - return false; - }; - deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); - //deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); - if (isLogin) deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); - } + if (dynamicVal.unit == String.Empty) return false; + var ok = Int32.TryParse(dynamicVal.value, out var res); + if (ok && res < 0 && !dynamicVal.name.Contains("clock")) return true; + return false; + }; + deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); + //deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); + if (isLogin) deviceOptionalDynamic.ForEach(dynamVal => d.SupportedDynamicProperties.Add(dynamVal.type)); foreach (DeviceDynamicProperties i in Enum.GetValues(typeof(DeviceDynamicProperties))) { if (!d.SupportedDynamicProperties.Contains(i)) deviceOptionalDynamic.RemoveAll(prop => prop.type == i); @@ -175,7 +172,7 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u // we cache device properties so we persevere property IDs private static readonly Dictionary> _cachedDevicesOptionalMutable = new Dictionary>(); - private static (List properties, JArray values) GetDeviceOptionalMutable(ComputeDevice d, bool isStateChange, bool isLogin) + private static (List properties, JArray values) GetDeviceOptionalMutable(ComputeDevice d, bool isLogin) { OptionalMutableProperty valueOrNull(OptionalMutableProperty v) => d.DeviceMonitor is T ? v : null; List getOptionalMutableProperties(ComputeDevice d) @@ -191,18 +188,15 @@ List getOptionalMutableProperties(ComputeDevice d) Range = (2048, ""), ExecuteTask = async (object p) => { - if (p is not string prop) return null; + if (p is not string prop) return -1; var newState = JsonConvert.DeserializeObject(prop); return d.ApplyNewAlgoStates(newState); }, GetValue = () => { string ret = null; - if (isStateChange) - { - ret = string.Empty; - ret += GetMinersForDeviceDynamic(d); - } + ret = string.Empty; + ret += GetMinersForDeviceDynamic(d); return ret; }, ComputeDev = d @@ -263,8 +257,8 @@ Device mapComputeDevice(ComputeDevice d) { "optional", GetStaticPropertiesOptionalValues(d) }, }, Actions = CreateDefaultDeviceActions(d.B64Uuid), - OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true, true).properties), - OptionalMutableProperties = GetDeviceOptionalMutable(d, true, true).properties, + OptionalDynamicProperties = DeviceOptionalDynamicToList(GetDeviceOptionalDynamic(d, true).properties), + OptionalMutableProperties = GetDeviceOptionalMutable(d, true).properties, }; } var DevicesProperties = devices.Select(mapComputeDevice).ToList(); //needs to execute first @@ -274,14 +268,14 @@ Device mapComputeDevice(ComputeDevice d) Worker = worker, RigID = rigID, Version = new List { $"NHM/{NHMApplication.ProductVersion}", Environment.OSVersion.ToString() }, - OptionalMutableProperties = GetRigOptionalMutableValues(true, true).properties, + OptionalMutableProperties = GetRigOptionalMutableValues(true).properties, OptionalDynamicProperties = GetRigOptionalDynamicValues().properties, Actions = CreateDefaultRigActions(), Devices = DevicesProperties, - MinerState = GetMinerStateValues(worker, devices, true), + MinerState = GetMinerStateValues(worker, devices), }; } - private static (List properties, JArray values) GetRigOptionalMutableValues(bool isStateChange, bool isLogin) + private static (List properties, JArray values) GetRigOptionalMutableValues(bool isLogin) { List getOptionalMutableProperties() { @@ -296,8 +290,7 @@ List getOptionalMutableProperties() Range = (64, String.Empty), GetValue = () => { - if (isStateChange) return CredentialsSettings.Instance.BitcoinAddress; - return null; + return CredentialsSettings.Instance.BitcoinAddress; } }, new OptionalMutablePropertyString @@ -309,8 +302,7 @@ List getOptionalMutableProperties() Range = (64, String.Empty), GetValue = () => { - if (isStateChange) return CredentialsSettings.Instance.WorkerName; - return null; + return CredentialsSettings.Instance.WorkerName; } }, new OptionalMutablePropertyString @@ -322,38 +314,35 @@ List getOptionalMutableProperties() Range = (65536, String.Empty), GetValue = () => { - string ret = null; - if (isStateChange) + string ret = string.Empty; + var minersSettingsGlobal = new MinerAlgoStateRig(); + var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null); + if(mutables == null || mutables.Count() <= 0) return ret; + foreach (var mutable in mutables) { - ret = string.Empty; - var minersSettingsGlobal = new MinerAlgoStateRig(); - var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null); - if(mutables == null || mutables.Count() <= 0) return ret; - foreach (var mutable in mutables) - { - if (mutable.GetValue() is not string val) continue; - minersSettingsGlobal.Miners.Add(JsonConvert.DeserializeObject(val)); - } - ret += JsonConvert.SerializeObject(minersSettingsGlobal); + if (mutable.GetValue() is not string val) continue; + minersSettingsGlobal.Miners.Add(JsonConvert.DeserializeObject(val)); } + ret += JsonConvert.SerializeObject(minersSettingsGlobal); return ret; }, ExecuteTask = async (object p) => { - if(p is not string prop) return null; + if(p is not string prop) return -1; var newStates = JsonConvert.DeserializeObject(prop); //for each device thats inside apply new algo state var devices = AvailableDevices.Devices.Where(d => newStates.Miners.Any(m => m.DeviceID.Contains(d.B64Uuid))); - if(devices == null) return null; + if(devices == null) return -2; var successCount = 0; foreach(var ns in newStates.Miners) { var targetDev = AvailableDevices.Devices.FirstOrDefault(d => d.B64Uuid == ns.DeviceID); if(targetDev == null) continue; - targetDev.ApplyNewAlgoStates(ns); + var tempRes = targetDev.ApplyNewAlgoStates(ns); + if(tempRes != 0) continue; successCount++; } - return $"{successCount}/{newStates.Miners.Count} operations succeded"; + return successCount == newStates.Miners.Count ? 0 : -3; } }, new OptionalMutablePropertyString @@ -365,11 +354,7 @@ List getOptionalMutableProperties() Range = (4096, String.Empty), GetValue = () => { - string ret = null; - if (isStateChange) - { - ret = SchedulesManager.Instance.ScheduleToJSON(); - } + string ret = SchedulesManager.Instance.ScheduleToJSON(); return ret; }, ExecuteTask = async (object p) => @@ -438,15 +423,15 @@ private static (List> properties, JArray values) GetRigOptionalDyna return (props, new JArray(vals)); } - private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable devices, bool isLogin) + private static JObject GetMinerStateValues(string workerName, IOrderedEnumerable devices) { - var json = JObject.FromObject(GetMinerState(workerName, devices, isLogin)); + var json = JObject.FromObject(GetMinerState(workerName, devices)); var delProp = json.Property("method"); delProp.Remove(); return json; } - internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices, bool isStateChange = false) + internal static MinerState GetMinerState(string workerName, IOrderedEnumerable devices) { var rig = ApplicationStateManager.CalcRigStatus(); @@ -494,9 +479,9 @@ JArray mmv(ComputeDevice d) return new MinerState.DeviceState { MandatoryDynamicValues = mdv(d), - OptionalDynamicValues = GetDeviceOptionalDynamic(d, isStateChange).values, // odv + OptionalDynamicValues = GetDeviceOptionalDynamic(d).values, // odv MandatoryMutableValues = mmv(d), - OptionalMutableValues = GetDeviceOptionalMutable(d, isStateChange, false).values, // omv + OptionalMutableValues = GetDeviceOptionalMutable(d, false).values, // omv }; } @@ -505,7 +490,7 @@ JArray mmv(ComputeDevice d) MutableDynamicValues = new JArray(rigStateToInt(rig)), OptionalDynamicValues = GetRigOptionalDynamicValues().values, MandatoryMutableValues = new JArray(rigStateToInt(rig), workerName), - OptionalMutableValues = GetRigOptionalMutableValues(isStateChange, false).values, + OptionalMutableValues = GetRigOptionalMutableValues(false).values, Devices = devices.Select(toDeviceState).ToList(), }; } @@ -601,7 +586,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = tdpLim.GetTDPLimits(); if (lims.ok) { - limit.limits.Add(new Limit { Name = "Power mode", Unit = "W", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Power Limit", Unit = "W", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } if (d.DeviceMonitor is ICoreClockSet) @@ -611,7 +596,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = ccLimDelta.CoreClockRangeDelta; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Core clock delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Core Clock Delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } if (d.DeviceType == DeviceType.AMD && d.DeviceMonitor is ICoreClockRange ccLim) @@ -619,7 +604,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = ccLim.CoreClockRange; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Core Clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } } @@ -630,7 +615,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = mcLimDelta.MemoryClockRangeDelta; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Memory clock delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Memory Clock Delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } if (d.DeviceType == DeviceType.AMD && d.DeviceMonitor is IMemoryClockRange mcLim) @@ -638,7 +623,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = mcLim.MemoryClockRange; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Memory Clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 21d55fc13..25843b46e 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -941,12 +941,15 @@ private static Task SetMutable(MinerSetMutable mutableCmd) { if (mutableCmd.Properties != null) { + var resArray = new List(); foreach (var property in mutableCmd.Properties) { - HandleProperty(property); + resArray.Add(HandleProperty(property).Result); } + if (resArray.All(r => r == 0)) return Task.FromResult(string.Empty);//this shouldn be 0 bwhile mining + return Task.FromResult("Stop mining first"); } - if (mutableCmd.Devices == null) return Task.FromResult("Success"); + if (mutableCmd.Devices == null) return Task.FromResult(string.Empty); string result = string.Empty; foreach (var device in mutableCmd.Devices) { @@ -965,12 +968,12 @@ private static Task SetMutable(MinerSetMutable mutableCmd) } return Task.FromResult(result); } - private static Task HandleProperty(object property) + private static Task HandleProperty(object property) { - if (property is not JToken token) return Task.FromResult("Property is not Jtoken"); + if (property is not JToken token) return Task.FromResult(-1); var genericProperty = token.ToObject(); var mutable = ActionMutableMap.FindMutableOrNull(genericProperty.PropId);//this is null if per rig - if (mutable == null) return Task.FromResult("Mutable is null"); + if (mutable == null) return Task.FromResult(-2); object t = mutable.PropertyType switch { Type.String => ParseAndActMutableString(mutable, token), @@ -979,16 +982,15 @@ private static Task HandleProperty(object property) Type.Bool => ParseAndActMutableBool(mutable, token), _ => throw new InvalidOperationException() }; - Task.Run(async () => NHWebSocketV4.UpdateMinerStatus()); - if (t is string retStr) return Task.FromResult(retStr); - return Task.FromResult("OK"); + if(t is Task res) return Task.FromResult(res.Result); + return Task.FromResult(0); } - static Task ParseAndActMutableString(OptionalMutableProperty property, JToken command) + static Task ParseAndActMutableString(OptionalMutableProperty property, JToken command) { var mutable = command.ToObject(); var res = property.ExecuteTask(mutable.Value); - if (res.Result is string resStr) return Task.FromResult(resStr); - return Task.FromResult(string.Empty); + if (res.Result is int resInt) return Task.FromResult(resInt); + return Task.FromResult(-100); } static Task ParseAndActMutableInt(OptionalMutableProperty property, JToken command) { From 4c1acd5bb895569d262ea0113712b3d2a2db2203 Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Tue, 31 Jan 2023 14:16:26 +0100 Subject: [PATCH 069/224] NL-2187 Scheduler timezone fix --- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 4 ++++ src/NHMCore/Schedules/SchedulesManager.cs | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index f53fbc3e8..553142829 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -365,6 +365,10 @@ List getOptionalMutableProperties() MiningSettings.Instance.UseScheduler = schedulerEnabled; foreach(var returnedSchedule in returnedSchedules) { + var from = DateTime.Parse(returnedSchedule.From).ToLocalTime().ToString("HH:mm"); + var to = DateTime.Parse(returnedSchedule.To).ToLocalTime().ToString("HH:mm"); + returnedSchedule.From = from; + returnedSchedule.To = to; SchedulesManager.Instance.AddScheduleToList(returnedSchedule); } _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); diff --git a/src/NHMCore/Schedules/SchedulesManager.cs b/src/NHMCore/Schedules/SchedulesManager.cs index 71d85e97c..35929086d 100644 --- a/src/NHMCore/Schedules/SchedulesManager.cs +++ b/src/NHMCore/Schedules/SchedulesManager.cs @@ -89,8 +89,8 @@ public string ScheduleToJSON() schedules.enabled = MiningSettings.Instance.UseScheduler; foreach (var slot in Schedules) { - var from = TimeSpan.Parse(slot.From); - var to = TimeSpan.Parse(slot.To); + var from = TimeSpan.Parse(DateTime.Parse(slot.From).ToUniversalTime().ToString("HH:mm")); + var to = TimeSpan.Parse(DateTime.Parse(slot.To).ToUniversalTime().ToString("HH:mm")); var days = new List(); int counter = 1; foreach (var (_, enabled) in slot.DaysFrom) From 16759ac610adc18a9d5ce69a696ad55d0486ce65 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Tue, 31 Jan 2023 14:59:43 +0100 Subject: [PATCH 070/224] added some early returns if admin on received action --- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 42 ++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 25843b46e..1bae27ed9 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -778,7 +778,7 @@ async Task systemDump() var actionRecord = ActionMutableMap.FindActionOrNull(action.ActionId); if (actionRecord == null) { - NHM.Common.Logger.Error("NHWebSocketV4", "Action not found"); + Logger.Error("NHWebSocketV4", "Action not found"); return Task.FromResult((ErrorCode.ActionNotFound, "Action not found")); } //action has single parameter anyway FOR NOW @@ -810,6 +810,11 @@ async Task systemDump() (err, result) = ApplicationStateManager.StartReBenchmark().Result; break; case SupportedAction.ActionProfilesBundleSet: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } var bundle = JsonConvert.DeserializeObject(parameters); _ = ExecuteProfilesBundleReset(false); _ = ExecuteProfilesBundleSet(bundle); @@ -817,6 +822,11 @@ async Task systemDump() (err, result) = (ErrorCode.NoError, "OK"); break; case SupportedAction.ActionProfilesBundleReset: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } ExecuteProfilesBundleReset(); MiningState.Instance.CalculateDevicesStateChange(); (err, result) = (ErrorCode.NoError, "OK"); @@ -828,25 +838,55 @@ async Task systemDump() NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionOcProfileTest: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } var oc = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteOCTest(deviceUUID, oc).Result; break; case SupportedAction.ActionOcProfileTestStop: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } (err, result) = StopOCTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionFanProfileTest: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } var fan = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteFanTest(deviceUUID, fan).Result; break; case SupportedAction.ActionFanProfileTestStop: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } (err, result) = StopFanTestForDevice(deviceUUID).Result; break; case SupportedAction.ActionElpProfileTest: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } var elp = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteELPTest(deviceUUID, elp).Result; MiningState.Instance.CalculateDevicesStateChange(); break; case SupportedAction.ActionElpProfileTestStop: + if (!Helpers.IsElevated) + { + (err, result) = (ErrorCode.ErrNotAdmin, "No admin privileges"); + break; + } (err, result) = StopELPTestForDevice(deviceUUID).Result; MiningState.Instance.CalculateDevicesStateChange(); break; From 5ea8c38e52736bef686fa06115f175c598394d11 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Thu, 2 Feb 2023 10:45:47 +0100 Subject: [PATCH 071/224] fixed stuff according to bug report --- .../ApplicationStateManager.Mining.cs | 20 ++++++++++++++++++- .../ApplicationStateManager.Program.cs | 5 +++++ src/NHMCore/Configs/Managers/ELPManager.cs | 2 +- src/NHMCore/Configs/Managers/FanManager.cs | 2 +- src/NHMCore/Configs/Managers/OCManager.cs | 2 +- src/NHMCore/Mining/ComputeDevice.cs | 6 +++++- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 14 +++++++------ src/NHMCore/Nhmws/V4/MessagesV4.cs | 13 ++++++++++++ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 6 +++++- 9 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs index 4116e1faf..00bd6cfec 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs @@ -3,6 +3,7 @@ using NHM.Common.Enums; using NHMCore.Mining; using NHMCore.Nhmws; +using NHMCore.Utils; using System; using System.Collections.Generic; using System.IO; @@ -126,6 +127,7 @@ static partial class ApplicationStateManager case DeviceState.Benchmarking: #if NHMWS4 case DeviceState.Testing: + if(Helpers.IsElevated) device.ResetFanSpeed(); #endif await MiningManager.StopDevice(device); return (true, ""); @@ -172,7 +174,23 @@ public static void StartBenchmark() _ = Task.WhenAll(completeBenchmarkDevices); return Task.FromResult((ErrorCode.NoError, "Success")); } - + public static Task<(ErrorCode err, string msg)> StartRebenchmarkSpecific(string deviceUUID) + { + var startBenchmarkingDevices = AvailableDevices.Devices + .Where(device => device.B64Uuid == deviceUUID)? + .Where(device => device.State == DeviceState.Stopped)? + .Where(device => device.AnyAlgorithmEnabled()); + if (startBenchmarkingDevices == null || startBenchmarkingDevices.Count() == 0) + { + return Task.FromResult((ErrorCode.ErrNoAlgoDataFound, "No targets found. Stop mining first.")); + } + foreach (var device in startBenchmarkingDevices) device.PrepareForRebenchmark(); + var completeBenchmarkDevices = startBenchmarkingDevices + .Select(StartDeviceTask) + .ToArray(); + _ = Task.WhenAll(completeBenchmarkDevices); + return Task.FromResult((ErrorCode.NoError, "Success")); + } public static Task StopBenchmark() { var stoptDevices = AvailableDevices.Devices diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Program.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Program.cs index f35c905b1..5173ee3be 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Program.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Program.cs @@ -65,6 +65,7 @@ public static async Task BeforeExit() _beforeExitCalled = true; try { + DeviceActionsBeforeExit(); // should close websocket ExitApplication.Cancel(); ConfigManager.GeneralConfigFileCommit(); @@ -83,6 +84,10 @@ public static async Task BeforeExit() { } } + private static void DeviceActionsBeforeExit() + { + if(Helpers.IsElevated) AvailableDevices.Devices.ToList().ForEach(d => d.ResetFanSpeed()); + } private static bool _restartCalled = false; public static async Task RestartProgram() diff --git a/src/NHMCore/Configs/Managers/ELPManager.cs b/src/NHMCore/Configs/Managers/ELPManager.cs index 67bc16a7b..b5c623b25 100644 --- a/src/NHMCore/Configs/Managers/ELPManager.cs +++ b/src/NHMCore/Configs/Managers/ELPManager.cs @@ -353,7 +353,7 @@ private void IterateSubModelsAndConstructELPsForPlugin(MinerELPData miner) if (targetDeviceContainer == null) { Logger.Error(_TAG, "Device not found for stop ELP test"); - return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device is not in test mode")); } targetDeviceContainer.SetTargetElpProfile(null, true); if (triggerSwitch) MiningManager.TriggerSwitchCheck(); diff --git a/src/NHMCore/Configs/Managers/FanManager.cs b/src/NHMCore/Configs/Managers/FanManager.cs index ce17b847f..7898e8fdc 100644 --- a/src/NHMCore/Configs/Managers/FanManager.cs +++ b/src/NHMCore/Configs/Managers/FanManager.cs @@ -61,7 +61,7 @@ public enum FanReturn if (targetDeviceContainer == null) { Logger.Error(_TAG, "Device not found for stop OC test"); - return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device is not in test mode")); } targetDeviceContainer.SetTargetFanProfile(null, true); if (triggerSwitch) MiningManager.TriggerSwitchCheck(); diff --git a/src/NHMCore/Configs/Managers/OCManager.cs b/src/NHMCore/Configs/Managers/OCManager.cs index 3c2f83d56..8a69f7c62 100644 --- a/src/NHMCore/Configs/Managers/OCManager.cs +++ b/src/NHMCore/Configs/Managers/OCManager.cs @@ -58,7 +58,7 @@ private OCManager() { } if (targetDeviceContainer == null) { Logger.Error(_TAG, "Device not found for stop OC test"); - return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device not found")); + return Task.FromResult((ErrorCode.TargetDeviceNotFound, "Device is not in test mode")); } targetDeviceContainer.SetTargetOcProfile(null, true); if(triggerSwitch) MiningManager.TriggerSwitchCheck(); diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index bd30a0767..2cce3961c 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -833,7 +833,11 @@ public async Task AfterStartMining() { var retOCTest = await target.SetOcForDevice(target.ActiveOCTestProfile, false); if (retOCTest == RigManagementReturn.Success || retOCTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; - else target.SwitchOCTestToInactive(); + else + { + target.SwitchOCTestToInactive(); + State = DeviceState.Mining; + } } break; case AlgorithmContainer.ActionQueue.ResetOCTest: diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 553142829..3556db31b 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -363,13 +363,14 @@ List getOptionalMutableProperties() var (schedulerEnabled, returnedSchedules) = SchedulesManager.Instance.ScheduleFromJSON(prop); SchedulesManager.Instance.ClearScheduleList(); MiningSettings.Instance.UseScheduler = schedulerEnabled; - foreach(var returnedSchedule in returnedSchedules) + if(returnedSchedules != null) { - var from = DateTime.Parse(returnedSchedule.From).ToLocalTime().ToString("HH:mm"); - var to = DateTime.Parse(returnedSchedule.To).ToLocalTime().ToString("HH:mm"); - returnedSchedule.From = from; - returnedSchedule.To = to; - SchedulesManager.Instance.AddScheduleToList(returnedSchedule); + foreach(var returnedSchedule in returnedSchedules) + { + returnedSchedule.From = DateTime.Parse(returnedSchedule.From).ToLocalTime().ToString("HH:mm"); + returnedSchedule.To = DateTime.Parse(returnedSchedule.To).ToLocalTime().ToString("HH:mm"); + SchedulesManager.Instance.AddScheduleToList(returnedSchedule); + } } _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); return "Schedules added"; @@ -506,6 +507,7 @@ private static List CreateDefaultDeviceActions(string uuid) { NhmwsAction.ActionDeviceEnable(uuid), NhmwsAction.ActionDeviceDisable(uuid), + NhmwsAction.ActionDeviceRebenchmark(uuid), NhmwsAction.ActionOcProfileTest(uuid), NhmwsAction.ActionOcProfileTestStop(uuid), NhmwsAction.ActionFanProfileTest(uuid), diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 3741886ea..c90b91704 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -201,6 +201,19 @@ public static NhmwsAction ActionDeviceDisable(string uuid) ActionMutableMap.ActionList.Add(action); return action; } + public static NhmwsAction ActionDeviceRebenchmark(string uuid) + { + var action = new NhmwsAction + { + ActionID = NhmwsAction.NextActionId(), + DisplayName = "Rebenchmark", + DisplayGroup = 0, + ActionType = SupportedAction.ActionRebenchmark, + DeviceUUID = uuid + }; + ActionMutableMap.ActionList.Add(action); + return action; + } public static NhmwsAction ActionOcProfileTest(string uuid) { var action = new NhmwsAction diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 1bae27ed9..ea2f7cad8 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -807,7 +807,11 @@ async Task systemDump() NHLog.Warn(_logTag, "This type of action is handled through old protocol: " + typeOfAction); break; case SupportedAction.ActionRebenchmark: - (err, result) = ApplicationStateManager.StartReBenchmark().Result; + if(deviceUUID == string.Empty) (err, result) = ApplicationStateManager.StartReBenchmark().Result; + else + { + (err, result) = ApplicationStateManager.StartRebenchmarkSpecific(deviceUUID).Result; + } break; case SupportedAction.ActionProfilesBundleSet: if (!Helpers.IsElevated) From 71a3c6082101465e4c1cb19f67173f9407f82cac Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Fri, 3 Feb 2023 09:45:33 +0100 Subject: [PATCH 072/224] toggle auto update added --- src/NHMCore/Configs/UpdateSettings.cs | 4 ++++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 30 ++++++++++++++++++++----- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 10 +++++---- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/NHMCore/Configs/UpdateSettings.cs b/src/NHMCore/Configs/UpdateSettings.cs index 9080a4fdd..210bce754 100644 --- a/src/NHMCore/Configs/UpdateSettings.cs +++ b/src/NHMCore/Configs/UpdateSettings.cs @@ -1,4 +1,6 @@ using NHM.Common; +using NHMCore.Nhmws.V4; +using System.Threading.Tasks; namespace NHMCore.Configs { @@ -26,6 +28,7 @@ public bool AutoUpdateNiceHashMiner _autoUpdateNiceHashMiner = value; } OnPropertyChanged(nameof(AutoUpdateNiceHashMiner)); + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } } @@ -46,6 +49,7 @@ public bool AutoUpdateMinerPlugins _autoUpdateMinerPlugins = value; } OnPropertyChanged(nameof(AutoUpdateMinerPlugins)); + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } } } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 3556db31b..5b096cee8 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -94,7 +94,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get string getValue(T o) => (typeof(T).Name, o) switch { (nameof(ILoad), ILoad g) => $"{(int)g.Load}", - (nameof(IMemControllerLoad), IMemControllerLoad g) => $"{g.MemoryControllerLoad}", + //(nameof(IMemControllerLoad), IMemControllerLoad g) => $"{g.MemoryControllerLoad}", (nameof(ITemp), ITemp g) => $"{g.Temp}", (nameof(IGetFanSpeedPercentage), IGetFanSpeedPercentage g) => $"{g.GetFanSpeedPercentage().percentage}", (nameof(IPowerUsage), IPowerUsage g) => $"{g.PowerUsage}", @@ -131,7 +131,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get pairOrNull(DeviceDynamicProperties.Temperature ,"Temperature","°C"), pairOrNull(DeviceDynamicProperties.VramTemp,"Memory Temperature","°C"), pairOrNull(DeviceDynamicProperties.Load,"Load","%"), - pairOrNull(DeviceDynamicProperties.MemoryControllerLoad, "MemCtrl Load","%"), + //pairOrNull(DeviceDynamicProperties.MemoryControllerLoad, "MemCtrl Load","%"), pairOrNull(DeviceDynamicProperties.FanSpeedPercentage, "Fan speed","%"), pairOrNull(DeviceDynamicProperties.PowerUsage, "Power usage","W"), pairOrNull(DeviceDynamicProperties.CoreClock, "Core clock", "MHz"), @@ -359,7 +359,7 @@ List getOptionalMutableProperties() }, ExecuteTask = async (object p) => { - if(p is not string prop) return null; + if(p is not string prop) return -1; var (schedulerEnabled, returnedSchedules) = SchedulesManager.Instance.ScheduleFromJSON(prop); SchedulesManager.Instance.ClearScheduleList(); MiningSettings.Instance.UseScheduler = schedulerEnabled; @@ -373,11 +373,31 @@ List getOptionalMutableProperties() } } _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); - return "Schedules added"; + return 0; + } + }, + new OptionalMutablePropertyBool + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Auto update", + DefaultValue = false, + GetValue = () => + { + return UpdateSettings.Instance.AutoUpdateMinerPlugins && UpdateSettings.Instance.AutoUpdateNiceHashMiner; + }, + ExecuteTask = async (object p) => + { + if(p is not bool prop) return -1; + UpdateSettings.Instance.AutoUpdateMinerPlugins = prop; + UpdateSettings.Instance.AutoUpdateNiceHashMiner = prop; + _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); + return 0; } } }; - if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); + if (isLogin) + optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); return optionalProperties .Where(p => p != null) .ToList(); diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index ea2f7cad8..09faadebd 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -990,8 +990,8 @@ private static Task SetMutable(MinerSetMutable mutableCmd) { resArray.Add(HandleProperty(property).Result); } - if (resArray.All(r => r == 0)) return Task.FromResult(string.Empty);//this shouldn be 0 bwhile mining - return Task.FromResult("Stop mining first"); + if (resArray.All(r => r == 0)) return Task.FromResult(string.Empty); + return Task.FromResult($"SetMutable error ({string.Join(",", resArray)})"); } if (mutableCmd.Devices == null) return Task.FromResult(string.Empty); string result = string.Empty; @@ -1046,10 +1046,12 @@ static Task ParseAndActMutableEnum(OptionalMutableProperty property, JToken comm var mutable = command.ToObject(); return Task.CompletedTask; } - static Task ParseAndActMutableBool(OptionalMutableProperty property, JToken command) + static Task ParseAndActMutableBool(OptionalMutableProperty property, JToken command) { var mutable = command.ToObject(); - return Task.CompletedTask; + var res = property.ExecuteTask(mutable.Value); + if (res.Result is int resInt) return Task.FromResult(resInt); + return Task.FromResult(-101); } #endregion RpcMessages From 0197760562d43e9c81252510664871d4b50acbd7 Mon Sep 17 00:00:00 2001 From: object99 Date: Fri, 10 Feb 2023 13:46:42 +0100 Subject: [PATCH 073/224] added core voltage support for nvidia --- .../device_monitoring_nvidia.dll | Bin 473600 -> 484352 bytes .../Enums/DeviceDynamicProperties.cs | 3 +- .../Core_clock/ICoreClockSet.cs | 1 + .../Core_voltage/ICoreVoltage.cs | 13 ++++ .../Core_voltage/ICoreVoltageRange.cs | 13 ++++ .../Core_voltage/ICoreVoltageSet.cs | 14 +++++ src/NHM.DeviceMonitoring/DeviceMonitorAMD.cs | 10 +++ .../DeviceMonitorNVIDIA.cs | 54 ++++++++++++++-- .../Memory_clock/IMemoryClockSet.cs | 1 + src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs | 9 ++- .../ApplicationStateManager.Mining.cs | 8 ++- .../ApplicationStateManager.Program.cs | 11 +++- src/NHMCore/Mining/AlgorithmContainer.cs | 54 +++++++++++----- src/NHMCore/Mining/ComputeDevice.cs | 59 ++++++++++++++---- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 21 +++++-- src/NHMCore/Nhmws/V4/MessagesV4.cs | 14 +++-- 16 files changed, 240 insertions(+), 45 deletions(-) create mode 100644 src/NHM.DeviceMonitoring/Core_voltage/ICoreVoltage.cs create mode 100644 src/NHM.DeviceMonitoring/Core_voltage/ICoreVoltageRange.cs create mode 100644 src/NHM.DeviceMonitoring/Core_voltage/ICoreVoltageSet.cs diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll index 7fd171089108b5e4501311b21485be782d29f95e..94fa699716560f65107d6fa5a0be4d662b2ce7af 100644 GIT binary patch delta 137078 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 z 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 d.ResetFanSpeed()); + if (Helpers.IsElevated) + { + AvailableDevices.Devices.ToList().ForEach(d => { + d.ResetFanSpeed(); + d.ResetCoreClock(); + d.ResetMemoryClock(); + d.ResetCoreVoltage(); + }); + + } } private static bool _restartCalled = false; diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 7b2bc1342..c0151b50b 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -718,23 +718,46 @@ public void SwitchOCToInactive() } public Task SetOcForDevice(OcProfile bundle, bool reset = false) { - if (bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); + //if (bundle != null) Logger.Warn(_TAG, $"Setting OC for {ComputeDevice.Name}: TDP={bundle.TDP},CC={bundle.CoreClock},MC={bundle.MemoryClock}"); var ret = RigManagementReturn.Fail; int valuesToSet = 0; - if (bundle.CoreClock > 0) valuesToSet++; - if (bundle.MemoryClock > 0) valuesToSet++; - if (bundle.TDP > 0) valuesToSet++; - if (valuesToSet == 0) + bool willSetCC = false; + bool willSetMC = false; + if (bundle.CoreClockDelta != null || bundle.CoreClock != null) + { + willSetCC = true; + valuesToSet++; + } + if (bundle.MemoryClockDelta != null || bundle.MemoryClock != null) + { + willSetMC = true; + valuesToSet++; + } + if (bundle.TDP != null) valuesToSet++; + if (bundle.CoreVoltage != null) valuesToSet++; + + if (valuesToSet == 0 && !reset) { Logger.Error(_TAG, "Have no values to set"); return Task.FromResult(ret); } - int setValues = 3; - var CoreClockValue = ComputeDevice.DeviceType == DeviceType.NVIDIA ? bundle.CoreClockDelta : bundle.CoreClock; - var MemoryClockValue = ComputeDevice.DeviceType == DeviceType.NVIDIA ? bundle.MemoryClockDelta : bundle.MemoryClock; - var setCC = bundle.CoreClock <= 0 ? false : ComputeDevice.SetCoreClock(CoreClockValue); - var setMC = bundle.MemoryClock <= 0 ? false : ComputeDevice.SetMemoryClock(MemoryClockValue); - var setTDP = bundle.TDP <= 0 ? false : ComputeDevice.SetPowerModeManual(bundle.TDP); + + int? CoreClockValue = willSetCC ? (ComputeDevice.DeviceType == DeviceType.NVIDIA ? (int)bundle.CoreClockDelta : (int)bundle.CoreClock) : null; + int? MemoryClockValue = willSetMC ? (ComputeDevice.DeviceType == DeviceType.NVIDIA ? (int)bundle.MemoryClockDelta : (int)bundle.MemoryClock) : null; + + + int setValues = 4; + var setTDP = bundle.TDP == null ? false : ComputeDevice.SetPowerModeManual((int)bundle.TDP); + var setCC = willSetCC ? ComputeDevice.SetCoreClock((int)CoreClockValue) : false; + var setMC = willSetMC ? ComputeDevice.SetMemoryClock((int)MemoryClockValue) : false; + var setCV = bundle.CoreVoltage == null ? false : ComputeDevice.SetCoreVoltage((int)bundle.CoreVoltage); + + if (reset) + { + setCV = ComputeDevice.ResetCoreVoltage(); + setCC = ComputeDevice.ResetCoreClock(); + setMC = ComputeDevice.ResetMemoryClock(); + } if (!setCC) { @@ -751,6 +774,11 @@ public Task SetOcForDevice(OcProfile bundle, bool reset = f Logger.Warn(_TAG, $"Setting TDP success: {setTDP}"); setValues--; } + if(!setCV) + { + Logger.Warn(_TAG, $"Setting voltage success: {setCV}"); + setValues--; + } if (setValues == valuesToSet) ret = RigManagementReturn.Success; else if (setValues != 0 && setValues < valuesToSet) ret = RigManagementReturn.PartialSuccess; @@ -765,10 +793,8 @@ public Task SetOcForDevice(OcProfile bundle, bool reset = f } public Task ResetOcForDevice() { - var defCC = ComputeDevice.CoreClockRange; - var defMC = ComputeDevice.MemoryClockRange; var defTDP = ComputeDevice.TDPLimits; - var bundle = new OcProfile() { CoreClock = defCC.def, MemoryClock = defMC.def, TDP = (int)defTDP.def }; + var bundle = new OcProfile() { TDP = (int)defTDP.def }; // tdp is only value without reset var res = SetOcForDevice(bundle, true); return Task.FromResult(res.Result); } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 2cce3961c..5cc4614a9 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -3,6 +3,7 @@ using NHM.Common.Enums; using NHM.DeviceMonitoring; using NHM.DeviceMonitoring.Core_clock; +using NHM.DeviceMonitoring.Core_voltage; using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.TDP; using NHM.UUID; @@ -349,6 +350,7 @@ public int PreferredMemoryClock return -1; } } + public (uint min, uint max, uint def) TDPLimits { get @@ -361,6 +363,7 @@ public int PreferredMemoryClock return (0, 0, 0); } } + public (bool ok, int min, int max, int def) CoreClockRange { get @@ -373,6 +376,7 @@ public int PreferredMemoryClock return (false, -1, -1, -1); } } + public (bool ok, int min, int max, int def) MemoryClockRange { get @@ -398,6 +402,28 @@ public int PreferredMemoryClock return (false, -1, -1, -1); } } + + public int CoreVoltage + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreVoltage get) return get.CoreVoltage; + return -1; + } + } + + public (bool ok, int min, int max, int def) CoreVoltageRange + { + get + { + if (!GlobalDeviceSettings.Instance.DisableDeviceStatusMonitoring && DeviceMonitor != null && DeviceMonitor is ICoreVoltageRange get) + { + var ret = get.CoreVoltageRange; + return (ret.ok, ret.min, ret.max, ret.def); + } + return (false, -1, -1, -1); + } + } #endregion Getters #region Setters @@ -432,6 +458,26 @@ public bool ResetFanSpeed() if (DeviceMonitor is IResetFanSpeed set) return set.ResetFanSpeedPercentage(); return false; } + public bool SetCoreVoltage(int voltage) + { + if (DeviceMonitor is ICoreVoltageSet set) return set.SetCoreVoltage(voltage); + return false; + } + public bool ResetCoreVoltage() + { + if(DeviceMonitor is ICoreVoltageSet set) return set.ResetCoreVoltage(); + return false; + } + public bool ResetCoreClock() + { + if (DeviceMonitor is ICoreClockSet set) return set.ResetCoreClock(); + return false; + } + public bool ResetMemoryClock() + { + if (DeviceMonitor is IMemoryClockSet set) return set.ResetMemoryClock(); + return false; + } #endregion @@ -811,11 +857,7 @@ public async Task AfterStartMining() { var target = AlgorithmSettings.Where(a => a.IsCurrentlyMining)?.FirstOrDefault(); if (target == null) return; - //if elp bundle then do a reset before applying new thing - - //this method eliminates multiple times calls - //we can iterate if we have anything to apply later - foreach (var action in target.RigManagementActions) //can be added to while in here!!!!! + foreach (var action in target.RigManagementActions) { switch (action) { @@ -845,12 +887,9 @@ public async Task AfterStartMining() State = DeviceState.Mining; break; case AlgorithmContainer.ActionQueue.ApplyFan: - //var retFan = await target.SetFanForDevice(target.ActiveFanProfile, false); - //if (retFan == RigManagementReturn.Fail) target.SwitchFanToInactive(); break; case AlgorithmContainer.ActionQueue.ResetFan: if (IsTesting) break; - //var resetFan = await target.ResetFanForDevice(); target.SwitchFanToInactive(); ResetFanSpeed(); State = DeviceState.Mining; @@ -858,14 +897,10 @@ public async Task AfterStartMining() case AlgorithmContainer.ActionQueue.ApplyFanTest: if (target.HasTestProfileAndCanSet() && target.ActiveFanTestProfile != null) { - //var retFanTest = await target.SetFanForDevice(target.ActiveFanTestProfile, false); - //if (retFanTest == RigManagementReturn.Success || retFanTest == RigManagementReturn.PartialSuccess) State = DeviceState.Testing; - //else target.SwitchFanTestToInactive(); State = DeviceState.Testing; } break; case AlgorithmContainer.ActionQueue.ResetFanTest: - //var resetFanTest = await target.ResetFanForDevice(); target.SwitchFanTestToInactive(); ResetFanSpeed(); State = DeviceState.Mining; diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 5b096cee8..f7d87bf03 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -5,6 +5,7 @@ using NHM.Common.Enums; using NHM.DeviceMonitoring; using NHM.DeviceMonitoring.Core_clock; +using NHM.DeviceMonitoring.Core_voltage; using NHM.DeviceMonitoring.Memory_clock; using NHM.DeviceMonitoring.TDP; using NHMCore.Configs; @@ -103,6 +104,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get (nameof(ICoreClock), ICoreClock g) => $"{g.CoreClock}", (nameof(IMemoryClock), IMemoryClock g) => $"{g.MemoryClock}", (nameof(ITDP), ITDP g) => $"{g.TDPPercentage}", + (nameof(ICoreVoltage), ICoreVoltage g) => $"{g.CoreVoltage}", (_, _) => null, }; @@ -136,6 +138,7 @@ private static (List<(string name, string? unit)> properties, JArray values) Get pairOrNull(DeviceDynamicProperties.PowerUsage, "Power usage","W"), pairOrNull(DeviceDynamicProperties.CoreClock, "Core clock", "MHz"), pairOrNull(DeviceDynamicProperties.MemClock, "Memory clock", "MHz"), + pairOrNull(DeviceDynamicProperties.CoreVoltage, "Core voltage", "mV"), pairOrNull(DeviceDynamicProperties.TDP, "Power Limit", "%"), pairOrNull(DeviceDynamicProperties.NONE, "Miner", null), pairOrNull(DeviceDynamicProperties.NONE, "OC profile", null), @@ -155,7 +158,7 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u { if (dynamicVal.unit == String.Empty) return false; var ok = Int32.TryParse(dynamicVal.value, out var res); - if (ok && res < 0 && !dynamicVal.name.Contains("clock")) return true; + if (ok && res < 0 && (!dynamicVal.name.Contains("clock") || (!dynamicVal.name.Contains("voltage")))) return true; return false; }; deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); @@ -622,7 +625,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = ccLimDelta.CoreClockRangeDelta; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Core Clock Delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Core clock delta", Unit = "MHz", Def = lims.def, Range = (lims.min, lims.max) }); } } if (d.DeviceType == DeviceType.AMD && d.DeviceMonitor is ICoreClockRange ccLim) @@ -630,7 +633,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = ccLim.CoreClockRange; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Core Clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = lims.def, Range = (lims.min, lims.max) }); } } } @@ -641,7 +644,7 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = mcLimDelta.MemoryClockRangeDelta; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Memory Clock Delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Memory clock delta", Unit = "MHz", Def = lims.def, Range = (lims.min, lims.max) }); } } if (d.DeviceType == DeviceType.AMD && d.DeviceMonitor is IMemoryClockRange mcLim) @@ -649,10 +652,18 @@ private static string GetLimitsForDevice(ComputeDevice d) var lims = mcLim.MemoryClockRange; if (lims.ok) { - limit.limits.Add(new Limit { Name = "Memory Clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + limit.limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = lims.def, Range = (lims.min, lims.max) }); } } } + if(d.DeviceMonitor is ICoreVoltageSet && d.DeviceMonitor is ICoreVoltageRange cvRange) + { + var lims = cvRange.CoreVoltageRange; + if (lims.ok && d.DeviceMonitor is ICoreVoltage cvGet) + { + limit.limits.Add(new Limit { Name = "Core Voltage", Unit = "uV", Def = cvGet.CoreVoltage, Range = (lims.min, lims.max) }); + } + } var json = JsonConvert.SerializeObject(limit); return json; } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index c90b91704..e87fcb95d 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -609,15 +609,17 @@ public class ElpProfile : GenericProfile public class OcProfile : GenericProfile { [JsonProperty("core_clock")] - public int CoreClock { get; set; } + public int? CoreClock { get; set; } [JsonProperty("core_clock_delta")] - public int CoreClockDelta { get; set; } + public int? CoreClockDelta { get; set; } [JsonProperty("memory_clock")] - public int MemoryClock { get; set; } + public int? MemoryClock { get; set; } [JsonProperty("memory_clock_delta")] - public int MemoryClockDelta { get; set; } - [JsonProperty("power_mode")] - public int TDP { get; set; } + public int? MemoryClockDelta { get; set; } + [JsonProperty("power_limit")] + public int? TDP { get; set; } + [JsonProperty("core_voltage")] + public int? CoreVoltage { get; set; } } public class FanProfile : GenericProfile { From 2a65e5a38424fb822addbdfb7fc4b4d927205628 Mon Sep 17 00:00:00 2001 From: object99 Date: Mon, 13 Feb 2023 08:53:08 +0100 Subject: [PATCH 074/224] ws4 relogin working --- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 09faadebd..d5e75058b 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -318,6 +318,7 @@ static public void ResetCredentials(string btc = null, string worker = null, str static public void SetCredentials(string btc = null, string worker = null, string group = null) { + if (CachedState != null) CachedState = null; _login = MessageParserV4.CreateLoginMessage(btc, worker, ApplicationStateManager.RigID(), AvailableDevices.Devices.SortedDevices()); if (!string.IsNullOrEmpty(btc)) _login.Btc = btc; if (worker != null) _login.Worker = worker; From 1645211217018ed65ed9a37f434035ed4dc84c4d Mon Sep 17 00:00:00 2001 From: Z1gismundus Date: Mon, 13 Feb 2023 09:18:57 +0100 Subject: [PATCH 075/224] NL-2173 Set benchmarks speed --- src/NHMCore/Mining/AlgorithmContainer.cs | 1 + src/NHMCore/Mining/ComputeDevice.cs | 15 ++++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 101 ++++++++++++++++++++++- src/NHMCore/Nhmws/V4/MessagesV4.cs | 37 +++++++++ src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 1 + 5 files changed, 154 insertions(+), 1 deletion(-) diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 7b2bc1342..5afc0133d 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -174,6 +174,7 @@ public double BenchmarkSpeed Algorithm.Speeds[0] = value; UpdateConfigVersionIfNeeded(); NotifySpeedChanged(); + Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); } } diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index bd30a0767..4d8492df9 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -183,6 +183,21 @@ public int ApplyNewAlgoStates(MinerAlgoState state) return 0; } + public int ApplyNewAlgoSpeeds(MinerAlgoSpeed speed) + { + foreach (var miner in speed.Miners) + { + foreach (var algo in miner.Combinations) + { + var targets = AlgorithmSettings.Where(a => a.AlgorithmName == algo.Id && a.PluginName == miner.Id)?.ToList(); + if (targets == null) continue; + targets.ForEach(t => t.BenchmarkSpeed = Convert.ToDouble(algo.Algos.FirstOrDefault().Speed)); + } + } + Task.Run(async () => NHWebSocketV4.UpdateMinerStatus()); + return 0; + } + private List PluginAlgorithmSettings { get; set; } = new List(); public double MinimumProfit { get; set; } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 553142829..13ec6f70d 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -201,6 +201,27 @@ List getOptionalMutableProperties(ComputeDevice d) }, ComputeDev = d }); + optionalProperties.Add(new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Benchmark settings", + DefaultValue = "", + Range = (8092, ""), + ExecuteTask = async (object p) => + { + if (p is not string prop) return -1; + var newSpeed = JsonConvert.DeserializeObject(prop); + return d.ApplyNewAlgoSpeeds(newSpeed); + }, + GetValue = () => + { + var ret = string.Empty; + ret += GetMinersSpeedsForDeviceDynamic(d); + return ret; + }, + ComputeDev = d + }); if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); return optionalProperties .Where(p => p != null) @@ -351,7 +372,7 @@ List getOptionalMutableProperties() DisplayGroup = 0, DisplayName = "Scheduler settings", DefaultValue = "", - Range = (4096, String.Empty), + Range = (4096, string.Empty), GetValue = () => { string ret = SchedulesManager.Instance.ScheduleToJSON(); @@ -374,6 +395,46 @@ List getOptionalMutableProperties() _ = Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); return "Schedules added"; } + }, + new OptionalMutablePropertyString + { + PropertyID = OptionalMutableProperty.NextPropertyId(), + DisplayGroup = 0, + DisplayName = "Benchmark settings", + DefaultValue = "", + Range = (8092, string.Empty), + GetValue = () => + { + var ret = string.Empty; + var minerSpeedsGlobal = new MinerAlgoSpeedRig(); + var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null); + if(mutables == null || mutables.Count() <= 0) return ret; + foreach (var mutable in mutables) + { + if (mutable.GetValue() is not string val) continue; + minerSpeedsGlobal.Miners.Add(JsonConvert.DeserializeObject(val)); + } + ret += JsonConvert.SerializeObject(minerSpeedsGlobal); + return ret; + }, + ExecuteTask = async (object p) => + { + if(p is not string prop) return -1; + var newSpeeds = JsonConvert.DeserializeObject(prop); + //for each device thats inside apply new algo state + var devices = AvailableDevices.Devices.Where(d => newSpeeds.Miners.Any(m => m.DeviceID.Contains(d.B64Uuid))); + if(devices == null) return -2; + var successCount = 0; + foreach(var ns in newSpeeds.Miners) + { + var targetDev = AvailableDevices.Devices.FirstOrDefault(d => d.B64Uuid == ns.DeviceID); + if(targetDev == null) continue; + var tempRes = targetDev.ApplyNewAlgoSpeeds(ns); + if(tempRes != 0) continue; + successCount++; + } + return successCount == newSpeeds.Miners.Count ? 0 : -3; + } } }; if (isLogin) optionalProperties.ForEach(i => ActionMutableMap.MutableList.Add(i)); @@ -568,6 +629,44 @@ private static string GetMinersForDeviceDynamic(ComputeDevice d) var json = JsonConvert.SerializeObject(minersObject); return json; } + + private static string GetMinersSpeedsForDeviceDynamic(ComputeDevice d) + { + var minersObject = new MinerAlgoSpeed(); + var containers = d.AlgorithmSettings; + if (containers == null) return string.Empty; + var grouped = containers.GroupBy(c => c.PluginName).ToList(); + if (grouped == null) return string.Empty; + foreach (var group in grouped) + { + var combinations = new List(); + foreach (var algo in group) + { + var algorithms = new List() + { + new AlgoSpeed() + { + Id = Convert.ToString((int)algo.IDs[0]), + Speed = algo.BenchmarkSpeed.ToString() + } + + }; + var combination = new Combination() + { + Id = algo.AlgorithmName, + Algos = algorithms + }; + combinations.Add(combination); + } + var miner = new MinerSpeedDynamic() { Id = group.Key, Combinations = combinations }; + minersObject.Miners.Add(miner); + } + minersObject.DeviceID = d.B64Uuid; + minersObject.DeviceName = d.Name; + var json = JsonConvert.SerializeObject(minersObject); + return json; + } + private static string GetMinersForDeviceStatic(ComputeDevice d) { MinersStatic miners = new MinersStatic(); diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index 3741886ea..e84f89ed7 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -533,6 +533,20 @@ public class MinerAlgoStateRig [JsonProperty("devices")] public List Miners { get; set; } = new List(); } + public class MinerAlgoSpeed + { + [JsonProperty("miners")] + public List Miners { get; set; } = new List(); + [JsonProperty("device_id")] + public string DeviceID { get; set; } + [JsonProperty("device_name")] + public string DeviceName { get; set; } + } + public class MinerAlgoSpeedRig + { + [JsonProperty("devices")] + public List Miners { get; set; } = new(); + } public class MinerDynamic { [JsonProperty("id")] @@ -542,6 +556,13 @@ public class MinerDynamic [JsonProperty("algorithms")] public List Algos { get; set; } = new List(); } + public class MinerSpeedDynamic + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("combination")] + public List Combinations { get; set; } = new List(); + } internal class MinersStatic { [JsonProperty("miners")] @@ -562,6 +583,22 @@ public class Algo public bool? Enabled { get; set; } } + public class AlgoSpeed + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("speed", NullValueHandling = NullValueHandling.Ignore)] + public string? Speed { get; set; } + } + + public class Combination + { + [JsonProperty("id")] + public string Id { get; set; } + [JsonProperty("algorithm")] + public List Algos { get; set; } = new List(); + } + public class Bundle { [JsonProperty("id")] diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 1bae27ed9..89e669ff4 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -903,6 +903,7 @@ public static Task UpdateMinerStatus() _sendQueue.EnqueueParams((MessageType.SEND_MESSAGE_STATUS, minerStatusJsonStr)); return Task.CompletedTask; } + private static Task ExecuteProfilesBundleSet(Bundle bundle) { BundleManager.SetBundleInfo(bundle.Name, bundle.Id); From ddf574837036f11204abc957d66e32a4364574bb Mon Sep 17 00:00:00 2001 From: object99 Date: Mon, 13 Feb 2023 14:51:17 +0100 Subject: [PATCH 076/224] fixed status messages duplicating --- src/NHMCore/Nhmws/ActionMutableMap.cs | 5 +++++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 4 ++-- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 10 ++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/NHMCore/Nhmws/ActionMutableMap.cs b/src/NHMCore/Nhmws/ActionMutableMap.cs index d44e9631e..6a4d4085f 100644 --- a/src/NHMCore/Nhmws/ActionMutableMap.cs +++ b/src/NHMCore/Nhmws/ActionMutableMap.cs @@ -24,5 +24,10 @@ public static OptionalMutableProperty FindMutableOrNull(int propID) if (mutableRecord != null) return mutableRecord; return null; } + public static void ResetArrays() + { + ActionList.Clear(); + MutableList.Clear(); + } } } diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index dec50962a..ec2e2b31f 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -340,7 +340,7 @@ List getOptionalMutableProperties() { string ret = string.Empty; var minersSettingsGlobal = new MinerAlgoStateRig(); - var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null); + var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null && m.DisplayName == "Miners settings"); if(mutables == null || mutables.Count() <= 0) return ret; foreach (var mutable in mutables) { @@ -430,7 +430,7 @@ List getOptionalMutableProperties() { var ret = string.Empty; var minerSpeedsGlobal = new MinerAlgoSpeedRig(); - var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null); + var mutables = ActionMutableMap.MutableList.Where(m => m.ComputeDev != null && m.DisplayName == "Benchmark settings"); if(mutables == null || mutables.Count() <= 0) return ret; foreach (var mutable in mutables) { diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 826ce6d28..221462939 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -318,6 +318,7 @@ static public void ResetCredentials(string btc = null, string worker = null, str static public void SetCredentials(string btc = null, string worker = null, string group = null) { + ActionMutableMap.ResetArrays(); if (CachedState != null) CachedState = null; _login = MessageParserV4.CreateLoginMessage(btc, worker, ApplicationStateManager.RigID(), AvailableDevices.Devices.SortedDevices()); if (!string.IsNullOrEmpty(btc)) _login.Btc = btc; @@ -413,12 +414,17 @@ private static string CreateMinerStatusMessage() { var nextState = MessageParserV4.GetMinerState(_login.Worker, AvailableDevices.Devices.SortedDevices()); var shrinkedState = new MinerState(); - if (CachedState != null) + var json = string.Empty; + if (CachedState != null) //if we have something cached { shrinkedState = GetDeltaProperties(CachedState, nextState); + json = JsonConvert.SerializeObject(shrinkedState); + } + else + { + json = JsonConvert.SerializeObject(nextState); } CachedState = nextState; - var json = JsonConvert.SerializeObject(shrinkedState); return json; } From 3b4fd3f0493c2965cf4c687c009c2b4006d2c568 Mon Sep 17 00:00:00 2001 From: object99 Date: Tue, 14 Feb 2023 11:49:04 +0100 Subject: [PATCH 077/224] started on events --- .../ApplicationStateManager.Mining.cs | 3 + src/NHMCore/Mining/ComputeDevice.cs | 4 + src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 5 + .../Notifications/AvailableNotifications.cs | 2 + src/NHMCore/Notifications/EventManager.cs | 97 +++++++++++++++++++ 5 files changed, 111 insertions(+) create mode 100644 src/NHMCore/Notifications/EventManager.cs diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs index c380c22c1..1037d6dfe 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs @@ -3,6 +3,7 @@ using NHM.Common.Enums; using NHMCore.Mining; using NHMCore.Nhmws; +using NHMCore.Notifications; using NHMCore.Utils; using System; using System.Collections.Generic; @@ -19,6 +20,7 @@ static partial class ApplicationStateManager // TODO add check for any enabled algorithms public static async Task<(bool started, string failReason)> StartAllAvailableDevicesTask() { + EventManager.Instance.AddEvent(EventManager.EventType.RigStarted); // TODO consider trying to start the error state devices as well var devicesToStart = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Stopped); if (devicesToStart.Count() == 0) @@ -86,6 +88,7 @@ static partial class ApplicationStateManager public static async Task<(bool stopped, string failReason)> StopAllDevicesTask() { + EventManager.Instance.AddEvent(EventManager.EventType.RigStopped); // TODO when starting and stopping we are not taking Pending and Error states into account #if NHMWS4 var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Testing); diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 1217023a3..d4a7472cd 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -12,6 +12,7 @@ using NHMCore.Configs.Data; using NHMCore.Nhmws; using NHMCore.Nhmws.V4; +using NHMCore.Notifications; using System; using System.Collections.Generic; using System.ComponentModel; @@ -57,6 +58,9 @@ internal set StartState = false; State = value ? DeviceState.Stopped : DeviceState.Disabled; OnPropertyChanged(); + if (Uuid == null || Uuid == string.Empty || Uuid == "-1") return; //initial stuff + var eventType = value ? EventManager.EventType.DeviceEnabled : EventManager.EventType.DeviceDisabled; + EventManager.Instance.AddEvent(eventType); } } diff --git a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs index 221462939..62a03a3ab 100644 --- a/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs +++ b/src/NHMCore/Nhmws/V4/NHWebSocketV4.cs @@ -7,6 +7,7 @@ using NHMCore.Configs; using NHMCore.Configs.Managers; using NHMCore.Mining; +using NHMCore.Notifications; using NHMCore.Switching; using NHMCore.Utils; using System; @@ -831,6 +832,10 @@ async Task systemDump() _ = ExecuteProfilesBundleSet(bundle); MiningState.Instance.CalculateDevicesStateChange(); (err, result) = (ErrorCode.NoError, "OK"); + if(err == ErrorCode.NoError) + { + EventManager.Instance.AddEvent(EventManager.EventType.BundleApplied); + } break; case SupportedAction.ActionProfilesBundleReset: if (!Helpers.IsElevated) diff --git a/src/NHMCore/Notifications/AvailableNotifications.cs b/src/NHMCore/Notifications/AvailableNotifications.cs index 5e261803b..a28a80e36 100644 --- a/src/NHMCore/Notifications/AvailableNotifications.cs +++ b/src/NHMCore/Notifications/AvailableNotifications.cs @@ -170,6 +170,7 @@ public static void CreateEnableLargePagesInfo() public static void CreateIncreaseVirtualMemoryInfo() { + EventManager.Instance.AddEvent(EventManager.EventType.VirtualMemory); var notification = new Notification(NotificationsType.Warning, NotificationsGroup.VirtualMemory, Tr("Increase virtual memory"), Tr("NiceHash Miner recommends increasing virtual memory size so that all algorithms would work fine. Would you like to increase virtual memory?")); notification.Action = AvailableActions.ActionVisitMemoryHelp(); notification.NotificationUUID = Enum.GetName(typeof(NotificationsGroup), NotificationsGroup.VirtualMemory); @@ -178,6 +179,7 @@ public static void CreateIncreaseVirtualMemoryInfo() public static void CreateFailedBenchmarksInfo(ComputeDevice device) { + EventManager.Instance.AddEvent(EventManager.EventType.BenchmarkFailed); var notification = new Notification(NotificationsType.Info, NotificationsGroup.FailedBenchmarks, Tr("Failed benchmarks"), Tr("Some benchmarks for {0} failed to execute. Check benchmark tab for more info.", device.Name)); notification.Action = AvailableActions.ActionFailedBenchmarksHelp(); notification.NotificationUUID = Enum.GetName(typeof(NotificationsGroup), NotificationsGroup.FailedBenchmarks); diff --git a/src/NHMCore/Notifications/EventManager.cs b/src/NHMCore/Notifications/EventManager.cs new file mode 100644 index 000000000..7718eb8f6 --- /dev/null +++ b/src/NHMCore/Notifications/EventManager.cs @@ -0,0 +1,97 @@ +using Newtonsoft.Json; +using NHM.Common; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Notifications +{ + internal class EventManager + { + public static EventManager Instance { get; } = new EventManager(); + private string TAG = "EventManager"; + private static readonly object _lock = new object(); + private static readonly object _lock2 = new object(); + private readonly string _eventFile = Paths.RootPath("logs","events.json"); + private List _events = new List(); + public class Event + { + public int ID; + public int? DeviceID; + public DateTime DateTime; + public string Content; + } + private EventManager() + { + try + { + using StreamReader reader = new(_eventFile); + var text = reader.ReadToEnd(); + var existingRecord = JsonConvert.DeserializeObject>(text); + if (existingRecord != null) Events = existingRecord; + } + catch (Exception e) + { + Logger.Warn(TAG, e.Message); + } + } + public List Events + { + get + { + lock (_lock) + { + return _events; + } + } + set + { + lock (_lock) + { + _events = value; + } + } + } + public void AddEvent(EventType type, string content = "") + { + lock (_lock2) + { + var now = DateTime.Now; + Events.Add(new Event() {ID = (int)type, DateTime = now, Content = content }); + var events = JsonConvert.SerializeObject(Events); + using StreamWriter w = File.CreateText(_eventFile); + w.Write(events); + } + } + public enum EventType + { + Unknown = 0, + RigStarted = 1, + RigStopped = 2, + DeviceEnabled = 3, + DeviceDisabled = 4, + RigRestart = 5, + Unknown1 = 6, + PluginFailiure = 7, + MissingFiles = 8, + VirtualMemory = 9, + GeneralConfigErr = 10, + Unknown2 = 11, + DriverCrash = 12, + DeviceOverheat = 13, + MissingDev = 14, + AlgoSwitch = 15, + AlgoEnabled = 16, + AlgoDisabled = 17, + TestOverClockApplied = 18, + TestOverClockFailed = 19, + BundleApplied = 20, + Unknown3 = 21, + BenchmarkFailed = 22, + } + } +} From b1e4914ddf663ac0ccf5c9a6dc9fa20c642f6faf Mon Sep 17 00:00:00 2001 From: object99 Date: Wed, 15 Feb 2023 12:45:57 +0100 Subject: [PATCH 078/224] updated gui for event viewing --- src/NHM.DeviceDetection/DeviceDetection.cs | 26 +++--- .../ApplicationStateManager.Init.cs | 3 +- .../ApplicationStateManager.Mining.cs | 4 +- .../ApplicationStateManager.Timers.cs | 3 +- src/NHMCore/Mining/AlgorithmContainer.cs | 4 + src/NHMCore/Mining/ComputeDevice.cs | 4 +- src/NHMCore/Mining/MiningManager.cs | 5 +- src/NHMCore/Nhmws/V4/NHWebSocketV4.cs | 5 +- .../Notifications/AvailableNotifications.cs | 4 +- src/NHMCore/Notifications/EventManager.cs | 90 ++++++++++++------- src/NHMCore/Notifications/EventType.cs | 35 ++++++++ .../Views/Notifications/Notifications.xaml | 71 ++++++++++++++- .../Views/Notifications/Notifications.xaml.cs | 12 +++ 13 files changed, 209 insertions(+), 57 deletions(-) create mode 100644 src/NHMCore/Notifications/EventType.cs diff --git a/src/NHM.DeviceDetection/DeviceDetection.cs b/src/NHM.DeviceDetection/DeviceDetection.cs index 0c58822cb..ab3abac51 100644 --- a/src/NHM.DeviceDetection/DeviceDetection.cs +++ b/src/NHM.DeviceDetection/DeviceDetection.cs @@ -282,13 +282,13 @@ public static IEnumerable GetDetectedDevices() } // We check only missing from inital detection. Case like device poping back is not covered (ultra rare case) - public static async Task CheckIfMissingGPUs() + public static async Task<(bool isMissing, List uuids)> CheckIfMissingGPUs() { - async Task anyMissingCUDA_Devices() + async Task<(bool isMissing, List uuids)> anyMissingCUDA_Devices() { try { - if (!DetectionResult.HasCUDADevices) return false; + if (!DetectionResult.HasCUDADevices) return (false, new List()); var cudaQueryResult = await CUDADetector.TryQueryCUDADevicesAsync(); var supportedCudaDevices = cudaQueryResult.parsed.CudaDevices .Select(CUDADetector.Transform) @@ -299,20 +299,20 @@ async Task anyMissingCUDA_Devices() if (missing.Any()) { Logger.Error(Tag, $"CUDA missing devices:\n{string.Join("\n", missing.Select(dev => $"\t{dev.UUID}"))}"); - return true; + return (true, missing.Select(dev => dev.UUID).ToList()); } } catch (Exception e) { Logger.Error(Tag, $"CUDA CheckIfMissingDevices error: {e}"); } - return false; + return (false, new List()); } - async Task anyMissingAMD_Devices() + async Task<(bool isMissing, List uuids)> anyMissingAMD_Devices() { try { - if (!DetectionResult.HasAMDDevices) return false; + if (!DetectionResult.HasAMDDevices) return (false, new List()); var amdDevices = await AMD.AMDDetector.TryQueryAMDDevicesAsync(DetectionResult.AvailableVideoControllers.ToList()); var amdDevicesUUIDs = amdDevices .Select(dev => dev.UUID) @@ -321,16 +321,22 @@ async Task anyMissingAMD_Devices() if (missing.Any()) { Logger.Error(Tag, $"AMD missing devices:\n{string.Join("\n", missing.Select(dev => $"\t{dev.UUID}"))}"); - return true; + return (true, missing.Select(dev => dev.UUID).ToList()); } } catch (Exception e) { Logger.Error(Tag, $"AMD CheckIfMissingDevices error: {e}"); } - return false; + return (false, new List()); } - return await anyMissingCUDA_Devices() || await anyMissingAMD_Devices(); + var amdsMissing = await anyMissingAMD_Devices(); + var nvsMissing = await anyMissingCUDA_Devices(); + if(!amdsMissing.isMissing && !nvsMissing.isMissing) + { + return (false, new List()); + } + return (true, nvsMissing.uuids.Concat(amdsMissing.uuids).ToList()); } } } diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs index b5768bffc..a5ad5fc78 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Init.cs @@ -21,7 +21,7 @@ namespace NHMCore { static partial class ApplicationStateManager { - private static bool isInitFinished = false; + public static bool isInitFinished = false; private class LoaderConverter : IStartupLoader { @@ -54,6 +54,7 @@ int nextProgPerc() if (perc > 100) return 100; return perc; }; + EventManager.Init(); NotificationsManager.Instance.ReadLoggedNotifications(); // STEP // Checking System Memory diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs index 1037d6dfe..647999bd7 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Mining.cs @@ -20,7 +20,7 @@ static partial class ApplicationStateManager // TODO add check for any enabled algorithms public static async Task<(bool started, string failReason)> StartAllAvailableDevicesTask() { - EventManager.Instance.AddEvent(EventManager.EventType.RigStarted); + EventManager.AddEvent(EventType.RigStarted); // TODO consider trying to start the error state devices as well var devicesToStart = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Stopped); if (devicesToStart.Count() == 0) @@ -88,7 +88,7 @@ static partial class ApplicationStateManager public static async Task<(bool stopped, string failReason)> StopAllDevicesTask() { - EventManager.Instance.AddEvent(EventManager.EventType.RigStopped); + EventManager.AddEvent(EventType.RigStopped); // TODO when starting and stopping we are not taking Pending and Error states into account #if NHMWS4 var devicesToStop = AvailableDevices.Devices.Where(dev => dev.State == DeviceState.Mining || dev.State == DeviceState.Benchmarking || dev.State == DeviceState.Testing); diff --git a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs index 637d3bd65..79310a000 100644 --- a/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs +++ b/src/NHMCore/ApplicationStateManager/ApplicationStateManager.Timers.cs @@ -75,7 +75,7 @@ private static void StartComputeDevicesCheckTimer() // because of some reason (especially when algo switching occure) CUDA devices are dissapiring from system // creating tons of problems e.g. miners stop mining, lower rig hashrate etc. var hasMissingGPUs = await DeviceDetection.CheckIfMissingGPUs(); - if (!hasMissingGPUs) return; + if (!hasMissingGPUs.isMissing) return; if (GlobalDeviceSettings.Instance.RestartMachineOnLostGPU) { Logger.Info("ApplicationStateManager.Timers", $"Detected missing GPUs will execute 'OnGPUsLost.bat'"); @@ -97,6 +97,7 @@ private static void StartComputeDevicesCheckTimer() { Logger.Info("ApplicationStateManager.Timers", $"Detected missing GPUs"); AvailableNotifications.CreateMissingGPUsInfo(); + EventManager.AddEvent(EventType.MissingDev, String.Join(',',hasMissingGPUs.uuids)); } }, 5 * 60 * 1000); // check every 5 minutes diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index d510e8024..0b2e6977b 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -8,6 +8,7 @@ using NHMCore.Configs.Managers; using NHMCore.Mining.Plugins; using NHMCore.Nhmws.V4; +using NHMCore.Notifications; using System; using System.Collections.Generic; using System.Linq; @@ -243,6 +244,9 @@ public virtual bool Enabled OnPropertyChanged(); OnPropertyChanged(nameof(Status)); Task.Run(async () => await NHWebSocketV4.UpdateMinerStatus()); + if (MinerUUID == null || MinerUUID == string.Empty) return; //initial stuff + var notifType = value ? EventType.AlgoEnabled : EventType.AlgoDisabled; + EventManager.AddEvent(notifType, AlgorithmName); } } public void SetEnabled(bool enabled) //for enable without WS (bulk setting) diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index d4a7472cd..b3388bc74 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -59,8 +59,8 @@ internal set State = value ? DeviceState.Stopped : DeviceState.Disabled; OnPropertyChanged(); if (Uuid == null || Uuid == string.Empty || Uuid == "-1") return; //initial stuff - var eventType = value ? EventManager.EventType.DeviceEnabled : EventManager.EventType.DeviceDisabled; - EventManager.Instance.AddEvent(eventType); + var eventType = value ? EventType.DeviceEnabled : EventType.DeviceDisabled; + EventManager.AddEvent(eventType, Name); } } diff --git a/src/NHMCore/Mining/MiningManager.cs b/src/NHMCore/Mining/MiningManager.cs index 8c73da96a..2657670f4 100644 --- a/src/NHMCore/Mining/MiningManager.cs +++ b/src/NHMCore/Mining/MiningManager.cs @@ -964,7 +964,9 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary d.State == DeviceState.Mining || d.State == DeviceState.Testing)? @@ -988,7 +988,6 @@ private static async Task SwichMostProfitableGroupUpMethodTask(Dictionary systemDump() (err, result) = (ErrorCode.NoError, "OK"); if(err == ErrorCode.NoError) { - EventManager.Instance.AddEvent(EventManager.EventType.BundleApplied); + EventManager.AddEvent(EventType.BundleApplied, bundle.Name); } break; case SupportedAction.ActionProfilesBundleReset: @@ -861,6 +861,9 @@ async Task systemDump() } var oc = JsonConvert.DeserializeObject(parameters); (err, result) = ExecuteOCTest(deviceUUID, oc).Result; + var eventRet = err == ErrorCode.NoError ? EventType.TestOverClockApplied : EventType.TestOverClockFailed; + var devName = AvailableDevices.Devices.FirstOrDefault(dev => dev.B64Uuid == deviceUUID)?.Name ?? "unknown"; + EventManager.AddEvent(eventRet, devName); break; case SupportedAction.ActionOcProfileTestStop: if (!Helpers.IsElevated) diff --git a/src/NHMCore/Notifications/AvailableNotifications.cs b/src/NHMCore/Notifications/AvailableNotifications.cs index a28a80e36..336992437 100644 --- a/src/NHMCore/Notifications/AvailableNotifications.cs +++ b/src/NHMCore/Notifications/AvailableNotifications.cs @@ -170,7 +170,7 @@ public static void CreateEnableLargePagesInfo() public static void CreateIncreaseVirtualMemoryInfo() { - EventManager.Instance.AddEvent(EventManager.EventType.VirtualMemory); + EventManager.AddEvent(EventType.VirtualMemory); var notification = new Notification(NotificationsType.Warning, NotificationsGroup.VirtualMemory, Tr("Increase virtual memory"), Tr("NiceHash Miner recommends increasing virtual memory size so that all algorithms would work fine. Would you like to increase virtual memory?")); notification.Action = AvailableActions.ActionVisitMemoryHelp(); notification.NotificationUUID = Enum.GetName(typeof(NotificationsGroup), NotificationsGroup.VirtualMemory); @@ -179,7 +179,7 @@ public static void CreateIncreaseVirtualMemoryInfo() public static void CreateFailedBenchmarksInfo(ComputeDevice device) { - EventManager.Instance.AddEvent(EventManager.EventType.BenchmarkFailed); + EventManager.AddEvent(EventType.BenchmarkFailed, $"{device}"); var notification = new Notification(NotificationsType.Info, NotificationsGroup.FailedBenchmarks, Tr("Failed benchmarks"), Tr("Some benchmarks for {0} failed to execute. Check benchmark tab for more info.", device.Name)); notification.Action = AvailableActions.ActionFailedBenchmarksHelp(); notification.NotificationUUID = Enum.GetName(typeof(NotificationsGroup), NotificationsGroup.FailedBenchmarks); diff --git a/src/NHMCore/Notifications/EventManager.cs b/src/NHMCore/Notifications/EventManager.cs index 7718eb8f6..8daad90b5 100644 --- a/src/NHMCore/Notifications/EventManager.cs +++ b/src/NHMCore/Notifications/EventManager.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using NHM.Common; +using NHMCore.Configs; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,14 +11,16 @@ namespace NHMCore.Notifications { - internal class EventManager + public static class EventManager { - public static EventManager Instance { get; } = new EventManager(); - private string TAG = "EventManager"; + private static string TAG = "EventManager"; private static readonly object _lock = new object(); private static readonly object _lock2 = new object(); - private readonly string _eventFile = Paths.RootPath("logs","events.json"); - private List _events = new List(); + private static readonly string _eventFile = Paths.RootPath("logs","events.json"); + private static List _events = new List(); + private static readonly int _eventQuota = 20; + private static bool _init = false; + public class Event { public int ID; @@ -25,8 +28,9 @@ public class Event public DateTime DateTime; public string Content; } - private EventManager() + public static void Init() { + if(_init ) return; try { using StreamReader reader = new(_eventFile); @@ -38,8 +42,9 @@ private EventManager() { Logger.Warn(TAG, e.Message); } + _init = true; } - public List Events + public static List Events { get { @@ -56,42 +61,59 @@ public List Events } } } - public void AddEvent(EventType type, string content = "") + public static void AddEvent(EventType type, string content = "") { + if(!_init) return; lock (_lock2) { + if(!ApplicationStateManager.isInitFinished && + (type == EventType.DeviceEnabled || + type == EventType.DeviceDisabled || + type == EventType.AlgoEnabled || + type == EventType.AlgoDisabled)) + { + return; + } var now = DateTime.Now; - Events.Add(new Event() {ID = (int)type, DateTime = now, Content = content }); - var events = JsonConvert.SerializeObject(Events); + var eventText = GetEventText(type, content); + Events.Add(new Event() {ID = (int)type, DateTime = now, Content = eventText }); + if(Events.Count >= _eventQuota) Events.RemoveAt(0); + var events = JsonConvert.SerializeObject(Events, Formatting.Indented); using StreamWriter w = File.CreateText(_eventFile); w.Write(events); + Logger.Warn(TAG, $"Event occurred {eventText}"); + //todo send + //todo onpropertyChanged } } - public enum EventType + + private static string GetEventText(EventType type, string content = "") { - Unknown = 0, - RigStarted = 1, - RigStopped = 2, - DeviceEnabled = 3, - DeviceDisabled = 4, - RigRestart = 5, - Unknown1 = 6, - PluginFailiure = 7, - MissingFiles = 8, - VirtualMemory = 9, - GeneralConfigErr = 10, - Unknown2 = 11, - DriverCrash = 12, - DeviceOverheat = 13, - MissingDev = 14, - AlgoSwitch = 15, - AlgoEnabled = 16, - AlgoDisabled = 17, - TestOverClockApplied = 18, - TestOverClockFailed = 19, - BundleApplied = 20, - Unknown3 = 21, - BenchmarkFailed = 22, + string ret = type switch + { + EventType.Unknown => "", + EventType.RigStarted => $"Rig started mining.", + EventType.RigStopped => $"Rig stopped mining.", + EventType.DeviceEnabled => $"GPU {content} enabled.", + EventType.DeviceDisabled => $"GPU {content} disabled.", + EventType.RigRestart => $"Rebooting this rig.", + EventType.PluginFailiure => $"{content} failed to run successfully", + EventType.MissingFiles => $"Missing files. Check your antivirus software", + EventType.VirtualMemory => $"Virtual memory is low. Increase it", + EventType.GeneralConfigErr => $"Configuration error. Reinstall is suggested", + EventType.DriverCrash => $"GPU drivers crashed. Lower OC settings or reinstall the drivers", + EventType.DeviceOverheat => $"GPU(s) ({content}) are overheating.", + EventType.MissingDev => $"Missing devices ({content})", + EventType.AlgoSwitch => $"Algo switch: ({content})", + EventType.AlgoEnabled => $"Algorithm enabled: {content}", + EventType.AlgoDisabled => $"Algorithm disabled: {content}", + EventType.TestOverClockApplied => $"Test overclock applied on device {content}", + EventType.TestOverClockFailed => $"Test overclock failed on device {content}", + EventType.BundleApplied => $"Bundle {content} applied.", + EventType.BenchmarkFailed => $"Benchmark combination {content} has failed", + _ => "" + }; + return ret; } } } diff --git a/src/NHMCore/Notifications/EventType.cs b/src/NHMCore/Notifications/EventType.cs new file mode 100644 index 000000000..de90f36ff --- /dev/null +++ b/src/NHMCore/Notifications/EventType.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHMCore.Notifications +{ + public enum EventType + { + Unknown = 0, + RigStarted = 1, + RigStopped = 2, + DeviceEnabled = 3, + DeviceDisabled = 4, + RigRestart = 5, + Unknown1 = 6, + PluginFailiure = 7, + MissingFiles = 8, + VirtualMemory = 9, + GeneralConfigErr = 10, + Unknown2 = 11, + DriverCrash = 12, + DeviceOverheat = 13, + MissingDev = 14, + AlgoSwitch = 15, + AlgoEnabled = 16, + AlgoDisabled = 17, + TestOverClockApplied = 18, + TestOverClockFailed = 19, + BundleApplied = 20, + Unknown3 = 21, + BenchmarkFailed = 22, + } +} diff --git a/src/NiceHashMiner/Views/Notifications/Notifications.xaml b/src/NiceHashMiner/Views/Notifications/Notifications.xaml index f2b16e62e..b8ed27254 100644 --- a/src/NiceHashMiner/Views/Notifications/Notifications.xaml +++ b/src/NiceHashMiner/Views/Notifications/Notifications.xaml @@ -18,10 +18,58 @@ + + + + @@ -33,7 +81,7 @@ - +

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�Tk>wL~;I;RD-=7k_18 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 H+4}zgo2~<# diff --git a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs index 85ead4ba5..19d6b85ee 100644 --- a/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs +++ b/src/NHM.DeviceMonitoring/DeviceMonitorNVIDIA.cs @@ -369,13 +369,25 @@ public bool SetMemoryClock(int memoryClock) int min = 0; int max = 0; int def = 0; - var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default_delta(BusID, ref min, ref max, ref def); + var ok = NVIDIA_MON.nhm_nvidia_device_get_memory_clocks_min_max_default_delta(BusID, ref min, ref max, ref def); //problem here not found if (ok == RET_OK) return (true, min, max, def); Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_memory_clocks_min_max_default_delta failed with error code {ok}", _delayedLogging); return (false, 0, 0, 0); } } - public (bool ok, int min, int max, int def) CoreClockRangeDelta => throw new NotImplementedException(); + public (bool ok, int min, int max, int def) CoreClockRangeDelta + { + get + { + int min = 0; + int max = 0; + int def = 0; + var ok = NVIDIA_MON.nhm_nvidia_device_get_core_clocks_min_max_default_delta(BusID, ref min, ref max, ref def);//problem here not found + if(ok == RET_OK) return (true, min, max, def); + Logger.InfoDelayed(LogTag, $"nhm_nvidia_device_get_core_clocks_min_max_default_delta failed with error code {ok}", _delayedLogging); + return (false, 0, 0, 0); + } + } } } diff --git a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs index 6c7ad5894..09025fd57 100644 --- a/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs +++ b/src/NHM.DeviceMonitoring/NVIDIA/NVIDIA_MON.cs @@ -70,7 +70,7 @@ internal static class NVIDIA_MON [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_memory_controller_load(int bus_number, ref int mem_ctrl_load); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] - public static extern int nhm_nvidia_device_print_memory_timings(int bus_number); + public static extern void nhm_nvidia_device_print_memory_timings(int bus_number); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] public static extern int nhm_nvidia_device_get_core_clocks_min_max_default_absolute(int bus_number, ref int min, ref int max, ref int def); [DllImport(dll, CallingConvention = CallingConvention.StdCall)] diff --git a/src/NHMCore/Mining/AlgorithmContainer.cs b/src/NHMCore/Mining/AlgorithmContainer.cs index 2e1df49ba..31b2f0d2a 100644 --- a/src/NHMCore/Mining/AlgorithmContainer.cs +++ b/src/NHMCore/Mining/AlgorithmContainer.cs @@ -730,8 +730,10 @@ public Task SetOcForDevice(OcProfile bundle, bool reset = f return Task.FromResult(ret); } int setValues = 3; - var setCC = bundle.CoreClock <= 0 ? false : ComputeDevice.SetCoreClock(bundle.CoreClock); - var setMC = bundle.MemoryClock <= 0 ? false : ComputeDevice.SetMemoryClock(bundle.MemoryClock); + var CoreClockValue = ComputeDevice.DeviceType == DeviceType.NVIDIA ? bundle.CoreClockDelta : bundle.CoreClock; + var MemoryClockValue = ComputeDevice.DeviceType == DeviceType.NVIDIA ? bundle.MemoryClockDelta : bundle.MemoryClock; + var setCC = bundle.CoreClock <= 0 ? false : ComputeDevice.SetCoreClock(CoreClockValue); + var setMC = bundle.MemoryClock <= 0 ? false : ComputeDevice.SetMemoryClock(MemoryClockValue); var setTDP = bundle.TDP <= 0 ? false : ComputeDevice.SetPowerModeManual(bundle.TDP); if (!setCC) diff --git a/src/NHMCore/Mining/ComputeDevice.cs b/src/NHMCore/Mining/ComputeDevice.cs index 914eb78d8..284b6ed7f 100644 --- a/src/NHMCore/Mining/ComputeDevice.cs +++ b/src/NHMCore/Mining/ComputeDevice.cs @@ -314,6 +314,15 @@ public int CoreClockDelta return -1; } } + public int PreferredCoreClock + { + get + { + if (DeviceType == DeviceType.NVIDIA) return CoreClockDelta; + if (DeviceType == DeviceType.AMD) return CoreClock; + return -1; + } + } public int MemoryClock { get @@ -331,6 +340,15 @@ public int MemoryClockDelta return -1; } } + public int PreferredMemoryClock + { + get + { + if (DeviceType == DeviceType.NVIDIA) return MemoryClockDelta; + if (DeviceType == DeviceType.AMD) return MemoryClock; + return -1; + } + } public (uint min, uint max, uint def) TDPLimits { get diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 30094e936..4807eec19 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -589,27 +589,44 @@ private static string GetLimitsForDevice(ComputeDevice d) limit.limits.Add(new Limit { Name = "Power mode", Unit = "W", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); } } - if (d.DeviceMonitor is ICoreClockSet && d.DeviceMonitor is ICoreClockRange ccLim) + if (d.DeviceMonitor is ICoreClockSet) { - var lims = ccLim.CoreClockRange; - if (lims.ok) + if (d.DeviceType == DeviceType.NVIDIA && d.DeviceMonitor is ICoreClockRangeDelta ccLimDelta) { - limit.limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + var lims = ccLimDelta.CoreClockRangeDelta; + if (lims.ok) + { + limit.limits.Add(new Limit { Name = "Core clock delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } + } + if (d.DeviceType == DeviceType.AMD && d.DeviceMonitor is ICoreClockRange ccLim) + { + var lims = ccLim.CoreClockRange; + if (lims.ok) + { + limit.limits.Add(new Limit { Name = "Core clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } } } - if (d.DeviceMonitor is IMemoryClockSet && d.DeviceMonitor is IMemoryClockRange mcLim) + if (d.DeviceMonitor is IMemoryClockSet) { - var lims = mcLim.MemoryClockRange; - if (lims.ok) + if(d.DeviceType == DeviceType.NVIDIA && d.DeviceMonitor is IMemoryClockRangeDelta mcLimDelta) { - limit.limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + var lims = mcLimDelta.MemoryClockRangeDelta; + if (lims.ok) + { + limit.limits.Add(new Limit { Name = "Memory clock delta", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } + } + if(d.DeviceType == DeviceType.AMD && d.DeviceMonitor is IMemoryClockRange mcLim) + { + var lims = mcLim.MemoryClockRange; + if (lims.ok) + { + limit.limits.Add(new Limit { Name = "Memory clock", Unit = "MHz", Def = (int)lims.def, Range = ((int)lims.min, (int)lims.max) }); + } } } - //if(d.DeviceMonitor is Imemoryc && d.DeviceMonitor is IMemoryClockRange mcLimD) - //{ - // //nvidia use only DELTAS - // //here CONTINUE - //} var json = JsonConvert.SerializeObject(limit); return json; } diff --git a/src/NHMCore/Nhmws/V4/MessagesV4.cs b/src/NHMCore/Nhmws/V4/MessagesV4.cs index ce093ecbf..fb76d9aa0 100644 --- a/src/NHMCore/Nhmws/V4/MessagesV4.cs +++ b/src/NHMCore/Nhmws/V4/MessagesV4.cs @@ -253,14 +253,6 @@ public static NhmwsAction ActionFanProfileTest(string uuid) Range = (1024, "") } }, - ExecuteTask = async (object p) => - { - if (p is FanProfile fb && fb is not null) //todo fan bundle call here - { - var a = 0; - } - return 0; - }, ActionType = SupportedAction.ActionFanProfileTest, DeviceUUID = uuid }; @@ -600,8 +592,12 @@ public class OcProfile : GenericProfile { [JsonProperty("core_clock")] public int CoreClock { get; set; } + [JsonProperty("core_clock_delta")] + public int CoreClockDelta { get; set; } [JsonProperty("memory_clock")] public int MemoryClock { get; set; } + [JsonProperty("memory_clock_delta")] + public int MemoryClockDelta { get; set; } [JsonProperty("power_mode")] public int TDP { get; set; } } From 58a1b98df3a672043c56e9c1e42346a881459c05 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 16 Jan 2023 13:32:58 +0100 Subject: [PATCH 061/224] fixed edge case in building login message --- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 4807eec19..6abc90780 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -154,7 +154,7 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u { if (dynamicVal.unit == String.Empty) return false; var ok = Int32.TryParse(dynamicVal.value, out var res); - if (ok && res < 0) return true; + if (ok && res < 0 && !dynamicVal.name.Contains("delta")) return true; return false; }; deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); From 3c8a0969a5e7aeb3a50bd74b424688888e95c9cc Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Mon, 16 Jan 2023 14:56:40 +0100 Subject: [PATCH 062/224] modified removal of value --- src/NHMCore/Nhmws/V4/MessageParserV4.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NHMCore/Nhmws/V4/MessageParserV4.cs b/src/NHMCore/Nhmws/V4/MessageParserV4.cs index 6abc90780..fcfa701c8 100644 --- a/src/NHMCore/Nhmws/V4/MessageParserV4.cs +++ b/src/NHMCore/Nhmws/V4/MessageParserV4.cs @@ -154,7 +154,7 @@ bool shouldRemoveDynamicVal((DeviceDynamicProperties type, string name, string u { if (dynamicVal.unit == String.Empty) return false; var ok = Int32.TryParse(dynamicVal.value, out var res); - if (ok && res < 0 && !dynamicVal.name.Contains("delta")) return true; + if (ok && res < 0 && !dynamicVal.name.Contains("clock")) return true; return false; }; deviceOptionalDynamic.RemoveAll(dynamVal => shouldRemoveDynamicVal(dynamVal)); From c7e6e275c9cb128d30a74dd1d38bd0c5fd295dd4 Mon Sep 17 00:00:00 2001 From: alanH1998 Date: Wed, 18 Jan 2023 11:00:37 +0100 Subject: [PATCH 063/224] added re-login on plugin install/uninstall --- .../device_monitoring_nvidia.dll | Bin 473600 -> 473600 bytes .../ApplicationStateManager.cs | 2 +- .../Mining/Plugins/MinerPluginsManager.cs | 2 ++ src/NHMCore/Nhmws/V4/MessageParserV4.cs | 6 ++---- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll b/pre_compiled_libs/device_monitoring_x64/device_monitoring_nvidia.dll index 42927feafa9acdeb9a9b9bd587ab439afc7c9083..7fd171089108b5e4501311b21485be782d29f95e 100644 GIT binary patch delta 58930 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