Merge remote-tracking branch 'origin/zhangzhuo'

# Conflicts:
#	config/DeviceSettings.ini
This commit is contained in:
2022-02-15 13:12:00 +08:00
29 changed files with 453 additions and 119 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
Cal/FS2_P1.dat Normal file

Binary file not shown.

BIN
Cal/FS2_P2.dat Normal file

Binary file not shown.

BIN
Cal/FS2_P3.dat Normal file

Binary file not shown.

BIN
Cal/FS2_P4.dat Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,9 @@
[DEVICE INFO] [DEVICE INFO]
TotalSpectrometer=2 TotalSpectrometer=1
[FS1] [FS1]
Model=OSIFAlpha Model=ISIF
Port=-1 Port=COM7
UID=FLMS15815 UID=21351029
AEMax=0.85 AEMax=0.85
AEMin=0.75 AEMin=0.75
Depth=65535 Depth=65535
@ -12,8 +12,8 @@ Model=OSIFBeta
Port=-1 Port=-1
UID=QEP02975 UID=QEP02975
AEMax=0.85 AEMax=0.85
AEMin=0.80 AEMin=0.75
Depth=200000 Depth=230000
[FS3] [FS3]
Model=Null Model=Null
[FS4] [FS4]
@ -24,10 +24,10 @@ AEMax=0.85
AEMin=0.75 AEMin=0.75
Depth=65535 Depth=65535
[LINEAR SHUTTER] [LINEAR SHUTTER]
Port=/dev/ttyUSB1 Port=COM8
Type=1 Type=1
DCID=1 DCID=1
TotalPosition=6 TotalPosition=5
Position0=2000 Position0=2000
Position1=110000 Position1=110000
Position2=220000 Position2=220000
@ -35,4 +35,4 @@ Position3=330000
Position4=440000 Position4=440000
Position5=550000 Position5=550000
[HUMITURE] [HUMITURE]
Port=/dev/ttyUSB3 Port=COM11

View File

@ -47,11 +47,6 @@ int main(int argc, char *argv[])
//////////////////////////////////////////////////////////////////////////logger //////////////////////////////////////////////////////////////////////////logger
///create main system logger ///create main system logger
//QT_LOG::ZZ_InitLogger("/home/data/Log/"); //QT_LOG::ZZ_InitLogger("/home/data/Log/");
//m_test123;
//m_test123.Initialize("COM11");
//m_test123.GetHumiture(fTemp, fHum);
//////////////////////////////////////////////////////////////////////////config //////////////////////////////////////////////////////////////////////////config
///turn on power supply ///turn on power supply
system("gpio write 1 1");//<2F><EFBFBD>ϵ<EFBFBD> system("gpio write 1 1");//<2F><EFBFBD>ϵ<EFBFBD>
@ -70,6 +65,7 @@ int main(int argc, char *argv[])
m_dfpSaver.SetManmadeEnviromentalContext(m_struMEC); m_dfpSaver.SetManmadeEnviromentalContext(m_struMEC);
m_mduUploader.SetContext(m_struEC, m_struMEC); m_mduUploader.SetContext(m_struEC, m_struMEC);
m_mduUploader.Initialize();
//m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString());
//////////////////////////////////////////////////////////////////////////prepare //////////////////////////////////////////////////////////////////////////prepare
m_sTimer.Preheating(); m_sTimer.Preheating();
@ -91,10 +87,10 @@ int main(int argc, char *argv[])
m_mdgGrabber.SetContext(m_struRuntimeParams, m_dfpSaver, m_sTimer, m_mduUploader); m_mdgGrabber.SetContext(m_struRuntimeParams, m_dfpSaver, m_sTimer, m_mduUploader);
m_mdgGrabber.Init_Normal(); m_mdgGrabber.Init_Normal();
m_mduUploader.Initialize(); // m_mduUploader.Initialize();
m_mduUploader.SetErr(m_eiErrInfo); // m_mduUploader.SetErr(m_eiErrInfo);
m_mduUploader.UploadInfo(); // m_mduUploader.UploadInfo();
m_mduUploader.UploadErr(); // m_mduUploader.UploadErr();
m_pqDataGrabberThreadHolder->start(); m_pqDataGrabberThreadHolder->start();
m_pqTimerThreadHolder->start(); m_pqTimerThreadHolder->start();
@ -174,6 +170,23 @@ int main(int argc, char *argv[])
// m_ctrlATP.GetDeviceAttribute(); // m_ctrlATP.GetDeviceAttribute();
// m_ctrlATP.SetExposureTime(m_ctrlATP.m_adaDeviceAttr.iMinIntegrationTime); // m_ctrlATP.SetExposureTime(m_ctrlATP.m_adaDeviceAttr.iMinIntegrationTime);
// m_ctrlATP.RecvData(qbTest); // m_ctrlATP.RecvData(qbTest);
//m_test123;
//m_test123.Initialize("COM11");
//m_test123.GetHumiture(fTemp, fHum);
// int aaaaa = sizeof(unsigned long int);
// CalFrame OneFile;
// QString aa = "C:/Users/ZhangZhuo/Desktop/qepro.cal";
// QFile qfCalFile(aa);
// bRes = qfCalFile.open(QFile::ReadOnly);
// using namespace ZZ_MISCDEF;
// qfCalFile.read((char *)&OneFile.uiExposureTimeInMS, sizeof(ZZ_U32));//U32
// qfCalFile.read((char*)&OneFile.fTemperature, sizeof(double));
// qfCalFile.read((char*)&OneFile.iPixels, sizeof(int));
// qfCalFile.read((char*)OneFile.fWaveLength, sizeof(double)*OneFile.iPixels);
// qfCalFile.read((char*)OneFile.dCal_Gain, sizeof(double)*OneFile.iPixels);
// qfCalFile.read((char*)OneFile.dCal_Offset, sizeof(double)*OneFile.iPixels);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
return a.exec(); return a.exec();

View File

@ -2,6 +2,7 @@
#include "ZZ_Math_HDRONLY.h" #include "ZZ_Math_HDRONLY.h"
CAbstractFSController::CAbstractFSController(QObject* parent /*= nullptr*/) CAbstractFSController::CAbstractFSController(QObject* parent /*= nullptr*/)
{ {
iFlagInit = 0;
m_pFSCtrl = NULL; m_pFSCtrl = NULL;
m_iThreadID = -1; m_iThreadID = -1;
m_vecDataFrameDark.clear(); m_vecDataFrameDark.clear();
@ -18,6 +19,7 @@ CAbstractFSController::~CAbstractFSController()
int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo) int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo)
{ {
connect(this, &CAbstractFSController::SignalInit_Self, this, &CAbstractFSController::InitializeFSControl);
m_iThreadID = iThreadID; m_iThreadID = iThreadID;
m_fsInfo = fsInfo; m_fsInfo = fsInfo;
return 0; return 0;
@ -96,7 +98,14 @@ int CAbstractFSController::InitializeFSControl()
qDebug() << "SetDeviceTemperature Failed" << iRes; qDebug() << "SetDeviceTemperature Failed" << iRes;
return 5; return 5;
} }
iFlagInit = 1;
return 0;
}
int CAbstractFSController::InitializeFSControl_Self()
{
//InitializeFSControl();
emit SignalInit_Self();
return 0; return 0;
} }
@ -113,7 +122,7 @@ int CAbstractFSController::PerformAutoExposure()
float fPredictedExposureTime; float fPredictedExposureTime;
int iDeviceDepth = (int)m_fsInfo.lDepth; int iDeviceDepth = (int)m_fsInfo.lDepth;
qDebug() << "MAX---Min" << m_fsInfo.fMaxFactor << "---" << m_fsInfo.fMinFactor; qDebug() << "MAX---Min" << m_fsInfo.fMaxFactor << "---" << m_fsInfo.fMinFactor << " Thread ID:" << m_iThreadID;
bool bFlagIsOverTrying = false; bool bFlagIsOverTrying = false;
bool bFlagIsLowerMinExposureTime = false; bool bFlagIsLowerMinExposureTime = false;
@ -133,7 +142,7 @@ int CAbstractFSController::PerformAutoExposure()
int iRes = 0; int iRes = 0;
if (iRes != 0) if (iRes != 0)
{ {
qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1" << " Thread ID:" << m_iThreadID;
return 1; return 1;
} }
@ -149,6 +158,7 @@ int CAbstractFSController::PerformAutoExposure()
} }
//m_pFSCtrl->SetExposureTime(5000); //m_pFSCtrl->SetExposureTime(5000);
m_pFSCtrl->GetExposureTime(iExposureTime); m_pFSCtrl->GetExposureTime(iExposureTime);
qDebug() << "Current ExpTime:" << iExposureTime << " Thread ID:" << m_iThreadID;
//m_pFSCtrl->SetExposureTime(2500); //m_pFSCtrl->SetExposureTime(2500);
//fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS;
fTempExposureTime = iExposureTime; fTempExposureTime = iExposureTime;
@ -157,14 +167,14 @@ int CAbstractFSController::PerformAutoExposure()
//iRes = m_pFSCtrl->SingleShot(dfTemp); //iRes = m_pFSCtrl->SingleShot(dfTemp);
if (iRes != 0) if (iRes != 0)
{ {
qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2"; qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2" << " Thread ID:" << m_iThreadID;
return 2; return 2;
} }
HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels); HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels);
double dSum = 0; double dSum = 0;
int iCount = m_daDeviceAttr.iPixels / 100; int iCount = m_daDeviceAttr.iPixels / 200;
for (int i = 0; i < iCount; i++) for (int i = 0; i < iCount; i++)
{ {
dSum += dfTemp.lData[i]; dSum += dfTemp.lData[i];
@ -188,7 +198,7 @@ int CAbstractFSController::PerformAutoExposure()
else if (iDeviceDepth * m_fsInfo.fMaxFactor >= dTemp && dTemp >= iDeviceDepth * m_fsInfo.fMinFactor) else if (iDeviceDepth * m_fsInfo.fMaxFactor >= dTemp && dTemp >= iDeviceDepth * m_fsInfo.fMinFactor)
{ {
qDebug() << "trace bFlagIsAutoExposureOK =1" << iExposureTime; qDebug() << "trace bFlagIsAutoExposureOK =1 " << iExposureTime << " Thread ID:" << m_iThreadID;
bFlagIsAutoExposureOK = 1; bFlagIsAutoExposureOK = 1;
} }
else if (dTemp > iDeviceDepth * m_fsInfo.fMaxFactor) else if (dTemp > iDeviceDepth * m_fsInfo.fMaxFactor)
@ -234,12 +244,13 @@ int CAbstractFSController::PerformAutoExposure()
iRes = m_pFSCtrl->SetExposureTime(120000); iRes = m_pFSCtrl->SetExposureTime(120000);
if (iRes != 0) if (iRes != 0)
{ {
qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3"; qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID;
return 3; return 3;
} }
else else
{ {
qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec";
qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID;
} }
bFlagIsOverMaxExposureTime = true; bFlagIsOverMaxExposureTime = true;
break; break;
@ -248,12 +259,12 @@ int CAbstractFSController::PerformAutoExposure()
iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime);
if (iRes != 0) if (iRes != 0)
{ {
qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4"; qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID;
return 3; return 3;
} }
else else
{ {
qDebug() << "Success:PerformAutoExposure. Value"<< iExposureTime; qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID;
} }
} }
fPredictedExposureTime = iExposureTime; fPredictedExposureTime = iExposureTime;
@ -288,8 +299,11 @@ int CAbstractFSController::TakeSignalFrame()
DataFrame CAbstractFSController::TakeOneFrame() DataFrame CAbstractFSController::TakeOneFrame()
{ {
//int iExpTime = 0;
DataFrame dfTemp; DataFrame dfTemp;
// m_pFSCtrl->GetExposureTime(iExpTime);
// dfTemp.usExposureTimeInMS = iExpTime;
// m_pFSCtrl->GetDeviceTemperature(dfTemp.fTemperature);
int iRes = m_pFSCtrl->SingleShot(dfTemp); int iRes = m_pFSCtrl->SingleShot(dfTemp);
if (iRes != 0) if (iRes != 0)
{ {
@ -297,6 +311,14 @@ DataFrame CAbstractFSController::TakeOneFrame()
} }
return dfTemp; return dfTemp;
// DataFrame dfTemp;
// int iRes = m_pFSCtrl->SingleShot(dfTemp);
// if (iRes != 0)
// {
// qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID;
// }
//
// return dfTemp;
} }
int CAbstractFSController::SaveDataFile() int CAbstractFSController::SaveDataFile()
@ -316,7 +338,7 @@ int CAbstractFSController::StartAcquisitionSignal()
//PerformAutoExposure(); PerformAutoExposure();
TakeSignalFrame(); TakeSignalFrame();
qDebug() << "Stop acq Signal" << " Thread ID:" << m_iThreadID; qDebug() << "Stop acq Signal" << " Thread ID:" << m_iThreadID;

View File

@ -21,12 +21,15 @@ class CAbstractFSController :public QObject
public: public:
CAbstractFSController(QObject* parent = nullptr); CAbstractFSController(QObject* parent = nullptr);
virtual ~CAbstractFSController(); virtual ~CAbstractFSController();
public:
std::atomic_int iFlagInit{ 0 };
public: public:
//call first //call first
virtual int SetRunParas(int iThreadID, FSInfo fsInfo); virtual int SetRunParas(int iThreadID, FSInfo fsInfo);
//create derived class from base class //create derived class from base class
virtual int InitializeFSControl(); virtual int InitializeFSControl();
virtual int InitializeFSControl_Self();
//sync info //sync info
virtual int GetDeviceAttr(DeviceAttribute &daAttr); virtual int GetDeviceAttr(DeviceAttribute &daAttr);
@ -56,6 +59,7 @@ public slots:
signals: signals:
void SignalInit_Self();
void SignalAcqStarted(); void SignalAcqStarted();
void SignalAcqFinished_Signal(int iThreadID, int iFlagStatus); void SignalAcqFinished_Signal(int iThreadID, int iFlagStatus);
void SignalAcqFinished_Dark (int iThreadID, int iFlagStatus); void SignalAcqFinished_Dark (int iThreadID, int iFlagStatus);

View File

@ -81,8 +81,8 @@ void CMainDataGrabber::Init_Normal()
{ {
InitThreadStatus(); InitThreadStatus();
InitializeWorkers(); InitializeWorkers();
SetupMsgPipelines();
StartWorkers(); StartWorkers();
SetupMsgPipelines();
} }
int CMainDataGrabber::SetGrabberParams(RunTimeGrabberParams struGrabberRTParams) int CMainDataGrabber::SetGrabberParams(RunTimeGrabberParams struGrabberRTParams)
@ -159,6 +159,16 @@ int CMainDataGrabber::InitThreadStatus()
return 0; return 0;
} }
int CMainDataGrabber::ResetThreadStatus()
{
for (int i = 0; i < m_iTotalThreads; i++)
{
m_piFlagCaptureThreadStatus_Signal[i] = 0;
m_piFlagCaptureThreadStatus_Dark[i] = 0;
}
return 0;
}
int CMainDataGrabber::InitializeWorkers() int CMainDataGrabber::InitializeWorkers()
{ {
for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++)
@ -176,20 +186,20 @@ int CMainDataGrabber::InitializeWorkers()
CAbstractFSController* m_pWorkThread = new CAbstractFSController; CAbstractFSController* m_pWorkThread = new CAbstractFSController;
m_pWorkThread->SetRunParas(i, fsInfo); m_pWorkThread->SetRunParas(i, fsInfo);
m_pWorkThread->InitializeFSControl(); // m_pWorkThread->InitializeFSControl();
//
DeviceAttribute daAttrTemp; // DeviceAttribute daAttrTemp;
m_pWorkThread->GetDeviceAttr(daAttrTemp); // m_pWorkThread->GetDeviceAttr(daAttrTemp);
m_struDeviceContext.usPixels[i] = (ZZ_U16)daAttrTemp.iPixels; // m_struDeviceContext.usPixels[i] = (ZZ_U16)daAttrTemp.iPixels;
for (ZZ_U16 j = 0; j < daAttrTemp.iPixels; j++) // for (ZZ_U16 j = 0; j < daAttrTemp.iPixels; j++)
{ // {
m_struDeviceContext.fWavelength[i][j] = daAttrTemp.fWaveLengthInNM[j]; // m_struDeviceContext.fWavelength[i][j] = daAttrTemp.fWaveLengthInNM[j];
} // }
m_pControlThread.push_back(m_pWorkThread); m_pControlThread.push_back(m_pWorkThread);
} }
m_struRTGP.fscParams = m_struDeviceContext; // m_struRTGP.fscParams = m_struDeviceContext;
m_pdfpSaver->SetDeviceInfo(m_struDeviceContext); // m_pdfpSaver->SetDeviceInfo(m_struDeviceContext);
m_pmduUploader->SetRTGP(m_struRTGP); // m_pmduUploader->SetRTGP(m_struRTGP);
return 0; return 0;
} }
@ -202,19 +212,26 @@ int CMainDataGrabber::StartWorkers()
m_pControlThread[i]->moveToThread(pWorkThreadHolder); m_pControlThread[i]->moveToThread(pWorkThreadHolder);
pWorkThreadHolder->start(); pWorkThreadHolder->start();
// m_pControlThread[i]->InitializeFSControl(); m_pControlThread[i]->InitializeFSControl_Self();
// DeviceAttribute daAttrTemp; /// <summary>
// m_pControlThread[i]->GetDeviceAttr(daAttrTemp); while (!m_pControlThread[i]->iFlagInit)
// m_struDeviceContext.usPixels[i] = (ZZ_U16)daAttrTemp.iPixels; {
// for (ZZ_U16 j = 0; j < daAttrTemp.iPixels; j++) Delay_MSec(1000);
// { }
// m_struDeviceContext.fWavelength[i][j] = daAttrTemp.fWaveLengthInNM[j]; /// </summary>
// } /// <returns></returns>
DeviceAttribute daAttrTemp;
m_pControlThread[i]->GetDeviceAttr(daAttrTemp);
m_struDeviceContext.usPixels[i] = (ZZ_U16)daAttrTemp.iPixels;
for (ZZ_U16 j = 0; j < daAttrTemp.iPixels; j++)
{
m_struDeviceContext.fWavelength[i][j] = daAttrTemp.fWaveLengthInNM[j];
}
} }
// m_struRTGP.fscParams = m_struDeviceContext; m_struRTGP.fscParams = m_struDeviceContext;
// m_pdfpSaver->SetDeviceInfo(m_struDeviceContext); m_pdfpSaver->SetDeviceInfo(m_struDeviceContext);
// m_pmduUploader->SetRTGP(m_struRTGP); m_pmduUploader->SetRTGP(m_struRTGP);
return 0; return 0;
} }
@ -427,9 +444,11 @@ int CMainDataGrabber::GrabOnceFinished()
for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++) for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++)
{ {
ResetThreadStatus();
////move to ////move to
qDebug()<<"Start ILMES_MoveToPos:"<<i+1; qDebug()<<"Start ILMES_MoveToPos:"<<i+1;
//m_ctrlLS.ILMES_MoveToPos(i+1); m_ctrlLS.MoveTo(m_struAcqPosSetting.iPosition[1]);
m_ctrlLS.ILMES_MoveToPos(i+1);
qDebug() << "Stop ILMES_MoveToPos:" << i + 1; qDebug() << "Stop ILMES_MoveToPos:" << i + 1;
m_struAcqPosSetting.iPosition[i + 1]; m_struAcqPosSetting.iPosition[i + 1];
m_iFlagIsCapturing_Signal = 1; m_iFlagIsCapturing_Signal = 1;
@ -442,7 +461,7 @@ int CMainDataGrabber::GrabOnceFinished()
////move to ////move to
qDebug() << "Start ILMES_MoveToPos:" << 0; qDebug() << "Start ILMES_MoveToPos:" << 0;
//m_ctrlLS.ILMES_MoveToPos(0); m_ctrlLS.ILMES_MoveToPos(0);
qDebug() << "Stop ILMES_MoveToPos:" << 0; qDebug() << "Stop ILMES_MoveToPos:" << 0;
m_struAcqPosSetting.iPosition[0]; m_struAcqPosSetting.iPosition[0];
m_iFlagIsCapturing_Dark = 1; m_iFlagIsCapturing_Dark = 1;
@ -465,6 +484,8 @@ int CMainDataGrabber::GrabOnceFinished()
SubDataFrame(vecSignal[j], vecDark[j], m_struDeviceContext.usPixels[i]); SubDataFrame(vecSignal[j], vecDark[j], m_struDeviceContext.usPixels[i]);
} }
vecData.push_back(vecSignal); vecData.push_back(vecSignal);
qDebug() << "ucDeviceNumber" << i << " Data Size" << vecSignal.size();
//vecData[i].push_back();
} }
//emit SignalPushOneDataFrame(vecData); //emit SignalPushOneDataFrame(vecData);

View File

@ -56,6 +56,7 @@ private:
int SetUploader(CMainDataUploader &mduUploader/*, RunTimeGrabberParams struGrabberRTParams*/); int SetUploader(CMainDataUploader &mduUploader/*, RunTimeGrabberParams struGrabberRTParams*/);
int InitThreadStatus(); int InitThreadStatus();
int ResetThreadStatus();
int InitializeWorkers(); int InitializeWorkers();
int StartWorkers(); int StartWorkers();
int SetupMsgPipelines(); int SetupMsgPipelines();

View File

@ -2,6 +2,7 @@
Scheduler::Scheduler(QObject* parent /*= nullptr*/) Scheduler::Scheduler(QObject* parent /*= nullptr*/)
{ {
m_iFlagIsOnRestart = 0;
m_GrabTimer = new QTimer(this); m_GrabTimer = new QTimer(this);
connect(m_GrabTimer, &QTimer::timeout, this, &Scheduler::OnTimeCounter); connect(m_GrabTimer, &QTimer::timeout, this, &Scheduler::OnTimeCounter);
connect(this, &Scheduler::SignalSelfStart, this, &Scheduler::StartAsPlanned); connect(this, &Scheduler::SignalSelfStart, this, &Scheduler::StartAsPlanned);
@ -52,7 +53,9 @@ void Scheduler::StartAsPlanned()
int iIntervalInMS = m_struAcqTime.qtInterval.hour() * 3600 * 1000 + m_struAcqTime.qtInterval.minute() * 60 * 1000 + m_struAcqTime.qtInterval.second() * 1000; int iIntervalInMS = m_struAcqTime.qtInterval.hour() * 3600 * 1000 + m_struAcqTime.qtInterval.minute() * 60 * 1000 + m_struAcqTime.qtInterval.second() * 1000;
m_GrabTimer->start(iIntervalInMS); m_GrabTimer->start(5000);
//this->OnTimeCounter();
//emit &QTimer::timeout;
} }
int Scheduler::OnTimeCounter() int Scheduler::OnTimeCounter()
@ -60,12 +63,21 @@ int Scheduler::OnTimeCounter()
QTime qtTime = QTime::currentTime(); QTime qtTime = QTime::currentTime();
if (m_struAcqTime.qtStartTime <= qtTime && qtTime < m_struAcqTime.qtStopTime) if (m_struAcqTime.qtStartTime <= qtTime && qtTime < m_struAcqTime.qtStopTime)
{ {
if (m_iFlagIsOnRestart)
{
}
qDebug() << "it's time to work...work work."; qDebug() << "it's time to work...work work.";
emit SignalGrabOnce(); emit SignalGrabOnce();
return 0; return 0;
} }
else else
{ {
if (!m_iFlagIsOnRestart)
{
m_iFlagIsOnRestart = 1;
}
system("gpio write 1 0");//<2F><EFBFBD>ϵ<EFBFBD> system("gpio write 1 0");//<2F><EFBFBD>ϵ<EFBFBD>
qDebug() << "gpio write 1 0......"<<endl; qDebug() << "gpio write 1 0......"<<endl;
qDebug() << "Non working time. Idling......"; qDebug() << "Non working time. Idling......";

View File

@ -10,6 +10,7 @@ public:
Scheduler(QObject* parent = nullptr); Scheduler(QObject* parent = nullptr);
~Scheduler(); ~Scheduler();
private: private:
int m_iFlagIsOnRestart;
QTimer *m_GrabTimer; QTimer *m_GrabTimer;
AcqTimeSettings m_struAcqTime; AcqTimeSettings m_struAcqTime;
private: private:

View File

@ -63,10 +63,19 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe
return 2; return 2;
} }
// int testi;
// GetDeviceAttribute(m_daDeviceAttr);
// GetExposureTime(testi);
// SetExposureTime(10000);
// DataFrame test;
// SingleShot(test);
GetDeviceInfo(m_diDeviceInfo); GetDeviceInfo(m_diDeviceInfo);
GetExposureTime_Init();
std::string::size_type szPostion = m_diDeviceInfo.strSN.find(strDeviceName); std::string::size_type szPostion = m_diDeviceInfo.strSN.find(strDeviceName);
if (szPostion==std::string::npos) if (szPostion == std::string::npos)
{ {
qDebug() << "Err:FS serial number not match.Exit Code:3"; qDebug() << "Err:FS serial number not match.Exit Code:3";
return 3; return 3;
@ -227,8 +236,8 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr)
return 1; return 1;
} }
float fWaveLengthCoef[4]; float fWaveLengthCoef[4];
memcpy(fWaveLengthCoef, qbRecv.data()+16, 4 * sizeof(float)); memcpy(fWaveLengthCoef, qbRecv.data() + 16, 4 * sizeof(float));
for (int i=0;i< m_daDeviceAttr.iPixels;i++) for (int i = 0; i < m_daDeviceAttr.iPixels; i++)
{ {
m_daDeviceAttr.fWaveLengthInNM[i] = fWaveLengthCoef[0] * i*i*i + fWaveLengthCoef[1] * i*i + fWaveLengthCoef[2] * i + fWaveLengthCoef[3]; m_daDeviceAttr.fWaveLengthInNM[i] = fWaveLengthCoef[0] * i*i*i + fWaveLengthCoef[1] * i*i + fWaveLengthCoef[2] * i + fWaveLengthCoef[3];
} }
@ -243,6 +252,38 @@ int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature)
return 0; return 0;
} }
int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init()
{
QByteArray qbSend, qbRecv;
qbSend.clear();
qbRecv.clear();
qbSend.append(GET_INTEGRATION_TIME);
qbSend.resize(3);
qbSend[1] = 0x00;
qbSend[2] = 0x01;
int iRes = SendCommand(qbSend);
if (iRes != 0)
{
qDebug() << "Err:GetExposureTime Failed.Exit Code:1";
return 1;
}
iRes = RecvData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:GetExposureTime Failed.Exit Code:2";
return 2;
}
iRes = ParseData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:GetExposureTime Failed.Exit Code:3";
return 3;
}
m_iExposureTime = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256;
return 0;
}
int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand) int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand)
{ {
int iSize = qbCommand.size() + 3; int iSize = qbCommand.size() + 3;
@ -262,10 +303,10 @@ int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand)
qbSend.append(iSum % 256); qbSend.append(iSum % 256);
qint64 qi64Write= m_pSerialPort->write(qbSend); qint64 qi64Write = m_pSerialPort->write(qbSend);
if (qi64Write != qbSend.size()) if (qi64Write != qbSend.size())
{ {
qDebug() << "Err:write Failed.Exit Code:1"<< qi64Write; qDebug() << "Err:write Failed.Exit Code:1" << qi64Write;
return 1; return 1;
} }
@ -280,13 +321,13 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
int iCounter = 0; int iCounter = 0;
while (qbData.size() < 4) while (qbData.size() < 4)
{ {
m_pSerialPort->waitForReadyRead(50); m_pSerialPort->waitForReadyRead(600);
QByteArray qbTemp = m_pSerialPort->readAll(); QByteArray qbTemp = m_pSerialPort->readAll();
qbData.append(qbTemp); qbData.append(qbTemp);
if (iCounter > 10) if (iCounter > 25)
{ {
qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1"<< qbData.size(); qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size();
return 1; return 1;
} }
iCounter++; iCounter++;
@ -302,10 +343,10 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
int iLength = qbData[2] * 256 + qbData[3] + 2; int iLength = qbData[2] * 256 + qbData[3] + 2;
while (qbData.size() < iLength) while (qbData.size() < iLength)
{ {
m_pSerialPort->waitForReadyRead(50); m_pSerialPort->waitForReadyRead(5000);
qbData.append(m_pSerialPort->readAll()); qbData.append(m_pSerialPort->readAll());
if (iCounter > 100) if (iCounter > 200)
{ {
qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size(); qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size();
return 3; return 3;
@ -321,15 +362,80 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
ZZ_U16 usCheckSum = 0; ZZ_U16 usCheckSum = 0;
for (int i = 0; i < iCheckSumLength; i++) for (int i = 0; i < iCheckSumLength; i++)
{ {
usCheckSum += qbData[i+2]; usCheckSum += qbData[i + 2];
} }
usCheckSum = usCheckSum % 256; usCheckSum = usCheckSum % 256;
ZZ_U8 ucTemp = qbData[qbData.size() - 1]; ZZ_U8 ucTemp = qbData[qbData.size() - 1];
if ((ZZ_U8)usCheckSum != ucTemp) if ((ZZ_U8)usCheckSum != ucTemp)
{ {
qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << qbData.size(); qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp;
//qbData.clear();
//return 4;
return 0;
}
return 0;
}
int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData)
{
qbData.clear(); qbData.clear();
return 4; qbData = m_pSerialPort->readAll();
int iCounter = 0;
while (qbData.size() < 4)
{
m_pSerialPort->waitForReadyRead(100);
QByteArray qbTemp = m_pSerialPort->readAll();
qbData.append(qbTemp);
if (iCounter > 6)
{
qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size();
return 1;
}
iCounter++;
}
if ((ZZ_U8)qbData[0] != (ZZ_U8)0xaa || (ZZ_U8)qbData[1] != (ZZ_U8)0x55)
{
qDebug() << "Err:RecvData Failed,Wrong Header.Exit Code:2" << qbData.size();
return 2;
}
iCounter = 0;
int iLength = qbData[2] * 256 + qbData[3] + 2;
while (qbData.size() < iLength)
{
m_pSerialPort->waitForReadyRead(100);
qbData.append(m_pSerialPort->readAll());
if (iCounter > 6)
{
qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size();
return 3;
}
iCounter++;
}
if (qbData.size() > iLength)
{
qbData.remove(iLength - 1, qbData.size() - iLength);
}
int iCheckSumLength = iLength - 3;
ZZ_U16 usCheckSum = 0;
for (int i = 0; i < iCheckSumLength; i++)
{
usCheckSum += qbData[i + 2];
}
usCheckSum = usCheckSum % 256;
ZZ_U8 ucTemp = qbData[qbData.size() - 1];
if ((ZZ_U8)usCheckSum != ucTemp)
{
qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp;
//qbData.clear();
//return 4;
return 0;
} }
return 0; return 0;
@ -498,19 +604,37 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM
int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS)
{ {
QByteArray qbExposureTime,qbRecv; m_iExposureTime = iExposureTimeInMS;
qbExposureTime.append(SET_INTEGRATION_TIME);
QByteArray qbExposureTime, qbRecv;
//qbExposureTime.append(SET_INTEGRATION_TIME);
qbExposureTime.resize(3); qbExposureTime.resize(3);
qbExposureTime[0] = SET_INTEGRATION_TIME;
qbExposureTime[1] = iExposureTimeInMS >> 8; qbExposureTime[1] = iExposureTimeInMS >> 8;
qbExposureTime[2] = iExposureTimeInMS & 0xFF; qbExposureTime[2] = iExposureTimeInMS & 0xFF;
SendCommand(qbExposureTime); int iRes = SendCommand(qbExposureTime);
RecvData(qbRecv); if (iRes != 0)
ParseData(qbRecv); {
qDebug() << "Err:SetExposureTime Failed.Exit Code:2";
return 2;
}
iRes = RecvData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:SetExposureTime Failed.Exit Code:3";
return 3;
}
iRes = ParseData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:SetExposureTime Failed.Exit Code:4";
return 4;
}
if ((ZZ_U8)qbRecv[0] != 0) if ((ZZ_U8)qbRecv[0] != 0)
{ {
qDebug() << "Err:SetExposureTime Failed.Exit Code:1" ; qDebug() << "Err:SetExposureTime Failed.Exit Code:1";
return 1; return 1;
} }
@ -519,16 +643,34 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS)
int ZZ_ATPControl_Serial_Qt::GetExposureTime(int &iExposureTimeInMS) int ZZ_ATPControl_Serial_Qt::GetExposureTime(int &iExposureTimeInMS)
{ {
QByteArray qbSend, qbRecv; // QByteArray qbSend, qbRecv;
qbSend.clear(); // qbSend.clear();
qbRecv.clear(); // qbRecv.clear();
qbSend.append(GET_INTEGRATION_TIME); // qbSend.append(GET_INTEGRATION_TIME);
qbSend.resize(3); // qbSend.resize(3);
qbSend[1] = 0x00; // qbSend[1] = 0x00;
qbSend[2] = 0x01; // qbSend[2] = 0x01;
SendCommand(qbSend); // int iRes = SendCommand(qbSend);
RecvData(qbRecv); // if (iRes != 0)
ParseData(qbRecv); // {
// qDebug() << "Err:GetExposureTime Failed.Exit Code:1";
// return 1;
// }
// iRes = RecvData(qbRecv);
// if (iRes != 0)
// {
// qDebug() << "Err:GetExposureTime Failed.Exit Code:2";
// return 2;
// }
// iRes = ParseData(qbRecv);
// if (iRes != 0)
// {
// qDebug() << "Err:GetExposureTime Failed.Exit Code:3";
// return 3;
// }
//
// iExposureTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256;
iExposureTimeInMS = m_iExposureTime;
return 0; return 0;
} }
@ -540,13 +682,30 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData)
qbRecv.clear(); qbRecv.clear();
qbSend.append(SYNC_GET_DATA); qbSend.append(SYNC_GET_DATA);
qbSend.resize(3); qbSend.resize(3);
qbSend[1] = 0x00; // qbSend[1] = 0x00;
qbSend[2] = 0x01; // qbSend[2] = 0x01;
SendCommand(qbSend); qbSend[1] = m_iExposureTime >> 8;;
RecvData(qbRecv); qbSend[2] = m_iExposureTime & 0xFF;
ParseData(qbRecv); int iRes = SendCommand(qbSend);
if (iRes != 0)
{
qDebug() << "Err:SingleShot Failed.Exit Code:1";
return 1;
}
iRes = RecvData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:SingleShot Failed.Exit Code:2";
return 2;
}
iRes = ParseData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:SingleShot Failed.Exit Code:3";
return 3;
}
ZZ_U16 usData[4096] = {0}; ZZ_U16 usData[4096] = { 0 };
if ((ZZ_U8)qbRecv[0] != 0) if ((ZZ_U8)qbRecv[0] != 0)
{ {
@ -558,11 +717,23 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData)
//int aaa = qbRecv.size(); //int aaa = qbRecv.size();
int iDataSizeInPixel = (qbRecv.size() - 1) / 2; int iDataSizeInPixel = (qbRecv.size() - 1) / 2;
memcpy(usData, qbRecv.data() + 1, iDataSizeInPixel * 2); memcpy(usData, qbRecv.data() + 1, iDataSizeInPixel * 2);
for (int i=0;i< iDataSizeInPixel;i++) for (size_t i = 0; i < iDataSizeInPixel; i++)
{ {
dfData.lData[i] = usData[i]; dfData.lData[i] = qToBigEndian(usData[i]);
} }
// for (int i = 0; i < iDataSizeInPixel; i++)
// {
// dfData.lData[i] = usData[i];
// }
} }
float fTemp;
GetDeviceTemperature(fTemp);
dfData.usExposureTimeInMS = m_iExposureTime;
dfData.fTemperature = fTemp;
return 0; return 0;
} }
@ -576,14 +747,29 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(int &iPixels)
qbSend.resize(3); qbSend.resize(3);
qbSend[1] = 0x00; qbSend[1] = 0x00;
qbSend[2] = 0x01; qbSend[2] = 0x01;
SendCommand(qbSend); int iRes = SendCommand(qbSend);
RecvData(qbRecv); if (iRes != 0)
ParseData(qbRecv); {
qDebug() << "Err:SingleShotP Failed.Exit Code:1";
return 1;
}
iRes = RecvData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:SingleShotP Failed.Exit Code:2";
return 2;
}
iRes = ParseData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:SingleShot Failed.Exit Code:3";
return 3;
}
if ((ZZ_U8)qbRecv[0] != 0) if ((ZZ_U8)qbRecv[0] != 0)
{ {
qDebug() << "Err:SingleShot Failed.Exit Code:1"; qDebug() << "Err:SingleShotP Failed.Exit Code:4";
return 1; return 4;
} }
else else
{ {
@ -602,6 +788,8 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(int &iPixels)
int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature) int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature)
{ {
fTemperature = 0;
QByteArray qbSend, qbRecv; QByteArray qbSend, qbRecv;
qbSend.clear(); qbSend.clear();
qbRecv.clear(); qbRecv.clear();
@ -609,9 +797,28 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature)
qbSend.resize(3); qbSend.resize(3);
qbSend[1] = 0x00; qbSend[1] = 0x00;
qbSend[2] = 0x01; qbSend[2] = 0x01;
SendCommand(qbSend); int iRes = SendCommand(qbSend);
RecvData(qbRecv); if (iRes != 0)
ParseData(qbRecv); {
qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:1";
return 1;
}
iRes = RecvData_ShortLag(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:2";
return 2;
}
iRes = ParseData(qbRecv);
if (iRes != 0)
{
qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:3";
return 3;
}
QString qstrTemp = qbRecv.data();
fTemperature = qstrTemp.toFloat();
return 0; return 0;
} }

View File

@ -76,11 +76,15 @@ private:
DeviceInfo m_diDeviceInfo; DeviceInfo m_diDeviceInfo;
DeviceAttribute m_daDeviceAttr; DeviceAttribute m_daDeviceAttr;
//Attr
int m_iExposureTime;
//////////////////////////////////////////////////////////////////////////shutter control stub code s //////////////////////////////////////////////////////////////////////////shutter control stub code s
//int SetExtShutter(int iShutterUP0, int iShutterDOWN1,int iShutterDOWN2,int iShutterDOWN3); //0:close 1:open //int SetExtShutter(int iShutterUP0, int iShutterDOWN1,int iShutterDOWN2,int iShutterDOWN3); //0:close 1:open
//////////////////////////////////////////////////////////////////////////shutter control stub code e //////////////////////////////////////////////////////////////////////////shutter control stub code e
int GetExposureTime_Init();
int SendCommand(QByteArray qbCommand); int SendCommand(QByteArray qbCommand);
int RecvData(QByteArray &qbData); int RecvData(QByteArray &qbData);
int RecvData_ShortLag(QByteArray &qbData);
int ParseData(QByteArray &qbData); int ParseData(QByteArray &qbData);
public slots: public slots:
int Init_Self(); int Init_Self();

View File

@ -231,7 +231,7 @@ bool DataFileProcessor::WriteData()
qstrTemp = QString("_P%1").arg(j + 1); qstrTemp = QString("_P%1").arg(j + 1);
qfData.write(qstrTemp.toLatin1()); qfData.write(qstrTemp.toLatin1());
qfData.write(","); qfData.write(",");
if ((m_vecData[i][j].fTemperature < 5) && (m_vecData[i][j].fTemperature> -5)) if ((m_vecData[i][j].fTemperature < 5) /*&& (m_vecData[i][j].fTemperature> -5)*/)
{ {
qfData.write("valid"); qfData.write("valid");
} }

View File

@ -12,7 +12,7 @@ namespace ZZ_MISCDEF
{ {
typedef unsigned char ZZ_U8; typedef unsigned char ZZ_U8;
typedef unsigned short int ZZ_U16; typedef unsigned short int ZZ_U16;
typedef unsigned long int ZZ_U32; typedef unsigned int ZZ_U32;
typedef long int ZZ_S32; typedef long int ZZ_S32;
@ -23,8 +23,8 @@ namespace ZZ_MISCDEF
{ {
typedef struct tagDataFrame typedef struct tagDataFrame
{ {
ZZ_U32 usExposureTimeInMS; ZZ_U32 usExposureTimeInMS = 0;
ZZ_S32 lData[4096]; ZZ_S32 lData[4096] = {0};
float fTemperature = 0; float fTemperature = 0;
double dTimes = 0; double dTimes = 0;
}DataFrame; }DataFrame;

View File

@ -227,6 +227,7 @@
m_struMEC.qstrPhoneNumberOfMaintenanceStaff = m_qjoJObj.value("PhoneNumberOfMaintenanceStaff").toString(); m_struMEC.qstrPhoneNumberOfMaintenanceStaff = m_qjoJObj.value("PhoneNumberOfMaintenanceStaff").toString();
m_struMEC.qstrDownloadUserID = m_qjoJObj.value("DownloadUserID").toString(); m_struMEC.qstrDownloadUserID = m_qjoJObj.value("DownloadUserID").toString();
m_struMEC.qstrDownlaodAddress = m_qjoJObj.value("DownlaodAddress").toString(); m_struMEC.qstrDownlaodAddress = m_qjoJObj.value("DownlaodAddress").toString();
m_struMEC.qstrHTTPServer = m_qjoJObj.value("HTTPServer").toString();

View File

@ -15,8 +15,10 @@ RadConverter::~RadConverter()
int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams, vector<vector<CalFrame>> &struAllCalFrame) int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams, vector<vector<CalFrame>> &struAllCalFrame)
{ {
/////param /////param
int iScanPoints = struGrabberRTParams.apsParams.iTotalPosition - 1; //int iScanPoints = struGrabberRTParams.apsParams.iTotalPosition - 1;
int iDevices = struGrabberRTParams.fscParams.ucDeviceNumber; //int iDevices = struGrabberRTParams.fscParams.ucDeviceNumber;
int iScanPoints = 4;
int iDevices = 1;
/////check dir /////check dir
QDir qdirPath(m_qstrCalFilePath); QDir qdirPath(m_qstrCalFilePath);
if (!qdirPath.exists()) if (!qdirPath.exists())
@ -29,7 +31,7 @@ int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams
qslFilter << "*.dat"; qslFilter << "*.dat";
qdirPath.setNameFilters(qslFilter); qdirPath.setNameFilters(qslFilter);
QFileInfoList qfiInfo = qdirPath.entryInfoList(qslFilter); QFileInfoList qfiInfo = qdirPath.entryInfoList(qslFilter);
if (qfiInfo.size()!= iScanPoints * iDevices) if (qfiInfo.size()<iScanPoints * iDevices)
{ {
qDebug() << "Calibration Files quantities not match"; qDebug() << "Calibration Files quantities not match";
return -2; return -2;

View File

@ -10,6 +10,7 @@
#include <QDir> #include <QDir>
#include <QObject> #include <QObject>
#include <QMetaType> #include <QMetaType>
#include <QtEndian>
////////////////////////////Thread ////////////////////////////Thread
#include <QThread> #include <QThread>
#include <QMutex> #include <QMutex>