Пример #1
0
        public override void Cancel()
        {
            if (WorkStatus)
            {
                //强制中断采集
                int result = CareRayInterface.CR_stop_acq_frame();
                if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result)
                {
                    Console.WriteLine("CR_stop_acq_frame error, reason: {0}\n", CareRayErrors.CrErrStrList(result));
                }
            }

            WorkStatus = false;
            Kernel32Interface.PostMessage(this.HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0);
            Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0);
            Trigger.Stop();
        }
Пример #2
0
        public override void Start()
        {
            if (WorkStatus)
            {
                Console.WriteLine("Can not acquire image because of acquiring image now...WorkStatus=" + WorkStatus);
                return;
            }

            WorkStatus = true;
            Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 1, 0);

            //跟踪丢帧的变量
            ImageTrackID = 0;

            //重置统计亮场帧数标记;
            acqBrightImageNumber = 0;

            try
            {
                while (true)
                {
                    if (BackgroundWorkerCaptureImageData.IsBusy)
                    {
                        Thread.Sleep(1000);
                    }
                    else
                    {
                        BackgroundWorkerCaptureImageData.WorkerSupportsCancellation = true;
                        BackgroundWorkerCaptureImageData.DoWork -= new DoWorkEventHandler(BackgroundWorkerCaptureImageData_DoWork);
                        BackgroundWorkerCaptureImageData.DoWork += new DoWorkEventHandler(BackgroundWorkerCaptureImageData_DoWork);

                        //BackgroundWorkerCaptureImageData.RunWorkerCompleted -= BackgroundWorkerCaptureImageData_RunWorkerCompleted;
                        //BackgroundWorkerCaptureImageData.RunWorkerCompleted += BackgroundWorkerCaptureImageData_RunWorkerCompleted;

                        identificationStr = Guid.NewGuid().ToString();
                        BackgroundWorkerCaptureImageData.RunWorkerAsync(identificationStr);
                        return;
                    }
                }
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("Start():back thread capturing image error:" + ex.Message);
            }
        }
Пример #3
0
        public override void CaptureImageData()
        {
            int result;

            #region Step(1):设置采集的帧数

            //acqImageNuber = 3;

            #endregion//End Step(1)

            #region Step(2):设置工作电压

            try
            {
                result = CareRayInterface.CR_set_normal_power();
                if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result)
                {
                    Console.WriteLine("CR_set_normal_power error, reason: {0}\n", CareRayErrors.CrErrStrList(result));
                    Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0);
                    Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0);
                    WorkStatus = false;
                    return;
                }
                else
                {
                    Console.WriteLine("Set panel working voltage successfully.");
                }
            }
            catch (System.Exception ex)
            {
                Console.WriteLine("CR_set_normal_power error, reason: {0}\n", ex.Message);
                Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0);
                Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0);
                WorkStatus = false;
                return;
            }
            #endregion//End Step(2)

            #region Step(3):刷新Panel的参数设置;

            Console.WriteLine("Step(3):Refresh panel settings...");
            RefreshPanelSettings();

            #endregion//End Step(3)

            #region Step(4):采集之前本底丢弃,刷新探测器的lag

            //CaptureDarkImage_DiscardDarkImage_BeforeCapture();
            #endregion//End Step(4)

            #region Step(5):动态本底校正;

            //....
            #endregion//End Step(5)

            #region  Step(6):是否内触发采集本底

            //...
            #endregion//End Step(6)


            //设置状态栏进度信息;
            int msgID2 = GenerateWinMessage("Preparing irradiation...");
            Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID2, 0);

            //调用函数开始采集;
            result = CareRayInterface.CR_start_acq_full_image();
            if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result)
            {
                Console.WriteLine("Step(7):CR_start_acq_image_full error, reason: " + CareRayErrors.CrErrStrList(result));
                Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0);
                Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0);
                WorkStatus = false;
                return;
            }
            else
            {
                Console.WriteLine("1800I 0.96 start acquisition successfully.");
            }
        }
Пример #4
0
        void drocEventCallback(int eventID, ref CareRayInterface.EventData eventData)
        {
            Console.WriteLine("Event ID:" + eventID);

            switch (eventID)
            {
            case (int)CareRayInterface.event_id.EVT_DISCONNECT:
            case (int)CareRayInterface.event_id.EVT_DETECTOR_ERROR:
            {
                int result = CareRayInterface.CR_stop_acq_frame();
                if ((int)KZ_ERROR_TYPE.CR_NO_ERR != result)
                {
                    Console.WriteLine("CR_stop_acq_frame error, reason: {0}\n", CareRayErrors.CrErrStrList(result));
                }
            }
            break;

            case (int)CareRayInterface.event_id.EVT_IMAGE_ARRIVE:
            case (int)CareRayInterface.event_id.EVT_VIDEO_FRAME_INDEX_CHANGED:
            {
                //外部中断Cancel();立即退出;
                if (!WorkStatus)
                {
                    Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_WORKSTATUS, 0, 0);
                    Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, -2, 0);
                    WorkStatus = false;
                    return;
                }

                //用于判断采集是否结束
                acqImageNuber--;

                //改变采集到的帧数统计;
                acqBrightImageNumber++;
                //输出亮场帧数统计信息;
                Console.WriteLine("Image Number=" + acqBrightImageNumber);

                //Windows界面输出采集进度;
                int msgID = GenerateWinMessage("Capturing image number:" + acqBrightImageNumber);
                Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_SHOW_PROGRESS, msgID, 0);


                #region Step(1):TCP/IP协议网络从Panel缓冲区取出图像;

                DateTime tm           = DateTime.Now; //log
                int      imageSize    = eventData.width * eventData.height * eventData.bits / 8;
                int      imageRows    = eventData.height;
                int      imageColumns = eventData.width;

                ushort *imageData = (ushort *)eventData.data;

                #region 验证是否丢帧

                IntPtr checkPtr = (IntPtr)imageData;
                int    imageID  = Marshal.ReadInt32(checkPtr, 0);
                if (imageID != ImageTrackID)
                {
                    Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!lost frame ID=" + imageID);
                }

                ImageTrackID = imageID;
                ImageTrackID++;

                #endregion



                Console.WriteLine("Step(1):(TCP/IP)Transfer image time=" + (DateTime.Now - tm));        //log
                #endregion

                #region Step(2)封装数据到对象ImageObject

                tm = DateTime.Now;

                RefreshScale();

                ImageObject imageObjectBase = new ImageObject();

                ushort[,] imagedata = BufferToArray(imageData, RawFileHeadSize, imageRows, imageColumns);

                imageObjectBase.pixelSize  = this.pixelSize;
                imageObjectBase.centerX    = this.imageCenterX;
                imageObjectBase.centerY    = this.imageCenterY;
                imageObjectBase.ImageData  = imagedata;
                imageObjectBase.createTime = DateTime.Now;

                Console.WriteLine("Encapsulate image data to ImageROI time=" + (DateTime.Now - tm));        //log
                #endregion



                #region Step(3):将采集到的数据ImageROI对象压入到堆栈中供异步处理

                //压入堆栈;
                imgList.Enqueue(imageObjectBase);
                //发送消息到采集界面;保存数据库;
                Kernel32Interface.PostMessage(HostHandle, WIN_MSG.WM_CAPTURE_DATA, (int)captureImageMode, acqBrightImageNumber);
                #endregion

                //判断采集是否结束
                if (acqImageNuber == 0)
                {
                    Cancel();
                    return;
                }
            }
            break;

            default:
                Console.WriteLine("Rad image transmission complete default");
                break;
            }
        }