private void DiscoverDevice() { var busy = _discoverBusy.ProcessStart(); _devices.Clear(); SwMainApi.Discover().Subscribe(d => _devices.Add(d), (ex) => busy.Dispose(), () => busy.Dispose()); }
private void SearchIp() { IPAddress addr; if (!IPAddress.TryParse(SearchIpAddr.Value, out addr)) { _searchFailed.OnNext(true); return; } var busy = _discoverBusy.ProcessStart(); _devices.Clear(); SwMainApi.DiscoverWithIp(addr).Subscribe(d => _devices.Add(d), (ex) => { _searchFailed.OnNext(true); busy.Dispose(); }, () => { _searchFailed.OnNext(!_devices.Any()); busy.Dispose(); }); }
public DeviceSelectDialogViewModel() { _disposables = new CompositeDisposable(); LocalAddress = SwMainApi.GetAllLocalIPv4Addresses().FirstOrDefault(); var ver = Assembly.GetCallingAssembly().GetName().Version; AppVersion = $"{ver.Major}.{ver.Minor}.{ver.Build}"; _devices = new ObservableCollection <DiscoverResult>(); Devices = _devices.ToReadOnlyReactiveCollection().AddTo(_disposables); _discoverBusy = new BusyNotifier(); DiscoverDeviceCommand = _discoverBusy.Inverse().ToReactiveCommand().AddTo(_disposables); DiscoverDeviceCommand.Delay(new TimeSpan(100)).Subscribe(_ => DiscoverDevice()).AddTo(_disposables); IsSearchIpMode = new ReactiveProperty <bool>(false).AddTo(_disposables); IsSearchIpMode.Subscribe(b => { if (b) { // Enter mode: clear fail flag. _searchFailed.OnNext(false); } else if (DiscoverDeviceCommand.CanExecute()) { // Exit mode: rescan devices. DiscoverDeviceCommand.Execute(); } }).AddTo(_disposables); _searchFailed = new BehaviorSubject <bool>(false).AddTo(_disposables); SearchFailed = _searchFailed.ToReadOnlyReactiveProperty().AddTo(_disposables); SearchIpAddr = new ReactiveProperty <string>().SetValidateAttribute(() => SearchIpAddr).AddTo(_disposables); SearchIpCommand = Observable.CombineLatest(SearchIpAddr.ObserveHasErrors, _discoverBusy, (e, c) => !e && !c) .ToReactiveCommand().AddTo(_disposables); SearchIpCommand.Subscribe(_ => SearchIp()).AddTo(_disposables); }