/// <summary> /// 1フレーム取り込み完了待機 /// </summary> /// <param name="timeout">タイムアウト (msec) [範囲:-1=無限、0~=有限]</param> /// <returns> /// 1フレームの取り込みが完了するまで処理をブロックします。<br/> /// 取り込みが完了した場合は取り込み完了後のフレーム指標を返します。<br/> /// それ以外は例外を発行します。<br/> /// </returns> public TxFrameIndex WaitFrame(int timeout) { if (SampleGrabber == null) { throw new DSLab.CxDSException(HRESULT.E_FAIL); } if (GraphBuilder == null) { throw new DSLab.CxDSException(HRESULT.E_FAIL); } TxFrameIndex current = SampleGrabberCB.FrameIndex; if (SampleGrabberCB.FrameIndex.Flag == 1) { // Continuous != true: // return(current); // reached } else { // Continuous == true: // CxStopwatch watch = new CxStopwatch(); watch.Start(); while (true) { if (SampleGrabberCB.FrameIndex.Frame != current.Frame) { return(current); // reached } // interrupt (stop or abort) if (SampleGrabberCB.Enable == false) { throw new CxException(ExStatus.Interrupted); } watch.Stop(); if (0 <= timeout && timeout <= watch.Elapsed) { throw new CxException(ExStatus.Interrupted); } System.Threading.Thread.Sleep(1); } } }
/// <summary> /// フレームキャプチャ完了時に呼び出されるコールバック関数 /// </summary> /// <param name="progress">タイムスタンプ</param> /// <param name="sample_addr">サンプルデータの先頭アドレス</param> /// <param name="sample_size">サンプルデータ長 (bytes)</param> /// <returns> /// DSLab.HRESULT.S_OK を返します。 /// </returns> int ISampleGrabberCB.BufferCB(double progress, IntPtr sample_addr, int sample_size) { // サンプリングデータが不正. if (sample_addr == IntPtr.Zero) return (int)DSLab.HRESULT.S_OK; if (sample_size <= 0) return (int)DSLab.HRESULT.S_OK; try { var args = new CxDSGrabberEventArgs(progress, sample_addr, sample_size, this.BitmapInfo); if (Notify != null) Notify.Invoke(this, args); } catch (System.Exception) { System.Threading.Thread.Sleep(1); } #region IxGrabber 用. // 取り込み中の指標. TxFrameIndex current = FrameIndex; if (Enable && !IsPaused && (current.Frame < Buffer.Count)) { IsBusy = true; try { var args = new CxDSGrabberEventArgs(progress, sample_addr, sample_size, this.BitmapInfo); args.CopyTo(Buffer[current.Frame]); } catch (System.Exception) { System.Threading.Thread.Sleep(1); } // 現在時刻.(UTC) ulong timestamp = DSLab.Axi.GetTime(); // 次のフレームの指標. TxFrameIndex next = new TxFrameIndex(current.Track, current.Frame + 1, 0, progress, timestamp); if (next.Frame >= Buffer.Count) { if (Continuous) { next.Frame = 0; next.Track += 1; } else { next.Flag = 1; // reached } } FrameIndex = next; IsBusy = false; } #endregion return (int)DSLab.HRESULT.S_OK; }
/// <summary> /// 定期的な表示更新処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timerUpdateUI_Tick(object sender, EventArgs e) { #region ツールバーの表示更新. toolStart.Enabled = (this.Grabber.IsValid && (!this.Grabber.IsRunning || this.Grabber.IsPaused)); toolPause.Enabled = (this.Grabber.IsRunning); toolPause.Checked = (this.Grabber.IsPaused); toolStop.Enabled = (this.Grabber.IsRunning); #endregion #region 画像表示: { TxFrameIndex frame_index = this.Grabber.FrameIndex(); if (PrevFrame.TimeStamp != frame_index.TimeStamp) { DateTime dt01 = TxDateTime.FromBinary(PrevFrame.TimeStamp, true); DateTime dt02 = TxDateTime.FromBinary(frame_index.TimeStamp, true); this.TimeStamps.Add(dt02); #region time stamp this.statusTimeStamp.Text = string.Format( "{0:00}:{1:00}:{2:00}.{3:000}", dt02.Hour, dt02.Minute, dt02.Second, dt02.Millisecond ); #endregion #region frame rate (fps) if ((this.FpsTime - dt02).Seconds < -1) { this.FpsTime = dt02; lock (this.TimeStamps) { if (this.TimeStamps.Count > 1) { int length = this.TimeStamps.Count - 1; TimeSpan sum = new TimeSpan(); for (int i = 0; i < length; i++) { sum += (this.TimeStamps[i + 1] - this.TimeStamps[i]); } double fps = (sum.TotalSeconds == 0) ? 0.0 : length / sum.TotalSeconds; this.statusFps.Text = string.Format("{0:0.00} fps", fps); } } } #endregion if (frame_index.Frame < this.Buffer.Length) { var image = this.Buffer[frame_index.Frame]; #region image if (image.IsValid) { Bitmap bitmap = image.ToBitmap(); if (pictureView.Image != null) { pictureView.Image.Dispose(); } pictureView.Image = bitmap; Size size1 = pictureView.Size; Size size2 = pictureView.Image.Size; if (size1.Width < size2.Width || size1.Height < size2.Height) { pictureView.SizeMode = PictureBoxSizeMode.Zoom; } else { pictureView.SizeMode = PictureBoxSizeMode.CenterImage; } pictureView.Refresh(); } #endregion } PrevFrame = frame_index; } } #endregion }
/// <summary> /// フレームキャプチャ完了時に呼び出されるコールバック関数 /// </summary> /// <param name="progress">タイムスタンプ</param> /// <param name="sample_addr">サンプルデータの先頭アドレス</param> /// <param name="sample_size">サンプルデータ長 (bytes)</param> /// <returns> /// DSLab.HRESULT.S_OK を返します。 /// </returns> int ISampleGrabberCB.BufferCB(double progress, IntPtr sample_addr, int sample_size) { // サンプリングデータが不正. if (sample_addr == IntPtr.Zero) { return((int)DSLab.HRESULT.S_OK); } if (sample_size <= 0) { return((int)DSLab.HRESULT.S_OK); } try { var args = new CxDSGrabberEventArgs(progress, sample_addr, sample_size, this.BitmapInfo); if (Notify != null) { Notify.Invoke(this, args); } } catch (System.Exception) { System.Threading.Thread.Sleep(1); } #region IxGrabber 用. // 取り込み中の指標. TxFrameIndex current = FrameIndex; if (Enable && !IsPaused && (current.Frame < Buffer.Count)) { IsBusy = true; try { var args = new CxDSGrabberEventArgs(progress, sample_addr, sample_size, this.BitmapInfo); args.CopyTo(Buffer[current.Frame]); } catch (System.Exception) { System.Threading.Thread.Sleep(1); } // 現在時刻.(UTC) ulong timestamp = DSLab.Axi.GetTime(); // 次のフレームの指標. TxFrameIndex next = new TxFrameIndex(current.Track, current.Frame + 1, 0, progress, timestamp); if (next.Frame >= Buffer.Count) { if (Continuous) { next.Frame = 0; next.Track += 1; } else { next.Flag = 1; // reached } } FrameIndex = next; IsBusy = false; } #endregion return((int)DSLab.HRESULT.S_OK); }
/// <summary> /// 定期的な表示更新処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timerUpdateUI_Tick(object sender, EventArgs e) { #region ツールバーの表示更新. toolStart.Enabled = (this.Grabber.IsValid && (!this.Grabber.IsRunning || this.Grabber.IsPaused)); toolPause.Enabled = (this.Grabber.IsRunning); toolPause.Checked = (this.Grabber.IsPaused); toolStop.Enabled = (this.Grabber.IsRunning); #endregion #region 画像表示: { TxFrameIndex frame_index = this.Grabber.FrameIndex(); if (PrevFrame.TimeStamp != frame_index.TimeStamp) { DateTime dt01 = TxDateTime.FromBinary(PrevFrame.TimeStamp, true); DateTime dt02 = TxDateTime.FromBinary(frame_index.TimeStamp, true); this.TimeStamps.Add(dt02); #region time stamp this.statusTimeStamp.Text = string.Format( "{0:00}:{1:00}:{2:00}.{3:000}", dt02.Hour, dt02.Minute, dt02.Second, dt02.Millisecond ); #endregion #region frame rate (fps) if ((this.FpsTime - dt02).Seconds < -1) { this.FpsTime = dt02; lock (this.TimeStamps) { if (this.TimeStamps.Count > 1) { int length = this.TimeStamps.Count - 1; TimeSpan sum = new TimeSpan(); for (int i = 0; i < length; i++) { sum += (this.TimeStamps[i + 1] - this.TimeStamps[i]); } double fps = (sum.TotalSeconds == 0) ? 0.0 : length / sum.TotalSeconds; this.statusFps.Text = string.Format("{0:0.00} fps", fps); } } } #endregion if (frame_index.Frame < this.Buffer.Length) { var image = this.Buffer[frame_index.Frame]; #region image if (image.IsValid) { Bitmap bitmap = image.ToBitmap(); if (pictureView.Image != null) pictureView.Image.Dispose(); pictureView.Image = bitmap; Size size1 = pictureView.Size; Size size2 = pictureView.Image.Size; if (size1.Width < size2.Width || size1.Height < size2.Height) pictureView.SizeMode = PictureBoxSizeMode.Zoom; else pictureView.SizeMode = PictureBoxSizeMode.CenterImage; pictureView.Refresh(); } #endregion } PrevFrame = frame_index; } } #endregion }