diff --git a/CMakeSettings.json b/CMakeSettings.json index f8ea439..398f788 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -10,7 +10,7 @@ "ctestCommandArgs": "", "inheritEnvironments": [ "linux_arm" ], "intelliSenseMode": "linux-gcc-x64", - "remoteMachineName": "948173717;172.16.0.232 (username=root, port=22, authentication=Password)", + "remoteMachineName": "243120617;172.16.0.232 (username=root, port=22, authentication=Password)", "remoteCMakeListsRoot": "/home/pi/SIF0/src", "remoteBuildRoot": "/home/pi/SIF0/out/build_d/${name}", "remoteInstallRoot": "/home/pi/SIF0/out/install/${name}", @@ -28,8 +28,7 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] + "inheritEnvironments": [ "msvc_x64_x64" ] } ] } \ No newline at end of file diff --git a/config/config.json b/config/config.json index 55592fb..3b5aeef 100644 --- a/config/config.json +++ b/config/config.json @@ -1 +1 @@ -{"BeginTime":"8:00","IntervalTime":"10","EndTime":"18:00","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 +{"BeginTime":"08:00","IntervalTime":"02","EndTime":"23:00","Dev_SN":"0000001","Location":"beijing","GPS_North":"on","GPS_Longtitude":"117","GPS_Latitude":"41","GPS_Altitude":"100","InstallationTime":"2021-12-24","ISIFCalibrationTime":"2021-12-24","IS1CalibrationTime":"2021-12-24","NameOfMaintenanceStaff":"renlixin","PhoneNumberOfMaintenanceStaff":"1110010010","DownloadUserID":"xin","DownlaodAddress":"http:\/\/www.iris-rs.cn","HTTPServer":"http:\/\/82.156.1.111","OSIFAlpha_CaliFileMainName":""} \ No newline at end of file diff --git a/main.cpp b/main.cpp index f02ae9f..629df79 100644 --- a/main.cpp +++ b/main.cpp @@ -19,8 +19,8 @@ int main(int argc, char *argv[]) QCoreApplication a(argc, argv); - system("gpio mode 1 output");//������ų�ʼ�� - qDebug() << "gpio mode 1 output......" << endl; + //system("gpio mode 1 output");//������ų�ʼ�� + //qDebug() << "gpio mode 1 output......" << endl; ////////////////////////////////////////////////////////////////////////// //// GY39Controller m_ctrlHumitureDetector; @@ -46,12 +46,33 @@ int main(int argc, char *argv[]) HumitureDeviceInfo m_struHumitureDI; //////////////////////////////////////////////////////////////////////////logger ///create main system logger - QT_LOG::ZZ_InitLogger("/home/data/Log/"); + //QT_LOG::ZZ_InitLogger("/home/data/Log/"); //////////////////////////////////////////////////////////////////////////config ///turn on power supply - system("gpio mode 1 out"); + + //////add support to dual channel + system("gpio mode 1 out"); + system("gpio mode 4 out"); + system("gpio mode 5 out"); + qDebug() << "gpio 1;4;5; ready" << endl; + system("gpio write 1 1");//�豸�ϵ� qDebug() << "gpio write 1 1......" << endl; + +// QString qstrCMD_A, qstrCMD_B, qstrCMD_Temp; +// qstrCMD_Temp = QString::fromStdString("4"); +// qDebug() << qstrCMD_Temp << endl; +// qstrCMD_A = "gpio write " + qstrCMD_Temp + " 0"; +// +// qstrCMD_Temp = QString::fromStdString("5"); +// qDebug() << qstrCMD_Temp << endl; +// qstrCMD_B = "gpio write " + qstrCMD_Temp + " 0"; +// +// qDebug() << qstrCMD_A << endl; +// qDebug() << qstrCMD_B << endl; +// system(qstrCMD_A.toLatin1()); +// system(qstrCMD_B.toLatin1()); + QThread::msleep(5000); bRes = m_scConfiggerLoader.Initialize(); if (bRes) @@ -66,10 +87,10 @@ int main(int argc, char *argv[]) m_dfpSaver.SetManmadeEnviromentalContext(m_struMEC); m_mduUploader.SetContext(m_struEC, m_struMEC); - m_mduUploader.Initialize(); + //m_mduUploader.Initialize(); //m_ctrlHumitureDetector.Initialize(m_struHumitureDI.qstrInterfaceName.toStdString()); //////////////////////////////////////////////////////////////////////////prepare - m_sTimer.Preheating(); + //m_sTimer.Preheating(); //m_ctrlHumitureDetector.GetHumiture_retry(m_fChassisTemp, m_fChassisHum); m_struEC.qstrCaseTemperature= QString("%1").arg(m_fChassisTemp); diff --git a/othersoft/shuttercali/source/FS/ZZ_Types.h b/othersoft/shuttercali/source/FS/ZZ_Types.h index 7ad1c54..c5b2e15 100644 --- a/othersoft/shuttercali/source/FS/ZZ_Types.h +++ b/othersoft/shuttercali/source/FS/ZZ_Types.h @@ -179,7 +179,7 @@ namespace ZZ_MISCDEF { ZZ_U8 ucPort; ZZ_U8 ucProtocolType; - ZZ_U8 ucCmdID; + ZZ_U16 usCmdID; }LSContext; typedef struct tagAcquisitionTimeSettings diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index 78453f8..4921351 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -1,12 +1,18 @@ #include "AbstractFSController.h" #include "ZZ_Math_HDRONLY.h" +#include CAbstractFSController::CAbstractFSController(QObject* parent /*= nullptr*/) { iFlagInit = 0; m_pFSCtrl = NULL; m_iThreadID = -1; + m_vecDataFrameDark.clear(); m_vecDataFrameSignal.clear(); + + m_qstrCalFilePath = "/home/data/Cal"; + + m_vecNonLinearCalP.clear(); } CAbstractFSController::~CAbstractFSController() @@ -30,6 +36,9 @@ int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo) int CAbstractFSController::InitializeFSControl() { using namespace ZZ_MISCDEF::IRIS; + + int iRes = 0; + if (m_iThreadID == -1/*|| m_iDeviceType == -1*/) { qDebug() << "Params Err. Call SetRunParas first"; @@ -44,7 +53,12 @@ int CAbstractFSController::InitializeFSControl() qDebug() << "OSIFAlpha Not Opened"; return 2; } - + iRes = LoadQEProLinearCalibrationFile(); + if (iRes != 0) + { + qDebug() << "LoadQEProLinearCalibrationFile Failed" << iRes; + //return 5; + } break; case DeviceModel::OSIFBeta: m_pFSCtrl = new OceanOptics_lib; @@ -53,6 +67,12 @@ int CAbstractFSController::InitializeFSControl() qDebug() << "OSIFBeta Not Opened"; return 2; } + iRes = LoadQEProLinearCalibrationFile(); + if (iRes != 0) + { + qDebug() << "LoadQEProLinearCalibrationFile Failed" << iRes; + //return 5; + } break; case DeviceModel::ISIF: m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; @@ -85,7 +105,7 @@ int CAbstractFSController::InitializeFSControl() break; } - int iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr); + iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr); if (iRes != 0) { qDebug() << "GetDeviceAttribute Failed" << iRes; @@ -364,6 +384,28 @@ DataFrame CAbstractFSController::TakeOneFrame() qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID; } + if (m_fsInfo.ucDeviceModel == DeviceModel::OSIFAlpha|| m_fsInfo.ucDeviceModel == DeviceModel::OSIFBeta) + { + if (m_vecNonLinearCalP.size() != 8) + { + qDebug() << "Err.Non Linear calibration parameters not fit.Skip..." << " Thread ID:" << m_iThreadID; + return dfTemp; + } + for (int i=0;iSingleShot(dfTemp); @@ -380,18 +422,55 @@ int CAbstractFSController::SaveDataFile() return 0; } +int CAbstractFSController::LoadQEProLinearCalibrationFile() +{ + m_vecNonLinearCalP.clear(); + + QDir qdirPath(m_qstrCalFilePath); + if (!qdirPath.exists()) + { + qDebug() << "Non-Linear Calibration Folder not exist" << " Thread ID:" << m_iThreadID; + return 1; + } + QString qstrFilePath; + + qstrFilePath = m_qstrCalFilePath + QString("/")+QString::fromStdString(m_fsInfo.strSN)+ QString(".NLC"); + + QFile qfCalFile(qstrFilePath); + bool bRes = qfCalFile.open(QFile::ReadOnly); + if (!bRes) + { + qDebug() << "Non-Linear Calibration File open Failed" << " Thread ID:" << m_iThreadID; + return 2; + } + + while (!qfCalFile.atEnd()) + { + QByteArray qbData = qfCalFile.readLine(); + qbData.remove(qbData.size()-1, 1); + m_vecNonLinearCalP.push_back(qbData.toDouble()); + //qDebug() << qbData; + } + qfCalFile.close(); + + qDebug() <<"Non-Linear Calibration Params:"<< m_vecNonLinearCalP.size() << " Thread ID:" << m_iThreadID; + + + + return 0; +} + int CAbstractFSController::StartAcquisitionSignal() { // qDebug() << "Starting acq Signal" << " Thread ID:" << m_iThreadID; + // DataFrame struDF; // int iii; // m_pFSCtrl->SetExposureTime(10000000); // m_pFSCtrl->GetExposureTime(iii); // m_pFSCtrl->SingleShot(struDF); - - PerformAutoExposure(); TakeSignalFrame(); diff --git a/source/CaptureThread/AbstractFSController.h b/source/CaptureThread/AbstractFSController.h index 0171179..eab21b6 100644 --- a/source/CaptureThread/AbstractFSController.h +++ b/source/CaptureThread/AbstractFSController.h @@ -43,6 +43,10 @@ private: std::vector m_vecDataFrameDark, m_vecDataFrameSignal; DeviceAttribute m_daDeviceAttr; + + //QE NLC + QString m_qstrCalFilePath; + std::vector m_vecNonLinearCalP; private: int PerformAutoExposure(); int TakeDarkFrame(); @@ -50,6 +54,8 @@ private: DataFrame TakeOneFrame(); int SaveDataFile(); + //QE NLC + int LoadQEProLinearCalibrationFile(); public slots: virtual int StartAcquisitionSignal(); virtual int StartAcquisitionDark(); diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index 8b3f7a9..a65f71c 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -122,14 +122,45 @@ int CMainDataGrabber::InitLS() //SetupMsgPipelines_RunTime(); //StartWorkers(); + if (m_struLinearShutterContext.strInterface=="GPIO") + { + qDebug() << "Debugging GPIO Init Started"; - PortInfo piTemp; - piTemp.qstrFullPortName = QString::fromStdString(m_struLinearShutterContext.strInterface); - m_ctrlLS.ILMES_InitializeComm(piTemp, m_struLinearShutterContext.ucProtocolType, m_struLinearShutterContext.ucCmdID); - ControllerParams cpTemp; - bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp); + m_vecDSS.clear(); - m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition); + if (m_struLinearShutterContext.ucProtocolType == 100) + { + DSStatus DSSOne; + + QString qstrChannel = QString::number(m_struLinearShutterContext.usCmdID, 10); + if (qstrChannel.size() != 2) + { + qDebug() << "Dual Shutter Channel Parse Err."; + return -1; + } + else + { + DSSOne.strChannelA = qstrChannel.toStdString()[0]; + DSSOne.strChannelB = qstrChannel.toStdString()[1]; + DSSOne.iChannelA = 1; + DSSOne.iChannelB = 1; + } + + m_vecDSS.push_back(DSSOne); + + + } + } + else + { + PortInfo piTemp; + piTemp.qstrFullPortName = QString::fromStdString(m_struLinearShutterContext.strInterface); + m_ctrlLS.ILMES_InitializeComm(piTemp, m_struLinearShutterContext.ucProtocolType, m_struLinearShutterContext.usCmdID); + ControllerParams cpTemp; + bool res = m_ctrlLS.ILMES_InitializeParams(cpTemp); + m_ctrlLS.ILMES_SetPosition(m_struAcqPosSetting.iPosition, m_struAcqPosSetting.iTotalPosition); + } + //m_ctrlLS.ILMES_MoveToPos(2); return 0; @@ -428,6 +459,9 @@ int CMainDataGrabber::GrabOnceFinished() int CMainDataGrabber::OnTimeCounter() { + bool bRes; + QString qstrCMD_A,qstrCMD_B,qstrCMD_Temp; + if (m_iFlagIsCapturing) { qDebug() << "Fatal Warning.Last capture not finished.New acquisition will not start"; @@ -445,30 +479,84 @@ int CMainDataGrabber::GrabOnceFinished() } - ////hold current - bool bRes = m_ctrlLS.SetHoldCurrent(0.4f); - if (!bRes) + + if (m_struLinearShutterContext.strInterface == "GPIO") { - qDebug() << "SetHoldCurrent 0.4 Failed"; } - Delay_MSec(1000); - //// + else + { + ////hold current + bRes = m_ctrlLS.SetHoldCurrent(0.4f); + if (!bRes) + { + qDebug() << "SetHoldCurrent 0.4 Failed"; + } + Delay_MSec(1000); + //// + } + for (int i=0;i< m_struAcqPosSetting.iTotalPosition-1;i++) { ResetThreadStatus(); - ////move to - qDebug()<<"Start ILMES_MoveToPos:"<> vecData; for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) diff --git a/source/CaptureThread/MainDataGrabber.h b/source/CaptureThread/MainDataGrabber.h index 0fd2df4..856f7be 100644 --- a/source/CaptureThread/MainDataGrabber.h +++ b/source/CaptureThread/MainDataGrabber.h @@ -43,6 +43,9 @@ private: AcqPosSettings m_struAcqPosSetting; AcqTimeSettings m_struAcqTime; RunTimeGrabberParams m_struRTGP; + + //20220422 added for dual-shutter system + vector m_vecDSS; //QTimer *m_GrabTimer; private: diff --git a/source/FS/ATPControl_Serial_QT.cpp b/source/FS/ATPControl_Serial_QT.cpp index ce9bb17..12bb950 100644 --- a/source/FS/ATPControl_Serial_QT.cpp +++ b/source/FS/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,10 +527,14 @@ int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fM { bFlagIsAutoExposureFailed = true; bFlagIsOverTrying = true; + qDebug() << "over 30 Times" << endl; break; } - fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + int fTemp; + GetExposureTime(fTemp); + fExposureTime = fTemp; fTempExposureTime = fExposureTime; iRes = SingleShot(dfTemp); @@ -592,11 +596,13 @@ 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 than minimum" << endl; + } } bIsLastValueOverflow = bIsValueOverflow; @@ -669,7 +675,7 @@ int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) if ((ZZ_U8)qbRecv[0] != 0) { qDebug() << "Err:SetExposureTime Failed.Exit Code:1"; - return 1; + //return 1; } return 0; diff --git a/source/FS/ZZ_Types.h b/source/FS/ZZ_Types.h index eba700c..9e4ef1f 100644 --- a/source/FS/ZZ_Types.h +++ b/source/FS/ZZ_Types.h @@ -200,11 +200,21 @@ namespace ZZ_MISCDEF float fWavelength[MAX_DEVICENUMBER_FS][4096]; }FSContext; + + typedef struct tagDualShutterStatus + { + std::string strChannelA; + std::string strChannelB; + int iChannelA = 0; + int iChannelB = 0; + }DSStatus; + + typedef struct tagLinearShutterContext { std::string strInterface; ZZ_U8 ucProtocolType; - ZZ_U8 ucCmdID; + ZZ_U16 usCmdID; }LSContext; typedef struct tagAcquisitionTimeSettings diff --git a/source/Settings/SystemConfigger.cpp b/source/Settings/SystemConfigger.cpp index f99c994..a40d3af 100644 --- a/source/Settings/SystemConfigger.cpp +++ b/source/Settings/SystemConfigger.cpp @@ -78,7 +78,7 @@ } - m_struLSContext.ucCmdID = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/DCID")).toInt(); + m_struLSContext.usCmdID = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/DCID")).toInt(); m_struLSContext.ucProtocolType = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/Type")).toInt(); m_struLSContext.strInterface = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/Port")).toString().toStdString(); diff --git a/source/Uploader/DataFileTransfer.cpp b/source/Uploader/DataFileTransfer.cpp index 5998ab5..a279c1a 100644 --- a/source/Uploader/DataFileTransfer.cpp +++ b/source/Uploader/DataFileTransfer.cpp @@ -101,7 +101,7 @@ int ZZ_HttpTransfer::SendInfo() m_iFlagIsReplied = false; for (int i = 0; i < m_struGrabberRTParams.fscParams.ucDeviceNumber; i++) { - qstrSend = "Location:" + QString("%1").arg(m_struEC.qstrLocation) + "####"; + qstrSend = "Location:" + QString("%1").arg(m_struEC.qstrLocation) + "####"; qstrSend += "DEV_SN:" + QString("%1").arg(m_struEC.qstrDEV_SN) + "####"; qstrSend += "FS_SN:" + QString::fromLocal8Bit(m_struGrabberRTParams.fscParams.strSN[i].c_str()) + "####"; qstrSend += "GPS_Longtitude:" + QString("%1").arg(m_struEC.qstrGPS_Longtitude) + "####"; @@ -114,6 +114,9 @@ int ZZ_HttpTransfer::SendInfo() qstrSend += "Bands:" + QString("%1").arg(m_struGrabberRTParams.fscParams.usPixels[i]) + "####"; qstrSend += "Positions:" + QString("%1").arg(m_struGrabberRTParams.apsParams.iTotalPosition-1) + "####"; qstrSend += "WaveLength:"; + + qDebug() << m_struEC.qstrDEV_SN; + for (int j=0;j< m_struGrabberRTParams.fscParams.usPixels[i];j++) { qstrWaveLength = QString("%1").arg(m_struGrabberRTParams.fscParams.fWavelength[i][j]); @@ -253,8 +256,8 @@ void ZZ_HttpTransfer::Delay_MSec(ZZ_U16 usMS) int ZZ_HttpTransfer::SlotReplyFinished(QNetworkReply* qnReply) { - QString qstrURL = qnReply->url().toString(); - QByteArray qbData = qnReply->readAll(); + QString qstrURL = qnReply->url().toString(); + QByteArray qbData = qnReply->readAll(); if (qnReply->error()== QNetworkReply::NoError) { qDebug() << "Reply NoError:" << "Server:" << qstrURL; diff --git a/source/Uploader/MainDataUploader.cpp b/source/Uploader/MainDataUploader.cpp index 27509fd..a1a20ba 100644 --- a/source/Uploader/MainDataUploader.cpp +++ b/source/Uploader/MainDataUploader.cpp @@ -52,7 +52,6 @@ void CMainDataUploader::Calibration() { int iScanPoints = m_struGrabberRTParams.apsParams.iTotalPosition - 1; int iDevices = m_struGrabberRTParams.fscParams.ucDeviceNumber; - m_vecCalcedData.clear(); m_vecCalcedData.resize(iDevices); for (int i=0;i< iDevices;i++) @@ -72,6 +71,7 @@ void CMainDataUploader::Calibration() { m_vecCalcedData[j][i].fData[k] = (float)(m_vecData[j][i].lData[k]* m_vecCalData[j][i].dCal_Gain[k]* m_vecCalData[j][i].uiExposureTimeInMS/m_vecData[j][i].usExposureTimeInMS); } + } } } diff --git a/source/Uploader/RadianceConverter.cpp b/source/Uploader/RadianceConverter.cpp index 5468819..e500375 100644 --- a/source/Uploader/RadianceConverter.cpp +++ b/source/Uploader/RadianceConverter.cpp @@ -58,11 +58,6 @@ int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams qfCalFile.read((char*)OneFile.dCal_Gain, sizeof(double)*OneFile.iPixels); qfCalFile.read((char*)OneFile.dCal_Offset, sizeof(double)*OneFile.iPixels); - /////check attribute -// if () -// { -// } - vecOneDev.push_back(OneFile); } struAllCalFrame.push_back(vecOneDev); @@ -72,3 +67,9 @@ int RadConverter::LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams return 0; } + +// int RadConverter::LoadQEProLinearParams(RunTimeGrabberParams struGrabberRTParams, vector>& vecQEPLP) +// { +// int iQEPDevices = 0; +// return 0; +// } diff --git a/source/Uploader/RadianceConverter.h b/source/Uploader/RadianceConverter.h index 9ea9f02..3574b4e 100644 --- a/source/Uploader/RadianceConverter.h +++ b/source/Uploader/RadianceConverter.h @@ -15,6 +15,7 @@ public: public: public: int LoadCalibrationFrames(RunTimeGrabberParams struGrabberRTParams, vector> &struAllCalFrame); + //int LoadQEProLinearParams(RunTimeGrabberParams struGrabberRTParams, vector>& vecQEPLP); private: QString m_qstrCalFilePath; private: