1.修改了Grabber中FSController的初始化过程,现在不会再出现QSerialPort跨线程调用问题。 2.修改了Grabber中主采集线程的一个信号量重置bug,该bug可能会引发采集慢的光谱仪在串口模式下数据不全。

3.修改了采集单帧功能函数,现在ATP控制类中的singleshot函数依旧会检查数据校验和,但不会应为校验和错误删除数据,以适配IS1校验和问题。注意,数据长度不对时还是会放弃本帧数据。                                                                             4.优化了ATP谱仪控制类中的多个函数,提高了其响应速度。
This commit is contained in:
2022-01-20 09:36:35 +08:00
parent 8ce6cb4755
commit 6d20b2d3fb
18 changed files with 405 additions and 99 deletions

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,7 +1,7 @@
[DEVICE INFO]
TotalSpectrometer=1
[FS1]
Model=ISIF
Model=IS1
Port=COM7
UID=21351029
AEMax=0.85

View File

@ -91,10 +91,10 @@ int main(int argc, char *argv[])
m_mdgGrabber.SetContext(m_struRuntimeParams, m_dfpSaver, m_sTimer, m_mduUploader);
m_mdgGrabber.Init_Normal();
m_mduUploader.Initialize();
m_mduUploader.SetErr(m_eiErrInfo);
m_mduUploader.UploadInfo();
m_mduUploader.UploadErr();
// m_mduUploader.Initialize();
// m_mduUploader.SetErr(m_eiErrInfo);
// m_mduUploader.UploadInfo();
// m_mduUploader.UploadErr();
m_pqDataGrabberThreadHolder->start();
m_pqTimerThreadHolder->start();

View File

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

View File

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

View File

@ -81,8 +81,8 @@ void CMainDataGrabber::Init_Normal()
{
InitThreadStatus();
InitializeWorkers();
SetupMsgPipelines();
StartWorkers();
SetupMsgPipelines();
}
int CMainDataGrabber::SetGrabberParams(RunTimeGrabberParams struGrabberRTParams)
@ -159,6 +159,16 @@ int CMainDataGrabber::InitThreadStatus()
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()
{
for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++)
@ -176,20 +186,20 @@ int CMainDataGrabber::InitializeWorkers()
CAbstractFSController* m_pWorkThread = new CAbstractFSController;
m_pWorkThread->SetRunParas(i, fsInfo);
m_pWorkThread->InitializeFSControl();
DeviceAttribute daAttrTemp;
m_pWorkThread->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_pControlThread.push_back(m_pWorkThread);
// m_pWorkThread->InitializeFSControl();
//
// DeviceAttribute daAttrTemp;
// m_pWorkThread->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_pControlThread.push_back(m_pWorkThread);
}
m_struRTGP.fscParams = m_struDeviceContext;
m_pdfpSaver->SetDeviceInfo(m_struDeviceContext);
m_pmduUploader->SetRTGP(m_struRTGP);
// m_struRTGP.fscParams = m_struDeviceContext;
// m_pdfpSaver->SetDeviceInfo(m_struDeviceContext);
// m_pmduUploader->SetRTGP(m_struRTGP);
return 0;
}
@ -202,19 +212,26 @@ int CMainDataGrabber::StartWorkers()
m_pControlThread[i]->moveToThread(pWorkThreadHolder);
pWorkThreadHolder->start();
// m_pControlThread[i]->InitializeFSControl();
// 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_pControlThread[i]->InitializeFSControl_Self();
/// <summary>
while (!m_pControlThread[i]->iFlagInit)
{
Delay_MSec(1000);
}
/// </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_pdfpSaver->SetDeviceInfo(m_struDeviceContext);
// m_pmduUploader->SetRTGP(m_struRTGP);
m_struRTGP.fscParams = m_struDeviceContext;
m_pdfpSaver->SetDeviceInfo(m_struDeviceContext);
m_pmduUploader->SetRTGP(m_struRTGP);
return 0;
}
@ -427,6 +444,7 @@ int CMainDataGrabber::GrabOnceFinished()
for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++)
{
ResetThreadStatus();
////move to
qDebug()<<"Start ILMES_MoveToPos:"<<i+1;
//m_ctrlLS.ILMES_MoveToPos(i+1);
@ -465,6 +483,8 @@ int CMainDataGrabber::GrabOnceFinished()
SubDataFrame(vecSignal[j], vecDark[j], m_struDeviceContext.usPixels[i]);
}
vecData.push_back(vecSignal);
qDebug() << "ucDeviceNumber" << i << " Data Size" << vecSignal.size();
//vecData[i].push_back();
}
//emit SignalPushOneDataFrame(vecData);

View File

@ -17,7 +17,7 @@ class CMainDataGrabber :public QObject
Q_OBJECT
public:
CMainDataGrabber(QObject* parent = nullptr);
~CMainDataGrabber();
~CMainDataGrabber();
private:
vector<CAbstractFSController *> m_pControlThread;
@ -56,6 +56,7 @@ private:
int SetUploader(CMainDataUploader &mduUploader/*, RunTimeGrabberParams struGrabberRTParams*/);
int InitThreadStatus();
int ResetThreadStatus();
int InitializeWorkers();
int StartWorkers();
int SetupMsgPipelines();

View File

@ -52,7 +52,9 @@ void Scheduler::StartAsPlanned()
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()

View File

@ -15,7 +15,7 @@ ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt()
{
delete m_pSerialPort;
}
}
// int ZZ_ATPControl_Serial_Qt::ReInit()
@ -63,10 +63,19 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe
return 2;
}
// int testi;
// GetDeviceAttribute(m_daDeviceAttr);
// GetExposureTime(testi);
// SetExposureTime(10000);
// DataFrame test;
// SingleShot(test);
GetDeviceInfo(m_diDeviceInfo);
GetExposureTime_Init();
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";
return 3;
@ -227,11 +236,11 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr)
return 1;
}
float fWaveLengthCoef[4];
memcpy(fWaveLengthCoef, qbRecv.data()+16, 4 * sizeof(float));
for (int i=0;i< m_daDeviceAttr.iPixels;i++)
{
memcpy(fWaveLengthCoef, qbRecv.data() + 16, 4 * sizeof(float));
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];
}
}
Attr = m_daDeviceAttr;
@ -243,6 +252,38 @@ int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature)
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 iSize = qbCommand.size() + 3;
@ -262,10 +303,10 @@ int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand)
qbSend.append(iSum % 256);
qint64 qi64Write= m_pSerialPort->write(qbSend);
qint64 qi64Write = m_pSerialPort->write(qbSend);
if (qi64Write != qbSend.size())
{
qDebug() << "Err:write Failed.Exit Code:1"<< qi64Write;
qDebug() << "Err:write Failed.Exit Code:1" << qi64Write;
return 1;
}
@ -280,13 +321,13 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
int iCounter = 0;
while (qbData.size() < 4)
{
m_pSerialPort->waitForReadyRead(50);
m_pSerialPort->waitForReadyRead(600);
QByteArray qbTemp = m_pSerialPort->readAll();
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;
}
iCounter++;
@ -294,7 +335,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
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();
qDebug() << "Err:RecvData Failed,Wrong Header.Exit Code:2" << qbData.size();
return 2;
}
@ -302,12 +343,12 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
int iLength = qbData[2] * 256 + qbData[3] + 2;
while (qbData.size() < iLength)
{
m_pSerialPort->waitForReadyRead(50);
m_pSerialPort->waitForReadyRead(5000);
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;
}
iCounter++;
@ -321,15 +362,80 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData)
ZZ_U16 usCheckSum = 0;
for (int i = 0; i < iCheckSumLength; i++)
{
usCheckSum += qbData[i+2];
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" << qbData.size();
qbData.clear();
return 4;
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 = 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;
@ -339,7 +445,7 @@ int ZZ_ATPControl_Serial_Qt::ParseData(QByteArray &qbData)
{
if (qbData.size() < 6)
{
qDebug() << "Err:ParseData Failed,Not Enough Data.Exit Code:1" << qbData.size();
qDebug() << "Err:ParseData Failed,Not Enough Data.Exit Code:1" << qbData.size();
return 1;
}
qbData.remove(0, 5);
@ -498,19 +604,37 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM
int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS)
{
QByteArray qbExposureTime,qbRecv;
qbExposureTime.append(SET_INTEGRATION_TIME);
m_iExposureTime = iExposureTimeInMS;
QByteArray qbExposureTime, qbRecv;
//qbExposureTime.append(SET_INTEGRATION_TIME);
qbExposureTime.resize(3);
qbExposureTime[0] = SET_INTEGRATION_TIME;
qbExposureTime[1] = iExposureTimeInMS >> 8;
qbExposureTime[2] = iExposureTimeInMS & 0xFF;
SendCommand(qbExposureTime);
RecvData(qbRecv);
ParseData(qbRecv);
int iRes = SendCommand(qbExposureTime);
if (iRes != 0)
{
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)
{
qDebug() << "Err:SetExposureTime Failed.Exit Code:1" ;
qDebug() << "Err:SetExposureTime Failed.Exit Code:1";
return 1;
}
@ -519,16 +643,34 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS)
int ZZ_ATPControl_Serial_Qt::GetExposureTime(int &iExposureTimeInMS)
{
QByteArray qbSend, qbRecv;
qbSend.clear();
qbRecv.clear();
qbSend.append(GET_INTEGRATION_TIME);
qbSend.resize(3);
qbSend[1] = 0x00;
qbSend[2] = 0x01;
SendCommand(qbSend);
RecvData(qbRecv);
ParseData(qbRecv);
// 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;
// }
//
// iExposureTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256;
iExposureTimeInMS = m_iExposureTime;
return 0;
}
@ -540,13 +682,30 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData)
qbRecv.clear();
qbSend.append(SYNC_GET_DATA);
qbSend.resize(3);
qbSend[1] = 0x00;
qbSend[2] = 0x01;
SendCommand(qbSend);
RecvData(qbRecv);
ParseData(qbRecv);
// qbSend[1] = 0x00;
// qbSend[2] = 0x01;
qbSend[1] = m_iExposureTime >> 8;;
qbSend[2] = m_iExposureTime & 0xFF;
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)
{
@ -558,11 +717,23 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData)
//int aaa = qbRecv.size();
int iDataSizeInPixel = (qbRecv.size() - 1) / 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;
}
@ -576,14 +747,29 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(int &iPixels)
qbSend.resize(3);
qbSend[1] = 0x00;
qbSend[2] = 0x01;
SendCommand(qbSend);
RecvData(qbRecv);
ParseData(qbRecv);
int iRes = SendCommand(qbSend);
if (iRes != 0)
{
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)
{
qDebug() << "Err:SingleShot Failed.Exit Code:1";
return 1;
qDebug() << "Err:SingleShotP Failed.Exit Code:4";
return 4;
}
else
{
@ -602,6 +788,8 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(int &iPixels)
int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature)
{
fTemperature = 0;
QByteArray qbSend, qbRecv;
qbSend.clear();
qbRecv.clear();
@ -609,9 +797,28 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature)
qbSend.resize(3);
qbSend[1] = 0x00;
qbSend[2] = 0x01;
SendCommand(qbSend);
RecvData(qbRecv);
ParseData(qbRecv);
int iRes = SendCommand(qbSend);
if (iRes != 0)
{
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;
}

View File

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

View File

@ -231,7 +231,7 @@ bool DataFileProcessor::WriteData()
qstrTemp = QString("_P%1").arg(j + 1);
qfData.write(qstrTemp.toLatin1());
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");
}

View File

@ -23,8 +23,8 @@ namespace ZZ_MISCDEF
{
typedef struct tagDataFrame
{
ZZ_U32 usExposureTimeInMS;
ZZ_S32 lData[4096];
ZZ_U32 usExposureTimeInMS = 0;
ZZ_S32 lData[4096] = {0};
float fTemperature = 0;
double dTimes = 0;
}DataFrame;

View File

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