新版布局
This commit is contained in:
+86
-83
@@ -10,7 +10,6 @@
|
||||
#include <QHBoxLayout>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
#include <QTimer>
|
||||
#include "global.h"
|
||||
|
||||
WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
@@ -40,17 +39,17 @@ WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
leftLay->setSpacing(10);
|
||||
|
||||
m_chassisCard = new DataCard("底盘", left);
|
||||
m_chassisCard->addField("电量", "85%");
|
||||
m_chassisCard->addField("电压", "360V");
|
||||
m_chassisCard->addField("故障", "无");
|
||||
m_chassisCard->addField("底盘电量SOC", "--");
|
||||
m_chassisCard->addField("底盘电压U", "--");
|
||||
|
||||
m_armCard = new DataCard("机械臂", left);
|
||||
m_armCard->addField("末端位置", "XYZ");
|
||||
m_armCard->addField("姿态", "RX/RY/RZ");
|
||||
m_armCard->addField("末端位置", "--");
|
||||
m_armCard->addField("末端姿态", "--");
|
||||
|
||||
m_gasCard = new DataCard("气体检测仪", left);
|
||||
m_gasCard->addField("主机状态", "待机");
|
||||
m_gasCard->addField("浓度", "0 ppb");
|
||||
m_gasCard->addField("主机状态", "--");
|
||||
m_gasCard->addField("有毒物种类", "--");
|
||||
m_gasCard->addField("有毒物等级", "--");
|
||||
|
||||
leftLay->addWidget(m_chassisCard, 1);
|
||||
leftLay->addWidget(m_armCard, 1);
|
||||
@@ -62,16 +61,14 @@ WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
// 中央洗消卡
|
||||
m_washCard = new DataCard("洗消", this);
|
||||
m_fMode = m_washCard->addField("洗消模式", "--");
|
||||
m_fLevelA = m_washCard->addField("A组分液位", "100L");
|
||||
m_fLevelFoam = m_washCard->addField("泡沫箱液位", "30L");
|
||||
m_fFlowA = m_washCard->addField("A药剂流量", "0 L/min");
|
||||
m_fFlowB = m_washCard->addField("B药剂流量", "0 L/min");
|
||||
m_fGasFlow = m_washCard->addField("气体流量", "0 L/min");
|
||||
m_fPress = m_washCard->addField("管路压力", "0 MPa");
|
||||
m_fAirPress = m_washCard->addField("空压机压力", "0 MPa");
|
||||
m_fFoam = m_washCard->addField("发泡倍数", "0");
|
||||
m_fAirFault = m_washCard->addField("空压机故障代码", "");
|
||||
m_fPlungerFault = m_washCard->addField("柱塞泵故障代码", "");
|
||||
m_fLevelA = m_washCard->addField("A组分液位", "--");
|
||||
m_fLevelFoam = m_washCard->addField("B组分液位", "--");
|
||||
m_fFlowA = m_washCard->addField("A药剂流量", "--");
|
||||
m_fFlowB = m_washCard->addField("B药剂流量", "--");
|
||||
m_fGasFlow = m_washCard->addField("气体流量", "--");
|
||||
m_fPress = m_washCard->addField("管路压力", "--");
|
||||
m_fAirPress = m_washCard->addField("空压机压力", "--");
|
||||
m_fFoam = m_washCard->addField("发泡倍数", "--");
|
||||
main->addSpacing(60);
|
||||
main->addWidget(m_washCard, 1);
|
||||
|
||||
@@ -148,10 +145,11 @@ WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
|
||||
root->addLayout(main, 1);
|
||||
|
||||
// 底部条:左右两个按钮纵向占满两行,中间上下两排(泵数值 / 指示灯)居中
|
||||
// 底部条:左右两个按钮纵向占满,中间三排(泵数值 / 指示灯 / 两路液位低)居中。
|
||||
// 高度由 160 加到 188:中间那列三排约 164px 再加 8+8 的上下边距,160 装不下第三排
|
||||
QWidget* bottom = new QWidget(this);
|
||||
bottom->setObjectName("WashBottom");
|
||||
bottom->setFixedHeight(160);
|
||||
bottom->setFixedHeight(188);
|
||||
// 用 #WashBottom 限定选择器:不带选择器的样式表会连子控件一起套上边框和底色
|
||||
bottom->setStyleSheet(QString("QWidget#WashBottom{background-color:%1;border-top:1px solid %2;}")
|
||||
.arg(C::PANEL, C::BORDER));
|
||||
@@ -166,7 +164,7 @@ WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
connect(m_factory, &QPushButton::clicked, this, &WashPage::onFactory);
|
||||
bottomRoot->addWidget(m_factory, 0, Qt::AlignVCenter);
|
||||
|
||||
// 中:上排三泵数值、下排指示灯,两排都水平居中
|
||||
// 中:上排三泵数值、中排指示灯、下排两路液位低,三排都水平居中
|
||||
QVBoxLayout* midLay = new QVBoxLayout();
|
||||
midLay->setSpacing(6);
|
||||
|
||||
@@ -186,27 +184,36 @@ WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
valueLay->addStretch(1);
|
||||
|
||||
QHBoxLayout* ledLay = new QHBoxLayout();
|
||||
ledLay->setSpacing(10); // 8 个灯 40px 字号后总宽约 1300px
|
||||
ledLay->setSpacing(10);
|
||||
ledLay->addStretch(1);
|
||||
auto makeLed = [&](const QString& text) {
|
||||
// 灯要分两行放,故把目标行当参数传进来
|
||||
auto makeLed = [&](QHBoxLayout* row, const QString& text) {
|
||||
LedIndicator* led = new LedIndicator(text, bottom);
|
||||
led->setTextPixelSize(40); // 字号与卡片标题一致
|
||||
ledLay->addWidget(led);
|
||||
row->addWidget(led);
|
||||
return led;
|
||||
};
|
||||
m_ledRun = makeLed("启停");
|
||||
m_ledPlunger = makeLed("柱塞泵");
|
||||
m_ledAir = makeLed("空压机");
|
||||
m_ledLeaf = makeLed("叶片泵");
|
||||
m_ledLevel = makeLed("液位低");
|
||||
m_ledD1 = makeLed("D1");
|
||||
m_ledD2 = makeLed("D2");
|
||||
m_ledFault = makeLed("系统故障");
|
||||
m_ledRun = makeLed(ledLay, "启停");
|
||||
m_ledPlunger = makeLed(ledLay, "柱塞泵");
|
||||
m_ledAir = makeLed(ledLay, "空压机");
|
||||
m_ledLeaf = makeLed(ledLay, "叶片泵");
|
||||
m_ledD1 = makeLed(ledLay, "D1");
|
||||
m_ledD2 = makeLed(ledLay, "D2");
|
||||
ledLay->addStretch(1);
|
||||
|
||||
// 下一行:液位低拆成 A / B 两路。原来那颗笼统的「液位低」和「系统故障」都撤了——
|
||||
// 后者在洗消卡片的故障行里已经有了,底部再挂一颗是重复的
|
||||
QHBoxLayout* levelLay = new QHBoxLayout();
|
||||
levelLay->setSpacing(40);
|
||||
levelLay->addStretch(1);
|
||||
m_ledLevelA = makeLed(levelLay, "A组分/清水液位低");
|
||||
m_ledLevelB = makeLed(levelLay, "B组分液位低");
|
||||
levelLay->addStretch(1);
|
||||
|
||||
midLay->addStretch(1);
|
||||
midLay->addLayout(valueLay);
|
||||
midLay->addLayout(ledLay);
|
||||
midLay->addLayout(levelLay);
|
||||
midLay->addStretch(1);
|
||||
bottomRoot->addLayout(midLay, 1);
|
||||
|
||||
@@ -219,12 +226,6 @@ WashPage::WashPage(AppContext* ctx, Mode mode, QWidget* parent)
|
||||
|
||||
root->addWidget(bottom);
|
||||
|
||||
// 故障代码轮流循环显示(2s/条)
|
||||
m_faultTimer = new QTimer(this);
|
||||
m_faultTimer->setInterval(2000);
|
||||
connect(m_faultTimer, &QTimer::timeout, this, &WashPage::rotateFaults);
|
||||
m_faultTimer->start();
|
||||
|
||||
connect(ctx->comm(), &CarCommunication::telemetryUpdated, this, &WashPage::refresh);
|
||||
updateGating();
|
||||
refresh();
|
||||
@@ -243,26 +244,30 @@ void WashPage::refreshPumpValues()
|
||||
// 否则旧配置里超范围的历史值会与控件显示、实际上报的数值对不上
|
||||
m_valPlunger->setText(QString("%1 L/min").arg(qBound(0.0, ctx()->getDouble(ctx()->keyPumpFlow(), 20), 24.0), 0, 'f', 1));
|
||||
m_valAir->setText(QString("%1 L/min").arg(qBound(0.0, ctx()->getDouble(ctx()->keyAirFlow(), 100), 340.0), 0, 'f', 1));
|
||||
m_valLeaf->setText(QString("%1 L/min").arg(ctx()->telemetry.flowB, 0, 'f', 1));
|
||||
m_valLeaf->setText(dashIf(ctx()->telemetry.hasWash, QString("%1 L/min").arg(ctx()->telemetry.flowB, 0, 'f', 1)));
|
||||
}
|
||||
|
||||
void WashPage::onStart()
|
||||
{
|
||||
ctx()->comm()->sendWashStart(washModeTag());
|
||||
ctx()->washRunning = true;
|
||||
// 同时把机器强制到机械臂模式(见 AppContext::setWashRunning),否则 Arm_enable=0,
|
||||
// 末端那条俯仰摆动指令车端不会理
|
||||
updateGating();
|
||||
// 启停灯立刻跟着变,不等下一帧遥测——否则车端不回话时按钮看着像没反应
|
||||
updateLeds();
|
||||
}
|
||||
|
||||
void WashPage::onStop()
|
||||
{
|
||||
ctx()->comm()->sendWashStop();
|
||||
ctx()->washRunning = false;
|
||||
ctx()->setWashRunning(false);
|
||||
updateGating();
|
||||
updateLeds();
|
||||
}
|
||||
|
||||
void WashPage::onBack()
|
||||
{
|
||||
if (ctx()->washRunning) {
|
||||
if (ctx()->isWashRunning()) {
|
||||
ConfirmDialog::toast(this, "请先停止");
|
||||
return;
|
||||
}
|
||||
@@ -298,7 +303,7 @@ void WashPage::resetFactory()
|
||||
|
||||
void WashPage::updateGating()
|
||||
{
|
||||
bool running = ctx()->washRunning;
|
||||
bool running = ctx()->isWashRunning();
|
||||
m_start->setEnabled(!running);
|
||||
m_stop->setEnabled(running);
|
||||
m_back->setEnabled(!running);
|
||||
@@ -312,58 +317,56 @@ void WashPage::refresh()
|
||||
else m_banner->clear();
|
||||
|
||||
// 以泵状态同步运行状态
|
||||
if (t.plunger || t.air || t.leaf) ctx()->washRunning = true;
|
||||
else if (t.washMode == "--") ctx()->washRunning = false;
|
||||
if (t.plunger || t.air || t.leaf) ctx()->setWashRunning(true);
|
||||
else if (t.washMode == "--") ctx()->setWashRunning(false);
|
||||
updateGating();
|
||||
|
||||
m_chassisCard->setField(0, QString("%1%").arg(t.soc));
|
||||
m_chassisCard->setField(1, QString("%1V").arg(t.volt, 0, 'f', 0));
|
||||
m_chassisCard->setField(2, t.chassisFaults.isEmpty() ? "无" : t.chassisFaults.join(";"));
|
||||
// 未收到对应报文的数值统一显示 "--"(dashIf)
|
||||
m_chassisCard->setField(0, dashIf(t.hasBattery, QString("%1%").arg(t.soc)));
|
||||
m_chassisCard->setField(1, dashIf(t.hasBattery, QString("%1V").arg(t.volt, 0, 'f', 0)));
|
||||
m_chassisCard->setFaults(t.chassisFaults);
|
||||
m_armCard->setField(0, t.pos);
|
||||
m_armCard->setField(1, t.pose);
|
||||
m_gasCard->setField(0, t.gasHost == "detecting" ? "检测中" : (t.gasHost == "fault" ? "故障" : "待机"));
|
||||
m_gasCard->setField(1, QString("%1 ppb").arg(t.gasConc, 0, 'f', 0));
|
||||
m_gasCard->setField(0, gasHostLabel(t));
|
||||
m_gasCard->setField(1, t.gasType); // 有毒物种类,未收到报文时本身就是 "--"
|
||||
m_gasCard->setField(2, t.gasLevel); // 有毒物等级
|
||||
m_gasCard->setAlarm(0, t.gasHost == "fault");
|
||||
m_gasCard->setFaults(t.detectorFaults);
|
||||
|
||||
m_washCard->setField(m_fMode, t.washMode);
|
||||
m_washCard->setField(m_fLevelA, QString("%1L").arg(t.levelA, 0, 'f', 0));
|
||||
m_washCard->setField(m_fLevelFoam, QString("%1L").arg(t.levelFoam, 0, 'f', 0));
|
||||
m_washCard->setField(m_fFlowA, QString("%1 L/min").arg(t.flowA, 0, 'f', 1));
|
||||
m_washCard->setField(m_fFlowB, QString("%1 L/min").arg(t.flowB, 0, 'f', 1));
|
||||
m_washCard->setField(m_fGasFlow, QString("%1 L/min").arg(t.gasFlow, 0, 'f', 1));
|
||||
m_washCard->setField(m_fPress, QString("%1 MPa").arg(t.press, 0, 'f', 2));
|
||||
m_washCard->setField(m_fAirPress, QString("%1 MPa").arg(t.airPress, 0, 'f', 2));
|
||||
m_washCard->setField(m_fFoam, QString("%1").arg(t.foam, 0, 'f', 1));
|
||||
m_washCard->setField(m_fLevelA, dashIf(t.hasWash, QString("%1L").arg(t.levelA, 0, 'f', 0)));
|
||||
m_washCard->setField(m_fLevelFoam, dashIf(t.hasWash, QString("%1L").arg(t.levelFoam, 0, 'f', 0)));
|
||||
m_washCard->setField(m_fFlowA, dashIf(t.hasWash, QString("%1 L/min").arg(t.flowA, 0, 'f', 1)));
|
||||
m_washCard->setField(m_fFlowB, dashIf(t.hasWash, QString("%1 L/min").arg(t.flowB, 0, 'f', 1)));
|
||||
m_washCard->setField(m_fGasFlow, dashIf(t.hasWash, QString("%1 L/min").arg(t.gasFlow, 0, 'f', 1)));
|
||||
m_washCard->setField(m_fPress, dashIf(t.hasWashPress, QString("%1 MPa").arg(t.press, 0, 'f', 2)));
|
||||
m_washCard->setField(m_fAirPress, dashIf(t.hasWashPress, QString("%1 MPa").arg(t.airPress, 0, 'f', 2)));
|
||||
m_washCard->setField(m_fFoam, dashIf(t.hasWash, QString("%1").arg(t.foam, 0, 'f', 1)));
|
||||
m_washCard->setAlarm(m_fLevelA, t.levelALow);
|
||||
m_washCard->setAlarm(m_fLevelFoam, t.levelBLow);
|
||||
m_washCard->setFaults(washCardFaults(t));
|
||||
|
||||
// 指示灯
|
||||
m_ledRun->setState(ctx()->washRunning ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledPlunger->setState(t.plunger ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledAir->setState(t.air ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledLeaf->setState(t.leaf ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledLevel->setState(t.levelA < 10 ? LedIndicator::RedBlink : LedIndicator::Off);
|
||||
m_ledD1->setState(t.d1open ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledD2->setState(t.d2open ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledFault->setState((!t.washFaults.isEmpty() || !t.pumpFaults.isEmpty())
|
||||
? LedIndicator::RedBlink : LedIndicator::Off);
|
||||
updateLeds();
|
||||
|
||||
// 底部三个泵的数值
|
||||
refreshPumpValues();
|
||||
|
||||
// 故障代码显示(静态更新,循环由 rotateFaults 驱动)
|
||||
rotateFaults();
|
||||
}
|
||||
|
||||
void WashPage::rotateFaults()
|
||||
// 底栏指示灯。单独拆出来是为了让 onStart/onStop 能直接调它:
|
||||
// 遥测还没回来时 refresh() 里的“以泵状态同步运行状态”会把刚置上的 washRunning 又抹掉,
|
||||
// 所以启停的即时反馈不能靠整个 refresh()。
|
||||
void WashPage::updateLeds()
|
||||
{
|
||||
const Telemetry& t = ctx()->telemetry;
|
||||
QStringList all = t.washFaults + t.pumpFaults;
|
||||
if (all.isEmpty()) {
|
||||
m_washCard->setField(m_fAirFault, "");
|
||||
m_washCard->setField(m_fPlungerFault, "");
|
||||
return;
|
||||
}
|
||||
m_faultIndex = m_faultIndex % all.size();
|
||||
QString code = all[m_faultIndex];
|
||||
m_washCard->setField(m_fAirFault, code);
|
||||
m_washCard->setField(m_fPlungerFault, code);
|
||||
m_faultIndex = (m_faultIndex + 1) % all.size();
|
||||
|
||||
m_ledRun->setState(ctx()->isWashRunning() ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledPlunger->setState(t.plunger ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledAir->setState(t.air ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledLeaf->setState(t.leaf ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledD1->setState(t.d1open ? LedIndicator::Green : LedIndicator::Off);
|
||||
m_ledD2->setState(t.d2open ? LedIndicator::Green : LedIndicator::Off);
|
||||
// 液位低拆成 A / B 两路,各用各自的协议位(A_LiquidLevel_Low / B_LiquidLevel_Low);
|
||||
// 不再按 levelA<10 猜阈值,免得卡片液位行红闪、这颗灯却不亮
|
||||
m_ledLevelA->setState(t.levelALow ? LedIndicator::RedBlink : LedIndicator::Off);
|
||||
m_ledLevelB->setState(t.levelBLow ? LedIndicator::RedBlink : LedIndicator::Off);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user