#include "DlgVoltePara25Dots.h" #include "DevOp.h" #include #include 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。")); }