280 lines
5.9 KiB
C++
280 lines
5.9 KiB
C++
#include "MainGrabber.h"
|
||
#include "ZZ_Math_HDRONLY.h"
|
||
CMainGrabber::CMainGrabber(QObject* parent /*= nullptr*/)
|
||
{
|
||
m_pctrlFS = NULL;
|
||
m_pctrlGPS = NULL;
|
||
m_dfpDataSaver = NULL;
|
||
m_iFlagIsCapture = 0;
|
||
|
||
connect(this, &CMainGrabber::Signal_InitSelf, this, &CMainGrabber::Initialize_Self);
|
||
}
|
||
|
||
CMainGrabber::~CMainGrabber()
|
||
{
|
||
|
||
}
|
||
|
||
void CMainGrabber::SetRunParams(OneFSContext struFSRunParams)
|
||
{
|
||
m_struFSRunParams = struFSRunParams;
|
||
}
|
||
|
||
int CMainGrabber::SetContext(BD357Controller &pctrlGPS, DataFileProcessor &dfpDataSaver)
|
||
{
|
||
if (&pctrlGPS == NULL)
|
||
{
|
||
//qDebug() << "GPS Not Initialized";
|
||
printf("GPS Not Initialized");
|
||
return 1;
|
||
}
|
||
|
||
m_pctrlGPS = &pctrlGPS;
|
||
m_dfpDataSaver = &dfpDataSaver;
|
||
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::Initialize()
|
||
{
|
||
emit Signal_InitSelf();
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::StartGrab()
|
||
{
|
||
system("gpio write 5 1");
|
||
m_dfpDataSaver->GenerateFilePath();
|
||
m_pctrlFS->PerformAutoExposure();
|
||
DataFrame dfTemp;
|
||
m_iFlagIsCapture = 1;
|
||
|
||
while (m_iFlagIsCapture)
|
||
{
|
||
QTime qtTime;
|
||
qtTime.start();
|
||
|
||
////////////
|
||
system("gpio write 5 0");
|
||
qDebug() << "system IO";
|
||
m_pctrlFS->SingleShot(dfTemp);
|
||
qDebug() << "SingleShot";
|
||
RemoveBackground(dfTemp);
|
||
CheckExposureTime(dfTemp);
|
||
m_dfpDataSaver->WriteData(dfTemp);
|
||
system("gpio write 5 1");
|
||
////////////
|
||
|
||
//int iMillisec = qtTime.elapsed();
|
||
int iSleep =m_struFSRunParams.dMinSamplingInterval - qtTime.elapsed();
|
||
if (iSleep>0)
|
||
{
|
||
Delay_MSec(iSleep);
|
||
}
|
||
qDebug() << "Delay_MSec"<< iSleep;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::Initialize_Self()
|
||
{
|
||
InitializeWorkers();
|
||
SetupMsgPipelines();
|
||
if (m_struFSRunParams.ucDeviceModel== DeviceModel::FLAME)
|
||
{
|
||
//do nothing
|
||
}
|
||
else
|
||
{
|
||
LoadDCT();
|
||
}
|
||
|
||
emit Signal_InitFinished();
|
||
return 0;
|
||
}
|
||
|
||
void CMainGrabber::Delay_MSec(ZZ_U16 usMS)
|
||
{
|
||
QEventLoop qeLoop;
|
||
QTimer::singleShot(usMS, &qeLoop, SLOT(quit()));
|
||
qeLoop.exec();
|
||
}
|
||
|
||
int CMainGrabber::InitializeWorkers()
|
||
{
|
||
if (m_pctrlFS == NULL)
|
||
{
|
||
m_pctrlFS = new CAbsFSController;
|
||
}
|
||
else
|
||
{
|
||
//???
|
||
}
|
||
m_pctrlFS->SetContext(m_struFSRunParams);
|
||
|
||
m_pctrlFS->Initialize();
|
||
while (!m_pctrlFS->m_iFlagInit)
|
||
{
|
||
Delay_MSec(1000);
|
||
}
|
||
m_pctrlFS->GetDeviceAttr(m_struDeviceAttr);
|
||
m_dfpDataSaver->WriteWavelengthInfo(m_struDeviceAttr.fWaveLengthInNM, m_struDeviceAttr.iPixels);
|
||
|
||
//////////////////////////////////////////////////////////////////////////20230713
|
||
if (m_struFSRunParams.dMinSamplingInterval < m_pctrlFS->m_struDeviceAttr.iMaxIntegrationTimeInMS)
|
||
{
|
||
m_pctrlFS->m_struDeviceAttr.iMaxIntegrationTimeInMS = m_struFSRunParams.dMinSamplingInterval * 2;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::SetupMsgPipelines()
|
||
{
|
||
bool bRes = connect(m_pctrlGPS,&BD357Controller::Signal_StartCapture, this, &CMainGrabber::StartGrab);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::LoadDCT()
|
||
{
|
||
m_vecDataFrame.clear();
|
||
|
||
m_DCTable.SetRunParams(m_struFSRunParams);
|
||
m_DCTable.Initialize_Part();
|
||
m_DCTable.LoadTable();
|
||
m_DCTable.GetDCTable(m_vecDataFrame);
|
||
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::CheckExposureTime(DataFrame dfTemp)
|
||
{
|
||
using namespace ZZ_MATH;
|
||
double dExpTimeMS;
|
||
int idExpTimeMS;
|
||
|
||
m_pctrlFS->GetExposureTime(idExpTimeMS);
|
||
|
||
qDebug() << "GetExposureTime" << idExpTimeMS;
|
||
|
||
dExpTimeMS = idExpTimeMS;
|
||
|
||
HeapSort(dfTemp.lData, m_struDeviceAttr.iPixels);
|
||
|
||
double dSum = 0;
|
||
int iCount = m_struDeviceAttr.iPixels / 200;
|
||
for (int i = 0; i < iCount; i++)
|
||
{
|
||
dSum += dfTemp.lData[i];
|
||
}
|
||
double dTemp = dSum / iCount;
|
||
|
||
if (dTemp >= m_struFSRunParams.lDepth * 0.99)
|
||
{
|
||
dExpTimeMS = dExpTimeMS /2;
|
||
}
|
||
|
||
else if (m_struFSRunParams.lDepth*m_struFSRunParams.fMaxFactor >= dTemp && dTemp >= m_struFSRunParams.lDepth * m_struFSRunParams.fMinFactor)
|
||
{
|
||
qDebug() << "SetExposureTime" << dExpTimeMS;
|
||
return 0;
|
||
}
|
||
|
||
else
|
||
{
|
||
double dFactor;
|
||
dFactor = dTemp / (m_struFSRunParams.lDepth * m_struFSRunParams.fMaxFactor);
|
||
dExpTimeMS = (float)(dExpTimeMS / dFactor);
|
||
}
|
||
|
||
if ((dExpTimeMS <= m_struDeviceAttr.iMinIntegrationTimeInMS)|| (dExpTimeMS > m_struDeviceAttr.iMaxIntegrationTimeInMS - 1))
|
||
{
|
||
if ((dExpTimeMS <= m_struDeviceAttr.iMinIntegrationTimeInMS))
|
||
{
|
||
dExpTimeMS = m_struDeviceAttr.iMinIntegrationTimeInMS;
|
||
qDebug() << "SetExposureTime out of range-Min";
|
||
return 1;
|
||
}
|
||
if ((dExpTimeMS > m_struDeviceAttr.iMaxIntegrationTimeInMS - 1))
|
||
{
|
||
dExpTimeMS = m_struDeviceAttr.iMaxIntegrationTimeInMS - 1;
|
||
qDebug() << "SetExposureTime out of range-Max";
|
||
return 2;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
m_pctrlFS->SetExposureTime((int)dExpTimeMS);
|
||
|
||
qDebug() << "SetExposureTime" << dExpTimeMS;
|
||
return 0;
|
||
}
|
||
|
||
int CMainGrabber::RemoveBackground(DataFrame& dfTemp)
|
||
{
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧ<EFBFBD>۰<EFBFBD><DBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if (m_struFSRunParams.ucDeviceModel==DeviceModel::FLAME)
|
||
{
|
||
double dBackground = 0;
|
||
for (int i=0;i< m_pctrlFS->m_vecDarkPixleIndices.size();i++)
|
||
{
|
||
dBackground += dfTemp.lData[m_pctrlFS->m_vecDarkPixleIndices[i]];
|
||
}
|
||
dBackground = dBackground / m_pctrlFS->m_vecDarkPixleIndices.size();
|
||
|
||
for (int i = 0; i < m_struDeviceAttr.iPixels; i++)
|
||
{
|
||
dfTemp.lData[i] = dfTemp.lData[i] - dBackground;
|
||
}
|
||
|
||
qDebug() << "FLAME Real Time Background" << dBackground;
|
||
}
|
||
else
|
||
{
|
||
int iA = dfTemp.usExposureTimeInMS / 10;
|
||
int iB = dfTemp.usExposureTimeInMS % 10;
|
||
|
||
qDebug() << "iA" << iA;
|
||
qDebug() << "iB" << iB;
|
||
|
||
if (iA == 0)
|
||
{
|
||
m_dfBackground = m_vecDataFrame[iB-1];
|
||
}
|
||
else
|
||
{
|
||
if (iA > 100)
|
||
{
|
||
m_dfBackground = m_vecDataFrame[m_vecDataFrame.size() - 1];
|
||
}
|
||
else if (iA <= 9 && iA >= 1)
|
||
{
|
||
m_dfBackground = m_vecDataFrame[8 + iA];
|
||
}
|
||
else
|
||
{
|
||
int iAA = dfTemp.usExposureTimeInMS / 100;
|
||
int iBB = dfTemp.usExposureTimeInMS % 100;
|
||
|
||
DataFrame dfTempX1, dfTempX2;
|
||
dfTempX1 = m_vecDataFrame[17 + iAA];
|
||
dfTempX2 = m_vecDataFrame[18 + iAA];
|
||
|
||
for (int i = 0; i < m_struDeviceAttr.iPixels; i++)
|
||
{
|
||
m_dfBackground.lData[i] = dfTempX1.lData[i] + (dfTempX2.lData[i] - dfTempX1.lData[i]) * (double)iBB / (double)100;
|
||
}
|
||
}
|
||
}
|
||
|
||
for (int i = 0; i < m_struDeviceAttr.iPixels; i++)
|
||
{
|
||
dfTemp.lData[i] = dfTemp.lData[i] - m_dfBackground.lData[i];
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
}
|