private GpuSpeedViewModels() { if (NTMinerRoot.IsInDesignMode) { return; } this.GpuAllVm = GpuViewModels.Current.FirstOrDefault(a => a.Index == NTMinerRoot.Current.GpuAllId); IGpusSpeed gpuSpeeds = NTMinerRoot.Current.GpusSpeed; foreach (var item in gpuSpeeds) { this._list.Add(new GpuSpeedViewModel(item)); } _totalSpeedVm = this._list.FirstOrDefault(a => a.GpuVm.Index == NTMinerRoot.Current.GpuAllId); Global.Access <GpuSpeedChangedEvent>( Guid.Parse("acb2e5fd-a3ed-4ed6-b8c7-583eafd5e579"), "显卡算力变更后刷新VM内存", LogEnum.None, action: (message) => { Guid mainCoinId = NTMinerRoot.Current.MinerProfile.CoinId; if (_mainCoinId != mainCoinId) { _mainCoinId = mainCoinId; DateTime now = DateTime.Now; foreach (var item in _list) { item.MainCoinSpeed.Value = 0; item.MainCoinSpeed.SpeedOn = now; item.DualCoinSpeed.Value = 0; item.DualCoinSpeed.SpeedOn = now; } IncomeMainCoinPerDay = 0; IncomeDualCoinPerDay = 0; } int index = message.Source.Gpu.Index; GpuSpeedViewModel gpuSpeedVm = _list.FirstOrDefault(a => a.GpuVm.Index == index); if (gpuSpeedVm != null) { if (message.IsDualSpeed) { gpuSpeedVm.DualCoinSpeed.Update(message.Source.DualCoinSpeed); } else { gpuSpeedVm.MainCoinSpeed.Update(message.Source.MainCoinSpeed); } } if (index == _totalSpeedVm.GpuVm.Index) { IMineContext mineContext = NTMinerRoot.Current.CurrentMineContext; if (mineContext == null) { IncomeMainCoinPerDay = 0; IncomeDualCoinPerDay = 0; } else { if (message.IsDualSpeed) { if (mineContext is IDualMineContext dualMineContext) { IncomeDualCoinPerDay = _totalSpeedVm.DualCoinSpeed.Value * NTMinerRoot.Current.CalcConfigSet.GetIncomePerHashPerDay(dualMineContext.DualCoin); } } else { IncomeMainCoinPerDay = _totalSpeedVm.MainCoinSpeed.Value * NTMinerRoot.Current.CalcConfigSet.GetIncomePerHashPerDay(mineContext.MainCoin); } } } }); }
public SpeedChartViewModel(GpuSpeedViewModel gpuSpeedVm) { _gpuSpeedVm = gpuSpeedVm; var mapper = Mappers.Xy <MeasureModel>() .X(model => model.DateTime.Ticks) //use DateTime.Ticks as X .Y(model => model.Value); //use the value property as Y //lets save the mapper globally. Charting.For <MeasureModel>(mapper); Func <double, string> emptyDateTimeFormatter = (d) => { return(string.Empty); }; Func <double, string> emptySpeedFormatter = (d) => { return(string.Empty); }; Func <double, string> dateTimeFormatter = value => new DateTime((long)value).ToString("HH:mm"); Func <double, string> speedFormatter = value => value.ToUnitSpeedText(); //AxisStep forces the distance between each separator in the X axis double axisStep = TimeSpan.FromMinutes(1).Ticks; //AxisUnit forces lets the axis know that we are plotting Minutes //this is not always necessary, but it can prevent wrong labeling double axisUnit = TimeSpan.TicksPerMinute; ChartValues <MeasureModel> mainCoinSpeedValues = new ChartValues <MeasureModel>(); ChartValues <MeasureModel> mainCoinSpeedValuesShadow = new ChartValues <MeasureModel>(); LineSeries mainCoinSpeedLs = new LineSeries { Title = gpuSpeedVm.GpuVm.IndexText, DataLabels = false, PointGeometrySize = 0, StrokeThickness = 1, Values = mainCoinSpeedValues }; LineSeries mainCoinSpeedLsShadow = new LineSeries { Title = gpuSpeedVm.GpuVm.IndexText, DataLabels = false, PointGeometrySize = 0, StrokeThickness = 1, Values = mainCoinSpeedValuesShadow }; this.Series.Add(mainCoinSpeedLs); this.SeriesShadow.Add(mainCoinSpeedLsShadow); SolidColorBrush black = new SolidColorBrush(Colors.Black); Axis axisYMainCoin = new Axis() { LabelFormatter = emptySpeedFormatter, MinValue = 0, Separator = new Separator() }; this._axisY = new AxesCollection() { axisYMainCoin }; DateTime now = DateTime.Now; this._axisX = new AxesCollection() { new Axis() { LabelFormatter = emptyDateTimeFormatter, MaxValue = now.Ticks, MinValue = now.Ticks - TimeSpan.FromMinutes(NTMinerRoot.Current.SpeedHistoryLengthByMinute).Ticks, Unit = axisUnit, Separator = new Separator() { Step = axisStep } } }; Axis axisYShadowMainCoin = new Axis() { LabelFormatter = speedFormatter, MinValue = 0, FontSize = 14, Foreground = black, Separator = new Separator() }; this._axisYShadow = new AxesCollection() { axisYShadowMainCoin }; this._axisXShadow = new AxesCollection() { new Axis() { LabelFormatter = dateTimeFormatter, Foreground = black, MaxValue = 0, FontSize = 14, MinValue = 0, Unit = axisUnit, Separator = new Separator() { Step = axisStep } } }; }
private GpuSpeedViewModels() { if (Design.IsInDesignMode) { return; } this.GpuAllVm = GpuViewModels.Current.FirstOrDefault(a => a.Index == NTMinerRoot.GpuAllId); IGpusSpeed gpuSpeeds = NTMinerRoot.Current.GpusSpeed; foreach (var item in gpuSpeeds) { this._list.Add(new GpuSpeedViewModel(item)); } _totalSpeedVm = this._list.FirstOrDefault(a => a.GpuVm.Index == NTMinerRoot.GpuAllId); VirtualRoot.On <GpuSpeedChangedEvent>("显卡算力变更后刷新VM内存", LogEnum.DevConsole, action: (message) => { Guid mainCoinId = NTMinerRoot.Current.MinerProfile.CoinId; if (_mainCoinId != mainCoinId) { _mainCoinId = mainCoinId; DateTime now = DateTime.Now; foreach (var item in _list) { item.MainCoinSpeed.Value = 0; item.MainCoinSpeed.SpeedOn = now; item.DualCoinSpeed.Value = 0; item.DualCoinSpeed.SpeedOn = now; } IncomeMainCoinPerDay = 0; IncomeMainCoinUsdPerDay = 0; IncomeMainCoinCnyPerDay = 0; IncomeDualCoinPerDay = 0; IncomeDualCoinUsdPerDay = 0; IncomeDualCoinCnyPerDay = 0; } int index = message.Source.Gpu.Index; GpuSpeedViewModel gpuSpeedVm = _list.FirstOrDefault(a => a.GpuVm.Index == index); if (gpuSpeedVm != null) { if (message.IsDualSpeed) { gpuSpeedVm.DualCoinSpeed.Update(message.Source.DualCoinSpeed); } else { gpuSpeedVm.MainCoinSpeed.Update(message.Source.MainCoinSpeed); } } if (index == _totalSpeedVm.GpuVm.Index) { IMineContext mineContext = NTMinerRoot.Current.CurrentMineContext; if (mineContext == null) { IncomeMainCoinPerDay = 0; IncomeMainCoinUsdPerDay = 0; IncomeMainCoinCnyPerDay = 0; IncomeDualCoinPerDay = 0; IncomeDualCoinUsdPerDay = 0; IncomeDualCoinCnyPerDay = 0; } else { if (message.IsDualSpeed) { if (mineContext is IDualMineContext dualMineContext) { IncomePerDay incomePerDay = NTMinerRoot.Current.CalcConfigSet.GetIncomePerHashPerDay(dualMineContext.DualCoin.Code); IncomeDualCoinPerDay = _totalSpeedVm.DualCoinSpeed.Value * incomePerDay.IncomeCoin; IncomeDualCoinUsdPerDay = _totalSpeedVm.DualCoinSpeed.Value * incomePerDay.IncomeUsd; IncomeDualCoinCnyPerDay = _totalSpeedVm.DualCoinSpeed.Value * incomePerDay.IncomeCny; } } else { IncomePerDay incomePerDay = NTMinerRoot.Current.CalcConfigSet.GetIncomePerHashPerDay(mineContext.MainCoin.Code); IncomeMainCoinPerDay = _totalSpeedVm.MainCoinSpeed.Value * incomePerDay.IncomeCoin; IncomeMainCoinUsdPerDay = _totalSpeedVm.MainCoinSpeed.Value * incomePerDay.IncomeUsd; IncomeMainCoinCnyPerDay = _totalSpeedVm.MainCoinSpeed.Value * incomePerDay.IncomeCny; } } } }); }