261 lines
9.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDateTime>
#include <QBuffer>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 创建接收器实例
IBinocularMarkReceiver* pReceiver = nullptr;
if (IBinocularMarkReceiver::CreateInstance(&pReceiver) == 0 && pReceiver) {
m_receiver.reset(pReceiver);
}
// 连接信号槽
connect(ui->btn_connect, &QPushButton::clicked, this, &MainWindow::onConnectClicked);
connect(ui->btn_startWork, &QPushButton::clicked, this, &MainWindow::onStartWorkClicked);
connect(ui->btn_stopWork, &QPushButton::clicked, this, &MainWindow::onStopWorkClicked);
connect(ui->btn_singleImage, &QPushButton::clicked, this, &MainWindow::onSingleImageClicked);
connect(ui->btn_singleDetection, &QPushButton::clicked, this, &MainWindow::onSingleDetectionClicked);
connect(ui->btn_setExposureTime, &QPushButton::clicked, this, &MainWindow::onSetExposureTimeClicked);
connect(ui->btn_setGain, &QPushButton::clicked, this, &MainWindow::onSetGainClicked);
// 设置事件回调
if (m_receiver) {
m_receiver->SetEventCallback([this](ReceiverEventType eventType, const std::string& errorMsg) {
QMetaObject::invokeMethod(this, [this, eventType, errorMsg]() {
QString msg;
switch (eventType) {
case ReceiverEventType::CONNECTED:
msg = "已连接";
updateConnectionState(true);
break;
case ReceiverEventType::DISCONNECTED:
msg = "已断开";
updateConnectionState(false);
break;
case ReceiverEventType::CONNECTION_ERROR:
msg = QString("连接错误: %1").arg(QString::fromStdString(errorMsg));
updateConnectionState(false);
break;
case ReceiverEventType::HEARTBEAT_TIMEOUT:
msg = "心跳超时";
updateConnectionState(false);
break;
default:
msg = "未知事件";
break;
}
appendResult(msg);
ui->statusbar->showMessage(msg);
});
});
// 设置持续检测结果回调
m_receiver->SetMarkResultCallback([this](const std::vector<VrMark3D>& marks, int64_t timestamp, int errorCode) {
QMetaObject::invokeMethod(this, [this, marks, timestamp, errorCode]() {
QString result = QString("[%1] 持续检测结果 (错误码: %2):\n")
.arg(QDateTime::fromMSecsSinceEpoch(timestamp).toString("hh:mm:ss.zzz"))
.arg(errorCode);
if (errorCode == 0 && !marks.empty()) {
for (const auto& mark : marks) {
result += QString(" Mark ID=%1: (%.2f, %.2f, %.2f)\n")
.arg(mark.markID)
.arg(mark.x, 0, 'f', 2)
.arg(mark.y, 0, 'f', 2)
.arg(mark.z, 0, 'f', 2);
}
} else {
result += " 无检测结果\n";
}
appendResult(result);
});
});
}
}
MainWindow::~MainWindow()
{
if (m_receiver && m_receiver->IsConnected()) {
m_receiver->StopWork();
m_receiver->Disconnect();
}
delete ui;
}
void MainWindow::onConnectClicked()
{
if (!m_receiver) {
QMessageBox::warning(this, "错误", "接收器未初始化");
return;
}
if (m_receiver->IsConnected()) {
m_receiver->Disconnect();
ui->btn_connect->setText("连接");
updateConnectionState(false);
} else {
QString ip = ui->lineEdit_ip->text();
uint16_t port = ui->lineEdit_port->text().toUShort();
int ret = m_receiver->Connect(ip.toStdString(), port);
if (ret == 0) {
ui->btn_connect->setText("断开");
updateConnectionState(true);
appendResult(QString("正在连接 %1:%2...").arg(ip).arg(port));
} else {
QMessageBox::warning(this, "错误", QString("连接失败,错误码: %1").arg(ret));
}
}
}
void MainWindow::onStartWorkClicked()
{
if (!m_receiver || !m_receiver->IsConnected()) return;
int ret = m_receiver->StartWork();
if (ret == 0) {
appendResult("开始持续检测");
ui->btn_startWork->setEnabled(false);
ui->btn_stopWork->setEnabled(true);
} else {
QMessageBox::warning(this, "错误", QString("启动失败,错误码: %1").arg(ret));
}
}
void MainWindow::onStopWorkClicked()
{
if (!m_receiver || !m_receiver->IsConnected()) return;
int ret = m_receiver->StopWork();
if (ret == 0) {
appendResult("停止持续检测");
ui->btn_startWork->setEnabled(true);
ui->btn_stopWork->setEnabled(false);
} else {
QMessageBox::warning(this, "错误", QString("停止失败,错误码: %1").arg(ret));
}
}
void MainWindow::onSingleImageClicked()
{
if (!m_receiver || !m_receiver->IsConnected()) return;
appendResult("请求单次取图...");
auto imageData = m_receiver->RequestSingleImage(5000);
if (imageData.timestamp > 0) {
displayImage(ui->label_left, imageData.leftImageBase64);
displayImage(ui->label_right, imageData.rightImageBase64);
appendResult(QString("取图成功 [%1]")
.arg(QDateTime::fromMSecsSinceEpoch(imageData.timestamp).toString("hh:mm:ss.zzz")));
} else {
appendResult("取图失败或超时");
}
}
void MainWindow::onSingleDetectionClicked()
{
if (!m_receiver || !m_receiver->IsConnected()) return;
appendResult("请求单次检测...");
auto result = m_receiver->RequestSingleDetection(5000);
if (result.timestamp > 0) {
displayImage(ui->label_left, result.leftImageBase64);
displayImage(ui->label_right, result.rightImageBase64);
QString msg = QString("检测完成 [%1] (错误码: %2):\n")
.arg(QDateTime::fromMSecsSinceEpoch(result.timestamp).toString("hh:mm:ss.zzz"))
.arg(result.errorCode);
if (result.errorCode == 0 && !result.marks.empty()) {
for (const auto& mark : result.marks) {
msg += QString(" Mark ID=%1: (%.2f, %.2f, %.2f)\n")
.arg(mark.markID)
.arg(mark.x, 0, 'f', 2)
.arg(mark.y, 0, 'f', 2)
.arg(mark.z, 0, 'f', 2);
}
} else {
msg += " 无检测结果\n";
}
appendResult(msg);
} else {
appendResult("检测失败或超时");
}
}
void MainWindow::onSetExposureTimeClicked()
{
if (!m_receiver || !m_receiver->IsConnected()) return;
double exposureTime = ui->lineEdit_exposure->text().toDouble();
if (exposureTime <= 0) {
appendResult("错误曝光时间必须大于0");
return;
}
int ret = m_receiver->SetExposureTime(exposureTime);
if (ret == 0) {
appendResult(QString("设置曝光时间成功:%.2f").arg(exposureTime));
} else {
appendResult(QString("设置曝光时间失败,错误码: %1").arg(ret));
}
}
void MainWindow::onSetGainClicked()
{
if (!m_receiver || !m_receiver->IsConnected()) return;
double gain = ui->lineEdit_gain->text().toDouble();
if (gain <= 0) {
appendResult("错误增益必须大于0");
return;
}
int ret = m_receiver->SetGain(gain);
if (ret == 0) {
appendResult(QString("设置增益成功:%.2f").arg(gain));
} else {
appendResult(QString("设置增益失败,错误码: %1").arg(ret));
}
}
void MainWindow::displayImage(QLabel* label, const std::string& base64Data)
{
if (base64Data.empty()) return;
QByteArray imageData = QByteArray::fromBase64(QByteArray::fromStdString(base64Data));
QImage image;
if (image.loadFromData(imageData)) {
label->setPixmap(QPixmap::fromImage(image).scaled(
label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
}
void MainWindow::appendResult(const QString& text)
{
ui->textEdit_result->append(text);
}
void MainWindow::updateConnectionState(bool connected)
{
ui->btn_startWork->setEnabled(connected);
ui->btn_stopWork->setEnabled(false);
ui->btn_singleImage->setEnabled(connected);
ui->btn_singleDetection->setEnabled(connected);
ui->btn_setExposureTime->setEnabled(connected);
ui->btn_setGain->setEnabled(connected);
ui->lineEdit_ip->setEnabled(!connected);
ui->lineEdit_port->setEnabled(!connected);
}