diff --git a/MyTcpClient.cpp b/MyTcpClient.cpp index caed475..24d327e 100644 --- a/MyTcpClient.cpp +++ b/MyTcpClient.cpp @@ -95,7 +95,6 @@ void MyTcpClient::onReadyRead() { } else { // 2. 根据头部的 len 读取剩余数据 qint64 remainingBytes = m_currentHead.len - (m_buffer.size() - sizeof(PackageHead)); - if (remainingBytes <= 0) { // 数据已经完整,触发信号 emit dataReceived(m_buffer); diff --git a/connect.cpp b/connect.cpp index 654ef41..1721bce 100644 --- a/connect.cpp +++ b/connect.cpp @@ -26,5 +26,6 @@ void Connect::on_pushButton_connect_clicked() m_tcpClient = MyTcpClient::instance(); // 连接服务器 m_tcpClient->connectToServer(g_strServerIp, 10000); + this->close(); } diff --git a/data_config.h b/data_config.h index 644e698..be9540e 100644 --- a/data_config.h +++ b/data_config.h @@ -12,7 +12,7 @@ extern QString g_strServerIp; // 服务端IP #define SLOT_NUM 15 #define CHANNEL_COUNT 4 -#define RELAY_COUNT 8 +#define RELAY_COUNT 16 typedef enum { kCardNone = 0, @@ -285,7 +285,7 @@ typedef struct TMRRelay_{ typedef struct { uint8_t head[3]; // 固定值:0xAA55AA uint8_t cmd; // 命令 - int len; // 数据长度 + int len; // 数据长度 uint8_t crc; // 数据 CRC 校验和 char data[0]; // 文件内容 } PackageHead; diff --git a/mainwindow.cpp b/mainwindow.cpp index fbe3171..20661cb 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -37,6 +37,7 @@ MainWindow::MainWindow(QWidget *parent) // this->setMenuBar(menuBar); //添加到对象树 // menuBar->addMenu(ui->menu_start); current_slot = -1; + tsi_config_file = ""; ui->widget_body->setProperty("flag", "title"); ui->menuBar->setProperty("flag", "menuBar"); //关联事件过滤器用于双击放大 @@ -99,7 +100,7 @@ MainWindow::MainWindow(QWidget *parent) QSettings settingsread(QCoreApplication::applicationDirPath() + "\\config\\config.ini", QSettings::IniFormat); g_strServerIp = settingsread.value("Server/IP").toString(); - //connectServer(); + connectServer(); // 设置自定义日志处理函数 #ifndef QT_DEBUG //qInstallMessageHandler(messageHandler); @@ -127,8 +128,6 @@ void MainWindow::connectServer() { connect(m_tcpClient, SIGNAL(disconnected()), this, SLOT(onDisConnected())); connect(m_tcpClient, SIGNAL(connected()), this, SLOT(onConnected())); connect(m_tcpClient, SIGNAL(errorOccurred(const QString &)), this, SLOT(onerrorOccurred(const QString &))); - // 连接服务器 - //m_tcpClient->connectToServer(g_strServerIp, 10000); } void MainWindow::initStyle() { @@ -573,73 +572,25 @@ void MainWindow::on_pushButton_save_clicked() { QString file_name = filepath + "\\tsi_config_file.json"; ConfigMgr::Instance()->Save(file_name); return; - // 读取文件内容 - QFile file(file_name); - 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); - } + } void MainWindow::on_pushButton_open_clicked() { - QString filepath = QFileDialog::getOpenFileName(this, tr("选择文件"), tr(""), tr("*.json")); + tsi_config_file = QFileDialog::getOpenFileName(this, tr("选择文件"), tr(""), tr("*.json")); QFileInfo fileinfo; - fileinfo = QFileInfo(filepath); + fileinfo = QFileInfo(tsi_config_file); QString file_suffix = fileinfo.suffix(); QString FileName = fileinfo.fileName(); if (FileName.isEmpty()) { return; } - QFile file(filepath); + QFile file(tsi_config_file); if (!file.open(QIODevice::ReadOnly)) { qWarning() << "Failed to open update file."; return; } - ConfigMgr::Instance()->Load(filepath); + ConfigMgr::Instance()->Load(tsi_config_file); QList buttonList = btnGroup_slot->buttons(); for (int i = 0; i < buttonList.count(); i++) { std::shared_ptr base_ptr = ConfigMgr::Instance()->GetSlotPtr(i + 1); @@ -813,7 +764,7 @@ void MainWindow::readData(const QByteArray &data) { 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"; + QString filename_ = QCoreApplication::applicationDirPath() + "\\config\\tsi_config_file_download.json"; //qDebug() << config_file ; QFile file(filename_); file.open(QIODevice::WriteOnly); @@ -854,3 +805,68 @@ void MainWindow::onMACConfig(){ mac_config->setWindowModality(Qt::ApplicationModal); mac_config->show(); } + +void MainWindow::on_pushButton_upload_clicked() +{ + QMessageBox *box = new QMessageBox(QMessageBox::Question, "提示", "确认上传配置文件?", QMessageBox::Yes | QMessageBox::No, this); + box->button(QMessageBox::Yes)->setText("确认"); + box->button(QMessageBox::No)->setText("取消"); + int res = box->exec(); + if(QMessageBox::No == res){ + return; + } + // 读取文件内容 + if(tsi_config_file == ""){ + QMessageBox::information(this, QStringLiteral("提示"), "请先打开配置文件!"); + return; + } + QFile file(tsi_config_file); + if (!file.open(QIODevice::ReadOnly)) { + qWarning() << "Failed to open config 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); + } +} + diff --git a/mainwindow.h b/mainwindow.h index 36bce57..238cce7 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -47,6 +47,7 @@ private: QProgressBar *progressBar; CardType card_type; int current_slot; + QString tsi_config_file; void createMenu(); void createMenu(const QString& rootTitle, QPushButton* button = nullptr); @@ -58,12 +59,13 @@ private: void getVersion(int slot); void initStyle(); void connectServer(); - void onerrorOccurred(const QString &errorMsg); + private slots: void onDisConnected(); void onConnected(); void readData(const QByteArray&); + void onerrorOccurred(const QString &errorMsg); void onMenuAction_relay(); void OnButtonGroup(QAbstractButton *); void onConnect(); @@ -79,5 +81,6 @@ private slots: void on_pushButton_save_clicked(); void on_pushButton_open_clicked(); void on_pushButton_download_clicked(); + void on_pushButton_upload_clicked(); }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 7ed79bc..ba40133 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -97,10 +97,10 @@ 打开 - + - 200 + 140 20 45 45 @@ -119,13 +119,13 @@ - + 上传 - 140 + 190 20 45 45 diff --git a/radial_vibration.h b/radial_vibration.h index adac59b..2a94031 100644 --- a/radial_vibration.h +++ b/radial_vibration.h @@ -22,9 +22,6 @@ class Radial : public QWidget { void on_checkBox_1x_ampl_toggled(bool checked); void on_checkBox_2x_ampl_toggled(bool checked); - void on_checkBox_not_1x_ampl_toggled(bool checked); - void on_checkBox_smax_ampl_toggled(bool checked); - private: Ui::Radial_vibration *ui;