diff --git a/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp b/Modules/IncomingMessagesViewer/incomingmessagesviewermodule.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3b546954e00681db7a5f61d096a524f6d325ef78 --- /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 0000000000000000000000000000000000000000..a23e75f5bd8ee3d96f45c7bcd3427eb10f981ab9 --- /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 78e2c76d279a2e7675eb660a3fa9132eee1fa0da..0e28d22080405d3e0cf672b8caba0f2ee6a94d46 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 89ca2b4e2d3a0ab6480e5dcf286740d60cbc6fb5..1cf04de4c0a794433ae1e4b8f136f6f0bba98061 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 50abaad49764e3a06e5dc0d1cc5b51fa6cddf7f2..0fa8eece5302c5d6fa06e994cf2d13734bad0a6b 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 \