Exemple #1
0
        /// <summary>
        /// 接收NICard AI中获取到的行数据,生成SampleData,加入队列中
        /// 计算并更新Frame Line Fps TimeSpan
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="samples"></param>
        private void PmtReceiveSamples(object sender, short[][] samples)
        {
            PmtSampleData sampleData = new PmtSampleData(samples, m_scanInfo.CurrentFrame, m_scanInfo.CurrentLine);

            m_scanData.EnqueuePmtSample(sampleData);

            //if (m_config.Debugging)
            //{
            //    double timeSpan = (DateTime.Now - m_scanInfo.StartTime).TotalSeconds;
            //    double timePerLine = m_scanInfo.TimeSpan / (m_config.GetScanYPoints() * m_scanInfo.CurrentFrame + m_scanInfo.CurrentLine + 1);
            //    Logger.Info(string.Format("scan info: frame[{0}], line[{1}], number of samples[{2}], time per line:[{3}].", m_scanInfo.CurrentFrame, m_scanInfo.CurrentLine, samples[0].Length, timePerLine));
            //}

            m_scanInfo.UpdateScanInfo();
        }
Exemple #2
0
        public void EnqueueApdSample(short[][] samples, long frame, int line)
        {
            PmtSampleData sampleData = new PmtSampleData(samples, frame, line);

            EnqueuePmtSample(sampleData);
        }
Exemple #3
0
 public bool DequeuePmtConvertData(out PmtSampleData convertData)
 {
     return(m_pmtConvertQueue.Dequeue(out convertData));
 }
Exemple #4
0
 public void EnqueuePmtConvertData(PmtSampleData convertData)
 {
     m_pmtConvertQueue.Enqueue(convertData);
 }
Exemple #5
0
 public bool DequeuePmtSample(out PmtSampleData sampleData)
 {
     return(m_pmtSampleQueue.Dequeue(out sampleData));
 }
Exemple #6
0
 public void EnqueuePmtSample(PmtSampleData sampleData)
 {
     m_pmtSampleQueue.Enqueue(sampleData);
 }
Exemple #7
0
        /// <summary>
        /// 将行数据转换成帧数据存储
        /// 对于单向扫描,将行数据逐行存储,直到完成一帧数据的存储后,加入到帧数据存储队列
        /// 对于双向扫描:
        /// (a)对偶数行数据截取中间段数据存储到帧数据中
        /// (b)奇数行数据先做反转操作,再根据数据错位值截取相应的中间段数据,并存储到帧数据中
        /// (c)一帧数据存储完成后,加入到帧数据存储队列
        /// </summary>
        private void ConvertPmtSamplesHandler()
        {
            int           activatedChannelNum      = m_config.GetChannelNum();
            int           xSampleCountPerLine      = m_config.GetScanXPoints();
            int           imageSampleCountPerFrame = m_config.GetScanXPoints() * m_config.GetScanYPoints();
            int           scanRows     = m_config.GetScanStrategy() == SCAN_STRATEGY.Z_BIDIRECTION ? m_params.ScanRows * 2 : m_params.ScanRows;
            SCAN_STRATEGY scanStrategy = m_config.GetScanStrategy();

            int i, sourceIndex;

            bool[] channelSwitch = new bool[activatedChannelNum];
            for (i = 0; i < activatedChannelNum; i++)
            {
                channelSwitch[i] = m_config.GetLaserSwitch((CHAN_ID)i) == LASER_CHAN_SWITCH.ON ? true : false;
            }

            short[][] data = new short[activatedChannelNum][];
            for (i = 0; i < activatedChannelNum; i++)
            {
                data[i] = channelSwitch[i] ? new short[xSampleCountPerLine] : null;
            }

            while (m_scanning)
            {
                if (!m_scanData.DequeuePmtSample(out PmtSampleData sample))
                {
                    continue;
                }

                // 采集数据转换
                // 去背景噪声
                sample.Convert();

                // 如果是双向扫描,且当前是奇数行,则该行的数据需要反转
                // 根据错位补偿参数,完成相应的截断
                if (scanStrategy == SCAN_STRATEGY.Z_BIDIRECTION)
                {
                    if ((sample.Line & 0x01) == 0x01)   // 奇数行,需要反转
                    {
                        sourceIndex = m_config.GetScanPixelCompensation() / 2 + m_config.GetScanPixelCalibration();
                        for (i = 0; i < activatedChannelNum; i++)
                        {
                            if (sample.NSamples[i] != null)
                            {
                                Array.Reverse(sample.NSamples[i]);
                                Array.Copy(sample.NSamples[i], sourceIndex, data[i], 0, xSampleCountPerLine);
                            }
                        }
                    }
                    else
                    {
                        sourceIndex = m_config.GetScanPixelCompensation() / 2 + m_config.GetScanPixelOffset();
                        for (i = 0; i < activatedChannelNum; i++)
                        {
                            if (sample.NSamples[i] != null)
                            {
                                Array.Copy(sample.NSamples[i], sourceIndex, data[i], 0, xSampleCountPerLine);
                            }
                        }
                    }
                }
                else
                {
                    sourceIndex = m_config.GetScanPixelCompensation() / 2 + m_config.GetScanPixelOffset();
                    for (i = 0; i < activatedChannelNum; i++)
                    {
                        if (sample.NSamples[i] != null)
                        {
                            Array.Copy(sample.NSamples[i], sourceIndex, data[i], 0, xSampleCountPerLine);
                        }
                    }
                }

                PmtSampleData convertData = new PmtSampleData(data, sample.Frame, sample.Line);
                m_scanData.EnqueuePmtConvertData(convertData);

                // Logger.Info(string.Format("convert info: frame[{0}], line[{1}].", convertData.Frame, convertData.Line));
                if (convertData.Line + 1 == scanRows)
                {
                    Logger.Info(string.Format("convert info: frame[{0}], line[{1}].", convertData.Frame, convertData.Line));
                }

                data = new short[activatedChannelNum][];
                for (i = 0; i < activatedChannelNum; i++)
                {
                    data[i] = channelSwitch[i] ? new short[xSampleCountPerLine] : null;
                }
            }
            Logger.Info(string.Format("scan task[{0}|{1}] stop, finish convert samples.", m_taskId, m_taskName));
        }