From d141d4232ddf0ae9236d71eed5941805cd699dee Mon Sep 17 00:00:00 2001 From: Davide Rosato <73779437+DavideRosato99@users.noreply.github.com> Date: Sat, 8 Jul 2023 08:53:40 +0200 Subject: [PATCH] [RefuelingVisualizer] Made it faster --- .vscode/settings.json | 4 +- .../RefuelingVisualizer.cpp | 669 ++++++------------ .../RefuelingVisualizer/RefuelingVisualizer.h | 155 ++-- 3 files changed, 317 insertions(+), 511 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 966b8195..d1a45355 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -167,7 +167,9 @@ "qtvirtualkeyboard": "cpp", "qabstractbutton": "cpp", "qmetatype": "cpp", - "xlocmon": "cpp" + "xlocmon": "cpp", + "xstring": "cpp", + "xutility": "cpp" }, "editor.defaultFormatter": "ms-vscode.cpptools", "[xml]": { diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp index 6e526e9f..f75cdfd0 100644 --- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp +++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp @@ -27,6 +27,32 @@ RefuelingVisualizer::RefuelingVisualizer(QWidget* parent) : DefaultModule(parent) { + valveLabelStyleOFF = + "border-width: 1px; border-style: solid; border-radius: 1px; " + "border-color: white;"; + valveLabelStyleON = + "border-width: 1px; border-style: solid; border-radius: 1px; " + "border-color: white;"; + HeaderStyle = + "border-width: 1px; border-style: solid; border-color: " + "rgb(100, 100, " + "100); background-color: rgba(51, 153, 255, 7%);" + "border-bottom-style: double; font: bold; " + "border-bottom-left-radius: " + "0px; border-bottom-right-radius: 0px;"; + std_headStyle = + "border-width: 1px; border-style: dashed; border-color: " + "rgb(100, 100, " + "100); border-radius: 0px; border-left-style: solid; " + "border-right-style: solid;"; + lst_headStyle = + "border-width: 1px; border-style: solid; border-color: " + "rgb(100, 100, " + "100); border-radius: 0px; border-top-style: dashed; " + "border-bottom-left-radius: 1px; border-bottom-right-radius: " + "1px;"; + dataStyle = "border-width: 0px;"; + setupUi(); // customContextMenuActionSetup(); @@ -78,501 +104,210 @@ void RefuelingVisualizer::fromXmlObject(const XmlObject& xmlObject) } } -void RefuelingVisualizer::setupUi() +void RefuelingVisualizer::addQLabels() { - outerLayout = new QGridLayout; - outerLayout->setContentsMargins(0, 0, -10, 0); - outerLayout->setSpacing(0); - - // BACKGROUND IMAGE - QLabel* background = new QLabel; - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/RefuelingVisualizer/" - "111.png);border:0px;"); - labelStatus = {1, 1, 1}; - - outerLayout->addWidget(background, 0, 0, 5000, 5000); - - // VALVE LABELS STYLE - QString valveLabelStyleON = - "border-width: 1px; border-style: solid; border-radius: 1px; " - "border-color: white; background-color: rgb(82, 142, 56)"; - - // DATA LABELS STYLE - // Headers - QString HeaderStyle = - "border-width: 1px; border-style: solid; border-color: rgb(100, 100, " - "100); background-color: rgba(51, 153, 255, 7%);" - "border-bottom-style: double; font: bold; border-bottom-left-radius: " - "0px; border-bottom-right-radius: 0px;"; - // Data - QString headerLabelStyle = - "border-width: 1px; border-style: dashed; border-color: rgb(100, 100, " - "100); border-radius: 0px; border-left-style: solid; " - "border-right-style: solid;"; - QString lastHeaderLabelStyle = - "border-width: 1px; border-style: solid; border-color: rgb(100, 100, " - "100); border-radius: 0px; border-top-style: dashed; " - "border-bottom-left-radius: 1px; border-bottom-right-radius: 1px;"; - QString dataStyle = "border-width: 0px;"; - - // TARS STATE - labelTarsTab = new QLabel; - labelTarsTab->setText(RefuelingVisualizerCommandList::commandLabels[0]); - labelTarsTab->setAlignment(Qt::AlignCenter); - labelTarsTab->setContentsMargins(4, 4, 4, 4); - labelTarsTab->setStyleSheet(valveLabelStyleON); - outerLayout->addWidget(labelTarsTab, 5570, 0, 70, 5000); - - // MAIN VALVE - QLabel* labelMain = new QLabel; - labelMain->setText(RefuelingVisualizerCommandList::commandLabels[4]); - labelMain->setAlignment(Qt::AlignCenter); - labelMain->setContentsMargins(4, 4, 4, 4); - labelMain->setStyleSheet(valveLabelStyleON); - outerLayout->addWidget(labelMain, 5640, 0, 70, 5000); - - // VALVES STATES - for (int i = 1; i < 4; i++) + for (int i = 0; i < QLabelsList.count(); i++) { - QLabel* labelValve = new QLabel; - labelValve->setText(RefuelingVisualizerCommandList::commandLabels[i]); - labelValve->setAlignment(Qt::AlignCenter); - labelValve->setContentsMargins(4, 4, 4, 4); - labelValve->setStyleSheet(valveLabelStyleON); - outerLayout->addWidget(labelValve, 5499, (i - 1) * 1666, 70, 1666); - } - - // ---------------------------------------------------------------------- - // TANK DATA VISUALIZER ------------------------------------------------- - // Headers - tankHeaderLabel = new QLabel; - tankHeaderLabel->setText((QString) "TANK"); - tankHeaderLabel->setAlignment(Qt::AlignCenter); - tankHeaderLabel->setContentsMargins(4, 4, 4, 4); - tankHeaderLabel->setStyleSheet(HeaderStyle); - outerLayout->addWidget(tankHeaderLabel, 1180, 1400, 50, 2000); - - loadcellTankLabel = new QLabel; - loadcellTankLabel->setText((QString) "Loadcell:"); - loadcellTankLabel->setAlignment(Qt::AlignLeft); - loadcellTankLabel->setContentsMargins(4, 4, 4, 4); - loadcellTankLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(loadcellTankLabel, 1230, 1400, 40, 2000); - - tankTemperatureLabel = new QLabel; - tankTemperatureLabel->setText((QString) "Temperature:"); - tankTemperatureLabel->setAlignment(Qt::AlignLeft); - tankTemperatureLabel->setContentsMargins(4, 4, 4, 4); - tankTemperatureLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(tankTemperatureLabel, 1270, 1400, 40, 2000); - - topTankPressureLabel = new QLabel; - topTankPressureLabel->setText((QString) "TOP Pressure:"); - topTankPressureLabel->setAlignment(Qt::AlignLeft); - topTankPressureLabel->setContentsMargins(4, 4, 4, 4); - topTankPressureLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(topTankPressureLabel, 1310, 1400, 40, 2000); - - bottomTankPressureLabel = new QLabel; - bottomTankPressureLabel->setText((QString) "BOTTOM Pressure:"); - bottomTankPressureLabel->setAlignment(Qt::AlignLeft); - bottomTankPressureLabel->setContentsMargins(4, 4, 4, 4); - bottomTankPressureLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(bottomTankPressureLabel, 1350, 1400, 40, 2000); - - floatingLevelLabel = new QLabel; - floatingLevelLabel->setText((QString) "Floating level:"); - floatingLevelLabel->setAlignment(Qt::AlignLeft); - floatingLevelLabel->setContentsMargins(4, 4, 4, 4); - floatingLevelLabel->setStyleSheet(lastHeaderLabelStyle); - outerLayout->addWidget(floatingLevelLabel, 1390, 1400, 40, 2000); - - // Data - loadcellTankDataLabel = new QLabel; - loadcellTankDataLabel->setText((QString) "0.000 KG"); - loadcellTankDataLabel->setAlignment(Qt::AlignRight); - loadcellTankDataLabel->setContentsMargins(4, 4, 4, 4); - loadcellTankDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(loadcellTankDataLabel, 1233, 2350, 34, 1047); - - tankTemperatureDataLabel = new QLabel; - tankTemperatureDataLabel->setText((QString) "0.000 °C"); - tankTemperatureDataLabel->setAlignment(Qt::AlignRight); - tankTemperatureDataLabel->setContentsMargins(4, 4, 4, 4); - tankTemperatureDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(tankTemperatureDataLabel, 1273, 2350, 34, 1047); - - topTankPressureDataLabel = new QLabel; - topTankPressureDataLabel->setText((QString) "0.000 bar"); - topTankPressureDataLabel->setAlignment(Qt::AlignRight); - topTankPressureDataLabel->setContentsMargins(4, 4, 4, 4); - topTankPressureDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(topTankPressureDataLabel, 1313, 2350, 34, 1047); - - bottomTankPressureDataLabel = new QLabel; - bottomTankPressureDataLabel->setText((QString) "0.000 bar"); - bottomTankPressureDataLabel->setAlignment(Qt::AlignRight); - bottomTankPressureDataLabel->setContentsMargins(4, 4, 4, 4); - bottomTankPressureDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(bottomTankPressureDataLabel, 1353, 2350, 34, 1047); - - floatingLevelDataLabel = new QLabel; - floatingLevelDataLabel->setText((QString) "NOT REACHED"); - floatingLevelDataLabel->setAlignment(Qt::AlignRight); - floatingLevelDataLabel->setContentsMargins(4, 4, 4, 4); - floatingLevelDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(floatingLevelDataLabel, 1393, 2350, 34, 1047); - - // ---------------------------------------------------------------------- - // VESSEL DATA VISUALIZER ----------------------------------------------- - // Headers - vesselHeaderLabel = new QLabel; - vesselHeaderLabel->setText((QString) "VESSEL"); - vesselHeaderLabel->setAlignment(Qt::AlignCenter); - vesselHeaderLabel->setContentsMargins(4, 4, 4, 4); - vesselHeaderLabel->setStyleSheet(HeaderStyle); - outerLayout->addWidget(vesselHeaderLabel, 500, 2300, 50, 2000); - - loadcellVesselLabel = new QLabel; - loadcellVesselLabel->setText((QString) "Loadcell:"); - loadcellVesselLabel->setAlignment(Qt::AlignLeft); - loadcellVesselLabel->setContentsMargins(4, 4, 4, 4); - loadcellVesselLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(loadcellVesselLabel, 550, 2300, 40, 2000); - - vesselPressureLabel = new QLabel; - vesselPressureLabel->setText((QString) "Pressure:"); - vesselPressureLabel->setAlignment(Qt::AlignLeft); - vesselPressureLabel->setContentsMargins(4, 4, 4, 4); - vesselPressureLabel->setStyleSheet(lastHeaderLabelStyle); - outerLayout->addWidget(vesselPressureLabel, 590, 2300, 40, 2000); - - // Data - loadcellVesselDataLabel = new QLabel; - loadcellVesselDataLabel->setText((QString) "0.000 KG"); - loadcellVesselDataLabel->setAlignment(Qt::AlignRight); - loadcellVesselDataLabel->setContentsMargins(4, 4, 4, 4); - loadcellVesselDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(loadcellVesselDataLabel, 553, 3240, 34, 1047); - - vesselPressureDataLabel = new QLabel; - vesselPressureDataLabel->setText((QString) "0.000 bar"); - vesselPressureDataLabel->setAlignment(Qt::AlignRight); - vesselPressureDataLabel->setContentsMargins(4, 4, 4, 4); - vesselPressureDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(vesselPressureDataLabel, 593, 3240, 34, 1047); - - // ---------------------------------------------------------------------- - // CART DATA VISUALIZER ------------------------------------------------- - // Headers - cartHeaderLabel = new QLabel; - cartHeaderLabel->setText((QString) "CART"); - cartHeaderLabel->setAlignment(Qt::AlignCenter); - cartHeaderLabel->setContentsMargins(4, 4, 4, 4); - cartHeaderLabel->setStyleSheet(HeaderStyle); - outerLayout->addWidget(cartHeaderLabel, 2500, 2000, 50, 2000); - - cartTimestampLabel = new QLabel; - cartTimestampLabel->setText((QString) "Timestamp:"); - cartTimestampLabel->setAlignment(Qt::AlignLeft); - cartTimestampLabel->setContentsMargins(4, 4, 4, 4); - cartTimestampLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(cartTimestampLabel, 2550, 2000, 40, 2000); - - cartFillingPressureLabel = new QLabel; - cartFillingPressureLabel->setText((QString) "Filling Pressure:"); - cartFillingPressureLabel->setAlignment(Qt::AlignLeft); - cartFillingPressureLabel->setContentsMargins(4, 4, 4, 4); - cartFillingPressureLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(cartFillingPressureLabel, 2590, 2000, 40, 2000); - - cartBatteryLabel = new QLabel; - cartBatteryLabel->setText((QString) "Battery:"); - cartBatteryLabel->setAlignment(Qt::AlignLeft); - cartBatteryLabel->setContentsMargins(4, 4, 4, 4); - cartBatteryLabel->setStyleSheet(headerLabelStyle); - outerLayout->addWidget(cartBatteryLabel, 2630, 2000, 40, 2000); - - cartCurrentLabel = new QLabel; - cartCurrentLabel->setText((QString) "Current:"); - cartCurrentLabel->setAlignment(Qt::AlignLeft); - cartCurrentLabel->setContentsMargins(4, 4, 4, 4); - cartCurrentLabel->setStyleSheet(lastHeaderLabelStyle); - outerLayout->addWidget(cartCurrentLabel, 2670, 2000, 40, 2000); - - // Data - cartTimestampDataLabel = new QLabel; - cartTimestampDataLabel->setText((QString) "0.000 s"); - cartTimestampDataLabel->setAlignment(Qt::AlignRight); - cartTimestampDataLabel->setContentsMargins(4, 4, 4, 4); - cartTimestampDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(cartTimestampDataLabel, 2550, 2940, 34, 1047); - - cartFillingPressureDataLabel = new QLabel; - cartFillingPressureDataLabel->setText((QString) "0.000 bar"); - cartFillingPressureDataLabel->setAlignment(Qt::AlignRight); - cartFillingPressureDataLabel->setContentsMargins(4, 4, 4, 4); - cartFillingPressureDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(cartFillingPressureDataLabel, 2590, 2940, 34, 1047); - - cartBatteryDataLabel = new QLabel; - cartBatteryDataLabel->setText((QString) "0.000 V"); - cartBatteryDataLabel->setAlignment(Qt::AlignRight); - cartBatteryDataLabel->setContentsMargins(4, 4, 4, 4); - cartBatteryDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(cartBatteryDataLabel, 2630, 2940, 34, 1047); - - cartCurrentDataLabel = new QLabel; - cartCurrentDataLabel->setText((QString) "0.000 A"); - cartCurrentDataLabel->setAlignment(Qt::AlignRight); - cartCurrentDataLabel->setContentsMargins(4, 4, 4, 4); - cartCurrentDataLabel->setStyleSheet(dataStyle); - outerLayout->addWidget(cartCurrentDataLabel, 2670, 2940, 34, 1047); + QString type = QLabelsList[i].info.type; + // Valve's tabs + if (type == "valve") + { + QLabel* Label = new QLabel; + Label->setStyleSheet( + "border-width: 1px; border-style: solid; border-radius: 1px; " + "border-color: white; background-color: transparent; color: " + "black"); + Label->setAlignment(Qt::AlignCenter); + Label->setText(QLabelsList[i].info.name); + QLabelsList[i].Label = Label; + outerLayout->addWidget( + Label, QLabelsList[i].info.y0, QLabelsList[i].info.x0, + QLabelsList[i].info.dy, QLabelsList[i].info.dx); + } + // Headers + else if (type == "header") + { + QLabel* Label = new QLabel; + Label->setStyleSheet(HeaderStyle); + Label->setAlignment(Qt::AlignCenter); + Label->setText(QLabelsList[i].info.name); + QLabelsList[i].Label = Label; + outerLayout->addWidget( + Label, QLabelsList[i].info.y0, QLabelsList[i].info.x0, + QLabelsList[i].info.dy, QLabelsList[i].info.dx); + } + // Standard heads + else if (type == "std_head") + { + QLabel* Label = new QLabel; + Label->setStyleSheet(std_headStyle); + Label->setAlignment(Qt::AlignLeft); + Label->setText(QLabelsList[i].info.name); + QLabelsList[i].Label = Label; + outerLayout->addWidget( + Label, QLabelsList[i].info.y0, QLabelsList[i].info.x0, + QLabelsList[i].info.dy, QLabelsList[i].info.dx); + } + // Last heads + else if (type == "lst_head") + { + QLabel* Label = new QLabel; + Label->setStyleSheet(lst_headStyle); + Label->setAlignment(Qt::AlignLeft); + Label->setText(QLabelsList[i].info.name); + QLabelsList[i].Label = Label; + outerLayout->addWidget( + Label, QLabelsList[i].info.y0, QLabelsList[i].info.x0, + QLabelsList[i].info.dy, QLabelsList[i].info.dx); + } + // Data + else + { + QLineEdit* Label = new QLineEdit; + Label->setStyleSheet(dataStyle); + Label->setAlignment(Qt::AlignRight); + Label->setText(QLabelsList[i].info.name); + QLabelsList[i].Text = Label; + outerLayout->addWidget( + Label, QLabelsList[i].info.y0, QLabelsList[i].info.x0, + QLabelsList[i].info.dy, QLabelsList[i].info.dx); + } + } setLayout(outerLayout); } -void RefuelingVisualizer::backgroundTabs(Message msg) +void RefuelingVisualizer::setupUi() { - uint64_t releaseValve = - msg.getField("release_valve_state").getUnsignedInteger(); - uint64_t fillingValve = - msg.getField("filling_valve_state").getUnsignedInteger(); - uint64_t ventingValve = - msg.getField("venting_valve_state").getUnsignedInteger(); - uint64_t tarsState = msg.getField("tars_state").getUnsignedInteger(); - - auto background = outerLayout->itemAt(0)->widget(); - auto labelFillingValve = outerLayout->itemAt(3)->widget(); - auto labelReleaseValve = outerLayout->itemAt(4)->widget(); - auto labelVentingValve = outerLayout->itemAt(5)->widget(); - - // VALVE STATE LABELS STYLE - QString valveLabelStyleON = - "border-width: 1px; border-style: solid; border-radius: 1px; " - "border-color: white; background-color: rgb(82, 142, 56);"; - QString valveLabelStyleOFF = - "border-width: 1px; border-style: solid; border-radius: 1px; " - "border-color: white; background-color: rgb(255, 0, 0)"; - QString valveLabelStyleREADY = - "border-width: 1px; border-style: solid; border-radius: 1px; " - "border-color: white; background-color: rgb(204, 102, 0)"; - - // TARS TAB - if (tarsState == 0) - { - labelTarsTab->setStyleSheet(valveLabelStyleOFF); - labelTarsTab->setText(RefuelingVisualizerCommandList::commandLabels[0] + - ": UNINITIALIZED"); - } - else if (tarsState == 1) - { - labelTarsTab->setStyleSheet(valveLabelStyleOFF); - labelTarsTab->setText(RefuelingVisualizerCommandList::commandLabels[0] + - ": IDLE"); - } - else if (tarsState == 2) - { - labelTarsTab->setStyleSheet(valveLabelStyleREADY); - labelTarsTab->setText(RefuelingVisualizerCommandList::commandLabels[0] + - ": READY"); - } - else if (tarsState == 3) - { - labelTarsTab->setStyleSheet(valveLabelStyleON); - labelTarsTab->setText(RefuelingVisualizerCommandList::commandLabels[0] + - ": WASHING"); - } - else if (tarsState == 4) - { - labelTarsTab->setStyleSheet(valveLabelStyleON); - labelTarsTab->setText(RefuelingVisualizerCommandList::commandLabels[0] + - ": REFUELING"); - } - - // VALVES TABS - if (fillingValve != labelStatus[0]) - { - labelFillingValve->setStyleSheet(valveLabelStyleOFF); - } - if (releaseValve != labelStatus[1]) - { - labelReleaseValve->setStyleSheet(valveLabelStyleOFF); - } - if (ventingValve != labelStatus[2]) - { - labelVentingValve->setStyleSheet(valveLabelStyleOFF); - } - - // char actualValveVec = fillingValve.toString() + (char)releaseValve + - // (char)ventingValve; - QString actualValveVec = QString::number(fillingValve) + - QString::number(releaseValve) + - QString::number(ventingValve); - - if (fillingValve != labelStatus[0] || releaseValve != labelStatus[1] || - ventingValve != labelStatus[2]) - { - QString newStyle = - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" + - actualValveVec + ".png);border:0px;"; - background->setStyleSheet(newStyle); - } - - if (fillingValve != labelStatus[0]) - { - labelStatus[0] = (uint64_t)fillingValve; - } - if (releaseValve != labelStatus[1]) - { - labelStatus[1] = (uint64_t)releaseValve; - } - if (ventingValve != labelStatus[2]) - { - labelStatus[2] = (uint64_t)ventingValve; - } - - /* // BACKGROUND + // SET OUTER LAYOUT + outerLayout = new QGridLayout; + outerLayout->setContentsMargins(0, 0, 0, 0); + outerLayout->setSpacing(0); - if (fillingValve == 0 && releaseValve == 0 && ventingValve == 0) - { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "000.png);border:0px;"); - } + // DEFAULT BACKGROUND IMAGE + background = new QLabel; + background->setStyleSheet("background-color: transparent;"); + background->setGeometry(0, 0, 700, 910); + outerLayout->addWidget(background, 0, 0, 5000, 5000); + backgroundPreSet(); - if (fillingValve == 0 && releaseValve == 0 && ventingValve == 1) - { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "001.png);border:0px;"); - } + background->setAutoFillBackground(true); + background->setPalette(backgroundList[0]); + background->update(); - if (fillingValve == 0 && releaseValve == 1 && ventingValve == 0) - { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "010.png);border:0px;"); - } + // CREATE QLABELS + addQLabels(); +} - if (fillingValve == 0 && releaseValve == 1 && ventingValve == 1) +void RefuelingVisualizer::backgroundPreSet() +{ + QPalette newPal; + for (int i = 0; i < 8; i++) { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "011.png);border:0px;"); + pixmapList.append( + QPixmap("../skywardhub/src/shared/Modules/RefuelingVisualizer/" + + backgroundNames[i] + ".png")); + pixmapList[i] = + pixmapList[i].scaled(background->size(), Qt::IgnoreAspectRatio); + + /* pixmapList[i] = pixmapList[i].scaledToHeight(background->height(), + Qt::FastTransformation); */ + backgroundList.append(newPal); + backgroundList[i].setBrush(QPalette::Window, pixmapList[i]); } +} - if (fillingValve == 1 && releaseValve == 0 && ventingValve == 0) - { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "100.png);border:0px;"); - } +void RefuelingVisualizer::changeValves(int i, uint64_t status) +{ + auto widget = QLabelsList[i].Label; + QLabelsList[i].status = status; - if (fillingValve == 1 && releaseValve == 0 && ventingValve == 1) + // change valve's tab + widget->setAutoFillBackground(true); + QPalette pal = widget->palette(); + if (status == 0) { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "101.png);border:0px;"); + pal.setColor(QPalette::Window, Qt::red); + pal.setColor(QPalette::WindowText, Qt::black); + pal.setColor(QPalette::Text, Qt::black); } - - if (fillingValve == 1 && releaseValve == 1 && ventingValve == 0) + else { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "110.png);border:0px;"); + pal.setColor(QPalette::Window, Qt::green); + pal.setColor(QPalette::WindowText, Qt::black); + pal.setColor(QPalette::Text, Qt::black); } + widget->setPalette(pal); + widget->update(); + + // Background + background->setAutoFillBackground(true); + int index = backgroundNames.indexOf(QString::number(QLabelsList[0].status) + + QString::number(QLabelsList[1].status) + + QString::number(QLabelsList[2].status)); + background->setPalette(backgroundList[index]); + background->update(); +} - if (fillingValve == 1 && releaseValve == 1 && ventingValve == 1) - { - background->setStyleSheet( - "border-image:url(../skywardhub/src/shared/Modules/" - "RefuelingVisualizer/" - "111.png);border:0px;"); - } */ +void RefuelingVisualizer::changeData(int i, const Message& msg) +{ + auto widget = QLabelsList[i].Text; + float value = msg.getField(QLabelsList[i].msg.message).getDouble(); + widget->setText(QString::number(value, 'f', 3) + QLabelsList[i].info.name); } void RefuelingVisualizer::onMsgReceivedGSE(const Message& msg) { - // Change background and tabs - backgroundTabs(msg); - - // RETRIEVE DATA - // Vessel - float vesselLoadcell = msg.getField("loadcell_vessel").getDouble(); - float vesselPressure = msg.getField("vessel_pressure").getDouble(); - // Tank - float tankLoadcell = msg.getField("loadcell_tank").getDouble(); - // Cart - uint64_t timestamp = msg.getField("timestamp").getUnsignedInteger(); - float fillingPressure = msg.getField("filling_pressure").getDouble(); - float batteryVoltage = msg.getField("battery_voltage").getDouble(); - float currentConsumption = msg.getField("current_consumption").getDouble(); - - // CHANGE LABELS - // Vessel - loadcellVesselDataLabel->setText(QString::number(vesselLoadcell, 'f', 3) + - " KG"); - vesselPressureDataLabel->setText(QString::number(vesselPressure, 'f', 3) + - " bar"); - // Tank - loadcellTankDataLabel->setText(QString::number(tankLoadcell, 'f', 3) + - " KG"); - // Cart - cartTimestampDataLabel->setText(QString::number(timestamp / 1000, 'f', 3) + - " s"); - cartFillingPressureDataLabel->setText( - QString::number(fillingPressure, 'f', 3) + " bar"); - cartBatteryDataLabel->setText(QString::number(batteryVoltage, 'f', 3) + - " V"); - cartCurrentDataLabel->setText(QString::number(currentConsumption, 'f', 3) + - " A"); + // Loop over the whole QLabels list + for (int i = 0; i < QLabelsList.count(); i++) + { + // Check if the needed message comes from GSE_TM + if (QLabelsList[i].msg.topic == "GSE") + { + // DISTINGUISH BETWEEN VALVES AND DATA + // Valves + if (QLabelsList[i].info.type == "valve") + { + uint64_t test = msg.getField(QLabelsList[i].msg.message) + .getUnsignedInteger(); + if (test != QLabelsList[i].status) + { + changeValves(i, test); + } + } + // Data + else + { + changeData(i, msg); + } + } + } } void RefuelingVisualizer::onMsgReceivedMOT(const Message& msg) { - - // RETRIEVE DATA - // Tank - float tankTemperature = msg.getField("tank_temperature").getDouble(); - float tankTOPpressure = msg.getField("top_tank_pressure").getDouble(); - float tankBOTpressure = msg.getField("bottom_tank_pressure").getDouble(); - uint64_t mainValve = msg.getField("main_valve_state").getUnsignedInteger(); - - // VALVE STATE LABELS STYLE - QString valveLabelStyleON = - "border-width: 1px; border-style: solid; border-radius: 1px; " - "border-color: white; background-color: rgb(82, 142, 56);"; - QString valveLabelStyleOFF = - "border-width: 1px; border-style: solid; border-radius: 1px; " - "border-color: white; background-color: rgb(255, 0, 0)"; - - // CHANGE MAIN VALVE TAB - auto labelMainValve = outerLayout->itemAt(2)->widget(); - if (mainValve == 1) - { - labelMainValve->setStyleSheet(valveLabelStyleON); - } - else + // Loop over the whole QLabels list + for (int i = 0; i < QLabelsList.count(); i++) { - labelMainValve->setStyleSheet(valveLabelStyleOFF); + // Check if the needed message comes from GSE_TM + if (QLabelsList[i].msg.topic == "MOT") + { + // DISTINGUISH BETWEEN VALVES AND DATA + // Valves + if (QLabelsList[i].info.type == "valve") + { + uint64_t test = msg.getField(QLabelsList[i].msg.message) + .getUnsignedInteger(); + if (test != QLabelsList[i].status) + { + changeValves(i, test); + } + } + // Data + else + { + changeData(i, msg); + } + } } - - // CHANGE LABELS - // Tank - tankTemperatureDataLabel->setText(QString::number(tankTemperature, 'f', 3) + - " °C"); - topTankPressureDataLabel->setText(QString::number(tankTOPpressure, 'f', 3) + - " bar"); - bottomTankPressureDataLabel->setText( - QString::number(tankBOTpressure, 'f', 3) + " bar"); } diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h index 2a1f3fae..42361467 100644 --- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h +++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h @@ -23,10 +23,9 @@ #include <Modules/DefaultModule/DefaultModule.h> #include <QLabel> +#include <QMap> #include <QWidget> -#include "RefuelingVisualizerCommandList.h" - class RefuelingVisualizer : public DefaultModule { Q_OBJECT @@ -42,48 +41,118 @@ public: private: void setupUi(); - // void addCustomActionsToMenu() override; - // void onConfigureClicked(); - // void setFilter(const Filter& filter); + + QGridLayout* outerLayout; + QList<uint64_t> valveStatus; + QString valveLabelStyleOFF; + QString valveLabelStyleON; + void onMsgReceivedGSE(const Message& msg); void onMsgReceivedMOT(const Message& msg); - void backgroundTabs(Message msg); + void changeValves(int i, uint64_t status); + void addQLabels(); + void changeData(int i, const Message& msg); + void backgroundPreSet(); + /* void onMsgReceivedMOT(const Message& msg); */ - QGridLayout* outerLayout; - QLabel* labelTarsTab; - QList<uint64_t> labelStatus; - - // TANK VISUALIZER LABELS - QLabel* tankHeaderLabel; - QLabel* topTankPressureLabel; - QLabel* bottomTankPressureLabel; - QLabel* loadcellTankLabel; - QLabel* floatingLevelLabel; - QLabel* tankTemperatureLabel; - QLabel* topTankPressureDataLabel; - QLabel* bottomTankPressureDataLabel; - QLabel* loadcellTankDataLabel; - QLabel* floatingLevelDataLabel; - QLabel* tankTemperatureDataLabel; - - // VESSEL VISUALIZER LABELS - QLabel* vesselHeaderLabel; - QLabel* loadcellVesselLabel; - QLabel* vesselPressureLabel; - QLabel* loadcellVesselDataLabel; - QLabel* vesselPressureDataLabel; - - // CART VISUALIZER LABELS - QLabel* cartHeaderLabel; - QLabel* cartTimestampLabel; - QLabel* cartFillingPressureLabel; - QLabel* cartBatteryLabel; - QLabel* cartCurrentLabel; - QLabel* cartTimestampDataLabel; - QLabel* cartFillingPressureDataLabel; - QLabel* cartBatteryDataLabel; - QLabel* cartCurrentDataLabel; - - Filter filter; - RefuelingVisualizerCommandList::Valve currentState; + struct LabelInfo{ + int index; + int y0; + int x0; + int dy; + int dx; + QString name; + QString type; + QString style; + }; + + struct msgType{ + QString message; + QString topic; + }; + + struct data{ + QLabel* Label; + QLineEdit* Text; + LabelInfo info; + msgType msg; + float value; + uint64_t status; + }; + + QLabel* newLabel; + QLineEdit* newLineEdit; + QList<data> QLabelsList{ + {newLabel, newLineEdit, {1, 5499, 0, 70, 2750, "FILLING", "valve", "center"}, {"filling_valve_state", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {2, 5499, 2750, 70, 1100, "RELEASE", "valve", "center"}, {"release_valve_state", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {3, 5499, 3850, 70, 1150, "VENTING", "valve", "center"}, {"venting_valve_state", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {4, 5570, 0, 70, 5000, "TARS STATE", "valve", "center"}, {"tars_state", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {5, 5640, 0, 70, 5000, "MAIN", "valve", "center"}, {"main_valve_state", "MOT"}, 0, 0}, + {newLabel, newLineEdit, {6, 500, 3200, 50, 1300, "VESSEL", "header", "center"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {7, 1180, 2200, 50, 1300, "TANK", "header", "center"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {8, 2590, 2940, 50, 1300, "CART", "header", "center"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {9, 550, 3200, 40, 1300, "Loadcell:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {10, 590, 3200, 40, 1300, "Pressure:", "lst_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {11, 1230, 2200, 40, 1300, "Loadcell:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {12, 1270, 2200, 40, 1300, "Temperature:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {13, 1310, 2200, 40, 1300, "TOP Pressure:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {14, 1350, 2200, 40, 1300, "BOTTOM Pressure:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {15, 1390, 2200, 40, 1300, "Floating level:", "lst_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {16, 2640, 2940, 40, 1300, "Timestamp:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {17, 2680, 2940, 40, 1300, "Filling Pressure:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {18, 2720, 2940, 40, 1300, "Battery:", "std_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {19, 2760, 2940, 40, 1300, "Current:", "lst_head", "left"}, {"", ""}, 0, 0}, + {newLabel, newLineEdit, {20, 553, 4000, 34, 480, " KG", "std_data", "right"}, {"loadcell_vessel", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {21, 593, 4000, 34, 480, " bar", "lst_data", "right"}, {"vessel_pressure", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {22, 1233, 3000, 34, 480, " KG", "std_data", "right"}, {"loadcell_tank", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {23, 1273, 3000, 34, 480, " °C", "std_data", "right"}, {"tank_temperature", "MOT"}, 0, 0}, + {newLabel, newLineEdit, {24, 1313, 3000, 34, 480, " bar", "std_data", "right"}, {"top_tank_pressure", "MOT"}, 0, 0}, + {newLabel, newLineEdit, {25, 1353, 3000, 34, 480, " bar", "std_data", "right"}, {"bottom_tank_pressure", "MOT"}, 0, 0}, + {newLabel, newLineEdit, {26, 1393, 3000, 34, 480, "NOT REACHED", "lst_data", "right"}, {"", "MOT"}, 0, 0}, + {newLabel, newLineEdit, {27, 2640, 3740, 34, 480, " s", "std_data", "right"}, {"timestamp", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {28, 2680, 3740, 34, 480, " bar", "std_data", "right"}, {"filling_pressure", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {29, 2720, 3740, 34, 480, " V", "std_data", "right"}, {"battery_voltage", "GSE"}, 0, 0}, + {newLabel, newLineEdit, {30, 2760, 3740, 34, 480, " A", "lst_data", "right"}, {"current_consumption", "GSE"}, 0, 0}, + }; + + QLabel* background; + QList<QPalette> backgroundList; + QList<QPixmap> pixmapList; + QList<QString> backgroundNames{ + "000", "001", "010", "011", "100", "101", "110", "111", + }; + + QString HeaderStyle; + QString std_headStyle; + QString lst_headStyle; + QString dataStyle; + + + + /* const QMap<QString, QMap<QString, QMap<QString, QList<QString>>>> commandMap{ + {"GSE", {{"valves", {{"FILLING_VALVE", {"FILLING", "filling_valve_state"}}, + {"RELEASE_VALVE", {"RELEASE", "release_valve_state"}}, + {"VENTING_VALVE", {"VENTING", "venting_valve_state"}}, + {"TARS_STATE", {"TARS STATE", "tars_state"}}}}, + {"tank_data", {{"LOADCELL", {"Loadcell", "loadcell_tank"}}}}, + {"vessel_data", {{"LOADCELL", {"Loadcell", "loadcell_vessel"}}, + {"PRESSURE", {"Pressure", "vessel_pressure"}}}}, + {"cart_data", {{"TIME", {"Timestamp", "timestamp"}}, + {"FILLING_PRESSURE", {"Filling Pressure", "filling_pressure"}}, + {"BATTERY", {"Battery", "battery_voltage"}}, + {"CURRENT", {"Current", "current_consumption"}}}}}}, + + {"MOT", {{"valves", {{"MAIN_VALVE", {"MAIN", "main_valve_state"}}}}, + {"tank_data", {{"TEMPERATURE", {"Temperature", "tank_temperature"}}, + {"TOP_PRES", {"TOP Pressure", "top_tank_pressure"}}, + {"BOT_PRES", {"BOTTOM Pres", "bottom_tank_pressure"}}}}}}, + }; */ + + /* const QMap<QString, data> labelMap{ + {"FILLING", {5499, 0, 70, 1666, "valves", "center", "filling_valve_state", "GSE"}}, + {"RELEASE", {5499, 1666, 70, 1666, "valves", "center", "release_valve_state", "GSE"}}, + {"VENTING", {5499, 3332, 70, 1666, "valves", "center", "venting_valve_state", "GSE"}}, + {"TARS STATE", {5570, 0, 70, 5000, "valves", "center", "tars_state", "GSE"}}, + {"MAIN", {5640, 0, 70, 5000, "valves", "center", "main_valve_state", "MOT"}}, + }; */ }; -- GitLab