重大更新

1.添加了对双通道光闸系统的支持。
2.针对QEPro系列硬件添加了非线性矫正
3.进行了完整的实际采集测试,通过。
4.优化统一了ATP基类内置自动曝光函数。
This commit is contained in:
2022-04-29 15:37:54 +08:00
parent a605b1a6e6
commit d466c1a53c
15 changed files with 305 additions and 59 deletions

View File

@ -1,12 +1,18 @@
#include "AbstractFSController.h"
#include "ZZ_Math_HDRONLY.h"
#include <math.h>
CAbstractFSController::CAbstractFSController(QObject* parent /*= nullptr*/)
{
iFlagInit = 0;
m_pFSCtrl = NULL;
m_iThreadID = -1;
m_vecDataFrameDark.clear();
m_vecDataFrameSignal.clear();
m_qstrCalFilePath = "/home/data/Cal";
m_vecNonLinearCalP.clear();
}
CAbstractFSController::~CAbstractFSController()
@ -30,6 +36,9 @@ int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo)
int CAbstractFSController::InitializeFSControl()
{
using namespace ZZ_MISCDEF::IRIS;
int iRes = 0;
if (m_iThreadID == -1/*|| m_iDeviceType == -1*/)
{
qDebug() << "Params Err. Call SetRunParas first";
@ -44,7 +53,12 @@ int CAbstractFSController::InitializeFSControl()
qDebug() << "OSIFAlpha Not Opened";
return 2;
}
iRes = LoadQEProLinearCalibrationFile();
if (iRes != 0)
{
qDebug() << "LoadQEProLinearCalibrationFile Failed" << iRes;
//return 5;
}
break;
case DeviceModel::OSIFBeta:
m_pFSCtrl = new OceanOptics_lib;
@ -53,6 +67,12 @@ int CAbstractFSController::InitializeFSControl()
qDebug() << "OSIFBeta Not Opened";
return 2;
}
iRes = LoadQEProLinearCalibrationFile();
if (iRes != 0)
{
qDebug() << "LoadQEProLinearCalibrationFile Failed" << iRes;
//return 5;
}
break;
case DeviceModel::ISIF:
m_pFSCtrl = new ZZ_ATPControl_Serial_Qt;
@ -85,7 +105,7 @@ int CAbstractFSController::InitializeFSControl()
break;
}
int iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr);
iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr);
if (iRes != 0)
{
qDebug() << "GetDeviceAttribute Failed" << iRes;
@ -364,6 +384,28 @@ DataFrame CAbstractFSController::TakeOneFrame()
qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID;
}
if (m_fsInfo.ucDeviceModel == DeviceModel::OSIFAlpha|| m_fsInfo.ucDeviceModel == DeviceModel::OSIFBeta)
{
if (m_vecNonLinearCalP.size() != 8)
{
qDebug() << "Err.Non Linear calibration parameters not fit.Skip..." << " Thread ID:" << m_iThreadID;
return dfTemp;
}
for (int i=0;i<m_daDeviceAttr.iPixels;i++)
{
dfTemp.lData[i] = dfTemp.lData[i] / ( m_vecNonLinearCalP[0] +
m_vecNonLinearCalP[1] * dfTemp.lData[i] +
m_vecNonLinearCalP[2] * pow(dfTemp.lData[i], 2) +
m_vecNonLinearCalP[3] * pow(dfTemp.lData[i], 3) +
m_vecNonLinearCalP[4] * pow(dfTemp.lData[i], 4) +
m_vecNonLinearCalP[5] * pow(dfTemp.lData[i], 5) +
m_vecNonLinearCalP[6] * pow(dfTemp.lData[i], 6) +
m_vecNonLinearCalP[7] * pow(dfTemp.lData[i], 7)
);
}
}
return dfTemp;
// DataFrame dfTemp;
// int iRes = m_pFSCtrl->SingleShot(dfTemp);
@ -380,18 +422,55 @@ int CAbstractFSController::SaveDataFile()
return 0;
}
int CAbstractFSController::LoadQEProLinearCalibrationFile()
{
m_vecNonLinearCalP.clear();
QDir qdirPath(m_qstrCalFilePath);
if (!qdirPath.exists())
{
qDebug() << "Non-Linear Calibration Folder not exist" << " Thread ID:" << m_iThreadID;
return 1;
}
QString qstrFilePath;
qstrFilePath = m_qstrCalFilePath + QString("/")+QString::fromStdString(m_fsInfo.strSN)+ QString(".NLC");
QFile qfCalFile(qstrFilePath);
bool bRes = qfCalFile.open(QFile::ReadOnly);
if (!bRes)
{
qDebug() << "Non-Linear Calibration File open Failed" << " Thread ID:" << m_iThreadID;
return 2;
}
while (!qfCalFile.atEnd())
{
QByteArray qbData = qfCalFile.readLine();
qbData.remove(qbData.size()-1, 1);
m_vecNonLinearCalP.push_back(qbData.toDouble());
//qDebug() << qbData;
}
qfCalFile.close();
qDebug() <<"Non-Linear Calibration Params:"<< m_vecNonLinearCalP.size() << " Thread ID:" << m_iThreadID;
return 0;
}
int CAbstractFSController::StartAcquisitionSignal()
{
//
qDebug() << "Starting acq Signal" << " Thread ID:" << m_iThreadID;
// DataFrame struDF;
// int iii;
// m_pFSCtrl->SetExposureTime(10000000);
// m_pFSCtrl->GetExposureTime(iii);
// m_pFSCtrl->SingleShot(struDF);
PerformAutoExposure();
TakeSignalFrame();