diff --git a/SkywardHub.pro b/SkywardHub.pro index bdbd651b3d965b1785949f1ee0d5e47afbc178e1..4ac360988926cc0f458ab24622966b477dced6e2 100644 --- a/SkywardHub.pro +++ b/SkywardHub.pro @@ -150,7 +150,6 @@ FORMS += \ src/shared/Modules/MainWindow/Window.ui \ src/shared/Components/ModulesPicker/ModulesPicker.ui \ src/shared/Components/SaveConfigurationDialog/SaveConfigurationDialog.ui \ - src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui \ # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp index 36f2c8eed5d9d88b99f59d7b5228171b5f27a6d5..8c47e7c1b74becf6729544bfb80188aefc4a1f32 100644 --- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp +++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.cpp @@ -18,41 +18,168 @@ #include "RefuelingVisualizer.h" -#include <Core/ModulesManager/ModulesManager.h> +#include <Components/FilterSelector/FilterSelector.h> +#include <Core/MessageBroker/MessageBroker.h> -#include <QAction> -#include <QMessageBox> -#include <QPoint> - -#include "Components/ContextMenuSeparator/ContextMenuSeparator.h" -#include "ui_RefuelingVisualizer.h" - -RefuelingVisualizer::RefuelingVisualizer() - : DefaultModule(), ui(new Ui::RefuelingVisualizer) +RefuelingVisualizer::RefuelingVisualizer(QWidget* parent) + : DefaultModule(parent) { - ui->setupUi(this); + setupUi(); defaultContextMenuSetup(); - connectUiSlots(); } -RefuelingVisualizer::~RefuelingVisualizer() { delete ui; } - -void RefuelingVisualizer::connectUiSlots() +RefuelingVisualizer::~RefuelingVisualizer() { - connect(ui->selectPanel_button, &QPushButton::clicked, this, - &RefuelingVisualizer::onSelectPanelClick); + getCore()->getMessageBroker()->unsubscribe(filter, this); } -void RefuelingVisualizer::onSelectPanelClick() { onReplaceClicked(); } - QWidget* RefuelingVisualizer::toWidget() { return this; } XmlObject RefuelingVisualizer::toXmlObject() { - return XmlObject(getName(ModuleId::EMPTY)); + XmlObject obj(getName(ModuleId::REFUELING_VISUALIZER)); + + obj.addAttribute("filter", filter.toString()); + + return obj; } void RefuelingVisualizer::fromXmlObject(const XmlObject& xmlObject) { - Q_UNUSED(xmlObject); + if (xmlObject.getObjectName() == getName(ModuleId::REFUELING_VISUALIZER)) + { + auto filter = Filter::fromString(xmlObject.getAttribute("filter")); + setFilter(filter); + } +} + +void RefuelingVisualizer::setupUi() +{ + outerLayout = new QHBoxLayout; + outerLayout->setContentsMargins(0, 0, 0, 0); + outerLayout->setSpacing(0); + + for (auto labelText : RefuelingVisualizerCommandList::commandLabels) + { + QLabel* label = new QLabel; + label->setText(labelText); + label->setAlignment(Qt::AlignCenter); + label->setContentsMargins(4, 4, 4, 4); + outerLayout->addWidget(label); + } + + setLayout(outerLayout); +} + +void RefuelingVisualizer::addCustomActionsToMenu() +{ + QAction* action = new QAction("Choose topic and field"); + connect(action, &QAction::triggered, this, + &RefuelingVisualizer::onConfigureClicked); + + addActionToMenu(action); +} + +void RefuelingVisualizer::onConfigureClicked() +{ + FilterSelector::selectFilter( + filter, [this](const Filter& newFilter) { setFilter(newFilter); }); +} + +void RefuelingVisualizer::setFilter(const Filter& newFilter) +{ + getCore()->getMessageBroker()->unsubscribe(filter, this); + getCore()->getMessageBroker()->subscribe( + newFilter, this, + [this](const Message& message, const Filter& filter) + { onMsgReceived(message); }); + filter = newFilter; +} + +void RefuelingVisualizer::onMsgReceived(const Message& msg) +{ + uint64_t release = msg.getField("release_vlave_state").getUnsignedInteger(); + uint64_t filling = msg.getField("filling_valve_state").getUnsignedInteger(); + uint64_t venting = msg.getField("venting_valve_state").getUnsignedInteger(); + + QString baseStyle = + "border-bottom-width:1px;border-left-width:1px;border-top-width:" + "1px;border-radius:0;"; + QString completedStyle = "background-color:green;" + baseStyle; + QString errorStyle = "background-color:red;" + baseStyle; + + if (release == 1) + { + auto label = outerLayout->itemAt(1)->widget(); + label->setStyleSheet(completedStyle); + } + else + { + auto label = outerLayout->itemAt(1)->widget(); + label->setStyleSheet(errorStyle); + } + + if (filling == 1) + { + auto label = outerLayout->itemAt(0)->widget(); + label->setStyleSheet(completedStyle); + } + else + { + auto label = outerLayout->itemAt(0)->widget(); + label->setStyleSheet(errorStyle); + } + + if (venting == 1) + { + auto label = outerLayout->itemAt(2)->widget(); + label->setStyleSheet(completedStyle); + } + else + { + auto label = outerLayout->itemAt(2)->widget(); + label->setStyleSheet(errorStyle); + } + + // StatesList::State state = + // static_cast<StatesList::State>(field.getUnsignedInteger()); + + // if (state == StatesList::State::INVALID) + // return; + + // if (state != currentState) + // { + // currentState = static_cast<StatesList::State>(state); + + // QString baseStyle = + // "border-bottom-width:1px;border-left-width:1px;border-top-width:" + // "1px;border-radius:0;"; + // QString currentStateStyle = + // "background-color:yellow; color:black;" + baseStyle; + // QString completedStyle = "background-color:green;" + baseStyle; + // QString errorStyle = "background-color:red;" + baseStyle; + + // int index = StatesList::statesIndexes[currentState]; + // auto label = outerLayout->itemAt(index)->widget(); + + // if (currentState == StatesList::State::INIT_ERROR) + // label->setStyleSheet(errorStyle); + // else + // label->setStyleSheet(currentStateStyle); + + // // Set as completed every state before the current + // for (int i = index - 1; i >= 0; i--) + // outerLayout->itemAt(i)->widget()->setStyleSheet(completedStyle); + + // // Reset every state after the current + // for (int i = index + 1; i < StatesList::statesLabels.count(); i++) + // outerLayout->itemAt(i)->widget()->setStyleSheet(baseStyle); + + // auto tmp = outerLayout->itemAt(StatesList::statesLabels.count() - 1) + // ->widget() + // ->styleSheet(); + // outerLayout->itemAt(StatesList::statesLabels.count() - 1) + // ->widget() + // ->setStyleSheet(tmp + "border-right-width:1px;"); + // } } diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h index bfcade2df5a4b134ccb558596f169499b84d4116..d27b9c175595eb5127e8288b88fa595b331ccc75 100644 --- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h +++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.h @@ -18,37 +18,37 @@ #pragma once -#include <Core/Module/Module.h> +#include <Core/Message/Filter.h> +#include <Core/Message/Message.h> #include <Modules/DefaultModule/DefaultModule.h> -#include <QMenu> -#include <QSharedPointer> +#include <QLabel> #include <QWidget> -namespace Ui -{ -class RefuelingVisualizer; -} +#include "RefuelingVisualizerCommandList.h" class RefuelingVisualizer : public DefaultModule { Q_OBJECT public: - explicit RefuelingVisualizer(); - ~RefuelingVisualizer() override; + explicit RefuelingVisualizer(QWidget* parent = nullptr); + ~RefuelingVisualizer(); QWidget* toWidget() override; XmlObject toXmlObject() override; void fromXmlObject(const XmlObject& xmlObject) override; -protected: - void connectUiSlots(); +private: + void setupUi(); + void addCustomActionsToMenu() override; + void onConfigureClicked(); + void setFilter(const Filter& filter); + void onMsgReceived(const Message& msg); -protected slots: - void onSelectPanelClick(); + QHBoxLayout* outerLayout; -private: - Ui::RefuelingVisualizer* ui; + Filter filter; + RefuelingVisualizerCommandList::Valve currentState; }; diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui deleted file mode 100644 index 03de792d38230110f162c68e665c517c4df7a5ef..0000000000000000000000000000000000000000 --- a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizer.ui +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>RefuelingVisualizer</class> - <widget class="QWidget" name="RefuelingVisualizer"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>448</width> - <height>233</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QGridLayout" name="gridLayout"> - <item row="1" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>This is an Empty panel. -In order to select a panel click the following button</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item row="3" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="selectPanel_button"> - <property name="text"> - <string>Select Panel</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item row="0" column="0"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item row="4" column="0"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizerCommandList.h b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizerCommandList.h new file mode 100644 index 0000000000000000000000000000000000000000..1aa4977714165bd325d250292c32845249cda1e8 --- /dev/null +++ b/src/shared/Modules/RefuelingVisualizer/RefuelingVisualizerCommandList.h @@ -0,0 +1,50 @@ +/* + * This file is part of Skyward Hub. + * + * Skyward Hub is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * Skyward Hub is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * Skyward Hub. If not, see <https://www.gnu.org/licenses/>. + * + */ + +#pragma once + +#include <QList> +#include <QMap> +#include <QString> + +namespace RefuelingVisualizerCommandList +{ + +// Valves +enum class Valve : int +{ + FILLING = 0, + RELEASE, + VENTING, +}; + +// Groundstation labels +static const QList<QString> commandLabels{ + "FILLING", + "RELEASE", + "VENTING", +}; + +// Map from rocket states to groundstation labels +static const QMap<Valve, int> valvesIndexes{ + {Valve::FILLING, 0}, + {Valve::RELEASE, 1}, + {Valve::VENTING, 2}, +}; + +} // namespace RefuelingVisualizerCommandList \ No newline at end of file