/// <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);
                }
            }
        }
Exemple #2
0
            /// <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;
            }
Exemple #3
0
        /// <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
        }