#include "OneMotorControl.h" OneMotorControl::OneMotorControl(QWidget* parent) : QDialog(parent) { ui.setupUi(this); connect(this->ui.connect_btn, SIGNAL(pressed()), this, SLOT(onConnectMotor())); 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(this->ui.zero_start_btn, SIGNAL(released()), this, SLOT(zeroStart())); connect(this->ui.rangeMeasurement_btn, SIGNAL(pressed()), this, SLOT(onx_rangeMeasurement())); } OneMotorControl::~OneMotorControl() { m_motorThread.quit(); m_motorThread.wait(); } void OneMotorControl::onConnectMotor() { if (getMotorsConnectionStatus()) { QMessageBox msgBox; msgBox.setText(QString::fromLocal8Bit("马达已连接!")); msgBox.exec(); return; } if (m_multiAxisController != nullptr) { disconnect(m_multiAxisController, SIGNAL(broadcastLocationSignal(std::vector)), this, SLOT(display_x_loc(std::vector))); disconnect(this, SIGNAL(moveSignal(int, bool, double, int)), m_multiAxisController, SLOT(move(int, bool, double, int))); disconnect(this, SIGNAL(move2LocSignal(int, double, double, int)), m_multiAxisController, SLOT(moveTo(int, double, double, int))); disconnect(this, SIGNAL(stopSignal(int)), m_multiAxisController, SLOT(stop(int))); disconnect(this, SIGNAL(zeroStartSignal(int)), m_multiAxisController, SLOT(zeroStart(int))); disconnect(this, SIGNAL(rangeMeasurement(int, double, int)), m_multiAxisController, SLOT(rangeMeasurement(int, double, int))); disconnect(this, SIGNAL(testConnectivitySignal(int, int)), m_multiAxisController, SLOT(testConnectivity(int, int))); disconnect(m_multiAxisController, SIGNAL(broadcastConnectivity(std::vector)), this, SLOT(display_motors_connectivity(std::vector))); m_motorThread.quit(); m_motorThread.wait(); m_multiAxisController = nullptr; } 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(); return; } m_multiAxisController->moveToThread(&m_motorThread); connect(&m_motorThread, SIGNAL(finished()), m_multiAxisController, SLOT(deleteLater())); 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, SIGNAL(zeroStartSignal(int)), m_multiAxisController, SLOT(zeroStart(int))); connect(this, SIGNAL(rangeMeasurement(int, double, int)), m_multiAxisController, SLOT(rangeMeasurement(int, double, 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))); m_motorThread.start(); 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)); emit broadcastLocationSignal(loc); } void OneMotorControl::display_motors_connectivity(std::vector connectivity) { //std::cout << "-----------------------------------"<ui.motor_state_label->setStyleSheet(R"( QLabel { background-color: #08FACE; border-radius: 4px; } )"); } else { m_xMotorConnectionStatus = false; this->ui.motor_state_label->setStyleSheet(R"( QLabel { background-color: red; border-radius: 4px; } )"); } if (getMotorsConnectionStatus()) { this->ui.connect_btn->setText(QString::fromLocal8Bit("已连接")); } else { this->ui.connect_btn->setText(QString::fromLocal8Bit("重新连接")); } } 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::setImager(ImagerOperationBase* imager) { m_Imager = imager; } void OneMotorControl::record_dark() { double s = ui.speed_lineEdit->text().toDouble(); if (m_darkCaptureCoordinator == nullptr) { m_darkCaptureCoordinator = new DarkAndWhiteCaptureCoordinator(0, m_multiAxisController, m_Imager); } m_darkCaptureCoordinator->startStepMotion(s); } void OneMotorControl::record_white() { double s = ui.speed_lineEdit->text().toDouble(); if (m_whiteCaptureCoordinator == nullptr) { m_whiteCaptureCoordinator = new DarkAndWhiteCaptureCoordinator(1, m_multiAxisController, m_Imager); } m_whiteCaptureCoordinator->startStepMotion(s); } void OneMotorControl::run() { qRegisterMetaType("OneMotionCapturePathLine"); m_coordinator = new OneMotionCaptureCoordinator(m_multiAxisController, m_Imager); connect(this, SIGNAL(start(OneMotionCapturePathLine)), m_coordinator, SLOT(startStepMotion(OneMotionCapturePathLine))); connect(this, SIGNAL(stopStepMotionSignal()), m_coordinator, SLOT(stopStepMotion())); connect(m_coordinator, SIGNAL(sequenceComplete(int)), this, SLOT(onSequenceComplete(int))); OneMotionCapturePathLine tmp; tmp.speedRecord = ui.speed_lineEdit->text().toDouble(); tmp.speedBack = ui.return_speed_lineEdit->text().toDouble(); emit start(tmp); } void OneMotorControl::stop() { emit stopStepMotionSignal(); } void OneMotorControl::onSequenceComplete(int state) { emit sequenceComplete(); disconnect(this, SIGNAL(start(OneMotionCapturePathLine)), m_coordinator, SLOT(startStepMotion(OneMotionCapturePathLine))); disconnect(this, SIGNAL(stopStepMotionSignal()), m_coordinator, SLOT(stopStepMotion())); disconnect(m_coordinator, SIGNAL(sequenceComplete(int)), this, SLOT(onSequenceComplete(int))); // Use deleteLater() instead of delete: this slot may have been called directly // from OneMotionCaptureCoordinator's call stack (direct connection), so deleting // the object here would cause a crash when execution returns to the destroyed object. m_coordinator->deleteLater(); m_coordinator = nullptr; } bool OneMotorControl::getMotorsConnectionStatus() { return m_xMotorConnectionStatus; }