From 1a164dd24e0dcbbc5a825a0f4454c3d7d71be680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Czcw=E2=80=9D?= Date: Tue, 6 Jun 2023 17:15:59 +0800 Subject: [PATCH] =?UTF-8?q?0606=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt.user | 300 +------------------------------------- DAM.qrc | 12 ++ HTTPClient/client.cpp | 75 +++++++--- HTTPClient/client.h | 12 +- MainWindow.h | 4 +- MonitorUI/MonitorTagUI.h | 186 +++++++++++++++++++---- MonitorUI/MonitorUI.h | 95 ++++++++---- Static/DamQSS.Qss | 6 + Static/fan.png | Bin 3076 -> 0 bytes Static/fanError.png | Bin 0 -> 1709 bytes Static/fanHutdown.png | Bin 0 -> 1690 bytes Static/fanInterrupted.png | Bin 0 -> 1700 bytes Static/fanNormal.png | Bin 0 -> 1719 bytes Static/fanRun.png | Bin 0 -> 1756 bytes Static/fanRunning.png | Bin 1298 -> 0 bytes Static/fanStandby.png | Bin 0 -> 1743 bytes Static/flangeError.png | Bin 0 -> 1207 bytes Static/flangeNormal.png | Bin 0 -> 1205 bytes Static/gyroError.png | Bin 0 -> 7177 bytes Static/gyroNormal.png | Bin 0 -> 7006 bytes Static/headError.png | Bin 0 -> 2463 bytes Static/headNormal.png | Bin 0 -> 2405 bytes 22 files changed, 310 insertions(+), 380 deletions(-) delete mode 100644 Static/fan.png create mode 100644 Static/fanError.png create mode 100644 Static/fanHutdown.png create mode 100644 Static/fanInterrupted.png create mode 100644 Static/fanNormal.png create mode 100644 Static/fanRun.png delete mode 100644 Static/fanRunning.png create mode 100644 Static/fanStandby.png create mode 100644 Static/flangeError.png create mode 100644 Static/flangeNormal.png create mode 100644 Static/gyroError.png create mode 100644 Static/gyroNormal.png create mode 100644 Static/headError.png create mode 100644 Static/headNormal.png diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index 05a81d7..f8ff50e 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -401,305 +401,9 @@ 1 - - ProjectExplorer.Project.Target.1 - - WebAssemblyDeviceType - Qt 5.14.2 WebAssembly - Qt 5.14.2 WebAssembly - qt.qt5.5142.wasm_32_kit - 0 - -1 - 0 - - Debug - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{buildDir}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - 0 - C:\Users\zcw\Desktop\DAM\build-DAM-Qt_5_14_2_WebAssembly-Debug - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - 构建 - 构建 - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - 清除 - 清除 - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Debug - CMakeProjectManager.CMakeBuildConfiguration - - - Release - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=Release --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{buildDir}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - C:\Users\zcw\Desktop\DAM\build-DAM-Qt_5_14_2_WebAssembly-Release - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - 构建 - 构建 - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - 清除 - 清除 - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release - CMakeProjectManager.CMakeBuildConfiguration - - - RelWithDebInfo - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{buildDir}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - C:\Users\zcw\Desktop\DAM\build-DAM-Qt_5_14_2_WebAssembly-RelWithDebInfo - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - 构建 - 构建 - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - 清除 - 清除 - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Release with Debug Information - CMakeProjectManager.CMakeBuildConfiguration - - - RelWithDebInfo - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{buildDir}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - 0 - C:\Users\zcw\Desktop\DAM\build-DAM-Qt_5_14_2_WebAssembly-Profile - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - 构建 - 构建 - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - 清除 - 清除 - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Profile - CMakeProjectManager.CMakeBuildConfiguration - - - MinSizeRel - 2 - false - - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_BUILD_TYPE:STRING=MinSizeRel --DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{buildDir}/.qtc/package-manager/auto-setup.cmake --DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} --DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} - C:\Users\zcw\Desktop\DAM\build-DAM-Qt_5_14_2_WebAssembly-MinSizeRel - - - - - all - - false - - true - CMakeProjectManager.MakeStep - - 1 - 构建 - 构建 - ProjectExplorer.BuildSteps.Build - - - - - - clean - - false - - true - CMakeProjectManager.MakeStep - - 1 - 清除 - 清除 - ProjectExplorer.BuildSteps.Clean - - 2 - false - - false - - Minimum Size Release - CMakeProjectManager.CMakeBuildConfiguration - - 5 - 0 - - true - true - true - - 2 - - ProjectExplorer.CustomExecutableRunConfiguration - - false - true - false - true - - 1 - - ProjectExplorer.Project.TargetCount - 2 + 1 ProjectExplorer.Project.Updater.FileVersion diff --git a/DAM.qrc b/DAM.qrc index 5c5844b..83efab7 100644 --- a/DAM.qrc +++ b/DAM.qrc @@ -3,5 +3,17 @@ Static/close.png Static/min.png Static/DamQSS.Qss + Static/fanNormal.png + Static/fanError.png + Static/fanHutdown.png + Static/fanRun.png + Static/fanStandby.png + Static/flangeError.png + Static/flangeNormal.png + Static/gyroError.png + Static/gyroNormal.png + Static/headError.png + Static/headNormal.png + Static/fanInterrupted.png diff --git a/HTTPClient/client.cpp b/HTTPClient/client.cpp index fb4dbd7..53d2c60 100644 --- a/HTTPClient/client.cpp +++ b/HTTPClient/client.cpp @@ -13,6 +13,27 @@ using json = nlohmann::json; using namespace std; HTTPClient httpClient; +FanManage fans; + +void delNameFromList(QString element){ + fans.interruptedFans.erase(std::remove(fans.interruptedFans.begin(), fans.interruptedFans.end(), element), fans.interruptedFans.end()); + fans.standbyFans.erase(std::remove(fans.standbyFans.begin(), fans.standbyFans.end(), element), fans.standbyFans.end()); + fans.normalFans.erase(std::remove(fans.normalFans.begin(), fans.normalFans.end(), element), fans.normalFans.end()); + fans.failureFans.erase(std::remove(fans.failureFans.begin(), fans.failureFans.end(), element), fans.failureFans.end()); + fans.hutdownFans.erase(std::remove(fans.hutdownFans.begin(), fans.hutdownFans.end(), element), fans.hutdownFans.end()); + fans.runFans.erase(std::remove(fans.runFans.begin(), fans.runFans.end(), element), fans.runFans.end()); +} + + +bool isInLists(QString element) { + // 使用 std::find_first_of 函数查找元素是否在列表中 + auto it1 = std::find_first_of(fans.standbyFans.begin(), fans.standbyFans.end(), &element, &element + 1); + auto it2 = std::find_first_of(fans.hutdownFans.begin(), fans.hutdownFans.end(), &element, &element + 1); + auto it3 = std::find_first_of(fans.runFans.begin(), fans.runFans.end(), &element, &element + 1); + + // 如果元素在任意一个列表中,则返回 true,否则返回 false + return it1 != fans.standbyFans.end() || it2 != fans.hutdownFans.end() || it3 != fans.runFans.end(); +} HTTPClient::HTTPClient() : client("https://121.36.33.250:9000") { header = {{"GroupId", "dam"}}; @@ -24,26 +45,42 @@ HTTPClient httpClient; client.enable_server_certificate_verification(false); // 取消SSL验证 } - FanManage HTTPClient::getFanList(){ - FanManage Fans; - if (auto res = client.Post(fanListIndex, header)) { - json resJson = json::parse(res->body); - for (const auto& data : resJson["data"]) { - FanClass fan; - fan.fanCode = QString::fromStdString(data["fanCode"]); - if (data["functions"]["gyro"]["features"][0]["featureValue"].is_number() && data["functions"]["headRoom"]["features"][0]["featureValue"].is_number()) { + void HTTPClient::getFanList(){ + if (auto res = client.Post(fanListIndex, header)) { + json resJson = json::parse(res->body); + for (const auto& data : resJson["data"]) { + FanClass fan; + fan.fanCode = QString::fromStdString(data["fanCode"]); + if (data["functions"]["gyro"]["features"][0]["featureValue"].is_number()) { fan.angle = data["functions"]["gyro"]["features"][0]["featureValue"].get(); - fan.distance = data["functions"]["headRoom"]["features"][0]["featureValue"].get(); - } - fan.gyroState = QString::fromStdString(data["functions"]["flange"]["state"]); - fan.flangeState = QString::fromStdString(data["functions"]["gyro"]["state"]); - fan.headroomState = QString::fromStdString(data["functions"]["headRoom"]["state"]); - Fans.allFans[fan.fanCode] = fan; - //std::cout << fan.angle << std::endl; - - } - } - return Fans; + } + if (data["functions"]["headRoom"]["features"][0]["featureValue"].is_number()){ + fan.distance = data["functions"]["headRoom"]["features"][0]["featureValue"].get(); + } + fan.gyroState = QString::fromStdString(data["functions"]["flange"]["state"]); + fan.flangeState = QString::fromStdString(data["functions"]["gyro"]["state"]); + fan.headroomState = QString::fromStdString(data["functions"]["headRoom"]["state"]); + fans.allFans[fan.fanCode] = fan; + if (isInLists(fan.fanCode)){ + return; + } + delNameFromList(fan.fanCode); + if (fan.gyroState == QString("正常") && fan.flangeState == QString("正常") && fan.headroomState == QString("正常")){ + fans.normalFans.push_back(fan.fanCode); + fans.states[fan.fanCode] = QString("正常运行"); + } + if (fan.gyroState == QString("故障") || fan.flangeState == QString("故障") || fan.headroomState == QString("故障")){ + fans.failureFans.push_back(fan.fanCode); + fans.states[fan.fanCode] = QString("故障停机"); + } + if (fan.gyroState == QString("通讯中断") || fan.flangeState == QString("通讯中断") || fan.headroomState == QString("通讯中断")){ + fans.interruptedFans.push_back(fan.fanCode); + fans.states[fan.fanCode] = QString("通讯中断"); + } +// std::cout << fan.distance << std::endl; + + } + } } QString HTTPClient::getFlangeList(int fanId) { diff --git a/HTTPClient/client.h b/HTTPClient/client.h index f23e8d6..f9b5910 100644 --- a/HTTPClient/client.h +++ b/HTTPClient/client.h @@ -10,15 +10,18 @@ #include #include #include +#include using namespace std; +void delNameFromList(QString element); + class FanClass // 风机类 { public: int errorCode; int fanId; - double angle; // 角度 - double distance; // 相对距离 + double angle = 0; // 角度 + double distance = 0; // 相对距离 QString errorInfo; QString fanCode; QString flangeState; @@ -31,6 +34,7 @@ class FanManage // 所有风机管理类 { public: std::map allFans; // 所有风机 + std::map states; // 风机状态 std::vector interruptedFans; // 通讯中断 std::vector standbyFans; // 待机等风 std::vector normalFans; // 正常运行 @@ -54,7 +58,7 @@ private: public: httplib::Client client; HTTPClient(); - FanManage getFanList(); + void getFanList(); QString getFlangeList(int fanId); QString getHeadroomList(int fanId); QString getGyroList(int fanId); @@ -62,7 +66,7 @@ public: }; extern HTTPClient httpClient; - +extern FanManage fans; diff --git a/MainWindow.h b/MainWindow.h index b4051f6..79ec69d 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -32,7 +32,7 @@ public: QPushButton *clearanceButton; QPushButton *gyroscopeButton; QStackedWidget *stackedWidget; - Ui::MonitorWidget *monitorPage; + MonitorWidget *monitorPage; Ui::ClearanceAnalyticWidget *clearancePage; Ui::FlangeAnalyticWidget *flangePage; Ui::GyroscopeAnalyticWidget *gyroscopePage; @@ -113,7 +113,7 @@ public: stackedWidget = new QStackedWidget(centralwidget); stackedWidget->setObjectName(QString::fromUtf8("stackedWidget")); - monitorPage = new Ui::MonitorWidget(); + monitorPage = new MonitorWidget(); monitorPage->setObjectName(QString::fromUtf8("monitorPage")); stackedWidget->addWidget(monitorPage); diff --git a/MonitorUI/MonitorTagUI.h b/MonitorUI/MonitorTagUI.h index 1ff90fb..a5c2579 100644 --- a/MonitorUI/MonitorTagUI.h +++ b/MonitorUI/MonitorTagUI.h @@ -11,6 +11,11 @@ #include #include #include +#include +#include +#include +#include + #include "../HTTPClient/client.h" @@ -30,13 +35,18 @@ public: QPushButton *clearanceButton; QPushButton *flangeButton; QPushButton *gyroscopeButton; - QLabel *speedLabel; - QLabel *powerLabel; + QLabel *distanceLabel; + QLabel *angelLabel; QWidget *simplifyPage; QWidget *horizontalLayoutWidget; QHBoxLayout *horizontalLayout_2; QLabel *pictureLabel_2; QLabel *statusLabel; + QComboBox *stateBox; + + FanClass fan; + QTimer timer; + int state; void setupUi(QWidget *MonitorTag) { @@ -46,7 +56,7 @@ public: horizontalLayout = new QHBoxLayout(MonitorTag); horizontalLayout->setSpacing(0); horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout")); - horizontalLayout->setContentsMargins(0, 0, 0, 0); + horizontalLayout->setContentsMargins(10, 10, 10, 10); stackedWidget = new QStackedWidget(MonitorTag); stackedWidget->setObjectName(QString::fromUtf8("stackedWidget")); @@ -59,6 +69,31 @@ public: verticalLayout = new QVBoxLayout(); verticalLayout->setSpacing(0); verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); + + stateBox = new QComboBox(MonitorTag); + QStringList options = {"远程模式", "待机等风", "停机维护", "启动"}; + stateBox->addItems(options); + + auto it1 = std::find(fans.standbyFans.begin(), fans.standbyFans.end(), fan.fanCode); + auto it2 = std::find(fans.hutdownFans.begin(), fans.hutdownFans.end(), fan.fanCode); + auto it3 = std::find(fans.runFans.begin(), fans.runFans.end(), fan.fanCode); + if (it1 != fans.standbyFans.end()){ + stateBox->setCurrentIndex(1); + } + else if (it2 != fans.hutdownFans.end()){ + stateBox->setCurrentIndex(2); + } + else if (it3 != fans.runFans.end()){ + stateBox->setCurrentIndex(3); + } + else{ + stateBox->setCurrentIndex(0); + } + + connect(stateBox, QOverload::of(&QComboBox::currentIndexChanged), [this](int index) {this->stateChanged(index);}); + verticalLayout->addWidget(stateBox); + + pictureLabel = new QLabel(detailPage); pictureLabel->setObjectName(QString::fromUtf8("pictureLabel")); pictureLabel->setAlignment(Qt::AlignCenter); @@ -71,7 +106,8 @@ public: verticalLayout->addWidget(nameLabel); - verticalLayout->setStretch(0, 8); + verticalLayout->setStretch(0, 1); + verticalLayout->setStretch(1, 9); verticalLayout->setStretch(1, 2); horizontalLayout_3->addLayout(verticalLayout); @@ -94,15 +130,15 @@ public: gridLayout->addWidget(gyroscopeButton, 0, 2, 1, 1); - speedLabel = new QLabel(detailPage); - speedLabel->setObjectName(QString::fromUtf8("speedLabel")); + distanceLabel = new QLabel(detailPage); + distanceLabel->setObjectName(QString::fromUtf8("distanceLabel")); - gridLayout->addWidget(speedLabel, 2, 0, 1, 3); + gridLayout->addWidget(distanceLabel, 2, 0, 1, 3); - powerLabel = new QLabel(detailPage); - powerLabel->setObjectName(QString::fromUtf8("powerLabel")); + angelLabel = new QLabel(detailPage); + angelLabel->setObjectName(QString::fromUtf8("angelLabel")); - gridLayout->addWidget(powerLabel, 1, 0, 1, 3); + gridLayout->addWidget(angelLabel, 1, 0, 1, 3); horizontalLayout_3->addLayout(gridLayout); @@ -110,9 +146,9 @@ public: stackedWidget->addWidget(detailPage); simplifyPage = new QWidget(); simplifyPage->setObjectName(QString::fromUtf8("simplifyPage")); + horizontalLayoutWidget = new QWidget(simplifyPage); horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget")); - horizontalLayoutWidget->setGeometry(QRect(110, 50, 471, 241)); horizontalLayout_2 = new QHBoxLayout(horizontalLayoutWidget); horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2")); horizontalLayout_2->setContentsMargins(0, 0, 0, 0); @@ -126,6 +162,8 @@ public: statusLabel->setObjectName(QString::fromUtf8("statusLabel")); statusLabel->setAlignment(Qt::AlignCenter); + statusLabel->setText(fan.fanCode + fans.states[fan.fanCode]); + simplifyPage->setLayout(horizontalLayout_2); horizontalLayout_2->addWidget(statusLabel); @@ -134,35 +172,123 @@ public: horizontalLayout->addWidget(stackedWidget); + if (state == 1){ + stackedWidget->setCurrentIndex(1); + }else{ + stackedWidget->setCurrentIndex(0); + } + + nameLabel->setText(fan.fanCode); + if (fan.angle != 0){ + angelLabel->setText("角度: " + QString::number(fan.angle)); + }else{ + angelLabel->setText("角度: 数据为空"); + } + + if (fan.distance != 0){ + distanceLabel->setText("距离: " + QString::number(fan.distance)); + }else{ + distanceLabel->setText("距离: 数据为空"); + } + + QMetaObject::connectSlotsByName(MonitorTag); + if (fans.states[fan.fanCode] == QString("正常运行")){ + QPixmap pixmap(":/Static/fanNormal.png"); + pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio); + pictureLabel->setPixmap(pixmap); + pictureLabel_2->setPixmap(pixmap); + this->setStyleSheet("QWidget#MonitorTag{background-color: #374065;border-radius: 5px;border: 3px solid;border-color: #1AFA29;}"); + }else if (fans.states[fan.fanCode] == QString("通讯中断")){ + QPixmap pixmap(":/Static/fanfanInterrupted.png"); + pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio); + pictureLabel->setPixmap(pixmap); + pictureLabel_2->setPixmap(pixmap); + this->setStyleSheet("QWidget#MonitorTag{background-color: #374065;border-radius: 5px;border: 3px solid;border-color: white;}"); + }else if (fans.states[fan.fanCode] == QString("待机等风")){ + QPixmap pixmap(":/Static/fanStandby.png"); + pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio); + pictureLabel->setPixmap(pixmap); + pictureLabel_2->setPixmap(pixmap); + this->setStyleSheet("QWidget#MonitorTag{background-color: #374065;border-radius: 5px;border: 3px solid;border-color: #F4EA2A;}"); + }else if (fans.states[fan.fanCode] == QString("停机维护")){ + QPixmap pixmap(":/Static/fanHutdown.png"); + pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio); + pictureLabel->setPixmap(pixmap); + pictureLabel_2->setPixmap(pixmap); + this->setStyleSheet("QWidget#MonitorTag{background-color: #374065;border-radius: 5px;border: 3px solid;border-color: #C0397C;}"); + }else if (fans.states[fan.fanCode] == QString("故障停机")){ + QPixmap pixmap(":/Static/fanError.png"); + pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio); + pictureLabel->setPixmap(pixmap); + pictureLabel_2->setPixmap(pixmap); + this->setStyleSheet("QWidget#MonitorTag{background-color: #374065;border-radius: 5px;border: 3px solid;border-color: #d81e06;}"); + }else if (fans.states[fan.fanCode] == QString("启动")){ + QPixmap pixmap(":/Static/fanRun.png"); + pixmap = pixmap.scaled(100, 100, Qt::KeepAspectRatio); + pictureLabel->setPixmap(pixmap); + pictureLabel_2->setPixmap(pixmap); + this->setStyleSheet("QWidget#MonitorTag{background-color: #374065;border-radius: 5px;border: 3px solid;border-color: #0caba2;}"); + } + + + + if (fan.headroomState == QString("正常")){ + clearanceButton->setIcon(QIcon(":/Static/headNormal.png")); + } + if (fan.headroomState == QString("故障")){ + clearanceButton->setIcon(QIcon(":/Static/headError.png")); + } + if (fan.flangeState == QString("正常")){ + flangeButton->setIcon(QIcon(":/Static/flangeNormal.png")); + } + if (fan.flangeState == QString("故障")){ + flangeButton->setIcon(QIcon(":/Static/flangeError.png")); + } + if (fan.gyroState == QString("正常")){ + gyroscopeButton->setIcon(QIcon(":/Static/gyroNormal.png")); + } + if (fan.gyroState == QString("故障")){ + gyroscopeButton->setIcon(QIcon(":/Static/gyroError.png")); + } + } // setupUi - retranslateUi(MonitorTag); + void stateChanged(int index){ +// "远程模式", "待机等风", "停机维护", "启动" + + switch (index){ + case 0: + delNameFromList(fan.fanCode); + break; + case 1: + delNameFromList(fan.fanCode); + fans.standbyFans.push_back(fan.fanCode); + fans.states[fan.fanCode] = QString("待机等风"); + break; + case 2: + delNameFromList(fan.fanCode); + fans.hutdownFans.push_back(fan.fanCode); + for (auto it = fans.runFans.begin(); it != fans.runFans.end(); ++it) {qDebug() << *it;} + fans.states[fan.fanCode] = QString("停机维护"); + break; + case 3: + delNameFromList(fan.fanCode); + fans.runFans.push_back(fan.fanCode); + fans.states[fan.fanCode] = QString("启动"); + break; + } + } - stackedWidget->setCurrentIndex(0); - QMetaObject::connectSlotsByName(MonitorTag); - } // setupUi - void retranslateUi(QWidget *MonitorTag) - { - MonitorTag->setWindowTitle(QCoreApplication::translate("MonitorTag", "Form", nullptr)); - pictureLabel->setText(QCoreApplication::translate("MonitorTag", "\350\256\276\345\244\207\345\233\276", nullptr)); - nameLabel->setText(QCoreApplication::translate("MonitorTag", "\350\256\276\345\244\207\345\220\215\347\247\260", nullptr)); - clearanceButton->setText(QCoreApplication::translate("MonitorTag", "\345\212\237\350\203\2752", nullptr)); - flangeButton->setText(QCoreApplication::translate("MonitorTag", "\345\212\237\350\203\2751", nullptr)); - gyroscopeButton->setText(QCoreApplication::translate("MonitorTag", "\345\212\237\350\203\2753", nullptr)); - speedLabel->setText(QCoreApplication::translate("MonitorTag", "\346\225\260\345\200\274B\357\274\232", nullptr)); - powerLabel->setText(QCoreApplication::translate("MonitorTag", "\346\225\260\345\200\274A\357\274\232", nullptr)); - pictureLabel_2->setText(QCoreApplication::translate("MonitorTag", "\350\256\276\345\244\207\345\233\276\347\211\207", nullptr)); - statusLabel->setText(QCoreApplication::translate("MonitorTag", "\350\256\276\345\244\207\347\212\266\346\200\201", nullptr)); - } // retranslateUi - - MonitorTag(FanClass fan) + + MonitorTag(FanClass fan, int state) : fan(fan), state(state) { setupUi(this); } + }; diff --git a/MonitorUI/MonitorUI.h b/MonitorUI/MonitorUI.h index aeb5b59..c121219 100644 --- a/MonitorUI/MonitorUI.h +++ b/MonitorUI/MonitorUI.h @@ -12,13 +12,17 @@ #include #include #include +#include +#include +#include +#include #include "MonitorTagUI.h" #include "../HTTPClient/client.h" QT_BEGIN_NAMESPACE -class Ui_MonitorWidget:public QWidget +class MonitorWidget:public QWidget { public: QVBoxLayout *verticalLayout; @@ -37,6 +41,7 @@ public: int state; QList> tagList; + QTimer *timer; void setupUi(QWidget *MonitorWidget) { @@ -90,31 +95,38 @@ public: filterlLayout->setObjectName(QString::fromUtf8("filterlLayout")); interruptedButton = new QPushButton(MonitorWidget); interruptedButton->setObjectName(QString::fromUtf8("interruptedButton")); + interruptedButton->setIcon(QIcon(":/Static/fanInterrupted.png")); filterlLayout->addWidget(interruptedButton); normalButton = new QPushButton(MonitorWidget); normalButton->setObjectName(QString::fromUtf8("normalButton")); + normalButton->setIcon(QIcon(":/Static/fanNormal.png")); filterlLayout->addWidget(normalButton); standbyButton = new QPushButton(MonitorWidget); standbyButton->setObjectName(QString::fromUtf8("standbyButton")); + standbyButton->setIcon(QIcon(":/Static/fanStandby.png")); + filterlLayout->addWidget(standbyButton); hutdownButton = new QPushButton(MonitorWidget); hutdownButton->setObjectName(QString::fromUtf8("hutdownButton")); + hutdownButton->setIcon(QIcon(":/Static/fanHutdown.png")); filterlLayout->addWidget(hutdownButton); failureButton = new QPushButton(MonitorWidget); failureButton->setObjectName(QString::fromUtf8("failureButton")); + failureButton->setIcon(QIcon(":/Static/fanError.png")); filterlLayout->addWidget(failureButton); runButton = new QPushButton(MonitorWidget); runButton->setObjectName(QString::fromUtf8("runButton")); + runButton->setIcon(QIcon(":/Static/fanRun.png")); filterlLayout->addWidget(runButton); filterlLayout->setContentsMargins(10, 10, 10, 10); @@ -128,33 +140,46 @@ public: MonitorWidget->setLayout(verticalLayout); - - retranslateUi(MonitorWidget); - QMetaObject::connectSlotsByName(MonitorWidget); + retranslateUi(MonitorWidget); addTag(); + timer = new QTimer(MonitorWidget); + QObject::connect(timer, &QTimer::timeout, [&]() { + // 计时器超时时更新标签 + addTag(); + }); + timer->start(5000); + + connect(exchangeButton, &QPushButton::clicked, this, [=](){this->exchangeClicked();}); + } // setupUi void retranslateUi(QWidget *MonitorWidget) { MonitorWidget->setWindowTitle(QCoreApplication::translate("MonitorWidget", "Form", nullptr)); exchangeButton->setText(QCoreApplication::translate("MonitorWidget", "\345\244\247\345\260\217\345\233\276\346\240\207\345\210\207\346\215\242", nullptr)); - interruptedButton->setText(QCoreApplication::translate("MonitorWidget", "\351\200\232\350\256\257\344\270\255\346\226\255 x\345\217\260", nullptr)); - normalButton->setText(QCoreApplication::translate("MonitorWidget", "\346\255\243\345\270\270\350\277\220\350\241\214 x\345\217\260", nullptr)); - standbyButton->setText(QCoreApplication::translate("MonitorWidget", "\345\276\205\346\234\272\347\255\211\351\243\216 x\345\217\260", nullptr)); - hutdownButton->setText(QCoreApplication::translate("MonitorWidget", "\345\201\234\346\234\272\347\273\264\346\212\244 x\345\217\260", nullptr)); - failureButton->setText(QCoreApplication::translate("MonitorWidget", "\346\225\205\351\232\234\345\276\205\346\234\272 x\345\217\260", nullptr)); - runButton->setText(QCoreApplication::translate("MonitorWidget", "\345\220\257\345\212\250 x\345\217\260", nullptr)); } // retranslateUi - void exchangeClicked(MonitorTag *newTag) + void exchangeClicked() { - if (this->state == 1) { - newTag->stackedWidget->setCurrentIndex(1); - } else if (this->state == 0) { - newTag->stackedWidget->setCurrentIndex(0); + int count = monitorLayout->count(); + + // 遍历布局中的所有子对象 + for (int i = 0; i < count; ++i) { + // 获取第 i 个子对象的指针 + QLayoutItem *item = monitorLayout->itemAt(i); + MonitorTag *tag = dynamic_cast(item->widget()); + // 判断子对象的类型 + if (tag) { + if (this->state == 1) { + tag->stackedWidget->setCurrentIndex(1); + } else if (this->state == 0) { + tag->stackedWidget->setCurrentIndex(0); + } + } } + } void changeState() @@ -168,27 +193,35 @@ public: void addTag() { - map fans = httpClient.getFanList().allFans; + httpClient.getFanList(); + map allFans = fans.allFans; + // 获取与 clicked() 信号相关的接收器数量 + + while (QLayoutItem *item = monitorLayout->takeAt(0)) { + if (QWidget *widget = item->widget()) { + widget->deleteLater(); // 或使用 delete 关键字删除控件的内存 + } + delete item; + } tagList.clear(); int count = 0; int index = 0; QList tags; - for (auto it = fans.begin(); it != fans.end(); ++it) { + for (auto it = allFans.begin(); it != allFans.end(); ++it) { if (index == 6){ tagList.append(tags); tags.clear(); index = 0; count++; } - MonitorTag *newTag = new MonitorTag(it->second); - connect(exchangeButton, &QPushButton::clicked, this, [=](){this->exchangeClicked(newTag);}); + MonitorTag *newTag = new MonitorTag(it->second, state); monitorLayout->addWidget(newTag, count, index); tags.append(newTag); index++; } - if (fans.size() < 28){ + if (allFans.size() < 28){ fillWidget->setFixedHeight(228 * 4); - for (int i = 0; i < 28 - fans.size(); i++) { + for (int i = 0; i < 28 - allFans.size(); i++) { if (index == 6){ index = 0; count++; @@ -203,12 +236,22 @@ public: monitorLayout->setRowStretch(3, 1); } fillWidget->setFixedWidth(1900); - int c = monitorLayout->count(); - qDebug() << c; + setButtonMes(); +// int c = monitorLayout->count(); +// qDebug() << c; + + } + void setButtonMes(){ + interruptedButton->setText(QString("通讯中断") + QString::number(fans.interruptedFans.size())); + normalButton->setText(QString("正常运行") + QString::number(fans.normalFans.size())); + standbyButton->setText(QString("待机等风") + QString::number(fans.standbyFans.size())); + hutdownButton->setText(QString("停机维护") + QString::number(fans.hutdownFans.size())); + failureButton->setText(QString("故障停机") + QString::number(fans.interruptedFans.size())); + runButton->setText(QString("启动") + QString::number(fans.runFans.size())); } - Ui_MonitorWidget() + MonitorWidget() { setupUi(this); } @@ -219,9 +262,7 @@ public: -namespace Ui { -class MonitorWidget: public Ui_MonitorWidget {}; -} // namespace Ui + QT_END_NAMESPACE diff --git a/Static/DamQSS.Qss b/Static/DamQSS.Qss index 643a052..0428ba8 100644 --- a/Static/DamQSS.Qss +++ b/Static/DamQSS.Qss @@ -21,6 +21,12 @@ QLabel{ } +QPushButton#ClearanceButton, QPushButton#FlangeButton, QPushButton#GyroscopeButton{ + +border: none; + +} + QPushButton#monitorButton, QPushButton#flangeButton, QPushButton#clearanceButton, QPushButton#gyroscopeButton{ color: white; diff --git a/Static/fan.png b/Static/fan.png deleted file mode 100644 index aa5474ddbbf2f1612190f595bdd6f0802e7a332f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3076 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%0AM&A>?MF+^8i;0u$KS=0K+@~B>{{yfVRs<2rvvn zE&=pd3HS;Di4NeJd2gj40Ej4_r!W8j0D$43zgill1oT)5xKRKA5Z~x-0GLkz4Z}x@ z-XRB|SgErylqL{DKxa$u)PvxUh6DuZwdL0*tXNx*Px?YR>*H<_dst zG%UF2a=HBT68ER+y5s|1WPgpR8vv;10=?A#3k2o?m>oZkAGTS3PONbtBxj*cJ})^7 zuq@331f~^$D*H*69sEYnECAKcck)!wEC3}(!Ba|LITV-$peFWjK>z@qBz)^>mYf2D z0(9u;)RX}L&6##XK*331C;$zb(~Npa^djY&wgOmrYS^U$#JYRiL`^dZ+?JR|p7<&YUEk3ILAW z@71CygU^Z*IRQLh>-l6*>Qqpv^H&EiPWd~7(*VGg`#k`t(n~!lECuGw*~xx(emDS< z#@(EC6WMVZ^P>XVqT_Zb0Ft{tW-N)=OU@k%ymbaOI0OKVU3F)Fq0>B^tiOPP;b=8z z4uJNq&n0suPEw!qfo~;i20)8luf3bJLC~ImqTf-nCwSknW;pHjNaQY552-4E_O1^* zhVp~Y#Td&Y+>~)R*9zCrOb}bCff@j{jgwu1ce-_Z-=jE;yZd&VOVn+c8Yh&QZ++BY7Wx23HK=tQz~U3C9$G9NXzj@D8P2j(jZ8Mgkl8{i}#tw zuvB<*oZ9Z+G-=?;U`uUIMdMAP2yScDoe-mUZm?A}Y34 zjtZ~>w|oTvT#QaWo(sT{&7jt%^q~O6{>9q( zUh)6{kl1nnptTk$-j7oPo~0eEXpUExh5|qVTCsNAeV_no+nZMaZWCxRmF7|G;6 zoy`NlZ2~PO^3n@14?sx|AV2^B&ZJWnb14PDOEbv60u(fXJe7g~U`Jg%G=l&D0H_GC z9elN<2Y?XJfnzCCEbRdR0E%@x7*h*?hh~uJ9H6ubH$CjXb_!llr#XAn?WWOK&lDkp&9fWP}~x|inE!q00000NkvXXu0mjf Dqs-5D literal 0 HcmV?d00001 diff --git a/Static/fanHutdown.png b/Static/fanHutdown.png new file mode 100644 index 0000000000000000000000000000000000000000..3970578a3a37fa7f5da2965c8a574ad13be6500f GIT binary patch literal 1690 zcmV;L24(q)P)Px*R7pfZRCr$Pok4QjFbqYho+??zxtC{}%;a8mR>`TV4qYoF%cKO5fJ6d6+sGCP zJbr**v^@l;f1gk1-{TNY!x%0v-yiQz!w?3K6aVvcJ`F?oGoSnE>%(O%Tu%D(e2&RK z0f69B0WQzyF{OMSRluDBq~w2s0RT8?2vYJ7030NKnqp4=-ym{LZxGMo`07MA9 zl>q>-P(J`*xE!oCfL{9mR|>G!00IERD}UAiJ{UmDX`=)f24SlK^tco7Rsxa^;GB7H zTR{MjP&`j%00000!$p5KHOdyy<4(Yh0sw&YLU#ke?F7&pMeoo9P@>e?H53yFC7`pU za)wLs0000dqMcpK0lH!r|N2><~3#Q^}&0~pf!%v3lJf=~hs^1yiz1ONcQ zH3HZL7y6G*UUJiyr0iXcx6yUnIkKYkI%{+c*@ba5O;R6`sB0drP8^Y(7 zxf8F8Q}^<9aV|=LF_uNA0{}$B+25PF0w5j@iz)gQ!pp4gU#5P*i|o%abprtPT%ecj z-vohq0B(tojosbv18j*k4uot)sFVMfoCTPs<^clJ3P6?p6_(9^M$jw(0?BuAFvKhX zB}c(?N?^GZm<6Dw_AfyI0G%{^^I?`e0fYi{nCRS)0RSzTmP-Kp7#I|Q22C?p%^JOj z?V7d%Sb1vLr2?efy=9}O*#s`Pm_0X%T>%gSe|wPg@RhHrBnYWMN?jg)d8F582;Bfc z*w<^6fus|-23Bt;iJAw1^DswR1yaeRIE+21LDK*bR{dQ=TAHv_SDQ;Br>yhA6aXB#U)zi30)A7JhZDfJ_qv`8%AE=-P5#fpi$*_b z)C>SzxnBc-D!tT`!ct(yF}Kzv9u9zHaPQ8#39UGd@lgTY!*M$l0LfLK3YJ9eW%Lg0 ze6^qkhXA0lsuIx`InBfA`q>2h|Af-pk*AS&2S9t(hY(hqxsoL9Fy_O)m25Wv_E`1W zt4SLK?eQo5j*=C@eT}uiY0pQZccJD;RROeDeOxh=4}4C+m>%Kgg2Q>Q_#T=K;$CW? z20*QGvO#dxty_B?C1Kpvw_z?(7h?8cllD*7r~sfSkwuB0qD$%Mxd6=7WgG(Omr1!) zXl@rp0Z^3us>JUBfHnwPB|!`TCCL{_{GI?PgCOE<+&QLPIZ9nGE&1H$jyea;5|A5% zbZp{%O3ReWHjvU-Q4^$<_#+fxIcI4Qq)I|@2@tIJ;?7+PIBJQKTwU5~DFHzd0MuY^ zZROUUzf)C%dL4Dl5<#VmNpkyG11%c>Y9LpFu*-^H-k(~k_5xthEancWP*}QNQwjkK zfSTlM*Y~YRQ30q4=GGXt{$JZClt91&fD^>qWDi;GsX$Y90MqMA0=bo3&i`vb;EtUO z0O|8~N3ZtY0a%m=uDi(c3M2t&X0=-ZV4BC;C!$hw<){D)fLZ5yy>IN|xlhnIQYd+C zPbFY&-jv;g8UT_B+55e$05FeR1_r$nuy@j=?#JD|a8{7i7>{}%RtY$2khS;acGY`( z0k!k1dA$n&xZ76%P=i#1ujK-8q#3k#_`E0p$-kHf-%B3=05VGs0PL+riudDe0b8+y z6~l4&)=&T_z+S8!cONJ~KKAAnfNKIxq0&5xecV!byt8=#xF*mPA}?Nmc>qd0fCvEq zXi29k#!?D^7c&04fS>2QMx008j!tNGxTDr5*qPphUNW zYia@TU<$M%Juv1+4>6Yyx>{1OWgPpvTHZ z8*_~Z00p4Mxaq3^z;=4fmVjCh01B`TPt#XO0btz>GOGZ!CXg31$SeQ?CeXxyX*0+& z0M#CVhduxR5IPylZXf^v0E7s1c!`7ufD+JQ;(t1~=QDZ$LjFva04Wau3P2#J#Y?0C kuxtjIQ~)Ux$b%X54=L%@u5NFq&j0`b07*qoM6N<$g6#6l(f|Me literal 0 HcmV?d00001 diff --git a/Static/fanInterrupted.png b/Static/fanInterrupted.png new file mode 100644 index 0000000000000000000000000000000000000000..42c0c5cedb4a9bbce51b57ff3674406fed7921a1 GIT binary patch literal 1700 zcmV;V23z@wP)Px*UP(kjRCr$Pom-OJFbGBMl_j&XOjed;WlpI}p7OZ$0EA=-?o`cJ`ys*61!3B~ zZ%+S?70-Q&cM;|PxbbDjIX?=EfOa?;0f1m_0`zWxA!BPlqJ z<48@{BLwagASM4N3;@7^3Zώ{`ImMj($Im~#?Fc-EfMoplssaGurheY?09OE% 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 Lr_+5$X6F9@TH)YU literal 0 HcmV?d00001 diff --git a/Static/fanRun.png b/Static/fanRun.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4ea193a2753e72ca09fb21a170389c4b730e88 GIT binary patch literal 1756 zcmV<21|#{2P)Px*mPtfGRCr$PolSb8eF-St#Abnld zKLP3GlMvY61*d=e)1TiVoDU)FzP^vIA5P5>b{;#vKm9p`aQ=JW_wVDIOIx_?^#1fY zIR5|uf>#CjJjayJqYAiFfSCMGFaQ7t2|-N$0e}O?PhH%f;_`nzzI*pJBXAf3QUHYD zEersFC-nmWhQmQB0rZ*&xKe;r0tf&MkNmp?a8>|%?lwYzVGzN>Pyn+b|Dj{!4xo2RZxI40R_g2=N)ZSl zpfjg(noFGl4EKZra4g%&xf}pIEektJ0@KUDUW-8hAgW+~s(}C?9>Tu9k8dxXM7N@5 z0)Pecc}WBT001abkZvyK%>w*P1zjirXC1&>F$e%41aza~;)X&2mQCkH0ftAxNee*; z0pfAi?uDF%AOO&=AH^*L0PaJ;{Cxm9notPJS*WAqPyi?ZVLSM;i%U(6DLbth<*#&ZcX%6~M}> zVV4RJtL{C=>5>A_GvD)jKYn_)=NzFc0LI0fVIgPsq;Jd#N-7Xjm&lh#`dmZk1^~jl zertq*XeBW7?ZK{|C~6)6&SH+f3e2m3vcFE*dX!|+dC+2SIbFaQvh(}J~b0vGWe({ksZL7yIpn$E$s@DI{((rHr1dR z0QhpBLV#v$#!lfw2xs=Dl6VW-T3y^60Ig9!H#QA|TurM^`*hltYdhumrU2-U`gwOX zVlN|ipx8T`v%es{>Gb)aQ~piHlZf^Jbr^Sq*@7 zMt$AUR3C)8?T=PFBqM@*jWxs7?vF<9LiJHq1*kvjcf+Dk_JPmI7}FAN!Z_r64fm*= zAg=OwdNlyb3nxj27prxtt0)fRj=oHBi8>IM&QnQblNFQF7RIixD3Kz^-xMJKx;QQX zkLtpEAvN9h^@>NT3Q$q~I zs3Q#lOKs4%jqdl1iUFV`R#XQKpKRr1_4NB*&)foldWxVE62t%~#{1+lEZ512kvOdA z4SV^Lf7%N0{A0R`P!53z0Ht`pisSD_APIoAJ{+w%eJp{N4S<64S9Sbd0vOrJ8xw=_ zQI%7f`{P<5NFiVWQ0Dx)@jYjBPOc&~X08pn?dwF8SU}nRK5r_T_-VQ z&bgf9B_MFy&IN$@yxq2=y>|c#XAZ1dfhGXWjCLykJSMQ0SKE=keaKM(CIG|hRxj_@ z8~-lv*JG`qaimc5TuKd~l@O5XHzjGT27snR*1ne&00=XPdLdwKr)m8jclN>=L0WCx z>OQOxuvH^Vf0v(CuUiW!?O)0DP5|IeUjaY~RLxz>DFXG72x=PGivkeq7dO*-$pZku z!f*lrnmV)by*N`qgn*5mRpaLYz_L{l0uTafjJbC1$t?oiT3&A}c01My!Mp7lSMVP+SA>FcSa(*&M+3svrOW00awkc#1|103o15$4^ZL05s>B y3;|k2ASeJ0qUO%h2Eg*pAgc004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00002VoOIv0063uBQgL0010qN zS#tmY0AK(B0AK*{YeLTe000McNliru=LQ7~2`rThs>T2S1b0b9K~#9!?VC$z6iXC_ zPfZfzIA-#4d`3aV7lMzC7!+ZU1OjdpOja($g$p-9Tm&~}6F0grf+&h01mZ#^i?|To zNx+4#NR;>lV-_=nF($^5#4+{VMc>@qo>zB_cE#!Z&@fe9kN^B#b?Q{tw1`1KTbs%L zjRIX)2U^3XO{Te+5rDgQ0ieCzG#3NLS60H$pOyeaLl6j<;$o=dXjG)A$od_Lh-};D zGXeJR&z~-M0ru>%r}yqPC4lDurO@BLVMAY^X_ftt5+hin7u$UDN<1(vU8`%z<>(;d(FYD#^*?>G@_Kq;;X-I{cioo$@Bxk;Ga`f)%U`(y zsg!%ehlioLd5W+#0;cK@3{1DZYZvtPx^MU0J9K@$hflq!2}VX{W_W8WX)i+2H8s;^ zQmOwtI&^U{G&e&c;l7`nH(~kmKWKO;guZ^=H6Q){J)As=4u`Y1S6geZuxeH2NGmUg zwl?>^B^E>fffFXEs)8p^oC$pW3Z0$M(BO313yqETy1RGhE?ZFnr%yvX?#$uG4>)n+ zHyU4Ejehnl$79y;@+Dlp3y(sO{d9LbJIj_9w_J+z-`=-R z)cyM+4}NI$M=MDkaj@CDPS}Ua~|~eZ5FS zgGgPS$g*Yj(r3@Y@UT)>ug*#UrK}Er$;iA&H`rMKyBLXtNN1;YiJ&79ku6(9ZQd;M zufruAhEPbUWb*g(pC!0a;F(rWKK$n(gZido!hlLDl?~snk zN%VpRCiobb0@)m1ARsC;7%EHw$l>vs*-G&D3ZQa0JQuM*VF-|O&7T)wUI2d!V8{u2 z3J8UA@8A*%6P!FA0r{SCbu}znRM-MI4s-9PfwuxUt@Q@{z#N(aVk8)vTLKjP6u@EM zKR*QuT>w>6lfOU#2Se7EV$Np^Ui0#91h|^tWo2k@zZ)o?eG_gGj|+{B&gFdcUm;%s z&YZDMi=D2cN4@0b;S|`g;lERxyjZ{9O94Dw2Hh@k-Y$jz0FI`LV!6lhp#T5?07*qo IM6N<$f}RsW@c;k- diff --git a/Static/fanStandby.png b/Static/fanStandby.png new file mode 100644 index 0000000000000000000000000000000000000000..3592b2440307b7166a662b793cc616546858ca73 GIT binary patch literal 1743 zcmW-hYdDk%8^`bGnHe)pj6;Yq7J#T5>|?^Gk7k?!JP>v8q$LZNN+kb&g&>{>nM3+1^fO1(DDZFrJm zVTP+t)sxa!HY$8RS`)x@)7^f%Kl9RuWqt2xqr};jPwSjbPNKDiq zEgTSU@Y0mBcRp_zMDf}lkwn)pQ#eX$yM{nD%NqR5Xb-ipv&(RjT%8LjbQ$kxA#DuM zOUsn;Q%dzf=dNf?=;Bkq!)E*AeaI+=y^AH|#1AV`HiGQSbP-EFUZev+a*wixW7=4Y zyL`Jn#ioYszs}0AAt9OOIsfr>l>!LY9UE<@fyHZ7Gz}n#l_LSzEYX8Ub-O0l7B~I< zPcR;|k`URtSZ^{4z`aL%xxGi5s6-?Zf(N=kQzBmo#zPQ>9l&qy6u@W#?y%GKhy;b- z8)Z{v{J6w{qcUQuY(h2J0FTQ5b6E(cOI?wJ;J)irP*w+IcAvan1%y~mv6?q&L9SAQUzyLwzej< z7Nyh7)t59kXY*PRERG@U+t|4UP1>j1)YMgX)~Ag6+${-2JGNrTbliY978|TaH&8_@ zYSn|@d^?g7i0H(0aC~iBA%I5U9Qb91<)?^cjdtP@Fv(gfj4=+vk;ua0GJjtQFbSek zkgaS13#cZo&GR#bo%1vKjp(U2rlD-a?sfZx())MtjN5s7+Uds;gG=v^shE$1ZCwAI zUWRJ?-283krq{YmK0@ElXgaDyI*Fc4j<2pcoDnSzLB>v}33feCbrhcE4*8A1-JtCY zR{8VQEH9NvP3?#E@RWfR_Zux{WfsX((n^w7&7-0Xn$E?$$;A-BX>nw@)bLkzg_#Zf z(#|E`hXB?`4;FuUHfhmQDjEkT7e}C&T9CjtTV}Z!)PK}<5z(O1yVK;5LW+kcvn-jN z$XqRqNc;i*6_glUEmw29=m@L7(CzeB_XC@p;~>oQ90}x_zwCOx5qYMjf$BlDi64%6 z`#G;^S~hIkDs0`eHUx(9R>$gGRPYPm(&VeiFf3Vasg^FfM!n&I2#Z#y{$0|xWUk^r z{xp-Cw)ACgrm}41kHH^QOBym<8Xim7{4^QRKJ_`|?byxK06NwdpE$yJ&M6*&%wFni0WX9R3i@Q?5(BtiB0?JEh#A$*hIb@k3TjrJT~MS$#cn!Eb;irF__~P`NXdN39A$ z!tdxlqg1k3-;ZbSMs{Ozvln~TZ&g;nEhXdEX+x{8EHsFyBGC4!5nEq|N-O8rqIo;| zJ=_Dc5&YYjVByFf7~72Y`D1Mu(RrY?6hcUWk3o$-$OQiB3zZWkH4z>dLBM>!ac-jL z(}Gcq(2T7U8^+Y|``NTEuJ#U3rWUwS&I>`_$b{(f)n6YUEE-wqVhyXg^Juv?JZO}{qz*y>d}D*WHx+1xK#M8JBt02&&c zYb*!k!u4nT93#(Ih~-SE=pKt+utDB69)1iWO=0N4tx!?)9cwoi^CZ5qH7G(anKx=a=$-1Y+a} literal 0 HcmV?d00001 diff --git a/Static/flangeError.png b/Static/flangeError.png new file mode 100644 index 0000000000000000000000000000000000000000..061828200333861d32d56c064af4af021d2190c4 GIT binary patch literal 1207 zcmV;o1W5adP)Px(aY;l$RCr$Pn_p7gFbs#2ot9Iyyq2D#a5Bot*q);FmG%_0vt}GHV;ueY0Z<$^orRu_!|**nx)qF70lYZ=Y&7%{KbB#v4Pq4lU5;0B zk1AzN5Q_o)IzPKkkrhvApHjM!g5TZwS;BG{hMd9{D`F9VyU!nQ)qo~>lG6U-_unha z$tZ*YywjSm3qY3qIF8pL=W_-)9Ii;(3qu%&;o|^ z4QuDJ=FzqboeKdFqdnZywSm;AdW;7-t6ziw?Q;QW(#Ou!sS+6V3O0B?1JGyyqNI{LNOx*?`{h9!*d`yk&t{Z}R-Kt70 zTU7vFnM(n9@39IhvWLAb;1yvy0Ow#r_UDq-FOCt=WFGB3A^`HjY@h|9_q@<5f`BF} z3jrW6EQYp~AnpwW`T-h*C}atOsDR$Xh=sU?+9{`|TjF(o78jAr0>^VJv zfUy)nWJ^i$tSbi4Rop}YP3t`ZKuV{Z0wBbrIlPrI4ahVm`7r=~fmzx)qFW$8M-)lz zK>(({g7Hzqs>vggZ6R2lXzwGbR?l>8fu#o@vSQTv+7=0dc|a0^@=O88ti!E%Ku@Hh z0}=rcsl!774W>kI1?w9mp|8@)Ha_lg*a)a*AHje}m7)dDbpW)Vt>8Jm$k$v+pd8e{ zP~Ows6P)C4G&t6ZB{YC~5VUNx2!NO3P;sTg5Ex6p34O=86?Py?$3HG9n(TEZ-{7D^#C{wfS#?r0}WYyE3M(W zA37fbph3`9b!m6VD{R#AA>e!%fCizgOuj9auf=O0D3&UK9KIsktP6mf*9|MZlvIXx zRglIVWD6V$g3=3mB}!Bft{#K3ul?x;;1x<1bqhlH5VgSh?k#|8aA!M|8>U(ElQEGC z*v_YR5-(N(P$mkm9JNq*j>Zx)#iA`BO|T`1H61UuuMVJAME-ZQZ}$pnJ}EwJjlI_f zC#x+zvl)OkPL$uL8sW*S*Z*~{ayI|Dy@B5Apf~O)06Zg3`S*7Kr=CvS@Cd|1 V>~88$_YD95002ovPDHLkV1nJABbWdH literal 0 HcmV?d00001 diff --git a/Static/flangeNormal.png b/Static/flangeNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf5ecb5875decbd5585be7178775f82f58a9f99 GIT binary patch literal 1205 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 wzPG$x%yRyBTV<;46V$C6E06zw`004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv00000008+zyMF)x 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 literal 0 HcmV?d00001 diff --git a/Static/headNormal.png b/Static/headNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..8b806e4d6588548773ce966d438c82880ae330c1 GIT binary patch literal 2405 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 XR;Cqo9U-^x00000NkvXXu0mjfh(VO5 literal 0 HcmV?d00001