diff --git a/HPPA.sln b/HPPA.sln index 398ac97..7f6148e 100644 --- a/HPPA.sln +++ b/HPPA.sln @@ -10,6 +10,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HPPA", "HPPA\HPPA.vcxproj", EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vincecontrol", "vincecontrol\vincecontrol.vcxproj", "{B12702AD-ABFB-343A-A199-8E24837244A3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IrisMultiMotorController", "IrisMultiMotorController\IrisMultiMotorController\IrisMultiMotorController.vcxproj", "{2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -34,6 +36,14 @@ Global {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x64.Build.0 = Release|x64 {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x86.ActiveCfg = Release|Win32 {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x86.Build.0 = Release|Win32 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Debug|x64.ActiveCfg = Debug|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Debug|x64.Build.0 = Debug|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Debug|x86.ActiveCfg = Debug|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Debug|x86.Build.0 = Debug|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Release|x64.ActiveCfg = Release|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Release|x64.Build.0 = Release|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Release|x86.ActiveCfg = Release|x64 + {2E792AA6-1BCB-4CDA-BE01-4D455EC5C473}.Release|x86.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/HPPA/Corning410Imager.cpp b/HPPA/Corning410Imager.cpp index 9c50902..27adf4f 100644 --- a/HPPA/Corning410Imager.cpp +++ b/HPPA/Corning410Imager.cpp @@ -32,7 +32,7 @@ double Corning410Imager::getFramerate() double Corning410Imager::getIntegrationTime() { - return m_imager.get_integration_time(); + return m_imager.get_integration_time() / 1000; } double Corning410Imager::getGain() @@ -53,7 +53,7 @@ void Corning410Imager::setFramerate(const double frames_per_second) void Corning410Imager::setIntegrationTime(const double milliseconds) { - m_imager.set_integration_time(milliseconds); + m_imager.set_integration_time(milliseconds * 1000); } int Corning410Imager::getStartBand() diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 016163a..90741aa 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -299,6 +299,17 @@ HPPA::HPPA(QWidget *parent) tabifyDockWidget(dock_adt, dock_rac); mPanelMenu->addAction(dock_rac->toggleViewAction()); + //一轴马达控制 + omc = new OneMotorControl(); + connect(omc, SIGNAL(startRecordLineSignal(int)), this, SLOT(recordHyperSpecImg(int))); + + QDockWidget* dock_omc = new QDockWidget(QString::fromLocal8Bit("单轴控制"), this); + dock_omc->setObjectName("mDockOneMotorControl"); + dock_omc->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + dock_omc->setWidget(omc); + tabifyDockWidget(dock_rac, dock_omc); + mPanelMenu->addAction(dock_omc->toggleViewAction()); + createActionGroups(); connect(mImagerGroup, &QActionGroup::triggered, this, &HPPA::selectingImager); @@ -317,6 +328,19 @@ HPPA::HPPA(QWidget *parent) } } +void HPPA::recordHyperSpecImg(int status) +{ + if (status == 1) + { + emit StartRecordSignal();//发射开始采集信号 + } + else if (status == 0) + { + m_Imager->setRecordControlState(false);//光谱仪停止采集 + } +} + + void HPPA::recordFromRobotArm(int fileCounter) { //qDebug() << "recordFromRobotArm" << fileCounter; @@ -393,6 +417,7 @@ void HPPA::createMoveplatformActionGroup() moveplatformActionGroup->addAction(ui.mAction_is_no_motor); moveplatformActionGroup->addAction(ui.mAction_2AxisMotor); moveplatformActionGroup->addAction(ui.mAction_RobotArm); + moveplatformActionGroup->addAction(ui.mAction_1AxisMotor); // 读取上次选择的结果 QSettings settings; @@ -411,6 +436,10 @@ void HPPA::createMoveplatformActionGroup() { ui.mAction_RobotArm->setChecked(true); } + else if (lastSelectedAction == "mAction_1AxisMotor") + { + ui.mAction_1AxisMotor->setChecked(true); + } } void HPPA::selectingMoveplatform(QAction* selectedAction) @@ -497,27 +526,35 @@ void HPPA::onStartRecordStep1() string directory = fileOperation->getDirectoryFromString(); //string imgPath = directory + "\\tmp_image"; string imgPath = directory + "\\" + m_FilenameLineEdit->text().toStdString(); - int x = _access(imgPath.c_str(), 0); - if (!x)//如果文件存在就执行此if的代码 + + m_RecordState += 1; + if (m_RecordState % 2 == 1) { - enum QMessageBox::StandardButton response = QMessageBox::question(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("文件存在!是否覆盖?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);; - if (response == QMessageBox::Yes)// + m_RecordState -= 1; + + string tmp = imgPath + "_" + std::to_string(1) + ".bil"; + int x = _access(tmp.c_str(), 0); + if (!x)//如果文件存在就执行此if的代码 { - //std::cout << "覆盖" << std::endl; - } - else - { - //std::cout << "不覆盖" << std::endl; - //m_RecordState -= 1;//不覆盖的话就需要还原这个参数,并停止采集 - return; + enum QMessageBox::StandardButton response = QMessageBox::question(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("文件存在!是否覆盖?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);; + if (response == QMessageBox::Yes)// + { + //std::cout << "覆盖" << std::endl; + } + else + { + //std::cout << "不覆盖" << std::endl; + //m_RecordState -= 1;//不覆盖的话就需要还原这个参数,并停止采集 + return; + } } } - - m_Imager->setFrameNumber(this->frame_number->text().toInt()); - m_Imager->setFileName2Save(imgPath); + else + { + m_RecordState -= 1; + } QString checkedName = checked->objectName(); - if (checkedName == "mAction_is_no_motor") { m_RecordState += 1; @@ -528,7 +565,9 @@ void HPPA::onStartRecordStep1() onCreateTab(0); m_numberOfRecording = 0; - + + m_Imager->setFileName2Save(imgPath); + m_Imager->setFrameNumber(this->frame_number->text().toInt()); emit StartRecordSignal();//发射开始采集信号 ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); @@ -537,6 +576,36 @@ void HPPA::onStartRecordStep1() else { m_Imager->setRecordControlState(false);//光谱仪停止采集 + m_RecordState -= 1; + + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); + ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); + } + return; + } + else if (checkedName == "mAction_1AxisMotor") + { + m_RecordState += 1; + + if (m_RecordState % 2 == 1) + { + ui.ImageViewerTabWidget->clear(); + + onCreateTab(0); + m_numberOfRecording = 0; + + ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); + ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); + + //应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号) + m_Imager->setFileName2Save(imgPath); + m_Imager->setFrameNumber(this->frame_number->text().toInt()); + omc->moveMotorAndRecordHyperSpecImg(500); + } + else + { + omc->moveMotor2StartPosAndStopRecord(); + m_RecordState -= 1; ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); @@ -586,6 +655,8 @@ void HPPA::onStartRecordStep1() string x_location = removeFileExtension(imgPath) + "x_location.pos"; m_hTimesFile = fopen(x_location.c_str(), "w+"); + m_Imager->setFileName2Save(imgPath); + //开始循环 m_ForLoopControl->setLoopCount(m_pathPlan->getRecordLineTableWidget()->rowCount());//为循环控制线程设置循环次数 emit StartLoopSignal(); @@ -618,6 +689,8 @@ void HPPA::onStartRecordStep1() else if (checkedName == "mAction_RobotArm") { //先判断是否选择了任务,执行函数RobotArmControl::executeTask,修复界面显示bug + m_Imager->setFileName2Save(imgPath); + m_Imager->setFrameNumber(this->frame_number->text().toInt()); rac->executeTaskWithHyperImager(); return; @@ -1796,7 +1869,7 @@ void HPPA::onconnect() m_Imager->connect_imager(frame_number->text().toInt()); m_Imager->setFileName2Save(m_FilenameLineEdit->text().toStdString()); - connect(m_Imager, SIGNAL(PlotSignal()), this, SLOT(onPlotHyperspectralImageRgbImage())); + connect(m_Imager, SIGNAL(PlotSignal(int)), this, SLOT(onPlotHyperspectralImageRgbImage(int))); connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberMeet())); connect(m_Imager, SIGNAL(RecordFinishedSignal_WhenFrameNumberNotMeet()), this, SLOT(onRecordFinishedSignal_WhenFrameNumberNotMeet())); connect(m_Imager, SIGNAL(SpectralSignal(int)), this, SLOT(PlotSpectral(int))); @@ -2035,8 +2108,16 @@ void HPPA::recordWhiteFinish() } } -void HPPA::onPlotHyperspectralImageRgbImage() +void HPPA::onPlotHyperspectralImageRgbImage(int number) { + //使用机械臂采集时,会在停止采集后的瞬间又开始采集,会导致上次采集最后发射的信号调用此槽函数报错 + QAction* checked = moveplatformActionGroup->checkedAction(); + QString checkedName = checked->objectName(); + if (number == -1 && checkedName == "mAction_RobotArm") + { + return; + } + //return; //获取绘图控件 QWidget* currentWidget = ui.ImageViewerTabWidget->widget(m_numberOfRecording); @@ -2054,10 +2135,12 @@ void HPPA::onPlotHyperspectralImageRgbImage() //20241225 //保存拉伸后的rgb - FileOperation* fileOperation = new FileOperation(); - string directory = fileOperation->getDirectoryOfExe(); - string rgbFilePathNoStrech = directory + "\\tmp_image_no_strech2.png";//拉伸图片 - cv::imwrite(rgbFilePathNoStrech, rgbImageStretched); + //FileOperation* fileOperation = new FileOperation(); + //string directory = fileOperation->getDirectoryOfExe(); + //string rgbFilePathNoStrech = directory + "\\tmp_image_no_strech.png";//未拉伸图片 + //string rgbFilePathStrech = directory + "\\tmp_image_strech.png";//拉伸图片 + //cv::imwrite(rgbFilePathNoStrech, rgbImage); + //cv::imwrite(rgbFilePathStrech, rgbImageStretched); //创建需要显示的图像--qt版本 //QRect CuttedRect = m_Imager->getRgbImage()->m_QRgbImage->rect();//先获取image整个rect @@ -2078,7 +2161,7 @@ void HPPA::PlotSpectral(int state) ImageProcessor imageProcessor; //cv::Mat grayImage(*m_Imager->getRgbImage()->m_matFocusGrayImage, cv::Range::all(), cv::Range::all());//2022.3.18重构的 - cv::Mat grayImage(*m_Imager->getMatFocusGrayImage(), cv::Range::all(), cv::Range::all()); + //cv::Mat grayImage(*m_Imager->getMatFocusGrayImage(), cv::Range::all(), cv::Range::all()); //currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//绘制图像 currentImageViewer[0]->SetImage(&QPixmap::fromImage(m_Imager->getQImageFocusGrayImage()));//绘制图像 @@ -2091,7 +2174,8 @@ void HPPA::PlotSpectral(int state) { //malloc申请的内存用法1:可以当做数组用 //series->append(i, m_Imager->buffer[i + 5 * 900]); - series->append(i, m_Imager->buffer[900 * 150 + i]); + //series->append(i, m_Imager->buffer[900 * 150 + i]); + series->append(i, m_Imager->buffer[1368 * 150 + i]); } QChart *chart = new QChart(); @@ -2156,16 +2240,20 @@ void HPPA::onRecordFinishedSignal_WhenFrameNumberMeet() ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); m_RecordState++;//当自动停止采集 + + QAction* checked = moveplatformActionGroup->checkedAction(); + QString checkedName = checked->objectName(); + if (checkedName == "mAction_1AxisMotor") + { + omc->moveMotor2StartPosAndStopRecord(); + } + } void HPPA::onRecordFinishedSignal_WhenFrameNumberNotMeet() { QAction* checked = moveplatformActionGroup->checkedAction(); - QString checkedName; - if (checked) - { - checkedName = checked->objectName(); - } + QString checkedName = checked->objectName(); if (checkedName == "mAction_RobotArm")//机械臂会在停止采集后的瞬间又开始采集,导致ui.action_start_recording显示异常 { @@ -2177,6 +2265,8 @@ void HPPA::onRecordFinishedSignal_WhenFrameNumberNotMeet() ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); + + m_RecordState++; } ForLoopControl::ForLoopControl() diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index 92b2715..8cfa613 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -34,6 +34,7 @@ #include "PowerControl.h" #include "PathPlan.h" #include "RobotArmControl.h" +#include "OneMotorControl.h" #include "hppaConfigFile.h" #include "path_tc.h" @@ -244,6 +245,8 @@ private: void createMoveplatformActionGroup(); void selectingMoveplatform(QAction* selectedAction); RobotArmControl* rac; + + OneMotorControl* omc; PathPlan* m_pathPlan; @@ -251,7 +254,7 @@ private: FILE* m_hTimesFile; public Q_SLOTS: - void onPlotHyperspectralImageRgbImage(); + void onPlotHyperspectralImageRgbImage(int number); void PlotSpectral(int state); void onRecordFinishedSignal_WhenFrameNumberMeet(); void onRecordFinishedSignal_WhenFrameNumberNotMeet(); @@ -341,6 +344,7 @@ public Q_SLOTS: void requestFinished(QNetworkReply* reply); void recordFromRobotArm(int fileCounter); + void recordHyperSpecImg(int status); signals: void StartFocusSignal(); diff --git a/HPPA/HPPA.ui b/HPPA/HPPA.ui index 9e1c128..7487b57 100644 --- a/HPPA/HPPA.ui +++ b/HPPA/HPPA.ui @@ -167,7 +167,9 @@ color:white; 鎵弿骞冲彴 + + @@ -1585,6 +1587,14 @@ QDockWidget::title { 鏈烘鑷 + + + true + + + 1 杞寸嚎鎬ч┈杈 + + diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index be8fbfd..dbf4e7e 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -55,16 +55,16 @@ - D:\cpp_library\gdal2.2.3_vs2017\include;C:\Program Files\ResononAPI\include;D:\cpp_library\opencv3.4.11\opencv\build\include;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv2;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PCOMM\Include;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PortControl;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL;D:\cpp_project_vs2022\HPPA\HPPA;D:\cpp_library\libconfig-1.7.3\lib;D:\cpp_project_vs2022\HPPA\vincecontrol;D:\cpp_library\vincecontrol_vs2017;C:\XIMEA\API\xiAPI;$(IncludePath) - D:\cpp_library\opencv3.4.11\opencv\build\x64\vc15\lib;D:\cpp_library\gdal2.2.3_vs2017\lib;C:\Program Files\ResononAPI\lib64;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\x64\Debug;D:\cpp_library\libconfig-1.7.3\build\x64;D:\cpp_project_vs2022\HPPA\x64\Debug;C:\XIMEA\API\xiAPI;$(LibraryPath) + D:\cpp_library\gdal2.2.3_vs2017\include;C:\Program Files\ResononAPI\include;D:\cpp_library\opencv3.4.11\opencv\build\include;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv2;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PCOMM\Include;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PortControl;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL;D:\cpp_project_vs2022\HPPA\HPPA;D:\cpp_library\libconfig-1.7.3\lib;D:\cpp_project_vs2022\HPPA\vincecontrol;D:\cpp_library\vincecontrol_vs2017;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\HPPA\IrisMultiMotorController\IrisMultiMotorController;$(IncludePath) + D:\cpp_library\opencv3.4.11\opencv\build\x64\vc15\lib;D:\cpp_library\gdal2.2.3_vs2017\lib;C:\Program Files\ResononAPI\lib64;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\x64\Debug;D:\cpp_library\libconfig-1.7.3\build\x64;D:\cpp_project_vs2022\HPPA\x64\Debug;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\HPPA\IrisMultiMotorController\x64\Debug;$(LibraryPath) - D:\cpp_library\gdal2.2.3_vs2017\include;C:\Program Files\ResononAPI\include;D:\cpp_library\opencv3.4.11\opencv\build\include;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv2;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PCOMM\Include;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PortControl;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL;D:\cpp_project_vs2022\HPPA\HPPA;D:\cpp_library\libconfig-1.7.3\lib;D:\cpp_project_vs2022\HPPA\vincecontrol;$(IncludePath) - D:\cpp_library\opencv3.4.11\opencv\build\x64\vc15\lib;D:\cpp_library\vincecontrol_vs2017_release;D:\cpp_library\gdal2.2.3_vs2017\lib;C:\Program Files\ResononAPI\lib64;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\x64\Release;D:\cpp_library\libconfig-1.7.3\build\x64;$(LibraryPath) + D:\cpp_library\gdal2.2.3_vs2017\include;C:\Program Files\ResononAPI\include;D:\cpp_library\opencv3.4.11\opencv\build\include;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv;D:\cpp_library\opencv3.4.11\opencv\build\include\opencv2;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PCOMM\Include;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL\SDKs\PortControl;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\AutoFocus_InspireLinearMotor_DLL;D:\cpp_project_vs2022\HPPA\HPPA;D:\cpp_library\libconfig-1.7.3\lib;D:\cpp_project_vs2022\HPPA\vincecontrol;C:\XIMEA\API\xiAPI;D:\cpp_project_vs2022\IrisMultiMotorController\IrisMultiMotorController;$(IncludePath) + D:\cpp_library\opencv3.4.11\opencv\build\x64\vc15\lib;D:\cpp_library\vincecontrol_vs2017_release;D:\cpp_library\gdal2.2.3_vs2017\lib;C:\Program Files\ResononAPI\lib64;D:\cpp_project_vs2022\AutoFocus_InspireLinearMotor_DLL\x64\Release;D:\cpp_library\libconfig-1.7.3\build\x64;D:\cpp_project_vs2022\IrisMultiMotorController\x64\Release;C:\XIMEA\API\xiAPI;$(LibraryPath) - opencv_world3411.lib;opencv_world3411d.lib;gdal_i.lib;resonon-basler.lib;AutoFocus_InspireLinearMotor_DLL.lib;libconfig++d.lib;vincecontrol.lib;resonon-allied.lib;xiapi64.lib;%(AdditionalDependencies) + opencv_world3411.lib;opencv_world3411d.lib;gdal_i.lib;resonon-basler.lib;AutoFocus_InspireLinearMotor_DLL.lib;libconfig++d.lib;vincecontrol.lib;resonon-allied.lib;xiapi64.lib;IrisMultiMotorController.lib;%(AdditionalDependencies) D:\cpp_project_vs2022\HPPA\x64\Debug;%(AdditionalLibraryDirectories) @@ -73,7 +73,7 @@ - opencv_world3411.lib;vincecontrol.lib;gdal_i.lib;resonon-basler.lib;resonon-allied.lib;AutoFocus_InspireLinearMotor_DLL.lib;libconfig++.lib;%(AdditionalDependencies) + opencv_world3411.lib;vincecontrol.lib;gdal_i.lib;resonon-basler.lib;resonon-allied.lib;AutoFocus_InspireLinearMotor_DLL.lib;libconfig++.lib;xiapi64.lib;IrisMultiMotorController.lib;%(AdditionalDependencies) D:\cpp_project_vs2022\HPPA\x64\Release;%(AdditionalLibraryDirectories) @@ -99,7 +99,7 @@ MultiThreadedDLL - Windows + Console false @@ -111,6 +111,7 @@ + @@ -141,6 +142,7 @@ + @@ -162,6 +164,7 @@ + diff --git a/HPPA/HPPA.vcxproj.filters b/HPPA/HPPA.vcxproj.filters index af89eb9..18c1524 100644 --- a/HPPA/HPPA.vcxproj.filters +++ b/HPPA/HPPA.vcxproj.filters @@ -124,6 +124,9 @@ Source Files + + Source Files + @@ -177,6 +180,9 @@ Header Files + + Header Files + @@ -229,6 +235,9 @@ Form Files + + Form Files + diff --git a/HPPA/ImagerOperationBase.cpp b/HPPA/ImagerOperationBase.cpp index f36ced7..2385968 100644 --- a/HPPA/ImagerOperationBase.cpp +++ b/HPPA/ImagerOperationBase.cpp @@ -54,9 +54,9 @@ double ImagerOperationBase::auto_exposure() while (true) { getFrame(buffer); - if (GetMaxValue(buffer, m_FrameSize) >= 4095) + if (GetMaxValue(buffer, m_FrameSize) >= 4094) { - setIntegrationTime(getIntegrationTime() * 0.8); + setIntegrationTime(getIntegrationTime() * 0.95); std::cout << "自动曝光-----------" << std::endl; } else @@ -270,7 +270,7 @@ void ImagerOperationBase::start_record() //每隔1s进行一次界面图形绘制 if (m_iFrameCounter % (int)getFramerate() == 0) { - emit PlotSignal(); + emit PlotSignal(m_iFrameCounter); } if (m_iFrameCounter >= m_iFrameNumber) @@ -287,7 +287,7 @@ void ImagerOperationBase::start_record() //在最后一次画图前需要进行一次拉伸 //m_RgbImage - //emit PlotSignal();//(1)采集完成后进行一次画图,以防采集帧数不是帧率的倍数时,画图不全(2)使用机械臂采集时,会在停止采集后的瞬间开始采集,会导致上次采集最后发射的此信号调用的槽函数报错,为了兼容,注释掉 + emit PlotSignal(-1);//(1)采集完成后进行一次画图,以防采集帧数不是帧率的倍数时,画图不全(2)使用机械臂采集时,会在停止采集后的瞬间开始采集,会导致上次采集最后发射的此信号调用的槽函数报错,为了兼容,注释掉 if (m_iFrameCounter >= m_iFrameNumber) { diff --git a/HPPA/ImagerOperationBase.h b/HPPA/ImagerOperationBase.h index b96fb46..30d57fb 100644 --- a/HPPA/ImagerOperationBase.h +++ b/HPPA/ImagerOperationBase.h @@ -94,7 +94,7 @@ public slots: virtual void record_dark(); virtual void record_white(); signals: - void PlotSignal();//绘制影像信号 + void PlotSignal(int);//绘制影像信号,-1:此次采集的最后一次绘制 void RecordFinishedSignal_WhenFrameNumberMeet();//采集完成信号:需要采集的总帧数(m_iFrameNumber)采集完成 void RecordFinishedSignal_WhenFrameNumberNotMeet();//采集完成信号:需要采集的总帧数(m_iFrameNumber)没有采集完成,中途停止采集 void SpectralSignal(int);//发射1代表正在调焦,绘制光谱,发射0表示调焦完成; diff --git a/HPPA/OneMotorControl.cpp b/HPPA/OneMotorControl.cpp new file mode 100644 index 0000000..5923c55 --- /dev/null +++ b/HPPA/OneMotorControl.cpp @@ -0,0 +1,133 @@ +#include "OneMotorControl.h" + +OneMotorControl::OneMotorControl(QWidget* parent) : QDialog(parent) +{ + ui.setupUi(this); + + connect(this->ui.connect_btn, SIGNAL(pressed()), this, SLOT(onConnectMotor())); + +} + +OneMotorControl::~OneMotorControl() +{ + m_motorThread.quit(); + m_motorThread.wait(); +} + +void OneMotorControl::onConnectMotor() +{ + try + { + FileOperation* fileOperation = new FileOperation(); + string directory = fileOperation->getDirectoryOfExe(); + QString configFilePath = QString::fromStdString(directory) + "\\oneMotorConfigFile.cfg"; + + m_multiAxisController = new IrisMultiMotorController(configFilePath); + } + catch (std::exception const& e) + { + QMessageBox msgBox; + msgBox.setText(QString::fromLocal8Bit("请连接马达!")); + msgBox.exec(); + } + + m_multiAxisController->moveToThread(&m_motorThread); + m_motorThread.start(); + + connect(this->ui.right_btn, SIGNAL(pressed()), this, SLOT(onxMotorRight())); + connect(this->ui.right_btn, SIGNAL(released()), this, SLOT(onxMotorStop())); + connect(this->ui.left_btn, SIGNAL(pressed()), this, SLOT(onxMotorLeft())); + connect(this->ui.left_btn, SIGNAL(released()), this, SLOT(onxMotorStop())); + + connect(this->ui.move2loc_pushButton, SIGNAL(pressed()), this, SLOT(onxMove2Loc())); + + connect(m_multiAxisController, SIGNAL(broadcastLocationSignal(std::vector)), this, SLOT(display_x_loc(std::vector))); + + connect(this, SIGNAL(moveSignal(int, bool, double, int)), m_multiAxisController, SLOT(move(int, bool, double, int))); + connect(this, SIGNAL(move2LocSignal(int, double, double, int)), m_multiAxisController, SLOT(moveTo(int, double, double, int))); + connect(this, SIGNAL(stopSignal(int)), m_multiAxisController, SLOT(stop(int))); + + connect(this->ui.zero_start_btn, SIGNAL(released()), this, SLOT(zeroStart())); + connect(this, SIGNAL(zeroStartSignal(int)), m_multiAxisController, SLOT(zeroStart(int))); + + connect(this->ui.rangeMeasurement_btn, SIGNAL(pressed()), this, SLOT(onx_rangeMeasurement())); + connect(this, SIGNAL(rangeMeasurement(int, double, int)), m_multiAxisController, SLOT(rangeMeasurement(int, double, int))); + + connect(this, SIGNAL(recordHyperSpecImgOneMotorSignal(int, double, double)), m_multiAxisController, SLOT(recordHyperSpecImgOneMotor(int, double, double))); + + connect(m_multiAxisController, SIGNAL(startRecordLineSignal(int)), this, SIGNAL(startRecordLineSignal(int))); + + connect(this, SIGNAL(testConnectivitySignal(int, int)), m_multiAxisController, SLOT(testConnectivity(int, int))); + connect(m_multiAxisController, SIGNAL(broadcastConnectivity(std::vector)), this, SLOT(display_motors_connectivity(std::vector))); + emit testConnectivitySignal(0, 1000); +} + +void OneMotorControl::display_x_loc(std::vector loc) +{ + double tmp = round(loc[0] * 100) / 100; + this->ui.realTimeLoc_lineEdit->setText(QString::number(tmp)); +} + +void OneMotorControl::display_motors_connectivity(std::vector connectivity) +{ + //std::cout << "-----------------------------------"<ui.motor_state_label->setStyleSheet("QLabel{background-color:rgb(0,255,0);}"); + } + else + { + this->ui.motor_state_label->setStyleSheet("QLabel{background-color:rgb(255,0,0);}"); + } +} + +void OneMotorControl::zeroStart() +{ + zeroStartSignal(0); +} + +void OneMotorControl::onx_rangeMeasurement() +{ + double s0 = ui.speed_lineEdit->text().toDouble(); + emit rangeMeasurement(0, s0, 1000); +} + +void OneMotorControl::onxMove2Loc() +{ + double s = ui.speed_lineEdit->text().toDouble(); + double l = ui.move2loc_lineEdit->text().toDouble(); + + emit move2LocSignal(0, l, s, 1000); +} + +void OneMotorControl::onxMotorRight() +{ + double s = ui.speed_lineEdit->text().toDouble(); + + emit moveSignal(0, false, s, 1000); +} + +void OneMotorControl::onxMotorLeft() +{ + double s = ui.speed_lineEdit->text().toDouble(); + + emit moveSignal(0, true, s, 1000); +} + +void OneMotorControl::onxMotorStop() +{ + emit stopSignal(0); +} + +void OneMotorControl::moveMotorAndRecordHyperSpecImg(int updateIntervalMs) +{ + double runSpeed = ui.speed_lineEdit->text().toDouble(); + double returnSpeed = ui.return_speed_lineEdit->text().toDouble(); + + emit recordHyperSpecImgOneMotorSignal(updateIntervalMs, runSpeed, returnSpeed); +} + +void OneMotorControl::moveMotor2StartPosAndStopRecord() +{ + m_multiAxisController->cancelRecord(); +} diff --git a/HPPA/OneMotorControl.h b/HPPA/OneMotorControl.h new file mode 100644 index 0000000..c646e6a --- /dev/null +++ b/HPPA/OneMotorControl.h @@ -0,0 +1,53 @@ +#pragma once +#include +#include + +#include "ui_oneMotorControl.h" + +#include "IrisMultiMotorController.h" +#include "fileOperation.h" + +class OneMotorControl : public QDialog +{ + Q_OBJECT + +public: + OneMotorControl(QWidget* parent = nullptr); + ~OneMotorControl(); + + void moveMotorAndRecordHyperSpecImg(int updateIntervalMs); + void moveMotor2StartPosAndStopRecord(); + + +public Q_SLOTS: + void onConnectMotor(); + + void display_x_loc(std::vector loc); + void display_motors_connectivity(std::vector connectivity); + void onxMove2Loc(); + void zeroStart(); + void onx_rangeMeasurement(); + + void onxMotorRight(); + void onxMotorLeft(); + void onxMotorStop(); + +signals: + void moveSignal(int, bool, double, int); + void move2LocSignal(int, double, double, int); + void move2LocSignal(const std::vector, const std::vector, int); + void stopSignal(int); + + void rangeMeasurement(int, double, int); + void zeroStartSignal(int); + void testConnectivitySignal(int, int); + + void recordHyperSpecImgOneMotorSignal(int updateIntervalMs, double runSpeed, double returnSpeed); + + void startRecordLineSignal(int); +private: + Ui::OneMotorControl_UI ui; + + QThread m_motorThread; + IrisMultiMotorController* m_multiAxisController; +}; diff --git a/HPPA/ResononNirImager.cpp b/HPPA/ResononNirImager.cpp index a302f17..646ced1 100644 --- a/HPPA/ResononNirImager.cpp +++ b/HPPA/ResononNirImager.cpp @@ -353,7 +353,7 @@ void ResononNirImager::start_record() //每隔1s进行一次界面图形绘制 if (m_iFrameCounter % (int)getFramerate() == 0) { - emit PlotSignal(); + emit PlotSignal(m_iFrameCounter); } if (m_iFrameCounter >= m_iFrameNumber) @@ -371,7 +371,7 @@ void ResononNirImager::start_record() //在最后一次画图前需要进行一次拉伸 //m_RgbImage - emit PlotSignal();//采集完成后进行一次画图,以防采集帧数不是帧率的倍数时,画图不全 + emit PlotSignal(-1);//采集完成后进行一次画图,以防采集帧数不是帧率的倍数时,画图不全 if (m_iFrameCounter >= m_iFrameNumber) { diff --git a/HPPA/about.ui b/HPPA/about.ui index 2526256..0608e09 100644 --- a/HPPA/about.ui +++ b/HPPA/about.ui @@ -70,7 +70,7 @@ - 鐗堟湰锛1.8.8 + 鐗堟湰锛1.9.0 diff --git a/HPPA/fileOperation.h b/HPPA/fileOperation.h index 170524a..784d23d 100644 --- a/HPPA/fileOperation.h +++ b/HPPA/fileOperation.h @@ -17,7 +17,7 @@ public: ~FileOperation(); string getDirectoryOfExe();//getDirectoryOfExe - string getDirectoryFromString(string directory="C:/HPPA_image"); + string getDirectoryFromString(string directory="C:\\HPPA_image"); diff --git a/HPPA/image2display.cpp b/HPPA/image2display.cpp index cc94333..3c5cb0c 100644 --- a/HPPA/image2display.cpp +++ b/HPPA/image2display.cpp @@ -172,7 +172,7 @@ void CImage::FillFocusGrayQImage(unsigned short * datacube) } } - m_qimageFocusGrayImage->save("D:/delete/2222222222/test.bmp"); + //m_qimageFocusGrayImage->save("D:/delete/2222222222/test.bmp"); diff --git a/HPPA/oneMotorControl.ui b/HPPA/oneMotorControl.ui new file mode 100644 index 0000000..44e3fa0 --- /dev/null +++ b/HPPA/oneMotorControl.ui @@ -0,0 +1,285 @@ + + + OneMotorControl_UI + + + + 0 + 0 + 544 + 346 + + + + 涓杞撮┈杈炬帶鍒 + + + + + + + + + + 瀹炴椂浣嶇疆 + + + Qt::AlignCenter + + + + + + + 杩愯閫熷害 + + + Qt::AlignCenter + + + + + + + 杩斿洖閫熷害 + + + Qt::AlignCenter + + + + + + + + + + Qt::AlignCenter + + + + + + + + + + + 0 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + background-color: rgb(255, 255, 255); + + + 0.1 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + background-color: rgb(255, 255, 255); + + + 2 + + + Qt::AlignCenter + + + + + + + 0 + + + Qt::AlignCenter + + + + + + + + + + + + 0 + 0 + + + + 杩炴帴 + + + + + + + + 0 + 0 + + + + 褰掗浂 + + + + + + + + 0 + 0 + + + + 閲忕▼娴嬮噺 + + + + + + + 绉诲姩鑷 + + + + + + + + + + + Qt::Horizontal + + + + 161 + 20 + + + + + + + + + + + 0 + 0 + + + + 鈫0 + + + + + + + + 0 + 0 + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 椹揪鐘舵 + + + + + + + + + Qt::Vertical + + + + 20 + 191 + + + + + + + + +