/// <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(); }
public void EnqueueApdSample(short[][] samples, long frame, int line) { PmtSampleData sampleData = new PmtSampleData(samples, frame, line); EnqueuePmtSample(sampleData); }
public bool DequeuePmtConvertData(out PmtSampleData convertData) { return(m_pmtConvertQueue.Dequeue(out convertData)); }
public void EnqueuePmtConvertData(PmtSampleData convertData) { m_pmtConvertQueue.Enqueue(convertData); }
public bool DequeuePmtSample(out PmtSampleData sampleData) { return(m_pmtSampleQueue.Dequeue(out sampleData)); }
public void EnqueuePmtSample(PmtSampleData sampleData) { m_pmtSampleQueue.Enqueue(sampleData); }
/// <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)); }