Files
IRIS_FODIS/Source/FS/IS11_Ctrl_Qt.cpp
zhangzhuo 3ce267dccf 1.修改了海阳光学光谱仪派生类,以支持暗像素信息的获取。
2.针对FLAME设备添加了新的实时暗背景扣除函数。
3.修改了部分系统执行逻辑,以支持FLAME的正确运行。
2023-07-17 11:26:56 +08:00

579 lines
13 KiB
C++
Raw Permalink 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 "IS11_Ctrl_Qt.h"
IS11_Ctrl_Qt::IS11_Ctrl_Qt(QObject* parent /*= nullptr*/)
{
m_pSerialPort = new QSerialPort;
m_iBaudRate = 921600;
}
IS11_Ctrl_Qt::~IS11_Ctrl_Qt()
{
delete m_pSerialPort;
}
int IS11_Ctrl_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumber, std::string strDeviceName)
{
QString qstrPortName = QString::fromStdString(ucPortNumber);
m_pSerialPort->setPortName(qstrPortName);
m_pSerialPort->setReadBufferSize(512);
bool bRes = m_pSerialPort->setBaudRate(m_iBaudRate);
if (!bRes)
{
//qDebug() << "Err:setBaudRate Failed.Exit Code:1";
//std::cout << "Err.setBaudRate Failed" << std::endl;
printf("Err:setBaudRate Failed.Exit Code:1");
return 1;
}
bRes = m_pSerialPort->open(QIODevice::ReadWrite);
if (!bRes)
{
//qDebug() << "Err:open Failed.Exit Code:2";
//std::cout << "Err.open Failed" << std::endl;
printf("Err:open Failed.Exit Code:2");
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)
{
printf("Err:FS serial number not match.Exit Code:3");
//qDebug() << "Err:FS serial number not match.Exit Code:3";
//return 3;
}
else
{
return 0;
}
return 0;
}
void IS11_Ctrl_Qt::Close()
{
}
int IS11_Ctrl_Qt::SingleShot(DataFrame& dfData)
{
SendData_CMD03((char*)GET_ALL_DN, sizeof(GET_ALL_DN));
RecvData_CMD03(dfData);
GetExposureTime(m_iExposureTime);
dfData.usExposureTimeInMS = (unsigned short)m_iExposureTime;
return 0;
}
int IS11_Ctrl_Qt::SetExposureTime(int iExposureTimeInMS)
{
QByteArray qbaRecv;
qbaRecv.clear();
unsigned char pucExposureTime[2];
pucExposureTime[0] = iExposureTimeInMS / 256;
pucExposureTime[1] = iExposureTimeInMS % 256;
SendData_CMD06((char *)SET_INTEGRAL_TIME, sizeof(SET_INTEGRAL_TIME), (char*)pucExposureTime, 2);
//SendData_CMD03((char *)GET_INTEGRAL_TIME, sizeof(GET_INTEGRAL_TIME));
int iRes = RecvData_CMD06(qbaRecv);
return iRes;
}
int IS11_Ctrl_Qt::GetExposureTime(int & iExposureTimeInMS)
{
QByteArray qbaRecv;
qbaRecv.clear();
SendData_CMD03((char *)GET_INTEGRAL_TIME, sizeof(GET_INTEGRAL_TIME));
int iRes = RecvData_CMD03(qbaRecv);
iExposureTimeInMS = ((unsigned char)(qbaRecv[0]))*256+ (unsigned char)(qbaRecv[1]);
return iRes;
}
int IS11_Ctrl_Qt::GetDeviceInfo(DeviceInfo & Info)
{
Info.strPN = "IS11";
Info.strSN = "NULL";
return 0;
}
int IS11_Ctrl_Qt::GetDeviceAttribute(DeviceAttribute & Attr)
{
QByteArray qbaRecv;
qbaRecv.clear();
float fCoef[4];
unsigned short usTempCoef[8];
Attr.iPixels = 2048;
Attr.iMinIntegrationTimeInMS = 1;
Attr.iMaxIntegrationTimeInMS = 60000;
SendData_CMD03((char *)GET_WAVELENTH_COEFF, sizeof(GET_WAVELENTH_COEFF));
RecvData_CMD03(qbaRecv);
//memcpy(fTempCoef,qbaRecv,16);
memcpy(usTempCoef, qbaRecv, 16);
for (int i=0;i<8;i++)
{
usTempCoef[i] = qToBigEndian(usTempCoef[i]);
}
//float *pfTemp = (float*)usTempCoef;
memcpy(fCoef, usTempCoef,16);
//Conv_LTB((char*)fTempCoef,16);
for (int i = 1; i <= 2048; i++)
{
Attr.fWaveLengthInNM[i - 1] = fCoef[0] * i*i*i + fCoef[1] * i*i + fCoef[2] * i + fCoef[3];
//setem.WavelenthStr = setem.WavelenthStr + String(setem.wavelenthlist[i - 1]).c_str() + ",";
}
return 0;
}
int IS11_Ctrl_Qt::SetDeviceTemperature(float fTemperature)
{
return 0;
}
int IS11_Ctrl_Qt::GetDeviceTemperature(float & fTemperature)
{
fTemperature = -1000;
return 0;
}
int IS11_Ctrl_Qt::PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float & fPredictedExposureTime)
{
return 0;
}
// unsigned short IS11_Ctrl_Qt::crc16(const uint8_t *pbdata, size_t sz)
// {
// uint16_t i, j, tmp, CRC16;
//
// CRC16 = 0xFFFF; // CRC<52>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ʼֵ
// for (i = 0; i < sz; i++)
// {
// CRC16 ^= pbdata[i];
// for (j = 0; j < 8; j++)
// {
// tmp = (uint16_t)(CRC16 & 0x0001);
// CRC16 >>= 1;
// if (tmp == 1)
// {
// CRC16 ^= 0xa001; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
// }
// }
// }
// return CRC16;
// }
unsigned short IS11_Ctrl_Qt::CalCRC16(const uint8_t *pbData, size_t szLength)
{
uint16_t usCRC16 = CRC16_INIT;
for (size_t i = 0; i < szLength; i++)
{
usCRC16 ^= pbData[i];
for (size_t j = 0; j < 8; j++)
{
if ((usCRC16 & 0x0001) != 0)
{
usCRC16 = (usCRC16 >> 1) ^ CRC16_POLYNOMIAL;
}
else
{
usCRC16 = usCRC16 >> 1;
}
}
}
return usCRC16;
}
void IS11_Ctrl_Qt::Conv_LTB(char * pcData, int iLength)
{
char *TempData = new char[iLength];
memcpy(TempData, pcData, iLength);
for (int i = 0; i < iLength / 2; i++)
{
pcData[2 * i] = TempData[2 * i + 1];
pcData[2 * i + 1] = TempData[2 * i];
/* code */
}
delete[] TempData;
}
int IS11_Ctrl_Qt::SendData_CMD03(char * pcCMD, size_t szCMDLength)
{
QString qstrSend,qstrCRC16;
QByteArray qbaSend;
qbaSend.clear();
//char *pctest=new char[szCMDLength+2];
//memcpy(pctest, pcCMD, szCMDLength);
//ushort ustest = crc16((unsigned char*)pcCMD,szCMDLength);
//qstrCRC16= QString::fromLatin1((const char*)usCRC16, (int)sizeof(uint16_t));
//memcpy(pctest+ szCMDLength,&usCRC16, 2);
//int iReturn = m_pSerialPort->write(pctest,szCMDLength+2);
//delete[] pctest;
uint16_t usCRC16 = CalCRC16((unsigned char*)pcCMD, szCMDLength);
qstrSend = QString::fromLatin1((const char*)pcCMD, (int)szCMDLength);
const char * pucSend = (char *)&usCRC16;
qbaSend.append(qstrSend);
qbaSend.append(pucSend, (int)sizeof(uint16_t));
int iReturn = m_pSerialPort->write(qbaSend);
return iReturn;
}
int IS11_Ctrl_Qt::RecvData_CMD03(QByteArray &qbaRecv)
{
int iRetryCount = 0;
QByteArray qbaOriRecv,qbaTemp;
qbaOriRecv.clear();
qbaTemp.clear();
///read all once
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
while (qbaOriRecv.size() < 2 || ParseHdr(qbaOriRecv, 3) == 1)
{
m_pSerialPort->waitForReadyRead(1000);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
iRetryCount++;
if (iRetryCount>100)
{
qDebug() << "Recv Hdr Err.out of retry time.RecvData_CMD03";
return 1;
}
}
iRetryCount = 0;
while (qbaOriRecv.size()< qbaOriRecv[2]+5)
{
m_pSerialPort->waitForReadyRead(1000);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
iRetryCount++;
if (iRetryCount > 66)
{
qDebug() << "Recv Data Err.out of retry time";
return 2;
}
}
if (qbaOriRecv.size()!= qbaOriRecv[2] + 5)
{
/// can be handled but dont want to
qDebug() << "Wrong Recv data size.RecvData_CMD03_QBA";
return 3;
}
unsigned short usCRCC=CalCRC16((unsigned char *)qbaOriRecv.data(), qbaOriRecv.size()-2);
char *pc = (char *)&usCRCC;
if ((pc[0]== qbaOriRecv[qbaOriRecv.size()-1]&& pc[1]== qbaOriRecv[qbaOriRecv.size()-2])||
(pc[0] == qbaOriRecv[qbaOriRecv.size()-2] && pc[1] == qbaOriRecv[qbaOriRecv.size()-1]))
{
qbaRecv = qbaOriRecv.mid(3, qbaOriRecv.length() - 5);
}
else
{
///error crc
qDebug() << "Recv data crc16 Err."<<pc[1]<< pc[0];
return 4;
}
/*while (ParseHdr(qbaOriRecv, 3)==1)
{
m_pSerialPort->waitForReadyRead(100);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
}*/
return 0;
}
int IS11_Ctrl_Qt::RecvData_CMD03(DataFrame& dfData)
{
int iRecvDataLength = 0;
int iRetryCount = 0;
QByteArray qbaOriRecv, qbaTemp;
qbaOriRecv.clear();
qbaTemp.clear();
///read all once
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
while (qbaOriRecv.size() < 4 || ParseHdr(qbaOriRecv, 3) == 1)
{
m_pSerialPort->waitForReadyRead(1000);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
iRetryCount++;
if (iRetryCount > 66)
{
qDebug() << "Recv Hdr Err.out of retry time";
return 1;
}
}
int length = qbaOriRecv[2] * 256 + qbaOriRecv[3];
iRetryCount = 0;
while (qbaOriRecv.size() < length + 4)
{
m_pSerialPort->waitForReadyRead(1000);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
iRetryCount++;
if (iRetryCount > 66)
{
qDebug() << "Recv Data Err.out of retry time";
return 2;
}
}
if (qbaOriRecv.size() != length + 4)
{
/// can be handled but dont want to
qDebug() << "Wrong Recv data size.RecvData_CMD03_DF";
return 3;
}
QByteArray qbaData;
qbaData = qbaOriRecv.right(length - 4);
int iDataSizeInPixel = qbaData.size() / 2;
unsigned short *pusData = new unsigned short[iDataSizeInPixel];
memcpy(pusData, qbaData, iDataSizeInPixel * 2);
for (size_t i = 0; i < iDataSizeInPixel; i++)
{
dfData.lData[i] = qToBigEndian(pusData[i]);
//qDebug() << dfData.lData[i];
}
///it seems the manufacture not enable crc16 check for this function
// unsigned short usCRCC = CalCRC16((unsigned char *)qbaOriRecv.data(), qbaOriRecv.size() - 2);
// char *pc = (char *)&usCRCC;
// if ((pc[0] == qbaOriRecv[qbaOriRecv.size() - 1] && pc[1] == qbaOriRecv[qbaOriRecv.size() - 2]) ||
// (pc[0] == qbaOriRecv[qbaOriRecv.size() - 2] && pc[1] == qbaOriRecv[qbaOriRecv.size() - 1]))
// {
// //qbaRecv = qbaOriRecv.mid(3, qbaOriRecv.length() - 5);
// //dataframe process here
//
// }
// else
// {
// ///error crc
// qDebug() << "Recv data crc16 Err." << pc[1] << pc[0];
// return 4;
// }
return 0;
}
//int IS11_Ctrl_Qt::RecvData_CMD03(float& fWavelength)
//{
// int iRetryCount = 0;
// QByteArray qbaOriRecv, qbaTemp,qbaRecv;
// qbaOriRecv.clear();
// qbaTemp.clear();
// qbaRecv.clear();
//
// ///read all once
// Read_IS11(qbaTemp);
// qbaOriRecv.append(qbaTemp);
// while (qbaOriRecv.size() < 2 || ParseHdr(qbaOriRecv, 3) == 1)
// {
// m_pSerialPort->waitForReadyRead(100);
// Read_IS11(qbaTemp);
// qbaOriRecv.append(qbaTemp);
// iRetryCount++;
// if (iRetryCount > 20)
// {
// qDebug() << "Recv Hdr Err.out of retry time";
// return 1;
// }
// }
//
// iRetryCount = 0;
// while (qbaOriRecv.size() < qbaOriRecv[2] + 5)
// {
// m_pSerialPort->waitForReadyRead(100);
// Read_IS11(qbaTemp);
// qbaOriRecv.append(qbaTemp);
// iRetryCount++;
// if (iRetryCount > 20)
// {
// qDebug() << "Recv Data Err.out of retry time";
// return 2;
// }
// }
//
// if (qbaOriRecv.size() != qbaOriRecv[2] + 5)
// {
// /// can be handled but dont want to
// qDebug() << "Wrong Recv data size.";
// return 3;
// }
//
// unsigned short usCRCC = CalCRC16((unsigned char *)qbaOriRecv.data(), qbaOriRecv.size() - 2);
// char *pc = (char *)&usCRCC;
// if ((pc[0] == qbaOriRecv[qbaOriRecv.size() - 1] && pc[1] == qbaOriRecv[qbaOriRecv.size() - 2]) ||
// (pc[0] == qbaOriRecv[qbaOriRecv.size() - 2] && pc[1] == qbaOriRecv[qbaOriRecv.size() - 1]))
// {
// qbaRecv = qbaOriRecv.mid(3, qbaOriRecv.length() - 5);
// }
// else
// {
// ///error crc
// qDebug() << "Recv data crc16 Err." << pc[1] << pc[0];
// return 4;
// }
//
// fWavelength = qbaRecv.toFloat();
// return 0;
//}
int IS11_Ctrl_Qt::SendData_CMD06(char *pcCMD, size_t szCMDLength, char *pcValue, size_t szValueLenth)
{
// QString qstrSend, qstrSend1, qstrCRC16;///QByteArray append<6E><64><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD>ֽ<EFBFBD>
// QByteArray qbaSend;
// qbaSend.clear();
//
// qstrSend = QString::fromLatin1(pcCMD, (int)szCMDLength);
// qbaSend.append(qstrSend);
//
// qstrSend1.clear();
// qstrSend1 = QString::fromLatin1(pcValue,(int)szValueLenth);
// qbaSend.append(qstrSend1);
QByteArray qbaSend;
qbaSend.append(pcCMD, szCMDLength);
qbaSend.append(pcValue, szValueLenth);
unsigned short usCRC16 = CalCRC16((unsigned char*)qbaSend.data(), qbaSend.size());
const char * pucSend = (char *)&usCRC16;
qbaSend.append(pucSend, (int)sizeof(unsigned short));
int iReturn = m_pSerialPort->write(qbaSend);
return 0;
}
int IS11_Ctrl_Qt::RecvData_CMD06(QByteArray &qbaRecv)
{
int iRetryCount = 0;
QByteArray qbaOriRecv, qbaTemp;
qbaOriRecv.clear();
qbaTemp.clear();
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
while (qbaOriRecv.size() < 2 || ParseHdr(qbaOriRecv, 6) == 1)
{
m_pSerialPort->waitForReadyRead(1000);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
iRetryCount++;
if (iRetryCount > 100)
{
qDebug() << "Recv Hdr Err.out of retry time.RecvData_CMD06";
return 1;
}
}
iRetryCount = 0;
while (qbaOriRecv.size() < 8)
{
m_pSerialPort->waitForReadyRead(1000);
Read_IS11(qbaTemp);
qbaOriRecv.append(qbaTemp);
iRetryCount++;
if (iRetryCount > 66)
{
qDebug() << "Recv Data Err.out of retry time";
return 2;
}
}
if (qbaOriRecv.size() != 8)
{
/// can be handled but dont want to
qDebug() << "Wrong Recv data size.RecvData_CMD06";
return 3;
}
unsigned short usCRCC = CalCRC16((unsigned char *)qbaOriRecv.data(), qbaOriRecv.size() - 2);
char *pc = (char *)&usCRCC;
if ((pc[0] == qbaOriRecv[qbaOriRecv.size() - 1] && pc[1] == qbaOriRecv[qbaOriRecv.size() - 2]) ||
(pc[0] == qbaOriRecv[qbaOriRecv.size() - 2] && pc[1] == qbaOriRecv[qbaOriRecv.size() - 1]))
{
qbaRecv = qbaOriRecv.mid(2, 4);
}
else
{
///error crc
qDebug() << "Recv data crc16 Err." << pc[1] << pc[0];
return 4;
}
return 0;
}
int IS11_Ctrl_Qt::ParseHdr(QByteArray &qbaData, char cHdrType)
{
QByteArray qbaTemp(qbaData);
while ((qbaTemp[0] != (char)0x01) &&(qbaTemp[1] != cHdrType))
{
qbaTemp.remove(0, 1);
if (qbaTemp.size()<=2)
{
return 1;
}
}
if (qbaTemp!= qbaData)
{
///warning some communication error may happened.
qbaData = qbaTemp;
return 1000;
}
return 0;
}
int IS11_Ctrl_Qt::Write_IS11(char * pcCMD, size_t szCMDLength)
{
QString qstrSend;
QByteArray qbaSend;
qbaSend.clear();
qstrSend = QString::fromLatin1((const char*)pcCMD, (int)szCMDLength);
return (int)m_pSerialPort->write(qbaSend);
}
int IS11_Ctrl_Qt::Read_IS11(QByteArray &qbaRecv)
{
//m_pSerialPort->waitForReadyRead(100);
qbaRecv = m_pSerialPort->readAll();
return qbaRecv.size();
}