648 lines
22 KiB
C++
648 lines
22 KiB
C++
#include "TwoMotorControl.h"
|
||
|
||
TwoMotorControl::TwoMotorControl(QWidget* parent) : QDialog(parent)
|
||
{
|
||
ui.setupUi(this);
|
||
|
||
ui.recordLine_tableWidget->setFocusPolicy(Qt::NoFocus);
|
||
|
||
ui.recordLine_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//设置选择行为,以行为单位
|
||
//ui.recordLine_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);//设置选择模式,选择单行
|
||
//QHeaderView* headerView = ui.recordLine_tableWidget->verticalHeader();
|
||
//headerView->setHidden(true);//去除左边默认自带序列号
|
||
|
||
connect(this->ui.connect_btn, SIGNAL(pressed()), this, SLOT(onConnectMotor()));
|
||
|
||
connect(ui.addRecordLine_btn, SIGNAL(clicked()), this, SLOT(onAddRecordLine_btn()));
|
||
connect(ui.removeRecordLine_btn, SIGNAL(clicked()), this, SLOT(onRemoveRecordLine_btn()));
|
||
connect(ui.deleteRecordLine_btn, SIGNAL(clicked()), this, SLOT(onDeleteRecordLine_btn()));
|
||
connect(ui.saveRecordLine2File_btn, SIGNAL(clicked()), this, SLOT(onSaveRecordLine2File_btn()));
|
||
connect(ui.readRecordLineFile_btn, SIGNAL(clicked()), this, SLOT(onReadRecordLineFile_btn()));
|
||
|
||
connect(this->ui.xmotor_right_btn, SIGNAL(pressed()), this, SLOT(onxMotorRight()));
|
||
connect(this->ui.xmotor_right_btn, SIGNAL(released()), this, SLOT(onxMotorStop()));
|
||
connect(this->ui.xmotor_left_btn, SIGNAL(pressed()), this, SLOT(onxMotorLeft()));
|
||
connect(this->ui.xmotor_left_btn, SIGNAL(released()), this, SLOT(onxMotorStop()));
|
||
|
||
connect(this->ui.ymotor_forward_btn, SIGNAL(pressed()), this, SLOT(onyMotorforward()));
|
||
connect(this->ui.ymotor_forward_btn, SIGNAL(released()), this, SLOT(onyMotorStop()));
|
||
connect(this->ui.ymotor_backward_btn, SIGNAL(pressed()), this, SLOT(onyMotorbackward()));
|
||
connect(this->ui.ymotor_backward_btn, SIGNAL(released()), this, SLOT(onyMotorStop()));
|
||
|
||
connect(this->ui.move2loc_x_pushButton, SIGNAL(pressed()), this, SLOT(onxMove2Loc()));
|
||
connect(this->ui.move2loc_y_pushButton, SIGNAL(pressed()), this, SLOT(onyMove2Loc()));
|
||
|
||
connect(this->ui.zero_start_btn, SIGNAL(released()), this, SLOT(zeroStart()));
|
||
connect(this->ui.rangeMeasurement_btn, SIGNAL(pressed()), this, SLOT(on_rangeMeasurement()));
|
||
}
|
||
|
||
void TwoMotorControl::setImager(ImagerOperationBase* imager)
|
||
{
|
||
m_Imager = imager;
|
||
}
|
||
|
||
void TwoMotorControl::setPosFileName(QString posFileName)
|
||
{
|
||
isWritePosFile = true;
|
||
m_posFileName = posFileName;
|
||
m_posFileHandle = fopen(posFileName.toStdString().c_str(), "w+");
|
||
}
|
||
|
||
bool TwoMotorControl::getState()
|
||
{
|
||
if (m_coordinator == nullptr)
|
||
return false;
|
||
|
||
QEventLoop loop;
|
||
bool tmp = false;
|
||
bool received = false;
|
||
|
||
QTimer timer;
|
||
timer.setSingleShot(true);
|
||
connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
|
||
|
||
QMetaObject::Connection conn = QObject::connect(
|
||
m_coordinator, &TwoMotionCaptureCoordinator::recordState,
|
||
[&](bool state) {
|
||
tmp = state;
|
||
received = true;
|
||
loop.quit();
|
||
});
|
||
|
||
QMetaObject::invokeMethod(m_coordinator, "getRecordState", Qt::QueuedConnection);
|
||
timer.start(3000);
|
||
|
||
loop.exec();
|
||
|
||
disconnect(conn);
|
||
|
||
return tmp;
|
||
}
|
||
|
||
void TwoMotorControl::record_dark()
|
||
{
|
||
double s = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
if (m_darkCaptureCoordinator == nullptr)
|
||
{
|
||
m_darkCaptureCoordinator = new DarkAndWhiteCaptureCoordinator(0, m_multiAxisController, m_Imager);
|
||
}
|
||
|
||
m_darkCaptureCoordinator->startStepMotion(s);
|
||
}
|
||
|
||
void TwoMotorControl::record_white()
|
||
{
|
||
double s = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
if (m_whiteCaptureCoordinator == nullptr)
|
||
{
|
||
m_whiteCaptureCoordinator = new DarkAndWhiteCaptureCoordinator(1, m_multiAxisController, m_Imager);
|
||
}
|
||
|
||
m_whiteCaptureCoordinator->startStepMotion(s);
|
||
}
|
||
|
||
void TwoMotorControl::run2(SingleLensReflexCameraWindow* window)
|
||
{
|
||
int rowCount = ui.recordLine_tableWidget->rowCount();
|
||
if (rowCount == 0)
|
||
{
|
||
QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请至少添加一行采集线!"));
|
||
|
||
emit sequenceComplete(0);
|
||
return;
|
||
}
|
||
|
||
m_coordinator_TimedDataCollection = new TwoMotionCaptureCoordinator(m_multiAxisController);
|
||
connect(this, SIGNAL(start(QVector<PathLine>)), m_coordinator_TimedDataCollection, SLOT(start(QVector<PathLine>)));
|
||
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::startRecordLineNumSignal, this, &TwoMotorControl::receiveStartRecordLineNum);
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::finishRecordLineNumSignal, this, &TwoMotorControl::receiveFinishRecordLineNum);
|
||
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::startRecordLineNumSignal, window, &SingleLensReflexCameraWindow::onStartTimedDataCollection);
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::sequenceComplete, window, &SingleLensReflexCameraWindow::onStopTimedDataCollection);
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::sequenceComplete, this, &TwoMotorControl::sequenceComplete);
|
||
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::back2OriginSignal, this, &TwoMotorControl::onBack2Origin2);
|
||
|
||
QVector<PathLine> pathLines;
|
||
//int columnCount = ui.recordLine_tableWidget->columnCount();
|
||
for (size_t i = 0; i < rowCount; i++)
|
||
{
|
||
PathLine tmp;
|
||
|
||
tmp.targetYPosition = ui.recordLine_tableWidget->item(i, 0)->text().toDouble();
|
||
tmp.speedTargetYPosition = ui.recordLine_tableWidget->item(i, 1)->text().toDouble();
|
||
tmp.targetXMinPosition = ui.recordLine_tableWidget->item(i, 2)->text().toDouble();
|
||
tmp.speedTargetXMinPosition = ui.recordLine_tableWidget->item(i, 3)->text().toDouble();
|
||
tmp.targetXMaxPosition = ui.recordLine_tableWidget->item(i, 4)->text().toDouble();
|
||
tmp.speedTargetXMaxPosition = ui.recordLine_tableWidget->item(i, 5)->text().toDouble();
|
||
|
||
pathLines.append(tmp);
|
||
}
|
||
|
||
for (size_t i = 0; i < ui.recordLine_tableWidget->rowCount(); i++)
|
||
{
|
||
for (size_t j = 0; j < ui.recordLine_tableWidget->columnCount(); j++)
|
||
{
|
||
ui.recordLine_tableWidget->item(i, j)->setBackgroundColor(QColor("#0E1C4C"));
|
||
}
|
||
}
|
||
|
||
emit start(pathLines);
|
||
}
|
||
|
||
void TwoMotorControl::run3(DepthCameraWindow* window)
|
||
{
|
||
int rowCount = ui.recordLine_tableWidget->rowCount();
|
||
if (rowCount == 0)
|
||
{
|
||
QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请至少添加一行采集线!"));
|
||
|
||
emit sequenceComplete(0);
|
||
return;
|
||
}
|
||
|
||
m_coordinator_TimedDataCollection = new TwoMotionCaptureCoordinator(m_multiAxisController);
|
||
connect(this, SIGNAL(start(QVector<PathLine>)), m_coordinator_TimedDataCollection, SLOT(start(QVector<PathLine>)));
|
||
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::startRecordLineNumSignal, this, &TwoMotorControl::receiveStartRecordLineNum);
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::finishRecordLineNumSignal, this, &TwoMotorControl::receiveFinishRecordLineNum);
|
||
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::startRecordLineNumSignal, window, &DepthCameraWindow::openDepthCamera);
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::sequenceComplete, window, &DepthCameraWindow::closeDepthCamera);
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::sequenceComplete, this, &TwoMotorControl::sequenceComplete);
|
||
|
||
connect(m_coordinator_TimedDataCollection, &TwoMotionCaptureCoordinator::back2OriginSignal, this, &TwoMotorControl::onBack2Origin2);
|
||
|
||
QVector<PathLine> pathLines;
|
||
//int columnCount = ui.recordLine_tableWidget->columnCount();
|
||
for (size_t i = 0; i < rowCount; i++)
|
||
{
|
||
PathLine tmp;
|
||
|
||
tmp.targetYPosition = ui.recordLine_tableWidget->item(i, 0)->text().toDouble();
|
||
tmp.speedTargetYPosition = ui.recordLine_tableWidget->item(i, 1)->text().toDouble();
|
||
tmp.targetXMinPosition = ui.recordLine_tableWidget->item(i, 2)->text().toDouble();
|
||
tmp.speedTargetXMinPosition = ui.recordLine_tableWidget->item(i, 3)->text().toDouble();
|
||
tmp.targetXMaxPosition = ui.recordLine_tableWidget->item(i, 4)->text().toDouble();
|
||
tmp.speedTargetXMaxPosition = ui.recordLine_tableWidget->item(i, 5)->text().toDouble();
|
||
|
||
pathLines.append(tmp);
|
||
}
|
||
|
||
for (size_t i = 0; i < ui.recordLine_tableWidget->rowCount(); i++)
|
||
{
|
||
for (size_t j = 0; j < ui.recordLine_tableWidget->columnCount(); j++)
|
||
{
|
||
ui.recordLine_tableWidget->item(i, j)->setBackgroundColor(QColor("#0E1C4C"));
|
||
}
|
||
}
|
||
|
||
emit start(pathLines);
|
||
}
|
||
|
||
void TwoMotorControl::onBack2Origin2()
|
||
{
|
||
m_coordinator_TimedDataCollection->deleteLater();
|
||
m_coordinator_TimedDataCollection = nullptr;
|
||
emit back2OriginSignal_TimedDataCollection();
|
||
}
|
||
|
||
void TwoMotorControl::run4_ObtainTargetDepthInfo(DepthCameraWindow* window, double depthInfoX, double depthInfoY, int averageNumberOfTimes, double percentageOfEffectiveArea)
|
||
{
|
||
window->m_DepthCameraOperation->setAverageNumberOfTimes(averageNumberOfTimes);
|
||
window->m_DepthCameraOperation->setPercentageOfEffectiveArea(percentageOfEffectiveArea);
|
||
|
||
m_ObtainTargetDepthInfoCoordinator = new TwoMotor1PosCoordinator(m_multiAxisController);
|
||
connect(m_ObtainTargetDepthInfoCoordinator, &TwoMotor1PosCoordinator::ArrivalSignal, window, &DepthCameraWindow::OpenDepthCamera_getDepthValue);
|
||
|
||
connect(window->m_DepthCameraOperation, &DepthCameraOperation::DepthValueSignal, m_ObtainTargetDepthInfoCoordinator, &TwoMotor1PosCoordinator::back2origin);
|
||
connect(window->m_DepthCameraOperation, &DepthCameraOperation::DepthValueSignal, this, &TwoMotorControl::sequenceComplete);//关灯
|
||
|
||
connect(m_ObtainTargetDepthInfoCoordinator, &TwoMotor1PosCoordinator::back2OriginSignal, this, &TwoMotorControl::onBack2Origin3);
|
||
|
||
double xmotor_move_speed = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
double ymotor_move_speed = ui.ymotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
m_ObtainTargetDepthInfoCoordinator->moveToTarget(depthInfoX, depthInfoY, xmotor_move_speed, ymotor_move_speed);
|
||
}
|
||
|
||
void TwoMotorControl::onBack2Origin3()
|
||
{
|
||
m_ObtainTargetDepthInfoCoordinator->deleteLater();
|
||
m_ObtainTargetDepthInfoCoordinator = nullptr;
|
||
emit back2OriginSignal_TimedDataCollection();
|
||
}
|
||
|
||
void TwoMotorControl::run()
|
||
{
|
||
if (getState())
|
||
{
|
||
QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("已经开始运行,请勿重复点击!"));
|
||
return;
|
||
}
|
||
|
||
int rowCount = ui.recordLine_tableWidget->rowCount();
|
||
if(rowCount == 0)
|
||
{
|
||
QMessageBox::information(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请至少添加一行采集线!"));
|
||
|
||
emit sequenceComplete(0);
|
||
return;
|
||
}
|
||
|
||
qRegisterMetaType<QVector<PathLine>>("QVector<PathLine>");
|
||
m_coordinator = new TwoMotionCaptureCoordinator(m_multiAxisController);
|
||
m_coordinator->moveToThread(&m_coordinatorThread);
|
||
connect(&m_coordinatorThread, SIGNAL(finished()), m_coordinator, SLOT(deleteLater()));
|
||
connect(this, SIGNAL(start(QVector<PathLine>)), m_coordinator, SLOT(start(QVector<PathLine>)));
|
||
|
||
connect(this, SIGNAL(stopSignal()), m_coordinator, SLOT(stop()));
|
||
connect(m_coordinator, SIGNAL(startRecordLineNumSignal(int)), this, SLOT(receiveStartRecordLineNum(int)));
|
||
connect(m_coordinator, SIGNAL(finishRecordLineNumSignal(int)), this, SLOT(receiveFinishRecordLineNum(int)));
|
||
connect(m_coordinator, SIGNAL(sequenceComplete(int)), this, SLOT(onSequenceComplete(int)));
|
||
connect(m_coordinator, &TwoMotionCaptureCoordinator::back2OriginSignal, this, &TwoMotorControl::onBack2Origin);
|
||
|
||
connect(m_coordinator, &TwoMotionCaptureCoordinator::startRecordHSISignal, m_Imager, &ImagerOperationBase::start_record);
|
||
connect(m_coordinator, &TwoMotionCaptureCoordinator::stopRecordHSISignal, this, &TwoMotorControl::stop_record);
|
||
connect(m_Imager, &ImagerOperationBase::RecordFinishedSignal_WhenFrameNumberMeet, m_coordinator, &TwoMotionCaptureCoordinator::handleCaptureCompleteWhenFrameNumberMeet);
|
||
|
||
m_coordinatorThread.start();
|
||
|
||
QVector<PathLine> pathLines;
|
||
//int columnCount = ui.recordLine_tableWidget->columnCount();
|
||
for (size_t i = 0; i < rowCount; i++)
|
||
{
|
||
PathLine tmp;
|
||
|
||
tmp.targetYPosition = ui.recordLine_tableWidget->item(i, 0)->text().toDouble();
|
||
tmp.speedTargetYPosition = ui.recordLine_tableWidget->item(i, 1)->text().toDouble();
|
||
tmp.targetXMinPosition = ui.recordLine_tableWidget->item(i, 2)->text().toDouble();
|
||
tmp.speedTargetXMinPosition = ui.recordLine_tableWidget->item(i, 3)->text().toDouble();
|
||
tmp.targetXMaxPosition = ui.recordLine_tableWidget->item(i, 4)->text().toDouble();
|
||
tmp.speedTargetXMaxPosition = ui.recordLine_tableWidget->item(i, 5)->text().toDouble();
|
||
|
||
pathLines.append(tmp);
|
||
}
|
||
|
||
for (size_t i = 0; i < ui.recordLine_tableWidget->rowCount(); i++)
|
||
{
|
||
for (size_t j = 0; j < ui.recordLine_tableWidget->columnCount(); j++)
|
||
{
|
||
ui.recordLine_tableWidget->item(i, j)->setBackgroundColor(QColor("#0E1C4C"));
|
||
}
|
||
}
|
||
|
||
emit start(pathLines);
|
||
}
|
||
|
||
void TwoMotorControl::stop_record()
|
||
{
|
||
m_Imager->stop_record();
|
||
}
|
||
|
||
void TwoMotorControl::stop()
|
||
{
|
||
emit stopSignal();
|
||
}
|
||
|
||
TwoMotorControl::~TwoMotorControl()
|
||
{
|
||
m_motorThread.quit();
|
||
m_motorThread.wait();
|
||
|
||
m_coordinatorThread.quit();
|
||
m_coordinatorThread.wait();
|
||
}
|
||
|
||
void TwoMotorControl::onConnectMotor()
|
||
{
|
||
connectMotor(true);
|
||
}
|
||
|
||
void TwoMotorControl::connectMotor(bool isNotification)
|
||
{
|
||
if (getMotorsConnectionStatus())
|
||
{
|
||
if (isNotification)
|
||
{
|
||
QMessageBox msgBox;
|
||
msgBox.setText(QString::fromLocal8Bit("马达已连接!"));
|
||
msgBox.exec();
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
if (m_multiAxisController != nullptr)
|
||
{
|
||
disconnect(m_multiAxisController, SIGNAL(broadcastLocationSignal(std::vector<double>)), this, SLOT(displayRealTimeLoc(std::vector<double>)));
|
||
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<int>)), this, SLOT(display_motors_connectivity(std::vector<int>)));
|
||
|
||
m_motorThread.quit();
|
||
m_motorThread.wait();
|
||
m_multiAxisController = nullptr;
|
||
}
|
||
|
||
try
|
||
{
|
||
FileOperation* fileOperation = new FileOperation();
|
||
string directory = fileOperation->getDirectoryOfExe();
|
||
QString configFilePath = QString::fromStdString(directory) + "\\twoMotorConfigFile.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<double>)), this, SLOT(displayRealTimeLoc(std::vector<double>)));
|
||
|
||
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<int>)), this, SLOT(display_motors_connectivity(std::vector<int>)));
|
||
|
||
m_motorThread.start();
|
||
emit testConnectivitySignal(0, 1000);
|
||
emit testConnectivitySignal(1, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::receiveStartRecordLineNum(int lineNum)
|
||
{
|
||
emit startLineNumSignal(lineNum);
|
||
for (size_t i = 0; i < ui.recordLine_tableWidget->columnCount(); i++)
|
||
{
|
||
ui.recordLine_tableWidget->item(lineNum, i)->setBackgroundColor(QColor(255, 0, 0));
|
||
}
|
||
}
|
||
|
||
void TwoMotorControl::receiveFinishRecordLineNum(int lineNum)
|
||
{
|
||
for (size_t i = 0; i < ui.recordLine_tableWidget->columnCount(); i++)
|
||
{
|
||
ui.recordLine_tableWidget->item(lineNum, i)->setBackgroundColor(QColor(0, 255, 0));
|
||
}
|
||
}
|
||
|
||
void TwoMotorControl::onSequenceComplete(int status)
|
||
{
|
||
isWritePosFile = false;
|
||
fclose(m_posFileHandle);
|
||
|
||
emit sequenceComplete(status);
|
||
}
|
||
|
||
void TwoMotorControl::onBack2Origin()
|
||
{
|
||
m_coordinatorThread.quit();
|
||
m_coordinatorThread.wait();
|
||
m_coordinator = nullptr;
|
||
|
||
emit back2OriginSignal();
|
||
emit back2OriginSignal_TimedDataCollection();
|
||
}
|
||
|
||
bool TwoMotorControl::getMotorsConnectionStatus()
|
||
{
|
||
return m_xMotorConnectionStatus && m_yMotorConnectionStatus;
|
||
}
|
||
|
||
void TwoMotorControl::display_motors_connectivity(std::vector<int> connectivity)
|
||
{
|
||
//std::cout << "-----------------------------------"<<connectivity.size()<< std::endl;
|
||
if (connectivity[0])
|
||
{
|
||
m_xMotorConnectionStatus = true;
|
||
|
||
this->ui.xMotorStateLabel->setStyleSheet(R"(
|
||
QLabel
|
||
{
|
||
background-color: #08FACE;
|
||
border-radius: 4px;
|
||
}
|
||
)");
|
||
}
|
||
else
|
||
{
|
||
m_xMotorConnectionStatus = false;
|
||
|
||
this->ui.xMotorStateLabel->setStyleSheet(R"(
|
||
QLabel
|
||
{
|
||
background-color: red;
|
||
border-radius: 4px;
|
||
}
|
||
)");
|
||
}
|
||
|
||
if (connectivity[1])
|
||
{
|
||
m_yMotorConnectionStatus = true;
|
||
|
||
this->ui.yMotorStateLabel->setStyleSheet(R"(
|
||
QLabel
|
||
{
|
||
background-color: #08FACE;
|
||
border-radius: 4px;
|
||
}
|
||
)");
|
||
}
|
||
else
|
||
{
|
||
m_yMotorConnectionStatus = false;
|
||
|
||
this->ui.yMotorStateLabel->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 TwoMotorControl::onxMotorRight()
|
||
{
|
||
double s = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
emit moveSignal(0, false, s, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::onxMotorLeft()
|
||
{
|
||
double s = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
emit moveSignal(0, true, s, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::onxMotorStop()
|
||
{
|
||
emit stopSignal(0);
|
||
}
|
||
|
||
void TwoMotorControl::onyMotorforward()
|
||
{
|
||
double s = ui.ymotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
emit moveSignal(1, false, s, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::onyMotorbackward()
|
||
{
|
||
double s = ui.ymotor_move_speed_lineEdit->text().toDouble();
|
||
|
||
emit moveSignal(1, true, s, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::onyMotorStop()
|
||
{
|
||
emit stopSignal(1);
|
||
}
|
||
|
||
void TwoMotorControl::onxMove2Loc()
|
||
{
|
||
double s = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
double l = ui.move2loc_x_lineEdit->text().toDouble();
|
||
|
||
emit move2LocSignal(0, l, s, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::onyMove2Loc()
|
||
{
|
||
double s = ui.ymotor_move_speed_lineEdit->text().toDouble();
|
||
double l = ui.move2loc_y_lineEdit->text().toDouble();
|
||
|
||
emit move2LocSignal(1, l, s, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::displayRealTimeLoc(std::vector<double> loc)
|
||
{
|
||
double tmp = round(loc[0] * 100) / 100;
|
||
if (isWritePosFile)
|
||
{
|
||
long long timeOs = getNanosecondsSinceMidnight();
|
||
fprintf(m_posFileHandle, "%lld,%f\n", timeOs, loc[0]);
|
||
}
|
||
this->ui.xmotor_realTimeLoc_lineEdit->setText(QString::number(tmp));
|
||
|
||
tmp = round(loc[1] * 100) / 100;
|
||
this->ui.ymotor_realTimeLoc_lineEdit->setText(QString::number(tmp));
|
||
|
||
emit broadcastLocationSignal(loc);
|
||
}
|
||
|
||
void TwoMotorControl::zeroStart()
|
||
{
|
||
zeroStartSignal(0);
|
||
zeroStartSignal(1);
|
||
}
|
||
|
||
void TwoMotorControl::on_rangeMeasurement()
|
||
{
|
||
double s0 = ui.xmotor_move_speed_lineEdit->text().toDouble();
|
||
emit rangeMeasurement(0, s0, 1000);
|
||
|
||
s0 = ui.ymotor_move_speed_lineEdit->text().toDouble();
|
||
emit rangeMeasurement(1, s0, 1000);
|
||
}
|
||
|
||
void TwoMotorControl::onAddRecordLine_btn()
|
||
{
|
||
// 准备数据:获取y马达的当前位置,获取x马达的当前位置和最大位置
|
||
double currentPosOfYmotor = 15;
|
||
double currentPosOfXmotor = 0;
|
||
double maxRangeOfXmotor = 50;
|
||
|
||
PathLineManager::addRecordLine(ui.recordLine_tableWidget,
|
||
currentPosOfYmotor, 1.0,
|
||
currentPosOfXmotor, 1.0,
|
||
maxRangeOfXmotor, 1.0);
|
||
}
|
||
|
||
void TwoMotorControl::onRemoveRecordLine_btn()
|
||
{
|
||
int rowIndex = ui.recordLine_tableWidget->currentRow();
|
||
if (rowIndex != -1)
|
||
ui.recordLine_tableWidget->removeRow(rowIndex);
|
||
}
|
||
|
||
void TwoMotorControl::onDeleteRecordLine_btn()
|
||
{
|
||
int rowCount = ui.recordLine_tableWidget->rowCount();
|
||
for (size_t i = 0; i < rowCount; i++)
|
||
{
|
||
ui.recordLine_tableWidget->removeRow(0);
|
||
}
|
||
}
|
||
|
||
void TwoMotorControl::onSaveRecordLine2File_btn()
|
||
{
|
||
// 确保采集线存在
|
||
if (ui.recordLine_tableWidget->rowCount() <= 0)
|
||
{
|
||
QMessageBox::information(this, QString::fromLocal8Bit("提示"),
|
||
QString::fromLocal8Bit("请先生成轨迹!"));
|
||
return;
|
||
}
|
||
FileOperation* fileOperation = new FileOperation();
|
||
string directory = fileOperation->getDirectoryOfExe();
|
||
QString RecordLineFilePath = QFileDialog::getSaveFileName(this, tr("Save RecordLine3 File"),
|
||
QString::fromStdString(directory),
|
||
tr("RecordLineFile3 (*.RecordLine3)"));
|
||
if (RecordLineFilePath.isEmpty())
|
||
{
|
||
return;
|
||
}
|
||
PathLineManager::saveToFile(RecordLineFilePath, ui.recordLine_tableWidget);
|
||
}
|
||
|
||
void TwoMotorControl::onReadRecordLineFile_btn()
|
||
{
|
||
FileOperation* fileOperation = new FileOperation();
|
||
string directory = fileOperation->getDirectoryOfExe();
|
||
QString RecordLineFilePath = QFileDialog::getOpenFileName(this, tr("Open RecordLine3 File"),
|
||
QString::fromStdString(directory),
|
||
tr("RecordLineFile (*.RecordLine3)"));
|
||
if (RecordLineFilePath.isEmpty())
|
||
{
|
||
return;
|
||
}
|
||
|
||
readRecordLineFile(RecordLineFilePath);
|
||
}
|
||
void TwoMotorControl::readRecordLineFile(QString RecordLineFilePath)
|
||
{
|
||
PathLineManager::readFromFile(RecordLineFilePath, ui.recordLine_tableWidget);
|
||
}
|