public DeviceMiningStats DeepCopy() { var copy = new DeviceMiningStats { // BaseStats MinerName = this.MinerName, GroupKey = this.GroupKey, Speeds = this.Speeds.ToList(), Rates = this.Rates.ToList(), PowerUsageAPI = this.PowerUsageAPI, PowerUsageDeviceReading = this.PowerUsageDeviceReading, PowerUsageAlgorithmSetting = this.PowerUsageAlgorithmSetting, // DeviceMiningStats DeviceUUID = this.DeviceUUID }; return(copy); }
private static void UpdateDeviceMiningStats(ApiData apiData, string minerUUID, string minerName, string groupKey, string deviceUuid, Dictionary <AlgorithmType, double> payingRates) { DeviceMiningStats stat; if (_devicesMiningStats.TryGetValue(deviceUuid, out stat) == false) { // create if it doesn't exist stat = new DeviceMiningStats { DeviceUUID = deviceUuid }; _devicesMiningStats[deviceUuid] = stat; } stat.Clear(); // re-set miner name and group key stat.MinerName = minerName; stat.GroupKey = groupKey; // update stat var deviceSpeedsInfo = apiData.AlgorithmSpeedsPerDevice .Where(pair => pair.Key == deviceUuid) .Select(pair => pair.Value) .FirstOrDefault(); if (deviceSpeedsInfo != null) { foreach (var speedInfo in deviceSpeedsInfo) { stat.Speeds.Add((speedInfo.AlgorithmType, speedInfo.Speed)); if (payingRates.TryGetValue(speedInfo.AlgorithmType, out var paying) == false) { continue; } var payingRate = paying * speedInfo.Speed * 0.000000001; stat.Rates.Add((speedInfo.AlgorithmType, payingRate)); } } var devicePowerUsageApi = (double)apiData.PowerUsagePerDevice .Where(pair => pair.Key == deviceUuid) .Select(pair => pair.Value) .FirstOrDefault(); stat.PowerUsageAPI = devicePowerUsageApi / 1000d; // TODO Globals var dev = AvailableDevices.GetDeviceWithUuid(deviceUuid); if (dev != null) { stat.PowerUsageDeviceReading = dev.PowerUsage; var algo = dev.GetAlgorithm(minerUUID, apiData.AlgorithmSpeedsPerDevice[dev.Uuid].Select(info => info.AlgorithmType).ToArray()); stat.PowerUsageAlgorithmSetting = algo == null ? 0d : algo.PowerUsage; } lock (_devMiningStats) { var index = _devMiningStats.IndexOf(stat); if (index < 0) { _devMiningStats.Add(stat); } else { _devMiningStats[index] = stat; } } //// TODO enable StabilityAnalyzer //// TODO not the best place but here is where we get our per device speeds //var algorithmName = string.Join("+", stat.Speeds.Select(speedPair => Enum.GetName(typeof(AlgorithmType), speedPair.type))); //var algorithmStringID = $"{algorithmName}_{minerUUID}"; //var speedID = $"{deviceUuid}-{algorithmStringID}"; //var primarySpeed = stat.Speeds.Count > 0 ? stat.Speeds[0].speed : 0d; //var secondarySpeed = stat.Speeds.Count > 1 ? stat.Speeds[1].speed : 0d; //var miningSpeed = new BenchmarkingAnalyzer.MiningSpeed //{ // PrimarySpeed = primarySpeed, // SecondarySpeed = secondarySpeed, // Timestamp = DateTime.Now //}; //BenchmarkingAnalyzer.UpdateMiningSpeeds(speedID, miningSpeed); }