From b06596ac92eff91255836aa6e54d6c4fb79ea706 Mon Sep 17 00:00:00 2001 From: tangchao Date: Thu, 21 Apr 2022 14:00:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=EF=BC=881=EF=BC=89=E5=B0=86atp=E5=85=89?= =?UTF-8?q?=E8=B0=B1=E4=BB=AA=E7=9A=84=E6=8E=A7=E5=88=B6=E7=B1=BB=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=88=B0=E5=8D=93=E5=93=A5=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E8=BF=9E=E6=8E=A5atp=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20=EF=BC=882=EF=BC=89=E5=B0=86?= =?UTF-8?q?=E8=AF=BB=E5=8F=96OceanOptics=E7=9A=84=E9=9D=9E=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E6=AD=A3=E6=96=87=E4=BB=B6=20=20=E9=9B=86?= =?UTF-8?q?=E6=88=90=E5=88=B0=E5=AE=9A=E6=A0=87=E7=A8=8B=E5=BA=8F=E4=B8=AD?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header_Files/ATPControl_Serial_QT.h | 23 +- .../FiberSpectrometerOperationBase.h | 8 + .../Header_Files/ZZ_Types.h | 6 + .../Header_Files/atpFiberImager.h | 2 + .../Header_Files/library.h | 2 + .../Header_Files/oceanOpticsFiberImager.h | 2 + .../Source_Files/ATPControl_Serial_QT.cpp | 134 ++++---- .../Source_Files/atpFiberImager.cpp | 9 +- .../Source_Files/library.cpp | 71 +++++ .../calibration_console/Source_Files/main.cpp | 295 +++++++++++++++--- .../Source_Files/oceanOpticsFiberImager.cpp | 7 + 11 files changed, 431 insertions(+), 128 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h b/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h index 937ffde..bfedc57 100644 --- a/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h +++ b/othersoft/calibration_console/Header_Files/ATPControl_Serial_QT.h @@ -3,6 +3,7 @@ ////////////////////////////////////////////////////////////////////////// #pragma once //#include "pch.h" + #include "ZZ_Types.h" #include "ZZ_Math.h" #include @@ -14,7 +15,7 @@ using namespace ZZ_MISCDEF; using namespace ZZ_MISCDEF::ATP; using namespace ZZ_MISCDEF::IRIS::FS; -class ZZ_ATPControl_Serial_Qt :public CIrisFSBase +class ZZ_ATPControl_Serial_Qt:public CIrisFSBase { Q_OBJECT public: @@ -33,10 +34,10 @@ public: void Close(); //单次测试采集 用以确认设备像素数 - int SingleShot(int& iPixels); + int SingleShot(int &iPixels); //单次数据采集 - int SingleShot(DataFrame& dfData); + int SingleShot(DataFrame &dfData); //单次暗背景采集 //int SingleShotDark(ATPDataFrame &dfData); @@ -46,15 +47,15 @@ public: int SetExposureTime(int iExposureTimeInMS); //获取曝光时间设置 - int GetExposureTime(int& iExposureTimeInMS); + int GetExposureTime(int &iExposureTimeInMS); //int GetWaveLength(float *pfWaveLength); //获取设备信息 - int GetDeviceInfo(DeviceInfo& Info); + int GetDeviceInfo(DeviceInfo &Info); //获取设备特征数据 - int GetDeviceAttribute(DeviceAttribute& Attr); + int GetDeviceAttribute(DeviceAttribute &Attr); //int GetDeviceListInfo(); //use type name to enum @@ -62,10 +63,12 @@ public: int SetDeviceTemperature(float fTemperature); //获取温度 - int GetDeviceTemperature(float& fTemperature); + int GetDeviceTemperature(float &fTemperature); //自动曝光 - int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float& fPredictedExposureTime); + int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float &fPredictedExposureTime); +private: + int SetAvgTimes(int iTimes = 1); #ifdef _DEBUG public: @@ -74,7 +77,7 @@ private: #endif //port int m_iBaudRate; - QSerialPort* m_pSerialPort; + QSerialPort *m_pSerialPort; //ATP DeviceInfo m_diDeviceInfo; @@ -94,6 +97,6 @@ public slots: int Init_Self(); signals: void SignalInit_Self(); - //private slots : +//private slots : //void ReadMessage(); }; \ No newline at end of file diff --git a/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h b/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h index 1ad2686..5318d9e 100644 --- a/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h +++ b/othersoft/calibration_console/Header_Files/FiberSpectrometerOperationBase.h @@ -30,6 +30,14 @@ public: virtual void singleShot(DataFrame &dfData) = 0; +// typedef struct coeffs +// { +// ZZ_U32 coeffsCounter; +// double coeffs[100]; +// }coeffsFrame; + virtual void getNonlinearityCoeffs(coeffsFrame &coeffs) = 0; + + // ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number) = 0; DataFrame m_IntegratingSphereData; diff --git a/othersoft/calibration_console/Header_Files/ZZ_Types.h b/othersoft/calibration_console/Header_Files/ZZ_Types.h index c5e2210..8be8efa 100644 --- a/othersoft/calibration_console/Header_Files/ZZ_Types.h +++ b/othersoft/calibration_console/Header_Files/ZZ_Types.h @@ -30,6 +30,12 @@ namespace ZZ_MISCDEF double dTimes = 0; }DataFrame; + typedef struct coeffs//tc添加----------------------- + { + ZZ_U32 coeffsCounter; + double coeffs[100]; + }coeffsFrame; + typedef struct tagDeviceInfo { std::string strPN; diff --git a/othersoft/calibration_console/Header_Files/atpFiberImager.h b/othersoft/calibration_console/Header_Files/atpFiberImager.h index 41ff34e..5c3d337 100644 --- a/othersoft/calibration_console/Header_Files/atpFiberImager.h +++ b/othersoft/calibration_console/Header_Files/atpFiberImager.h @@ -31,6 +31,8 @@ public: void singleShot(DataFrame &dfData); + void getNonlinearityCoeffs(coeffsFrame &coeffs); + ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); // DataFrame m_IntegratingSphereData; diff --git a/othersoft/calibration_console/Header_Files/library.h b/othersoft/calibration_console/Header_Files/library.h index d9598ac..c1ca603 100644 --- a/othersoft/calibration_console/Header_Files/library.h +++ b/othersoft/calibration_console/Header_Files/library.h @@ -11,6 +11,7 @@ #include "IrisFiberSpectrometerBase.h" #include "api/seabreezeapi/SeaBreezeAPI.h" +#include "api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h" using namespace std; @@ -53,6 +54,7 @@ public: //tc static const char* get_error_string(int error); + void test_nonlinearity_coeffs_feature(); private: int m_iSpectralmeterHandle; DeviceInfo m_deviceInfo; diff --git a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h index ab5f1ff..135ce4a 100644 --- a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h +++ b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h @@ -31,6 +31,8 @@ public: void singleShot(DataFrame &dfData); + void getNonlinearityCoeffs(coeffsFrame &coeffs); + ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); // DataFrame m_IntegratingSphereData; diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 586339f..8fb5e8d 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -9,7 +9,7 @@ ZZ_ATPControl_Serial_Qt::ZZ_ATPControl_Serial_Qt(QObject* parent /*= nullptr*/) //emit SignalInit_Self(); } -ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt() +ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt()// { if (m_pSerialPort != NULL) { @@ -72,7 +72,7 @@ int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumbe GetDeviceInfo(m_diDeviceInfo); GetExposureTime_Init(); - + SetAvgTimes(1); std::string::size_type szPostion = m_diDeviceInfo.strSN.find(strDeviceName); if (szPostion == std::string::npos) @@ -196,15 +196,15 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) } m_daDeviceAttr.iMaxIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; - + /// int iTempExpTime = 0; GetExposureTime(iTempExpTime); - iRes = SetExposureTime(10); + iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SetExposureTime error.Exit Code:2"; - return 2; + //return 2; } iRes = SingleShot(m_daDeviceAttr.iPixels); if (iRes != 0) @@ -214,8 +214,7 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) } SetExposureTime(iTempExpTime); - - + /// qbSend.clear(); qbRecv.clear(); qbSend.append(GET_WAVELENGTH_CALIBRATION_COEF); @@ -257,6 +256,36 @@ int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature) return 0; } +int ZZ_ATPControl_Serial_Qt::SetAvgTimes(int iTimes /*= 1*/) +{ + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(SET_AVERAGE_NUMBER); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetAvgTimes Failed.Exit Code:3"; + return 3; + } + return 0; +} + int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init() { QByteArray qbSend, qbRecv; @@ -326,7 +355,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) int iCounter = 0; while (qbData.size() < 4) { - m_pSerialPort->waitForReadyRead(1000); + m_pSerialPort->waitForReadyRead(5000); QByteArray qbTemp = m_pSerialPort->readAll(); qbData.append(qbTemp); @@ -335,7 +364,6 @@ int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray &qbData) qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); return 1; } - iCounter++; } @@ -397,7 +425,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { - qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Not Enough Data.Exit Code:1" << qbData.size(); return 1; } iCounter++; @@ -405,7 +433,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(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_ShortLag Failed,Wrong Header.Exit Code:2" << qbData.size(); return 2; } @@ -418,7 +446,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) if (iCounter > 6) { - qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size(); + qDebug() << "Err:RecvData_ShortLag Failed,Incomplete Data.Exit Code:3" << qbData.size(); return 3; } iCounter++; @@ -438,7 +466,7 @@ int ZZ_ATPControl_Serial_Qt::RecvData_ShortLag(QByteArray &qbData) 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; + qDebug() << "Err:RecvData_ShortLag Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; //qbData.clear(); //return 4; return 0; @@ -467,16 +495,9 @@ int ZZ_ATPControl_Serial_Qt::Init_Self() int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float &fPredictedExposureTime) { - int m_iThreadID=0; -// qDebug() << "--------------------------Starting PerformAutoExposure" << " Thread ID:" << m_iThreadID; using namespace ZZ_MATH; -// float fPredictedExposureTime; int iDeviceDepth = 65535; - - -// qDebug() << "MAX---Min" << fMaxScaleFactor << "---" << fMinScaleFactor << " Thread ID:" << m_iThreadID; - bool bFlagIsOverTrying = false; bool bFlagIsLowerMinExposureTime = false; bool bFlagIsOverMaxExposureTime = false; @@ -486,16 +507,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bool bIsValueOverflow = false; bool bIsLastValueOverflow = false; - int iExposureTime = 0; + float fExposureTime = 0; float fTempExposureTime = 0; double fLastExposureTime = 0.1; int iRepeatCount = 0; - //int iRes = m_pFSCtrl->SetExposureTime(1000);//need change to load from files - int iRes = 0; + int iRes = SetExposureTime(2000);//need change to load from files if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; return 1; } @@ -509,49 +529,42 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bFlagIsOverTrying = true; break; } - //m_pFSCtrl->SetExposureTime(5000); - GetExposureTime(iExposureTime); -// qDebug() << "Current ExpTime:" << iExposureTime << " Thread ID:" << m_iThreadID; - //m_pFSCtrl->SetExposureTime(2500); - //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; - fTempExposureTime = iExposureTime; + + fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + fTempExposureTime = fExposureTime; iRes = SingleShot(dfTemp); - //iRes = m_pFSCtrl->SingleShot(dfTemp); if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2"; return 2; } HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels); double dSum = 0; - int iCount = m_daDeviceAttr.iPixels / 200; + int iCount = m_daDeviceAttr.iPixels / 100; for (int i = 0; i < iCount; i++) { dSum += dfTemp.lData[i]; } double dTemp = dSum / iCount; -// qDebug() << "Avg " << dTemp << " Thread ID:" << m_iThreadID; - if (dTemp >= iDeviceDepth * 0.99) { bIsValueOverflow = true; if (!bIsLastValueOverflow) { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; } else { - iExposureTime = iExposureTime / 2; + fExposureTime = fExposureTime / 2; } } else if (iDeviceDepth * fMaxScaleFactor >= dTemp && dTemp >= iDeviceDepth * fMinScaleFactor) { -// qDebug() << "trace bFlagIsAutoExposureOK =1 " << iExposureTime << " Thread ID:" << m_iThreadID; bFlagIsAutoExposureOK = 1; } else if (dTemp > iDeviceDepth * fMaxScaleFactor) @@ -559,11 +572,11 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsValueOverflow = true; if (!bIsLastValueOverflow) { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; } else { - iExposureTime = iExposureTime * 3 / 4; + fExposureTime = fExposureTime * 3 / 4; } } else if (dTemp < iDeviceDepth * fMinScaleFactor) @@ -571,15 +584,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsValueOverflow = false; if (bIsLastValueOverflow) { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; } else { double dFactor; dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); - iExposureTime = (float)(iExposureTime / dFactor); + fExposureTime = (float)(fExposureTime / dFactor); } - if (/*fExposureTime > 100 || */iExposureTime < 10) + if (/*fExposureTime > 100 || */fExposureTime < 10) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; @@ -589,41 +602,29 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM bIsLastValueOverflow = bIsValueOverflow; fLastExposureTime = fTempExposureTime; - if (iExposureTime > 65000) + if (fExposureTime > 13000) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; - float fPredictedExposureTime = 65000; - iRes = SetExposureTime(65000); + fPredictedExposureTime = 13000; + iRes = SetExposureTime(13000); if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3"; 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 " << m_daDeviceAttr.iMaxIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID; - } bFlagIsOverMaxExposureTime = true; break; } - iRes = SetExposureTime((int)iExposureTime); + iRes = SetExposureTime((int)fExposureTime); if (iRes != 0) { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4"; return 3; } - else - { - qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; - } } - fPredictedExposureTime = iExposureTime; -// qDebug() << "--------------------------Stop PerformAutoExposure" << " Thread ID:" << m_iThreadID; - //emit SignalAcqFinished(m_iThreadID, 1); - + fPredictedExposureTime = fExposureTime; return 0; } @@ -717,9 +718,8 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) qbSend.resize(3); // qbSend[1] = 0x00; // qbSend[2] = 0x01; - int iTemp=m_iExposureTime; - qbSend[1] = iTemp >> 8;; - qbSend[2] = iTemp & 0xFF; + qbSend[1] = m_iExposureTime >> 8;; + qbSend[2] = m_iExposureTime & 0xFF; int iRes = SendCommand(qbSend); if (iRes != 0) { @@ -762,11 +762,9 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) // dfData.lData[i] = usData[i]; // } } - float fTemp; - GetDeviceTemperature(fTemp); dfData.usExposureTimeInMS = m_iExposureTime; - dfData.fTemperature = fTemp; + return 0; diff --git a/othersoft/calibration_console/Source_Files/atpFiberImager.cpp b/othersoft/calibration_console/Source_Files/atpFiberImager.cpp index dbcdb09..2089145 100644 --- a/othersoft/calibration_console/Source_Files/atpFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/atpFiberImager.cpp @@ -18,13 +18,13 @@ void ATPFiberImager::connectFiberSpectrometer(QString& SN, QString& pixelCount, m_FiberSpectrometer = new ZZ_ATPControl_Serial_Qt(); - m_FiberSpectrometer->Initialize(false, mUcPortNumber, "ocean_optics"); + m_FiberSpectrometer->Initialize(false, mUcPortNumber, "OPTOSKY"); DeviceInfo deviceInfo;// DeviceAttribute deviceAttribute; m_FiberSpectrometer->GetDeviceInfo(deviceInfo); - m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute); + m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute);//????? SN = QString::fromStdString(deviceInfo.strSN); pixelCount = QString::number(deviceAttribute.iPixels); @@ -86,6 +86,11 @@ void ATPFiberImager::singleShot(DataFrame &dfData) m_FiberSpectrometer->SingleShot(dfData); } +void ATPFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs) +{ + printf("This is ATPFiberImager.\n"); +} + void ATPFiberImager::recordDark(QString path) { //获取设备信息 diff --git a/othersoft/calibration_console/Source_Files/library.cpp b/othersoft/calibration_console/Source_Files/library.cpp index 45173d6..b9ace14 100644 --- a/othersoft/calibration_console/Source_Files/library.cpp +++ b/othersoft/calibration_console/Source_Files/library.cpp @@ -516,6 +516,77 @@ const char* OceanOptics_lib::get_error_string(int error) return buffer; } +void OceanOptics_lib::test_nonlinearity_coeffs_feature() +{ + using namespace seabreeze; + using namespace seabreeze::api; + using namespace std; + + NonlinearityCoeffsFeatureAdapter tmp(); + + + + + + + + + + + +// int error = 0; +// int number_of_nonlinearity_coeff_features; +// long *nonlinearity_coeff_feature_ids = 0; +// double buffer[10]; +// int i; +// int length; +// +// printf("\n\tTesting nonlinearity coefficient features:\n"); +// +// printf("\t\tGetting number of nonlinearity coefficient features:\n"); +// number_of_nonlinearity_coeff_features = +// sbapi_get_number_of_nonlinearity_coeffs_features(m_iSpectralmeterHandle, &error); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); +// +// if(0 == number_of_nonlinearity_coeff_features) { +// printf("\tNo nonlinearity coefficient capabilities found.\n"); +//// tallyUnsupportedFeatures(unsupportedFeatureCount); +// +// return; +// } +// +// nonlinearity_coeff_feature_ids = +// (long *)calloc(number_of_nonlinearity_coeff_features, sizeof(long)); +// printf("\t\tGetting nonlinearity coefficient feature IDs...\n"); +// number_of_nonlinearity_coeff_features = sbapi_get_nonlinearity_coeffs_features( +// m_iSpectralmeterHandle, &error, nonlinearity_coeff_feature_ids, +// number_of_nonlinearity_coeff_features); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); +// +// for(i = 0; i < number_of_nonlinearity_coeff_features; i++) { +// printf("\t\t%d: Testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, m_iSpectralmeterHandle, nonlinearity_coeff_feature_ids[i]); +// +// printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); +// memset(buffer, (int)0, sizeof(buffer)); +// length = sbapi_nonlinearity_coeffs_get(m_iSpectralmeterHandle, +// nonlinearity_coeff_feature_ids[i], &error, buffer, 10); +// printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); +// +// if(0 == error && length > 0) { +// printf("\t\t\t\tFirst calibration term: %1.2e\n", buffer[0]); +// } +// +// printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, m_iSpectralmeterHandle, nonlinearity_coeff_feature_ids[i]); +// } +// free(nonlinearity_coeff_feature_ids); +// +// printf("\tFinished testing nonlinearity coefficient capabilities.\n"); +} + string OceanOptics_lib::GetDeviceType(int index) { char type[16]; diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index 843c75b..de43c24 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -47,6 +47,9 @@ void logout(QString str); void createDirectory(QString fullPath); bool isFileExist(QString fullFileName); +int getNonlinearityCoeffs2(long deviceID, double * coeffs); +int getNonlinearityCoeffs1(double * coeffs); + int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); @@ -88,16 +91,17 @@ int main(int argc, char *argv[]) switch (query.deviceType) { case OPTOSKY: - m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"ocean_optics"); + m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"OPTOSKY"); break; case OceanOptics: - m_FiberSpectrometer = new OceanOpticsFiberImager(); + m_FiberSpectrometer = new OceanOpticsFiberImager();// break; case UnknownDevice: parser.showHelp(); Q_UNREACHABLE(); } + //连接光谱仪 QString message; QString SN; @@ -106,66 +110,115 @@ int main(int argc, char *argv[]) logout("
Connectting the fiber spectrometer!"); m_FiberSpectrometer->connectFiberSpectrometer(SN, pixelCount, wavelengthInfo); - //自动曝光 - logout("
AutoExpose!"); - m_FiberSpectrometer->autoExpose(); - - int iExposureTime; - m_FiberSpectrometer->getExposureTime(iExposureTime); - - message="
ExposureTime: " + QString::number(iExposureTime) + ""; - logout(message); - - //程序sleep:等待关闭快门 - message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; - logout(message); - QThread::sleep(query.sleepTimeinSecond); - - //采集暗帧 - logout("
Record dark frame!"); - m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); - //程序sleep:等待打开快门 - message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; - logout(message); - QThread::sleep(query.sleepTimeinSecond); - - //采集积分球光谱 - logout("
Record integrating sphere frame!"); - m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); - - //准备定标文件数据 - logout("
readAndResample_StandardLightFile!"); +// //自动曝光 +// logout("
AutoExpose!"); +// m_FiberSpectrometer->autoExpose(); +// +// int iExposureTime; +// m_FiberSpectrometer->getExposureTime(iExposureTime); +// +// message="
ExposureTime: " + QString::number(iExposureTime) + ""; +// logout(message); +// +// //程序sleep:等待关闭快门 +// message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; +// logout(message); +// QThread::sleep(query.sleepTimeinSecond); +// +// //采集暗帧 +// logout("
Record dark frame!"); +// m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); +// +// +// //程序sleep:等待打开快门 +// message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; +// logout(message); +// QThread::sleep(query.sleepTimeinSecond); +// +// //采集积分球光谱 +// logout("
Record integrating sphere frame!"); +// m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); +// +// //准备定标文件数据 +// logout("
readAndResample_StandardLightFile!"); DeviceAttribute deviceAttribute; DeviceInfo deviceInfo; m_FiberSpectrometer->getDeviceAttribute(deviceAttribute); m_FiberSpectrometer->getDeviceInfo(deviceInfo); +// +// CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); +// m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); +// +// //生成辐射定标文件 +// if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" +// { +// QDateTime curDateTime = QDateTime::currentDateTime(); +// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); +// QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); +// +// query.calFileOutputName=calFileName; +// } +// logout("
Produce calibration file!"); +// m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); +// +// //复制辐射定标文件 +// QDateTime curDateTime = QDateTime::currentDateTime(); +// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); +// QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); +// copyFileToPath(query.calFileOutputName,destName,true); - CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); - m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); - - //生成辐射定标文件 - if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" + //判断仪器类型是否为海洋光学,将结果存储在变量isOcean中 + auto * p_C = dynamic_cast(m_FiberSpectrometer); + bool isOcean = false;// + if (p_C != nullptr) { - QDateTime curDateTime = QDateTime::currentDateTime(); - QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); - QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); +// cout << "Match!!" << endl; + isOcean=true; - query.calFileOutputName=calFileName; +// coeffsFrame tmp; +// m_FiberSpectrometer->getNonlinearityCoeffs(tmp); + } + else + { + cout << "not OceanOpticsFiberImager!!" << endl; } - logout("
Produce calibration file!"); - m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); - - //复制辐射定标文件 - QDateTime curDateTime = QDateTime::currentDateTime(); - QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); - QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); - copyFileToPath(query.calFileOutputName,destName,true); //断开光谱仪 m_FiberSpectrometer->disconnectFiberSpectrometer(); //return a.exec(); + + //使用sbapi读取海洋光学仪器的非线性定标参数 + if (isOcean) + { + double * coeffs = new double[100]; + int numberOfCoeffs = getNonlinearityCoeffs1(coeffs); + + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString nonlinearityCoeffsName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".nonLinear"); + +// for (int i = 0; i < numberOfCoeffs; ++i) +// { +// printf("\n"); +// +// printf("nonlinearityCoeffs(第%d个): %1.2e\n",i , coeffs[i]); +// +// printf("\n"); +// } + + std::ofstream outfile(nonlinearityCoeffsName.toStdString().c_str()); + + for (int i = 0; i < numberOfCoeffs; i++) + { + outfile << coeffs[i] << std::endl; + } + outfile.close(); + + free(coeffs); + } + } CommandLineParseResult parseCommandLine2(QCommandLineParser &parser, TcQuery *query, QString *errorMessage) @@ -485,3 +538,149 @@ bool isFileExist(QString fullFileName) } return false; } + +int getNonlinearityCoeffs1(double * coeffs) +{ + int number_of_devices; + long *device_ids; + int i; + int test_index; + int flag; + int error = 0; + char nameBuffer[80]; + + + /* Give the driver a chance to initialize itself */ + sbapi_initialize(); + +// printf("Probing for devices...\n"); fflush(stdout); + sbapi_probe_devices(); + +//#define RS232_TEST +#ifdef RS232_TEST + printf("Adding an STS at 9600 baud...\n"); + /* Uncomment for Linux */ + //sbapi_add_RS232_device_location("STS", "/dev/ttyS0", 9600); + //sbapi_add_RS232_device_location("STS", "/dev/ttyUSB0", 9600); + + /* Uncomment for Windows */ + //sbapi_add_RS232_device_location("STS", "COM1", 9600); + + /* Uncomment for e.g. USB-RS232 adapter under OSX */ + //sbapi_add_RS232_device_location("STS", "/dev/tty.KeySerial1", 9600); + //sbapi_add_RS232_device_location("STS", "/dev/tty.usbserial", 9600); +#endif + + /* This shows how to add network devices (note that most use TCP/IP) */ + //sbapi_add_TCPIPv4_device_location("Jaz", "192.168.1.150", 7654); + //sbapi_add_TCPIPv4_device_location("Blaze", "192.168.1.151", 57357); + +// printf("Getting device count...\n"); fflush(stdout); + number_of_devices = sbapi_get_number_of_device_ids(); + +// printf("Device count is %d\n", number_of_devices); + if(0 == number_of_devices) { + return 0; + } + +// printf("Getting device IDs...\n"); + device_ids = (long *)calloc(number_of_devices, sizeof(long)); + number_of_devices = sbapi_get_device_ids(device_ids, number_of_devices); +// printf("Got %d device ID%s.\n", number_of_devices, number_of_devices == 1 ? "" : "s"); + + int number; + for(i = 0; i < number_of_devices; i++) { +// printf("%d: Device 0x%02lX:\n", i, device_ids[i]); +// printf("\tGetting device type...\n"); + flag = sbapi_get_device_type(device_ids[i], &error, nameBuffer, 79); +// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error)); + if(flag > 0) { +// printf("\tDevice type: [%s]\n", nameBuffer); + } + + /* Open the device */ +// printf("\tAttempting to open:\n"); + flag = sbapi_open_device(device_ids[i], &error); +// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error)); + + // jump to the next iteration if there was a problem + if(flag != 0) { + continue; + } + + number = getNonlinearityCoeffs2(device_ids[i],coeffs); + + /* Close the device */ +// printf("\tAttempting to close:\n"); + sbapi_close_device(device_ids[i], &error); +// printf("\t\tResult is (%d) [%s]\n", flag, sbapi_get_error_string(error)); + } + free(device_ids); + +// printf("Finished testing.\n"); + + /* Clean up memory allocated by the driver */ + sbapi_shutdown(); + + return number; +} + +//返回值是非线性校正系数的个数 +int getNonlinearityCoeffs2(long deviceID, double * coeffs) +{ + int error = 0; + int number_of_nonlinearity_coeff_features; + long *nonlinearity_coeff_feature_ids = 0; + double buffer[10]; + int i; + int length = 0; + +// printf("\n\tTesting nonlinearity coefficient features:\n"); + +// printf("\t\tGetting number of nonlinearity coefficient features:\n"); + number_of_nonlinearity_coeff_features = + sbapi_get_number_of_nonlinearity_coeffs_features(deviceID, &error); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); + + if(0 == number_of_nonlinearity_coeff_features) { + printf("\tNo nonlinearity coefficient capabilities found.\n"); + + return 0; + } + + nonlinearity_coeff_feature_ids = + (long *)calloc(number_of_nonlinearity_coeff_features, sizeof(long)); +// printf("\t\tGetting nonlinearity coefficient feature IDs...\n"); + number_of_nonlinearity_coeff_features = sbapi_get_nonlinearity_coeffs_features( + deviceID, &error, nonlinearity_coeff_feature_ids, + number_of_nonlinearity_coeff_features); +// printf("\t\t\tResult is %d [%s]\n", number_of_nonlinearity_coeff_features, +// sbapi_get_error_string(error)); + + for(i = 0; i < number_of_nonlinearity_coeff_features; i++) + { +// printf("\t\t%d: Testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, deviceID, nonlinearity_coeff_feature_ids[i]); + +// printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); + memset(coeffs, (int)0, 20);//---------------------------------------------------------------------------- + length = sbapi_nonlinearity_coeffs_get(deviceID, + nonlinearity_coeff_feature_ids[i], &error, coeffs, 20); +// printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); + + if(0 == error && length > 0) { +// printf("\t\t\t\tFirst calibration term: %1.2e\n", coeffs[0]); + } + +// printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", +// i, deviceID, nonlinearity_coeff_feature_ids[i]); + } + free(nonlinearity_coeff_feature_ids); + + + +// printf("\tFinished testing nonlinearity coefficient capabilities.\n"); + + return length; +} \ No newline at end of file diff --git a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp index 578b519..53b56ba 100644 --- a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp @@ -83,6 +83,13 @@ void OceanOpticsFiberImager::singleShot(DataFrame &dfData) m_FiberSpectrometer->SingleShot(dfData); } +void OceanOpticsFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs) +{ + printf("This is OceanOpticsFiberImager.\n"); + + m_FiberSpectrometer->test_nonlinearity_coeffs_feature(); +} + void OceanOpticsFiberImager::recordDark(QString path) { //获取设备信息 From d929c7f0e45c968e4d895112a76a69874fda38f7 Mon Sep 17 00:00:00 2001 From: tangchao Date: Thu, 21 Apr 2022 14:06:48 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=EF=BC=881=EF=BC=89=E5=B0=86atp=E5=85=89?= =?UTF-8?q?=E8=B0=B1=E4=BB=AA=E7=9A=84=E6=8E=A7=E5=88=B6=E7=B1=BB=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=88=B0=E5=8D=93=E5=93=A5=E6=9C=80=E6=96=B0=E7=89=88?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E8=BF=9E=E6=8E=A5atp=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20=EF=BC=882=EF=BC=89=E5=B0=86?= =?UTF-8?q?=E8=AF=BB=E5=8F=96OceanOptics=E7=9A=84=E9=9D=9E=E7=BA=BF?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E6=AD=A3=E6=96=87=E4=BB=B6=20=20=E9=9B=86?= =?UTF-8?q?=E6=88=90=E5=88=B0=E5=AE=9A=E6=A0=87=E7=A8=8B=E5=BA=8F=E4=B8=AD?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../calibration_console/Source_Files/main.cpp | 106 +++++++++--------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index de43c24..f772b67 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -112,62 +112,62 @@ int main(int argc, char *argv[]) -// //自动曝光 -// logout("
AutoExpose!"); -// m_FiberSpectrometer->autoExpose(); -// -// int iExposureTime; -// m_FiberSpectrometer->getExposureTime(iExposureTime); -// -// message="
ExposureTime: " + QString::number(iExposureTime) + ""; -// logout(message); -// -// //程序sleep:等待关闭快门 -// message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; -// logout(message); -// QThread::sleep(query.sleepTimeinSecond); -// -// //采集暗帧 -// logout("
Record dark frame!"); -// m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); -// -// -// //程序sleep:等待打开快门 -// message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; -// logout(message); -// QThread::sleep(query.sleepTimeinSecond); -// -// //采集积分球光谱 -// logout("
Record integrating sphere frame!"); -// m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); -// -// //准备定标文件数据 -// logout("
readAndResample_StandardLightFile!"); + //自动曝光 + logout("
AutoExpose!"); + m_FiberSpectrometer->autoExpose(); + + int iExposureTime; + m_FiberSpectrometer->getExposureTime(iExposureTime); + + message="
ExposureTime: " + QString::number(iExposureTime) + ""; + logout(message); + + //程序sleep:等待关闭快门 + message="
Please close the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; + logout(message); + QThread::sleep(query.sleepTimeinSecond); + + //采集暗帧 + logout("
Record dark frame!"); + m_FiberSpectrometer->recordDark(query.calFileOutputDirectory); + + + //程序sleep:等待打开快门 + message="
Please open the lamp in " + QString::number(query.sleepTimeinSecond) + "s!"; + logout(message); + QThread::sleep(query.sleepTimeinSecond); + + //采集积分球光谱 + logout("
Record integrating sphere frame!"); + m_FiberSpectrometer->recordTarget(query.averageTimes, query.calFileOutputDirectory); + + //准备定标文件数据 + logout("
readAndResample_StandardLightFile!"); DeviceAttribute deviceAttribute; DeviceInfo deviceInfo; m_FiberSpectrometer->getDeviceAttribute(deviceAttribute); m_FiberSpectrometer->getDeviceInfo(deviceInfo); -// -// CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); -// m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); -// -// //生成辐射定标文件 -// if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" -// { -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); -// -// query.calFileOutputName=calFileName; -// } -// logout("
Produce calibration file!"); -// m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); -// -// //复制辐射定标文件 -// QDateTime curDateTime = QDateTime::currentDateTime(); -// QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); -// QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); -// copyFileToPath(query.calFileOutputName,destName,true); + + CalibrationAlgorithm * m_CalibrationAlgorithm = new CalibrationAlgorithm(); + m_CalibrationAlgorithm->readAndResample_StandardLightFile(query.standardLightFilePath,query.integratingSphereDetectorValue, deviceAttribute, deviceInfo); + + //生成辐射定标文件 + if (query.calFileOutputName.isEmpty())//query->calFileOutputName=="" + { + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString calFileName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".dat"); + + query.calFileOutputName=calFileName; + } + logout("
Produce calibration file!"); + m_CalibrationAlgorithm->produceCalfile(query.calFileOutputName, deviceAttribute, m_FiberSpectrometer->m_IntegratingSphereData, m_FiberSpectrometer->m_DarkData); + + //复制辐射定标文件 + QDateTime curDateTime = QDateTime::currentDateTime(); + QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); + QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); + copyFileToPath(query.calFileOutputName,destName,true); //判断仪器类型是否为海洋光学,将结果存储在变量isOcean中 auto * p_C = dynamic_cast(m_FiberSpectrometer); @@ -623,7 +623,7 @@ int getNonlinearityCoeffs1(double * coeffs) sbapi_shutdown(); return number; -} +}// //返回值是非线性校正系数的个数 int getNonlinearityCoeffs2(long deviceID, double * coeffs) From 5947968c1bbdd01104c31032e9f2ad606dfb212e Mon Sep 17 00:00:00 2001 From: tangchao Date: Fri, 29 Apr 2022 17:10:40 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A=20=EF=BC=881?= =?UTF-8?q?=EF=BC=89=E5=9F=BA=E4=BA=8E=E9=9D=9E=E7=BA=BF=E6=80=A7=E6=A0=A1?= =?UTF-8?q?=E6=AD=A3=E7=9A=84=E6=95=B0=E6=8D=AE=20=20=E7=94=9F=E6=88=90=20?= =?UTF-8?q?=20=E5=AE=9A=E6=A0=87=E6=96=87=E4=BB=B6=EF=BC=9B=20=EF=BC=882?= =?UTF-8?q?=EF=BC=89=E5=B0=86=E9=9D=9E=E7=BA=BF=E6=80=A7=E5=AE=9A=E6=A0=87?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=86=99=E5=88=B0=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E7=BB=99=E5=8D=93=E5=93=A5=E7=94=A8=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Header_Files/oceanOpticsFiberImager.h | 10 ++- .../Source_Files/ATPControl_Serial_QT.cpp | 23 ++++-- .../Source_Files/atpFiberImager.cpp | 2 +- .../calibration_console/Source_Files/main.cpp | 73 +++++++++---------- .../Source_Files/oceanOpticsFiberImager.cpp | 42 ++++++++--- 5 files changed, 94 insertions(+), 56 deletions(-) diff --git a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h index 135ce4a..786e0f5 100644 --- a/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h +++ b/othersoft/calibration_console/Header_Files/oceanOpticsFiberImager.h @@ -14,7 +14,7 @@ class OceanOpticsFiberImager :public QObject,public FiberSpectrometerOperationBa Q_OBJECT public: - OceanOpticsFiberImager(); + OceanOpticsFiberImager(double * nonlinearityCoeffs, int numberOfCoeffs); ~OceanOpticsFiberImager(); OceanOptics_lib * m_FiberSpectrometer; @@ -35,11 +35,17 @@ public: ZZ_S32 GetMaxValue(ZZ_S32 * dark, int number); + //保存获取的仪器信息,不用每次都获取,这样程序更快 + DeviceInfo m_deviceInfo; + DeviceAttribute m_deviceAttribute; + // DataFrame m_IntegratingSphereData; // DataFrame m_DarkData; protected: private: - + double * m_nonlinearityCoeffs; + int m_iNumberOfNonlinearityCoeffs; + // ZZ_U32 m_MaxValueOfFiberSpectrometer; public slots: diff --git a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp index 8fb5e8d..9fbda54 100644 --- a/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp +++ b/othersoft/calibration_console/Source_Files/ATPControl_Serial_QT.cpp @@ -512,7 +512,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM double fLastExposureTime = 0.1; int iRepeatCount = 0; - int iRes = SetExposureTime(2000);//need change to load from files + int iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS);//need change to load from files if (iRes != 0) { qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; @@ -527,16 +527,20 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM { bFlagIsAutoExposureFailed = true; bFlagIsOverTrying = true; + qDebug() << "大于30次"<= iDeviceDepth * 0.99) { @@ -566,6 +572,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM else if (iDeviceDepth * fMaxScaleFactor >= dTemp && dTemp >= iDeviceDepth * fMinScaleFactor) { bFlagIsAutoExposureOK = 1; + continue; } else if (dTemp > iDeviceDepth * fMaxScaleFactor) { @@ -592,12 +599,15 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); fExposureTime = (float)(fExposureTime / dFactor); } - if (/*fExposureTime > 100 || */fExposureTime < 10) + if (fExposureTime < m_daDeviceAttr.iMinIntegrationTimeInMS) { bFlagIsAutoExposureOK = false; bFlagIsAutoExposureFailed = true; bFlagIsLowerMinExposureTime = true; + + qDebug() << "lower-----------------------"<> 8;; qbSend[2] = m_iExposureTime & 0xFF; + + qDebug() << "-------------"<PerformAutoExposure(0.7,0.8,fPredictedExposureTime); + m_FiberSpectrometer->PerformAutoExposure(0.6,0.9,fPredictedExposureTime); } ZZ_S32 ATPFiberImager::GetMaxValue(ZZ_S32 * dark, int number) diff --git a/othersoft/calibration_console/Source_Files/main.cpp b/othersoft/calibration_console/Source_Files/main.cpp index f772b67..09b87bd 100644 --- a/othersoft/calibration_console/Source_Files/main.cpp +++ b/othersoft/calibration_console/Source_Files/main.cpp @@ -47,8 +47,8 @@ void logout(QString str); void createDirectory(QString fullPath); bool isFileExist(QString fullFileName); -int getNonlinearityCoeffs2(long deviceID, double * coeffs); -int getNonlinearityCoeffs1(double * coeffs); +int getNonlinearityCoeffs2(long deviceID, double * nonlinearityCoeffs); +int getNonlinearityCoeffs1(double * nonlinearityCoeffs); int main(int argc, char *argv[]) { @@ -88,14 +88,24 @@ int main(int argc, char *argv[]) //创建光谱仪对象 FiberSpectrometerOperationBase * m_FiberSpectrometer; + bool isOcean = false; + double * nonlinearityCoeffs; + int numberOfNonlinearityCoeffs; switch (query.deviceType) { case OPTOSKY: m_FiberSpectrometer = new ATPFiberImager(false,query.serialPort.toStdString(),"OPTOSKY"); break; case OceanOptics: - m_FiberSpectrometer = new OceanOpticsFiberImager();// + { + //使用sbapi读取海洋光学仪器的非线性定标参数 + nonlinearityCoeffs = new double[100]; + numberOfNonlinearityCoeffs = getNonlinearityCoeffs1(nonlinearityCoeffs); + + m_FiberSpectrometer = new OceanOpticsFiberImager(nonlinearityCoeffs, numberOfNonlinearityCoeffs); + isOcean = true; break; + } case UnknownDevice: parser.showHelp(); Q_UNREACHABLE(); @@ -114,7 +124,7 @@ int main(int argc, char *argv[]) //自动曝光 logout("
AutoExpose!"); - m_FiberSpectrometer->autoExpose(); +// m_FiberSpectrometer->autoExpose(); int iExposureTime; m_FiberSpectrometer->getExposureTime(iExposureTime); @@ -169,56 +179,37 @@ int main(int argc, char *argv[]) QString destName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + "_" +QString::number(query.position) + ".cal"); copyFileToPath(query.calFileOutputName,destName,true); - //判断仪器类型是否为海洋光学,将结果存储在变量isOcean中 - auto * p_C = dynamic_cast(m_FiberSpectrometer); - bool isOcean = false;// - if (p_C != nullptr) - { -// cout << "Match!!" << endl; - isOcean=true; -// coeffsFrame tmp; -// m_FiberSpectrometer->getNonlinearityCoeffs(tmp); - } - else - { - cout << "not OceanOpticsFiberImager!!" << endl; - } - - //断开光谱仪 - m_FiberSpectrometer->disconnectFiberSpectrometer(); - //return a.exec(); - - //使用sbapi读取海洋光学仪器的非线性定标参数 + //将海洋光学仪器的非线性定标参数写到文件中 if (isOcean) { - double * coeffs = new double[100]; - int numberOfCoeffs = getNonlinearityCoeffs1(coeffs); - QDateTime curDateTime = QDateTime::currentDateTime(); QString currentTime = curDateTime.toString("yyyy_MM_dd_hh_mm_ss"); QString nonlinearityCoeffsName = QDir::cleanPath(query.calFileOutputDirectory + QDir::separator() + currentTime + "_" + QString::fromStdString(deviceInfo.strSN) + ".nonLinear"); -// for (int i = 0; i < numberOfCoeffs; ++i) +// for (int i = 0; i < numberOfNonlinearityCoeffs; ++i) // { // printf("\n"); // -// printf("nonlinearityCoeffs(第%d个): %1.2e\n",i , coeffs[i]); +// printf("nonlinearityCoeffs(第%d个): %1.2e\n",i , nonlinearityCoeffs[i]); // // printf("\n"); // } std::ofstream outfile(nonlinearityCoeffsName.toStdString().c_str()); - for (int i = 0; i < numberOfCoeffs; i++) + for (int i = 0; i < numberOfNonlinearityCoeffs; i++) { - outfile << coeffs[i] << std::endl; + outfile << nonlinearityCoeffs[i] << std::endl; } outfile.close(); - free(coeffs); + free(nonlinearityCoeffs); } + //断开光谱仪 + m_FiberSpectrometer->disconnectFiberSpectrometer();//要放在这句代码之后:free(nonlinearityCoeffs); + //return a.exec(); } CommandLineParseResult parseCommandLine2(QCommandLineParser &parser, TcQuery *query, QString *errorMessage) @@ -539,7 +530,7 @@ bool isFileExist(QString fullFileName) return false; } -int getNonlinearityCoeffs1(double * coeffs) +int getNonlinearityCoeffs1(double * nonlinearityCoeffs) { int number_of_devices; long *device_ids; @@ -608,7 +599,7 @@ int getNonlinearityCoeffs1(double * coeffs) continue; } - number = getNonlinearityCoeffs2(device_ids[i],coeffs); + number = getNonlinearityCoeffs2(device_ids[i],nonlinearityCoeffs); /* Close the device */ // printf("\tAttempting to close:\n"); @@ -626,7 +617,7 @@ int getNonlinearityCoeffs1(double * coeffs) }// //返回值是非线性校正系数的个数 -int getNonlinearityCoeffs2(long deviceID, double * coeffs) +int getNonlinearityCoeffs2(long deviceID, double * nonlinearityCoeffs) { int error = 0; int number_of_nonlinearity_coeff_features; @@ -664,13 +655,19 @@ int getNonlinearityCoeffs2(long deviceID, double * coeffs) // i, deviceID, nonlinearity_coeff_feature_ids[i]); // printf("\t\t\tAttempting to get nonlinearity coefficients...\n"); - memset(coeffs, (int)0, 20);//---------------------------------------------------------------------------- + memset(nonlinearityCoeffs, (int)0, 20);//---------------------------------------------------------------------------- length = sbapi_nonlinearity_coeffs_get(deviceID, - nonlinearity_coeff_feature_ids[i], &error, coeffs, 20); + nonlinearity_coeff_feature_ids[i], &error, nonlinearityCoeffs, 20); // printf("\t\t\t\tResult is %d [%s]\n", length, sbapi_get_error_string(error)); if(0 == error && length > 0) { -// printf("\t\t\t\tFirst calibration term: %1.2e\n", coeffs[0]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[0]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[1]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[2]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[3]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[4]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[5]); +// printf("\t\t\t\tFirst calibration term: %1.2e\n", nonlinearityCoeffs[6]); } // printf("\t\t%d: Finished testing device 0x%02lX, nonlinearity coeffs 0x%02lX\n", diff --git a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp index 53b56ba..3c13aaf 100644 --- a/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp +++ b/othersoft/calibration_console/Source_Files/oceanOpticsFiberImager.cpp @@ -1,8 +1,11 @@ #include "Header_Files/oceanOpticsFiberImager.h" -OceanOpticsFiberImager::OceanOpticsFiberImager() +OceanOpticsFiberImager::OceanOpticsFiberImager(double * nonlinearityCoeffs, int numberOfCoeffs) { m_FiberSpectrometer = NULL; + + m_nonlinearityCoeffs = nonlinearityCoeffs; + m_iNumberOfNonlinearityCoeffs = numberOfCoeffs; } OceanOpticsFiberImager::~OceanOpticsFiberImager() @@ -18,15 +21,15 @@ void OceanOpticsFiberImager::connectFiberSpectrometer(QString& SN, QString& pixe m_FiberSpectrometer->Initialize(); - DeviceInfo deviceInfo; - DeviceAttribute deviceAttribute; + getDeviceInfo(m_deviceInfo); +// m_FiberSpectrometer->GetDeviceInfo(m_deviceInfo); - m_FiberSpectrometer->GetDeviceInfo(deviceInfo); - m_FiberSpectrometer->GetDeviceAttribute(deviceAttribute); + getDeviceAttribute(m_deviceAttribute); +// m_FiberSpectrometer->GetDeviceAttribute(m_deviceAttribute); - SN = QString::fromStdString(deviceInfo.strSN); - pixelCount = QString::number(deviceAttribute.iPixels); - wavelengthInfo = QString::number(deviceAttribute.fWaveLengthInNM[0]) + "--" + QString::number(deviceAttribute.fWaveLengthInNM[deviceAttribute.iPixels - 1]); + SN = QString::fromStdString(m_deviceInfo.strSN); + pixelCount = QString::number(m_deviceAttribute.iPixels); + wavelengthInfo = QString::number(m_deviceAttribute.fWaveLengthInNM[0]) + "--" + QString::number(m_deviceAttribute.fWaveLengthInNM[m_deviceAttribute.iPixels - 1]); m_FiberSpectrometer->SetDeviceTemperature(-10); @@ -34,11 +37,11 @@ void OceanOpticsFiberImager::connectFiberSpectrometer(QString& SN, QString& pixe //设置dn值的最大值(和位深相关) string qepro = "QEP"; string flame = "FLMS"; - if (deviceInfo.strSN.find(qepro) != string::npos) + if (m_deviceInfo.strSN.find(qepro) != string::npos) { m_MaxValueOfFiberSpectrometer = 200000; } - else if (deviceInfo.strSN.find(flame) != string::npos) + else if (m_deviceInfo.strSN.find(flame) != string::npos) { m_MaxValueOfFiberSpectrometer = 65535; } @@ -81,6 +84,25 @@ void OceanOpticsFiberImager::getDeviceTemperature(float &fTemperature) void OceanOpticsFiberImager::singleShot(DataFrame &dfData) { m_FiberSpectrometer->SingleShot(dfData); + + if(m_iNumberOfNonlinearityCoeffs==0)//如果非线性校正参数为0个,那么就不做非线性校正 + { + return; + } + + //做非线性校正 + for (int i = 0; i < m_deviceAttribute.iPixels; i++) + { + dfData.lData[i] = dfData.lData[i] / (m_nonlinearityCoeffs[0] + + m_nonlinearityCoeffs[1] * dfData.lData[i] + + m_nonlinearityCoeffs[2] * pow(dfData.lData[i], 2) + + m_nonlinearityCoeffs[3] * pow(dfData.lData[i], 3) + + m_nonlinearityCoeffs[4] * pow(dfData.lData[i], 4) + + m_nonlinearityCoeffs[5] * pow(dfData.lData[i], 5) + + m_nonlinearityCoeffs[6] * pow(dfData.lData[i], 6) + + m_nonlinearityCoeffs[7] * pow(dfData.lData[i], 7) + ); + } } void OceanOpticsFiberImager::getNonlinearityCoeffs(coeffsFrame &coeffs)