392 lines
14 KiB
C++
392 lines
14 KiB
C++
#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。"));
|
||
}
|