ソースを参照

1.多台起爆

leslie 2 週間 前
コミット
7096283fd2
4 ファイル変更143 行追加28 行削除
  1. 110 5
      blastopepage.cpp
  2. 12 5
      blastopepage.h
  3. 19 17
      fireWidget/firingwidget.cpp
  4. 2 1
      fireWidget/firingwidget.h

+ 110 - 5
blastopepage.cpp

@@ -342,7 +342,7 @@ void BlastOpePage::loadDataFromSource(int currentPage, int pageSize)
         progressBarLayout->addWidget(progressBar3);
         progressBarLayout->setAlignment(Qt::AlignCenter);
         progressBarLayout->setContentsMargins(0, 0, 0, 0);
-
+        progressBarLayout->setSpacing(0); // 设置进度条之间的间距为0
         QWidget *progressBarContainer = new QWidget(ui->tableView);
         progressBarContainer->setLayout(progressBarLayout);
         QModelIndex progressIndex = model->index(row, progressCol);
@@ -462,7 +462,7 @@ void BlastOpePage::updateProgressBar(int value, int row)
 
 void BlastOpePage::onUpdateBlastStatus(int status ,int row)
 {
-    QModelIndex index = model->index(row, 6);
+    QModelIndex index = model->index(row, 9);
         if (index.isValid()) {
             QColor customColor;
             QFont boldFont;
@@ -637,7 +637,7 @@ void BlastOpePage::on_btnSelect_clicked()
     for (auto it = uuidMap.begin(); it != uuidMap.end(); ++it) {
         int row = it.key();
         QString uuid = it.value();
-        firingWidget *widget = new firingWidget(row,true,uuid);
+        firingWidget *widgetSelect = new firingWidget(row,true,uuid);
         QModelIndex index = model->index(row, 9);
         if (index.isValid()) {
             QWidget *widgetButton = ui->tableView->indexWidget(index);
@@ -648,12 +648,117 @@ void BlastOpePage::on_btnSelect_clicked()
             }
 
         // 信号连接
-        connect(widget, &firingWidget::progressChanged, this, &BlastOpePage::updateProgressBar);
-        connect(widget, &firingWidget::updateBlastStatus, this, &BlastOpePage::onUpdateBlastStatus);
+        connect(widgetSelect, &firingWidget::progressChanged, this, &BlastOpePage::updateProgressBar);
+        connect(widgetSelect, &firingWidget::updateBlastStatus, this, &BlastOpePage::onUpdateBlastStatus);
+        connect(widgetSelect, &firingWidget::selectSignal, this, &BlastOpePage::handleSelect);
+        connect(widgetSelect, &firingWidget::updateButton, this, &BlastOpePage::changeButByMqtt);
+        connect(widgetSelect, &firingWidget::updateProjectStatus, this, &BlastOpePage::updateProject);
+        connect(widgetSelect, &firingWidget::closeFiring, this, &BlastOpePage::destroyFiringWidgetSelect);
         widget->show();
         widget->setAttribute(Qt::WA_DeleteOnClose);
+        uuidWidgetSMap.insert(uuid, widgetSelect);
+    }
+
+}
+
+
+//完成充电
+void BlastOpePage::handleSelect(QString uuid){
+    selectedUuids.insert(uuid);
+    bool isSame = checkUuidsSame();
+    if (isSame) {
+        bool successSelect;
+        serialTool = SerialTool::getInstance(nullptr, &successSelect);
+        connect(serialTool, &SerialTool::buttonPressedReceived,this,&BlastOpePage::showDownWidgetSelect, Qt::SingleShotConnection);
+        if(serialTool){
+            QByteArray data = "\r\nENABLE_BUTTON\r\n";
+            bool success = serialTool->sendData(data);
+            if (success) {
+
+                qDebug() << "Data sent successfully";
+            } else {
+                qDebug() << "Failed to send data";
+            }
+            connect(serialTool, &SerialTool::enableButtonReceived,this, [this]() {
+
+                for (const auto& row : uuidMap.keys()) {
+                    qDebug() << "Key:" << row;
+                    onUpdateBlastStatus(10,row);
+                }
+            }, Qt::SingleShotConnection);
+
+        }else {
+            qDebug() << "serialTool Not fond.";
+
+        }
+    } else {
+        qDebug() << "The uuids in selectedUuids and uuidMap are different.";
     }
 
+
 }
 
 
+// 检查 selectedUuids 和 uuidMap 中的 uuid 是否相同
+bool BlastOpePage::checkUuidsSame() {
+    QSet<QString> mapUuids;
+    for (const auto& value : uuidMap) {
+        qDebug()<<"value"<<value;
+        mapUuids.insert(value);
+    }
+    return selectedUuids == mapUuids;
+}
+
+
+
+void BlastOpePage::showDownWidgetSelect()
+{
+    QByteArray data = "\r\nDISABLE_BUTTON\r\n";
+    bool success = serialTool->sendData(data);
+    if (success) {
+        qDebug() << "Data sent successfully";
+    } else {
+        qDebug() << "Failed to send data";
+    }
+    serialTool->releaseInstance();
+    CountdownWidget *countdownWidgetSelect = new CountdownWidget(this);
+    countdownWidgetSelect->resize(200, 200);
+    int x = (this->width() - countdownWidgetSelect->width()) / 2;
+    int y = (this->height() - countdownWidgetSelect->height()) / 2;
+
+    countdownWidgetSelect->move(x, y);
+    countdownWidgetSelect->show();
+
+    connect(countdownWidgetSelect, &CountdownWidget::countdownFinished, this,&BlastOpePage::selectBlasting,Qt::SingleShotConnection);
+
+}
+
+void BlastOpePage::selectBlasting(){
+    for (auto it = uuidWidgetSMap.begin(); it != uuidWidgetSMap.end(); ++it) {
+        QString uuid = it.key();
+        firingWidget* widget = it.value();
+        QString topic = "hxgc/"+uuid+"/P";
+        QString message = "起爆";
+        widget->onCountdownFinished(topic,message);
+    }
+}
+
+
+void BlastOpePage::destroyFiringWidgetSelect(const QString& uuid)
+{
+    firingWidget *widget = uuidWidgetSMap.value(uuid);
+    if (widget) {
+        widget->close();
+        widget->deleteLater();
+        uuidWidgetSMap.remove(uuid);
+    }
+    for (int row = 0; row < model->rowCount(); ++row) {
+        QStandardItem *item = model->item(row, 0);
+        if (item) {
+            Qt::ItemFlags flags = item->flags();
+            flags &= ~Qt::ItemIsEnabled; // 去除 ItemIsEnabled 标志位
+            item->setFlags(flags);
+        }
+    }
+}
+

+ 12 - 5
blastopepage.h

@@ -4,10 +4,10 @@
 #include <QWidget>
 #include <QPushButton>
 #include <QLayout>
-#include <QWebEnginePage>
+// #include <QWebEnginePage>
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
-#include <QWebEngineView>
+// #include <QWebEngineView>
 #include <QJsonObject>
 #include <QJsonDocument>
 #include <QJsonArray>
@@ -15,10 +15,12 @@
 #include <QProgressBar>
 #include <QLayout>
 #include <QStandardItemModel>
+#include <QSet>
 #include "PageWidget.h"
 #include "hprojectdao.h"
 #include "fireWidget/firingwidget.h"  // 包含 firingWidget 头文件
 #include "countdownwidget.h"
+#include "./serial/serialtool.h"
 
 // 自定义结构体
 struct ProgressBarTriple {
@@ -52,8 +54,11 @@ private slots:
     void updateProject(QString uuid);
     void destroyFiringWidget(const QString &uuid);
     void on_btnSelect_clicked();
-
     void onItemChanged(QStandardItem *item);
+    void handleSelect(QString uuid);
+    void showDownWidgetSelect();
+    void selectBlasting();
+    void destroyFiringWidgetSelect(const QString &uuid);
 private:
     void handleFeaturePermission(QWebEnginePage *page, const QUrl &securityOrigin, QWebEnginePage::Feature feature);
     void RefreshData();
@@ -66,6 +71,7 @@ private:
     QJsonObject sendPostRequest(const QUrl &url, const QJsonObject &data);
     QJsonObject getMetaInfo();
     void handleButtonClick(int row,QPushButton *button);
+    bool checkUuidsSame();
 
 
 private:
@@ -74,8 +80,6 @@ private:
     QStandardItemModel *model;
     QMap<QString, firingWidget*> uuidWidgetMap;
     QWebEngineView *view;
-    QList<QWidget*> originalWidgets; // 用于保存原始的 UI 控件
-    QWidget *overlayWidget;
     QVBoxLayout *layout;
     QString certifyId;
     PageWidget *pageWidget;
@@ -83,6 +87,9 @@ private:
     HProjectDao dao;
     QVector<ProgressBarTriple> progressBars; // 用于保存每行的两个进度条指针
     QMap<int, QString> uuidMap; // 用于存储行号和对应的 uuid
+    QMap<QString, firingWidget*> uuidWidgetSMap;
+    SerialTool* serialTool;
+    QSet<QString> selectedUuids;
     QMetaObject::Connection connectionItem;
     int pageSize;  //每页显示的记录数量
     int currentPage;      //当前页面

+ 19 - 17
fireWidget/firingwidget.cpp

@@ -43,7 +43,7 @@ firingWidget::firingWidget(const int& row,const bool& select,const QString& uuid
     connect(mqttThread, &MqttThread::messageAndTopicReceived, this, &firingWidget::handleMessageAndTopic);
 
     connect(this, &firingWidget::lastStageChanged, this, &firingWidget::onLastStageChanged);
-
+    connect(this, &firingWidget::updateData, this, &firingWidget::updateWebData);
     startBlasting();
 }
 
@@ -228,7 +228,6 @@ void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttT
                 stage = dataObject["stage"].toInt();
                 if (stage != lastStage) {
                     lastStage = stage;
-                    emit lastStageChanged(lastStage);
                     switch (stage) {
                         case 0:
                             navProgress->setState(0);
@@ -261,9 +260,6 @@ void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttT
                             ui->pushButton_2->setEnabled(true);
                             emit progressChanged(4,m_row);
                             emit updateBlastStatus(4,m_row);
-                            if(serialTool){
-                                emit updateBlastStatus(10,m_row);
-                                };
                             ui->pushButton_2->setText("起爆");
                             navProgress->setState(4);
                             break;
@@ -294,6 +290,7 @@ void firingWidget::handleMessageAndTopic(const QByteArray &message, const QMqttT
                         default:
                             break;
                     }
+                    emit lastStageChanged(lastStage);
                 }
             }
         }
@@ -356,14 +353,19 @@ void firingWidget::onLastStageChanged(int newStage)
             buttonText = "起爆";
             break;
         case 5:
-            if (connection) {
-                           disconnect(connection);
-                       }
-            if (connectionPress) {
-                           disconnect(connectionPress);
-                       }
-            serialTool->releaseInstance();
-            qDebug() << ANSI_COLOR_GREEN << "释放按键" << ANSI_COLOR_RESET;
+            if(!m_select){
+                if (connection) {
+                    disconnect(connection);
+                    qDebug() << "Connection disconnected.";
+                }
+                if (connectionPress) {
+                    disconnect(connectionPress);
+                    qDebug() << "connectionPress disconnected.";
+                }
+                serialTool->releaseInstance();
+            }
+
+              qDebug() << ANSI_COLOR_GREEN << "释放按键 5" << ANSI_COLOR_RESET;
 
           break;
         default:
@@ -390,15 +392,15 @@ void firingWidget::onLastStageChanged(int newStage)
                     this->onButtonPressedReceived(topic, message);
                 });
 
-            }else if(lastStage == 4&&!m_select){
-                    qDebug() << "多台起爆:待起爆状态";
             }else {
                 qDebug() << "serialTool Not fond.";
                 //在准备起爆状态下 但是没有获取串口
                 lastStage = 10;
-                qDebug() << lastStage;
             }
-        }else{//????
+        }else if(lastStage == 4&&m_select){
+             qDebug() << "多台起爆:待起爆状态";
+             emit selectSignal(m_uuid);
+         }else{//????
                 qDebug() << "Stage 值变为: " << newStage<<"发送消息"<<message.toUtf8();
          }
       }

+ 2 - 1
fireWidget/firingwidget.h

@@ -38,6 +38,7 @@ signals:
     void progressChanged(int value,int row);
     void lastStageChanged(int newStage);
     void updateBlastStatus(int status,int row);
+    void selectSignal(QString uuid);
     void updateButton(int status,int row);
     void updateProjectStatus(QString uuid);
     void updateData(const QJsonObject &jsonObj);
@@ -65,7 +66,7 @@ private:
     HBlastRegRecordDao daoReg;
     NavProgress *navProgress;
     MqttThread* mqttThread;
-    SerialTool* serialTool;
+    SerialTool* serialTool=nullptr;
     QString m_uuid; // 用于存储 uuid
     QString reg_uuid; // 用于存储 uuid
     QString blast_uuid; // 用于存储 uuid