2024-12-17 18:53:41 +08:00
|
|
|
|
#include "mainwindow.h"
|
|
|
|
|
#include "ui_mainwindow.h"
|
2025-02-10 10:48:43 +08:00
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QList>
|
2025-02-11 19:54:22 +08:00
|
|
|
|
#include <QJsonDocument>
|
|
|
|
|
#include <QJsonArray>
|
|
|
|
|
#include <QJsonObject>
|
2025-03-13 15:10:35 +08:00
|
|
|
|
|
2025-02-11 19:54:22 +08:00
|
|
|
|
#include "keyphase.h"
|
|
|
|
|
#include "singlerelay.h"
|
|
|
|
|
#include "tachometer.h"
|
|
|
|
|
#include "seismic_monitor.h"
|
2025-02-13 10:50:09 +08:00
|
|
|
|
#include "setpoint.h"
|
2025-02-11 19:54:22 +08:00
|
|
|
|
#include <QMessageBox>
|
2025-03-01 13:40:11 +08:00
|
|
|
|
#include <QFileDialog>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <QSysInfo>
|
|
|
|
|
#include <qsettings.h>
|
2025-03-07 15:36:02 +08:00
|
|
|
|
#include <QNetworkProxy>
|
2025-03-04 16:00:19 +08:00
|
|
|
|
#include "relaysetting.h"
|
2025-04-07 19:30:10 +08:00
|
|
|
|
#include "config_mgr.h"
|
|
|
|
|
#include "vibrationdata.h"
|
2025-03-13 15:10:35 +08:00
|
|
|
|
|
2025-03-04 16:00:19 +08:00
|
|
|
|
QString g_strServerIp;
|
2024-12-17 18:53:41 +08:00
|
|
|
|
|
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
|
|
|
: QMainWindow(parent)
|
2025-03-29 18:05:12 +08:00
|
|
|
|
, ui(new Ui::MainWindow) {
|
2024-12-17 18:53:41 +08:00
|
|
|
|
ui->setupUi(this);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QMenuBar *menuBar = this->menuBar();
|
2025-03-04 16:00:19 +08:00
|
|
|
|
this->setMenuBar(menuBar); //添加到对象树
|
|
|
|
|
menuBar->addMenu(ui->menu_tool);
|
2025-03-11 16:42:00 +08:00
|
|
|
|
ui->widget_body->setProperty("flag", "title");
|
|
|
|
|
ui->menuBar->setProperty("flag", "menuBar");
|
|
|
|
|
//关联事件过滤器用于双击放大
|
|
|
|
|
ui->widget_body->installEventFilter(this);
|
|
|
|
|
ui->widget_body->setProperty("flag", "body");
|
2025-03-29 18:05:12 +08:00
|
|
|
|
ui->statusBar->setProperty("flag", "status");
|
2025-03-13 15:10:35 +08:00
|
|
|
|
// 创建进度条
|
|
|
|
|
progressBar = new QProgressBar(this);
|
|
|
|
|
// 设置进度条的范围(0到100)
|
|
|
|
|
progressBar->setRange(0, 100);
|
|
|
|
|
// 将进度条添加到状态栏
|
|
|
|
|
statusBar()->addWidget(progressBar);
|
|
|
|
|
progressBar->setVisible(false); // 初始隐藏
|
|
|
|
|
progressBar->setFixedWidth(300);
|
2025-03-11 16:42:00 +08:00
|
|
|
|
//this->initStyle();
|
2025-03-04 16:00:19 +08:00
|
|
|
|
//添加信号槽
|
|
|
|
|
QObject::connect(ui->action_realy, &QAction::triggered, this, &MainWindow::onMenuAction_relay);
|
2025-03-13 15:10:35 +08:00
|
|
|
|
slot_no = -1;
|
2025-02-10 10:48:43 +08:00
|
|
|
|
btnGroup_slot = new QButtonGroup(this);
|
2025-03-11 16:42:00 +08:00
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot0);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot1);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot2);
|
2025-02-10 10:48:43 +08:00
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot3);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot4);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot5);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot6);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot7);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot8);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot9);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot10);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot11);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot12);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot13);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot14);
|
|
|
|
|
btnGroup_slot->addButton(ui->pushButton_slot15);
|
2025-03-11 16:42:00 +08:00
|
|
|
|
list_label.reserve(16);
|
|
|
|
|
list_label.push_back(ui->label_18);
|
|
|
|
|
list_label.push_back(ui->label_1);
|
|
|
|
|
list_label.push_back(ui->label_2);
|
|
|
|
|
list_label.push_back(ui->label_3);
|
|
|
|
|
list_label.push_back(ui->label_4);
|
|
|
|
|
list_label.push_back(ui->label_5);
|
|
|
|
|
list_label.push_back(ui->label_6);
|
|
|
|
|
list_label.push_back(ui->label_7);
|
|
|
|
|
list_label.push_back(ui->label_8);
|
|
|
|
|
list_label.push_back(ui->label_9);
|
|
|
|
|
list_label.push_back(ui->label_10);
|
|
|
|
|
list_label.push_back(ui->label_11);
|
|
|
|
|
list_label.push_back(ui->label_12);
|
|
|
|
|
list_label.push_back(ui->label_13);
|
|
|
|
|
list_label.push_back(ui->label_14);
|
|
|
|
|
list_label.push_back(ui->label_15);
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_slot->setChecked(true);
|
2025-02-10 10:48:43 +08:00
|
|
|
|
createMenu();
|
2025-02-11 19:54:22 +08:00
|
|
|
|
connect(btnGroup_slot, SIGNAL(buttonClicked(QAbstractButton *)), this, SLOT(OnButtonGroup(QAbstractButton *)));
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QSettings settingsread(QCoreApplication::applicationDirPath() + "\\config\\config.ini", QSettings::IniFormat);
|
2025-03-04 16:00:19 +08:00
|
|
|
|
g_strServerIp = settingsread.value("Server/IP").toString();
|
2025-04-11 20:27:45 +08:00
|
|
|
|
connectServer();
|
2025-03-05 09:33:48 +08:00
|
|
|
|
// 设置自定义日志处理函数
|
|
|
|
|
#ifndef QT_DEBUG
|
|
|
|
|
qInstallMessageHandler(messageHandler);
|
|
|
|
|
#endif
|
2024-12-17 18:53:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
MainWindow::~MainWindow() {
|
2024-12-17 18:53:41 +08:00
|
|
|
|
delete ui;
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::onDisConnected() {
|
2025-03-20 14:38:14 +08:00
|
|
|
|
statusBar()->showMessage("连接失败!正在重连……", 3000); // 显示3秒
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::onConnected() {
|
2025-03-20 14:38:14 +08:00
|
|
|
|
statusBar()->showMessage("连接成功!", 3000); // 显示3秒
|
|
|
|
|
}
|
2025-03-13 15:10:35 +08:00
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::connectServer() {
|
2025-03-20 14:38:14 +08:00
|
|
|
|
m_tcpClient = MyTcpClient::instance();
|
|
|
|
|
// 监听信号
|
2025-03-29 18:05:12 +08:00
|
|
|
|
connect(m_tcpClient, SIGNAL(dataReceived(const QByteArray &)), this, SLOT(readData(const QByteArray &)));
|
2025-03-20 14:38:14 +08:00
|
|
|
|
connect(m_tcpClient, SIGNAL(disconnected()), this, SLOT(onDisConnected()));
|
|
|
|
|
connect(m_tcpClient, SIGNAL(connected()), this, SLOT(onConnected()));
|
2025-03-13 15:10:35 +08:00
|
|
|
|
// 连接服务器
|
2025-03-20 14:38:14 +08:00
|
|
|
|
m_tcpClient->connectToServer(g_strServerIp, 10000);
|
2025-03-13 15:10:35 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::initStyle() {
|
2025-03-11 16:42:00 +08:00
|
|
|
|
//加载样式表
|
|
|
|
|
QString qss;
|
|
|
|
|
QFile file(":/qss/soft.css");
|
|
|
|
|
if (file.open(QFile::ReadOnly)) {
|
|
|
|
|
qss = QLatin1String(file.readAll());
|
|
|
|
|
QString paletteColor = qss.mid(20, 7);
|
|
|
|
|
qApp->setPalette(QPalette(paletteColor));
|
|
|
|
|
qApp->setStyleSheet(qss);
|
|
|
|
|
file.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::readJsonFile(const QString &filePath) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
// 创建文件对象
|
|
|
|
|
QFile file(filePath);
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
|
|
|
qDebug() << "Cannot open file for reading:" << filePath;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QString content = file.readAll();
|
|
|
|
|
file.close();
|
|
|
|
|
QByteArray jsonData = content.toUtf8();
|
|
|
|
|
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
|
|
|
|
|
if (jsonDoc.isNull()) {
|
|
|
|
|
qDebug() << "Cannot parse JSON document";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!jsonDoc.isObject() && !jsonDoc.isArray()) {
|
|
|
|
|
qDebug() << "JSON document is not an object or an array";
|
|
|
|
|
return;
|
|
|
|
|
}
|
2025-03-03 21:57:15 +08:00
|
|
|
|
int slot_id = 0;
|
2025-02-11 19:54:22 +08:00
|
|
|
|
QJsonArray jsonArray = jsonDoc.array();
|
|
|
|
|
for (const QJsonValue &value : jsonArray) {
|
|
|
|
|
SlotConfig slot_config;
|
|
|
|
|
if (value.isObject()) { // 处理数组中的对象,例如每个对象代表一个记录或用户等。
|
|
|
|
|
QJsonObject obj = value.toObject();
|
|
|
|
|
slot_config.slot = obj["slot"].toInt();
|
2025-03-23 14:03:48 +08:00
|
|
|
|
slot_config.slot_type = obj["slot_type"].toString();
|
2025-02-13 10:50:09 +08:00
|
|
|
|
slot_config.chan_display = obj["chan_display"].toString();
|
2025-02-11 19:54:22 +08:00
|
|
|
|
slot_config.rack_type = obj["rack_type"].toString();
|
2025-03-29 18:05:12 +08:00
|
|
|
|
map_slot_config.insert(slot_id, slot_config);
|
2025-02-11 19:54:22 +08:00
|
|
|
|
slot_id ++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::createMenu() {
|
|
|
|
|
QList<QAbstractButton *> buttonList = btnGroup_slot->buttons();
|
|
|
|
|
for (int i = 0; i < buttonList.count(); i++) {
|
|
|
|
|
createMenu(QString("%1").arg(i + 1), (QPushButton *)buttonList[i]);
|
|
|
|
|
map_slot_config[i].slot_btn = (QPushButton *)buttonList[i];
|
2025-03-11 16:42:00 +08:00
|
|
|
|
map_slot_config[i].slot_label = list_label[i];
|
2025-04-10 16:45:20 +08:00
|
|
|
|
std::shared_ptr<CardBase> base_ptr = ConfigMgr::Instance()->GetSlotPtr(i);
|
|
|
|
|
if(base_ptr != nullptr){
|
|
|
|
|
switch (base_ptr->card_type_) {
|
|
|
|
|
case kCardVibSingle :
|
|
|
|
|
buttonList[i]->setText("振动");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::createMenu(const QString &rootTitle, QPushButton *parent) {
|
2025-02-10 10:48:43 +08:00
|
|
|
|
// 创建主菜单
|
|
|
|
|
QMenu *mainMenu = new QMenu(rootTitle, parent);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
// 创建第一层子菜单
|
2025-02-10 10:48:43 +08:00
|
|
|
|
QMenu *monitors = new QMenu("监视器", mainMenu);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
QMenu *relays = new QMenu("/DOM810 继电器模块", mainMenu);
|
|
|
|
|
QMenu *keyphasor = new QMenu("/KPM834 键相模块", mainMenu);
|
|
|
|
|
// 创建第二层子菜单:/HAM824 振动板卡
|
|
|
|
|
QMenu *proximitor_menu = new QMenu("/HAM824 振动板卡", monitors);
|
|
|
|
|
QMenu *rpm_menu = new QMenu("/OPM844 转速板卡", monitors);
|
|
|
|
|
// 创建第三层子菜单:/HAM824 单板卡、三冗余板卡
|
|
|
|
|
QAction *proximitor_1 = proximitor_menu->addAction("/HAM824 单板卡");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
proximitor_1->setData(kCardVibSingle);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
QAction *proximitor_2 = proximitor_menu->addAction("/HAM824 三冗余板卡");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
proximitor_2->setData(kCardVibTMRPrimary);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
QAction *rpm_1 = rpm_menu->addAction("/OPM844 单板卡");
|
2025-04-11 20:27:45 +08:00
|
|
|
|
rpm_1->setData(kCardSpeedSingle);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
// 创建第二层子菜单:/KPM834 键相模块
|
|
|
|
|
QAction *keyphasor_1 = keyphasor->addAction("/KPM834 单板卡");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
keyphasor_1->setData(kCardKeyphaseSingle);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
QAction *keyphasor_2 = keyphasor->addAction("/KPM834 两板卡");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
keyphasor_2->setData(kCardKeyphaseDouble);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
// 创建第二层子菜单:/DOM810 继电器模块
|
|
|
|
|
QAction *relays_1 = relays->addAction("/DOM810 单板卡");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
relays_1->setData(kCardRelaySingle);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
QAction *relays_2 = relays->addAction("/DOM810 三冗余板卡");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
relays_2->setData(kCardRelayTMRPrimary);
|
2025-02-10 10:48:43 +08:00
|
|
|
|
// 将子菜单加入上一级菜单
|
|
|
|
|
monitors->addMenu(proximitor_menu); // 将第二层加入第一层
|
|
|
|
|
monitors->addMenu(rpm_menu); // 第二层另一个子菜单
|
|
|
|
|
mainMenu->addMenu(monitors); // 将第一层加入主菜单
|
|
|
|
|
mainMenu->addMenu(relays);
|
|
|
|
|
mainMenu->addMenu(keyphasor);
|
|
|
|
|
QAction *reset = mainMenu->addAction("重置模块");
|
2025-03-01 13:40:11 +08:00
|
|
|
|
QAction *upgrade = mainMenu->addAction("升级固件");
|
2025-03-03 21:57:15 +08:00
|
|
|
|
QAction *version = mainMenu->addAction("查看版本");
|
2025-03-07 15:36:02 +08:00
|
|
|
|
// 绑定 **鼠标事件过滤器**,确保只响应右键
|
|
|
|
|
// 设置右键菜单策略
|
2025-02-10 10:48:43 +08:00
|
|
|
|
parent->setContextMenuPolicy(Qt::CustomContextMenu);
|
2025-03-07 15:36:02 +08:00
|
|
|
|
// 使用 `customContextMenuRequested` 事件,确保只有右键点击时弹出菜单
|
2025-03-29 18:05:12 +08:00
|
|
|
|
connect(parent, &QPushButton::customContextMenuRequested, this, [ = ](const QPoint &pos) {
|
2025-03-07 15:36:02 +08:00
|
|
|
|
qDebug() << "右键菜单触发1:" << pos;
|
|
|
|
|
// 弹出菜单并捕获右键点击
|
2025-02-10 10:48:43 +08:00
|
|
|
|
mainMenu->exec(QCursor::pos());
|
2025-03-07 15:36:02 +08:00
|
|
|
|
mainMenu->close();
|
2025-02-10 10:48:43 +08:00
|
|
|
|
});
|
|
|
|
|
// 连接所有菜单项
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QObject::connect(proximitor_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(proximitor_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(rpm_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(relays_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(relays_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(keyphasor_1, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(keyphasor_2, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(reset, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(upgrade, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
|
|
|
|
QObject::connect(version, &QAction::triggered, this, &MainWindow::onMenuActionTriggered);
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
2025-02-11 19:54:22 +08:00
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::createMenuSet(const QString &rootTitle, QPushButton *parent) {
|
2025-02-10 10:48:43 +08:00
|
|
|
|
// 创建主菜单
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "createMenu" << parent->objectName() ;
|
2025-02-10 10:48:43 +08:00
|
|
|
|
QMenu *mainMenu = new QMenu(rootTitle, parent);
|
|
|
|
|
QAction *option = mainMenu->addAction("通道配置…");
|
|
|
|
|
QAction *set_points = mainMenu->addAction("触发配置…");
|
|
|
|
|
QAction *point_names = mainMenu->addAction("测点名称");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 清除菜单中所有动作的属性
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::clearMenuProperties(QMenu *menu) {
|
2025-02-10 10:48:43 +08:00
|
|
|
|
// 遍历菜单的所有动作
|
|
|
|
|
if (!menu) {
|
2025-03-29 18:05:12 +08:00
|
|
|
|
qWarning() << "菜单为空,无法清除属性!";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 遍历菜单的所有动作
|
|
|
|
|
for (QAction *action : menu->actions()) {
|
|
|
|
|
if (!action) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
// 检查是否有子菜单
|
|
|
|
|
if (QMenu *subMenu = action->menu()) {
|
|
|
|
|
clearMenuProperties(subMenu); // 递归处理子菜单
|
|
|
|
|
}
|
|
|
|
|
// 清除动作的属性
|
|
|
|
|
action->setProperty("customProperty", QVariant());
|
|
|
|
|
qDebug() << "清除了属性,动作:" << action->text();
|
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::onMenuActionTriggered() {
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "onMenuActionTriggered()" ;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QAction *action = qobject_cast<QAction *>(sender());
|
2025-02-10 10:48:43 +08:00
|
|
|
|
if (action) {
|
|
|
|
|
// 获取触发动作的父菜单
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QMenu *menu = qobject_cast<QMenu *>(action->parent());
|
2025-02-10 10:48:43 +08:00
|
|
|
|
// 遍历所有父菜单,直到找到按钮
|
|
|
|
|
while (menu) {
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QPushButton *button = qobject_cast<QPushButton *>(menu->parent());
|
2025-02-10 10:48:43 +08:00
|
|
|
|
if (button) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
qDebug() << "子菜单项被点击,所属按钮:" << button->objectName() << action->text();
|
2025-03-29 18:05:12 +08:00
|
|
|
|
QString slot_type = action->text().mid(1, 6);
|
|
|
|
|
QString rack_type = action->text().right(action->text().length() - 8);
|
2025-04-10 16:45:20 +08:00
|
|
|
|
qDebug() << "rack_type" << action->data();
|
|
|
|
|
card_type = static_cast<CardType>(action->data().toInt());
|
2025-03-29 18:05:12 +08:00
|
|
|
|
int button_id = button->objectName().right(button->objectName().length() - 15).toInt();
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << slot_type << rack_type << button_id << map_slot_config[button_id + 1].slot_type << map_slot_config[button_id + 2].slot_type ;
|
2025-03-11 16:42:00 +08:00
|
|
|
|
map_slot_config[button_id].slot_label->setStyleSheet("QLabel { color :#2980b9; font: bold 16px}");
|
2025-03-26 17:00:52 +08:00
|
|
|
|
QString chan_display = "";
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (slot_type == "DOM810") {
|
2025-03-26 17:00:52 +08:00
|
|
|
|
chan_display = "继电器";
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (slot_type == "KPM834") {
|
2025-03-26 17:00:52 +08:00
|
|
|
|
chan_display = "键相";
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (slot_type == "HAM824") {
|
2025-03-26 17:00:52 +08:00
|
|
|
|
chan_display = "振动";
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (slot_type == "OPM844") {
|
2025-03-26 17:00:52 +08:00
|
|
|
|
chan_display = "转速";
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (rack_type == "三冗余板卡" && (map_slot_config[button_id].slot_type != "" || map_slot_config[button_id + 1].slot_type != "" \
|
|
|
|
|
|| map_slot_config[button_id + 2].slot_type != "")) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), "不要重叠三冗余板卡配置,请在创建新配置之前移除现有的配置!");
|
|
|
|
|
return;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (rack_type == "三冗余板卡" && map_slot_config[button_id + 1].slot_type == "" \
|
|
|
|
|
&& map_slot_config[button_id + 2].slot_type == "") {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
map_slot_config[button_id].slot_type = slot_type;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id].rack_type = "TMR1";
|
2025-03-26 17:00:52 +08:00
|
|
|
|
map_slot_config[button_id].slot_btn->setText(chan_display);
|
|
|
|
|
map_slot_config[button_id].chan_display = chan_display;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id + 1].slot_type = slot_type;
|
|
|
|
|
map_slot_config[button_id + 1].rack_type = "TMR2";
|
2025-03-26 17:00:52 +08:00
|
|
|
|
map_slot_config[button_id + 1].slot_btn->setText(chan_display);
|
|
|
|
|
map_slot_config[button_id + 1].chan_display = chan_display;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id + 2].slot_type = slot_type;
|
|
|
|
|
map_slot_config[button_id + 2].rack_type = "TMR3";
|
2025-03-26 17:00:52 +08:00
|
|
|
|
map_slot_config[button_id + 2].slot_btn->setText(chan_display);
|
|
|
|
|
map_slot_config[button_id + 2].chan_display = chan_display;
|
2025-02-11 19:54:22 +08:00
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (rack_type == "两板卡" && (map_slot_config[button_id].slot_type != "" || map_slot_config[button_id + 1].slot_type != "")) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), "不要重叠两板卡配置,请在创建新配置之前移除现有的配置!");
|
|
|
|
|
return;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (rack_type == "两板卡" && map_slot_config[button_id + 1].slot_type == "") {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
map_slot_config[button_id].slot_type = slot_type;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id].rack_type = "Double1";
|
2025-03-26 17:00:52 +08:00
|
|
|
|
map_slot_config[button_id].slot_btn->setText(chan_display);
|
|
|
|
|
map_slot_config[button_id].chan_display = chan_display;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id + 1].slot_type = slot_type;
|
|
|
|
|
map_slot_config[button_id + 1].rack_type = "Double2";
|
2025-03-26 17:00:52 +08:00
|
|
|
|
map_slot_config[button_id + 1].slot_btn->setText(chan_display);
|
|
|
|
|
map_slot_config[button_id + 1].chan_display = chan_display;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (rack_type == "单板卡" && map_slot_config[button_id].slot_type != "") {
|
2025-02-13 10:50:09 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), "不要重叠单板卡配置,请在创建新配置之前移除现有的配置!");
|
|
|
|
|
return;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (rack_type == "单板卡" && map_slot_config[button_id].slot_type == "") {
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id].slot_type = slot_type;
|
|
|
|
|
map_slot_config[button_id].rack_type = "Single";
|
2025-03-26 17:00:52 +08:00
|
|
|
|
map_slot_config[button_id].chan_display = chan_display;
|
|
|
|
|
button->setText(chan_display);
|
2025-02-11 19:54:22 +08:00
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (action->text() == "重置模块") {
|
2025-04-11 20:27:45 +08:00
|
|
|
|
if (ConfigMgr::Instance()->card_type_[button_id - 1] == kCardRelayTMRPrimary) {
|
2025-03-23 14:03:48 +08:00
|
|
|
|
map_slot_config[button_id].slot_type = "";
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id].rack_type = "0";
|
|
|
|
|
map_slot_config[button_id].slot_btn->setText("");
|
|
|
|
|
map_slot_config[button_id].chan_display = "";
|
2025-03-23 14:03:48 +08:00
|
|
|
|
map_slot_config[button_id + 1].slot_type = "";
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id + 1].rack_type = "0";
|
|
|
|
|
map_slot_config[button_id + 1].slot_btn->setText("");
|
|
|
|
|
map_slot_config[button_id + 1].chan_display = "";
|
2025-03-23 14:03:48 +08:00
|
|
|
|
map_slot_config[button_id + 2].slot_type = "";
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id + 2].rack_type = "0";
|
|
|
|
|
map_slot_config[button_id + 2].slot_btn->setText("");
|
|
|
|
|
map_slot_config[button_id + 2].chan_display = "";
|
2025-04-11 20:27:45 +08:00
|
|
|
|
} else if (ConfigMgr::Instance()->card_type_[button_id - 1] == kCardRelayTMRBackup) {
|
2025-03-23 14:03:48 +08:00
|
|
|
|
map_slot_config[button_id - 1].slot_type = "";
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id - 1].rack_type = "0";
|
|
|
|
|
map_slot_config[button_id - 1].slot_btn->setText("");
|
|
|
|
|
map_slot_config[button_id - 1].chan_display = "";
|
2025-03-23 14:03:48 +08:00
|
|
|
|
map_slot_config[button_id].slot_type = "";
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id].rack_type = "0";
|
|
|
|
|
map_slot_config[button_id].slot_btn->setText("");
|
|
|
|
|
map_slot_config[button_id].chan_display = "";
|
2025-03-23 14:03:48 +08:00
|
|
|
|
map_slot_config[button_id + 1].slot_type = "";
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id + 1].rack_type = "0";
|
|
|
|
|
map_slot_config[button_id + 1].slot_btn->setText("");
|
|
|
|
|
map_slot_config[button_id + 1].chan_display = "";
|
2025-04-11 20:27:45 +08:00
|
|
|
|
}else if (ConfigMgr::Instance()->card_type_[button_id - 1] == kCardVibSingle ||
|
|
|
|
|
ConfigMgr::Instance()->card_type_[button_id - 1] == kCardSpeedSingle ||
|
|
|
|
|
ConfigMgr::Instance()->card_type_[button_id - 1] == kCardKeyphaseSingle) {
|
|
|
|
|
ConfigMgr::Instance()->card_type_[button_id - 1] = kCardNone;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
map_slot_config[button_id].slot_btn->setText("");
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (action->text() == "升级固件") {
|
2025-03-11 16:42:00 +08:00
|
|
|
|
sendUpgradePackage(button_id);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (action->text() == "查看版本") {
|
2025-03-11 16:42:00 +08:00
|
|
|
|
getVersion(button_id);
|
2025-02-11 19:54:22 +08:00
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
break; // 找到按钮后,跳出循环
|
|
|
|
|
}
|
|
|
|
|
// 如果没有找到按钮,继续向上查找
|
2025-03-29 18:05:12 +08:00
|
|
|
|
menu = qobject_cast<QMenu *>(menu->parent());
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::OnButtonGroup(QAbstractButton *slot_btn) {
|
|
|
|
|
if (slot_btn != NULL && ui->pushButton_chan->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
QString object_name = slot_btn->objectName();
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << object_name ;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
int button_id = object_name.right(object_name.length() - 15).toInt();
|
2025-02-11 19:54:22 +08:00
|
|
|
|
SlotConfig slot_config = map_slot_config[button_id];
|
2025-03-11 16:42:00 +08:00
|
|
|
|
map_slot_config[button_id].slot_label->setStyleSheet("QLabel { color :#2980b9; font: bold 16px}");
|
2025-04-10 16:45:20 +08:00
|
|
|
|
std::shared_ptr<CardBase> base_ptr = ConfigMgr::Instance()->GetSlotPtr(button_id);
|
|
|
|
|
if(base_ptr == nullptr){
|
|
|
|
|
ConfigMgr::Instance()->card_type_[button_id - 1] = card_type;
|
|
|
|
|
if (slot_config.slot_type == "KPM834") { // 键相模块
|
|
|
|
|
KeyPhase *key_phase = new KeyPhase(button_id,card_type);
|
|
|
|
|
key_phase->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
key_phase->show();
|
|
|
|
|
} else if (slot_config.slot_type == "DOM810") { // 继电器模块
|
|
|
|
|
SingleRelay *single_relay = new SingleRelay();
|
|
|
|
|
single_relay->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
single_relay->show();
|
|
|
|
|
} else if (slot_config.slot_type == "HAM824") { // 振动模块
|
|
|
|
|
Seismic_monitor *seismic_monitor = new Seismic_monitor(button_id,card_type);
|
|
|
|
|
seismic_monitor->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
seismic_monitor->show();
|
|
|
|
|
} else if (slot_config.slot_type == "OPM844") { // 转速模块
|
|
|
|
|
Tachometer *tachometer = new Tachometer(button_id,card_type);
|
|
|
|
|
tachometer->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
tachometer->show();
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
switch(base_ptr->card_type_){
|
|
|
|
|
case kCardVibSingle:{
|
|
|
|
|
Seismic_monitor *seismic_monitor = new Seismic_monitor(button_id,card_type);
|
|
|
|
|
seismic_monitor->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
seismic_monitor->show();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kCardKeyphaseSingle:{
|
|
|
|
|
KeyPhase *key_phase = new KeyPhase(button_id,card_type);
|
|
|
|
|
key_phase->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
key_phase->show();
|
|
|
|
|
break;
|
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (slot_btn != NULL && ui->pushButton_alarm->isChecked()) {
|
2025-02-13 10:50:09 +08:00
|
|
|
|
QString object_name = slot_btn->objectName();
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << object_name ;
|
2025-02-13 10:50:09 +08:00
|
|
|
|
Setpoint *setpoint = new Setpoint();
|
|
|
|
|
setpoint->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
setpoint->show();
|
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::on_pushButton_slot_clicked() {
|
|
|
|
|
if (ui->pushButton_chan->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_chan->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_alarm->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_alarm->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_point_name->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_point_name->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::on_pushButton_chan_clicked() {
|
|
|
|
|
if (ui->pushButton_slot->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_slot->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_alarm->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_alarm->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_point_name->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_point_name->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::on_pushButton_alarm_clicked() {
|
|
|
|
|
if (ui->pushButton_slot->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_slot->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_chan->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_chan->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_point_name->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_point_name->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::on_pushButton_point_name_clicked() {
|
|
|
|
|
if (ui->pushButton_slot->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_slot->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_chan->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_chan->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
if (ui->pushButton_alarm->isChecked()) {
|
2025-02-11 19:54:22 +08:00
|
|
|
|
ui->pushButton_alarm->setChecked(false);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
2025-02-11 19:54:22 +08:00
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::onMenuAction_relay() {
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << " onMenuAction_relay " ;
|
2025-03-04 16:00:19 +08:00
|
|
|
|
RelaySetting *relay_setting = new RelaySetting();
|
|
|
|
|
relay_setting->setWindowModality(Qt::ApplicationModal);
|
|
|
|
|
relay_setting->show();
|
|
|
|
|
}
|
2025-04-11 20:27:45 +08:00
|
|
|
|
uint8_t calculate_crc(uint8_t c, const QByteArray &data) {
|
|
|
|
|
uint8_t crc = c;
|
|
|
|
|
for (int i = 0; i < data.size(); ++i) {
|
|
|
|
|
crc += static_cast<uint8_t>(data[i]); // 累加每个字节
|
|
|
|
|
}
|
|
|
|
|
return crc;
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::on_pushButton_save_clicked() {
|
2025-04-10 16:45:20 +08:00
|
|
|
|
ConfigMgr::Instance()->Save();
|
2025-04-11 20:27:45 +08:00
|
|
|
|
// 读取文件内容
|
|
|
|
|
QFile file(QCoreApplication::applicationDirPath() + "\\config\\tsi_config_file.json");
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly)) {
|
|
|
|
|
qWarning() << "Failed to open update file.";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QByteArray fileData = file.readAll();
|
|
|
|
|
int fileSize = fileData.size();
|
|
|
|
|
if (fileSize > 10 * 1024 * 1024) {
|
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), "文件大小超过10M,请重新选择!");
|
|
|
|
|
file.close();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
qDebug() << "fileSize" << fileSize ;
|
|
|
|
|
// 创建 PackageHead 结构体
|
|
|
|
|
PackageHead header = { {0xAA, 0x55, 0xAA}, kUploadConfigFile, fileSize, 0, {} };
|
|
|
|
|
// 计算文件的 CRC 校验和
|
|
|
|
|
header.crc = calculate_crc(0, fileData);
|
|
|
|
|
header.len = fileSize;
|
|
|
|
|
char *send_buf = NULL;
|
|
|
|
|
send_buf = (char *)malloc(sizeof(PackageHead) + fileData.size() + 1);
|
|
|
|
|
memset(send_buf, 0, sizeof(PackageHead) + fileData.size() + 1);
|
|
|
|
|
memcpy(send_buf, &header, sizeof(PackageHead));
|
|
|
|
|
memcpy(send_buf + sizeof(PackageHead), fileData.data(), fileData.size());
|
|
|
|
|
int length = sizeof(PackageHead) + fileData.size();
|
|
|
|
|
const int MAX_CHUNK_SIZE = 50 * 1024; // 50 KB
|
|
|
|
|
qint64 bytesSent = 0;
|
|
|
|
|
qint64 totalBytes = length;
|
|
|
|
|
qDebug() << "totalBytes" << totalBytes ;
|
|
|
|
|
while (bytesSent < totalBytes) {
|
|
|
|
|
qint64 chunkSize = 0;
|
|
|
|
|
if (MAX_CHUNK_SIZE < totalBytes - bytesSent) {
|
|
|
|
|
chunkSize = MAX_CHUNK_SIZE;
|
|
|
|
|
} else {
|
|
|
|
|
chunkSize = totalBytes - bytesSent;
|
|
|
|
|
}
|
|
|
|
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf + bytesSent, chunkSize);
|
|
|
|
|
qDebug() << "bytesWritten" << bytesWritten << "bytesSent" << bytesSent << "chunkSize" << chunkSize ;
|
|
|
|
|
if (bytesWritten == -1) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
bytesSent += bytesWritten;
|
|
|
|
|
}
|
|
|
|
|
qDebug() << "bytesSent" << bytesSent;
|
|
|
|
|
m_tcpClient->waitForRead();
|
|
|
|
|
file.close();
|
|
|
|
|
if (send_buf != NULL) {
|
|
|
|
|
free(send_buf);
|
|
|
|
|
}
|
2025-02-10 10:48:43 +08:00
|
|
|
|
}
|
2024-12-17 18:53:41 +08:00
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::on_pushButton_open_clicked() {
|
2025-04-10 16:45:20 +08:00
|
|
|
|
ConfigMgr::Instance()->Load(QCoreApplication::applicationDirPath() + "\\config\\tsi_config_file.json");
|
|
|
|
|
|
|
|
|
|
QList<QAbstractButton *> buttonList = btnGroup_slot->buttons();
|
|
|
|
|
for (int i = 0; i < buttonList.count(); i++) {
|
|
|
|
|
std::shared_ptr<CardBase> base_ptr = ConfigMgr::Instance()->GetSlotPtr(i + 1);
|
|
|
|
|
if(base_ptr != nullptr){
|
|
|
|
|
switch (base_ptr->card_type_) {
|
|
|
|
|
case kCardVibSingle :{
|
|
|
|
|
buttonList[i + 1]->setText("振动");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kCardKeyphaseSingle:{
|
|
|
|
|
buttonList[i + 1]->setText("键相");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case kCardSpeedSingle:{
|
|
|
|
|
buttonList[i + 1]->setText("转速");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-02-18 10:55:51 +08:00
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
|
2025-03-01 13:40:11 +08:00
|
|
|
|
uint32_t myHtonl(uint32_t value) {
|
|
|
|
|
return ((value >> 24) & 0x000000FF) | // 提取最高的8位
|
|
|
|
|
((value >> 8) & 0x0000FF00) | // 提取中间的8位
|
|
|
|
|
((value << 8) & 0x00FF0000) | // 提取次高的8位
|
|
|
|
|
((value << 24) & 0xFF000000); // 提取最低的8位
|
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::sendUpgradePackage(int slot) {
|
2025-03-01 13:40:11 +08:00
|
|
|
|
QString filepath = QFileDialog::getOpenFileName(this, tr("选择文件"), tr(""), tr("*"));
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << filepath << slot ;
|
2025-03-01 13:40:11 +08:00
|
|
|
|
QFileInfo fileinfo;
|
|
|
|
|
fileinfo = QFileInfo(filepath);
|
|
|
|
|
QString file_suffix = fileinfo.suffix();
|
|
|
|
|
QString FileName = fileinfo.fileName();
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (FileName.isEmpty()) {
|
2025-03-01 13:40:11 +08:00
|
|
|
|
return;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
2025-03-01 13:40:11 +08:00
|
|
|
|
QFile file(filepath);
|
|
|
|
|
if (!file.open(QIODevice::ReadOnly)) {
|
|
|
|
|
qWarning() << "Failed to open update file.";
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 读取文件内容
|
|
|
|
|
QByteArray fileData = file.readAll();
|
|
|
|
|
int fileSize = fileData.size();
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (fileSize > 10 * 1024 * 1024) {
|
2025-03-14 09:33:14 +08:00
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), "文件大小超过10M,请重新选择!");
|
|
|
|
|
file.close();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
for (int var = 0; var < 10; ++var) {
|
|
|
|
|
qDebug() << "Byte" << var << ":" << static_cast<uint8_t>(fileData[var]);
|
|
|
|
|
}
|
|
|
|
|
for (int var = fileSize - 10; var < fileSize; ++var) {
|
|
|
|
|
qDebug() << "Byte" << var << ":" << static_cast<uint8_t>(fileData[var]);
|
|
|
|
|
}
|
|
|
|
|
qDebug() << "fileSize" << fileSize ;
|
2025-03-01 13:40:11 +08:00
|
|
|
|
// 创建 PackageHead 结构体
|
2025-03-29 18:05:12 +08:00
|
|
|
|
PackageHead header = { {0xAA, 0x55, 0xAA}, 3, fileSize, 0, {} };
|
2025-03-01 13:40:11 +08:00
|
|
|
|
// 计算文件的 CRC 校验和
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "filheader.slot" << slot ;
|
2025-03-01 13:40:11 +08:00
|
|
|
|
UpgradeCardReq upgrade_car_req;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (slot == 0) {
|
2025-03-01 19:22:48 +08:00
|
|
|
|
upgrade_car_req.card_id = 0xFF;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else {
|
2025-03-01 19:22:48 +08:00
|
|
|
|
upgrade_car_req.card_id = slot & 0xFF;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
header.crc = calculate_crc(upgrade_car_req.card_id, fileData);
|
2025-03-14 09:33:14 +08:00
|
|
|
|
header.len = fileSize + sizeof(UpgradeCardReq);
|
|
|
|
|
qDebug() << "filheader.crc" << header.crc << "card_id" << upgrade_car_req.card_id << "header len" << header.len;
|
2025-03-01 17:36:57 +08:00
|
|
|
|
char *send_buf = NULL;
|
|
|
|
|
send_buf = (char *)malloc(sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
memset(send_buf, 0, sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1);
|
2025-03-01 17:36:57 +08:00
|
|
|
|
memcpy(send_buf, &header, sizeof(PackageHead));
|
2025-03-01 19:22:48 +08:00
|
|
|
|
memcpy(send_buf + sizeof(PackageHead), &upgrade_car_req, sizeof(UpgradeCardReq));
|
|
|
|
|
memcpy(send_buf + sizeof(PackageHead) + sizeof(UpgradeCardReq), fileData.data(), fileData.size());
|
|
|
|
|
int length = sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size();
|
|
|
|
|
const int MAX_CHUNK_SIZE = 50 * 1024; // 64 KB
|
|
|
|
|
qint64 bytesSent = 0;
|
|
|
|
|
qint64 totalBytes = length;
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "totalBytes" << totalBytes ;
|
2025-03-01 19:22:48 +08:00
|
|
|
|
while (bytesSent < totalBytes) {
|
|
|
|
|
qint64 chunkSize = 0;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (MAX_CHUNK_SIZE < totalBytes - bytesSent) {
|
2025-03-01 19:22:48 +08:00
|
|
|
|
chunkSize = MAX_CHUNK_SIZE;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else {
|
2025-03-01 19:22:48 +08:00
|
|
|
|
chunkSize = totalBytes - bytesSent;
|
|
|
|
|
}
|
2025-03-20 14:38:14 +08:00
|
|
|
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf + bytesSent, chunkSize);
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "bytesWritten" << bytesWritten << "bytesSent" << bytesSent ;
|
2025-03-01 19:22:48 +08:00
|
|
|
|
if (bytesWritten == -1) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
bytesSent += bytesWritten;
|
|
|
|
|
}
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "bytesSent" << bytesSent ;
|
2025-03-20 14:38:14 +08:00
|
|
|
|
m_tcpClient->waitForRead();
|
2025-03-13 15:10:35 +08:00
|
|
|
|
progressBar->reset();
|
|
|
|
|
progressBar->setVisible(true);
|
|
|
|
|
QString upgrade_text = QStringLiteral("正在上传板卡 [ %1 ] …… %p%").arg(slot);
|
|
|
|
|
progressBar->setTextVisible(true);
|
|
|
|
|
progressBar->setFormat(upgrade_text);
|
2025-03-01 13:40:11 +08:00
|
|
|
|
file.close();
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (send_buf != NULL) {
|
2025-03-01 17:36:57 +08:00
|
|
|
|
free(send_buf);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
2025-03-01 13:40:11 +08:00
|
|
|
|
}
|
2025-03-29 18:05:12 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::getVersion(int slot) {
|
2025-03-13 15:10:35 +08:00
|
|
|
|
slot_no = slot;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
PackageHead header = { {0xAA, 0x55, 0xAA}, kGetVersionInfo, 1, 0, {} };
|
2025-03-14 09:33:14 +08:00
|
|
|
|
qDebug() << "slot" << slot ;
|
2025-03-03 21:57:15 +08:00
|
|
|
|
GetVersionReq get_version_req;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (slot == 0) {
|
2025-03-03 21:57:15 +08:00
|
|
|
|
get_version_req.card_id = 0xFF;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else {
|
2025-03-03 21:57:15 +08:00
|
|
|
|
get_version_req.card_id = slot & 0xFF;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
}
|
|
|
|
|
char send_buf[20] = {0};
|
|
|
|
|
memcpy(send_buf, (char *)&header, sizeof(PackageHead));
|
|
|
|
|
memcpy(send_buf + sizeof(PackageHead), (char *)&get_version_req, sizeof(GetVersionReq));
|
2025-03-03 21:57:15 +08:00
|
|
|
|
int length = sizeof(PackageHead) + sizeof(GetVersionReq);
|
2025-03-20 14:38:14 +08:00
|
|
|
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
|
|
|
|
m_tcpClient->waitForRead();
|
2025-03-13 15:10:35 +08:00
|
|
|
|
qDebug() << "bytesWritten: " << bytesWritten;
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-29 18:05:12 +08:00
|
|
|
|
void MainWindow::readData(const QByteArray &data) {
|
2025-03-13 15:10:35 +08:00
|
|
|
|
qDebug() << "Received from server:" << data;
|
|
|
|
|
PackageHead header;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
memcpy(&header, data.data(), sizeof(PackageHead));
|
|
|
|
|
if (header.cmd == kGetVersionInfo) {
|
2025-03-03 21:57:15 +08:00
|
|
|
|
VersionRsp version_rsp;
|
2025-03-29 18:05:12 +08:00
|
|
|
|
memcpy(&version_rsp, data.data() + sizeof(PackageHead), sizeof(VersionRsp));
|
2025-03-13 15:10:35 +08:00
|
|
|
|
QString strVerion = QString("第 %1 板卡\nFPGA 版本:%2\n软件版本:%3\nFPGA版本日期:%4").arg(slot_no).arg(version_rsp.fpga).arg(version_rsp.sw).arg(version_rsp.fpga_data);
|
|
|
|
|
QMessageBox::information(this, QStringLiteral("提示"), strVerion);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (header.cmd == kUpgradeCard) {
|
2025-03-13 15:10:35 +08:00
|
|
|
|
UpgradeRsp resp;
|
|
|
|
|
QByteArray byteArray = data.mid(sizeof(PackageHead));
|
|
|
|
|
QDataStream stream(&byteArray, QIODevice::ReadOnly);
|
|
|
|
|
stream >> resp.code ;
|
|
|
|
|
// if(resp.code == 1){
|
|
|
|
|
// QMessageBox::information(this, QStringLiteral("提示"), "上传成功!");
|
|
|
|
|
// }
|
2025-03-29 18:05:12 +08:00
|
|
|
|
} else if (header.cmd == kUpgradeProgress) {
|
2025-03-13 15:10:35 +08:00
|
|
|
|
QByteArray byteArray = data.mid(sizeof(PackageHead));
|
|
|
|
|
UpgradeRsp upgrade_resp;
|
|
|
|
|
QDataStream stream(&byteArray, QIODevice::ReadOnly);
|
|
|
|
|
stream >> upgrade_resp.code ;
|
|
|
|
|
progressBar->setValue(upgrade_resp.code);
|
2025-03-29 18:05:12 +08:00
|
|
|
|
if (upgrade_resp.code == 100) {
|
2025-03-13 15:10:35 +08:00
|
|
|
|
progressBar->setVisible(false);
|
|
|
|
|
statusBar()->showMessage("升级完成!", 3000); // 显示3秒
|
2025-03-03 21:57:15 +08:00
|
|
|
|
}
|
2025-03-13 15:10:35 +08:00
|
|
|
|
//qDebug() << "Server response: " << upgrade_resp.code;
|
2025-04-11 20:27:45 +08:00
|
|
|
|
} else if(header.cmd == kDownloadConfigFile){
|
|
|
|
|
//qDebug() << "header.len" << header.len;
|
|
|
|
|
char *config_file = NULL;
|
|
|
|
|
config_file = (char*)malloc(header.len + 1);
|
|
|
|
|
memset(config_file,0,header.len + 1);
|
|
|
|
|
memcpy(config_file, data.data() + sizeof(PackageHead), header.len);
|
|
|
|
|
QString filename_ = QCoreApplication::applicationDirPath() + "\\config\\tsi_config_file2.json";
|
|
|
|
|
//qDebug() << config_file ;
|
|
|
|
|
QFile file(filename_);
|
|
|
|
|
file.open(QIODevice::WriteOnly);
|
|
|
|
|
file.write(config_file,header.len);
|
|
|
|
|
file.close();
|
|
|
|
|
if(config_file != NULL)
|
|
|
|
|
free(config_file);
|
2025-03-03 21:57:15 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-11 20:27:45 +08:00
|
|
|
|
|
|
|
|
|
void MainWindow::on_pushButton_download_clicked()
|
|
|
|
|
{
|
|
|
|
|
PackageHead header = { {0xAA, 0x55, 0xAA}, kDownloadConfigFile, 1, 0, {} };
|
|
|
|
|
char send_buf[20] = {0};
|
|
|
|
|
memcpy(send_buf, (char *)&header, sizeof(PackageHead));
|
|
|
|
|
int length = sizeof(PackageHead);
|
|
|
|
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
|
|
|
|
m_tcpClient->waitForRead();
|
|
|
|
|
qDebug() << "bytesWritten: " << bytesWritten;
|
|
|
|
|
}
|
|
|
|
|
|