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