public DeviceWrapper(IDevice dev) { this.dev = dev; Hash = dev.UID.GetMD5Hash(); vdev = dev as IVideoDevice; if (vdev != null) { vdev.OnFrame += frame => { frame.Freeze(); LastFrame = frame; }; dev.OnError += error => LastError = error; } mdev = dev as IDeviceWithModes; sdev = dev as IDeviceWithSliderModes; ptdev = dev as IDeviceWithPanTilt; }
private void Window_SourceInitialized(object sender, EventArgs e) { Handle = new WindowInteropHelper(this).Handle; btnChangeMode.ContextMenu.Closed += (_, __) => { isBlockingClose = false; }; dev.OnError += msg => { Video.Dispatcher.Invoke(DispatcherPriority.Input, (ThreadStart)(() => { alerting = true; txtAlert.Text = "Error: " + msg; gAlert.Visibility = Visibility.Visible; })); }; var authdev = dev as IDeviceWithAuthentication; if (authdev != null) { authdev.OnCredentialsRequired += user => { DavuxLib2.Controls.CredentialsDialog cd = new DavuxLib2.Controls.CredentialsDialog(dev.Name); cd.Caption = "Connect to " + dev.Name; cd.Message = dev.Name + " requires a password."; cd.Name = user; cd.Password = ""; Dispatcher.Invoke(DispatcherPriority.Input, (ThreadStart)(() => { if (IsEnabled && cd.Show((System.Windows.Forms.IWin32Window) new Win(Handle)) == System.Windows.Forms.DialogResult.Cancel) { IsEnabled = false; Close(); } })); return(new KeyValuePair <string, string>(cd.Name, cd.Password)); }; } // Note: make sure to call this before IVideo.OnStart mdev = dev as IDeviceWithModes; if (mdev != null) { PopulateModes(); btnChangeMode.Visibility = Visibility.Visible; } ptzdev = dev as IDeviceWithPanTilt; if (ptzdev != null && ptzdev.PTSupported) { PTZ.Visibility = System.Windows.Visibility.Visible; } else { PTZ.Visibility = System.Windows.Visibility.Hidden; } var smdev = dev as IDeviceWithSliderModes; if (smdev != null) { var sliders = smdev.GetSliderModes(); foreach (var slider in sliders) { var sp = new DockPanel(); sp.LastChildFill = true; TextBlock tb = new TextBlock(); tb.Padding = new Thickness(4); tb.Text = slider.Key.Text; DockPanel.SetDock(tb, Dock.Left); sp.Children.Add(tb); Slider sl = new Slider(); sl.Tag = slider.Key; sl.Value = slider.Value; sl.PreviewMouseUp += (send, _) => { var s = (send as Slider).Tag as ISlider; (dev as IDeviceWithSliderModes).SetSliderMode(s, (int)(send as Slider).Value); }; (dev as IDeviceWithSliderModes).SliderValueChanged += (isli, value) => { Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)(() => { foreach (var ch in sp.Children) { // also TextBlock controls var sdr = ch as Slider; if (sdr != null) { var isdr = sdr.Tag as ISlider; if (isdr == isli) { sdr.Value = value; } } } })); }; sl.Maximum = slider.Key.Max; sl.Minimum = slider.Key.Min; sp.Children.Add(sl); DockPanel p = new DockPanel(); p.LastChildFill = true; DockPanel.SetDock(p, Dock.Bottom); p.Children.Add(sp); quality.Children.Insert(0, p); } } vdev = dev as IVideoDevice; if (vdev != null) { vdev.OnFrame += frame => { frame.Freeze(); Video.Dispatcher.Invoke(DispatcherPriority.Input, (ThreadStart)(() => { try { Video.Source = frame; watchdog = 0; pgrLag.Value = 0; frame_count++; if (tick_count == 0) { tick_count = Environment.TickCount; } if (Environment.TickCount - tick_count > 1000) { // calculate fps //Trace.WriteLine(dev.Name + " " + Math.Round((double)frame_count/(double)10,3) + "fps"); FPS.Text = frame_count + " fps"; alerting = false; gAlert.Visibility = System.Windows.Visibility.Collapsed; tick_count = Environment.TickCount; frame_count = 0; } } catch (Exception ex) { Trace.WriteLine("frame err " + ex); } })); }; new Thread(() => vdev.StartVideo()).Start(); StartWatchDog(); System.Timers.Timer t = new System.Timers.Timer(100); t.Elapsed += (sx, ex) => { if (!lockedBar) { lockedBar = true; Video.Dispatcher.Invoke(DispatcherPriority.Input, (ThreadStart)(() => { try { if (pgrLag.Value + 1 < pgrLag.Maximum) { pgrLag.Value += 1; } } catch (Exception ex2) { Trace.WriteLine("pgerr " + ex2); } lockedBar = false; })); } }; t.Start(); } var decd = dev as IDeviceWithConfigurationDialog; if (decd != null) { btnConfigure.Visibility = Visibility.Visible; btnConfigure.Tag = decd; } /* * * qdec = decoder as IQualityControllable; * if (qdec != null) * { * quality.Visibility = Visibility.Visible; * qualitySlider.Value = (double)qdec.Quality; * scaleSlider.Value = (double)qdec.Scale; * } */ Title = dev.Name; setButtonText(); }