diff --git a/main.cpp b/main.cpp index 95784a5..e6d327a 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,7 @@ #include "ATPControl_Serial_QT.h" #include "Logger.h" #include "ThreadDataGrabber.h" +#include "SystemConfigger.h" using namespace std; #pragma once @@ -14,6 +15,11 @@ int main(int argc, char *argv[]) QString qstrTest="This is a test message 2"; qDebug() << qstrTest; cout << "This is a test message"; + //////////////////////////////////////////////////////////////////////////configger + ZZ_SysConfigger test; + test.Initialize(); + test.LoadSettingsFromFile_System(); + test.LoadSettings_Test(); //////////////////////////////////////////////////////////////////////////test ZZ_DataGrabberThread m_test; //m_test.GrabOnce(); @@ -24,7 +30,7 @@ int main(int argc, char *argv[]) m_pqDataGrabberThreadHolder->start(); - m_test.TestGrab(); + m_test.TestGrabOnce(); //QThread::msleep(5000); diff --git a/source/ATP/ATPControl_Serial_QT.h b/source/ATP/ATPControl_Serial_QT.h index a558667..9a77150 100644 --- a/source/ATP/ATPControl_Serial_QT.h +++ b/source/ATP/ATPControl_Serial_QT.h @@ -1,3 +1,6 @@ +////////////////////////////////////////////////////////////////////////// +//ATP类设备串口通信类 +////////////////////////////////////////////////////////////////////////// #pragma once #include "pch.h" #include "ZZ_Types.h" @@ -14,25 +17,38 @@ public: virtual ~ZZ_ATPControl_Serial_Qt(); public: + //设置波特率 int SetBaudRate(int iBaud); + + //初始化设备 int ATPInitialize( ZZ_U8 ucPortNumber); + //关闭设备 int ATPClose(); + + //单次测试采集 用以确认设备像素数 int SingleShot(int &iPixels); + //单次数据采集 int SingleShot(ATPDataFrame &dfData); + //单次暗背景采集 int SingleShotDark(ATPDataFrame &dfData); int SingleShotDeducted(ATPDataFrame &dfData); + //设置曝光时间 int SetExposureTime(int iExposureTimeInMS); + //获取曝光时间设置 int GetExposureTime(int &iExposureTimeInMS); //int GetWaveLength(float *pfWaveLength); + //获取设备信息 int GetDeviceInfo(); + //获取设备特征数据 int GetDeviceAttribute(); int GetDeviceListInfo(); //use type name to enum int GetDeviceTemperature(float &fTemperature); + //自动曝光 int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float &fPredictedExposureTime); #ifdef _DEBUG diff --git a/source/ATP/ZZ_Types.h b/source/ATP/ZZ_Types.h index 00a3007..c6a5aaf 100644 --- a/source/ATP/ZZ_Types.h +++ b/source/ATP/ZZ_Types.h @@ -1,3 +1,6 @@ +////////////////////////////////////////////////////////////////////////// +//类型说明文件 +////////////////////////////////////////////////////////////////////////// #pragma once #include "pch.h" @@ -7,7 +10,7 @@ namespace ZZ_MISCDEF typedef unsigned short int ZZ_U16; typedef unsigned long int ZZ_U32; - + //ATP指令转译 namespace ATP { const int MAX_SPECTRUM_SIZE = 4096; @@ -46,6 +49,7 @@ namespace ZZ_MISCDEF ATP6500 }; + //数据帧描述 typedef struct tagATPDataFrame { unsigned short usExposureTime; @@ -54,12 +58,14 @@ namespace ZZ_MISCDEF double dTimes = 0; }ATPDataFrame; + //设备信息描述 typedef struct tagATPDeviceInfo { std::string strPN; std::string strSN; }ATPDeviceInfo; + //设备特征描述 typedef struct tagATPDeviceAttribute { int iPixels; @@ -74,24 +80,101 @@ namespace ZZ_MISCDEF } + //运行参数 + namespace ZZ_RUNPARAMS + { + typedef struct tagAcquisitionTimeSettings + { + QTime qtStartTime; + QTime qtStopTime; + QTime qtInterval; + }AcqTimeSettings; + + typedef struct tagATPCalibrationSettings + { + //Up0 Down1,2,3 + QString qsISIF_CalibrationFilePath[4]; + QString qsIS1_CalibrationFilePath[4]; + + }ATPCalibrationSettings; + + + } + + //系统数据文件结构 namespace ZZ_DATAFILE { typedef struct tagEnvironmentalContext { + QString qstrUTCDateTime; + QString qstrLocation; + QString qstrGPS_longtitude; + QString qstrGPS_Latitude; + QString qstrGPS_Altitude; + QString qstrGPS_North; + QString qstrCaseTemperature; + QString qstrCaseHumidity; + }EContext; + + typedef struct tagManmadeEnviromentalContext + { + QString qstrOriFileName; + QString qstrInstallationTime; + QString qstrISIFCalibrationTime; + QString qstrIS1CalibrationTime; + QString qstrNameOfMaintenanceStaff; + QString qstrPhoneNumberOfMaintenanceStaff; + QString qstrDownloadUserID; + QString qstrDownlaodAddress; + QString qstrHTTPServer; + }MEContext; - }EnvironmentalContext; typedef struct tagIS1Information { + QString qstrSN_ATP; + QString qstrSN_IRIS; + QString qstrCalFile_U0; + QString qstrCalFile_D1; + QString qstrCalFile_D2; + QString qstrCalFile_D3; + int iPixelCount; + + int iExposureTimeInMS_U0; + int iExposureTimeInMS_D1; + int iExposureTimeInMS_D2; + int iExposureTimeInMS_D3; + + float fTemperature_U0; + float fTemperature_D1; + float fTemperature_D2; + float fTemperature_D3; }IS1Info; typedef struct tagISIFInformation { + QString qstrSN_ATP; + QString qstrSN_IRIS; + QString qstrCalFile_U0; + QString qstrCalFile_D1; + QString qstrCalFile_D2; + QString qstrCalFile_D3; + int iPixelCount; + + int iExposureTimeInMS_U0; + int iExposureTimeInMS_D1; + int iExposureTimeInMS_D2; + int iExposureTimeInMS_D3; + + float fTemperature_U0; + float fTemperature_D1; + float fTemperature_D2; + float fTemperature_D3; }ISIFInfo; typedef struct tagATPDataHeader diff --git a/source/Settings/SystemConfigger.cpp b/source/Settings/SystemConfigger.cpp index 88b667b..97c731f 100644 --- a/source/Settings/SystemConfigger.cpp +++ b/source/Settings/SystemConfigger.cpp @@ -2,24 +2,126 @@ ZZ_SysConfigger::ZZ_SysConfigger(QObject *parent /*= nullptr*/) { - m_qstrFilePath = QCoreApplication::applicationDirPath()+ "/Settings/DeviceSettings.ini"; +#ifdef _DEBUG + m_qstrFilePath = QCoreApplication::applicationDirPath() + "home/data/Settings/DeviceSettings.ini"; + m_qstrJSONConfigFilePath = QCoreApplication::applicationDirPath() + "/home/data/Settings/config.json"; +#else + m_qstrJSONConfigFilePath = ("/home/data/Setting/config.json"); +#endif // DEBUG } ZZ_SysConfigger::~ZZ_SysConfigger() { + if (qfConfig.isOpen()) + { + qfConfig.close(); + } } - int ZZ_SysConfigger::LoadSettings_IS1() + int ZZ_SysConfigger::Initialize() + { + qfConfig.setFileName(m_qstrJSONConfigFilePath); + bool bRes = qfConfig.open(QIODevice::ReadOnly); + if (!bRes) + { + qDebug() << "QFile open config file Err."; + return 1; + } + + m_qbaJData = qfConfig.readAll(); + m_qjdJDoc= QJsonDocument::fromJson(m_qbaJData, &m_qjpeJErr); + if (m_qjpeJErr.error != QJsonParseError::NoError) + { + qDebug() << m_qjpeJErr.errorString(); + return 2; + } + m_qjoJObj = m_qjdJDoc.object(); + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_IS1() { return 0; } - int ZZ_SysConfigger::LoadSettings_iSIF() + int ZZ_SysConfigger::LoadSettingsFromFile_iSIF() { return 0; } - int ZZ_SysConfigger::LoadSettings_System() + int ZZ_SysConfigger::LoadSettingsFromFile_System() { + // QString qstr = m_qjoJObj.value("IntervalTime").toString(); + m_struAcqTime.qtStartTime=QTime::fromString(m_qjoJObj.value("BeginTime").toString(), "hh:mm"); + if (!m_struAcqTime.qtStartTime.isValid()) + { + qDebug() << "Invalid BeginTime"; + return 1; + } + + m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "mm"); + if (!m_struAcqTime.qtInterval.isValid()) + { + qDebug() << "Invalid BeginTime"; + return 1; + } + + m_struAcqTime.qtStopTime = QTime::fromString(m_qjoJObj.value("EndTime").toString(), "hh:mm"); + if (!m_struAcqTime.qtStopTime.isValid()) + { + qDebug() << "Invalid BeginTime"; + return 1; + } + return 0; } + + int ZZ_SysConfigger::LoadSettingsFromFile_MISC() + { + m_struEC.qstrLocation = m_qjoJObj.value("Location").toString(); + m_struEC.qstrGPS_Altitude = m_qjoJObj.value("GPS_Altitude").toString(); + m_struEC.qstrGPS_Latitude = m_qjoJObj.value("GPS_Latitude").toString(); + m_struEC.qstrGPS_longtitude = m_qjoJObj.value("GPS_Longtitude").toString(); + m_struEC.qstrGPS_North = m_qjoJObj.value("GPS_North").toString(); + + m_struMEC.qstrInstallationTime = m_qjoJObj.value("InstallationTime").toString(); + m_struMEC.qstrISIFCalibrationTime = m_qjoJObj.value("ISIFCalibrationTime").toString(); + m_struMEC.qstrIS1CalibrationTime = m_qjoJObj.value("IS1CalibrationTime").toString(); + m_struMEC.qstrNameOfMaintenanceStaff = m_qjoJObj.value("NameOfMaintenanceStaff").toString(); + m_struMEC.qstrPhoneNumberOfMaintenanceStaff = m_qjoJObj.value("PhoneNumberOfMaintenanceStaff").toString(); + m_struMEC.qstrDownloadUserID = m_qjoJObj.value("DownloadUserID").toString(); + m_struMEC.qstrDownlaodAddress = m_qjoJObj.value("DownlaodAddress").toString(); + + m_struIS1Info.qstrCalFile_U0 = m_qjoJObj.value("IS1UpCalFile").toString(); + m_struIS1Info.qstrCalFile_D1 = m_qjoJObj.value("IS1DownCalFile1").toString(); + m_struIS1Info.qstrCalFile_D2 = m_qjoJObj.value("IS1DownCalFile2").toString(); + m_struIS1Info.qstrCalFile_D3 = m_qjoJObj.value("IS1DownCalFile3").toString(); + + m_struISIFInfo.qstrCalFile_U0 = m_qjoJObj.value("SIFUpCalFile").toString(); + m_struISIFInfo.qstrCalFile_D1 = m_qjoJObj.value("SIFDownCalFile1").toString(); + m_struISIFInfo.qstrCalFile_D2 = m_qjoJObj.value("SIFDownCalFile2").toString(); + m_struISIFInfo.qstrCalFile_D3 = m_qjoJObj.value("SIFDownCalFile3").toString(); + + return 0; + } + + int ZZ_SysConfigger::LoadSettings_Test() + { + QFile qfTest(m_qstrJSONConfigFilePath); + + qfTest.open(QFile::ReadOnly); + + QByteArray qbJData = qfTest.readAll(); + + QJsonParseError jerr; + QJsonDocument jdoc(QJsonDocument::fromJson(qbJData, &jerr)); + if (jerr.error!= QJsonParseError::NoError) + { + qDebug() << jerr.errorString(); + } + + QJsonObject rootobj = jdoc.object(); + QStringList key = rootobj.keys(); + QString qtest1 = rootobj.value(rootobj.keys().at(15)).toString(); + return 0; + } diff --git a/source/Settings/SystemConfigger.h b/source/Settings/SystemConfigger.h index bf7b9c1..6124b13 100644 --- a/source/Settings/SystemConfigger.h +++ b/source/Settings/SystemConfigger.h @@ -1,7 +1,8 @@ #pragma once #include "pch.h" - - +#include "ZZ_Types.h" +using namespace ZZ_MISCDEF::ZZ_RUNPARAMS; +using namespace ZZ_MISCDEF::ZZ_DATAFILE; class ZZ_SysConfigger :public QObject @@ -12,10 +13,31 @@ public: ZZ_SysConfigger(QObject *parent = nullptr); virtual ~ZZ_SysConfigger(); public: - int LoadSettings_IS1(); - int LoadSettings_iSIF(); - int LoadSettings_System(); + int Initialize(); + int LoadSettingsFromFile_IS1(); + int LoadSettingsFromFile_iSIF(); + int LoadSettingsFromFile_System(); + int LoadSettingsFromFile_MISC(); + + int LoadSettings_Test(); + +public: + AcqTimeSettings m_struAcqTime; + EContext m_struEC; + MEContext m_struMEC; + IS1Info m_struIS1Info; + ISIFInfo m_struISIFInfo; private: QString m_qstrFilePath; + QString m_qstrJSONConfigFilePath; + QFile qfConfig; + + QByteArray m_qbaJData; + QJsonParseError m_qjpeJErr; + QJsonObject m_qjoJObj; + QJsonDocument m_qjdJDoc; + + + }; \ No newline at end of file diff --git a/source/Thread/ATPAbstractController.cpp b/source/Thread/ATPAbstractController.cpp index 25a1654..dae5190 100644 --- a/source/Thread/ATPAbstractController.cpp +++ b/source/Thread/ATPAbstractController.cpp @@ -9,12 +9,12 @@ ZZ_ATPAbsCtrlThread::~ZZ_ATPAbsCtrlThread() { } - -void ZZ_ATPAbsCtrlThread::SetWaitCondition(QWaitCondition *pFinish, QMutex *pMutex) -{ - m_pwcFinish = pFinish; - m_pMutex = pMutex; -} +// +// void ZZ_ATPAbsCtrlThread::SetWaitCondition(QWaitCondition *pFinish, QMutex *pMutex) +// { +// m_pwcFinish = pFinish; +// m_pMutex = pMutex; +// } int ZZ_ATPAbsCtrlThread::StartTestAcquisition() { @@ -27,7 +27,7 @@ int ZZ_ATPAbsCtrlThread::StartTestAcquisition() } qDebug() << "ThreadATPAbsController quit"; - m_pwcFinish->wakeAll(); + //m_pwcFinish->wakeAll(); emit SignalAcqFinished(0,1); return 0; } diff --git a/source/Thread/ATPAbstractController.h b/source/Thread/ATPAbstractController.h index 1d17ff4..4930a70 100644 --- a/source/Thread/ATPAbstractController.h +++ b/source/Thread/ATPAbstractController.h @@ -1,3 +1,6 @@ +////////////////////////////////////////////////////////////////////////// +//ATP设备基类 +////////////////////////////////////////////////////////////////////////// #pragma once #include "pch.h" #include "ATPControl_Serial_QT.h" @@ -12,15 +15,15 @@ public: public: std::atomic m_bFlagIsCollecting; - QMutex *m_pMutex; - QWaitCondition *m_pwcFinish; + //QMutex *m_pMutex; + //QWaitCondition *m_pwcFinish; public: ZZ_ATPAbsCtrlThread(QObject* parent = nullptr); virtual ~ZZ_ATPAbsCtrlThread(); private: ZZ_ATPControl_Serial_Qt m_iSIFctrl; public slots: - virtual void SetWaitCondition(QWaitCondition *pFinish, QMutex *pMutex); + //virtual void SetWaitCondition(QWaitCondition *pFinish, QMutex *pMutex); virtual int StartTestAcquisition(); int StopTestAcquisition(); signals: diff --git a/source/Thread/ThreadDataGrabber.cpp b/source/Thread/ThreadDataGrabber.cpp index a8cf620..1e8c0f9 100644 --- a/source/Thread/ThreadDataGrabber.cpp +++ b/source/Thread/ThreadDataGrabber.cpp @@ -3,13 +3,19 @@ ZZ_DataGrabberThread::ZZ_DataGrabberThread(QObject* parent /*= nullptr*/) { m_bFlagIsCollecting = false; + InitThreadStatus(); SetupSignals(); StartGrabberThread(); + + //m_iTotalThreads = 2; } ZZ_DataGrabberThread::~ZZ_DataGrabberThread() { - + if (m_piFlagCaptureThreadStatus!=NULL) + { + delete m_piFlagCaptureThreadStatus; + } } int ZZ_DataGrabberThread::SetupSignals() @@ -17,9 +23,13 @@ int ZZ_DataGrabberThread::SetupSignals() connect(this, &ZZ_DataGrabberThread::SignalStartGrabOnce, &m_tcISIFCtrlThread, &ZZ_iSIFControlThread::StartTestAcquisition); connect(this, &ZZ_DataGrabberThread::SignalStartGrabOnce, &m_tcIS1CtrlThread, &ZZ_IS1ControlThread::StartTestAcquisition); - connect(this, &ZZ_DataGrabberThread::SignalStopGrab, &m_tcISIFCtrlThread, &ZZ_iSIFControlThread::StopTestAcquisition, Qt::DirectConnection); - connect(this, &ZZ_DataGrabberThread::SignalStopGrab, &m_tcIS1CtrlThread, &ZZ_IS1ControlThread::StopTestAcquisition, Qt::DirectConnection); + //connect(this, &ZZ_DataGrabberThread::SignalStopGrab, &m_tcISIFCtrlThread, &ZZ_iSIFControlThread::StopTestAcquisition, Qt::DirectConnection); + //connect(this, &ZZ_DataGrabberThread::SignalStopGrab, &m_tcIS1CtrlThread, &ZZ_IS1ControlThread::StopTestAcquisition, Qt::DirectConnection); + connect(&m_tcISIFCtrlThread, &ZZ_iSIFControlThread::SignalAcqFinished, this, &ZZ_DataGrabberThread::HandleThreadEvent); + connect(&m_tcIS1CtrlThread, &ZZ_IS1ControlThread::SignalAcqFinished, this, &ZZ_DataGrabberThread::HandleThreadEvent); + + connect(this, &ZZ_DataGrabberThread::SignalGrabOnceFinished, this, &ZZ_DataGrabberThread::TestGrabOnce); //m_tcISIFCtrlThread.SetWaitCondition(&m_wcWaitISIF,&m_mTestMutex); //m_tcIS1CtrlThread.SetWaitCondition(&m_wcWaitIS1, &m_mTestMutex); return 0; @@ -38,6 +48,16 @@ int ZZ_DataGrabberThread::StartGrabberThread() return 0; } +int ZZ_DataGrabberThread::InitThreadStatus() +{ + m_piFlagCaptureThreadStatus = new int[m_iTotalThreads]; + for (int i=0;i< m_iTotalThreads;i++) + { + m_piFlagCaptureThreadStatus[i] = 0; + } + return 0; +} + int ZZ_DataGrabberThread::TestGrab() { m_bFlagIsCollecting = true; @@ -55,6 +75,12 @@ int ZZ_DataGrabberThread::TestGrab() return 0; } +int ZZ_DataGrabberThread::TestGrabOnce() +{ + emit SignalStartGrabOnce(); + return 0; +} + int ZZ_DataGrabberThread::TestStopGrab() { //emit SignalStopGrab(); @@ -64,19 +90,23 @@ int ZZ_DataGrabberThread::TestStopGrab() return 0; } -int ZZ_DataGrabberThread::handleThreadEvent(int x, int value) +int ZZ_DataGrabberThread::HandleThreadEvent(int iThreadID, int iFlagStatus) { - ProcessingThreadAactive[x] = value; + m_piFlagCaptureThreadStatus[iThreadID] = iFlagStatus; - // Check if threads are finished - for (int i = 0; i < numThreads; i++) + bool bFinished = true; + for (int i = 0; i < m_iTotalThreads; i++) + { + if (m_piFlagCaptureThreadStatus[i] != 1) { - bool finished = true; - if (ProcessingThreadAactive[i] == true) - { - finished = false; - // Do end actions here - break; - } + bFinished = false; + break; } + } + + if (bFinished) + { + emit SignalGrabOnceFinished(); + } + return 0; } diff --git a/source/Thread/ThreadDataGrabber.h b/source/Thread/ThreadDataGrabber.h index 4a64fea..52c5126 100644 --- a/source/Thread/ThreadDataGrabber.h +++ b/source/Thread/ThreadDataGrabber.h @@ -1,3 +1,6 @@ +////////////////////////////////////////////////////////////////////////// +//主采集控制线程 +////////////////////////////////////////////////////////////////////////// #pragma once #include"pch.h" #include "ThreadIS1Controller.h" @@ -11,8 +14,8 @@ public: ~ZZ_DataGrabberThread(); public: - QWaitCondition m_wcWaitISIF,m_wcWaitIS1; - QMutex m_mTestMutex; + //QWaitCondition m_wcWaitISIF,m_wcWaitIS1; + //QMutex m_mTestMutex; private: ZZ_iSIFControlThread m_tcISIFCtrlThread; ZZ_IS1ControlThread m_tcIS1CtrlThread; @@ -20,18 +23,22 @@ private: QThread* m_pqIS1ThreadHolder; std::atomic m_bFlagIsCollecting; + std::atomic m_bFlagIsCollectingFinished; + int *m_piFlagCaptureThreadStatus; + const int m_iTotalThreads = 2; public: int SetupSignals(); int StartGrabberThread(); private: - + int InitThreadStatus(); public slots: int TestGrab(); + int TestGrabOnce(); int TestStopGrab(); - int handleThreadEvent(int x, int value); + int HandleThreadEvent(int iThreadID, int iFlagStatus); signals: void SignalStartGrabOnce(); void SignalStopGrab(); - + void SignalGrabOnceFinished(); }; diff --git a/source/pch.h b/source/pch.h index 46a25eb..32f6d26 100644 --- a/source/pch.h +++ b/source/pch.h @@ -17,3 +17,5 @@ #include #include #include +////////////////////////////time +#include