diff --git a/Modules/StateViewer/stateviewermodule.cpp b/Modules/StateViewer/stateviewermodule.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e0b605629a1c693b29c16cb27cb093a70459d365 --- /dev/null +++ b/Modules/StateViewer/stateviewermodule.cpp @@ -0,0 +1,96 @@ +#include "stateviewermodule.h" +#include "ui_stateviewermodule.h" + +#include <QInputDialog> +#include <QLineEdit> +#include "Core/modulemessagesbroker.h" + +StateViewerModule::StateViewerModule(QWidget *parent) : DefaultModule(parent), ui(new Ui::StateViewerModule) +{ + ui->setupUi(this); + defaultContextMenuSetup(); + + labes.append(ui->label_1); + labes.append(ui->label_2); + labes.append(ui->label_3); + labes.append(ui->label_4); +} + +StateViewerModule::~StateViewerModule() +{ + delete ui; +} + +QWidget *StateViewerModule::toWidget() +{ + return this; +} + +XmlObject StateViewerModule::toXmlObject() +{ + XmlObject obj(getName(ModuleId::STATEVIEWER)); + + obj.addAttribute("topic", inputTopic); + + return obj; +} + +void StateViewerModule::fromXmlObject(const XmlObject &xmlObject) +{ + if(xmlObject.getObjectName() == getName(ModuleId::STATEVIEWER)){ + + inputTopic = xmlObject.getAttribute("topic"); + if(inputTopic != ""){ + setTopic(inputTopic); + } + } +} + +void StateViewerModule::addCustomActionsToMenu() +{ + QAction* config = new QAction("Configure"); + connect(config, &QAction::triggered,this, &StateViewerModule::onConfigureClicked); + + addActionToMenu(config); +} + +void StateViewerModule::onConfigureClicked() +{ + bool ok; + QString text = QInputDialog::getText(this, tr("Topic"), + tr("Insert input topic with the state information"), QLineEdit::Normal, inputTopic, &ok); + text = text.trimmed(); + if (ok && !text.isEmpty()) + setTopic(text); +} + +void StateViewerModule::setTopic(const QString &topic) +{ + getCore()->getModuleMessagesBroker()->unsubscribe(inputTopic, this); + + inputTopic = topic; + getCore()->getModuleMessagesBroker()->subscribe(inputTopic, this, [this](const ModuleMessage &msg){ + onMsgReceived(msg); + }); +} + +void StateViewerModule::onMsgReceived(const ModuleMessage &msg) +{ + int value = -1; + if(msg.getIntPayload(value)){ + setState(value); + } +} + +void StateViewerModule::setState(int state) +{ + if(state>= 0 && state < labes.count()){ + QString style = labes[state]->styleSheet(); + style += "background-color:green;"; + labes[state]->setStyleSheet(style); + } + +} + + + diff --git a/Modules/StateViewer/stateviewermodule.h b/Modules/StateViewer/stateviewermodule.h new file mode 100644 index 0000000000000000000000000000000000000000..2f4183fa4137f3956cbacd0cc1ad126ded61574c --- /dev/null +++ b/Modules/StateViewer/stateviewermodule.h @@ -0,0 +1,42 @@ +#ifndef STATEVIEWERMODULE_H +#define STATEVIEWERMODULE_H + +#include <QWidget> +#include <QLabel> + +#include "Modules/DefaultModule/defaultmodule.h" +#include "Core/modulemessage.h" + + +namespace Ui { +class StateViewerModule; +} + +class StateViewerModule : public DefaultModule +{ + Q_OBJECT + +public: + explicit StateViewerModule(QWidget *parent = nullptr); + ~StateViewerModule(); + + QWidget *toWidget() override; + + XmlObject toXmlObject() override; + void fromXmlObject(const XmlObject &xmlObject) override; + +protected: + void addCustomActionsToMenu() override; + void onConfigureClicked(); + void setTopic(const QString &topic); + void onMsgReceived(const ModuleMessage &msg); + void setState(int state); + +private: + Ui::StateViewerModule *ui; + QString inputTopic = ""; + + QList<QLabel*> labes; +}; + +#endif // STATEVIEWERMODULE_H diff --git a/Modules/StateViewer/stateviewermodule.ui b/Modules/StateViewer/stateviewermodule.ui new file mode 100644 index 0000000000000000000000000000000000000000..f6adc5360d3b3774c67aa29305c1d1a06ed7e144 --- /dev/null +++ b/Modules/StateViewer/stateviewermodule.ui @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>StateViewerModule</class> + <widget class="QWidget" name="StateViewerModule"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QScrollArea" name="scrollArea"> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>378</width> + <height>278</height> + </rect> + </property> + <property name="styleSheet"> + <string notr="true">border: 1px solid grey; +color: white;</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="1"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Phase 2 +Description</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Phase 3 +Description</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_1"> + <property name="styleSheet"> + <string notr="true">border: 1px solid grey; +color: white;</string> + </property> + <property name="text"> + <string>Phase 1 +Description</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="0" column="3"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Phase 4 +Description</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Modules/moduleinfo.h b/Modules/moduleinfo.h index 528d53e8550654b44339bea73b02d7b11db81818..be9d69ec45b5b478945911dbb55328dea9681bd5 100644 --- a/Modules/moduleinfo.h +++ b/Modules/moduleinfo.h @@ -21,6 +21,7 @@ enum ModuleId{ TREEVIEWER, SCROLLAREA, FILESTREAM, + STATEVIEWER, MAVLINK_RCK_TESTING }; diff --git a/Modules/moduleslist.cpp b/Modules/moduleslist.cpp index e7d34341b8a7c8c08651cd0517a3ea4e7417c8bc..384691da5444be1d7ee348e90d2a7c397d83765e 100644 --- a/Modules/moduleslist.cpp +++ b/Modules/moduleslist.cpp @@ -19,6 +19,7 @@ #include "Modules/ScrollArea/scrollareamodule.h" #include "Modules/FileStream/filestreammodule.h" #include "Modules/Mavlink/mavlinkrocketmsgtestingmodule.h" +#include "Modules/StateViewer/stateviewermodule.h" void ModulesList::createModuleList() { @@ -145,6 +146,13 @@ void ModulesList::createModuleList() fileStream.addModuleSourceFiles("Modules/FileStream/"); addModuleInfo(fileStream); #endif + + #ifdef STATEVIEWERMODULE_H + ModuleInfo stateViewer(ModuleId::STATEVIEWER, "StateViewer", ModuleCategory::DATAVISUAL); + stateViewer.setFactory([](){return new StateViewerModule();}); + stateViewer.addModuleSourceFiles("Modules/StateViewer/"); + addModuleInfo(stateViewer); + #endif } diff --git a/SkywardHub.pro b/SkywardHub.pro index a375acafd0729eb0808dc2847b952ec6340cef31..596b59627bc6bb51264d827549f4f0335948d2f9 100644 --- a/SkywardHub.pro +++ b/SkywardHub.pro @@ -57,6 +57,7 @@ SOURCES += \ Modules/SkywardHub/prefabviewelement.cpp \ Modules/SkywardHub/skywardhubmodule.cpp \ Modules/Splitter/splittermodule.cpp \ + Modules/StateViewer/stateviewermodule.cpp \ Modules/Table/tablemodule.cpp \ Modules/Test/testmodule.cpp \ Modules/TreeViewer/treevieweritem.cpp \ @@ -122,6 +123,7 @@ HEADERS += \ Modules/SkywardHub/prefabviewelement.h \ Modules/SkywardHub/skywardhubmodule.h \ Modules/Splitter/splittermodule.h \ + Modules/StateViewer/stateviewermodule.h \ Modules/Table/tablemodule.h \ Modules/Test/testmodule.h \ Modules/TreeViewer/treevieweritem.h \ @@ -158,6 +160,7 @@ FORMS += \ Modules/SkywardHub/prefabviewelement.ui \ Modules/SkywardHub/skywardhubmodule.ui \ Modules/Splitter/splittermodule.ui \ + Modules/StateViewer/stateviewermodule.ui \ Modules/Table/tablemodule.ui \ Modules/Test/testmodule.ui \ Modules/TreeViewer/treeviewermodule.ui \