public IVector GetVector(IPingResponse pingResponse, IPingStats stats) { IEnumerable <IDimensionValue> pingResponseValueX = GetPingResponseValuesX(pingResponse, r => GetStatsValue(r, stats)); //GetAddressDimensions,, pr => GetRttDimension(pr.RoundTripTime) IEnumerable <IDimensionValue> dimensionValues = pingResponseValueX; return(new Vector.Vector(dimensionValues)); }
private IEnumerable <IDimensionValue> GetStatsValue(IPingResponse pingResponse, IPingStats stats) { IEnumerable <bool?> nullableStatus = stats.StatusHistory.Cast <bool?>(); IEnumerable <IDimensionValue> statusHistoryDimensionValues = GetStatusHistoryDimensionValues(nullableStatus); DateTime?statsLastSuccess = stats.LastSuccess; DateTime?statsLastFailure = stats.LastFailure; IEnumerable <IDimensionValue> lastDims = LastDimensions(statsLastSuccess, statsLastFailure); return(statusHistoryDimensionValues.Concat(lastDims)); }
public MainWindowViewmodel(IPingTimer pingTimer, IPingService pingService, IPingCollectionVectorFactory pingCollectionVectorFactory, IPingVectorFactory pingVectorFactory, IVectorComparer vectorComparer, IIpAddressService ipAddressService, IDispatcherAccessor dispatcherAccessor, PingStatsUtil pingStatsUtil, IPingResponseUtil pingResponseUtil) { _pingTimer = pingTimer; _pingService = pingService; _pingCollectionVectorFactory = pingCollectionVectorFactory; _pingVectorFactory = pingVectorFactory; _vectorComparer = vectorComparer; _pingStatsUtil = pingStatsUtil; _pingResponseUtil = pingResponseUtil; IObservable <long> pingTimerObservable = _pingTimer.Start(() => false); IDisposable pingResponseSubscription = null; _targetDatamodels = new ConcurrentDictionary <IPAddress, PingState>(); _stats = new ConcurrentDictionary <IPAddress, PingStats>(); System.Windows.Threading.Dispatcher d = dispatcherAccessor.GetDispatcher(); Subject <int> resortSubject = new Subject <int>(); ResortObservable = resortSubject; ipAddressService.IpAddressObservable.Subscribe(ipAddresses => { pingResponseSubscription?.Dispose(); IObservable <IEnumerable <Task <IPingResponse> > > pingResponseObservable = pingTimerObservable.Select(l => _pingService.Ping(ipAddresses)); pingResponseSubscription = pingResponseObservable.Subscribe(async pingResponseTasks => { IPingResponse[] responses = await Task.WhenAll(pingResponseTasks); IVector[] vectors = responses.Select(pingResponse => { IPingStats stats = GetUpdatedStats(pingResponse); IVector pingVector = _pingVectorFactory.GetVector(pingResponse, stats); if (_targetDatamodels.TryGetValue(pingResponse.TargetIpAddress, out PingState pingState)) { TargetDatamodel targetDatamodelX = pingState.TargetDatamodel; targetDatamodelX.RoundTripTime = pingResponse.RoundTripTime; targetDatamodelX.StatusSuccess = GetStatusSuccess(pingResponse.Status); IVector boring = _pingVectorFactory.GetVector(new PingResponse(IPAddress.Loopback, TimeSpan.Zero, IPStatus.DestinationHostUnreachable, IPAddress.Loopback), new PingStats(DateTime.Now.AddDays(-1), DateTime.Now) { Average25 = 0, Average25Count = 25, StatusHistory = new bool[PingStatsUtil.MaxHistoryCount] }); double change = _vectorComparer.Compare(boring, pingVector); targetDatamodelX.Change = change; if (targetDatamodelX.Change > 0.008) { targetDatamodelX.ShowUntil = DateTime.Now.Add(TimeToShowOddTargets); } if (targetDatamodelX.ShowUntil <= DateTime.Now) { targetDatamodelX.ShowUntil = null; } pingState.Previous = pingVector; } else { TargetDatamodel targetDatamodel = new TargetDatamodel(address: pingResponse.TargetIpAddress, statusSuccess: GetStatusSuccess(pingResponse.Status), roundTripTime: pingResponse.RoundTripTime); _targetDatamodels.Add(pingResponse.TargetIpAddress, new PingState { TargetDatamodel = targetDatamodel, Previous = pingVector }); d.Invoke(() => TargetDatamodels.Add(targetDatamodel)); } return(pingVector); }).ToArray(); resortSubject.OnNext(0); }); }); TargetDatamodels = new ObservableCollection <TargetDatamodel>(); }