Files
IRIS_FODIS/Source/Capture/MainGrabber.cpp
DESKTOP-4HD0KC3\ZhangZhuo fb9e85734b 张卓修改后没提交的
2024-10-30 15:51:00 +08:00

280 lines
5.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
}