qt/ledset/expertwin.cpp

1218 lines
56 KiB
C++
Raw Normal View History

2022-08-25 18:43:03 +08:00
#include "expertwin.h"
2023-03-31 18:44:09 +08:00
#include "gutil/qgui.h"
2022-08-25 18:43:03 +08:00
#include "screenunit.h"
2023-04-18 18:21:34 +08:00
#include "expertboxlayoutwin.h"
2022-08-25 18:43:03 +08:00
#include "expertsmartpointsetwin.h"
2022-08-26 23:15:25 +08:00
#include "expertscreenconnwin.h"
2023-08-24 16:55:38 +08:00
#include "globalfunc.h"
2022-08-25 18:43:03 +08:00
#include <QTabWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QGroupBox>
2022-09-13 23:16:36 +08:00
#include <QStackedWidget>
#include <QRadioButton>
2022-12-16 15:08:53 +08:00
#include <QCheckBox>
#include <QApplication>
#include <QFile>
#include <QJsonDocument>
#include <QJsonArray>
#include <QMessageBox>
#include <QFileDialog>
2023-07-28 14:48:41 +08:00
#include <QSplitter>
2022-08-25 18:43:03 +08:00
2023-09-01 16:17:33 +08:00
auto zrf_param_msg = QByteArray::fromHex( "00 00 06 20 10 10 00 E4 06 FF FF FF FF 00 00 80 80 80 00 00 00 1F 00 00 00 3C 01 33 00 00 00 80 00 00 12 05 00 00 00 01 02 "
"03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 01 00 00 00 00 10 00 00 20 00 00 30 "
"00 00 40 00 00 50 00 00 60 00 00 70 00 00 80 00 00 90 00 00 A0 00 00 B0 00 00 C0 00 00 D0 00 00 F0 00 00 00 01 00 10 01 00 "
"20 01 00 30 01 00 40 01 00 50 01 00 60 01 00 70 01 00 80 01 00 90 01 00 A0 01 00 B0 01 00 C0 01 00 D0 01 00 F0 01 00 00 02 "
"00 10 02 05 00 1F F8 7F 01 40 07 1F F8 73 01 40 07 1F F8 5F 01 40 07 40 10 40 10 40 10 00 00 00 00 00 00 00 00 00 00 00 00 "
"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "
"00 00 00 00 00 00 00 00 00 00 ");//297
//modified by alahover -o 20230823
2022-08-25 18:43:03 +08:00
QColor colors[] {QColor(0xdd0000), QColor(0xdd6600), QColor(0x008800), QColor(0x008888), QColor(0x0000ff), QColor(0x777777), QColor(0xaaaaaa)};
2023-08-24 16:55:38 +08:00
ExpertWin::ExpertWin(QWidget *parent, int rcvCardType) : BaseWin{parent}, m_iRcvCardType{rcvCardType} {
2022-08-25 18:43:03 +08:00
setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle("专家调屏");
2023-07-28 14:48:41 +08:00
resize(900, 720);
2022-08-25 18:43:03 +08:00
auto vBox = new QVBoxLayout(center);
vBox->setContentsMargins(0,0,0,0);
vBox->setSpacing(3);
vBox->addLayout(addBtns(new QHBoxLayout()));
auto tab = new QTabWidget;
tab->setStyleSheet(R"rrr(
QTabWidget::pane {border: 1px solid #888; margin-top:-1px;}
QTabBar::tab {margin-top: 4px; padding: 6px 20px; border: 1px solid #888; border-radius: 0 0 3px 3px;}
QTabBar::tab:selected {margin-top: 0; border-bottom: none; color: #acf; background-color: #000;}
)rrr");
vBox->addWidget(tab);
2023-07-28 14:48:41 +08:00
auto splitter = new QSplitter;
tab->addTab(splitter, "发送设备");
2022-08-25 18:43:03 +08:00
{
2023-07-28 14:48:41 +08:00
auto vLeft = new VBox(splitter);
2022-08-25 18:43:03 +08:00
2023-07-28 14:48:41 +08:00
auto hBox = new HBox(vLeft);
2022-08-25 18:43:03 +08:00
hBox->addWidget(new QLabel("分辨率: "));
auto fdW = new QLineEdit(QString::number(screenWidth));
hBox->addWidget(fdW);
hBox->addWidget(new QLabel("X"));
auto fdH = new QLineEdit(QString::number(screenHeight));
hBox->addWidget(fdH);
2023-07-28 14:48:41 +08:00
hBox = new HBox(vLeft);
2022-08-25 18:43:03 +08:00
hBox->addStretch();
auto btnGet = new QPushButton("刷新");
btnGet->setMinimumWidth(80);
hBox->addWidget(btnGet);
hBox->addSpacing(40);
auto btnSet = new QPushButton("设置");
btnSet->setMinimumWidth(80);
hBox->addWidget(btnSet);
hBox->addStretch();
auto table = new Table{
{"face", "网口", 40},
2022-12-16 15:08:53 +08:00
{"x", "X", 0, QHeaderView::Stretch},
{"y", "Y", 0, QHeaderView::Stretch},
{"w", "宽度", 0, QHeaderView::Stretch},
{"h", "高度", 0, QHeaderView::Stretch},
{"audio", "音频开关", 0, QHeaderView::Stretch},
{"backup", "备份开关", 0, QHeaderView::Stretch}
2022-08-25 18:43:03 +08:00
};
2023-08-24 16:55:38 +08:00
table->verticalHeader()->setMinimumWidth(20);//added by alahover 20230822
2022-08-25 18:43:03 +08:00
table->setDefs();
vLeft->addWidget(table);
table->setRowCount(4);
auto canvas = new ResizeEmitedWgt;
2022-08-25 18:43:03 +08:00
auto screen = new QWidget(canvas);
screen->setGeometry(0, 0, screenWidth, screenHeight);
screen->setAutoFillBackground(true);
auto pal = palette();
pal.setColor(QPalette::Window, QColor(0, 0, 0));
screen->setPalette(pal);
connect(canvas, &ResizeEmitedWgt::resized, this, [this, canvas, screen] {
2022-08-25 18:43:03 +08:00
rate = qMin(canvas->width()/(double)screenWidth, canvas->height()/(double)screenHeight);
if(rate==0) return;
screen->resize(qRound(screenWidth*rate), qRound(screenHeight*rate));
auto children = screen->children();
foreach(auto childObj, children) {
auto unit = static_cast<ScreenUnit*>(childObj);
unit->setGeometry(qRound(unit->mX*rate), qRound(unit->mY*rate), qRound(unit->mW*rate), qRound(unit->mH*rate));
}
});
2023-07-28 14:48:41 +08:00
splitter->addWidget(canvas);
splitter->setStretchFactor(0,0);
splitter->setStretchFactor(1,1);
splitter->setSizes({320, 1});
2022-08-25 18:43:03 +08:00
int idx = 0;
for(int rr=0; rr<4; rr++) {
QString name = "P"+QString::number(rr+1);
2023-03-31 18:44:09 +08:00
table->setText(rr, "name", name);
table->setText(rr, "x", QString::number(idx));
table->setText(rr, "y", "0");
table->setText(rr, "w", "128");
table->setText(rr, "h", "128");
table->setText(rr, "audio", "0");
table->setText(rr, "backup", "0");
2022-08-25 18:43:03 +08:00
auto unit = new ScreenUnit(this, name, idx, 0, 128, 128, screen);
unit->setAutoFillBackground(true);
pal.setColor(QPalette::Window, colors[rr]);
unit->setPalette(pal);
idx += 128;
}
}
2022-12-16 15:08:53 +08:00
{
auto file = QApplication::applicationDirPath()+"/temp.screen";
QFile qFile(file);
if(qFile.open(QFile::ReadOnly)) {
auto data = qFile.readAll();
qFile.close();
2023-07-28 14:48:41 +08:00
auto json = JFrom(data).toObj();
if(! json.empty()) {
2023-08-21 11:21:00 +08:00
cfg = json;
2023-07-28 14:48:41 +08:00
mBox = json["ModuleConnectionInfo"].toObj();
mModule = mBox["ModuleInfo"].toObj();
2022-12-16 15:08:53 +08:00
}
} else {
auto file = QApplication::applicationDirPath()+"/temp.module";
QFile qFile(file);
if(qFile.open(QFile::ReadOnly)) {
auto data = qFile.readAll();
qFile.close();
2023-07-28 14:48:41 +08:00
auto json = JFrom(data).toObj();
if(! json.empty()) mModule = json;
2022-12-16 15:08:53 +08:00
}
}
}
2022-08-25 18:43:03 +08:00
auto receivePanel = new QWidget;
tab->addTab(receivePanel, "接收卡");
{
2022-09-13 23:16:36 +08:00
auto vBox = new VBox(receivePanel);
2022-08-26 23:15:25 +08:00
auto gBox = new QGroupBox("模组信息");
2022-08-25 18:43:03 +08:00
vBox->addWidget(gBox);
2022-12-16 15:08:53 +08:00
{
auto hh = new HBox(gBox);
hh->addSpacing(20);
auto vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
auto lb = new QLabel("驱动芯片: ");
vvv->addWidget(lb);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel("译码方式: ");
vvv->addWidget(lb);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2023-07-28 14:48:41 +08:00
fdChipType = new QLabel(mModule["ChipType"].toStr());
2022-12-16 15:08:53 +08:00
vvv->addWidget(fdChipType);
2022-08-25 18:43:03 +08:00
2023-07-28 14:48:41 +08:00
fdDecodeMode = new QLabel(mModule["DecodeMode"].toStr());//译码方式
2022-12-16 15:08:53 +08:00
vvv->addWidget(fdDecodeMode);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
hh->addSpacing(20);
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel("模组宽度: ");
vvv->addWidget(lb);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel("模组高度: ");
vvv->addWidget(lb);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
fdModuleWidth = new QLabel(QString::number(mModule["ModuleWidth"].toInt()));
vvv->addWidget(fdModuleWidth);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
fdModuleHeight = new QLabel(QString::number(mModule["ModuleHeight"].toInt()));
vvv->addWidget(fdModuleHeight);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
hh->addSpacing(20);
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel("扫描数: ");
vvv->addWidget(lb);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel("数据数组: ");
vvv->addWidget(lb);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
fdScanNum = new QLabel(QString::number(mModule["ScanNum"].toInt()));
vvv->addWidget(fdScanNum);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
fdGroupNum = new QLabel(QString::number(mModule["GroupNum"].toInt()));
vvv->addWidget(fdGroupNum);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
hh->addSpacing(20);
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
auto btn = new QPushButton(tr("数据线颜色"));
btn->setStyleSheet("QPushButton {border: none; }");
vvv->addWidget(btn);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
btn = new QPushButton(tr("模组抽行设置"));
btn->setStyleSheet("QPushButton {border: none; }");
vvv->addWidget(btn);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
hh->addStretch();
vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
btn = new QPushButton("模组选择");
btn->setProperty("ss","blue");
vvv->addWidget(btn);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
btn = new QPushButton("智能设置");
btn->setProperty("ss","blue");
connect(btn, &QPushButton::clicked, this, [this] {
(new ExpertSmartPointSetWin(this))->show();
});
vvv->addWidget(btn);
}
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
gBox = new QGroupBox("单卡带载");
vBox->addWidget(gBox);
{
auto hh = new HBox(gBox);
hh->addSpacing(20);
auto vvv = new VBox(hh);
2022-08-25 18:43:03 +08:00
2022-12-16 15:08:53 +08:00
auto fdNormal = new QRadioButton("常规设计");
fdNormal->setChecked(true);
vvv->addWidget(fdNormal);
2022-09-09 23:25:49 +08:00
2023-08-21 11:21:00 +08:00
fdAdvacned = new QRadioButton("高级设计");
2022-12-16 15:08:53 +08:00
vvv->addWidget(fdAdvacned);
2022-09-09 23:25:49 +08:00
2022-12-16 15:08:53 +08:00
hh->addSpacing(20);
2022-09-09 23:25:49 +08:00
2022-12-16 15:08:53 +08:00
auto line = new QFrame;
line->setFrameShadow(QFrame::Sunken);
line->setFrameShape(QFrame::VLine);
hh->addWidget(line);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
auto stack = new QStackedWidget;
auto poli = stack->sizePolicy();
poli.setVerticalPolicy(QSizePolicy::Maximum);
stack->setSizePolicy(poli);
hh->addWidget(stack);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
auto normalPanel = new QWidget;
stack->addWidget(normalPanel);
{
auto hh = new HBox(normalPanel);
hh->setContentsMargins(0,0,0,0);
auto vvv = new VBox(hh);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
auto lb = new QLabel(tr("宽度"));
vvv->addWidget(lb);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel(tr("高度"));
vvv->addWidget(lb);
2022-09-09 23:25:49 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
fdCardWidth = new QSpinBox;
fdCardWidth->setRange(0, 99999);
fdCardWidth->setValue(mBox["ModuleRow"].toInt() * mModule["ModuleWidth"].toInt());
vvv->addWidget(fdCardWidth);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
fdCardHeight = new QSpinBox;
fdCardHeight->setRange(0, 99999);
fdCardHeight->setValue(mBox["ModuleCol"].toInt() * mModule["ModuleHeight"].toInt());
vvv->addWidget(fdCardHeight);
hh->addSpacing(20);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel(tr("多开设置"));
vvv->addWidget(lb);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
lb = new QLabel(tr("级联方向"));
vvv->addWidget(lb);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-09-09 23:25:49 +08:00
2022-12-16 15:08:53 +08:00
fdSectorCount = new QComboBox;
fdSectorCount->addItem(tr(""), 1);
fdSectorCount->addItem(tr("双开"), 2);
fdSectorCount->addItem(tr("三开"), 3);
fdSectorCount->addItem(tr("四开"), 4);
fdSectorCount->addItem(tr("五开"), 5);
fdSectorCount->addItem(tr("六开"), 6);
fdSectorCount->addItem(tr("七开"), 7);
fdSectorCount->addItem(tr("八开"), 8);
2023-08-21 11:21:00 +08:00
SetCurData(fdSectorCount, mBox["SectorCount"].toInt());
2022-12-16 15:08:53 +08:00
vvv->addWidget(fdSectorCount);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
fdDirection = new QComboBox();
fdDirection->addItem(tr("从左到右"));
fdDirection->addItem(tr("从右到左"));
fdDirection->addItem(tr("从上到下"));
fdDirection->addItem(tr("从下到上"));
fdDirection->setCurrentIndex(mBox["ModuleDirection"].toInt());
vvv->addWidget(fdDirection);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
hh->addStretch();
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
auto cb = new QCheckBox(tr("旋转180°"));
vvv->addWidget(cb);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
auto btn = new QPushButton(tr("数据交换"));
btn->setProperty("ss","blue");
vvv->addWidget(btn);
}
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
auto advacnedPanel = new QWidget;
stack->addWidget(advacnedPanel);
{
auto hh = new HBox(advacnedPanel);
hh->setContentsMargins(0,0,0,0);
vvv = new VBox(hh);
auto btn = new QPushButton(tr("平面造型"));
btn->setProperty("ss","blue");
btn->setMaximumWidth(100);
2023-04-18 18:21:34 +08:00
connect(btn, &QPushButton::clicked, this, [=] {
auto win = new ExpertBoxLayoutWin(this);
win->show();
2023-08-21 11:21:00 +08:00
win->raise();
win->activateWindow();
2023-04-18 18:21:34 +08:00
});
2022-12-16 15:08:53 +08:00
vvv->addWidget(btn);
}
connect(fdNormal, &QRadioButton::toggled, this, [=](bool checked) {
stack->setCurrentWidget(checked ? normalPanel : advacnedPanel);
});
2023-08-21 11:21:00 +08:00
if(cfg["is_irr"].toBool()) fdAdvacned->setChecked(true);
2022-12-16 15:08:53 +08:00
}
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
gBox = new QGroupBox(tr("效果测试"));
vBox->addWidget(gBox);
{
auto hh = new HBox(gBox);
hh->addSpacing(20);
auto vvv = new VBox(hh);
auto hhh = new HBox(vvv);
auto lb = new QLabel(tr("视觉刷新率:"));
hhh->addWidget(lb);
auto cbFresh = new QComboBox();
cbFresh->addItem("960");
cbFresh->addItem("1920");
cbFresh->addItem("2880");
cbFresh->addItem("3840");
hhh->addWidget(cbFresh);
hhh = new HBox(vvv);
lb = new QLabel(tr("DCLK频率:"));
hhh->addWidget(lb);
auto cbDCLKf = new QComboBox();
cbDCLKf->addItem("25M");
cbDCLKf->addItem("20.83M");
cbDCLKf->addItem("17.86M");
cbDCLKf->addItem("15.63M");
cbDCLKf->addItem("13.89M");
cbDCLKf->addItem("12.5M");
cbDCLKf->addItem("11.36M");
cbDCLKf->addItem("10.42M");
cbDCLKf->addItem("9.62M");
hhh->addWidget(cbDCLKf);
hhh = new HBox(vvv);
lb = new QLabel(tr("DCLK相位:"));
hhh->addWidget(lb);
auto spinDclkXw = new QSpinBox;
spinDclkXw->setRange(0, 99999);
hhh->addWidget(spinDclkXw);
hhh = new HBox(vvv);
lb = new QLabel(tr("DCLK占空比:"));
hhh->addWidget(lb);
auto spinDclkZkb = new QSpinBox;
spinDclkZkb->setRange(20, 80);
hhh->addWidget(spinDclkZkb);
hhh = new HBox(vvv);
lb = new QLabel(tr("换行时间(ns):"));
hhh->addWidget(lb);
auto spinLineNs = new QSpinBox;
spinLineNs->setRange(2, 9999);
hhh->addWidget(spinLineNs);
hh->addSpacing(20);
2022-09-13 23:16:36 +08:00
vvv = new VBox(hh);
2022-12-16 15:08:53 +08:00
hhh = new HBox(vvv);
lb = new QLabel(tr("亮度有效率:"));
hhh->addWidget(lb);
lb = new QLabel(tr("100%"));
hhh->addWidget(lb);
hhh = new HBox(vvv);
lb = new QLabel(tr("GCLK频率:"));
hhh->addWidget(lb);
auto cbGCLKf = new QComboBox();
cbGCLKf->addItem("25M");
cbGCLKf->addItem("20.83M");
cbGCLKf->addItem("17.86M");
cbGCLKf->addItem("15.63M");
cbGCLKf->addItem("13.89M");
cbGCLKf->addItem("12.5M");
cbGCLKf->addItem("11.36M");
cbGCLKf->addItem("10.42M");
cbGCLKf->addItem("9.62M");
hhh->addWidget(cbGCLKf);
hhh = new HBox(vvv);
lb = new QLabel(tr("灰度级数:"));
hhh->addWidget(lb);
auto cbGryLevel = new QComboBox();
cbGryLevel->addItem("256");
cbGryLevel->addItem("1024");
cbGryLevel->addItem("4096");
cbGryLevel->addItem("8192");
cbGryLevel->addItem("16384");
cbGryLevel->addItem("32768");
cbGryLevel->addItem("65536");
hhh->addWidget(cbGryLevel);
hhh = new HBox(vvv);
lb = new QLabel(tr("GCLK占空比:"));
hhh->addWidget(lb);
auto spinGclkZkb = new QSpinBox;
spinGclkZkb->setRange(20, 80);
hhh->addWidget(spinGclkZkb);
hhh = new HBox(vvv);
lb = new QLabel(tr("换行位置(ns):"));
hhh->addWidget(lb);
auto spinLineWz = new QSpinBox;
spinLineWz->setRange(2, 9999);
hhh->addWidget(spinLineWz);
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
hh->addStretch();
2022-09-13 23:16:36 +08:00
2022-12-16 15:08:53 +08:00
vvv = new VBox(hh);
hhh = new HBox(vvv);
auto btn = new QPushButton(tr("更多设置"));
btn->setProperty("ss","blue");
hhh->addWidget(btn);
2022-09-13 23:16:36 +08:00
}
2022-12-16 15:08:53 +08:00
vBox->addStretch();
//保存,发送,固话,回读区
auto hBox = new HBox(vBox);
hBox->addSpacing(20);
auto btn = new QPushButton(tr("打开配置"));
btn->setProperty("ss","blue");
hBox->addWidget(btn);
hBox->addSpacing(20);
btn = new QPushButton(tr("保存配置"));
btn->setProperty("ss","blue");
connect(btn, &QPushButton::clicked, this, [=] {
auto dir = QApplication::applicationDirPath()+"/BoxFiles";
QDir(dir).mkdir(".");
auto file = QFileDialog::getSaveFileName(this, tr("保存文件"), dir, tr("Box file (*.box)"));
if(file.isEmpty()) return;
QFile qFile(file);
if(! qFile.open(QFile::WriteOnly)) {
QMessageBox::critical(this, tr("失败"), QString(tr("准备写入 %1 文件失败")).arg(file));
return;
}
auto res = qFile.write(savedData());
qFile.close();
if(res < 0) {
QMessageBox::critical(this, tr("失败"), QString(tr("写入 %1 文件失败")).arg(file));
return;
}
QMessageBox::information(this, tr("保存成功"), tr("保存成功"));
});
hBox->addWidget(btn);
hBox->addStretch();
btn = new QPushButton(tr("保存Map"));
btn->setProperty("ss","blue");
connect(btn, &QPushButton::clicked, this, [=] {
auto dir = QApplication::applicationDirPath();
auto file = QFileDialog::getSaveFileName(this, tr("保存文件"), dir);
if(file.isEmpty()) return;
QFile qFile(file);
if(! qFile.open(QFile::WriteOnly)) {
QMessageBox::critical(this, tr("失败"), QString(tr("准备写入 %1 文件失败")).arg(file));
return;
}
QByteArray data;
addMapData(data);
auto res = qFile.write(data);
qFile.close();
if(res < 0) {
QMessageBox::critical(this, tr("失败"), QString(tr("写入 %1 文件失败")).arg(file));
return;
}
QMessageBox::information(this, tr("保存成功"), tr("保存成功"));
});
hBox->addWidget(btn);
hBox->addSpacing(20);
btn = new QPushButton(tr("发送数据"));
btn->setProperty("ss","blue");
connect(btn, &QPushButton::clicked, this, [=] {
2023-08-24 16:55:38 +08:00
//modified by alahover -s 20230817
if(m_iRcvCardType == enum_xixun_sync) {
QByteArray data;
addMapData(data);
QMessageBox::information(this, tr("提示"), tr("发送成功"));
} else if(m_iRcvCardType == enum_zrf) {
2023-09-01 16:17:33 +08:00
//发送基本参数
classToBaseMsg();
2023-08-24 16:55:38 +08:00
auto waitingDlg = new WaitingDlg(this, tr("Setting")+" ...");
2023-09-01 16:17:33 +08:00
auto res = sendMsgSync(zrf_param_msg, 0x105B14, 10000, waitingDlg);
2023-08-24 16:55:38 +08:00
if(res==5) QMessageBox::critical(this, "Error", tr("请求超时"));
else if(res) QMessageBox::critical(this, "Error", QString(tr("发送失败: "))+QString::fromLocal8Bit(pcap_geterr(pcapSend)));
else {
waitingDlg->close();
QMessageBox::information(this, tr("提示"), tr("发送成功"));
}
}
else if(m_iRcvCardType == enum_xixun_async) QMessageBox::information(this, tr("提示"), tr("异步卡发送成功"));
else QMessageBox::information(this, tr("提示"), tr("未能识别的控制卡类型"));
2022-12-16 15:08:53 +08:00
});
hBox->addWidget(btn);
hBox->addSpacing(20);
btn = new QPushButton(tr("固化数据"));
btn->setProperty("ss","blue");
hBox->addWidget(btn);
hBox->addSpacing(20);
btn = new QPushButton(tr("回读数据"));
btn->setProperty("ss","blue");
2023-09-01 16:17:33 +08:00
//added by alahover -s 20230823
connect(btn, &QPushButton::clicked, this, [=] {
if(m_iRcvCardType == enum_rcvCardType::enum_xixun_sync)
{
QByteArray data;
addMapData(data);
QMessageBox::information(this, tr("提示"), tr("回读成功"));
}
else if(m_iRcvCardType == enum_rcvCardType::enum_zrf)
{
//回读基本参数
auto zrf_cmd_msg = QByteArray::fromHex("55 55 00 11 22 33 44 55 00 11 22 33 44 55 10 5a 13 00 00 00 00 e0 ff ff 00 f2 f2 f2 f2 00 00 00 00 00 00 00 00 00 00 00 00");
auto res_zrf = sendMsg(zrf_cmd_msg, 0x105B14, 10000, [=](int, const QByteArray data) {
//处理回读参数
//qDebug()<<"回读基本参数:"<<data.toHex();
baseMsgToClass((quint8 *)data.data()+headMap_zrf.end);
});
if(res_zrf) {
QString err = pcap_geterr(pcapSend);
if(! err.endsWith("(2150891551)")) QMessageBox::critical(this, "Error", QString(tr("回读失败: "))+QString::fromLocal8Bit(pcap_geterr(pcapSend)));
}
//回读描点参数
zrf_cmd_msg = QByteArray::fromHex("55 55 00 11 22 33 44 55 00 11 22 33 44 55 10 5a 13 00 00 00 00 e0 ff ff 00 f2 f2 f2 f2 00 00 00 00 30 30 30 30 00 00 00 00");
auto waitingDlg = new WaitingDlg(this, tr("Setting")+" ...");
QEventLoop loop;
auto res = sendMsg(zrf_cmd_msg, 0x105B14, 10000, [=, &loop](int code, const QByteArray data) {
//处理回读参数
//qDebug()<<"回读描点参数:"<<data.toHex();
miaoDianMsgToClass((quint8 *)data.data()+headMap_zrf.end);
loop.exit(code);
}, waitingDlg);
if(res==0) res = loop.exec(QEventLoop::ExcludeUserInputEvents);
if(res && waitingDlg) waitingDlg->close();
if(res==5) QMessageBox::critical(this, "Error", tr("请求超时"));
else if(res) QMessageBox::critical(this, "Error", QString(tr("回读描点参数失败: "))+QString::fromLocal8Bit(pcap_geterr(pcapSend)));
else {
waitingDlg->close();
QMessageBox::information(this, tr("提示"), tr("回读描点参数成功"));
}
}
else if(m_iRcvCardType == enum_rcvCardType::enum_xixun_async)
{
QMessageBox::information(this, tr("提示"), tr("异步卡回读成功"));
}
else
{
QMessageBox::information(this, tr("提示"), tr("未能识别的控制卡类型"));
}
});
//added by alahover -o 20230823
2022-12-16 15:08:53 +08:00
hBox->addWidget(btn);
2022-09-09 23:25:49 +08:00
2022-08-25 18:43:03 +08:00
vBox->addStretch();
2022-12-16 15:08:53 +08:00
//状态栏
auto statusWgt = new QWidget;
statusWgt->setStyleSheet("QWidget{background-color:#222;}");
vBox->addWidget(statusWgt);
{
auto hh = new HBox(statusWgt);
auto lb = new QLabel(tr("状态:"));
hh->addWidget(lb);
}
2022-08-25 18:43:03 +08:00
}
2022-08-25 22:52:52 +08:00
auto connPanel = new QWidget;
2022-12-16 15:08:53 +08:00
tab->addTab(connPanel, tr("显示屏连接(正面看屏)"));
2022-08-25 22:52:52 +08:00
{
auto vBox = new QVBoxLayout(connPanel);
vBox->setContentsMargins(4, 4, 4, 4);
auto hhh = new QHBoxLayout;
vBox->addLayout(hhh);
auto bnScreen = new QPushButton("屏1");
hhh->addWidget(bnScreen);
hhh->addStretch();
auto lb = new QLabel("显示屏数目:");
hhh->addWidget(lb);
auto fdScreenCnt = new QSpinBox;
fdScreenCnt->setRange(1, 99);
fdScreenCnt->setValue(1);
hhh->addWidget(fdScreenCnt);
2022-08-26 23:15:25 +08:00
auto stack = new QStackedLayout;
vBox->addLayout(stack);
stack->addWidget(new ExpertScreenConnWin());
2022-08-25 22:52:52 +08:00
}
2022-08-25 18:43:03 +08:00
}
2022-12-16 15:08:53 +08:00
void ExpertWin::closeEvent(QCloseEvent *event) {
BaseWin::closeEvent(event);
2023-08-21 11:21:00 +08:00
QFile qFile("temp.screen");
2022-12-16 15:08:53 +08:00
if(! qFile.open(QFile::WriteOnly)) return;
qFile.write(savedData());
qFile.close();
}
QByteArray ExpertWin::savedData() {
mBox.insert("ModuleInfo", mModule);
auto ModuleWidth = mModule["ModuleWidth"].toInt();
auto ModuleHeight = mModule["ModuleHeight"].toInt();
mBox.insert("ModuleRow", (fdCardWidth->value() + ModuleWidth - 1) / ModuleWidth);
mBox.insert("ModuleCol", (fdCardHeight->value() + ModuleHeight - 1) / ModuleHeight);
mBox.insert("ModuleDirection", fdDirection->currentIndex());
mBox.insert("SectorCount", fdSectorCount->currentData().toInt());
2023-08-21 11:21:00 +08:00
JObj obj{
{"ModuleConnectionInfo", mBox},
{"is_irr", fdAdvacned->isChecked()},
};
2023-07-28 14:48:41 +08:00
return JToBytes(obj, " ");
2022-12-16 15:08:53 +08:00
}
void ExpertWin::addMapData(QByteArray &data) {
auto ModuleWidth = mModule["ModuleWidth"].toInt();
auto ModuleHeight = mModule["ModuleHeight"].toInt();
auto ModuleRow = (fdCardWidth->value() + ModuleWidth - 1) / ModuleWidth;
auto ModuleCol = (fdCardHeight->value() + ModuleHeight - 1) / ModuleHeight;
auto CardWidth = ModuleRow * ModuleWidth;
auto CardHeight = ModuleCol * ModuleHeight;
auto ModuleDirection = fdDirection->currentIndex();
//auto SectorCount = fdSectorCount->currentData().toInt();
QMap<uint, uint> map;
int memY = 0, memX = 0;
for(int boxY=0; boxY<CardHeight; boxY++) {
for(int boxX=0; boxX<CardWidth; boxX++) {
if(memX > 255) {
memX = 0;
memY++;
}
map.insert(boxY<<16|boxX, memY<<16|memX);
memX++;
}
memX = 0;
memY++;
}
auto points = mModule["Points"].toArray();
auto scans = mModule["Scans"].toArray();
auto GroupNum = mModule["GroupNum"].toInt();
auto jCnt = ModuleCol * GroupNum;
2023-07-28 14:48:41 +08:00
for(auto scan : scans) {
2022-12-16 15:08:53 +08:00
QList<QList<QByteArray>> chunkses;
for(int j=0; j<jCnt; j++) {
int lastMemY = INT_MIN;
int lastMemX = -1;
int cnt = 1, ttl = 1;
bool isAnti = false;
QList<QByteArray> chunks;
QByteArray chunk;
QString chstr;
for(int mm=0; mm<ModuleRow; mm++) {
int m = ModuleDirection==0 ? ModuleRow-1-mm : mm;
2023-07-28 14:48:41 +08:00
for(auto point : points) {
2022-12-16 15:08:53 +08:00
uint boxY = j * scans.size() + scan.toInt();
uint boxX = m * ModuleWidth + point.toInt();
if(boxX < 0) { //虚点
if(lastMemY==-1) memX = lastMemX + 1;
else {
memY = -1;
memX = 0;
}
} else {
auto mem = map[boxY<<16 | boxX];
memY = mem >> 16;
memX = mem & 0xffff;
}
if(memY==lastMemY && ttl < 64 && qAbs(memX-lastMemX)==1) {
if(cnt==1) {
isAnti = memX < lastMemX;
cnt++;
ttl++;
lastMemX = memX;
continue;
} else if(memX < lastMemX == isAnti) {
cnt++;
ttl++;
lastMemX = memX;
continue;
}
}
if(lastMemY > INT_MIN) {
uint y = lastMemY==-1 ? 0 : lastMemY;
uint x = isAnti ? lastMemX : lastMemX-cnt+1;
chunk.append((j << 2) + (y >> 8)).append(y).append(x).append((isAnti << 7)+cnt);
chstr += QString("j%1 行%2 列%3 序%4 长%5").arg(j).arg(y).arg(x).arg(isAnti).arg(cnt);
}
if(ttl>=64) {
chunks.append(chunk);
chunk = QByteArray();
qDebug() << chstr;
chstr.clear();
ttl = 1;
}
cnt = 1;
lastMemY = memY;
lastMemX = lastMemY==-1 ? 0 : memX;
}
}
uint y = lastMemY==-1 ? 0 : lastMemY;
uint x = isAnti ? lastMemX : lastMemX-cnt+1;
chunk.append((j << 2) + (y >> 8)).append(y).append(x).append((isAnti << 7)+cnt);
chstr += QString("j%1 行%2 列%3 序%4 长%5").arg(j).arg(y).arg(x).arg(isAnti).arg(cnt);
chunks.append(chunk);
chunkses.append(chunks);
qDebug() << chstr;
}
data.append(0xAA).append(scan.toInt()).append(2, 0);
auto chend = chunkses[0].size()-1;
auto start = data.size();
for(int ch=0; ch<=chend; ch++) {
data.append(0x55).append(ch==chend ? (char)(1<<7) : 0).append(2, 0);
auto start = data.size();
foreach(auto chunks, chunkses) data.append(chunks[ch]);
auto num = (data.size() - start) / 4;
data[start-2] = num;
data[start-3] = num>>8;
}
auto len = data.size() - start;
data[start-1] = len;
data[start-2] = len>>8;
}
}
2023-09-01 16:17:33 +08:00
//added by alahover -s 02030823
void ExpertWin::classToBaseMsg()
{
auto unitptr = (unsigned char *)zrf_param_msg.data();
unsigned char * bytePrt = (unsigned char*)(unitptr);
*bytePrt= (zrf_rcv_obj.b0_7 << 7 & 0b10000000)| (zrf_rcv_obj.b0_6 << 6 & 0b01000000)| (zrf_rcv_obj.b0_5 << 5 & 0b00100000)| (zrf_rcv_obj.b0_4 << 4 & 0b00010000)| (zrf_rcv_obj.b0_3_1 << 1 & 0b00001110) | (zrf_rcv_obj.b0_0 & 0b00000001);;
bytePrt =unitptr + st_zrf_base_param.b1_xiaoyingTime;
*bytePrt = ( zrf_rcv_obj.b1_7_6<< 6 & 0b11000000) | ( zrf_rcv_obj.b1_5<<5 & 0b00100000) | ( zrf_rcv_obj.b1_4<<4 & 0b00010000) | ( zrf_rcv_obj.b1_3_2<<2 & 0b00001100) | ( zrf_rcv_obj.b1_1<<1 & 0b00000010) |( zrf_rcv_obj.b1_0&0b00000001);
bytePrt =unitptr + st_zrf_base_param.b2_line_xytime;
*bytePrt= zrf_rcv_obj.b2;
bytePrt =unitptr + st_zrf_base_param.b3_rows1Group;
*bytePrt= zrf_rcv_obj.b3;
bytePrt =unitptr + st_zrf_base_param.b4_cols1Group;
*bytePrt= zrf_rcv_obj.b4;
bytePrt =unitptr + st_zrf_base_param.b5_scanNum;
*bytePrt= zrf_rcv_obj.b5;
bytePrt =unitptr + st_zrf_base_param.b6_emptyPointNum;
*bytePrt= zrf_rcv_obj.b6;
bytePrt =unitptr + st_zrf_base_param.b7_colorIndex;
*bytePrt= ( zrf_rcv_obj.b7_7_6 << 6 & 0b11000000) | ( zrf_rcv_obj.b7_5_4<<4 & 0b00110000) | ( zrf_rcv_obj.b7_3_2 << 2 & 0b00001100) | ( zrf_rcv_obj.b7_1_0 & 0b00000011) ;
bytePrt =unitptr + st_zrf_base_param.b8_dataOutModle;
*bytePrt= ( zrf_rcv_obj.b8_7<<7 &0b10000000) | ( zrf_rcv_obj.b8_6<<6 & 0b01000000) | ( zrf_rcv_obj.b8_5_4<<4 & 0b00110000) | ( zrf_rcv_obj.b8_3_0 & 0b00001111) ;
bytePrt =unitptr + st_zrf_base_param.b9_brightStatic;
*bytePrt= zrf_rcv_obj.b9 ;
bytePrt =unitptr + st_zrf_base_param.b10_brightRed;
*bytePrt= zrf_rcv_obj.b10;
bytePrt =unitptr + st_zrf_base_param.b11_brightGreen;
*bytePrt= zrf_rcv_obj.b11;
bytePrt =unitptr + st_zrf_base_param.b12_brightBlue;
*bytePrt= zrf_rcv_obj.b12;
bytePrt =unitptr + st_zrf_base_param.b13_icType;
*bytePrt= zrf_rcv_obj.b13;
bytePrt =unitptr + st_zrf_base_param.b14_icParma;
*bytePrt= zrf_rcv_obj.b14;
bytePrt =unitptr + st_zrf_base_param.b15_redIgain;
*bytePrt= zrf_rcv_obj.b15;
bytePrt =unitptr + st_zrf_base_param.b16_greenIgain;
*bytePrt= zrf_rcv_obj.b16;
bytePrt =unitptr + st_zrf_base_param.b17_blueIgain;
*bytePrt= zrf_rcv_obj.b17;
bytePrt =unitptr + st_zrf_base_param.b18_clkFreq;
*bytePrt= ( zrf_rcv_obj.b18_7_4<<4 & 0b11110000) | ( zrf_rcv_obj.b18_3_0 & 0b00001111);
bytePrt =unitptr + st_zrf_base_param.b19_clkDutyCycle;
*bytePrt=( zrf_rcv_obj.b19_7_4<<4 & 0b11110000) | ( zrf_rcv_obj.b19_3_0 & 0b00001111);
bytePrt =unitptr + st_zrf_base_param.b20_pwmIcGrayClk;
*bytePrt= zrf_rcv_obj.b20;
bytePrt =unitptr + st_zrf_base_param.b21_grayLevelMultFreq;
*bytePrt= ( zrf_rcv_obj.b21_7_5 << 5 & 0b11100000) | ( zrf_rcv_obj.b21_4_0 & 0b00011111);
bytePrt =unitptr + st_zrf_base_param.b22_MultFreqMode;
*bytePrt= ( zrf_rcv_obj.b22_7_6 << 6 & 0b11000000) | ( zrf_rcv_obj.b22_5_2<<2 & 0b00111100) | ( zrf_rcv_obj.b22_1_0 & 0b00000011);
bytePrt =unitptr + st_zrf_base_param.b23_reserve;
*bytePrt= zrf_rcv_obj.b23;
bytePrt =unitptr + st_zrf_base_param.b24_freshRate;
*bytePrt= ( zrf_rcv_obj.b24_7_5<<5 & 0b11100000) | ( zrf_rcv_obj.b24_4_0 & 0b00011111);
bytePrt =unitptr + st_zrf_base_param.b24_freshRate +1;
*bytePrt= zrf_rcv_obj.b25;
bytePrt =unitptr + st_zrf_base_param.b26_syncGraphicsCard;
*bytePrt= ( zrf_rcv_obj.b26_7<<7 & 0b10000000) | ( zrf_rcv_obj.b26_6<<6 & 0b01000000) | ( zrf_rcv_obj.b26_5_0 & 0b00111111);
bytePrt =unitptr + st_zrf_base_param.b27_Ldq;
*bytePrt= zrf_rcv_obj.b27_28[0];
bytePrt =unitptr + st_zrf_base_param.b27_Ldq +1;
*bytePrt= zrf_rcv_obj.b27_28[1];
bytePrt =unitptr + st_zrf_base_param.b29_reserve;
*bytePrt= ( zrf_rcv_obj.b29_7_4<<4 & 0b11110000) | ( zrf_rcv_obj.b29_3_2<<2 &0b00001100) | ( zrf_rcv_obj.b29_1_0 & 0b00000011);
bytePrt =unitptr + st_zrf_base_param.b30_pwmMultFreq;
*bytePrt= zrf_rcv_obj.b30;
bytePrt =unitptr + st_zrf_base_param.b31_rcvCardCols;
*bytePrt= zrf_rcv_obj.b31;
bytePrt =unitptr + st_zrf_base_param.b31_rcvCardCols + 1;
*bytePrt= zrf_rcv_obj.b32;
bytePrt =unitptr + st_zrf_base_param.b33_emptyRowMode;
*bytePrt= ( zrf_rcv_obj.b33_7_4<<4 & 0b11110000) | ( zrf_rcv_obj.b33_3_0 & 0b00001111);
bytePrt =unitptr + st_zrf_base_param.b34_emptyRowPos;
*bytePrt= ( zrf_rcv_obj.b34_7_4<<5 & 0b11110000) | ( zrf_rcv_obj.b34_3_0 & 0b00001111);
bytePrt =unitptr + st_zrf_base_param.b35_xiaoYingEndTime;
*bytePrt= zrf_rcv_obj.b35;
bytePrt =unitptr + st_zrf_base_param.b36_RowIcParam;
*bytePrt= ( zrf_rcv_obj.b36_7_6<<6 & 0b11000000) | ( zrf_rcv_obj.b36_5_0 & 0b00111111);
bytePrt =unitptr + st_zrf_base_param.b37_reserve;
*bytePrt= ( zrf_rcv_obj.b37_7_5<<5 & 0b11100000) | ( zrf_rcv_obj.b37_4_3<<3 & 0b00011000) | ( zrf_rcv_obj.b37_2<<2 & 0b00000100) | ( zrf_rcv_obj.b37_1 <<1 & 0b00000010) | ( zrf_rcv_obj.b37_0 & 0b00000001);
bytePrt =unitptr + st_zrf_base_param.b38_hub1to32Area;
memcpy(bytePrt,& zrf_rcv_obj.b38_69[32],32);
bytePrt =unitptr + st_zrf_base_param.b70_reserve;
*bytePrt= ( zrf_rcv_obj.b70_7<<7 & 0b10000000) | ( zrf_rcv_obj.b70_6<<6 & 0b01000000) | ( zrf_rcv_obj.b70_5_2<<2 & 0b00111100) | ( zrf_rcv_obj.b70_1<<1 & 0b00000010) | ( zrf_rcv_obj.b70_0 & 0b00000001);
bytePrt =unitptr + st_zrf_base_param.b71_imgArea1to32Param;
for(int i=0;i<32;i++)
{
memcpy(bytePrt,& zrf_rcv_obj.b71_166[i][0],3);
bytePrt +=3;
}
bytePrt =unitptr + st_zrf_base_param.b167_syncPreTime;
*bytePrt= zrf_rcv_obj.b167;
bytePrt =unitptr + st_zrf_base_param.b168_reserve;
*bytePrt= ( zrf_rcv_obj.b168_7_5<<5 & 0b11100000) | ( zrf_rcv_obj.b168_4_0 & 0b00011111);
bytePrt =unitptr + st_zrf_base_param.b169_redIcParam1;
memcpy(bytePrt,(unsigned char *)& zrf_rcv_obj.b169_192[0],24);
bytePrt =unitptr + st_zrf_base_param.b193_reserve;
*bytePrt= zrf_rcv_obj.b193;
}
void ExpertWin::classToGammaMsg(int iColorType,quint8 flashPage)
{
auto unitptr = (unsigned char *)zrf_param_msg.data();
unsigned char * bytePrt = (unsigned char*)(unitptr);
switch(iColorType)
{
case 0://all
if(flashPage == 0x10)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_all[0],256);
else if(flashPage == 0x11)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_all[128],256);
break;
case 1://red
if(flashPage == 0x10)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_red[0],256);
else if(flashPage == 0x11)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_red[128],256);
break;
case 2://green
if(flashPage == 0x10)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_green[0],256);
else if(flashPage == 0x11)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_green[128],256);
break;
case 3://blue
if(flashPage == 0x10)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_blue[0],256);
else if(flashPage == 0x11)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_blue[128],256);
break;
default:
if(flashPage == 0x10)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_all[0],256);
else if(flashPage == 0x11)
memcpy(bytePrt ,(unsigned char*)&zrf_rcv_obj.g_all[128],256);
break;
}
}
void ExpertWin::classToPaiXuSMsg(quint8 flashPage,bool bInitP8_st_rcv_pos)
{
if(bInitP8_st_rcv_pos)
{
for(int i=0;i<256;i++)
{
zrf_rcv_obj.p8_st_rcv_pos[i].imgXL8 = zrf_rcv_obj.p_x[i] & 0x00FF;
zrf_rcv_obj.p8_st_rcv_pos[i].imgXH4_YH4 = ((zrf_rcv_obj.p_x[i] & 0x0F00) >>4 )| ((zrf_rcv_obj.p_y[i] & 0x0F00) >>8);
zrf_rcv_obj.p8_st_rcv_pos[i].imgYL8 = zrf_rcv_obj.p_y[i] & 0x00FF;
zrf_rcv_obj.p8_st_rcv_pos[i].imgWidthL8 = zrf_rcv_obj.p_w[i] & 0x00FF;
zrf_rcv_obj.p8_st_rcv_pos[i].imgWidthH4_HeightH4 = ((zrf_rcv_obj.p_w[i] & 0x0F00) >>4 )| ((zrf_rcv_obj.p_h[i] & 0x0F00) >>8);
zrf_rcv_obj.p8_st_rcv_pos[i].imgHeightL8 = zrf_rcv_obj.p_h[i] & 0x00FF;
zrf_rcv_obj.p8_st_rcv_pos[i].imgPosNumInScreenH8 = (zrf_rcv_obj.p_posNum[i] & 0xFF00) >>8;
zrf_rcv_obj.p8_st_rcv_pos[i].imgPosNumInScreenL8 = zrf_rcv_obj.p_posNum[i] & 0x00FF;
}
}
else
{
auto unitptr = (unsigned char *)zrf_param_msg.data();
unsigned char * bytePrt = (unsigned char*)(unitptr);
if(flashPage == 0x20)
{
*bytePrt = zrf_rcv_obj.p0_cardIndexInNet ;//当前卡在网线内的序号
bytePrt++;
*bytePrt = zrf_rcv_obj.p1_SendCardCode ;//当前网线所在的发送卡编号
bytePrt++;
*bytePrt = zrf_rcv_obj.p2_netIndexInSendCard ;//当前网线所在发送卡输出口编号
bytePrt++;
*bytePrt = zrf_rcv_obj.p3_fenXianNum ;//当前分线号
bytePrt++;
*bytePrt = zrf_rcv_obj.p4_rcvCardsNumInNet ;//当前网线内接收卡总数
bytePrt++;
*bytePrt = zrf_rcv_obj.p5_netScreenIndex ; //当前网线所在屏号
bytePrt++;
*bytePrt = zrf_rcv_obj.p6_reserve ;//保留
bytePrt++;
*bytePrt = zrf_rcv_obj.p7_reserve1 ;//保留
bytePrt++;
memcpy(bytePrt,&zrf_rcv_obj.p8_st_rcv_pos[0],256-8);
}
else
{
int itemp=flashPage&0x0F -1;//flashpage 0x21~0x27,
memcpy(bytePrt,&zrf_rcv_obj.p8_st_rcv_pos[itemp * 32 + (256-8)/8],256);
}
}
}
void ExpertWin::classToMiaoDianMsg(quint8 flashPage)
{
auto unitptr = (unsigned char *)zrf_param_msg.data();
unsigned char * bytePrt = (unsigned char*)(unitptr);
if(flashPage == 0x30)
{
memcpy(bytePrt,&zrf_rcv_obj.m_scanIndex , 64);
bytePrt += 64;
memcpy(bytePrt, &zrf_rcv_obj.m_pixelPos[0][0] , 256-64);
}
else
{
int itemp=flashPage&0x0F - 1;
memcpy(bytePrt, &zrf_rcv_obj.m_pixelPos[(itemp*256)/2+(256-64)/2][0] , 256);
}
}
void ExpertWin::baseMsgToClass(quint8 * data)
{
zrf_rcv_obj.b0_7 = data[st_zrf_base_param.b0_RP] & 0b10000000;//DAT信号 方式 0高有效共阴 1低有效共阳;
zrf_rcv_obj.b0_6 = data[st_zrf_base_param.b0_RP] & 0b01000000;//STB信号有效方式 0正向 1反向;
zrf_rcv_obj.b0_5 = data[st_zrf_base_param.b0_RP] & 0b00100000;//OE信号有效0 :低有 效1 :高有效;
zrf_rcv_obj.b0_4 = data[st_zrf_base_param.b0_RP] & 0b00010000;//行有效方式0 低有效1 :高有效;
zrf_rcv_obj.b0_3_1 = data[st_zrf_base_param.b0_RP] & 0b00001110;//行译码方式bit2~bit0与地址0x01 bit7~bit6 表示 bit4~bit3。0普通常规138译码00001SM526600010SM536601000:ICN201300100无译码00101595译码0110:5958译码01110ICND2018其他保留;
zrf_rcv_obj.b0_0 = data[st_zrf_base_param.b0_RP] & 0b00000001;//0 :全色1 :单双色;
zrf_rcv_obj.b1_7_6 = data[st_zrf_base_param.b1_xiaoyingTime] & 0b11000000; //行译码方式 bit4~bit3
zrf_rcv_obj.b1_5 = data[st_zrf_base_param.b1_xiaoyingTime] & 0b00100000; //消影控制电平0高有效1低有效
zrf_rcv_obj.b1_4 = data[st_zrf_base_param.b1_xiaoyingTime] & 0b00010000; //双卡备份0关闭1启用
zrf_rcv_obj.b1_3_2 = data[st_zrf_base_param.b1_xiaoyingTime] & 0b00001100; //颜色深度00:8bit01:10bit10:12bit
zrf_rcv_obj.b1_1 = data[st_zrf_base_param.b1_xiaoyingTime] & 0b00000010; //D信号扩展为第二时钟0关闭1启用
zrf_rcv_obj.b1_0 = data[st_zrf_base_param.b1_xiaoyingTime] & 0b00000001; //上电渐亮0启用;1关闭
zrf_rcv_obj.b2 = data[st_zrf_base_param.b2_line_xytime]; //实际消影时间为:(输入值 * 2 + 1 * 48ns
zrf_rcv_obj.b3 = data[st_zrf_base_param.b3_rows1Group]; //一组数据控制模组的行数1~64其他无效
zrf_rcv_obj.b4 = data[st_zrf_base_param.b4_cols1Group]; //一组数据控制的模组列数1~128其他无效
zrf_rcv_obj.b5 = data[st_zrf_base_param.b5_scanNum]; //模组扫描方式1~64其他无效
zrf_rcv_obj.b6 = data[st_zrf_base_param.b6_emptyPointNum]; //模组每行空点数详见说明2
zrf_rcv_obj.b7_7_6 = data[st_zrf_base_param.b7_colorIndex] & 0b11000000; //输出数据线4,0001绿1011
zrf_rcv_obj.b7_5_4 = data[st_zrf_base_param.b7_colorIndex] & 0b00110000; //输出数据线3,0001绿1011
zrf_rcv_obj.b7_3_2 = data[st_zrf_base_param.b7_colorIndex] & 0b00001100; //输出数据线2,0001绿1011
zrf_rcv_obj.b7_1_0 = data[st_zrf_base_param.b7_colorIndex] & 0b00000011; //输出数据线1,0001绿1011
zrf_rcv_obj.b8_7 = data[st_zrf_base_param.b8_dataOutModle] & 0b10000000; //多种描点数据 0关闭1启用
zrf_rcv_obj.b8_6 = data[st_zrf_base_param.b8_dataOutModle] & 0b01000000; //扫描复用模式0行扫1列扫
zrf_rcv_obj.b8_5_4 = data[st_zrf_base_param.b8_dataOutModle] & 0b00110000; //模组级联方向:00从右往左01从上往下10从左往右11从下往上
zrf_rcv_obj.b8_3_0 = data[st_zrf_base_param.b8_dataOutModle] & 0b00001111; //数据输出模式0000标准16组并行数据输出0001增强20组并行数据输出0010增强24组并行数据输出0101串行16组数据输出0100串行32组数据输出0011串行 64 组数据输出0110增强32组并行数据输出0111串行 128 组数据1000串行 96 组数据1001~1111保留
zrf_rcv_obj.b9 = data[st_zrf_base_param.b9_brightStatic]; //静态亮度 0最暗ff最亮区别于帧同步包中的动态亮度
zrf_rcv_obj.b10 = data[st_zrf_base_param.b10_brightRed]; //红亮度0最暗ff最亮
zrf_rcv_obj.b11 = data[st_zrf_base_param.b11_brightGreen]; //绿亮度0最暗ff最亮
zrf_rcv_obj.b12 = data[st_zrf_base_param.b12_brightBlue]; //蓝亮度0最暗ff最亮
zrf_rcv_obj.b13 = data[st_zrf_base_param.b13_icType]; //模组驱动芯片类型选择: //0x00普通恒流芯片 0x0FICN2053 0x01MBI5042、MBI5041 0x10ICN2038S 0x02MY9268 0x11MBI5124 0x03MBI5050 0x12SM16017 0x04SD16749 0x13SM16207
//0x05SM16136 0x14SM16159 0x06APA101 0x15LS9929IP 0x07MY9266 0x16ICND2110 0x08MY9868 0x17LS9918IP 0x09MBI5052 0x18SM16237
//0x0ASUM2017 0x19SUM2028 0x0BMY9862 0x1ASUM2017TD 0x0CSUM2032 0x1BSM16259 0x0DMBI5153 0x1CICND2065/ICND2055; 0x1DSM16359 0x1ERT5965/RT5966;
//0x1FMBI5264 其他未定义
zrf_rcv_obj.b14 = data[st_zrf_base_param.b14_icParma]; //芯片辅助识别标志
zrf_rcv_obj.b15 = data[st_zrf_base_param.b15_redIgain]; //红电流增益 0最暗ff最亮
zrf_rcv_obj.b16 = data[st_zrf_base_param.b16_greenIgain]; //绿电流增益 0最暗ff最亮
zrf_rcv_obj.b17 = data[st_zrf_base_param.b17_blueIgain]; //蓝电流增益 0最暗ff最亮
zrf_rcv_obj.b18_7_4 = data[st_zrf_base_param.b18_clkFreq] & 0b11110000; //保留
zrf_rcv_obj.b18_3_0 = data[st_zrf_base_param.b18_clkFreq] & 0b00001111; //输出数据时钟频率选择031.25M 125M 220.83M 317.8M 415.625M 512.5M 610.4M 78.9M 87.8M 96.25M 105.2M 114.5M 123.9M 133.125M 141.9M 151M
zrf_rcv_obj.b19_7_4 = data[st_zrf_base_param.b19_clkDutyCycle] & 0b11110000; //输出数据时钟相位00000 度; 0001- 90 度; 0010+90 度; 其他暂时保留;
zrf_rcv_obj.b19_3_0 = data[st_zrf_base_param.b19_clkDutyCycle] & 0b00001111; //输出数据时钟占空比000050% 000125% 001075% 其他暂时保留;
zrf_rcv_obj.b20 = data[st_zrf_base_param.b20_pwmIcGrayClk]; //PWM 类智能芯片的灰度时钟周期设定MBI5042 芯片,软件计算; MY9268MBI5050用户设定设定有效值范围 4~128 其他不支持;
zrf_rcv_obj.b21_7_5 = data[st_zrf_base_param.b21_grayLevelMultFreq] & 0b11100000; //输出数据时钟相位00000 度; 0001- 90 度; 0010+90 度; 其他暂时保留;
zrf_rcv_obj.b21_4_0 = data[st_zrf_base_param.b21_grayLevelMultFreq] & 0b00011111; //输出数据时钟占空比000050% 000125% 001075% 其他暂时保留;
zrf_rcv_obj.b22_7_6 = data[st_zrf_base_param.b22_MultFreqMode] & 0b11000000;; //倍频模式00无倍频01VPWM10VPWM211VPWM3
zrf_rcv_obj.b22_5_2 = data[st_zrf_base_param.b22_MultFreqMode] & 0b00111100;; //补偿等级暂未定义0000~1111
zrf_rcv_obj.b22_1_0 = data[st_zrf_base_param.b22_MultFreqMode] & 0b00000010;; //低辉补偿00普通模式, 01合并补偿, 10累加补偿
zrf_rcv_obj.b23 = data[st_zrf_base_param.b23_reserve]; //保留
zrf_rcv_obj.b24_7_5 = data[st_zrf_base_param.b24_freshRate] & 0b11100000;; //图像帧频率00060Hz00150Hz01075Hz01130Hz100120Hz其他保留
zrf_rcv_obj.b24_4_0 = data[st_zrf_base_param.b24_freshRate] & 0b00011111;; //画面刷新频率 ,高 5bit
zrf_rcv_obj.b25 = data[st_zrf_base_param.b24_freshRate + 1]; //画面刷新频率 ,低 8bit
zrf_rcv_obj.b26_7 = data[st_zrf_base_param.b26_syncGraphicsCard] & 0b10000000; //0与显卡同步1不同步
zrf_rcv_obj.b26_6 = data[st_zrf_base_param.b26_syncGraphicsCard] & 0b01000000; //低于 120hz时该位置1选择为行外扫描灰度
zrf_rcv_obj.b26_5_0 = data[st_zrf_base_param.b26_syncGraphicsCard] & 0b00111111; //显卡同步时,帧频倍数
memcpy(&zrf_rcv_obj.b27_28[0],&data[st_zrf_base_param.b27_Ldq],2); //非 5030/5042 时ldq 值 = 166M/场频/扫描方式/遍数, 此数据必须小于 65535当帧频不准时利用微调选项调整
//5030/5042 时ldq 值 = 166M/场频/扫描方式/19/遍数, 此数据必须小于 65535,此处遍数为4096 级时:5 8192 级时:9 16384级时:17 此值最小为 485.
//Ldq_vpwm普通芯片的普通模式和 PWM 芯片与 ldq 一致,普通芯片的 VPWM 模式下,对遍数进行了修正(4096-38 遍8192-39 遍16384-134 遍);
//Ldq_vpwm2方式时即普通芯片的VPWM灰度优先模式下对遍数进行了修正(4096-58 遍8192-59 遍16384-116 遍32768-117 遍65536-118 遍);
//MY9268、MBI5050 时:画面刷新率/60Hz注意同步刷新时数据源的帧频率需要考虑是 60Hz还是50Hz还是 75Hz低字节在前
zrf_rcv_obj.b29_7_4 = data[st_zrf_base_param.b29_reserve] & 0b11110000; //0与显卡同步1不同步
zrf_rcv_obj.b29_3_2 = data[st_zrf_base_param.b29_reserve] & 0b00001100; //低于 120hz时该位置1选择为行外扫描灰度
zrf_rcv_obj.b29_1_0 = data[st_zrf_base_param.b29_reserve] & 0b00000011; //显卡同步时,帧频倍数
zrf_rcv_obj.b30 = data[st_zrf_base_param.b30_pwmMultFreq]; //DPWM 芯片刷新倍频数 ICND2055/ICND2065 刷新倍频数 b7~b0
zrf_rcv_obj.b31 = data[st_zrf_base_param.b31_rcvCardCols]; //接收卡带载列数低字节
zrf_rcv_obj.b32 = data[st_zrf_base_param.b31_rcvCardCols + 1]; //接收卡带载列数高字节
zrf_rcv_obj.b33_7_4 = data[st_zrf_base_param.b33_emptyRowMode] & 0b11110000; //偶数图像区空行4bit
zrf_rcv_obj.b33_3_0 = data[st_zrf_base_param.b33_emptyRowMode] & 0b00001111; //奇数图像区空行 4bit
zrf_rcv_obj.b34_7_4 = data[st_zrf_base_param.b34_emptyRowPos] & 0b11110000; //1~14 表示第1到15组数据0 保留15 表示所有数据组都有空行
zrf_rcv_obj.b34_3_0 = data[st_zrf_base_param.b34_emptyRowPos] & 0b00001111; //1~15表示1到15组数据0 保留
zrf_rcv_obj.b35 = data[st_zrf_base_param.b35_xiaoYingEndTime]; //消隐控制结束时刻
zrf_rcv_obj.b36_7_6 = data[st_zrf_base_param.b36_RowIcParam] & 0b11000000; //保留
zrf_rcv_obj.b36_5_0 = data[st_zrf_base_param.b36_RowIcParam] & 0b00111111; //详见说明3
zrf_rcv_obj.b37_7_5 = data[st_zrf_base_param.b37_reserve] & 0b11100000; //保留
zrf_rcv_obj.b37_4_3 = data[st_zrf_base_param.b37_reserve] & 0b00011000; //端口内空数据通道数
zrf_rcv_obj.b37_2 = data[st_zrf_base_param.b37_reserve] & 0b00000100; //UD口交换
zrf_rcv_obj.b37_1 = data[st_zrf_base_param.b37_reserve] & 0b00000010; //逆序
zrf_rcv_obj.b37_0 = data[st_zrf_base_param.b37_reserve] & 0b00000001; //奇偶交换
memcpy(&zrf_rcv_obj.b38_69[0],&data[st_zrf_base_param.b38_hub1to32Area],32);//端口1~31输出图像区
zrf_rcv_obj.b70_7 = data[st_zrf_base_param.b70_reserve] & 0b10000000; //空行模式 0关闭 1打开
zrf_rcv_obj.b70_6 = data[st_zrf_base_param.b70_reserve] & 0b01000000; //对折偏移 0关闭 1打开
zrf_rcv_obj.b70_5_2 = data[st_zrf_base_param.b70_reserve] & 0b00111100; //对折模式: 0正常模式 1两折 2镜像对折 3:3折 4:4折 5:5折 6:6折 7:8折其他保留
zrf_rcv_obj.b70_1 = data[st_zrf_base_param.b70_reserve] & 0b00000010; //空列模式: 0禁止 1允许
zrf_rcv_obj.b70_0 = data[st_zrf_base_param.b70_reserve] & 0b00000001; //bit0 图像区偏移: 0菱形偏移模式 1梯形 偏移模式
for(int i=0;i<32;i++)
memcpy(&zrf_rcv_obj.b71_166[i][0],&data[st_zrf_base_param.b71_imgArea1to32Param+i*3],3);
zrf_rcv_obj.b167 = data[st_zrf_base_param.b167_syncPreTime]; //同步预留时间
zrf_rcv_obj.b168_7_5 = data[st_zrf_base_param.b168_reserve] & 0b11100000; //保留
zrf_rcv_obj.b168_4_0 = data[st_zrf_base_param.b168_reserve] & 0b00011111; //消隐延迟时间:(输入值+1*48ns
memcpy((qint8*)&zrf_rcv_obj.b169_192[0], &data[st_zrf_base_param.b169_redIcParam1],24);
zrf_rcv_obj.b193 = data[st_zrf_base_param.b193_reserve]; //保留
}
void ExpertWin::gammaMsgToClass(quint8 * data,quint8 flashPage)
{
if(flashPage == 0x10)
{
memcpy((quint8 *)&zrf_rcv_obj.g_all[0] , &data[0] ,256) ;
memcpy((quint8 *)&zrf_rcv_obj.g_red[0] , &data[0] ,256) ;
memcpy((quint8 *)&zrf_rcv_obj.g_green[0] , &data[0] ,256) ;
memcpy((quint8 *)&zrf_rcv_obj.g_blue[0] , &data[0] ,256) ;
}
else if(flashPage == 0x11)
{
memcpy((quint8 *)&zrf_rcv_obj.g_all[128] , &data[0] ,256) ;
memcpy((quint8 *)&zrf_rcv_obj.g_red[128] , &data[0] ,256) ;
memcpy((quint8 *)&zrf_rcv_obj.g_green[128] , &data[0] ,256) ;
memcpy((quint8 *)&zrf_rcv_obj.g_blue[128] , &data[0] ,256) ;
}
}
void ExpertWin::paiXuMsgToClass(quint8 * data,quint8 flashPage,bool bInitFromP8_st_rcv_pos)
{
if(bInitFromP8_st_rcv_pos == false)
{
if(flashPage == 0x20)//flashpage 0x20
{
zrf_rcv_obj.p0_cardIndexInNet = data[0];//当前卡在网线内的序号
zrf_rcv_obj.p1_SendCardCode = data[1];//当前网线所在的发送卡编号
zrf_rcv_obj.p2_netIndexInSendCard = data[2];//当前网线所在发送卡输出口编号
zrf_rcv_obj.p3_fenXianNum = data[3];//当前分线号
zrf_rcv_obj.p4_rcvCardsNumInNet = data[4];//当前网线内接收卡总数
zrf_rcv_obj.p5_netScreenIndex = data[5]; //当前网线所在屏号
zrf_rcv_obj.p6_reserve = data[6];//保留
zrf_rcv_obj.p7_reserve1 = data[7];//保留
memcpy(&zrf_rcv_obj.p8_st_rcv_pos[0],&data[8],256-8);
}
else
{
int itemp=flashPage&0x0F - 1;//flashpage 0x21~0x27,
memcpy(&zrf_rcv_obj.p8_st_rcv_pos[itemp*32+(256-8)/8],&data[0],256);
}
}
else
{
for(int i=0;i<256;i++)
{
zrf_rcv_obj.p_x[i] = (zrf_rcv_obj.p8_st_rcv_pos[i].imgXH4_YH4&0xF0)<<4 | zrf_rcv_obj.p8_st_rcv_pos[i].imgXL8;
zrf_rcv_obj.p_y[i] = (zrf_rcv_obj.p8_st_rcv_pos[i].imgXH4_YH4&0x0F)<<8 | zrf_rcv_obj.p8_st_rcv_pos[i].imgYL8;
zrf_rcv_obj.p_w[i] = (zrf_rcv_obj.p8_st_rcv_pos[i].imgWidthH4_HeightH4&0xF0)<<4 | zrf_rcv_obj.p8_st_rcv_pos[i].imgWidthL8;
zrf_rcv_obj.p_h[i] = (zrf_rcv_obj.p8_st_rcv_pos[i].imgWidthH4_HeightH4&0x0F)<<8 | zrf_rcv_obj.p8_st_rcv_pos[i].imgHeightL8;
zrf_rcv_obj.p_posNum[i] = zrf_rcv_obj.p8_st_rcv_pos[i].imgPosNumInScreenH8<<8 | zrf_rcv_obj.p8_st_rcv_pos[i].imgPosNumInScreenL8;
}
}
}
void ExpertWin::miaoDianMsgToClass(quint8 * data)
{
memcpy(&zrf_rcv_obj.m_scanIndex , data , 64);
memcpy(&zrf_rcv_obj.m_pixelPos , &data[64] , 2048);
}
//added by alahover -o 20230823