From 26c99622e71c9897d2e89f4a131d9f4f7665a14f Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 22 Nov 2021 16:18:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=89=E7=BA=A4=E5=85=89=E8=B0=B1=E4=BB=AA?= =?UTF-8?q?=E5=9F=BA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CmakeLists.txt | 2 +- config/config.json | 1 + main.cpp | 4 +- source/{ATP => FS}/ATPControl_Serial_QT.cpp | 101 +++++++++++++------- source/{ATP => FS}/ATPControl_Serial_QT.h | 49 ++++++---- source/{ATP => FS}/ATPDataFileProcessor.cpp | 0 source/{ATP => FS}/ATPDataFileProcessor.h | 0 source/FS/IrisFiberSpectrometerBase.h | 42 ++++++++ source/{ATP => FS}/ZZ_Types.h | 33 +++++++ source/Settings/SystemConfigger.cpp | 17 +++- source/Thread/ThreadDataGrabber.cpp | 13 ++- source/Thread/ThreadDataGrabber.h | 6 +- 12 files changed, 204 insertions(+), 64 deletions(-) create mode 100644 config/config.json rename source/{ATP => FS}/ATPControl_Serial_QT.cpp (83%) rename source/{ATP => FS}/ATPControl_Serial_QT.h (63%) rename source/{ATP => FS}/ATPDataFileProcessor.cpp (100%) rename source/{ATP => FS}/ATPDataFileProcessor.h (100%) create mode 100644 source/FS/IrisFiberSpectrometerBase.h rename source/{ATP => FS}/ZZ_Types.h (88%) diff --git a/CmakeLists.txt b/CmakeLists.txt index 3f5e8d5..66b518f 100644 --- a/CmakeLists.txt +++ b/CmakeLists.txt @@ -13,7 +13,7 @@ file(GLOB_RECURSE HDR_LIST "source/*.h") file(GLOB_RECURSE SRC_LIST "source/*.cpp") include_directories("source") -include_directories("source/ATP") +include_directories("source/FS") include_directories("source/Logger") include_directories("source/ZZ_SDK") include_directories("source/Settings") diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..a9765ac --- /dev/null +++ b/config/config.json @@ -0,0 +1 @@ +{"BeginTime":"16:43","IntervalTime":"10","EndTime":"16:45","Location":"beijing","GPS_Longtitude":"117","GPS_Latitude":"118","GPS_Altitude":"50","GPS_North":"on","InstallationTime":"2021-11-18","ISIFCalibrationTime":"2021-11-26","IS1CalibrationTime":"2021-11-19","NameOfMaintenanceStaff":"renlixin","PhoneNumberOfMaintenanceStaff":"110110110","DownloadUserID":"newuser","DownlaodAddress":"http:\/\/www.iris-rs.cn","SIFUpCalFile":"dat1","SIFDownCalFile1":"dat2","SIFDownCalFile2":"dat2","SIFDownCalFile3":"dat3","IS1UpCalFile":"dat1","IS1DownCalFile1":"sdaf","IS1DownCalFile2":"dat2","IS1DownCalFile3":"asdf","HTTPServer":"192.168.2.1"} \ No newline at end of file diff --git a/main.cpp b/main.cpp index cc74c72..8e66133 100644 --- a/main.cpp +++ b/main.cpp @@ -29,9 +29,7 @@ int main(int argc, char *argv[]) m_test.moveToThread(m_pqDataGrabberThreadHolder); m_pqDataGrabberThreadHolder->start(); - - m_test.StartGrab(); - + m_test.StartGrabCall(); //QThread::msleep(5000); //m_test.StopTestGrab(); diff --git a/source/ATP/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp similarity index 83% rename from source/ATP/ATPControl_Serial_QT.cpp rename to source/FS/ATPControl_Serial_QT.cpp index 11f6552..b77daab 100644 --- a/source/ATP/ATPControl_Serial_QT.cpp +++ b/source/FS/ATPControl_Serial_QT.cpp @@ -18,14 +18,14 @@ ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt() } -int ZZ_ATPControl_Serial_Qt::SetBaudRate(int iBaud) -{ - m_iBaudRate = iBaud; - return 0; -} +// int ZZ_ATPControl_Serial_Qt::SetBaudRate(int iBaud) +// { +// m_iBaudRate = iBaud; +// return 0; +// } -int ZZ_ATPControl_Serial_Qt::ATPInitialize(ZZ_U8 ucPortNumber) +int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, ZZ_U8 ucPortNumber, std::string strDeviceName) { QString qstrPortName = QString("COM%1").arg(ucPortNumber); @@ -50,13 +50,11 @@ int ZZ_ATPControl_Serial_Qt::ATPInitialize(ZZ_U8 ucPortNumber) return 0; } -int ZZ_ATPControl_Serial_Qt::ATPClose() +void ZZ_ATPControl_Serial_Qt::Close() { m_pSerialPort->close(); - - return 0; } -int ZZ_ATPControl_Serial_Qt::GetDeviceInfo() +int ZZ_ATPControl_Serial_Qt::GetDeviceInfo(DeviceInfo &Info) { QByteArray qbSend, qbRecv; @@ -81,7 +79,7 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceInfo() qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; return 1; } - m_adiDeviceInfo.strPN = qbRecv.data(); + m_diDeviceInfo.strPN = qbRecv.data(); qbSend.clear(); qbRecv.clear(); @@ -104,13 +102,14 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceInfo() qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; return 1; } - m_adiDeviceInfo.strSN = qbRecv.data(); + m_diDeviceInfo.strSN = qbRecv.data(); + Info = m_diDeviceInfo; return 0; } -int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute() +int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute &Attr) { QByteArray qbSend, qbRecv; @@ -135,7 +134,7 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute() qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; return 1; } - m_adaDeviceAttr.iMinIntegrationTime = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; + m_daDeviceAttr.iMinIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; qbSend.clear(); qbRecv.clear(); @@ -158,16 +157,16 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute() qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; return 1; } - m_adaDeviceAttr.iMaxIntegrationTime = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; + m_daDeviceAttr.iMaxIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; - iRes = SetExposureTime(m_adaDeviceAttr.iMinIntegrationTime); + iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SetExposureTime error.Exit Code:2"; return 2; } - iRes = SingleShot(m_adaDeviceAttr.iPixels); + iRes = SingleShot(m_daDeviceAttr.iPixels); if (iRes != 0) { qDebug() << "Err:GetDeviceAttribute Failed,Call SingleShot error.Exit Code:3"; @@ -201,10 +200,18 @@ int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute() } float fWaveLengthCoef[4]; memcpy(fWaveLengthCoef, qbRecv.data()+16, 4 * sizeof(float)); - for (int i=0;i< m_adaDeviceAttr.iPixels;i++) + for (int i=0;i< m_daDeviceAttr.iPixels;i++) { - m_adaDeviceAttr.fWaveLength[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]; } + + Attr = m_daDeviceAttr; + + return 0; +} + +int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature) +{ return 0; } @@ -340,7 +347,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM while (!bFlagIsAutoExposureOK && !bFlagIsAutoExposureFailed) { - ATPDataFrame dfTemp; + DataFrame dfTemp; if (iRepeatCount++ > 30) { @@ -349,7 +356,7 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM break; } - fExposureTime = (float)m_adaDeviceAttr.iMinIntegrationTime; + fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; fTempExposureTime = fExposureTime; iRes = SingleShot(dfTemp); @@ -359,10 +366,10 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM return 2; } - HeapSort(dfTemp.usData, m_adaDeviceAttr.iPixels); + HeapSort(dfTemp.usData, m_daDeviceAttr.iPixels); double dSum = 0; - int iCount = m_adaDeviceAttr.iPixels / 100; + int iCount = m_daDeviceAttr.iPixels / 100; for (int i = 0; i < iCount; i++) { dSum += dfTemp.usData[i]; @@ -449,11 +456,11 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM -int ZZ_ATPControl_Serial_Qt::SetExtShutter(int iShutterUP0, int iShutterDOWN1, int iShutterDOWN2, int iShutterDOWN3) -{ - qDebug() << "stub code not implemented"; - return -1; -} +// int ZZ_ATPControl_Serial_Qt::SetExtShutter(int iShutterUP0, int iShutterDOWN1, int iShutterDOWN2, int iShutterDOWN3) +// { +// qDebug() << "stub code not implemented"; +// return -1; +// } int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) { @@ -476,7 +483,22 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) return 0; } -int ZZ_ATPControl_Serial_Qt::SingleShot(ATPDataFrame &dfData) +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); + return 0; +} + +int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame &dfData) { QByteArray qbSend, qbRecv; qbSend.clear(); @@ -530,10 +552,25 @@ int ZZ_ATPControl_Serial_Qt::SingleShot(int &iPixels) return 0; } -int ZZ_ATPControl_Serial_Qt::SingleShotDark(ATPDataFrame &dfData) +// int ZZ_ATPControl_Serial_Qt::SingleShotDark(ATPDataFrame &dfData) +// { +// SetExtShutter(0,0,0,0); +// SingleShot(dfData); +// return 0; +// } + +int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float &fTemperature) { - SetExtShutter(0,0,0,0); - SingleShot(dfData); + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_TEC_TEMP); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + SendCommand(qbSend); + RecvData(qbRecv); + ParseData(qbRecv); return 0; } diff --git a/source/ATP/ATPControl_Serial_QT.h b/source/FS/ATPControl_Serial_QT.h similarity index 63% rename from source/ATP/ATPControl_Serial_QT.h rename to source/FS/ATPControl_Serial_QT.h index 9a77150..dbb6456 100644 --- a/source/ATP/ATPControl_Serial_QT.h +++ b/source/FS/ATPControl_Serial_QT.h @@ -4,12 +4,13 @@ #pragma once #include "pch.h" #include "ZZ_Types.h" +#include "IrisFiberSpectrometerBase.h" + using namespace ZZ_MISCDEF; using namespace ZZ_MISCDEF::ATP; +using namespace ZZ_MISCDEF::IRIS::FS; -class QSerialPort; - -class ZZ_ATPControl_Serial_Qt//:public QObject +class ZZ_ATPControl_Serial_Qt:public CIrisFSBase { //Q_OBJECT public: @@ -18,34 +19,42 @@ public: public: //设置波特率 - int SetBaudRate(int iBaud); - - + //int SetBaudRate(int iBaud); //初始化设备 - int ATPInitialize( ZZ_U8 ucPortNumber); + int Initialize(bool bIsUSBMode, ZZ_U8 ucPortNumber, std::string strDeviceName); //关闭设备 - int ATPClose(); - + void Close(); //单次测试采集 用以确认设备像素数 int SingleShot(int &iPixels); - //单次数据采集 - int SingleShot(ATPDataFrame &dfData); - //单次暗背景采集 - int SingleShotDark(ATPDataFrame &dfData); - int SingleShotDeducted(ATPDataFrame &dfData); + //单次数据采集 + int SingleShot(DataFrame &dfData); + + //单次暗背景采集 + //int SingleShotDark(ATPDataFrame &dfData); + + //int SingleShotDeducted(ATPDataFrame &dfData); //设置曝光时间 int SetExposureTime(int iExposureTimeInMS); + //获取曝光时间设置 int GetExposureTime(int &iExposureTimeInMS); //int GetWaveLength(float *pfWaveLength); + //获取设备信息 - int GetDeviceInfo(); + int GetDeviceInfo(DeviceInfo &Info); + //获取设备特征数据 - int GetDeviceAttribute(); - int GetDeviceListInfo(); //use type name to enum + int GetDeviceAttribute(DeviceAttribute &Attr); + + //int GetDeviceListInfo(); //use type name to enum + + //设置温度 + int SetDeviceTemperature(float fTemperature); + + //获取温度 int GetDeviceTemperature(float &fTemperature); //自动曝光 @@ -61,11 +70,11 @@ private: QSerialPort *m_pSerialPort; //ATP - ATPDeviceInfo m_adiDeviceInfo; - ATPDeviceAttribute m_adaDeviceAttr; + DeviceInfo m_diDeviceInfo; + DeviceAttribute m_daDeviceAttr; //////////////////////////////////////////////////////////////////////////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 int SendCommand(QByteArray qbCommand); int RecvData(QByteArray &qbData); diff --git a/source/ATP/ATPDataFileProcessor.cpp b/source/FS/ATPDataFileProcessor.cpp similarity index 100% rename from source/ATP/ATPDataFileProcessor.cpp rename to source/FS/ATPDataFileProcessor.cpp diff --git a/source/ATP/ATPDataFileProcessor.h b/source/FS/ATPDataFileProcessor.h similarity index 100% rename from source/ATP/ATPDataFileProcessor.h rename to source/FS/ATPDataFileProcessor.h diff --git a/source/FS/IrisFiberSpectrometerBase.h b/source/FS/IrisFiberSpectrometerBase.h new file mode 100644 index 0000000..ebf17d7 --- /dev/null +++ b/source/FS/IrisFiberSpectrometerBase.h @@ -0,0 +1,42 @@ +#include +#include "ZZ_Types.h" +#pragma once +using namespace ZZ_MISCDEF; +using namespace ZZ_MISCDEF::IRIS::FS; + +class CIrisFSBase +{ +public: + //CIrisFSBase(); + //virtual ~CIrisFSBase()= 0; +public: + //初始化设备 + //此处string为指明连接哪个ocean光谱仪的参数,可自行更换为其他c/c++标准类型 + //0为无错误,不同错误请返回不同值 + virtual int Initialize(bool bIsUSBMode,ZZ_U8 ucPortNumber,std::string strDeviceName) = 0; + + //关闭设备 + virtual void Close() = 0; + + //单次数据采集 + virtual int SingleShot(DataFrame &dfData) = 0; + + //设置曝光时间 + virtual int SetExposureTime(int iExposureTimeInMS) = 0; + + //获取曝光时间设置 + virtual int GetExposureTime(int &iExposureTimeInMS) = 0; + + //设置目标温度 + virtual int SetDeviceTemperature(float fTemperature) = 0; + + //获取温度设置 + virtual int GetDeviceTemperature(float &fTemperature) = 0; + + //获取设备信息 + virtual int GetDeviceInfo(DeviceInfo &Info) = 0; + + //获取设备特征数据 + virtual int GetDeviceAttribute(DeviceAttribute &Attr) = 0; + +}; diff --git a/source/ATP/ZZ_Types.h b/source/FS/ZZ_Types.h similarity index 88% rename from source/ATP/ZZ_Types.h rename to source/FS/ZZ_Types.h index 1651293..3e6205c 100644 --- a/source/ATP/ZZ_Types.h +++ b/source/FS/ZZ_Types.h @@ -10,6 +10,39 @@ namespace ZZ_MISCDEF typedef unsigned short int ZZ_U16; typedef unsigned long int ZZ_U32; + + namespace IRIS + { + //Fiber Spectrometer + namespace FS + { + typedef struct tagDataFrame + { + ZZ_U16 usExposureTimeInMS; + ZZ_U16 usData[4096]; + float fTemperature; + double dTimes = 0; + }DataFrame; + + typedef struct tagDeviceInfo + { + std::string strPN; + std::string strSN; + }DeviceInfo; + + typedef struct tagDeviceAttribute + { + int iPixels; + int iMaxIntegrationTimeInMS; + int iMinIntegrationTimeInMS; + float fWaveLengthInNM[4096]; + + }DeviceAttribute; + } + + + } + //ATP指令转译 namespace ATP { diff --git a/source/Settings/SystemConfigger.cpp b/source/Settings/SystemConfigger.cpp index b12d211..134d0f0 100644 --- a/source/Settings/SystemConfigger.cpp +++ b/source/Settings/SystemConfigger.cpp @@ -3,8 +3,8 @@ ZZ_SysConfigger::ZZ_SysConfigger(QObject *parent /*= nullptr*/) { #ifdef _DEBUG - m_qstrFilePath = QCoreApplication::applicationDirPath() + "home/data/Settings/DeviceSettings.ini"; - m_qstrJSONConfigFilePath = QCoreApplication::applicationDirPath() + "/home/data/Settings/config.json"; + m_qstrFilePath = QCoreApplication::applicationDirPath() + "/home/data/Settings/DeviceSettings.ini"; + m_qstrJSONConfigFilePath = "E:/WorkSpace/TowerOptoSifAndSpectral/config/config.json"; #else m_qstrJSONConfigFilePath = ("/home/data/Setting/config.json"); #endif // DEBUG @@ -69,17 +69,26 @@ return 1; } +#ifdef _DEBUG + m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "ss"); + if (!m_struAcqTime.qtInterval.isValid()) + { + qDebug() << "Invalid IntervalTime"; + return 1; + } +#else m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "mm"); if (!m_struAcqTime.qtInterval.isValid()) { - qDebug() << "Invalid BeginTime"; + qDebug() << "Invalid IntervalTime"; return 1; } +#endif m_struAcqTime.qtStopTime = QTime::fromString(m_qjoJObj.value("EndTime").toString(), "hh:mm"); if (!m_struAcqTime.qtStopTime.isValid()) { - qDebug() << "Invalid BeginTime"; + qDebug() << "Invalid EndTime"; return 1; } diff --git a/source/Thread/ThreadDataGrabber.cpp b/source/Thread/ThreadDataGrabber.cpp index 30c20f7..3271b4e 100644 --- a/source/Thread/ThreadDataGrabber.cpp +++ b/source/Thread/ThreadDataGrabber.cpp @@ -4,6 +4,7 @@ ZZ_DataGrabberThread::ZZ_DataGrabberThread(QObject* parent /*= nullptr*/) { m_GrabTimer = new QTimer(this); m_bFlagIsCollecting = false; + InitThreadStatus(); SetupSignals(); StartGrabberThread(); @@ -19,15 +20,17 @@ ZZ_DataGrabberThread::~ZZ_DataGrabberThread() } } -void ZZ_DataGrabberThread::SetGrabTimer(AcqTimeSettings struAcqTime) +void ZZ_DataGrabberThread::SetGrabTimer(AcqTimeSettings struAcqTimer) { - m_struAcqTime = struAcqTime; + m_struAcqTime = struAcqTimer; } int ZZ_DataGrabberThread::SetupSignals() { connect(m_GrabTimer, &QTimer::timeout, this, &ZZ_DataGrabberThread::OnTimeCounter); + connect(this, &ZZ_DataGrabberThread::SignalStartGrab, this, &ZZ_DataGrabberThread::StartGrab); + connect(this, &ZZ_DataGrabberThread::SignalStartGrabOnce, &m_tcISIFCtrlThread, &ZZ_iSIFControlThread::StartTestAcquisition); connect(this, &ZZ_DataGrabberThread::SignalStartGrabOnce, &m_tcIS1CtrlThread, &ZZ_IS1ControlThread::StartTestAcquisition); @@ -43,6 +46,12 @@ int ZZ_DataGrabberThread::SetupSignals() return 0; } +int ZZ_DataGrabberThread::StartGrabCall() +{ + emit SignalStartGrab(); + return 0; +} + int ZZ_DataGrabberThread::StartGrab() { m_GrabTimer->start(1000); diff --git a/source/Thread/ThreadDataGrabber.h b/source/Thread/ThreadDataGrabber.h index 0c0fd64..38aae27 100644 --- a/source/Thread/ThreadDataGrabber.h +++ b/source/Thread/ThreadDataGrabber.h @@ -30,10 +30,10 @@ private: QTimer *m_GrabTimer; AcqTimeSettings m_struAcqTime; public: - void SetGrabTimer(AcqTimeSettings struAcqTime); + void SetGrabTimer(AcqTimeSettings struAcqTimer); int SetupSignals(); - int StartGrab(); + int StartGrabCall(); private: int OnTimeCounter(); @@ -44,8 +44,10 @@ public slots: int TestGrabOnce(); int TestStopGrab(); int HandleThreadEvent(int iThreadID, int iFlagStatus); + int StartGrab(); signals: void SignalStartGrabOnce(); void SignalStopGrab(); void SignalGrabOnceFinished(); + void SignalStartGrab(); };