add codes
This commit is contained in:
parent
1bd94f5f77
commit
7f4db7efdb
134
MyTcpClient.cpp
134
MyTcpClient.cpp
@ -14,6 +14,8 @@ MyTcpClient::MyTcpClient(QObject *parent) : QObject(parent), shouldReconnect(tru
|
|||||||
// 连接失败后,定时尝试重连
|
// 连接失败后,定时尝试重连
|
||||||
connect(&reconnectTimer, &QTimer::timeout, this, &MyTcpClient::onReconnect);
|
connect(&reconnectTimer, &QTimer::timeout, this, &MyTcpClient::onReconnect);
|
||||||
reconnectTimer.setInterval(5000); // 5秒重连一次
|
reconnectTimer.setInterval(5000); // 5秒重连一次
|
||||||
|
memset(header,0,sizeof(header));
|
||||||
|
int packge_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
MyTcpClient::~MyTcpClient() {
|
MyTcpClient::~MyTcpClient() {
|
||||||
@ -70,54 +72,106 @@ void MyTcpClient::onConnected() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MyTcpClient::onReadyRead() {
|
void MyTcpClient::onReadyRead() {
|
||||||
while (socket->bytesAvailable() > 0) {
|
// while (socket->bytesAvailable() > 0) {
|
||||||
if (m_waitingForHeader) {
|
// if (m_waitingForHeader) {
|
||||||
// 1. 先尝试读取头部(固定长度)
|
// // 1. 先尝试读取头部(固定长度)
|
||||||
if (socket->bytesAvailable() < sizeof(PackageHead)) {
|
// if (socket->bytesAvailable() < 4) {
|
||||||
return; // 数据不够,等待下次触发
|
// continue; // 数据不够,等待下次触发
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // 读取头部
|
||||||
|
// socket->read(reinterpret_cast<char*>(&header), 4);
|
||||||
|
|
||||||
|
// // 验证头部标识(0xAA55AA)
|
||||||
|
// if (header[0] != 0xAA ||
|
||||||
|
// header[1] != 0x55 ||
|
||||||
|
// header[2] != 0xAA) {
|
||||||
|
// qWarning() << "Invalid header! Disconnecting...";
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// char temp[10]={0};
|
||||||
|
// if(header[3] == kDownloadConfigFile){
|
||||||
|
|
||||||
|
// socket->read(reinterpret_cast<char*>(&temp), 6);
|
||||||
|
// memcpy((char*)&packge_len,temp + 2, 4);
|
||||||
|
// }else{
|
||||||
|
// QByteArray remain_data = socket->readAll();
|
||||||
|
// m_buffer.clear();
|
||||||
|
// m_buffer.append(reinterpret_cast<char*>(&header), 4); // 先存头部
|
||||||
|
// m_buffer.append(remain_data);
|
||||||
|
// emit dataReceived(m_buffer);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // 进入等待数据状态
|
||||||
|
// m_waitingForHeader = false;
|
||||||
|
// m_buffer.clear();
|
||||||
|
// m_buffer.append(reinterpret_cast<char*>(&header), 4); // 先存头部
|
||||||
|
// m_buffer.append(reinterpret_cast<char*>(&temp), 6); // 先存头部
|
||||||
|
// } else {
|
||||||
|
// // 2. 根据头部的 len 读取剩余数据
|
||||||
|
// qint64 remainingBytes = packge_len - (m_buffer.size() - 10);
|
||||||
|
|
||||||
|
// if (remainingBytes <= 0) {
|
||||||
|
// // 数据已经完整,触发信号
|
||||||
|
// emit dataReceived(m_buffer);
|
||||||
|
// m_waitingForHeader = true; // 重置状态,准备接收下一个包
|
||||||
|
// break; // 继续处理缓冲区可能的下一个包
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // 读取剩余数据(不超过 remainingBytes)
|
||||||
|
// QByteArray newData = socket->read(remainingBytes);
|
||||||
|
// qDebug() << "Read" << newData.size() << "bytes";
|
||||||
|
// m_buffer.append(newData);
|
||||||
|
|
||||||
|
// // 检查是否已经读完
|
||||||
|
// if (m_buffer.size() - 10 >= packge_len) {
|
||||||
|
// qDebug() << "m_buffer" << m_buffer.size() << "bytes";
|
||||||
|
// emit dataReceived(m_buffer);
|
||||||
|
// m_waitingForHeader = true; // 准备接收下一个包
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
m_buffer.append(socket->readAll());
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (m_buffer.size() < sizeof(BaseHeader)) return;
|
||||||
|
|
||||||
|
const BaseHeader *base = reinterpret_cast<const BaseHeader *>(m_buffer.constData());
|
||||||
|
if (!(base->head[0] == 0xAA && base->head[1] == 0x55 && base->head[2] == 0xAA)) {
|
||||||
|
m_buffer.remove(0, 1);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 读取头部
|
uint8_t cmd = base->cmd;
|
||||||
socket->read(reinterpret_cast<char*>(&m_currentHead), sizeof(PackageHead));
|
|
||||||
|
|
||||||
// 验证头部标识(0xAA55AA)
|
if (cmd == kDownloadConfigFile) {
|
||||||
if (m_currentHead.head[0] != 0xAA ||
|
if (m_buffer.size() < sizeof(BaseHeader) + sizeof(LargeHeaderExtra))
|
||||||
m_currentHead.head[1] != 0x55 ||
|
return; // 等待更多数据
|
||||||
m_currentHead.head[2] != 0xAA) {
|
|
||||||
qWarning() << "Invalid header! Disconnecting...";
|
const LargeHeaderExtra *extra = reinterpret_cast<const LargeHeaderExtra *>(
|
||||||
return;
|
m_buffer.constData() + sizeof(BaseHeader));
|
||||||
|
int payloadLen = extra->len;
|
||||||
|
if (payloadLen <= 0 || payloadLen > 1024 * 1024) {
|
||||||
|
qWarning() << "Detected abnormal payload length:" << payloadLen;
|
||||||
|
m_buffer.remove(0, sizeof(BaseHeader)); // 丢弃当前包头
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
int totalLen = sizeof(BaseHeader) + sizeof(LargeHeaderExtra) + extra->len;
|
||||||
|
if (m_buffer.size() < totalLen)
|
||||||
|
return; // 等待完整数据到达
|
||||||
|
|
||||||
// 进入等待数据状态
|
QByteArray payload = m_buffer.mid(sizeof(BaseHeader) + sizeof(LargeHeaderExtra), extra->len);
|
||||||
m_waitingForHeader = false;
|
emit dataReceived( m_buffer);
|
||||||
m_buffer.clear();
|
m_buffer.remove(0, totalLen);
|
||||||
m_buffer.append(reinterpret_cast<char*>(&m_currentHead), sizeof(PackageHead)); // 先存头部
|
|
||||||
} else {
|
} else {
|
||||||
// 2. 根据头部的 len 读取剩余数据
|
QByteArray fullData = m_buffer;
|
||||||
qint64 remainingBytes = m_currentHead.len - (m_buffer.size() - sizeof(PackageHead));
|
emit dataReceived(fullData);
|
||||||
|
m_buffer.clear();
|
||||||
if (remainingBytes <= 0) {
|
return; // 等待下一批数据
|
||||||
// 数据已经完整,触发信号
|
|
||||||
emit dataReceived(m_buffer);
|
|
||||||
m_waitingForHeader = true; // 重置状态,准备接收下一个包
|
|
||||||
break; // 继续处理缓冲区可能的下一个包
|
|
||||||
}
|
|
||||||
|
|
||||||
// 读取剩余数据(不超过 remainingBytes)
|
|
||||||
QByteArray newData = socket->read(remainingBytes);
|
|
||||||
qDebug() << "Read" << newData.size() << "bytes";
|
|
||||||
m_buffer.append(newData);
|
|
||||||
|
|
||||||
// 检查是否已经读完
|
|
||||||
if (m_buffer.size() - sizeof(PackageHead) >= m_currentHead.len) {
|
|
||||||
qDebug() << "m_buffer" << m_buffer.size() << "bytes";
|
|
||||||
emit dataReceived(m_buffer);
|
|
||||||
m_waitingForHeader = true; // 准备接收下一个包
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// QByteArray data = socket->readAll();
|
|
||||||
// emit dataReceived(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyTcpClient::onDisconnected() {
|
void MyTcpClient::onDisconnected() {
|
||||||
|
@ -43,7 +43,9 @@ private:
|
|||||||
|
|
||||||
QByteArray m_buffer; // 存储当前正在接收的数据
|
QByteArray m_buffer; // 存储当前正在接收的数据
|
||||||
bool m_waitingForHeader = true; // 是否在等待头部
|
bool m_waitingForHeader = true; // 是否在等待头部
|
||||||
PackageHead m_currentHead; // 当前包的头部信息
|
|
||||||
|
uint8_t header[4];
|
||||||
|
int packge_len ;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MYTCPCLIENT_H
|
#endif // MYTCPCLIENT_H
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="lineEdit_IP">
|
<widget class="QLineEdit" name="lineEdit_IP">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>192.168.0.100</string>
|
<string>192.168.0.101</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -375,6 +375,7 @@ typedef struct {
|
|||||||
uint8_t subcard_id; // 子板编号,从1开始
|
uint8_t subcard_id; // 子板编号,从1开始
|
||||||
uint8_t stage; // 0: 配置开始 1:配置结束
|
uint8_t stage; // 0: 配置开始 1:配置结束
|
||||||
} UploadConfigProgress;
|
} UploadConfigProgress;
|
||||||
|
|
||||||
// kDownloadConfigFile
|
// kDownloadConfigFile
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t head[3]; // 固定值:0xAA55AA
|
uint8_t head[3]; // 固定值:0xAA55AA
|
||||||
@ -436,6 +437,50 @@ typedef struct {
|
|||||||
uint8_t code;
|
uint8_t code;
|
||||||
} BaudrateSetRsp;
|
} BaudrateSetRsp;
|
||||||
|
|
||||||
|
//kConfigIPv4
|
||||||
|
typedef struct {
|
||||||
|
uint8_t head[3]; // 固定值:0xAA55AA
|
||||||
|
uint8_t cmd;
|
||||||
|
uint8_t version; // 版本号,默认为1
|
||||||
|
uint8_t ethn; // 0: eth0, 1: eth1
|
||||||
|
char ip[16];
|
||||||
|
char netmask[16];
|
||||||
|
char gw[16];
|
||||||
|
} ConfigIPv4Req;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t head[3]; // 固定值:0xAA55AA
|
||||||
|
uint8_t cmd;
|
||||||
|
uint8_t version; // 版本号,默认为1
|
||||||
|
uint8_t code;
|
||||||
|
} ConfigIPv4Rsp;
|
||||||
|
|
||||||
|
//ConfigMacReq
|
||||||
|
typedef struct {
|
||||||
|
uint8_t head[3]; // 固定值:0xAA55AA
|
||||||
|
uint8_t cmd;
|
||||||
|
uint8_t version; // 版本号,默认为1
|
||||||
|
uint8_t ethn; // 0: eth0, 1: eth1
|
||||||
|
char mac[18];
|
||||||
|
} ConfigMacReq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t head[3]; // 固定值:0xAA55AA
|
||||||
|
uint8_t cmd;
|
||||||
|
uint8_t version; // 版本号,默认为1
|
||||||
|
uint8_t code;
|
||||||
|
} ConfigMacRsp;
|
||||||
|
|
||||||
|
struct BaseHeader {
|
||||||
|
uint8_t head[3]; // 固定 0xAA 0x55 0xAA
|
||||||
|
uint8_t cmd;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LargeHeaderExtra {
|
||||||
|
uint8_t version;
|
||||||
|
uint8_t code;
|
||||||
|
int32_t len;
|
||||||
|
};
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
@ -24,17 +24,15 @@ EthConfig::~EthConfig()
|
|||||||
|
|
||||||
void EthConfig::on_pushButton_confirm_clicked()
|
void EthConfig::on_pushButton_confirm_clicked()
|
||||||
{
|
{
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kRebootCard, sizeof(ConfigIPv4Req),0,{} };
|
ConfigIPv4Req config_ip = { {0xAA, 0x55, 0xAA}, kRebootCard, 1,0,{},{},{} };
|
||||||
ConfigIPv4Req config_ip;
|
|
||||||
config_ip.ethn = ui->comboBox_eth->currentIndex();
|
config_ip.ethn = ui->comboBox_eth->currentIndex();
|
||||||
memcpy(config_ip.ip,ui->lineEdit_IP->text().toStdString().c_str(),sizeof(config_ip.ip));
|
memcpy(config_ip.ip,ui->lineEdit_IP->text().toStdString().c_str(),sizeof(config_ip.ip));
|
||||||
memcpy(config_ip.netmask,ui->lineEdit_netmask->text().toStdString().c_str(),sizeof(config_ip.netmask));
|
memcpy(config_ip.netmask,ui->lineEdit_netmask->text().toStdString().c_str(),sizeof(config_ip.netmask));
|
||||||
memcpy(config_ip.gw,ui->lineEdit_gw->text().toStdString().c_str(),sizeof(config_ip.gw));
|
memcpy(config_ip.gw,ui->lineEdit_gw->text().toStdString().c_str(),sizeof(config_ip.gw));
|
||||||
char send_buf[100] ={0};
|
char send_buf[100] ={0};
|
||||||
memcpy(send_buf, (char*)&header, sizeof(PackageHead));
|
memcpy(send_buf, (char*)&config_ip, sizeof(ConfigIPv4Req));
|
||||||
memcpy(send_buf + sizeof(PackageHead), (char*)&config_ip, sizeof(ConfigIPv4Req));
|
|
||||||
|
|
||||||
int length = sizeof(PackageHead) + sizeof(ConfigIPv4Req);
|
int length = sizeof(ConfigIPv4Req);
|
||||||
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
||||||
m_tcpClient->waitForRead();
|
m_tcpClient->waitForRead();
|
||||||
qDebug() << "bytesWritten: " << bytesWritten;
|
qDebug() << "bytesWritten: " << bytesWritten;
|
||||||
|
@ -20,14 +20,12 @@ MacConfig::~MacConfig()
|
|||||||
|
|
||||||
void MacConfig::on_pushButton_confirm_clicked()
|
void MacConfig::on_pushButton_confirm_clicked()
|
||||||
{
|
{
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kConfigMac, sizeof(ConfigMacReq),0,{} };
|
ConfigMacReq config_mac = { {0xAA, 0x55, 0xAA}, kConfigMac, 1,0,{} };
|
||||||
ConfigMacReq config_mac;
|
|
||||||
memcpy(config_mac.mac,ui->lineEdit_mac->text().toStdString().c_str(),sizeof(config_mac.mac));
|
memcpy(config_mac.mac,ui->lineEdit_mac->text().toStdString().c_str(),sizeof(config_mac.mac));
|
||||||
char send_buf[20] ={0};
|
char send_buf[50] ={0};
|
||||||
memcpy(send_buf, (char*)&header, sizeof(PackageHead));
|
memcpy(send_buf, (char*)&config_mac, sizeof(ConfigMacReq));
|
||||||
memcpy(send_buf + sizeof(PackageHead), (char*)&config_mac, sizeof(ConfigMacReq));
|
|
||||||
|
|
||||||
int length = sizeof(PackageHead) + sizeof(ConfigMacReq);
|
int length = sizeof(ConfigMacReq);
|
||||||
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
||||||
m_tcpClient->waitForRead();
|
m_tcpClient->waitForRead();
|
||||||
qDebug() << "bytesWritten: " << bytesWritten;
|
qDebug() << "bytesWritten: " << bytesWritten;
|
||||||
|
@ -571,6 +571,7 @@ void MainWindow::on_pushButton_save_clicked() {
|
|||||||
return;
|
return;
|
||||||
QString file_name = filepath + "\\tsi_config_file.json";
|
QString file_name = filepath + "\\tsi_config_file.json";
|
||||||
ConfigMgr::Instance()->Save(file_name);
|
ConfigMgr::Instance()->Save(file_name);
|
||||||
|
tsi_config_file = file_name;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -660,26 +661,23 @@ void MainWindow::sendUpgradePackage(int slot) {
|
|||||||
qDebug() << "Byte" << var << ":" << static_cast<uint8_t>(fileData[var]);
|
qDebug() << "Byte" << var << ":" << static_cast<uint8_t>(fileData[var]);
|
||||||
}
|
}
|
||||||
qDebug() << "fileSize" << fileSize ;
|
qDebug() << "fileSize" << fileSize ;
|
||||||
// 创建 PackageHead 结构体
|
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, 3, fileSize, 0, {} };
|
|
||||||
// 计算文件的 CRC 校验和
|
// 计算文件的 CRC 校验和
|
||||||
qDebug() << "filheader.slot" << slot ;
|
qDebug() << "filheader.slot" << slot ;
|
||||||
UpgradeCardReq upgrade_car_req;
|
UpgradeCardReq upgrade_car_req = { {0xAA, 0x55, 0xAA}, kUpgradeCard, 1, fileSize, 0, 0, {} };
|
||||||
if (slot == 0) {
|
if (slot == 0) {
|
||||||
upgrade_car_req.card_id = 0xFF;
|
upgrade_car_req.card_id = 0xFF;
|
||||||
} else {
|
} else {
|
||||||
upgrade_car_req.card_id = slot & 0xFF;
|
upgrade_car_req.card_id = slot & 0xFF;
|
||||||
}
|
}
|
||||||
header.crc = calculate_crc(upgrade_car_req.card_id, fileData);
|
upgrade_car_req.crc = calculate_crc(upgrade_car_req.card_id, fileData);
|
||||||
header.len = fileSize + sizeof(UpgradeCardReq);
|
upgrade_car_req.len = fileSize + sizeof(UpgradeCardReq);
|
||||||
qDebug() << "filheader.crc" << header.crc << "card_id" << upgrade_car_req.card_id << "header len" << header.len;
|
qDebug() << "filheader.crc" << upgrade_car_req.crc << "card_id" << upgrade_car_req.card_id << "header len" << upgrade_car_req.len;
|
||||||
char *send_buf = NULL;
|
char *send_buf = NULL;
|
||||||
send_buf = (char *)malloc(sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1);
|
send_buf = (char *)malloc(sizeof(UpgradeCardReq) + fileData.size() + 1);
|
||||||
memset(send_buf, 0, sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size() + 1);
|
memset(send_buf, 0, sizeof(UpgradeCardReq) + fileData.size() + 1);
|
||||||
memcpy(send_buf, &header, sizeof(PackageHead));
|
memcpy(send_buf, &upgrade_car_req, sizeof(UpgradeCardReq));
|
||||||
memcpy(send_buf + sizeof(PackageHead), &upgrade_car_req, sizeof(UpgradeCardReq));
|
memcpy(send_buf + sizeof(UpgradeCardReq), fileData.data(), fileData.size());
|
||||||
memcpy(send_buf + sizeof(PackageHead) + sizeof(UpgradeCardReq), fileData.data(), fileData.size());
|
int length = sizeof(UpgradeCardReq) + fileData.size();
|
||||||
int length = sizeof(PackageHead) + sizeof(UpgradeCardReq) + fileData.size();
|
|
||||||
const int MAX_CHUNK_SIZE = 50 * 1024; // 64 KB
|
const int MAX_CHUNK_SIZE = 50 * 1024; // 64 KB
|
||||||
qint64 bytesSent = 0;
|
qint64 bytesSent = 0;
|
||||||
qint64 totalBytes = length;
|
qint64 totalBytes = length;
|
||||||
@ -713,18 +711,16 @@ void MainWindow::sendUpgradePackage(int slot) {
|
|||||||
|
|
||||||
void MainWindow::getVersion(int slot) {
|
void MainWindow::getVersion(int slot) {
|
||||||
slot_no = slot;
|
slot_no = slot;
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kGetVersionInfo, 1, 0, {} };
|
|
||||||
qDebug() << "slot" << slot ;
|
qDebug() << "slot" << slot ;
|
||||||
GetVersionReq get_version_req;
|
GetVersionReq get_version_req = { {0xAA, 0x55, 0xAA}, kGetVersionInfo, 1, 0 };
|
||||||
if (slot == 0) {
|
if (slot == 0) {
|
||||||
get_version_req.card_id = 0xFF;
|
get_version_req.card_id = 0xFF;
|
||||||
} else {
|
} else {
|
||||||
get_version_req.card_id = slot & 0xFF;
|
get_version_req.card_id = slot & 0xFF;
|
||||||
}
|
}
|
||||||
char send_buf[20] = {0};
|
char send_buf[20] = {0};
|
||||||
memcpy(send_buf, (char *)&header, sizeof(PackageHead));
|
memcpy(send_buf, (char *)&get_version_req, sizeof(GetVersionReq));
|
||||||
memcpy(send_buf + sizeof(PackageHead), (char *)&get_version_req, sizeof(GetVersionReq));
|
int length = sizeof(GetVersionReq);
|
||||||
int length = sizeof(PackageHead) + sizeof(GetVersionReq);
|
|
||||||
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
||||||
m_tcpClient->waitForRead();
|
m_tcpClient->waitForRead();
|
||||||
qDebug() << "bytesWritten: " << bytesWritten;
|
qDebug() << "bytesWritten: " << bytesWritten;
|
||||||
@ -732,43 +728,39 @@ void MainWindow::getVersion(int slot) {
|
|||||||
|
|
||||||
void MainWindow::readData(const QByteArray &data) {
|
void MainWindow::readData(const QByteArray &data) {
|
||||||
qDebug() << "Received from server:" << data;
|
qDebug() << "Received from server:" << data;
|
||||||
PackageHead header;
|
|
||||||
memcpy(&header, data.data(), sizeof(PackageHead));
|
uint8_t cmd = data[3];
|
||||||
if (header.cmd == kGetVersionInfo) {
|
if (cmd == kGetVersionInfo) {
|
||||||
VersionRsp version_rsp;
|
VersionRsp version_rsp;
|
||||||
memcpy(&version_rsp, data.data() + sizeof(PackageHead), sizeof(VersionRsp));
|
memcpy(&version_rsp, data.data(), sizeof(VersionRsp));
|
||||||
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);
|
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_date);
|
||||||
QMessageBox::information(this, QStringLiteral("提示"), strVerion);
|
QMessageBox::information(this, QStringLiteral("提示"), strVerion);
|
||||||
} else if (header.cmd == kUpgradeCard) {
|
} else if (cmd == kUpgradeCard) {
|
||||||
UpgradeRsp resp;
|
UpgradeRsp resp;
|
||||||
QByteArray byteArray = data.mid(sizeof(PackageHead));
|
memcpy(&resp, data.data(), sizeof(UpgradeRsp));
|
||||||
QDataStream stream(&byteArray, QIODevice::ReadOnly);
|
} else if (cmd == kUpgradeProgress) {
|
||||||
stream >> resp.code ;
|
|
||||||
// if(resp.code == 1){
|
|
||||||
// QMessageBox::information(this, QStringLiteral("提示"), "上传成功!");
|
|
||||||
// }
|
|
||||||
} else if (header.cmd == kUpgradeProgress) {
|
|
||||||
QByteArray byteArray = data.mid(sizeof(PackageHead));
|
|
||||||
UpgradeRsp upgrade_resp;
|
UpgradeRsp upgrade_resp;
|
||||||
QDataStream stream(&byteArray, QIODevice::ReadOnly);
|
memcpy(&upgrade_resp, data.data(), sizeof(UpgradeRsp));
|
||||||
stream >> upgrade_resp.code ;
|
|
||||||
progressBar->setValue(upgrade_resp.code);
|
progressBar->setValue(upgrade_resp.code);
|
||||||
if (upgrade_resp.code == 100) {
|
if (upgrade_resp.code == 100) {
|
||||||
progressBar->setVisible(false);
|
progressBar->setVisible(false);
|
||||||
statusBar()->showMessage("升级完成!", 3000); // 显示3秒
|
statusBar()->showMessage("升级完成!", 3000); // 显示3秒
|
||||||
}
|
}
|
||||||
//qDebug() << "Server response: " << upgrade_resp.code;
|
//qDebug() << "Server response: " << upgrade_resp.code;
|
||||||
} else if(header.cmd == kDownloadConfigFile){
|
} else if(cmd == kDownloadConfigFile){
|
||||||
//qDebug() << "header.len" << header.len;
|
//qDebug() << "header.len" << header.len;
|
||||||
char *config_file = NULL;
|
char *config_file = NULL;
|
||||||
config_file = (char*)malloc(header.len + 1);
|
int len = data[4];
|
||||||
memset(config_file,0,header.len + 1);
|
DownloadConfigRsp download_config;
|
||||||
memcpy(config_file, data.data() + sizeof(PackageHead), header.len);
|
memcpy(&download_config,data,sizeof(DownloadConfigRsp));
|
||||||
|
config_file = (char*)malloc(download_config.len + 1);
|
||||||
|
memset(config_file,0,download_config.len + 1);
|
||||||
|
memcpy(config_file, data.data() + sizeof(DownloadConfigRsp), download_config.len);
|
||||||
QString filename_ = QCoreApplication::applicationDirPath() + "\\config\\tsi_config_file_download.json";
|
QString filename_ = QCoreApplication::applicationDirPath() + "\\config\\tsi_config_file_download.json";
|
||||||
//qDebug() << config_file ;
|
//qDebug() << config_file ;
|
||||||
QFile file(filename_);
|
QFile file(filename_);
|
||||||
file.open(QIODevice::WriteOnly);
|
file.open(QIODevice::WriteOnly);
|
||||||
file.write(config_file,header.len);
|
file.write(config_file,download_config.len);
|
||||||
file.close();
|
file.close();
|
||||||
if(config_file != NULL)
|
if(config_file != NULL)
|
||||||
free(config_file);
|
free(config_file);
|
||||||
@ -777,11 +769,9 @@ void MainWindow::readData(const QByteArray &data) {
|
|||||||
|
|
||||||
void MainWindow::on_pushButton_download_clicked()
|
void MainWindow::on_pushButton_download_clicked()
|
||||||
{
|
{
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kDownloadConfigFile, 1, 0, {} };
|
DownloadConfigReq download_config_req = { {0xAA, 0x55, 0xAA}, kDownloadConfigFile, 1 };
|
||||||
char send_buf[20] = {0};
|
int length = sizeof(download_config_req);
|
||||||
memcpy(send_buf, (char *)&header, sizeof(PackageHead));
|
qint64 bytesWritten = m_tcpClient->sendData((char*)&download_config_req, length);
|
||||||
int length = sizeof(PackageHead);
|
|
||||||
qint64 bytesWritten = m_tcpClient->sendData(send_buf, length);
|
|
||||||
m_tcpClient->waitForRead();
|
m_tcpClient->waitForRead();
|
||||||
qDebug() << "bytesWritten: " << bytesWritten;
|
qDebug() << "bytesWritten: " << bytesWritten;
|
||||||
}
|
}
|
||||||
@ -834,16 +824,16 @@ void MainWindow::on_pushButton_upload_clicked()
|
|||||||
}
|
}
|
||||||
qDebug() << "fileSize" << fileSize ;
|
qDebug() << "fileSize" << fileSize ;
|
||||||
// 创建 PackageHead 结构体
|
// 创建 PackageHead 结构体
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kUploadConfigFile, fileSize, 0, {} };
|
UploadConfigReq upload_config_req = { {0xAA, 0x55, 0xAA}, kUploadConfigFile,1, fileSize, 0, 0, {} };
|
||||||
// 计算文件的 CRC 校验和
|
// 计算文件的 CRC 校验和
|
||||||
header.crc = calculate_crc(0, fileData);
|
upload_config_req.crc = calculate_crc(0, fileData);
|
||||||
header.len = fileSize;
|
upload_config_req.len = fileSize;
|
||||||
char *send_buf = NULL;
|
char *send_buf = NULL;
|
||||||
send_buf = (char *)malloc(sizeof(PackageHead) + fileData.size() + 1);
|
send_buf = (char *)malloc(sizeof(UploadConfigReq) + fileData.size() + 1);
|
||||||
memset(send_buf, 0, sizeof(PackageHead) + fileData.size() + 1);
|
memset(send_buf, 0, sizeof(UploadConfigReq) + fileData.size() + 1);
|
||||||
memcpy(send_buf, &header, sizeof(PackageHead));
|
memcpy(send_buf, &upload_config_req, sizeof(UploadConfigReq));
|
||||||
memcpy(send_buf + sizeof(PackageHead), fileData.data(), fileData.size());
|
memcpy(send_buf + sizeof(UploadConfigReq), fileData.data(), fileData.size());
|
||||||
int length = sizeof(PackageHead) + fileData.size();
|
int length = sizeof(UploadConfigReq) + fileData.size();
|
||||||
const int MAX_CHUNK_SIZE = 50 * 1024; // 50 KB
|
const int MAX_CHUNK_SIZE = 50 * 1024; // 50 KB
|
||||||
qint64 bytesSent = 0;
|
qint64 bytesSent = 0;
|
||||||
qint64 totalBytes = length;
|
qint64 totalBytes = length;
|
||||||
|
@ -125,7 +125,7 @@
|
|||||||
<widget class="QPushButton" name="pushButton_download">
|
<widget class="QPushButton" name="pushButton_download">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>190</x>
|
<x>260</x>
|
||||||
<y>20</y>
|
<y>20</y>
|
||||||
<width>45</width>
|
<width>45</width>
|
||||||
<height>45</height>
|
<height>45</height>
|
||||||
@ -147,6 +147,31 @@
|
|||||||
<string>下载</string>
|
<string>下载</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QPushButton" name="pushButton_upload_config">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>200</x>
|
||||||
|
<y>20</y>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>45</width>
|
||||||
|
<height>45</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>上传和配置</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -14,11 +14,8 @@ RelaySetting::RelaySetting(QWidget *parent)
|
|||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->widget_body->setProperty("flag", "body");
|
ui->widget_body->setProperty("flag", "body");
|
||||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
readJsonFile(QCoreApplication::applicationDirPath() + "\\config\\main.json");
|
for (int var = 0; var < SLOT_NUM; ++var) {
|
||||||
for (int var = 0; var < map_slot_config.size(); ++var) {
|
ui->comboBox_slot->addItem(QString::number(var + 1));
|
||||||
if (map_slot_config[var].slot_type == 30) {
|
|
||||||
ui->comboBox_slot->addItem(QString::number(map_slot_config[var].slot));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
connect(ui->buttonGroup_OK, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
|
connect(ui->buttonGroup_OK, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
|
||||||
this, &RelaySetting::onRadioButtonClicked);
|
this, &RelaySetting::onRadioButtonClicked);
|
||||||
@ -60,8 +57,31 @@ RelaySetting::RelaySetting(QWidget *parent)
|
|||||||
this, &RelaySetting::onRadioButtonClicked);
|
this, &RelaySetting::onRadioButtonClicked);
|
||||||
connect(ui->buttonGroup_STATUS, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
|
connect(ui->buttonGroup_STATUS, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
|
||||||
this, &RelaySetting::onRadioButtonClicked);
|
this, &RelaySetting::onRadioButtonClicked);
|
||||||
}
|
|
||||||
|
|
||||||
|
m_tcpClient = MyTcpClient::instance();
|
||||||
|
connect(m_tcpClient, SIGNAL(dataReceived(const QByteArray &)), this, SLOT(readData(const QByteArray &)));
|
||||||
|
}
|
||||||
|
void RelaySetting::readData(const QByteArray &data) {
|
||||||
|
qDebug() << "Received from server:" << data;
|
||||||
|
|
||||||
|
uint8_t cmd = data[3];
|
||||||
|
if (cmd == kRelaySetting) {
|
||||||
|
RelaySettingRsp relay_setting_rsp;
|
||||||
|
memcpy(&relay_setting_rsp, data.data(), sizeof(RelaySettingRsp));
|
||||||
|
qDebug() << "relay_setting_rsp code" << relay_setting_rsp.code ;
|
||||||
|
}else if(cmd == kRelayStatus){
|
||||||
|
RelayStatusRsp relay_status_rsp;
|
||||||
|
memcpy(&relay_status_rsp, data.data(), sizeof(RelayStatusRsp));
|
||||||
|
qDebug() << "relay_setting_rsp status" << relay_status_rsp.status ;
|
||||||
|
if (relay_status_rsp.status == 7) {
|
||||||
|
ui->label_status->setText("测试");
|
||||||
|
} else if (relay_status_rsp.status == 8) {
|
||||||
|
ui->label_status->setText("手动");
|
||||||
|
} else if (relay_status_rsp.status == 9) {
|
||||||
|
ui->label_status->setText("工作");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
RelaySetting::~RelaySetting() {
|
RelaySetting::~RelaySetting() {
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
@ -111,10 +131,9 @@ void RelaySetting::onRadioButtonClicked(QAbstractButton *button) {
|
|||||||
qDebug() << "Connection failed!";
|
qDebug() << "Connection failed!";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kRelaySetting, sizeof(RelaySettingReq), 0, {} };
|
RelaySettingReq relay_setting_req = { {0xAA, 0x55, 0xAA}, kRelaySetting,1, 0, 0, 0 };
|
||||||
int slot = ui->comboBox_slot->currentText().toInt();
|
int slot = ui->comboBox_slot->currentText().toInt();
|
||||||
qDebug() << "slot" << slot ;
|
qDebug() << "slot" << slot ;
|
||||||
RelaySettingReq relay_setting_req;
|
|
||||||
if (slot == 0) {
|
if (slot == 0) {
|
||||||
relay_setting_req.card_id = 0xFF;
|
relay_setting_req.card_id = 0xFF;
|
||||||
} else {
|
} else {
|
||||||
@ -156,60 +175,30 @@ void RelaySetting::onRadioButtonClicked(QAbstractButton *button) {
|
|||||||
}
|
}
|
||||||
qDebug() << "relay_setting_req.led_operate " << relay_setting_req.led_operate;
|
qDebug() << "relay_setting_req.led_operate " << relay_setting_req.led_operate;
|
||||||
char send_buf[20] = {0};
|
char send_buf[20] = {0};
|
||||||
memcpy(send_buf, (char *)&header, sizeof(PackageHead));
|
memcpy(send_buf, (char *)&relay_setting_req, sizeof(RelaySettingReq));
|
||||||
memcpy(send_buf + sizeof(PackageHead), (char *)&relay_setting_req, sizeof(RelaySettingReq));
|
int length = sizeof(RelaySettingReq) + sizeof(RelaySettingReq);
|
||||||
int length = sizeof(PackageHead) + sizeof(RelaySettingReq);
|
qint64 bytesWritten = m_tcpClient->sendData((char*)&send_buf, length);
|
||||||
qint64 bytesWritten = socket.write(send_buf, length);
|
m_tcpClient->waitForRead();
|
||||||
qDebug() << "Server response: " << bytesWritten;
|
qDebug() << "Server response: " << bytesWritten;
|
||||||
if (socket.waitForReadyRead()) {
|
|
||||||
QByteArray response = socket.readAll();
|
|
||||||
PackageHead header;
|
|
||||||
RelaySettingRsp relay_setting_rsp;
|
|
||||||
memcpy(&header, response.data(), sizeof(PackageHead));
|
|
||||||
qDebug() << "header len" << header.len ;
|
|
||||||
memcpy(&relay_setting_rsp, response.data() + sizeof(PackageHead), sizeof(RelaySettingRsp));
|
|
||||||
qDebug() << "relay_setting_rsp code" << relay_setting_rsp.code ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RelaySetting::on_pushButton_status_clicked() {
|
void RelaySetting::on_pushButton_status_clicked() {
|
||||||
QTcpSocket socket;
|
|
||||||
// 连接到服务器
|
|
||||||
socket.connectToHost(g_strServerIp, 10000);
|
|
||||||
if (!socket.waitForConnected()) {
|
|
||||||
qDebug() << "Connection failed!";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
PackageHead header = { {0xAA, 0x55, 0xAA}, kRelayStatus, sizeof(RelaySettingReq), 0, {} };
|
|
||||||
int slot = ui->comboBox_slot->currentText().toInt();
|
int slot = ui->comboBox_slot->currentText().toInt();
|
||||||
qDebug() << "slot" << slot ;
|
qDebug() << "slot" << slot ;
|
||||||
RelayStatusReq relay_status_req;
|
RelayStatusReq relay_status_req { {0xAA, 0x55, 0xAA}, kRelayStatus, 1, 0 };
|
||||||
if (slot == 0) {
|
if (slot == 0) {
|
||||||
relay_status_req.card_id = 0xFF;
|
relay_status_req.card_id = 0xFF;
|
||||||
} else {
|
} else {
|
||||||
relay_status_req.card_id = slot & 0xFF;
|
relay_status_req.card_id = slot & 0xFF;
|
||||||
}
|
}
|
||||||
char send_buf[20] = {0};
|
char send_buf[20] = {0};
|
||||||
memcpy(send_buf, (char *)&header, sizeof(PackageHead));
|
memcpy(send_buf, (char *)&relay_status_req, sizeof(RelayStatusReq));
|
||||||
memcpy(send_buf + sizeof(PackageHead), (char *)&relay_status_req, sizeof(RelayStatusReq));
|
int length = sizeof(RelayStatusReq);
|
||||||
int length = sizeof(PackageHead) + sizeof(RelayStatusReq);
|
qint64 bytesWritten = m_tcpClient->sendData((char*)&send_buf, length);
|
||||||
qint64 bytesWritten = socket.write(send_buf, length);
|
m_tcpClient->waitForRead();
|
||||||
qDebug() << "Server response: " << bytesWritten;
|
qDebug() << "Server response: " << bytesWritten;
|
||||||
if (socket.waitForReadyRead()) {
|
|
||||||
QByteArray response = socket.readAll();
|
|
||||||
PackageHead header;
|
|
||||||
RelayStatusRsp relay_status_rsp;
|
|
||||||
memcpy(&header, response.data(), sizeof(PackageHead));
|
|
||||||
qDebug() << "header len" << header.len ;
|
|
||||||
memcpy(&relay_status_rsp, response.data() + sizeof(PackageHead), sizeof(RelayStatusRsp));
|
|
||||||
qDebug() << "relay_setting_rsp status" << relay_status_rsp.status ;
|
|
||||||
if (relay_status_rsp.status == 7) {
|
|
||||||
ui->label_status->setText("测试");
|
|
||||||
} else if (relay_status_rsp.status == 8) {
|
|
||||||
ui->label_status->setText("手动");
|
|
||||||
} else if (relay_status_rsp.status == 9) {
|
|
||||||
ui->label_status->setText("工作");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include "data_config.h"
|
#include "data_config.h"
|
||||||
|
#include "MyTcpClient.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class RelaySetting;
|
class RelaySetting;
|
||||||
@ -20,10 +21,11 @@ private slots:
|
|||||||
void onRadioButtonClicked(QAbstractButton *button);
|
void onRadioButtonClicked(QAbstractButton *button);
|
||||||
|
|
||||||
void on_pushButton_status_clicked();
|
void on_pushButton_status_clicked();
|
||||||
|
void readData(const QByteArray&);
|
||||||
private:
|
private:
|
||||||
Ui::RelaySetting *ui;
|
Ui::RelaySetting *ui;
|
||||||
QMap<int,SlotConfig> map_slot_config;
|
QMap<int,SlotConfig> map_slot_config;
|
||||||
|
MyTcpClient* m_tcpClient;
|
||||||
|
|
||||||
void readJsonFile(const QString &filePath);
|
void readJsonFile(const QString &filePath);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user