+391
-391
@@ -1,391 +1,391 @@
|
||||
#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。"));
|
||||
}
|
||||
#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。"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user