Files
EJM_Display/Pages/P01_MianPage.cpp
2025-10-21 11:11:52 +08:00

650 lines
30 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "P01_MianPage.h"
#include "ui_P01_MianPage.h"
#include <QDebug>
#include <QMovie>
#include <QDir>
#include <QVBoxLayout>
#include <QTimer>
#include <GlobalDefinitions/Variable.h>
#include <QImage>
#include <QLabel>
#include <QPainter>
#include <QPen>
#include <QImage>
int TransportPosMaxX = 0;
int TransportPosMaxY = 0;
int OldRollerPos[2][2]={{0,0},{0,0}};
QImage Brush[2];
QElapsedTimer TmpTime;
P01_MianPage::P01_MianPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::P01_MianPage),
mObjLoader(nullptr),
m_workerThread(nullptr),
m_workerLoader(nullptr),
m_loadingStep(0),
UIRefresh_Timer(nullptr),
TrailRefresh_Timer(nullptr)
{
ui->setupUi(this);
QTimer::singleShot(10, this, &P01_MianPage::PageInit);
// QTimer::singleShot(1000, this, &P01_MianPage::Show3D);
}
qint64 JgTime;
void P01_MianPage::PageInit()
{
TmpTime.start();
QPixmap pix(":/Icos/Icos/Sursor.png");
QCursor custom(pix, pix.width()/2, pix.height()/2);
setCursor(custom);
setWindowFlag(Qt::FramelessWindowHint); // 设置窗口无边框,设置后窗口无法移动
uiInitTransportPos(85,85);
QMovie *MLoading = new QMovie(ConfigurationPath + "Gif动画/Radar.gif");
//qDebug() << "当前工作文件夹:" << QDir::currentPath();
ui->Gif_Radar->setMovie(MLoading); // 1. 设置要显示的 GIF 动画图片
ui->Gif_Radar->setScaledContents(true);
MLoading->start(); // 2. 启动动画
ui->Gif_Radar->show();
//所用定时器初始化
UIRefresh_Timer = new QTimer(this);
connect(UIRefresh_Timer, &QTimer::timeout, this, &P01_MianPage::UIRefreshTimeOut);
UIRefresh_Timer->setInterval(100); // 设置定时器间隔为 1000 毫秒1 秒)
UIRefresh_Timer->start();
//所用定时器初始化
TrailRefresh_Timer = new QTimer(this);
connect(TrailRefresh_Timer, &QTimer::timeout, this, &P01_MianPage::TrailRefreshTimeOut);
TrailRefresh_Timer->setInterval(1000); // 设置定时器间隔为 1000 毫秒1 秒)
TrailRefresh_Timer->start();
qDebug()<<"初始化执行完成后,消耗时间"<<TmpTime.elapsed();
JgTime = TmpTime.elapsed();
}
P01_MianPage::~P01_MianPage()
{
// 安全清理线程和资源
if (m_workerThread && m_workerThread->isRunning()) {
m_workerThread->quit();
m_workerThread->wait(1000); // 等待1秒
if (m_workerThread->isRunning()) {
m_workerThread->terminate(); // 强制终止
}
m_workerThread->deleteLater();
m_workerThread = nullptr;
}
// 清理ObjLoader对象
if (mObjLoader) {
mObjLoader->deleteLater();
mObjLoader = nullptr;
}
if (m_workerLoader) {
m_workerLoader->deleteLater();
m_workerLoader = nullptr;
}
// 清理PageInit中创建的定时器
if (UIRefresh_Timer) {
UIRefresh_Timer->stop();
UIRefresh_Timer->deleteLater();
UIRefresh_Timer = nullptr;
}
if (TrailRefresh_Timer) {
TrailRefresh_Timer->stop();
TrailRefresh_Timer->deleteLater();
TrailRefresh_Timer = nullptr;
}
// 清理QMovie对象
if (ui->Gif_Radar->movie()) {
ui->Gif_Radar->movie()->stop();
delete ui->Gif_Radar->movie();
ui->Gif_Radar->setMovie(nullptr);
}
delete ui;
}
void P01_MianPage::Show3D()
{
// 初始化加载状态
m_loadingStep = 0;
m_modelPreprocessResults.clear();
// 初始化3D加载器
DevName3D = "整机装配";
mObjLoader = new ObjLoader();
mObjLoader->setEnDebug(true);
mObjLoader->init3DScene(ui->Frame_Dev3D);
mObjLoader->setCameraSpeed(200.0, 200.0);
// 修复正确初始化QStringList移除错误的=号赋值方式)
m_pendingDevices << "整机装配"
<< "运输机"
<< "截割部"
<< "左装载机"
<< "右装载机"
<< "滚筒";
// 创建工作线程用于预处理
m_workerThread = new QThread(this);
m_workerLoader = new ObjLoader();
m_workerLoader->moveToThread(m_workerThread);
// 连接预处理完成信号(使用现代信号槽语法)
connect(m_workerLoader, &ObjLoader::preprocessDone,
this, &P01_MianPage::onPreprocessResult);
// 处理单个设备预处理完成
connect(this, &P01_MianPage::preprocessFinished, this, &P01_MianPage::onPreprocessFinished);
// 设置相机位置
Qt3DRender::QCamera* cam = mObjLoader->getCamera();
if (cam) {
//"相机位置: (X: 15.0894, Y: 12.8326, Z: 13.1512)"
//"看向位置: (X: 3.9284, Y: 0.3222, Z: 0.0456)"
//"视野角度: 25.0°"
cam->setPosition(QVector3D(15.0894, 12.8326, 13.1512));
cam->setViewCenter(QVector3D(3.9284,0.3222, 0.0456));
}
// 所有设备加载完成
connect(this, &P01_MianPage::allDevicesLoaded, this, [=]() {
// 清理工作线程
if (m_workerThread && m_workerThread->isRunning()) {
m_workerThread->quit();
m_workerThread->wait(1000); // 等待1秒
if (m_workerThread->isRunning()) {
m_workerThread->terminate(); // 强制终止
}
m_workerThread->deleteLater();
m_workerThread = nullptr;
}
// 清理工作加载器
if (m_workerLoader) {
m_workerLoader->deleteLater();
m_workerLoader = nullptr;
}
// 启动旋转定时器
QTimer *RotateDev_Timer = new QTimer(this);
connect(RotateDev_Timer, &QTimer::timeout, this, &P01_MianPage::RotateDev);
RotateDev_Timer->setInterval(33);
RotateDev_Timer->start();
});
// 启动工作线程并开始预处理
m_workerThread->start();
QMetaObject::invokeMethod(m_workerLoader, "preprocessDevices", Qt::QueuedConnection,
Q_ARG(QStringList, m_pendingDevices),
Q_ARG(QString, ConfigurationPath + "3D模型文件/掘锚一体机/本体/"));
}
// 新增:接收预处理结果的槽函数
void P01_MianPage::onPreprocessResult(const QString& deviceName, QVector3D center, float radius)
{
m_modelPreprocessResults[deviceName] = QPair<QVector3D, float>(center, radius);
emit preprocessFinished(deviceName);
}
void P01_MianPage::onPreprocessFinished(const QString& deviceName)
{
// 检查是否是当前需要加载的设备
if (m_loadingStep >= m_pendingDevices.size()) return;
if (m_pendingDevices[m_loadingStep] != deviceName) return;
// 获取预处理结果
auto result = m_modelPreprocessResults[deviceName];
QVector3D modelCenter = result.first;
float modelRadius = result.second;
QString filePath = ConfigurationPath + "3D模型文件/掘锚一体机/本体/" + deviceName + ".obj";
// 关键优化:使用定时器将加载操作拆分为小步骤,避免阻塞主线程
QTimer::singleShot(10, this, [=]() {
bool LoaderOK = false;
// 第一步:只执行最核心的加载操作(创建实体)
switch (m_loadingStep) {
case 0: // 整机装配
LoaderOK = mObjLoader->loadDevice(deviceName, filePath, QVector3D(0, 0, 0));
if (LoaderOK) {
mObjLoader->getDevice(deviceName)->modelCenter = modelCenter;
}
break;
case 1: // 运输机
LoaderOK = mObjLoader->loadChildDevice(deviceName, filePath, "整机装配", QVector3D(0,0,0), QColor(0,255,0,80));
if (LoaderOK) {
mObjLoader->getDevice(deviceName)->modelCenter = modelCenter;
}
break;
case 2: // 截割部
LoaderOK = mObjLoader->loadChildDevice(deviceName, filePath, "整机装配", QVector3D(0,0,0), QColor(0,255,0,80));
if (LoaderOK) {
mObjLoader->getDevice(deviceName)->modelCenter = modelCenter;
}
break;
case 3: // 左装载机
LoaderOK = mObjLoader->loadChildDevice(deviceName, filePath, "整机装配", QVector3D(0,0,0), QColor(46, 47, 48,80));
if (LoaderOK) {
mObjLoader->getDevice(deviceName)->modelCenter = modelCenter;
}
break;
case 4: // 右装载机
LoaderOK = mObjLoader->loadChildDevice(deviceName, filePath, "整机装配", QVector3D(0,0,0), QColor(46, 47, 48,80));
if (LoaderOK) {
mObjLoader->getDevice(deviceName)->modelCenter = modelCenter;
}
break;
case 5: // 滚筒
LoaderOK = mObjLoader->loadChildDevice(deviceName, filePath, "截割部", QVector3D(0,0,0), QColor(46, 47, 48,80));
if (LoaderOK) {
mObjLoader->getDevice(deviceName)->modelCenter = modelCenter;
}
break;
}
if (!LoaderOK) {
// 加载失败处理
m_loadingStep++;
return;
}
// 第二步延迟执行缩放操作10ms后
QTimer::singleShot(10, this, [=]() {
switch (m_loadingStep) {
case 0: mObjLoader->scaleDevice(deviceName, 0.001f); break;
case 1: mObjLoader->scaleDevice(deviceName, 0.001f); break;
case 2: mObjLoader->scaleDevice(deviceName, 0.001f); break;
case 3: mObjLoader->scaleDevice(deviceName, 0.001f); break;
case 4: mObjLoader->scaleDevice(deviceName, 0.001f); break;
case 5: mObjLoader->scaleDevice(deviceName, 0.001f); break;
}
// 第三步延迟执行坐标轴和位置设置再10ms后
QTimer::singleShot(10, this, [=]() {
switch (m_loadingStep) {
case 0: // 整机装配
//mObjLoader->addAxisGizmo(nullptr, 5.0f);
//mObjLoader->addAxisGizmo(mObjLoader->getDevice(deviceName)->entity, 3.0f);
mObjLoader->setParentDevicePosition(deviceName, QVector3D(-33.394, 1021.68, 190.52));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(0, 0, 0));
break;
case 1: // 运输机
//mObjLoader->addAxisGizmo(mObjLoader->getDevice(deviceName)->entity, 3.0f);
mObjLoader->setParentDevicePosition(deviceName, QVector3D(0,617.183, 95239.7));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(0,1,96.48));
mObjLoader->adjustChildDeviceOffset(deviceName, QVector3D(-3.61, 1.25, 0.25));
mObjLoader->rotateArmToAbsoluteYAngle(deviceName, 90);
break;
case 2: // 截割部
//mObjLoader->addAxisGizmo(mObjLoader->getDevice(deviceName)->entity, 5.0f);
mObjLoader->setParentDevicePosition(deviceName, QVector3D(0, -3633.7, 4141.31));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(0, -2.9800, 1.3800));
mObjLoader->adjustChildDeviceOffset(deviceName, QVector3D(0.5000, 0.7100, 0.2500));
mObjLoader->rotateArmToAbsoluteYAngle(deviceName, 90);
break;
case 3: // 左装载机
//mObjLoader->addAxisGizmo(mObjLoader->getDevice(deviceName)->entity, 5.0f);
mObjLoader->setParentDevicePosition(deviceName, QVector3D(33.5, -42.4635, -11.9246));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(0, 0, 0));
mObjLoader->setParentDevicePosition(deviceName, QVector3D(4.0300, -0.3500, 1.5400));
mObjLoader->rotateArmToAbsoluteZAngle(deviceName, 45);
break;
case 4: // 右装载机
//mObjLoader->addAxisGizmo(mObjLoader->getDevice(deviceName)->entity, 5.0f);
mObjLoader->setParentDevicePosition(deviceName, QVector3D(33.5, -42.4635, 11.9246));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(0, 0, 0));
mObjLoader->setParentDevicePosition(deviceName, QVector3D(4.0300, -0.3500, -0.9300));
mObjLoader->rotateArmToAbsoluteZAngle(deviceName, 45);
break;
case 5: // 滚筒
mObjLoader->rotateDevice(deviceName,10260,0,0);
//mObjLoader->addAxisGizmo(mObjLoader->getDevice(deviceName)->entity, 10.0f);
mObjLoader->setParentDevicePosition(deviceName, QVector3D(-0.927338, 2800, 1.00699));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(1.0050, 4.2200, 0.5000));
mObjLoader->adjustChildDeviceOffset(deviceName, QVector3D(0, 0, 0));
mObjLoader->moveArmLocalOriginTo(deviceName, QVector3D(0, -10, 0));
mObjLoader->rotateArmToAbsoluteZAngle(deviceName, 90);
mObjLoader->adjustChildDeviceOffset(deviceName, QVector3D(4.2000, -1.600, 5.0000));
mObjLoader->rotateArmToAbsoluteXAngle(deviceName, 1);
break;
}
// 延迟加载下一个设备给主线程足够时间处理UI事件
QTimer::singleShot(100, this, [=]() {
m_loadingStep++;
if (m_loadingStep < m_pendingDevices.size()) {
QString nextDevice = m_pendingDevices[m_loadingStep];
QMetaObject::invokeMethod(m_workerLoader, "preprocessSingleDevice", Qt::QueuedConnection,
Q_ARG(QString, nextDevice),
Q_ARG(QString, ConfigurationPath + "3D模型文件/掘锚一体机/本体/"));
} else {
emit allDevicesLoaded();
}
});
});
});
});
}
uint32_t TCount =0 ;
void P01_MianPage::UIRefreshTimeOut()
{
if(gPageIndexStr != "P01")
return;
uint32_t TmpBools[10];
TmpBools[0] = getNodeValue("PageBOOLS.B0") .toUInt();
TmpBools[1] = getNodeValue("PageBOOLS.B1") .toUInt();
TmpBools[2] = getNodeValue("PageBOOLS.B2") .toUInt();
TmpBools[3] = getNodeValue("PageBOOLS.B3") .toUInt();
TmpBools[4] = getNodeValue("PageBOOLS.B4") .toUInt();
TmpBools[5] = getNodeValue("PageBOOLS.B5") .toUInt();
TmpBools[6] = getNodeValue("PageBOOLS.B6") .toUInt();
TmpBools[7] = getNodeValue("PageBOOLS.B7") .toUInt();
TmpBools[8] = getNodeValue("PageBOOLS.B8") .toUInt();
TmpBools[9] = getNodeValue("PageBOOLS.B9") .toUInt();
//杂进度条显示
QStringList LevelCor = {"rgb(255, 0, 0)","rgb(255, 0, 0)","rgb(0, 255, 0)","rgb(0, 255, 255)"};
ProgressBar_LCD(ui->PB_SpareTemp,ui->LCD_SpareTemp,"PB_SpareTemp.PageGroup","IN_Sersor.SpareTemp",glMotorTempColor);
ProgressBar_LCD(ui->PB_OilLevel,ui->LCD_OilLevel,"PB_OilLevel.PageGroup","IN_Sersor.OilLevel",LevelCor);
ProgressBar_LCD(ui->PB_OilTemp,ui->LCD_OilTemp,"PB_OilTemp.PageGroup","IN_Sersor.OilTemp",glMotorTempColor);
QStringList NullColor = {"rgb(0, 255, 255)","rgb(0, 255, 255)","rgb(0, 255, 255)","rgb(0, 255, 255)"};
ProgressBar_LCD(ui->PB_PressurePump_1,ui->LCD_PressurePump_1,"PB_PressurePump1.PageGroup","IN_Sersor.Pressure_Pump1",NullColor);
ProgressBar_LCD(ui->PB_PressurePump_2,ui->LCD_PressurePump_2,"PB_PressurePump2.PageGroup","IN_Sersor.Pressure_Pump2",NullColor);
ProgressBar_LCD(ui->PB_PressurePump_3,ui->LCD_PressurePump_3,"PB_PressurePump3.PageGroup","IN_Sersor.Pressure_Pump3",NullColor);
// 编码器数值显示
ui->LCD_EncoderL->display(QString::number(getNodeValue("IN_Encoder.EncoderL") .toUInt()));
ui->LCD_EncoderR->display(QString::number(getNodeValue("IN_Encoder.EncoderR") .toUInt()));
// 急停的显示
for (uint8_t i=0;i<12;i++) {
QString TextObjName = QString("Led_EStop_%1").arg(i);
QLabel* Label = findChild<QLabel*>(TextObjName);
if (Label) {
SetStyleStr(Label,getBitOf32Data(TmpBools[0], i,false),"color: rgb(255, 0, 0);","color: rgb(0, 255, 0);");
}
}
// ESR状态显示
SetStyleStr(ui->Status_IESR_1,getBitOf32Data(TmpBools[0], 12,false),"border-image: url(:/Icos/Icos/LED2_Green.png);","border-image: url(:/Icos/Icos/LED1_Rad.png);");
SetStyleStr(ui->Status_IESR_2,getBitOf32Data(TmpBools[0], 13,false),"border-image: url(:/Icos/Icos/LED2_Green.png);","border-image: url(:/Icos/Icos/LED1_Rad.png);");
SetStyleStr(ui->Status_QESR_1,getBitOf32Data(TmpBools[0], 14,false),"border-image: url(:/Icos/Icos/LED2_Green.png);","border-image: url(:/Icos/Icos/LED3_Rad (2).png);");
SetStyleStr(ui->Status_QESR_2,getBitOf32Data(TmpBools[0], 15,false),"border-image: url(:/Icos/Icos/LED2_Green.png);","border-image: url(:/Icos/Icos/LED3_Rad (2).png);");
//传感器及阀控模块输出的显示
SetStyleStr(ui->Status_P1_1,getBitOf32Data(TmpBools[2], 1,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P1_2,getBitOf32Data(TmpBools[2], 3,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P1_3,getBitOf32Data(TmpBools[2], 5,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P1_4,getBitOf32Data(TmpBools[2], 4,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P1_5,getBitOf32Data(TmpBools[1], 23,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P1_6,getBitOf32Data(TmpBools[2], 0,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P2_1,getBitOf32Data(TmpBools[1], 22,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P2_2,getBitOf32Data(TmpBools[1], 30,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P2_3,getBitOf32Data(TmpBools[1], 21,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P2_4,getBitOf32Data(TmpBools[1], 20,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P2_5,getBitOf32Data(TmpBools[1], 29,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P3_1,getBitOf32Data(TmpBools[1], 24,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P3_2,getBitOf32Data(TmpBools[1], 25,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P3_3,getBitOf32Data(TmpBools[1], 26,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P3_4,getBitOf32Data(TmpBools[1], 27,false),"color: rgb(0, 255, 0);","");
SetStyleStr(ui->Status_P3_5,getBitOf32Data(TmpBools[1], 28,false),"color: rgb(0, 255, 0);","");
//油缸伸缩状态显示
QStringList OilCylindStyle = {"","border-image: url(:/Icos/Icos/icon_stretch.png);","border-image: url(:/Icos/Icos/icon_shorten.png);"};
SetStyleStr(ui->Status_Oil_1, getBitOf32Data(TmpBools[3], 24,false),getBitOf32Data(TmpBools[3], 25,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_2, getBitOf32Data(TmpBools[1], 12,false),getBitOf32Data(TmpBools[1], 13,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_3, getBitOf32Data(TmpBools[1], 14,false),getBitOf32Data(TmpBools[1], 15,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_4, getBitOf32Data(TmpBools[3], 26,false),getBitOf32Data(TmpBools[3], 27,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_5, getBitOf32Data(TmpBools[1], 8 ,false),getBitOf32Data(TmpBools[1], 9 ,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_6, getBitOf32Data(TmpBools[1], 0 ,false),getBitOf32Data(TmpBools[1], 1 ,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_7, getBitOf32Data(TmpBools[1], 10,false),getBitOf32Data(TmpBools[1], 11,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_8, getBitOf32Data(TmpBools[1], 2 ,false),getBitOf32Data(TmpBools[1], 3 ,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_9, getBitOf32Data(TmpBools[1], 16,false),getBitOf32Data(TmpBools[1], 17,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_10,getBitOf32Data(TmpBools[1], 18,false),getBitOf32Data(TmpBools[1], 19,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_11,getBitOf32Data(TmpBools[1], 4 ,false),getBitOf32Data(TmpBools[1], 5 ,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_12,getBitOf32Data(TmpBools[1], 6 ,false),getBitOf32Data(TmpBools[1], 7 ,false),OilCylindStyle);
SetStyleStr(ui->Status_Oil_13,getBitOf32Data(TmpBools[3], 28,false),getBitOf32Data(TmpBools[3], 29,false),OilCylindStyle);
//电机温度电流,进度条和LCD的显示
PB_Refresh("Pump");
PB_Refresh("Cut");
PB_Refresh("LoaderL");
PB_Refresh("LoaderR");
PB_Refresh("TransportL");
PB_Refresh("TransportR");
PB_Refresh("Standby");
}
void P01_MianPage::ProgressBar_LCD(QProgressBar *QPB,QLCDNumber *QLCD,QString NodeID_Bar,QString NodeID_Value,QStringList Colors){
uint32_t PB_Group1 = getNodeValue(NodeID_Bar) .toUInt();
float Value = getNodeValue(NodeID_Value) .toFloat();
uint16_t PValue= static_cast<uint16_t>(PB_Group1 >> 16); // 高 16 位
uint16_t PColor = static_cast<uint16_t>(PB_Group1 & 0xFFFF);// 低 16 位
SetProgressBar(QPB,PValue,PColor,Colors);
QLCD->display(QString::number(Value,'f',2));
}
void P01_MianPage::PB_Refresh(QString Dev){
uint32_t PB_Group1 = getNodeValue("PB_Curr_"+Dev+".PageGroup1") .toUInt();
uint32_t PB_Group2 = getNodeValue("PB_Curr_"+Dev+".PageGroup2") .toUInt();
uint32_t PB_MotorTemp = getNodeValue("PB_Temp_"+Dev+".PageGroup") .toUInt();
uint16_t PercentageCurU = static_cast<uint16_t>(PB_Group1 >> 16); // 高 16 位
uint16_t PercentageCurV = static_cast<uint16_t>(PB_Group1 & 0xFFFF);// 低 16 位
uint16_t PercentageCurW = static_cast<uint16_t>(PB_Group2 >> 16); // 高 16 位
uint16_t PercentageTmpColor = static_cast<uint16_t>(PB_Group2 & 0xFFFF);// 低 16 位
uint8_t ColorU = (PercentageTmpColor / 10) % 10;
uint8_t ColorV = (PercentageTmpColor / 100) % 10;
uint8_t ColorW = PercentageTmpColor % 10;
uint16_t PercentageMotorTemp = static_cast<uint16_t>(PB_MotorTemp >> 16); // 高 16 位
uint16_t ColorTemp = static_cast<uint16_t>(PB_MotorTemp & 0xFFFF);// 低 16 位
qreal CurrU = getNodeValue("IN_Phase"+Dev+".Filtered30_U") .toReal();
qreal CurrV = getNodeValue("IN_Phase"+Dev+".Filtered30_V") .toReal();
qreal CurrW = getNodeValue("IN_Phase"+Dev+".Filtered30_W") .toReal();
qreal Temp = getNodeValue("IN_Phase"+Dev+".Filtered_Temp") .toReal();
qreal Curr = fmax(CurrU,fmax(CurrV,CurrW));
qreal Rated;
if (Dev == "LoaderL" || Dev == "LoaderR" )
Rated = getNodeValue("PS.gRatedCur_Loader") .toReal();
else if(Dev == "TransportL" || Dev == "TransportR" )
Rated = getNodeValue("PS.gRatedCur_Transport") .toReal();
else{
Rated = getNodeValue("PS.gRatedCur_"+Dev) .toReal();
}
QProgressBar* CurPB_1 = findChild<QProgressBar*>("PB_Cur"+Dev+"_1");
QProgressBar* CurPB_2 = findChild<QProgressBar*>("PB_Cur"+Dev+"_2");
QProgressBar* CurPB_3 = findChild<QProgressBar*>("PB_Cur"+Dev+"_3");
QProgressBar* TempPB = findChild<QProgressBar*>("PB_Temp"+Dev);
QLCDNumber* CurLCD_1 = findChild<QLCDNumber*>("LCD_Cur"+Dev+"_1");
QLCDNumber* CurLCD_2 = findChild<QLCDNumber*>("LCD_Cur"+Dev+"_2");
QLCDNumber* CurLCD_3 = findChild<QLCDNumber*>("LCD_Cur"+Dev+"_3");
QLCDNumber* CurLCD = findChild<QLCDNumber*>("LCD_Cur"+Dev);
QLCDNumber* TempLCD = findChild<QLCDNumber*>("LCD_Temp"+Dev);
QLabel* CurRated_Label = findChild<QLabel*>("Label_UnitCur"+Dev);
SetProgressBar(CurPB_1,PercentageCurU,ColorU,glMotorCurColor);
SetProgressBar(CurPB_2,PercentageCurV,ColorV,glMotorCurColor);
SetProgressBar(CurPB_3,PercentageCurW,ColorW,glMotorCurColor);
SetProgressBar(TempPB,PercentageMotorTemp,ColorTemp,glMotorTempColor);
CurLCD_1->display(QString::number(CurrU,'f',2));
CurLCD_2->display(QString::number(CurrV,'f',2));
CurLCD_3->display(QString::number(CurrW,'f',2));
CurLCD->display(QString::number(Curr,'f',2));
TempLCD->display(QString::number(Temp,'f',2));
CurRated_Label->setText("A/"+QString::number(Rated,'f',1)+"A");
}
void P01_MianPage::SetProgressBar(QProgressBar *PB,uint16_t Value,uint8_t ColorIndex,QStringList Color){
if(Value > PB->maximum()) Value = PB->maximum();
PB->setValue(Value);
if(ColorIndex < Color.length()){
QString Style = "QProgressBar {\n background-color: transparent;\n border: 2px solid #888888;\n border-radius: 3px;\n}\nQProgressBar::chunk {\n background-color:"+Color[ColorIndex]+";\n}";
if(PB->styleSheet() != Style){
PB->setStyleSheet(Style);
}
}
}
uint16_t OldRoller_Length = 0;
void P01_MianPage::TrailRefreshTimeOut(){
if(gPageIndexStr != "P01")
return;
// 画板的显示
uint32_t Diameter = getNodeValue("RollerPosition.Diameter") .toUInt();
uint32_t LengthHeight = getNodeValue("RollerPosition.LengthHeight") .toUInt();
uint32_t SideView = getNodeValue("RollerPosition.SideView") .toUInt();
uint32_t FaceView = getNodeValue("RollerPosition.FaceView") .toUInt();
uint32_t TransPos = getNodeValue("RollerPosition.TransportPos") .toUInt();
uint32_t TmpHaul = getNodeValue("RollerPosition.ShowHaulSpeed") .toUInt();
float CenterHeight = getNodeValue("RollerPosition.CenterHeight") .toFloat();
int16_t Roller_SideX = static_cast<int16_t>(SideView >> 16); // 高 16 位
int16_t Roller_SideY = static_cast<int16_t>(SideView & 0xFFFF);// 低 16 位
int16_t Roller_FaceX = static_cast<int16_t>(FaceView >> 16); // 高 16 位
int16_t Roller_FaceY = static_cast<int16_t>(FaceView & 0xFFFF);// 低 16 位
int16_t Roller_Length = static_cast<int16_t>(LengthHeight >> 16); // 高 16 位
int16_t TransPos_SideX = static_cast<int16_t>(TransPos >> 16); // 高 16 位
int16_t TransPos_SideY = static_cast<int16_t>(TransPos & 0xFFFF);// 低 16 位
int16_t TmpSpeedL = static_cast<int16_t>(TmpHaul >> 16); // 高 16 位
int16_t TmpSpeedR = static_cast<int16_t>(TmpHaul & 0xFFFF);// 低 16 位
uint16_t Roller_Diameter_Img = static_cast<int16_t>(Diameter >> 16); // 高 16 位
uint16_t Roller_Diameter_mm = static_cast<int16_t>(Diameter & 0xFFFF); // 低 16 位
if(Brush[0].isNull()){
Brush[0] = QImage(":/Devices/Devices/ICO_Cutting1.png");
Brush[0] = Brush[0].scaled(Roller_Diameter_Img, Roller_Diameter_Img, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->TrailDisplay_1->setBrushImage(Brush[0]);
}
if(Brush[1].isNull() || OldRoller_Length != Roller_Length){
Brush[1] = QImage(Roller_Length, Roller_Diameter_Img, QImage::Format_ARGB32);
Brush[1].fill(Qt::green);
ui->TrailDisplay_2->setBrushImage(Brush[1]);
OldRoller_Length = Roller_Length;
}
uiRollerPosition(0,Roller_SideX,Roller_SideY);
uiRollerPosition(1,Roller_FaceX,Roller_FaceY);
uiSetTransportPos(TransPos_SideX,TransPos_SideY);
uiSetHaulSpeed(TmpSpeedL,TmpSpeedR);
// 采高卧底的显示
uiSetMining(CenterHeight,Roller_Diameter_mm);
}
void P01_MianPage::uiRollerPosition(uint8_t Index,uint16_t aX,uint16_t aY){
//qDebug()<<Index<<aX<<aY<<OldRollerPos[Index][0]<<OldRollerPos[Index][1] ;
//掘锚机运输机位置的显示
if(gPageIndexStr != "P01")
return;
if(OldRollerPos[Index][0] != aX || OldRollerPos[Index][1] != aY){
QPoint localPos(aX,aY);
if(Index == 0)
ui->TrailDisplay_1->moveBrush(localPos);
else
ui->TrailDisplay_2->moveBrush(localPos);
}
OldRollerPos[Index][0] = aX;
OldRollerPos[Index][1] = aY;
}
void P01_MianPage::uiInitHaulSpeed(int Max){
ui->Slider_Haul_L->setMinimum(0-Max);
ui->Slider_Haul_L->setMaximum(Max);
ui->Slider_Haul_R->setMinimum(0-Max);
ui->Slider_Haul_R->setMaximum(Max);
}
void P01_MianPage::uiInitMining(int Max,int Min){
ui->Slider_Mining->setMinimum(Min);
ui->Slider_Mining->setMaximum(Max);
}
void P01_MianPage::uiInitTransportPos(int MaxX,int MaxY){
TransportPosMaxX = MaxX;
TransportPosMaxY = MaxY;
}
void P01_MianPage::uiSetHaulSpeed(int SpeedL,int SpeedR){
if(gPageIndexStr != "P01")
return;
ui->Slider_Haul_L->setValue(SpeedL);
ui->LCD_MainHaul_L->display(QString::number(SpeedL));
ui->Slider_Haul_R->setValue(SpeedR);
ui->LCD_MainHaul_R->display(QString::number(SpeedR));
}
void P01_MianPage::uiSetMining(float CenterHeight,uint16_t Roller_Diameter_mm){
if(gPageIndexStr != "P01")
return;
int16_t CH = CenterHeight*1000;
ui->Slider_Mining->setValue(CH);
ui->LCD_MiningB1->display(QString::number(CenterHeight - Roller_Diameter_mm * 0.001, 'f', 2));
ui->LCD_MiningT1->display(QString::number(CenterHeight + Roller_Diameter_mm * 0.001, 'f', 2));
}
void P01_MianPage::uiSetTransportPos(int rx,int ry){
if(gPageIndexStr != "P01")
return;
int NewRX = 29+(130/2)+rx;
int NewRY = -6+(130/2)+ry;
//qDebug()<<NewRX<<NewRY;
ui->Label_TransportPos->move(NewRX,NewRY);
}
void P01_MianPage::SetStyleStr(QLabel *L,bool Status,QString TStr,QString FStr){
if(L == nullptr) return;
QString Style = "";
if(Status){
Style = TStr;
}else{
Style = FStr;
}
if(L->styleSheet() != Style)
L->setStyleSheet(Style);
}
void P01_MianPage::SetStyleStr(QLabel *L,bool B1,bool B2,QStringList StyStr){
if(L == nullptr) return;
QString Style = "";
if(B1 && ! B2){
Style = StyStr[1];
}else if(!B1 && B2){
Style = StyStr[2];
}else if(!B1 && !B2){
Style = StyStr[0];
}else{
Style = "";
}
if(L->styleSheet() != Style)
L->setStyleSheet(Style);
}
void P01_MianPage::RotateDev(){
if(gPageIndexStr != "P01")
return;
mAngle = mAngle + 1;
if(mAngle > 360) mAngle =0;
//mObjLoader->rotateArmToAbsoluteYAngle(DevName3D, jd);
}