From 1bbce26c1c1988daca4ae86c6cad50aed9455e8d Mon Sep 17 00:00:00 2001 From: Riccardo Musso <riccardo.musso@skywarder.eu> Date: Fri, 3 Jun 2022 15:40:35 +0200 Subject: [PATCH] Implemented IncomingMessagesViewer --- .../incomingmessagesviewermodule.cpp | 106 ++++++++++++++++++ .../incomingmessagesviewermodule.h | 33 ++++++ Modules/moduleinfo.h | 1 + Modules/moduleslist.cpp | 18 ++- SkywardHub.pro | 2 + 5 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp create mode 100644 Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h diff --git a/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp new file mode 100644 index 00000000..3b546954 --- /dev/null +++ b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp @@ -0,0 +1,106 @@ +#include <QHBoxLayout> + +#include "incomingmessagesviewermodule.h" +#include "Components/SubscriptionsPanel/subscriptionspanel.h" + +IncomingMessagesViewerModule::IncomingMessagesViewerModule(QWidget* parent) : DefaultModule(parent) { + setupUi(); + defaultContextMenuSetup(); + + getCore()->getModuleMessagesBroker()->subscribe({"*"}, this, [this](const ModuleMessage & msg) { + MessageField value; + for(auto it = filters.begin(); it != filters.end(); ++it) { + if(it->matchMessage(msg, value)) { + if(clearEveryMessage) { + edit->setText(""); + } + + QString old = edit->toPlainText(); + edit->setText(QTime::currentTime().toString("hh.mm.ss") + " [" + + msg.getTopic().toString() + (it->isFullFilter() ? (QString(".") + it->getFieldName()) : "") + + "]: " + value.getString() + "\n" + old); + } + } + }); +} + +IncomingMessagesViewerModule::~IncomingMessagesViewerModule() { + getCore()->getModuleMessagesBroker()->unsubscribe({"*"}, this); +} + +QWidget* IncomingMessagesViewerModule::toWidget() { + return this; +} + +XmlObject IncomingMessagesViewerModule::toXmlObject() { + XmlObject obj(getName(ModuleId::INCOMINGMESSAGESVIEWER)); + obj.addAttribute("clearEveryMessage", clearEveryMessage ? "1" : "0"); + + for(int i = 0; i < filters.count(); i++) { + XmlObject subscription("Subscription"); + subscription.addAttribute("Value", filters[i].toString()); + obj.addChild(subscription); + } + + return obj; +} + +void IncomingMessagesViewerModule::fromXmlObject(const XmlObject& xmlObject) { + clearEveryMessage = xmlObject.getAttribute("clearEveryMessage") == "1"; + + for(int i = 0; i < xmlObject.childCount(); i++) { + XmlObject child = xmlObject.childAt(i); + if(child.getObjectName() == "Subscription") { + auto subscription = TopicAndFieldFilter::fromStringUnsafe(child.getAttribute("Value")); + addSubscription(subscription); + } + } +} + +void IncomingMessagesViewerModule::addSubscription(const TopicAndFieldFilter& filter) { + filters.append(filter); +} + +void IncomingMessagesViewerModule::removeSubscription(const TopicAndFieldFilter& filter) { + filters.removeAll(filter); +} + +void IncomingMessagesViewerModule::addCustomActionsToMenu() { + QAction* clear = new QAction("Clear"); + connect(clear, &QAction::triggered, this, [this]() { + edit->clear(); + }); + + QAction* manage = new QAction("Manage subscriptions"); + connect(manage, &QAction::triggered, this, [this]() { + auto* panel = new SubscriptionsPanel(&filters); + panel->setWindowTitle("IncomingMessagesViewer subscriptions"); + connect(panel, &SubscriptionsPanel::SubscriptionAdded, this, &IncomingMessagesViewerModule::addSubscription); + connect(panel, &SubscriptionsPanel::SubscriptionRemoved, this, &IncomingMessagesViewerModule::removeSubscription); + panel->show(); + }); + + QAction* check = new QAction("Clear every message"); + check->setCheckable(true); + check->setChecked(clearEveryMessage); + connect(check, &QAction::toggled, this, &IncomingMessagesViewerModule::setClearEveryMessage); + + addActionToMenu(manage); + addActionToMenu(check); +} + + +void IncomingMessagesViewerModule::setClearEveryMessage(bool val) { + clearEveryMessage = val; +} + + +void IncomingMessagesViewerModule::setupUi() { + edit = new QTextEdit(); + edit->setReadOnly(true); + edit->setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu); + + QHBoxLayout* layout = new QHBoxLayout(); + layout->addWidget(edit); + setLayout(layout); +} diff --git a/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h new file mode 100644 index 00000000..a23e75f5 --- /dev/null +++ b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h @@ -0,0 +1,33 @@ +#ifndef INCOMINGMESSAGESVIEWERMODULE_H +#define INCOMINGMESSAGESVIEWERMODULE_H + +#include "Modules/DefaultModule/defaultmodule.h" +#include "Core/Message/topicandfieldfilter.h" + +class IncomingMessagesViewerModule : public DefaultModule { + Q_OBJECT + + public: + explicit IncomingMessagesViewerModule(QWidget* parent = nullptr); + ~IncomingMessagesViewerModule(); + + QWidget* toWidget() override; + + XmlObject toXmlObject() override; + void fromXmlObject(const XmlObject& xmlObject) override; + void addCustomActionsToMenu() override; + + public slots: + void addSubscription(const TopicAndFieldFilter& filter); + void removeSubscription(const TopicAndFieldFilter& filter); + void setClearEveryMessage(bool); + + private: + QTextEdit* edit; + void setupUi(); + + QList<TopicAndFieldFilter> filters; + bool clearEveryMessage = false; +}; + +#endif // INCOMINGMESSAGESVIEWERMODULE_H diff --git a/Modules/moduleinfo.h b/Modules/moduleinfo.h index 78e2c76d..0e28d220 100644 --- a/Modules/moduleinfo.h +++ b/Modules/moduleinfo.h @@ -15,6 +15,7 @@ enum ModuleId { GRAPH, TABLE, OUTCOMINGMESSAGEVIEWER, + INCOMINGMESSAGESVIEWER, MAVLINK, FSMVIEWER, TREEVIEWER, diff --git a/Modules/moduleslist.cpp b/Modules/moduleslist.cpp index 89ca2b4e..1cf04de4 100644 --- a/Modules/moduleslist.cpp +++ b/Modules/moduleslist.cpp @@ -9,6 +9,7 @@ #include "Modules/Test/testmodule.h" #include "Modules/Graph/graphmodule.h" #include "Modules/OutcomingMessagesViewer/outcomingmessagesviewermodule.h" +#include "Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h" #include "Modules/Mavlink/mavlinkmodule.h" #include "Modules/FileStream/filestreammodule.h" #include "Modules/Mavlink/mavlinkrocketmsgtestingmodule.h" @@ -77,12 +78,21 @@ void ModulesList::createModuleList() { #endif #ifdef OUTCOMINGMESSAGESVIEWERMODULE_H - ModuleInfo msgViewer(ModuleId::OUTCOMINGMESSAGEVIEWER, "OutcomingMessagesViewer", ModuleCategory::DATAVISUAL); - msgViewer.setFactory([]() { + ModuleInfo outMsgViewer(ModuleId::OUTCOMINGMESSAGEVIEWER, "OutcomingMessagesViewer", ModuleCategory::DATAVISUAL); + outMsgViewer.setFactory([]() { return new OutcomingMessagesViewerModule(); }); - msgViewer.addModuleSourceFiles("Modules/OutcomingMessageViewer/"); - addModuleInfo(msgViewer); + outMsgViewer.addModuleSourceFiles("Modules/OutcomingMessageViewer/"); + addModuleInfo(outMsgViewer); +#endif + +#ifdef INCOMINGMESSAGESVIEWERMODULE_H + ModuleInfo inMsgViewer(ModuleId::INCOMINGMESSAGESVIEWER, "IncomingMessagesViewer", ModuleCategory::DATAVISUAL); + inMsgViewer.setFactory([]() { + return new IncomingMessagesViewerModule(); + }); + inMsgViewer.addModuleSourceFiles("Modules/IncomingMessageViewer/"); + addModuleInfo(inMsgViewer); #endif #ifdef MAVLINKMODULE_H diff --git a/SkywardHub.pro b/SkywardHub.pro index 50abaad4..0fa8eece 100644 --- a/SkywardHub.pro +++ b/SkywardHub.pro @@ -34,6 +34,7 @@ SOURCES += \ Modules/FileStream/filestreammodule.cpp \ Modules/Graph/graphmodule.cpp \ Modules/Graph/qcustomplot.cpp \ + Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp \ Modules/MainWindow/skywardhubmainwindow.cpp \ Modules/MainWindow/window.cpp \ Modules/Mavlink/mavlinkcommandadapter.cpp \ @@ -85,6 +86,7 @@ HEADERS += \ Modules/FileStream/filestreammodule.h \ Modules/Graph/graphmodule.h \ Modules/Graph/qcustomplot.h \ + Modules/IncomingMessagesViewer/incomingmessagesviewermodule.h \ Modules/MainWindow/skywardhubmainwindow.h \ Modules/MainWindow/window.h \ Modules/Mavlink/mavlinkcommandadapter.h \ -- GitLab