mirror of
http://172.16.0.230/r/SIF/TowerOptoSifAndSpectral.git
synced 2025-10-19 19:49:42 +08:00
重大更新
1.添加了对双通道光闸系统的支持。 2.针对QEPro系列硬件添加了非线性矫正 3.进行了完整的实际采集测试,通过。 4.优化统一了ATP基类内置自动曝光函数。
This commit is contained in:
@ -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();
|
||||
|
||||
|
@ -43,6 +43,10 @@ private:
|
||||
std::vector<DataFrame> m_vecDataFrameDark, m_vecDataFrameSignal;
|
||||
|
||||
DeviceAttribute m_daDeviceAttr;
|
||||
|
||||
//QE NLC
|
||||
QString m_qstrCalFilePath;
|
||||
std::vector<double> m_vecNonLinearCalP;
|
||||
private:
|
||||
int PerformAutoExposure();
|
||||
int TakeDarkFrame();
|
||||
@ -50,6 +54,8 @@ private:
|
||||
DataFrame TakeOneFrame();
|
||||
int SaveDataFile();
|
||||
|
||||
//QE NLC
|
||||
int LoadQEProLinearCalibrationFile();
|
||||
public slots:
|
||||
virtual int StartAcquisitionSignal();
|
||||
virtual int StartAcquisitionDark();
|
||||
|
@ -122,14 +122,45 @@ int CMainDataGrabber::InitLS()
|
||||
//SetupMsgPipelines_RunTime();
|
||||
//StartWorkers();
|
||||
|
||||
if (m_struLinearShutterContext.strInterface=="GPIO")
|
||||
{
|
||||
qDebug() << "Debugging GPIO Init Started";
|
||||
|
||||
PortInfo piTemp;
|
||||
piTemp.qstrFullPortName = QString::fromStdString(m_struLinearShutterContext.strInterface);
|
||||
m_ctrlLS.ILMES_InitializeComm(piTemp, m_struLinearShutterContext.ucProtocolType, m_struLinearShutterContext.ucCmdID);
|
||||
ControllerParams cpTemp;
|
||||
bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp);
|
||||
m_vecDSS.clear();
|
||||
|
||||
m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition);
|
||||
if (m_struLinearShutterContext.ucProtocolType == 100)
|
||||
{
|
||||
DSStatus DSSOne;
|
||||
|
||||
QString qstrChannel = QString::number(m_struLinearShutterContext.usCmdID, 10);
|
||||
if (qstrChannel.size() != 2)
|
||||
{
|
||||
qDebug() << "Dual Shutter Channel Parse Err.";
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
DSSOne.strChannelA = qstrChannel.toStdString()[0];
|
||||
DSSOne.strChannelB = qstrChannel.toStdString()[1];
|
||||
DSSOne.iChannelA = 1;
|
||||
DSSOne.iChannelB = 1;
|
||||
}
|
||||
|
||||
m_vecDSS.push_back(DSSOne);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PortInfo piTemp;
|
||||
piTemp.qstrFullPortName = QString::fromStdString(m_struLinearShutterContext.strInterface);
|
||||
m_ctrlLS.ILMES_InitializeComm(piTemp, m_struLinearShutterContext.ucProtocolType, m_struLinearShutterContext.usCmdID);
|
||||
ControllerParams cpTemp;
|
||||
bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp);
|
||||
m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition);
|
||||
}
|
||||
|
||||
|
||||
//m_ctrlLS.ILMES_MoveToPos(2);
|
||||
return 0;
|
||||
@ -428,6 +459,9 @@ int CMainDataGrabber::GrabOnceFinished()
|
||||
|
||||
int CMainDataGrabber::OnTimeCounter()
|
||||
{
|
||||
bool bRes;
|
||||
QString qstrCMD_A,qstrCMD_B,qstrCMD_Temp;
|
||||
|
||||
if (m_iFlagIsCapturing)
|
||||
{
|
||||
qDebug() << "Fatal Warning.Last capture not finished.New acquisition will not start";
|
||||
@ -445,30 +479,84 @@ int CMainDataGrabber::GrabOnceFinished()
|
||||
}
|
||||
|
||||
|
||||
////hold current
|
||||
bool bRes = m_ctrlLS.SetHoldCurrent(0.4f);
|
||||
if (!bRes)
|
||||
|
||||
if (m_struLinearShutterContext.strInterface == "GPIO")
|
||||
{
|
||||
qDebug() << "SetHoldCurrent 0.4 Failed";
|
||||
}
|
||||
Delay_MSec(1000);
|
||||
////
|
||||
else
|
||||
{
|
||||
////hold current
|
||||
bRes = m_ctrlLS.SetHoldCurrent(0.4f);
|
||||
if (!bRes)
|
||||
{
|
||||
qDebug() << "SetHoldCurrent 0.4 Failed";
|
||||
}
|
||||
Delay_MSec(1000);
|
||||
////
|
||||
}
|
||||
|
||||
for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++)
|
||||
{
|
||||
ResetThreadStatus();
|
||||
////move to
|
||||
qDebug()<<"Start ILMES_MoveToPos:"<<i+1;
|
||||
if (i==0)
|
||||
|
||||
////move to start
|
||||
if (m_struLinearShutterContext.strInterface == "GPIO")
|
||||
{
|
||||
m_ctrlLS.ILMES_MoveToPos(i + 1);
|
||||
if (m_struLinearShutterContext.ucProtocolType == 100)
|
||||
{
|
||||
if (i==0)
|
||||
{
|
||||
qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelA);
|
||||
qstrCMD_A = "gpio write " + qstrCMD_Temp + " 1";
|
||||
|
||||
qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelB);
|
||||
qstrCMD_B = "gpio write " + qstrCMD_Temp + " 0";
|
||||
|
||||
system(qstrCMD_A.toLatin1());
|
||||
system(qstrCMD_B.toLatin1());
|
||||
|
||||
qDebug() << qstrCMD_A;
|
||||
qDebug() << qstrCMD_B;
|
||||
|
||||
Delay_MSec(500);
|
||||
}
|
||||
if (i==1)
|
||||
{
|
||||
qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelA);
|
||||
qstrCMD_A = "gpio write " + qstrCMD_Temp + " 0";
|
||||
|
||||
qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelB);
|
||||
qstrCMD_B = "gpio write " + qstrCMD_Temp + " 1";
|
||||
|
||||
system(qstrCMD_A.toLatin1());
|
||||
system(qstrCMD_B.toLatin1());
|
||||
|
||||
qDebug() << qstrCMD_A;
|
||||
qDebug() << qstrCMD_B;
|
||||
|
||||
Delay_MSec(500);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ctrlLS.MoveTo(m_struAcqPosSetting.iPosition[1]);
|
||||
qDebug() << "Start ILMES_MoveToPos:" << i + 1;
|
||||
if (i == 0)
|
||||
{
|
||||
m_ctrlLS.ILMES_MoveToPos(i + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ctrlLS.MoveTo(m_struAcqPosSetting.iPosition[1]);
|
||||
}
|
||||
m_ctrlLS.ILMES_MoveToPos(i + 1);
|
||||
qDebug() << "Stop ILMES_MoveToPos:" << i + 1;
|
||||
}
|
||||
m_ctrlLS.ILMES_MoveToPos(i+1);
|
||||
////
|
||||
qDebug() << "Stop ILMES_MoveToPos:" << i + 1;
|
||||
////move to end
|
||||
|
||||
|
||||
// m_struAcqPosSetting.iPosition[i + 1];
|
||||
m_iFlagIsCapturing_Signal = 1;
|
||||
emit SignalStartGrabOnce_Signal();
|
||||
@ -479,9 +567,30 @@ int CMainDataGrabber::GrabOnceFinished()
|
||||
|
||||
|
||||
////move to
|
||||
qDebug() << "Start ILMES_MoveToPos:" << 0;
|
||||
m_ctrlLS.ILMES_MoveToPos(0);
|
||||
qDebug() << "Stop ILMES_MoveToPos:" << 0;
|
||||
if (m_struLinearShutterContext.strInterface == "GPIO")
|
||||
{
|
||||
if (m_struLinearShutterContext.ucProtocolType == 100)
|
||||
{
|
||||
qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelA);
|
||||
qstrCMD_A = "gpio write " + qstrCMD_Temp + " 0";
|
||||
|
||||
qstrCMD_Temp = QString::fromStdString(m_vecDSS[0].strChannelB);
|
||||
qstrCMD_B = "gpio write " + qstrCMD_Temp + " 0";
|
||||
|
||||
system(qstrCMD_A.toLatin1());
|
||||
system(qstrCMD_B.toLatin1());
|
||||
|
||||
qDebug() << qstrCMD_A;
|
||||
qDebug() << qstrCMD_B;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Start ILMES_MoveToPos:" << 0;
|
||||
m_ctrlLS.ILMES_MoveToPos(0);
|
||||
qDebug() << "Stop ILMES_MoveToPos:" << 0;
|
||||
}
|
||||
|
||||
//m_struAcqPosSetting.iPosition[0];
|
||||
m_iFlagIsCapturing_Dark = 1;
|
||||
emit SignalStartGrabOnce_Dark();
|
||||
@ -490,14 +599,22 @@ int CMainDataGrabber::GrabOnceFinished()
|
||||
Delay_MSec(1000);
|
||||
}
|
||||
}
|
||||
////hold current
|
||||
bRes = m_ctrlLS.SetHoldCurrent(0);
|
||||
if (!bRes)
|
||||
|
||||
if (m_struLinearShutterContext.strInterface == "GPIO")
|
||||
{
|
||||
qDebug() << "SetHoldCurrent 0 Failed";
|
||||
}
|
||||
Delay_MSec(1000);
|
||||
////
|
||||
else
|
||||
{
|
||||
////hold current
|
||||
bRes = m_ctrlLS.SetHoldCurrent(0);
|
||||
if (!bRes)
|
||||
{
|
||||
qDebug() << "SetHoldCurrent 0 Failed";
|
||||
}
|
||||
Delay_MSec(1000);
|
||||
////
|
||||
}
|
||||
|
||||
std::vector<std::vector<DataFrame>> vecData;
|
||||
|
||||
for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++)
|
||||
|
@ -43,6 +43,9 @@ private:
|
||||
AcqPosSettings m_struAcqPosSetting;
|
||||
AcqTimeSettings m_struAcqTime;
|
||||
RunTimeGrabberParams m_struRTGP;
|
||||
|
||||
//20220422 added for dual-shutter system
|
||||
vector<DSStatus> m_vecDSS;
|
||||
|
||||
//QTimer *m_GrabTimer;
|
||||
private:
|
||||
|
Reference in New Issue
Block a user