|
@@ -90,7 +90,38 @@ void firingWidget::startBlasting() {
|
|
});
|
|
});
|
|
connectionCheckTimer->start(2000);
|
|
connectionCheckTimer->start(2000);
|
|
}
|
|
}
|
|
|
|
+void firingWidget::cancelBlasting();
|
|
|
|
+void firingWidget::on_sendTest_4_clicked();
|
|
|
|
+
|
|
|
|
+void firingWidget::startHeartbeatMonitor() {
|
|
|
|
+ m_isHeartBeating = true;
|
|
|
|
+ QThread *heartbeatThread = new QThread();
|
|
|
|
+ QTimer *heartbeatTimer = new QTimer(nullptr);
|
|
|
|
+ heartbeatTimer->setInterval(3000); // 3 seconds interval
|
|
|
|
+ heartbeatTimer->moveToThread(heartbeatThread);
|
|
|
|
+
|
|
|
|
+ connect(heartbeatThread, &QThread::started, heartbeatTimer,
|
|
|
|
+ static_cast<void (QTimer::*)()>(&QTimer::start));
|
|
|
|
+ connect(heartbeatThread, &QThread::finished, heartbeatTimer, &QTimer::stop);
|
|
|
|
+ connect(heartbeatThread, &QThread::finished, heartbeatTimer, &QTimer::deleteLater);
|
|
|
|
+ connect(heartbeatThread, &QThread::finished, heartbeatThread, &QThread::deleteLater);
|
|
|
|
+
|
|
|
|
+ connect(heartbeatTimer, &QTimer::timeout, this, [this]() {
|
|
|
|
+ if (!m_isHeartBeating) {
|
|
|
|
+ Logger::getInstance().error("爆破器心跳检测失败,连接可能已断开");
|
|
|
|
+ QMetaObject::invokeMethod(
|
|
|
|
+ this,
|
|
|
|
+ [this]() {
|
|
|
|
+ QMessageBox::critical(this, "连接错误", "爆破器心跳检测失败,连接可能已断开");
|
|
|
|
+ cancelBlasting();
|
|
|
|
+ },
|
|
|
|
+ Qt::QueuedConnection);
|
|
|
|
+ }
|
|
|
|
+ m_isHeartBeating = false; // Reset flag for next interval
|
|
|
|
+ });
|
|
|
|
|
|
|
|
+ heartbeatThread->start();
|
|
|
|
+}
|
|
void firingWidget::on_pushButton_2_clicked() { emit countdown(m_uuid, topic, "message"); }
|
|
void firingWidget::on_pushButton_2_clicked() { emit countdown(m_uuid, topic, "message"); }
|
|
|
|
|
|
// NOTE: aborted, changed to upload in the smartmine server side.
|
|
// NOTE: aborted, changed to upload in the smartmine server side.
|
|
@@ -168,20 +199,35 @@ void firingWidget::handleProjectFiringMqttMessage(const QByteArray &message,
|
|
if (textEdit) {
|
|
if (textEdit) {
|
|
textEdit->append(msgText);
|
|
textEdit->append(msgText);
|
|
}
|
|
}
|
|
-
|
|
|
|
qDebug() << ANSI_COLOR_GREEN << "Received message on topic:" << topic.name()
|
|
qDebug() << ANSI_COLOR_GREEN << "Received message on topic:" << topic.name()
|
|
<< ", Message:" << QString(message) << ANSI_COLOR_RESET;
|
|
<< ", Message:" << QString(message) << ANSI_COLOR_RESET;
|
|
-
|
|
|
|
int stage = 0;
|
|
int stage = 0;
|
|
QJsonDocument jsonDoc = QJsonDocument::fromJson(message);
|
|
QJsonDocument jsonDoc = QJsonDocument::fromJson(message);
|
|
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
|
|
if (!jsonDoc.isNull() && jsonDoc.isObject()) {
|
|
QJsonObject jsonObj = jsonDoc.object();
|
|
QJsonObject jsonObj = jsonDoc.object();
|
|
|
|
+
|
|
if (jsonObj.contains("type") && jsonObj["type"].toInt() == 1) {
|
|
if (jsonObj.contains("type") && jsonObj["type"].toInt() == 1) {
|
|
if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
|
|
if (jsonObj.contains("data") && jsonObj["data"].isObject()) {
|
|
QJsonObject dataObject = jsonObj["data"].toObject();
|
|
QJsonObject dataObject = jsonObj["data"].toObject();
|
|
|
|
+ if (!dataObject.contains("status")) {
|
|
|
|
+ qDebug() << "Received JSON does not contain 'status' field.";
|
|
|
|
+ }
|
|
|
|
+ int status = dataObject["status"].toInt();
|
|
|
|
+ if (ErrorBlastStatusList::isErrorStatus(status)) {
|
|
|
|
+ Logger::getInstance().error(
|
|
|
|
+ QString("爆破器返回异常. 工程uuid: %1; 错误code: %2")
|
|
|
|
+ .arg(m_uuid, ErrorBlastStatusList::getErrorMessage(status)));
|
|
|
|
+ QMessageBox::critical(nullptr, "爆破器报错",
|
|
|
|
+ QString("错误错误信息: %1")
|
|
|
|
+ .arg(ErrorBlastStatusList::getErrorMessage(status)));
|
|
|
|
+
|
|
|
|
+ emit updateBlastStatus(status, m_row);
|
|
|
|
+ ui->pushButton_2->setEnabled(false);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
stage = dataObject["stage"].toInt();
|
|
stage = dataObject["stage"].toInt();
|
|
if (stage != lastStage) {
|
|
if (stage != lastStage) {
|
|
- // TODO: check available stage
|
|
|
|
lastStage = stage;
|
|
lastStage = stage;
|
|
switch (stage) {
|
|
switch (stage) {
|
|
case 0:
|
|
case 0:
|
|
@@ -236,7 +282,6 @@ void firingWidget::handleProjectFiringMqttMessage(const QByteArray &message,
|
|
navProgress->setState(6);
|
|
navProgress->setState(6);
|
|
break;
|
|
break;
|
|
case 7:
|
|
case 7:
|
|
- qDebug() << "status:" << stage;
|
|
|
|
ui->pushButton_2->setEnabled(false);
|
|
ui->pushButton_2->setEnabled(false);
|
|
emit progressChanged(0, m_row); // 发送进度值
|
|
emit progressChanged(0, m_row); // 发送进度值
|
|
emit updateBlastStatus(0, m_row); // 正在测试
|
|
emit updateBlastStatus(0, m_row); // 正在测试
|
|
@@ -391,6 +436,7 @@ void firingWidget::saveAndUploadRecord(const QJsonObject &jsonObj) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ qDebug() << "Starting transaction for blast record with uuid:" << jsonObj;
|
|
HBlastRecord *blastRecord = recordBlastProject(jsonObj);
|
|
HBlastRecord *blastRecord = recordBlastProject(jsonObj);
|
|
if (blastRecord == nullptr) {
|
|
if (blastRecord == nullptr) {
|
|
Logger::getInstance("error_blast_records.log")
|
|
Logger::getInstance("error_blast_records.log")
|
|
@@ -427,6 +473,8 @@ void firingWidget::saveAndUploadRecord(const QJsonObject &jsonObj) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ qDebug() << "Transaction committed successfully for blast record with uuid:"
|
|
|
|
+ << blastRecord->getUuid();
|
|
uploadBlastRecordToServer(blastRecord);
|
|
uploadBlastRecordToServer(blastRecord);
|
|
}
|
|
}
|
|
|
|
|