diff --git a/HPPA/OneMotorControl.cpp b/HPPA/OneMotorControl.cpp index 5923c55..8002e2a 100644 --- a/HPPA/OneMotorControl.cpp +++ b/HPPA/OneMotorControl.cpp @@ -32,7 +32,7 @@ void OneMotorControl::onConnectMotor() } m_multiAxisController->moveToThread(&m_motorThread); - m_motorThread.start(); + connect(&m_motorThread, SIGNAL(finished()), m_multiAxisController, SLOT(deleteLater())); connect(this->ui.right_btn, SIGNAL(pressed()), this, SLOT(onxMotorRight())); connect(this->ui.right_btn, SIGNAL(released()), this, SLOT(onxMotorStop())); @@ -59,6 +59,8 @@ void OneMotorControl::onConnectMotor() 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))); + + m_motorThread.start(); emit testConnectivitySignal(0, 1000); } diff --git a/HPPA/focusWindow.cpp b/HPPA/focusWindow.cpp index 8afbfda..888f318 100644 --- a/HPPA/focusWindow.cpp +++ b/HPPA/focusWindow.cpp @@ -118,6 +118,7 @@ void focusWindow::onConnectMotor() connect(this, SIGNAL(zeroStartSignal(int)), m_multiAxisController, SLOT(zeroStart(int))); connect(this, SIGNAL(move2MaxLocSignal(int, double, int)), m_multiAxisController, SLOT(moveToMax(int, double, int))); connect(m_multiAxisController, SIGNAL(broadcastLocationSignal(std::vector)), this, SLOT(display_x_loc(std::vector))); + connect(m_multiAxisController, SIGNAL(motorStopSignal(int, double)), this, SLOT(moveAfterAutoFocus(int, double))); m_motorThread.start(); //归零 @@ -408,10 +409,14 @@ void focusWindow::onAutoFocusFinished() if (mu < 0 || mu > maxPos) { std::cout << "拟合失败!!!!!" << std::endl; - QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!")); - msgBox.exec(); - mu = mu_init; + m_goodPos = mu_init; + m_isAutoFocusSuccess = false; + } + else + { + std::cout << "拟合成功!!!!!" << std::endl; + m_goodPos = mu; + m_isAutoFocusSuccess = true; } FileOperation* fileOperation = new FileOperation(); @@ -420,13 +425,13 @@ void focusWindow::onAutoFocusFinished() QString format1 = "yyyyMMdd_HHmmss"; QString fileName = now.toString("yyyyMMdd_HHmmss"); - QString tmp = QDir::cleanPath(QString::fromStdString(directory) + QDir::separator() + fileName + "_" + QString::number(m_iStepSize) + "interval_" + QString::number(mu) + ".csv"); + QString fitDataFile = QDir::cleanPath(QString::fromStdString(directory) + QDir::separator() + fileName + "_" + QString::number(m_iStepSize) + "interval_" + QString::number(mu) + ".csv"); + m_coordinator->saveToCsv(fitDataFile); - QString focusFilePath = QString::fromStdString(directory) + "\\focus.csv"; - m_coordinator->saveToCsv(tmp); - - //移动马达到最佳位置 - emit move2LocSignal(0, (double)mu, m_dSpeed, 1000); + //由于马达移动准确性较低,自动调焦完成后,直接移动到m_goodPos效果不好,所以先移动到tmpPos,然后移动到m_goodPos + double tmpPos = m_goodPos - positionData[positionData.size() - 1].actualPosition / 10; + m_isMoveAfterAutoFocus = true; + emit move2LocSignal(0, (double)tmpPos, m_dSpeed, 1000); } else { @@ -436,6 +441,37 @@ void focusWindow::onAutoFocusFinished() this->setDisabled(false); } +void focusWindow::moveAfterAutoFocus(int motorID, double location) +{ + if (!m_isMoveAfterAutoFocus) + { + return; + } + + std::cout << "\n已经到达位置:" << location << std::endl; + + //移动马达到最佳位置 + emit move2LocSignal(0, (double)m_goodPos, m_dSpeed, 1000); + + double tmp = abs(location - m_goodPos) / m_goodPos * 100; + if (tmp<5) + { + if (!m_isAutoFocusSuccess) + { + QMessageBox msgBox; + msgBox.setText(QString::fromLocal8Bit("纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!")); + msgBox.exec(); + } + else + { + QMessageBox msgBox; + msgBox.setText(QString::fromLocal8Bit("自动调焦成功!")); + msgBox.exec(); + } + m_isMoveAfterAutoFocus = false; + } +} + void focusWindow::getGaussianInitParam(const std::vector& pos, const std::vector& index, double& a_init, double& mu_init, double& sigma_init, double& c_init) { auto minmax_element = std::minmax_element(index.begin(), index.end()); diff --git a/HPPA/focusWindow.h b/HPPA/focusWindow.h index fc98a01..496a0a7 100644 --- a/HPPA/focusWindow.h +++ b/HPPA/focusWindow.h @@ -125,6 +125,9 @@ private: MotionCaptureCoordinator* m_coordinator; int m_iStepSize; + double m_goodPos; + bool m_isAutoFocusSuccess; + bool m_isMoveAfterAutoFocus = false; void getGaussianInitParam(const std::vector& pos, const std::vector& index, double& a_init, double& mu_init, double& sigma_init, double& c_init); void gaussian_fit(const std::vector& x_data, const std::vector& y_data, double& a, double& mu, double& sigma, double& c); @@ -146,6 +149,8 @@ public Q_SLOTS: void display_x_loc(std::vector loc); void onx_rangeMeasurement(); + void moveAfterAutoFocus(int motorID, double location); + signals: void StartManualFocusSignal(int);//1ʼ0ֹͣ