diff --git a/deb_pack.sh b/deb_pack.sh index fecec9b..7354676 100755 --- a/deb_pack.sh +++ b/deb_pack.sh @@ -7,7 +7,7 @@ # exit 1 #fi -VERSION=2.1.5 +VERSION=2.1.9 sh install.sh thispwd=$(pwd) @@ -36,6 +36,7 @@ echo "Version:${VERSION}" >> ./control echo "echo \"V${VERSION}\" > /home/data/version" >> ./postinst chmod +x ./post* chmod +x ./control +chmod +x ./preinst cd ../ #复制root文件 mkdir -p ./root diff --git a/dpkg/preinst b/dpkg/preinst new file mode 100644 index 0000000..752997a --- /dev/null +++ b/dpkg/preinst @@ -0,0 +1,7 @@ +#!/bin/bash +set -e +# 删除可能引起冲突的文件 +if [ -f /home/data/ChangeLog.md ]; then + echo "Removing conflicting ChangeLog.md file..." + rm -f /home/data/ChangeLog.md +fi \ No newline at end of file diff --git a/html/config/LocationCali.php b/html/config/LocationCali.php index 4485c20..d13ef94 100644 --- a/html/config/LocationCali.php +++ b/html/config/LocationCali.php @@ -13,9 +13,10 @@ set_time_limit(0); ob_end_clean();//清空(擦除)缓冲区并关闭输出缓冲 ob_implicit_flush(1);//将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用 system("sudo gpio mode 1 out"); -system("sudo gpio write 1 1"); +system("sudo gpio write 1 0");system("sudo gpio write 12 0"); + system("sudo killall Mywathdog.sh"); -system("sudo killall TowerOptoSifAndSpectral"); +system("sudo killall AirOptoSifAndSpectral"); system("sudo pkill shutter_calibrate"); diff --git a/html/config/calibrate.php b/html/config/calibrate.php index cbeef77..eac3ddf 100644 --- a/html/config/calibrate.php +++ b/html/config/calibrate.php @@ -34,9 +34,10 @@ $numberofFS=0; system("sudo killall Mywathdog.sh"); -system("sudo killall TowerOptoSifAndSpectral"); +system("sudo killall "); system("sudo pkill ocean_optics_calibration_console"); -system("sudo gpio write 1 1"); +system("sudo gpio write 1 0"); +system("sudo gpio write 12 0"); $cmd=""; diff --git a/html/config/location.php b/html/config/location.php index 029ef14..19a7dd3 100644 --- a/html/config/location.php +++ b/html/config/location.php @@ -14,7 +14,7 @@ ob_implicit_flush(1);//将打开或关闭绝对(隐式)刷送。绝对(隐 //$cmd = 'ping 127.0.0.1'; //sy"" system("sudo killall Mywathdog.sh"); -system("sudo killall TowerOptoSifAndSpectral"); +system("sudo killall AirOptoSifAndSpectral"); system("sudo pkill movingliner"); Echo $a; $cmd = 'sudo /home/pi/bin/movingliner '.$a; diff --git a/install.sh b/install.sh index aacd72a..4a432e6 100644 --- a/install.sh +++ b/install.sh @@ -2,5 +2,6 @@ mkdir -p build cd build cmake ../ make -j4 +cp AirOptoSifAndSpectral /home/pi/bin cd ../othersoft sh install.sh \ No newline at end of file diff --git a/main.cpp b/main.cpp index f304719..37a3bb0 100644 --- a/main.cpp +++ b/main.cpp @@ -60,12 +60,20 @@ int main(int argc, char *argv[]) iRet0 = system("gpio mode 1 out"); iRet1 = system("gpio mode 4 out"); iRet2 = system("gpio mode 5 out"); + iRet1 = system("gpio mode 20 out"); + qDebug()<< "set gpio 20 out"<< endl; + iRet2 = system("gpio mode 21 out"); + qDebug()<< "set gpio 21 out"<< endl; + iRet1 = system("gpio mode 22 out"); + qDebug()<< "set gpio 22 out"<< endl; + iRet2 = system("gpio mode 23 out"); + qDebug()<< "set gpio 23 out"<< endl; system("gpio mode 13 input"); system("gpio write 13 0"); - iRet3 = system("gpio write 1 1");//上电 - + iRet3 = system("gpio write 1 0");//上电 + iRet3 = system("gpio write 12 0");//上电 qDebug() << "gpio 1;4;5; ready"<<" Ret:"<< iRet0<< iRet1<< iRet2<< endl; - qDebug() << "gpio write 1 1......" <<" Ret:"<< iRet3<< endl; + qDebug() << "gpio write 1 0......" <<" Ret:"<< iRet3<< endl; // QString qstrCMD_A, qstrCMD_B, qstrCMD_Temp; // qstrCMD_Temp = QString::fromStdString("4"); diff --git a/othersoft/GPSLog/src/DataLogger.cpp b/othersoft/GPSLog/src/DataLogger.cpp index 1e35e17..a527ade 100644 --- a/othersoft/GPSLog/src/DataLogger.cpp +++ b/othersoft/GPSLog/src/DataLogger.cpp @@ -12,6 +12,7 @@ DataLogger::DataLogger(const QString &filePath, QObject *parent) bool DataLogger::openFile() { if (m_file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { + m_stream.setRealNumberPrecision(8); qDebug() << "Data log file opened: " << m_filePath; return true; } else { diff --git a/source/CaptureThread/AbstractFSController.cpp b/source/CaptureThread/AbstractFSController.cpp index 57eccfc..a7af17a 100644 --- a/source/CaptureThread/AbstractFSController.cpp +++ b/source/CaptureThread/AbstractFSController.cpp @@ -1,669 +1,583 @@ #include "AbstractFSController.h" #include "ZZ_Math_HDRONLY.h" #include -void Delay_MSec(ZZ_U16 usMS) -{ - QEventLoop qeLoop; - QTimer::singleShot(usMS, &qeLoop, SLOT(quit())); - qeLoop.exec(); -} -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(); - for (int i=0;i<10;i++) { - m_taginfolast.ITtimeChange[i] =true; - m_taginfolast.LastMAXValue[i] = 0; - m_taginfolast.lastITTIME[i] = 0; - } +void Delay_MSec(ZZ_U16 usMS) { + QEventLoop qeLoop; + QTimer::singleShot(usMS, &qeLoop, SLOT(quit())); + qeLoop.exec(); } -CAbstractFSController::~CAbstractFSController() -{ - if (m_pFSCtrl!= 0 ) - { - delete m_pFSCtrl; - } +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(); + for (int i = 0; i < 10; i++) { + m_taginfolast.ITtimeChange[i] = true; + m_taginfolast.LastMAXValue[i] = 0; + m_taginfolast.lastITTIME[i] = 0; + } } -int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo) -{ - connect(this, &CAbstractFSController::SignalInit_Self, this, &CAbstractFSController::InitializeFSControl); - m_iThreadID = iThreadID; - m_fsInfo = fsInfo; - return 0; +CAbstractFSController::~CAbstractFSController() { + if (m_pFSCtrl != 0) { + delete m_pFSCtrl; + } +} + +int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo) { + connect(this, &CAbstractFSController::SignalInit_Self, this, &CAbstractFSController::InitializeFSControl); + m_iThreadID = iThreadID; + m_fsInfo = fsInfo; + return 0; } +int CAbstractFSController::InitializeFSControl() { + using namespace ZZ_MISCDEF::IRIS; -int CAbstractFSController::InitializeFSControl() -{ - using namespace ZZ_MISCDEF::IRIS; + int iRes = 0; - int iRes = 0; + if (m_iThreadID == -1/*|| m_iDeviceType == -1*/) { + qDebug() << "Params Err. Call SetRunParas first"; + return 1; + } + switch (m_fsInfo.ucDeviceModel) { + case DeviceModel::OSIFAlpha: + m_pFSCtrl = new OceanOptics_lib; + if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) { + 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; + if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) { + 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; + //m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, NULL); + if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) { + qDebug() << "ISIF Not Opened"; + return 3; + } + break; + case DeviceModel::IS1: + m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; + //m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, NULL); + if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) { + qDebug() << "IS1 Not Opened"; + return 3; + } + break; + case DeviceModel::IS2: + m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; + //m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, NULL); + if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) { + qDebug() << "IS2 Not Opened"; + return 3; + } + break; + default: + break; + } - if (m_iThreadID == -1/*|| m_iDeviceType == -1*/) - { - qDebug() << "Params Err. Call SetRunParas first"; - return 1; - } - switch (m_fsInfo.ucDeviceModel) - { - case DeviceModel::OSIFAlpha: - m_pFSCtrl = new OceanOptics_lib; - if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) - { - 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; - if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) !=0) - { - 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; - //m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, NULL); - if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) - { - qDebug() << "ISIF Not Opened"; - return 3; - } - break; - case DeviceModel::IS1: - m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; - //m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, NULL); - if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) - { - qDebug() << "IS1 Not Opened"; - return 3; - } - break; - case DeviceModel::IS2: - m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; - //m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, NULL); - if (m_pFSCtrl->Initialize(false, m_fsInfo.strInterface, m_fsInfo.strSN) != 0) - { - qDebug() << "IS2 Not Opened"; - return 3; - } - break; - default: - break; - } + iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr); + if (iRes != 0) { + qDebug() << "GetDeviceAttribute Failed" << iRes; + return 4; + } - iRes = m_pFSCtrl->GetDeviceAttribute(m_daDeviceAttr); - if (iRes != 0) - { - qDebug() << "GetDeviceAttribute Failed" << iRes; - return 4; - } - - iRes = m_pFSCtrl->SetDeviceTemperature(0); - if (iRes != 0) - { - qDebug() << "SetDeviceTemperature Failed" << iRes; - //return 5; - } - iFlagInit = 1; - return 0; + iRes = m_pFSCtrl->SetDeviceTemperature(0); + if (iRes != 0) { + qDebug() << "SetDeviceTemperature Failed" << iRes; + //return 5; + } + iFlagInit = 1; + return 0; } -int CAbstractFSController::InitializeFSControl_Self() -{ - //InitializeFSControl(); - emit SignalInit_Self(); - return 0; +int CAbstractFSController::InitializeFSControl_Self() { + //InitializeFSControl(); + emit SignalInit_Self(); + return 0; } -int CAbstractFSController::GetDeviceAttr(DeviceAttribute &daAttr) -{ - daAttr = m_daDeviceAttr; - return 0; +int CAbstractFSController::GetDeviceAttr(DeviceAttribute &daAttr) { + daAttr = m_daDeviceAttr; + return 0; } -int CAbstractFSController::PerformAutoExposure(int position) -{ - if (position!=0) { - // m_taginfolast.ITtimeChange[position] = true; - m_taginfolast.lastITTIME[position] = m_taginfolast.lastITTIME[0]*0.5 ; - m_pFSCtrl->SetExposureTime(m_taginfolast.lastITTIME[position] ); - return 0; - } +int CAbstractFSController::PerformAutoExposure(int position) { + if (position != 0) { + // m_taginfolast.ITtimeChange[position] = true; + m_taginfolast.lastITTIME[position] = m_taginfolast.lastITTIME[0] * 0.5; + m_pFSCtrl->SetExposureTime(m_taginfolast.lastITTIME[position]); + return 0; + } + qDebug() << "--------------------------Starting PerformAutoExposure" << " Thread ID:" << m_iThreadID; + using namespace ZZ_MATH; + float fPredictedExposureTime; + int iDeviceDepth = (int) m_fsInfo.lDepth; + + qDebug() << "MAX---Min" << m_fsInfo.fMaxFactor << "---" << m_fsInfo.fMinFactor << " Thread ID:" << m_iThreadID; + + bool bFlagIsOverTrying = false; + bool bFlagIsLowerMinExposureTime = false; + bool bFlagIsOverMaxExposureTime = false; + bool bFlagIsAutoExposureOK = false; + bool bFlagIsAutoExposureFailed = false; + + bool bIsValueOverflow = false; + bool bIsLastValueOverflow = false; + + int iExposureTime = 1000; + 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; + if (iRes != 0) { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1" << " Thread ID:" << m_iThreadID; + return 1; + } + + while (!bFlagIsAutoExposureOK && !bFlagIsAutoExposureFailed) { + DataFrame dfTemp; + + if (iRepeatCount++ > 30) { + bFlagIsAutoExposureFailed = true; + bFlagIsOverTrying = true; + break; + } + //m_pFSCtrl->SetExposureTime(5000); + // m_pFSCtrl->GetExposureTime(iExposureTime); + // qDebug() << "Current ExpTime:" << iExposureTime << " Thread ID:" << m_iThreadID; + m_pFSCtrl->SetExposureTime(iExposureTime); + //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + fTempExposureTime = iExposureTime; + + iRes = m_pFSCtrl->SingleShot(dfTemp); + //iRes = m_pFSCtrl->SingleShot(dfTemp); + if (iRes != 0) { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2" << " Thread ID:" << m_iThreadID; + return 2; + } + + HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels); + + double dSum = 0; + int iCount = m_daDeviceAttr.iPixels / 200; + 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; + } else { + iExposureTime = iExposureTime / 2; + } + } else if (iDeviceDepth * m_fsInfo.fMaxFactor >= dTemp && dTemp >= iDeviceDepth * m_fsInfo.fMinFactor) { + qDebug() << "trace bFlagIsAutoExposureOK =1 " << iExposureTime << " Thread ID:" << m_iThreadID; + bFlagIsAutoExposureOK = 1; + } else if (dTemp > iDeviceDepth * m_fsInfo.fMaxFactor) { + bIsValueOverflow = true; + if (!bIsLastValueOverflow) { + iExposureTime = (float) (fLastExposureTime + iExposureTime) / 2; + } else { + iExposureTime = iExposureTime * 3 / 4; + } + } else if (dTemp < iDeviceDepth * m_fsInfo.fMinFactor) { + bIsValueOverflow = false; + if (bIsLastValueOverflow) { + iExposureTime = (float) (fLastExposureTime + iExposureTime) / 2; + } else { + double dFactor; + dFactor = dTemp / (iDeviceDepth * m_fsInfo.fMaxFactor); + iExposureTime = (float) (iExposureTime / dFactor); + } + } + bIsLastValueOverflow = bIsValueOverflow; + fLastExposureTime = fTempExposureTime; + if (/*fExposureTime > 100 || */iExposureTime <= m_daDeviceAttr.iMinIntegrationTimeInMS) { + bFlagIsAutoExposureOK = false; + bFlagIsAutoExposureFailed = true; + bFlagIsLowerMinExposureTime = true; - qDebug() << "--------------------------Starting PerformAutoExposure" << " Thread ID:" << m_iThreadID; - using namespace ZZ_MATH; - float fPredictedExposureTime; - int iDeviceDepth = (int)m_fsInfo.lDepth; + // qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMinIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; + // iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); + // if (iRes != 0) + // { + // qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; + // return 3; + // } + // else + // { + // qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; + // } + m_taginfolast.ITtimeChange[position] = true; + m_taginfolast.lastITTIME[position] = m_daDeviceAttr.iMinIntegrationTimeInMS; + iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); + if (iRes != 0) { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + return 3; + } else { + qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << + m_daDeviceAttr.iMinIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID; + } - qDebug() << "MAX---Min" << m_fsInfo.fMaxFactor << "---" << m_fsInfo.fMinFactor << " Thread ID:" << m_iThreadID; + break; + } - bool bFlagIsOverTrying = false; - bool bFlagIsLowerMinExposureTime = false; - bool bFlagIsOverMaxExposureTime = false; - bool bFlagIsAutoExposureOK = false; - bool bFlagIsAutoExposureFailed = false; + if (iExposureTime > m_daDeviceAttr.iMaxIntegrationTimeInMS - 1) { + bFlagIsAutoExposureOK = false; + bFlagIsAutoExposureFailed = true; + bFlagIsOverMaxExposureTime = true; + //float fPredictedExposureTime = m_daDeviceAttr.iMaxIntegrationTimeInMS-1; + //iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS-1); + //if (iRes != 0) + //{ + //qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + //return 3; + //} + //else + //{ + //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; + //} + m_taginfolast.ITtimeChange[position] = true; + m_taginfolast.lastITTIME[position] = m_daDeviceAttr.iMaxIntegrationTimeInMS - 1; + iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS - 1); + if (iRes != 0) { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; + return 3; + } else { + qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << + m_daDeviceAttr.iMaxIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; + } - bool bIsValueOverflow = false; - bool bIsLastValueOverflow = false; + break; + } + m_taginfolast.ITtimeChange[position] = true; + m_taginfolast.lastITTIME[position] = (int) iExposureTime; + iRes = m_pFSCtrl->SetExposureTime((int) iExposureTime); + if (iRes != 0) { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; + return 3; + } else { + qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; + } + } - int iExposureTime = 1000; - float fTempExposureTime = 0; - double fLastExposureTime = 0.1; - int iRepeatCount = 0; + fPredictedExposureTime = iExposureTime; + qDebug() << "--------------------------Stop PerformAutoExposure" << " Thread ID:" << m_iThreadID; + //emit SignalAcqFinished(m_iThreadID, 1); - //int iRes = m_pFSCtrl->SetExposureTime(1000);//need change to load from files - int iRes = 0; - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1" << " Thread ID:" << m_iThreadID; - return 1; - } - - while (!bFlagIsAutoExposureOK && !bFlagIsAutoExposureFailed) - { - DataFrame dfTemp; - - if (iRepeatCount++ > 30) - { - bFlagIsAutoExposureFailed = true; - bFlagIsOverTrying = true; - break; - } - //m_pFSCtrl->SetExposureTime(5000); - // m_pFSCtrl->GetExposureTime(iExposureTime); - // qDebug() << "Current ExpTime:" << iExposureTime << " Thread ID:" << m_iThreadID; - m_pFSCtrl->SetExposureTime(iExposureTime); - //fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; - fTempExposureTime = iExposureTime; - - iRes = m_pFSCtrl->SingleShot(dfTemp); - //iRes = m_pFSCtrl->SingleShot(dfTemp); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2" << " Thread ID:" << m_iThreadID; - return 2; - } - - HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels); - - double dSum = 0; - int iCount = m_daDeviceAttr.iPixels / 200; - 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; - } - else - { - iExposureTime = iExposureTime / 2; - } - } - - else if (iDeviceDepth * m_fsInfo.fMaxFactor >= dTemp && dTemp >= iDeviceDepth * m_fsInfo.fMinFactor) - { - qDebug() << "trace bFlagIsAutoExposureOK =1 " << iExposureTime << " Thread ID:" << m_iThreadID; - bFlagIsAutoExposureOK = 1; - } - else if (dTemp > iDeviceDepth * m_fsInfo.fMaxFactor) - { - bIsValueOverflow = true; - if (!bIsLastValueOverflow) - { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; - } - else - { - iExposureTime = iExposureTime * 3 / 4; - } - } - else if (dTemp < iDeviceDepth * m_fsInfo.fMinFactor) - { - bIsValueOverflow = false; - if (bIsLastValueOverflow) - { - iExposureTime = (float)(fLastExposureTime + iExposureTime) / 2; - } - else - { - double dFactor; - dFactor = dTemp / (iDeviceDepth * m_fsInfo.fMaxFactor); - iExposureTime = (float)(iExposureTime / dFactor); - } - - } - bIsLastValueOverflow = bIsValueOverflow; - fLastExposureTime = fTempExposureTime; - - - - if (/*fExposureTime > 100 || */iExposureTime <= m_daDeviceAttr.iMinIntegrationTimeInMS) - { - bFlagIsAutoExposureOK = false; - bFlagIsAutoExposureFailed = true; - bFlagIsLowerMinExposureTime = true; - -// qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMinIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; -// iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); -// if (iRes != 0) -// { -// qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; -// return 3; -// } -// else -// { -// qDebug() << "Success:PerformAutoExposure. Value" << iExposureTime << " Thread ID:" << m_iThreadID; -// } - m_taginfolast.ITtimeChange[position] = true; - m_taginfolast.lastITTIME[position] = m_daDeviceAttr.iMinIntegrationTimeInMS; - iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; - return 3; - } - else - { - qDebug() << "Warning:PerformAutoExposure lower than min integration time.Will be limited to " << m_daDeviceAttr.iMinIntegrationTimeInMS << "MS" << " Thread ID:" << m_iThreadID; - } - - break; - } - - if (iExposureTime > m_daDeviceAttr.iMaxIntegrationTimeInMS-1) - { - bFlagIsAutoExposureOK = false; - bFlagIsAutoExposureFailed = true; - bFlagIsOverMaxExposureTime = true; - //float fPredictedExposureTime = m_daDeviceAttr.iMaxIntegrationTimeInMS-1; - //iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS-1); - //if (iRes != 0) - //{ - //qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; - //return 3; - //} - //else - //{ - //qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to 30sec"; - //} - m_taginfolast.ITtimeChange[position] = true; - m_taginfolast.lastITTIME[position] =m_daDeviceAttr.iMaxIntegrationTimeInMS - 1; - iRes = m_pFSCtrl->SetExposureTime(m_daDeviceAttr.iMaxIntegrationTimeInMS - 1); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3" << " Thread ID:" << m_iThreadID; - return 3; - } - else - { - qDebug() << "Warning:PerformAutoExposure exceed max integration time.Will be limited to " << m_daDeviceAttr.iMaxIntegrationTimeInMS - 1 << "MS" << " Thread ID:" << m_iThreadID; - } - - break; - } - m_taginfolast.ITtimeChange[position] = true; - m_taginfolast.lastITTIME[position] =(int)iExposureTime; - iRes = m_pFSCtrl->SetExposureTime((int)iExposureTime); - if (iRes != 0) - { - qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4" << " Thread ID:" << m_iThreadID; - 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); - - return 0; + return 0; } int CAbstractFSController::ComputExposure(int position) { - if (position==0) { + if (position == 0) { + int lastittime = m_taginfolast.lastITTIME[position]; + int lastmaxvalue = m_taginfolast.LastMAXValue[position]; + int maxallowvalue = m_fsInfo.lDepth * m_fsInfo.fMaxFactor; + int minallowvalue = m_fsInfo.lDepth * m_fsInfo.fMinFactor; + if (lastmaxvalue > maxallowvalue) { + if (lastmaxvalue >= m_fsInfo.lDepth) { + lastittime = lastittime / 2; + } else { + lastittime = lastittime * (maxallowvalue * 1.0 / lastmaxvalue) * 0.95; + } - int lastittime=m_taginfolast.lastITTIME[position]; - int lastmaxvalue=m_taginfolast.LastMAXValue[position]; - - int maxallowvalue=m_fsInfo.lDepth * m_fsInfo.fMaxFactor; - int minallowvalue=m_fsInfo.lDepth * m_fsInfo.fMinFactor; - if (lastmaxvalue>maxallowvalue) { - if (lastmaxvalue>=m_fsInfo.lDepth) { - lastittime=lastittime/2; - - }else { - lastittime=lastittime*(maxallowvalue*1.0/lastmaxvalue)*0.95; - } - - m_taginfolast.ITtimeChange[position]=true; - m_taginfolast.lastITTIME[position]=lastittime; - m_pFSCtrl->SetExposureTime(lastittime); - qDebug()<< "Set exposure time for position"<=60000) { - lastittime=60000; - } - m_taginfolast.ITtimeChange[position]=true; - m_taginfolast.lastITTIME[position]=lastittime; - m_pFSCtrl->SetExposureTime(lastittime); - qDebug()<< "Set exposure time for position"<SetExposureTime(lastittime); - qDebug()<< "Set exposure time for position"<GetExposureTime(lasttimeindev); - - m_pFSCtrl->SetExposureTime(m_taginfolast.lastITTIME[0]*0.5); - if (lasttimeindev!=m_taginfolast.lastITTIME[0]*0.5) { - Delay_MSec(lasttimeindev); - } - qDebug()<< "Set exposure time for position"<SetExposureTime(lastittime); + qDebug() << "Set exposure time for position" << position << " to " << lastittime; + return lastittime; + } + if (lastmaxvalue < minallowvalue) { + lastittime = lastittime * (minallowvalue * 1.0 / lastmaxvalue) * 1.05; + if (lastittime >= 60000) { + lastittime = 60000; + } + m_taginfolast.ITtimeChange[position] = true; + m_taginfolast.lastITTIME[position] = lastittime; + m_pFSCtrl->SetExposureTime(lastittime); + qDebug() << "Set exposure time for position" << position << " to " << lastittime; + return lastittime; + } + m_taginfolast.ITtimeChange[position] = false; + m_pFSCtrl->SetExposureTime(lastittime); + qDebug() << "Set exposure time for position" << position << " to " << lastittime; + return lastittime; + } + int lasttimeindev = 0; + m_pFSCtrl->GetExposureTime(lasttimeindev); + float scalofit = 1.5; + m_pFSCtrl->SetExposureTime(m_taginfolast.lastITTIME[0] * scalofit); + if (lasttimeindev != m_taginfolast.lastITTIME[0] * scalofit) { + Delay_MSec(lasttimeindev); + } + qDebug() << "Set exposure time for position" << position << " to " << m_taginfolast.lastITTIME[0] * scalofit; + return m_taginfolast.lastITTIME[0] * scalofit; } -int CAbstractFSController::TakeDarkFrame(int position) -{ - int shuttertime = 0; - m_pFSCtrl->GetExposureTime(shuttertime); - qDebug() << "Starting TakeDarkFrame" << " position ID:" << position<<" ITtime:"<GetExposureTime(shuttertime); + qDebug() << "Starting TakeDarkFrame" << " position ID:" << position << " ITtime:" << shuttertime << "\n"; + if (m_taginfolast.ITtimeChange[0]) { + m_taginfolast.LastDarkframe[position] = TakeOneFrame(); + } - m_vecDataFrameDark.push_back(m_taginfolast.LastDarkframe[position]); - + m_vecDataFrameDark.push_back(m_taginfolast.LastDarkframe[position]); - qDebug() << "Stop TakeDarkFrame" << " Thread ID:" << m_iThreadID; - //emit SignalAcqFinished(m_iThreadID, 1); - return 0; + + qDebug() << "Stop TakeDarkFrame" << " Thread ID:" << m_iThreadID; + //emit SignalAcqFinished(m_iThreadID, 1); + return 0; } int CAbstractFSController::ComputeMaxValue(DataFrame Data) { - ZZ_S32 *pData = Data.lData; - int number = 4096; - int maxvalue=0; - for (int i=0;imaxvalue) { - maxvalue=pData[i]; - } - } - return maxvalue; + ZZ_S32 *pData = Data.lData; + int number = 4096; + int maxvalue = 0; + for (int i = 0; i < number - 1; i++) { + if (pData[i] > maxvalue) { + maxvalue = pData[i]; + } + } + return maxvalue; - // if (number <= 10) { - // // 如果数据量小,直接排序计算 - // int sum = 0; - // for (int i = 0; i < number; i++) { - // sum += pData[i]; - // } - // return number > 0 ? sum / number : 0; - // } - // - // // 复制数据(或者直接操作原数组如果允许修改) - // std::vector temp(pData, pData + number); - // - // // 使用nth_element找到第10大的元素 - // std::nth_element(temp.begin(), temp.begin() + 9, temp.end(), std::greater()); - // - // // 计算前10个最大值的平均 - // int sum = 0; - // for (int i = 0; i < 10; i++) { - // sum += temp[i]; - // } - // - // return sum / 10; + // if (number <= 10) { + // // 如果数据量小,直接排序计算 + // int sum = 0; + // for (int i = 0; i < number; i++) { + // sum += pData[i]; + // } + // return number > 0 ? sum / number : 0; + // } + // + // // 复制数据(或者直接操作原数组如果允许修改) + // std::vector temp(pData, pData + number); + // + // // 使用nth_element找到第10大的元素 + // std::nth_element(temp.begin(), temp.begin() + 9, temp.end(), std::greater()); + // + // // 计算前10个最大值的平均 + // int sum = 0; + // for (int i = 0; i < 10; i++) { + // sum += temp[i]; + // } + // + // return sum / 10; - - - // int maxvalue[10]={0}; - // ZZ_S32 *pData=Data.lData; - // int number=4096; - // //获取pdata中最大的10个值 - // for (int i=0;imaxvalue[j]) { - // //插入到maxvalue中 - // for (int k=9;k>j;k--) { - // maxvalue[k]=maxvalue[k-1]; - // } - // maxvalue[j]=val; - // break; - // } - // } - // } - -} -int CAbstractFSController::TakeSignalFrame(int position) -{ - int shuttertime = 0; - m_pFSCtrl->GetExposureTime(shuttertime); - qDebug() << "Starting TakeSignal" << " position" << position<<" ITtime:"<=65535) { - m_vecDataFrameSignal.at(m_vecDataFrameSignal.size()-1).bIsValid=false; - } - qDebug() << "Stop TakeSignal" << " Thread ID:" << m_iThreadID; - qDebug()<< "Max 10 Average Value:" << m_taginfolast.LastMAXValue[position] << " Thread ID:" << m_iThreadID; - //emit SignalAcqFinished(m_iThreadID, 1); - return 0; + // int maxvalue[10]={0}; + // ZZ_S32 *pData=Data.lData; + // int number=4096; + // //获取pdata中最大的10个值 + // for (int i=0;imaxvalue[j]) { + // //插入到maxvalue中 + // for (int k=9;k>j;k--) { + // maxvalue[k]=maxvalue[k-1]; + // } + // maxvalue[j]=val; + // break; + // } + // } + // } } -DataFrame CAbstractFSController::TakeOneFrame() -{ - using namespace ZZ_MISCDEF::IRIS; - //int iExpTime = 0; - DataFrame dfTemp; -// m_pFSCtrl->GetExposureTime(iExpTime); -// dfTemp.usExposureTimeInMS = iExpTime; -// m_pFSCtrl->GetDeviceTemperature(dfTemp.fTemperature); +int CAbstractFSController::TakeSignalFrame(int position) { + int shuttertime = 0; + m_pFSCtrl->GetExposureTime(shuttertime); + qDebug() << "Starting TakeSignal" << " position" << position << " ITtime:" << shuttertime << "\n"; - if (m_fsInfo.ucDeviceModel== DeviceModel::ISIF) - { - float fTemp; - m_pFSCtrl->GetDeviceTemperature(fTemp); - dfTemp.fTemperature = fTemp; - } - else if(m_fsInfo.ucDeviceModel == DeviceModel::IS1) - { - dfTemp.fTemperature = 0; - } + m_vecDataFrameSignal.push_back(TakeOneFrame()); + // todo: compute max ten value 计算前10个值平均值 + m_taginfolast.LastMAXValue[position] = ComputeMaxValue(m_vecDataFrameSignal.at(m_vecDataFrameSignal.size() - 1)); + if (m_taginfolast.LastMAXValue[position] >= 65535) { + m_vecDataFrameSignal.at(m_vecDataFrameSignal.size() - 1).bIsValid = false; + } + qDebug() << "Stop TakeSignal" << " Thread ID:" << m_iThreadID; + qDebug() << "Max 10 Average Value:" << m_taginfolast.LastMAXValue[position] << " Thread ID:" << m_iThreadID; + //emit SignalAcqFinished(m_iThreadID, 1); + return 0; +} - int iRes = m_pFSCtrl->SingleShot(dfTemp); - if (iRes != 0) - { - qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID; - } +DataFrame CAbstractFSController::TakeOneFrame() { + using namespace ZZ_MISCDEF::IRIS; + //int iExpTime = 0; + DataFrame dfTemp; + // m_pFSCtrl->GetExposureTime(iExpTime); + // dfTemp.usExposureTimeInMS = iExpTime; + // m_pFSCtrl->GetDeviceTemperature(dfTemp.fTemperature); - 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;iGetDeviceTemperature(fTemp); + dfTemp.fTemperature = fTemp; + } else if (m_fsInfo.ucDeviceModel == DeviceModel::IS1) { + dfTemp.fTemperature = 0; + } + + int iRes = m_pFSCtrl->SingleShot(dfTemp); + if (iRes != 0) { + 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; i < m_daDeviceAttr.iPixels; i++) { + dfTemp.lData[i] = dfTemp.lData[i] / (m_vecNonLinearCalP[0] + + m_vecNonLinearCalP[1] * dfTemp.lData[i] + + m_vecNonLinearCalP[2] * pow(dfTemp.lData[i], 2) + + m_vecNonLinearCalP[3] * pow(dfTemp.lData[i], 3) + + m_vecNonLinearCalP[4] * pow(dfTemp.lData[i], 4) + + m_vecNonLinearCalP[5] * pow(dfTemp.lData[i], 5) + + m_vecNonLinearCalP[6] * pow(dfTemp.lData[i], 6) + + m_vecNonLinearCalP[7] * pow(dfTemp.lData[i], 7) + ); + } + } - return dfTemp; -// DataFrame dfTemp; -// int iRes = m_pFSCtrl->SingleShot(dfTemp); -// if (iRes != 0) -// { -// qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID; -// } -// -// return dfTemp; + return dfTemp; + // DataFrame dfTemp; + // int iRes = m_pFSCtrl->SingleShot(dfTemp); + // if (iRes != 0) + // { + // qDebug() << "Err. SingleShot" << " Thread ID:" << m_iThreadID; + // } + // + // return dfTemp; } - -int CAbstractFSController::SaveDataFile() -{ - return 0; +int CAbstractFSController::SaveDataFile() { + return 0; } -int CAbstractFSController::LoadQEProLinearCalibrationFile() -{ - m_vecNonLinearCalP.clear(); +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"); + QDir qdirPath(m_qstrCalFilePath); + if (!qdirPath.exists()) { + qDebug() << "Non-Linear Calibration Folder not exist" << " Thread ID:" << m_iThreadID; + return 1; + } + QString qstrFilePath; - QFile qfCalFile(qstrFilePath); - bool bRes = qfCalFile.open(QFile::ReadOnly); - if (!bRes) - { - qDebug() << "Non-Linear Calibration File open Failed" << " Thread ID:" << m_iThreadID; - return 2; - } + qstrFilePath = m_qstrCalFilePath + QString("/") + QString::fromStdString(m_fsInfo.strSN) + QString(".NLC"); - while (!qfCalFile.atEnd()) - { - QByteArray qbData = qfCalFile.readLine(); - qbData.remove(qbData.size()-1, 1); - m_vecNonLinearCalP.push_back(qbData.toDouble()); - //qDebug() << qbData; - } - qfCalFile.close(); + QFile qfCalFile(qstrFilePath); + bool bRes = qfCalFile.open(QFile::ReadOnly); + if (!bRes) { + qDebug() << "Non-Linear Calibration File open Failed" << " Thread ID:" << m_iThreadID; + return 2; + } - qDebug() <<"Non-Linear Calibration Params:"<< m_vecNonLinearCalP.size() << " Thread ID:" << m_iThreadID; + 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; + return 0; } -int CAbstractFSController::StartAcquisitionSignal(int position) -{ - // - qDebug() << "Starting acq Signal" << " Thread ID:" << m_iThreadID; +int CAbstractFSController::StartAcquisitionSignal(int position) { + // + qDebug() << "Starting acq Signal" << " Thread ID:" << m_iThreadID; -// DataFrame struDF; -// int iii; -// m_pFSCtrl->SetExposureTime(10000000); -// m_pFSCtrl->GetExposureTime(iii); -// m_pFSCtrl->SingleShot(struDF); + // DataFrame struDF; + // int iii; + // m_pFSCtrl->SetExposureTime(10000000); + // m_pFSCtrl->GetExposureTime(iii); + // m_pFSCtrl->SingleShot(struDF); - if (m_taginfolast.lastITTIME[position]==0) { - PerformAutoExposure(position); - }else { - ComputExposure(position); - } + if (m_taginfolast.lastITTIME[position] == 0) { + PerformAutoExposure(position); + } else { + ComputExposure(position); + } - TakeSignalFrame(position); + TakeSignalFrame(position); - qDebug() << "Stop acq Signal" << " Thread ID:" << m_iThreadID; - emit SignalAcqFinished_Signal(m_iThreadID, 1); - return 0; + qDebug() << "Stop acq Signal" << " Thread ID:" << m_iThreadID; + emit SignalAcqFinished_Signal(m_iThreadID, 1); + return 0; } -int CAbstractFSController::StartAcquisitionDark(int position) -{ - qDebug() << "Starting acq Dark" << " Thread ID:" << m_iThreadID; - TakeDarkFrame(position); - qDebug() << "Stop acq Dark"<< " Thread ID:" << m_iThreadID; - emit SignalAcqFinished_Dark(m_iThreadID, 1); +int CAbstractFSController::StartAcquisitionDark(int position) { + qDebug() << "Starting acq Dark" << " Thread ID:" << m_iThreadID; + TakeDarkFrame(position); + qDebug() << "Stop acq Dark" << " Thread ID:" << m_iThreadID; + emit SignalAcqFinished_Dark(m_iThreadID, 1); - return 0; + return 0; } -int CAbstractFSController::StopAcquisition() -{ - return 0; +int CAbstractFSController::StopAcquisition() { + return 0; } -int CAbstractFSController::ClearBuffer() -{ - m_vecDataFrameDark.clear(); - m_vecDataFrameSignal.clear(); - return 0; +int CAbstractFSController::ClearBuffer() { + m_vecDataFrameDark.clear(); + m_vecDataFrameSignal.clear(); + return 0; } -int CAbstractFSController::GetBuffer(std::vector &pvecDataFrameDark, std::vector &pvecDataFrameSignal) -{ - for (size_t i=0; i < m_vecDataFrameSignal.size(); i++) - { - pvecDataFrameSignal.push_back(m_vecDataFrameSignal[i]); - pvecDataFrameDark.push_back(m_vecDataFrameDark[i]); - } - return 0; +int CAbstractFSController::GetBuffer(std::vector &pvecDataFrameDark, + std::vector &pvecDataFrameSignal) { + for (size_t i = 0; i < m_vecDataFrameSignal.size(); i++) { + pvecDataFrameSignal.push_back(m_vecDataFrameSignal[i]); + pvecDataFrameDark.push_back(m_vecDataFrameDark[i]); + } + return 0; } - diff --git a/source/CaptureThread/MainDataGrabber.cpp b/source/CaptureThread/MainDataGrabber.cpp index 2adff42..d3e8d94 100644 --- a/source/CaptureThread/MainDataGrabber.cpp +++ b/source/CaptureThread/MainDataGrabber.cpp @@ -146,6 +146,13 @@ int CMainDataGrabber::InitLS() DSSOne.iChannelA = 1; DSSOne.iChannelB = 1; } + if (m_struLinearShutterContext.usGPIOChannelAPin!="null"&& m_struLinearShutterContext.usGPIOChannelBPin!="null") { + DSSOne.strChannelA = m_struLinearShutterContext.usGPIOChannelAPin; + DSSOne.strChannelB = m_struLinearShutterContext.usGPIOChannelBPin; + } + qDebug()<< "Debugging GPIO Init Finished. Channel A Pin:"<< QString::fromStdString(DSSOne.strChannelA) << " Channel B Pin:"<< QString::fromStdString(DSSOne.strChannelB); + + m_vecDSS.push_back(DSSOne); @@ -587,7 +594,7 @@ int CMainDataGrabber::GrabOnceFinished() qDebug() << qstrCMD_A; qDebug() << qstrCMD_B; - Delay_MSec(200); + Delay_MSec(200); } } else diff --git a/source/CaptureThread/Scheduler.cpp b/source/CaptureThread/Scheduler.cpp index 354e3fb..00d933c 100644 --- a/source/CaptureThread/Scheduler.cpp +++ b/source/CaptureThread/Scheduler.cpp @@ -85,8 +85,9 @@ int Scheduler::OnTimeCounter() m_iFlagIsOnRestart = 1; } emit SignalZeroHoldCurrent(); - system("gpio write 1 0");//�豸�ϵ� - qDebug() << "gpio write 1 0......"<(); @@ -32,6 +36,8 @@ { delete m_qsDeviceConfig; } + + m_qsDeviceConfig = new QSettings(m_qstrDeviceConfigFilePath, QSettings::IniFormat); ////FS m_struFSContext.ucDeviceNumber = m_qsDeviceConfig->value(QString("DEVICE INFO/TotalSpectrometer"),-1).toInt(); @@ -81,7 +87,19 @@ 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(); + m_struLSContext.usGPIOChannelAPin="null"; + m_struLSContext.usGPIOChannelBPin="null"; + if (m_qsDeviceConfig->value(QString("LINEAR SHUTTER/GPIO_ChannelA")).toString().toStdString()!=""&& m_qsDeviceConfig->value(QString("LINEAR SHUTTER/GPIO_ChannelB")).toString().toStdString()!="") { + m_struLSContext.usGPIOChannelAPin = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/GPIO_ChannelA")).toString().toStdString(); + m_struLSContext.usGPIOChannelBPin = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/GPIO_ChannelB")).toString().toStdString(); + }else { + m_qsDeviceConfig->setValue("LINEAR SHUTTER/GPIO_ChannelA",QString(QString::number(m_struLSContext.usCmdID).toStdString()[0]) ); + m_qsDeviceConfig->setValue("LINEAR SHUTTER/GPIO_ChannelB",QString(QString::number(m_struLSContext.usCmdID).toStdString()[1]) ); + //保存更改 + m_qsDeviceConfig->sync(); + + } //////////////////////////////////////////////////////////////////////////humiture m_struHumitureDeviceInfo.qstrInterfaceName = m_qsDeviceConfig->value(QString("HUMITURE/Port")).toString(); //////////////////////////////////////////////////////////////////////////load json settings