Files
VX5-DiaphragmPump/DlgVoltePara25Dots.cpp
T
2026-10-19 17:48:03 +08:00

392 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "DlgVoltePara25Dots.h"
#include "DevOp.h"
#include <QFile>
#include <LogInfo.h>
DlgVoltePara25Dots::DlgVoltePara25Dots(DevOp *devOp, QWidget *parent)
: QDialog(parent)
, m_devOp(devOp)
{
memset(editContinuous, 0, sizeof(editContinuous));
memset(editRowDelay, 0, sizeof(editRowDelay));
memset(editHead1RowDelay, 0, sizeof(editHead1RowDelay));
memset(editSingleDot, 0, sizeof(editSingleDot));
memset(edit1Dot, 0, sizeof(edit1Dot));
memset(edit2Dots, 0, sizeof(edit2Dots));
memset(edit3Dots, 0, sizeof(edit3Dots));
memset(edit4Dots, 0, sizeof(edit4Dots));
memset(edit5Dots, 0, sizeof(edit5Dots));
memset(editDiff, 0, sizeof(editDiff));
memset(editGiant, 0, sizeof(editGiant));
memset(editAdjustPara, 0, sizeof(editAdjustPara));
setupUI();
}
DlgVoltePara25Dots::~DlgVoltePara25Dots()
{
}
// 创建4列×16行网格布局的tab页(竖排: v0~v15第1列, v16~v31第2列, ...)
QWidget* DlgVoltePara25Dots::createGridTab(int count, QLineEdit* edits[], int numCols)
{
QWidget *page = new QWidget(this);
QGridLayout *grid = new QGridLayout(page);
grid->setSpacing(2);
grid->setContentsMargins(4, 4, 4, 4);
int rowsPerCol = (count + numCols - 1) / numCols;
for (int i = 0; i < count; i++) {
int col = i / rowsPerCol;
int row = i % rowsPerCol;
QLabel *label = new QLabel(QString("v%1").arg(i), page);
label->setFixedWidth(28);
label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
QLineEdit *edit = new QLineEdit("0", page);
edit->setAlignment(Qt::AlignCenter);
edits[i] = edit;
grid->addWidget(label, row, col * 2);
grid->addWidget(edit, row, col * 2 + 1);
}
for (int c = 0; c < numCols; c++) {
grid->setColumnStretch(c * 2, 0);
grid->setColumnStretch(c * 2 + 1, 1);
}
return page;
}
void DlgVoltePara25Dots::setupUI()
{
setWindowTitle(QString("25点阵充电参数编辑"));
//setFixedSize(750, 500);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(4, 4, 4, 4);
mainLayout->setSpacing(4);
tabWidget = new QTabWidget(this);
// 基本tab
tabWidget->addTab(createGridTab(64, editContinuous), QString("连续电压"));
tabWidget->addTab(createGridTab(64, editRowDelay), QString("点延迟"));
tabWidget->addTab(createGridTab(64, editHead1RowDelay), QString("首1点延迟"));
// 通用参数
tabWidget->addTab(createGridTab(8, editAdjustPara), QString("通用参数"));
tabWidget->addTab(createGridTab(64, editSingleDot), QString("单点"));
tabWidget->addTab(createGridTab(64, edit1Dot), QString("一点"));
tabWidget->addTab(createGridTab(64, edit2Dots), QString("两点"));
tabWidget->addTab(createGridTab(64, edit3Dots), QString("三点"));
tabWidget->addTab(createGridTab(64, edit4Dots), QString("四点"));
tabWidget->addTab(createGridTab(64, edit5Dots), QString("五点"));
// 巨点补偿:16组,分4个tab(5,5,5,1组)
// 前3个tab:流式切分[5][64]=320值÷5=64个lineEdit
// 第4个tab:流式切分[1][64]=64值÷5=13个lineEdit(最后一个放4个值)
int giantEditCount[4] = {64, 64, 64, 13};
for (int t = 0; t < 4; t++) {
tabWidget->addTab(createGridTab(giantEditCount[t], editGiant[t]),
QString("巨点补偿%1").arg(t + 1));
}
// 差分补偿:50组÷5=10个tab,每个tab 64通道,每个lineEdit放5个逗号分隔值
static const char* diffTabNames[10] = {
"1点隔1-5点差", "1点隔6-10点差",
"2点隔1-5点差", "2点隔6-10点差",
"3点隔1-5点差", "3点隔6-10点差",
"4点隔1-5点差", "4点隔6-10点差",
"5点隔1-5点差", "5点隔6-10点差"
};
for (int t = 0; t < 10; t++) {
tabWidget->addTab(createGridTab(64, editDiff[t], 5),
QString(diffTabNames[t]));
}
mainLayout->addWidget(tabWidget);
// 底部按钮栏
QHBoxLayout *btnLayout = new QHBoxLayout();
btnLoad = new QPushButton(QString("读取当前值"), this);
btnSave = new QPushButton(QString("保存并推送FPGA"), this);
btnLoad->setMinimumHeight(40);
btnSave->setMinimumHeight(40);
btnLayout->addWidget(btnLoad);
btnLayout->addStretch();
btnLayout->addWidget(btnSave);
mainLayout->addLayout(btnLayout);
connect(btnLoad, SIGNAL(clicked()), this, SLOT(onBtnLoadClicked()));
connect(btnSave, SIGNAL(clicked()), this, SLOT(onBtnSaveClicked()));
}
// ========== 数据加载:结构体 → UI ==========
void DlgVoltePara25Dots::loadDataToUI()
{
if (!sysPara) return;
voltePara_t_25Dots &data = sysPara->voltePara_25Dots;
// 连续电压(单值)
for (int i = 0; i < 64; i++)
editContinuous[i]->setText(QString::number(data.matchContinousDACArray[i]));
// 点延迟(单值)
for (int i = 0; i < 64; i++)
editRowDelay[i]->setText(QString::number(data.matchExtraLineDACArray[i]));
// 首1点延迟(有符号)
for (int i = 0; i < 64; i++)
editHead1RowDelay[i]->setText(QString::number((qint8)data.matchFirstOnePointExtraLineDACArray[i]));
// 单点(首1)
for (int i = 0; i < 64; i++)
editSingleDot[i]->setText(QString::number(data.matchTotalTableDACArrayFirst1[i]));
// 一点
for (int i = 0; i < 64; i++)
edit1Dot[i]->setText(QString::number(data.matchTotalTableDACArray1[i]));
// 两点(2值逗号分隔)
for (int i = 0; i < 64; i++) {
edit2Dots[i]->setText(QString("%1,%2")
.arg(data.matchTotalTableDACArray2[i][0])
.arg(data.matchTotalTableDACArray2[i][1]));
}
// 三点(3值逗号分隔)
for (int i = 0; i < 64; i++) {
edit3Dots[i]->setText(QString("%1,%2,%3")
.arg(data.matchTotalTableDACArray3[i][0])
.arg(data.matchTotalTableDACArray3[i][1])
.arg(data.matchTotalTableDACArray3[i][2]));
}
// 四点(4值逗号分隔)
for (int i = 0; i < 64; i++) {
edit4Dots[i]->setText(QString("%1,%2,%3,%4")
.arg(data.matchTotalTableDACArray4[i][0])
.arg(data.matchTotalTableDACArray4[i][1])
.arg(data.matchTotalTableDACArray4[i][2])
.arg(data.matchTotalTableDACArray4[i][3]));
}
// 五点(5值逗号分隔)
for (int i = 0; i < 64; i++) {
edit5Dots[i]->setText(QString("%1,%2,%3,%4,%5")
.arg(data.matchTotalTableDACArray5[i][0])
.arg(data.matchTotalTableDACArray5[i][1])
.arg(data.matchTotalTableDACArray5[i][2])
.arg(data.matchTotalTableDACArray5[i][3])
.arg(data.matchTotalTableDACArray5[i][4]));
}
// 差分补偿:matchTotalDiffVoltageValue[50][64]
// 每5组一个tab,把[5][64]=320个值按内存顺序展平,每5个连续值放一个lineEdit,共64个lineEdit
// 与oldProject的Load_voltage_diff逻辑一致
for (int t = 0; t < 10; t++) {
int k = 0; // 当前lineEdit内已累积的值计数(1~5)
int num = 0; // 当前lineEdit序号
QString strTemp;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 64; j++) {
k++;
if (k < 5) {
strTemp += QString::number((qint8)data.matchTotalDiffVoltageValue[t * 5 + i][j]);
strTemp += ",";
} else {
strTemp += QString::number((qint8)data.matchTotalDiffVoltageValue[t * 5 + i][j]);
editDiff[t][num]->setText(strTemp);
strTemp = "";
k = 0;
num++;
}
}
}
}
// 巨点补偿:matchGiantPointVoltageValue[16][64]
// 与oldProject一致:流式切分,前3个tab用Load_voltage_diff逻辑,第4个tab用Load_voltage_giant逻辑
{
int giantGroupsPerTab[4] = {5, 5, 5, 1};
int giantOffset = 0;
for (int t = 0; t < 4; t++) {
int groups = giantGroupsPerTab[t];
int k = 0;
int num = 0;
QString strTemp;
for (int i = 0; i < groups; i++) {
for (int j = 0; j < 64; j++) {
k++;
if (k < 5) {
strTemp += QString::number((qint8)data.matchGiantPointVoltageValue[giantOffset + i][j]);
strTemp += ",";
// 第4个tab特殊处理:最后一个值时不足5个也要输出
if (t == 3 && i == groups - 1 && j == 63) {
strTemp.chop(1); // 去掉末尾逗号
editGiant[t][num]->setText(strTemp);
}
} else {
strTemp += QString::number((qint8)data.matchGiantPointVoltageValue[giantOffset + i][j]);
editGiant[t][num]->setText(strTemp);
strTemp = "";
k = 0;
num++;
}
}
}
giantOffset += groups;
}
}
// 通用参数
for (int i = 0; i < 8; i++)
editAdjustPara[i]->setText(QString::number((qint8)data.matchAdjustParaDACArray[i]));
}
// ========== 数据保存:UI → 结构体 ==========
void DlgVoltePara25Dots::saveDataFromUI()
{
if (!sysPara) return;
voltePara_t_25Dots &data = sysPara->voltePara_25Dots;
// 连续电压
for (int i = 0; i < 64; i++)
data.matchContinousDACArray[i] = (quint16)editContinuous[i]->text().toUInt();
// 点延迟
for (int i = 0; i < 64; i++)
data.matchExtraLineDACArray[i] = (quint8)editRowDelay[i]->text().toUInt();
// 首1点延迟
for (int i = 0; i < 64; i++)
data.matchFirstOnePointExtraLineDACArray[i] = (qint8)editHead1RowDelay[i]->text().toInt();
// 单点(首1)
for (int i = 0; i < 64; i++)
data.matchTotalTableDACArrayFirst1[i] = (quint16)editSingleDot[i]->text().toUInt();
// 一点
for (int i = 0; i < 64; i++)
data.matchTotalTableDACArray1[i] = (quint16)edit1Dot[i]->text().toUInt();
// 两点
for (int i = 0; i < 64; i++) {
QStringList parts = edit2Dots[i]->text().split(",");
for (int j = 0; j < 2; j++)
data.matchTotalTableDACArray2[i][j] = parts.size() > j ? (quint16)parts[j].toUInt() : 0;
}
// 三点
for (int i = 0; i < 64; i++) {
QStringList parts = edit3Dots[i]->text().split(",");
for (int j = 0; j < 3; j++)
data.matchTotalTableDACArray3[i][j] = parts.size() > j ? (quint16)parts[j].toUInt() : 0;
}
// 四点
for (int i = 0; i < 64; i++) {
QStringList parts = edit4Dots[i]->text().split(",");
for (int j = 0; j < 4; j++)
data.matchTotalTableDACArray4[i][j] = parts.size() > j ? (quint16)parts[j].toUInt() : 0;
}
// 五点
for (int i = 0; i < 64; i++) {
QStringList parts = edit5Dots[i]->text().split(",");
for (int j = 0; j < 5; j++)
data.matchTotalTableDACArray5[i][j] = parts.size() > j ? (quint16)parts[j].toUInt() : 0;
}
// 差分补偿:与oldProject的Save_voltage_diff逻辑一致
// 每个tab的64个lineEdit各含5个逗号分隔值,展平后按内存顺序写回[5][64]
for (int t = 0; t < 10; t++) {
// 先把64个lineEdit的值全部拼成一个大列表(320个值)
QStringList allValues;
for (int num = 0; num < 64; num++) {
QStringList parts = editDiff[t][num]->text().split(",");
allValues.append(parts);
}
// 按内存顺序写回 [5][64]
int idx = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 64; j++) {
data.matchTotalDiffVoltageValue[t * 5 + i][j] =
idx < allValues.size() ? (qint8)allValues[idx].toInt() : 0;
idx++;
}
}
}
// 巨点补偿:与oldProject一致,流式反解析
{
int giantGroupsPerTab[4] = {5, 5, 5, 1};
int giantEditCount[4] = {64, 64, 64, 13};
int giantOffset = 0;
for (int t = 0; t < 4; t++) {
int groups = giantGroupsPerTab[t];
// 把所有lineEdit的值拼成一个大列表
QStringList allValues;
for (int num = 0; num < giantEditCount[t]; num++) {
QStringList parts = editGiant[t][num]->text().split(",");
allValues.append(parts);
}
// 按内存顺序写回 [groups][64]
int idx = 0;
for (int i = 0; i < groups; i++) {
for (int j = 0; j < 64; j++) {
data.matchGiantPointVoltageValue[giantOffset + i][j] =
idx < allValues.size() ? (qint8)allValues[idx].toInt() : 0;
idx++;
}
}
giantOffset += groups;
}
}
// 通用参数
for (int i = 0; i < 8; i++)
data.matchAdjustParaDACArray[i] = (qint8)editAdjustPara[i]->text().toInt();
}
// ========== 按钮槽函数 ==========
void DlgVoltePara25Dots::onBtnLoadClicked()
{
loadDataToUI();
}
void DlgVoltePara25Dots::onBtnSaveClicked()
{
saveDataFromUI();
if (m_devOp) {
m_devOp->writeDacValue2Fpga_No72NewVoltData();
}
QFile file(DOC_ROOT_DIR"VoltDataStd25.bin");
if(!file.open(QIODevice::WriteOnly)) {
QMessageBox::information(this, QString("注意"), QString("充电数据已经写入FPGA, 但是没有保存到文件。"));
return;
}
int written = file.write((const char*)&(sysPara->voltePara_25Dots), sizeof(voltePara_t_25Dots));
file.close();
if(written != sizeof(voltePara_t_25Dots)) {
LogInfo::setRunStatusText("写入文件VoltDataStd25.bin失败");
}
QMessageBox::information(this, QString("完成"), QString("充电参数已保存并推送至FPGA。"));
}