Files
IRIS_FODIS/Source/Capture/MainGrabber.cpp
xin 60559291f2 V1.1 正式版本提交
主要新增功能:
1. 添加 Debian 打包脚本 (pack_deb.sh),支持一键打包部署
2. 新增机顶辐照度使用说明书 (README.md),记录系统配置和使用方法
3. 添加 SD 卡配置更新功能 (configdatairis 文件夹),便于现场配置
4. 新增光谱仪打开失败检测,两灯同时闪烁提示异常
5. 添加说明书自动拷贝到 SD 卡功能

详细修改:
- main.cpp:
  * 添加 SD 卡 configdatairis 配置更新逻辑
  * 添加说明书自动拷贝到 /home/data/
  * 优化 stopwait.txt 判断逻辑

- Source/Capture/MainGrabber.cpp:
  * 添加光谱仪初始化失败检测,失败时两灯同时闪烁

- Source/Logger/Logger.h:
  * 添加日志功能支持

- pack_deb.sh:
  * 新增完整的 Debian 打包脚本
  * 支持自动构建、复制文件、生成 postinst/prerm

- root/start.sh:
  * 添加 mkdir 确保 /home/data 目录存在

- root/DCTable.txt:
  * 添加默认暗电流校准表文件

- README.md:
  * 编写完整的中文使用说明书
  * 包含硬件连接、目录结构、配置说明、GPIO 指示灯含义等

依赖文件:
- /root/DeviceSettings.ini (需另行配置)
- /root/机顶辐照度使用说明书.md (打包时自动复制)
2026-03-23 14:32:12 +08:00

296 lines
6.3 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);
int iFSInitResult = m_pctrlFS->Initialize();
if (iFSInitResult != 0)
{
// Sensor 打开失败,两灯同时闪烁
while (1)
{
system("gpio write 4 1");
system("gpio write 5 1");
QEventLoop qeLoop;
QTimer::singleShot(200, &qeLoop, SLOT(quit()));
qeLoop.exec();
system("gpio write 4 0");
system("gpio write 5 0");
QTimer::singleShot(200, &qeLoop, SLOT(quit()));
qeLoop.exec();
}
}
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><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;
}
}