diff --git a/Modules/CommandPad/commandpadmodule.ui b/Modules/CommandPad/commandpadmodule.ui index 9730447c1935d7689dd968910072cc2f66ade627..ec9d282f47947eca67355fcb0d285d4fec0ce53d 100644 --- a/Modules/CommandPad/commandpadmodule.ui +++ b/Modules/CommandPad/commandpadmodule.ui @@ -302,6 +302,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="deploymentAltitude_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -340,6 +346,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="refTemperature_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -378,6 +390,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="referenceAltitude_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -416,6 +434,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="aerobrakeAngle_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -471,6 +495,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="initialOrientationYaw_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -488,6 +518,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="initialOrientationPitch_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -505,6 +541,12 @@ </item> <item> <widget class="QDoubleSpinBox" name="initialOrientationRoll_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <double>99999.990000000005239</double> </property> @@ -568,6 +610,12 @@ </item> <item> <widget class="QSpinBox" name="rawEventId_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <number>99999</number> </property> @@ -582,6 +630,12 @@ </item> <item> <widget class="QSpinBox" name="rawEventTopic_spinBox"> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> <property name="maximum"> <number>99999</number> </property> diff --git a/Modules/Mavlink/mavlink_skyward_lib b/Modules/Mavlink/mavlink_skyward_lib index 93850b6237b2922fa7960e8fd6c105e1ed427b1b..02a8988485d1365f8dc4c897c5d2f9635b0cb9dd 160000 --- a/Modules/Mavlink/mavlink_skyward_lib +++ b/Modules/Mavlink/mavlink_skyward_lib @@ -1 +1 @@ -Subproject commit 93850b6237b2922fa7960e8fd6c105e1ed427b1b +Subproject commit 02a8988485d1365f8dc4c897c5d2f9635b0cb9dd diff --git a/Modules/ValuesViewer/valueelement.cpp b/Modules/ValuesViewer/valueelement.cpp new file mode 100644 index 0000000000000000000000000000000000000000..630ef206841be2c703dd1d114bf4334cfaab4b5e --- /dev/null +++ b/Modules/ValuesViewer/valueelement.cpp @@ -0,0 +1,143 @@ +#include "valueelement.h" + +#include <QRadioButton> + +#include <QDebug> + +ValueElement::ValueElement() +{ + +} + +ValueElement::~ValueElement() +{ + +} + +ValueElement::ValueElement(const ValueElement &other) +{ + copy(other); +} + +ValueElement::ValueElement(const QString &name, const QString &topic, const QString &receivedValue, const QString &displayedValue, const QString &color) +{ + setName(name); + setTopic(topic); + setReceivedValue(receivedValue); + setDisplayedValue(displayedValue); + setColor(color); +} + +ValueElement ValueElement::operator=(const ValueElement &other) +{ + copy(other); + return *this; +} + +QString ValueElement::getName() const +{ + return name; +} + +void ValueElement::setName(const QString &value) +{ + name = value; +} + +QString ValueElement::getTopic() const +{ + return topic; +} + +void ValueElement::setTopic(const QString &value) +{ + topic = value; +} + +QString ValueElement::getReceivedValue() const +{ + return receivedValue; +} + +void ValueElement::setReceivedValue(const QString &value) +{ + receivedValue = value; +} + +QString ValueElement::getDisplayedValue() const +{ + return displayedValue; +} + +void ValueElement::setDisplayedValue(const QString &value) +{ + displayedValue = value; +} + +QString ValueElement::getColor() const +{ + return color; +} + +void ValueElement::setColor(const QString &value) +{ + color = value; +} + +QString ValueElement::toString() const +{ + return getName() + ": " + getTopic() + " [" + getReceivedValue() + " = " + getDisplayedValue() + "] color=" + getColor(); +} + +XmlObject ValueElement::toXmlObject() const +{ + XmlObject obj("Rule"); + obj.addAttribute("name", getName()); + obj.addAttribute("topic", getTopic()); + obj.addAttribute("received", getReceivedValue()); + obj.addAttribute("displayed", getDisplayedValue()); + obj.addAttribute("color", getColor()); + return obj; +} + +bool ValueElement::fromXmlObject(const XmlObject &xmlObject) +{ + bool result = false; + if(xmlObject.getObjectName() == "Rule" && xmlObject.hasAttribute("name")){ + QString name = xmlObject.getAttribute("name"); + if(name != ""){ + setName(name); + result = true; + } + + setTopic(xmlObject.getAttribute("topic")); + setReceivedValue(xmlObject.getAttribute("received")); + setDisplayedValue(xmlObject.getAttribute("displayed")); + setColor(xmlObject.getAttribute("color")); + } + return result; +} + +void ValueElement::copy(const ValueElement &other) +{ + setName(other.getName()); + setTopic(other.getTopic()); + setReceivedValue(other.getReceivedValue()); + setDisplayedValue(other.getDisplayedValue()); + setColor(other.getColor()); +} + +QString ValueElement::getCurrentValue() const +{ + return currentValue; +} + +bool ValueElement::updateCurrentValue(const QString &value) +{ + if(value == getReceivedValue()){ + currentValue = getDisplayedValue(); + return true; + } + return false; +} + diff --git a/Modules/ValuesViewer/valueelement.h b/Modules/ValuesViewer/valueelement.h new file mode 100644 index 0000000000000000000000000000000000000000..80ecaeed63c6996852e6c2ba724c86e308b44612 --- /dev/null +++ b/Modules/ValuesViewer/valueelement.h @@ -0,0 +1,53 @@ +#ifndef VALUEELEMENT_H +#define VALUEELEMENT_H + +#include <QString> +#include "Core/xmlobject.h" + +class ValueElement +{ + +public: + ValueElement(); + ~ValueElement(); + ValueElement(const ValueElement &other); + ValueElement(const QString &name, const QString &topic, const QString &receivedValue, const QString &displayedValue, const QString &color); + + ValueElement operator=(const ValueElement &other); + QString getName() const; + void setName(const QString &value); + + QString getTopic() const; + void setTopic(const QString &value); + + QString getReceivedValue() const; + void setReceivedValue(const QString &value); + + QString getDisplayedValue() const; + void setDisplayedValue(const QString &value); + + QString getColor() const; + void setColor(const QString &value); + + QString toString() const; + + XmlObject toXmlObject() const; + bool fromXmlObject(const XmlObject &xmlObject); + + QString getCurrentValue() const; + bool updateCurrentValue(const QString &value); + +protected: + void copy(const ValueElement &other); + +private: + QString name = ""; + QString topic = ""; + QString receivedValue = ""; + QString displayedValue = ""; + QString color = "#ffffff"; + + QString currentValue = ""; +}; + +#endif // VALUEELEMENT_H diff --git a/Modules/ValuesViewer/valuesviewerconfigpanel.cpp b/Modules/ValuesViewer/valuesviewerconfigpanel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..edf229c38ffbaa970aaac3ddb6c88d9d18f95af5 --- /dev/null +++ b/Modules/ValuesViewer/valuesviewerconfigpanel.cpp @@ -0,0 +1,168 @@ +#include "valuesviewerconfigpanel.h" +#include "ui_valuesviewerconfigpanel.h" + +#include <QDebug> +#include <QColorDialog> + +ValuesViewerConfigPanel::ValuesViewerConfigPanel(QWidget *parent) : QWidget(parent), ui(new Ui::ValuesViewerConfigPanel) +{ + ui->setupUi(this); + connect(ui->add_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onAddFieldClicked); + connect(ui->edit_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onEditClicked); + connect(ui->remove_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onRemoveClicked); + connect(ui->pickColor_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onPickColordClicked); + connect(ui->save_pushButton, &QPushButton::clicked, this, &ValuesViewerConfigPanel::onSaveClicked); + this->setAttribute(Qt::WA_DeleteOnClose, true); +} + +ValuesViewerConfigPanel::~ValuesViewerConfigPanel() +{ + // The QRadioButtons are destroyed automatically. + delete ui; +} + +void ValuesViewerConfigPanel::onAddFieldClicked() +{ + ValueElement e = createRuleFromControls(); + if(e.getName() != ""){ + int index = computeViewIndex(e.getName()); + addRule(index, e); + //connect(view, &QRadioButton::destroyed, this, [](){qDebug() << "ValuesViewConfigPanel: Button deleted";}); + } +} + +ValueElement ValuesViewerConfigPanel::createRuleFromControls() +{ + QString name = ui->name_lineEdit->text().trimmed(); + QString topic = ui->topic_lineEdit->text().trimmed(); + QString receivedValue = ui->receivedValue_lineEdit->text().trimmed(); + QString displayedValue = ui->displayedValue_lineEdit->text().trimmed(); + QString color = ui->color_lineEdit->text().trimmed(); + ValueElement e(name, topic, receivedValue, displayedValue, color); + return e; +} + + +void ValuesViewerConfigPanel::onEditClicked() +{ + ValueElement e = createRuleFromControls(); + if(e.getName() != ""){ + int index = findSelectedView(); + if(index>=0 && index < rules.count()){ + rules[index] = e; + views[index]->setText(e.toString()); + } + } +} + +void ValuesViewerConfigPanel::onRemoveClicked() +{ + int selectedView = findSelectedView(); + if(selectedView >= 0 && selectedView < rules.count()){ + rules.removeAt(selectedView); + } + if(selectedView >= 0 && selectedView < views.count()){ + delete views[selectedView]; + views.removeAt(selectedView); + } +} + +void ValuesViewerConfigPanel::onPickColordClicked() +{ + QColor initial(ui->color_lineEdit->text().trimmed()); + QColor color = QColorDialog::getColor(initial, this); + ui->color_lineEdit->setText(color.name()); +} + +void ValuesViewerConfigPanel::onValueElementClicked() +{ + int selectedView = findSelectedView(); + if(selectedView >= 0 && selectedView < rules.count()){ + setTextBoxValues(rules[selectedView]); + } +} + +void ValuesViewerConfigPanel::onSaveClicked() +{ + emit configurationSaved(this); + this->close(); +} + +int ValuesViewerConfigPanel::computeViewIndex(const QString &viewName) +{ + int i = 0; + for (; i < rules.count(); i++ ) { + + if(rules.at(i).getName().compare(viewName) >= 0){ + return i; + } + } + return i; +} + +QRadioButton *ValuesViewerConfigPanel::createView(const ValueElement &el) +{ + //qDebug() << "ValuesViewConfigPanel: Button created"; + return new QRadioButton(el.toString()); +} + +void ValuesViewerConfigPanel::setTextBoxValues(const ValueElement &el) +{ + ui->name_lineEdit->setText(el.getName()); + ui->topic_lineEdit->setText(el.getTopic()); + ui->receivedValue_lineEdit->setText(el.getReceivedValue()); + ui->displayedValue_lineEdit->setText(el.getDisplayedValue()); + ui->color_lineEdit->setText(el.getColor()); +} + +int ValuesViewerConfigPanel::findSelectedView() const +{ + for (int i = 0; i < views.count(); i++) { + if(views[i]->isChecked()){ + return i; + } + } + return -1; +} + +void ValuesViewerConfigPanel::addRule(int index, const ValueElement &el) +{ + rules.insert(index, el); + QRadioButton *view = createView(el); + views.insert(index, view); + ui->fieldsLayout->insertWidget(index, view); + connect(view, &QRadioButton::clicked, this, &ValuesViewerConfigPanel::onValueElementClicked); +} + + +void ValuesViewerConfigPanel::setRules(const QList<ValueElement> &newValues) +{ + for (int i = 0; i < newValues.count(); i++ ) { + addRule(i, newValues[i]); + } +} + +QList<ValueElement> ValuesViewerConfigPanel::getRules() const +{ + return rules; +} + +int ValuesViewerConfigPanel::getColumnsCount() const +{ + return ui->columns_spinBox->value(); +} + +void ValuesViewerConfigPanel::setColumnsCount(int value) +{ + return ui->columns_spinBox->setValue(value); +} + + + + + + + + + + diff --git a/Modules/ValuesViewer/valuesviewerconfigpanel.h b/Modules/ValuesViewer/valuesviewerconfigpanel.h new file mode 100644 index 0000000000000000000000000000000000000000..913524371b3d525ff53c777476749c73f50808a5 --- /dev/null +++ b/Modules/ValuesViewer/valuesviewerconfigpanel.h @@ -0,0 +1,52 @@ +#ifndef VALUESVIEWERCONFIGPANEL_H +#define VALUESVIEWERCONFIGPANEL_H + +#include <QWidget> +#include <QRadioButton> +#include "valueelement.h" + +namespace Ui { +class ValuesViewerConfigPanel; +} + +class ValuesViewerConfigPanel : public QWidget +{ + Q_OBJECT + +public: + explicit ValuesViewerConfigPanel(QWidget *parent = nullptr); + ~ValuesViewerConfigPanel(); + + + int getColumnsCount() const; + void setColumnsCount(int value); + + void setRules(const QList<ValueElement> &newValues); + QList<ValueElement> getRules() const; + +signals: + void configurationSaved(ValuesViewerConfigPanel *sPanel); + +protected: + void onAddFieldClicked(); + void onRemoveClicked(); + void onPickColordClicked(); + void onValueElementClicked(); + void onSaveClicked(); + void onEditClicked(); + int computeViewIndex(const QString &viewName); + QRadioButton* createView(const ValueElement &el); + void setTextBoxValues(const ValueElement &el); + int findSelectedView() const; + void addRule(int index, const ValueElement &el); + + ValueElement createRuleFromControls(); + +private: + Ui::ValuesViewerConfigPanel *ui; + + QList<ValueElement> rules; + QList<QRadioButton*> views; +}; + +#endif // VALUESVIEWERCONFIGPANEL_H diff --git a/Modules/ValuesViewer/valuesviewerconfigpanel.ui b/Modules/ValuesViewer/valuesviewerconfigpanel.ui new file mode 100644 index 0000000000000000000000000000000000000000..803402bea7401601d0ef020bb6304c3b27cb247c --- /dev/null +++ b/Modules/ValuesViewer/valuesviewerconfigpanel.ui @@ -0,0 +1,259 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ValuesViewerConfigPanel</class> + <widget class="QWidget" name="ValuesViewerConfigPanel"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>783</width> + <height>619</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1,2,0"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Column number</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="columns_spinBox"> + <property name="maximumSize"> + <size> + <width>150</width> + <height>16777215</height> + </size> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="buttonSymbols"> + <enum>QAbstractSpinBox::NoButtons</enum> + </property> + <property name="minimum"> + <number>1</number> + </property> + </widget> + </item> + <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="save_pushButton"> + <property name="text"> + <string> Save </string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Use the controls on the bottom to create a new rule. Click on a rule and use the Remove button to delete it or use the add button to edit it. +The rules with the same name refer to the same object.</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <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>761</width> + <height>424</height> + </rect> + </property> + <layout class="QVBoxLayout" name="fieldsLayout"> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>458</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + </widget> + </item> + <item> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Create or Edit a rule</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <layout class="QGridLayout" name="gridLayout"> + <item row="1" column="2"> + <widget class="QLineEdit" name="receivedValue_lineEdit"/> + </item> + <item row="0" column="3"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Displayed Value</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="0" column="4"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Color</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="1" column="4"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QLineEdit" name="color_lineEdit"> + <property name="text"> + <string>#ffffff</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pickColor_pushButton"> + <property name="text"> + <string>Pick</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="2"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Received Value</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="1" column="3"> + <widget class="QLineEdit" name="displayedValue_lineEdit"/> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Name</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Topic</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLineEdit" name="name_lineEdit"/> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="topic_lineEdit"/> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <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> + <item> + <widget class="QPushButton" name="add_pushButton"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="edit_pushButton"> + <property name="text"> + <string>Edit</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="remove_pushButton"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_5"> + <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> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Modules/ValuesViewer/valuesviewermodule.cpp b/Modules/ValuesViewer/valuesviewermodule.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e92507ff3ffa337025fc51da4e4d89222984dd0f --- /dev/null +++ b/Modules/ValuesViewer/valuesviewermodule.cpp @@ -0,0 +1,176 @@ +#include "valuesviewermodule.h" +#include "ui_valuesviewermodule.h" + +#include "valuesviewerconfigpanel.h" +#include "Core/modulemessagesbroker.h" + +ValuesViewerModule::ValuesViewerModule(QWidget *parent) : DefaultModule(parent), ui(new Ui::ValuesViewerModule) +{ + ui->setupUi(this); + defaultContextMenuSetup(); +} + +ValuesViewerModule::~ValuesViewerModule() +{ + clearLabels(); + delete ui; +} + + +QWidget *ValuesViewerModule::toWidget() +{ + return this; +} + +XmlObject ValuesViewerModule::toXmlObject() +{ + XmlObject obj(getName(ModuleId::VALUESVIEWER)); + + obj.addAttribute("Columns", QString::number(columns)); + + for(int i = 0; i < rules.count();i++){ + obj.addChild(rules[i].toXmlObject()); + } + return obj; +} + +void ValuesViewerModule::fromXmlObject(const XmlObject &xmlObject) +{ + if(xmlObject.getObjectName() == getName(ModuleId::VALUESVIEWER)){ + + int col; + if(xmlObject.getIntAttribute("Columns", col)){ + columns = col; + } + + for(int i = 0; i < xmlObject.childCount(); i++){ + XmlObject child = xmlObject.childAt(i); + ValueElement el; + if(el.fromXmlObject(child)){ + addRule(el); + } + } + createLabels(); + } +} + +void ValuesViewerModule::onConfigureClicked() +{ + ValuesViewerConfigPanel *sPanel = new ValuesViewerConfigPanel(); + sPanel->setRules(rules); + sPanel->setColumnsCount(columns); + connect(sPanel, &ValuesViewerConfigPanel::configurationSaved, this, &ValuesViewerModule::onConfigurationSaved); + sPanel->show(); +} + +void ValuesViewerModule::onConfigurationSaved(ValuesViewerConfigPanel *sPanel) +{ + setRules(sPanel->getRules()); + columns = sPanel->getColumnsCount(); + + createLabels(); +} + +void ValuesViewerModule::addCustomActionsToMenu() +{ + QAction* configure = new QAction("Configure"); + connect(configure, &QAction::triggered,this, &ValuesViewerModule::onConfigureClicked); + addActionToMenu(configure); +} + +QLabel *ValuesViewerModule::createView(const ValueElement &el) const +{ + QLabel *label = new QLabel(); + label->setText(el.getName()); + label->setAlignment(Qt::AlignCenter); + return label; +} + +void ValuesViewerModule::clearLabels() +{ + while(labels.count() > 0){ + QLabel *l = labels[0]; + labels.removeAll(l); + delete l; + } +} + +void ValuesViewerModule::createLabels() +{ + clearLabels(); + if(columns <= 0){ + columns = minColNumber; + } + + int col = 0; + for (int i = 0; i < rules.count(); i++ ) { + QLabel *label; + + int labelIndex = findLabelIndexByName(rules[i].getName()); + if(labelIndex >= 0 && labelIndex < labels.count()){ + label = labels[labelIndex]; + } + else{ + label = createView(rules[i]); + int row = i/columns; + if(col == columns){ + col = 0; + } + ui->mainLayout_grid->addWidget(label, row, col); + col++; + } + labels.append(label); + } +} + +void ValuesViewerModule::addRule(const ValueElement &el) +{ + rules.append(el); + if(el.getTopic() != ""){ + getCore()->getModuleMessagesBroker()->subscribe(el.getTopic(), this, [this](const ModuleMessage &msg){ + onMsgReceived(msg); + }); + } +} + +void ValuesViewerModule::setRules(const QList<ValueElement> &rList) +{ + clearRules(); + for (int i = 0; i < rList.count(); i++ ) { + addRule(rList[i]); + } +} + +void ValuesViewerModule::onMsgReceived(const ModuleMessage &msg) +{ + for (int i = 0; i < rules.count(); i++ ) { + if(rules[i].getTopic() == msg.topic()){ + if(rules[i].updateCurrentValue(msg.payload())){ + labels[i]->setText(rules[i].getName()+"\n"+rules[i].getCurrentValue()); + if(rules[i].getColor() != ""){ + labels[i]->setStyleSheet("color:"+rules[i].getColor()+";"); + } + } + } + } +} + +void ValuesViewerModule::clearRules() +{ + for (int i = 0; i < rules.count(); i++ ) { + if(rules[i].getTopic() != ""){ + getCore()->getModuleMessagesBroker()->unsubscribe(rules[i].getTopic(), this); + } + } + rules.clear(); +} + +int ValuesViewerModule::findLabelIndexByName(const QString &name) +{ + for (int i = 0; i < labels.count(); i++ ) { + if(labels[i]->text() == name){ + return i; + } + } + return -1; +} diff --git a/Modules/ValuesViewer/valuesviewermodule.h b/Modules/ValuesViewer/valuesviewermodule.h new file mode 100644 index 0000000000000000000000000000000000000000..818a5c909f71dbccebef7d6b27a86237c927cd7c --- /dev/null +++ b/Modules/ValuesViewer/valuesviewermodule.h @@ -0,0 +1,50 @@ +#ifndef VALUESVIEWERMODULE_H +#define VALUESVIEWERMODULE_H + +#include <QWidget> +#include <QLabel> +#include "valueelement.h" +#include "Modules/DefaultModule/defaultmodule.h" +#include "Core/modulemessage.h" + +class ValuesViewerConfigPanel; + +namespace Ui { +class ValuesViewerModule; +} + +class ValuesViewerModule : public DefaultModule +{ + Q_OBJECT + +public: + explicit ValuesViewerModule(QWidget *parent = nullptr); + ~ValuesViewerModule(); + + QWidget *toWidget() override; + + XmlObject toXmlObject() override; + void fromXmlObject(const XmlObject &xmlObject) override; + +protected: + void onConfigureClicked(); + void onConfigurationSaved(ValuesViewerConfigPanel *sPanel); + void addCustomActionsToMenu() override; + QLabel* createView(const ValueElement &el) const; + void clearLabels(); + void createLabels(); + void addRule(const ValueElement &el); + void setRules(const QList<ValueElement> &rList); + void onMsgReceived(const ModuleMessage &msg); + void clearRules(); + int findLabelIndexByName(const QString &name); + +private: + Ui::ValuesViewerModule *ui; + int minColNumber = 1; + int columns = minColNumber; + QList<QLabel*> labels; + QList<ValueElement> rules; +}; + +#endif // VALUESVIEWERMODULE_H diff --git a/Modules/ValuesViewer/valuesviewermodule.ui b/Modules/ValuesViewer/valuesviewermodule.ui new file mode 100644 index 0000000000000000000000000000000000000000..729f5822e6079244a1df003d2b4349f597cbe616 --- /dev/null +++ b/Modules/ValuesViewer/valuesviewermodule.ui @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ValuesViewerModule</class> + <widget class="QWidget" name="ValuesViewerModule"> + <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="mainLayout_grid"/> + </widget> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Modules/moduleinfo.h b/Modules/moduleinfo.h index be9d69ec45b5b478945911dbb55328dea9681bd5..9fc4a19296bc0df6681c91c353d053022ca8a1b1 100644 --- a/Modules/moduleinfo.h +++ b/Modules/moduleinfo.h @@ -22,6 +22,7 @@ enum ModuleId{ SCROLLAREA, FILESTREAM, STATEVIEWER, + VALUESVIEWER, MAVLINK_RCK_TESTING }; diff --git a/Modules/moduleslist.cpp b/Modules/moduleslist.cpp index 384691da5444be1d7ee348e90d2a7c397d83765e..27dc6334f874d888fcb606e3f83575338da6ae40 100644 --- a/Modules/moduleslist.cpp +++ b/Modules/moduleslist.cpp @@ -20,6 +20,7 @@ #include "Modules/FileStream/filestreammodule.h" #include "Modules/Mavlink/mavlinkrocketmsgtestingmodule.h" #include "Modules/StateViewer/stateviewermodule.h" +#include "Modules/ValuesViewer/valuesviewermodule.h" void ModulesList::createModuleList() { @@ -153,6 +154,14 @@ void ModulesList::createModuleList() stateViewer.addModuleSourceFiles("Modules/StateViewer/"); addModuleInfo(stateViewer); #endif + + #ifdef VALUESVIEWERMODULE_H + ModuleInfo valuesviewer(ModuleId::VALUESVIEWER, "ValuesViewer", ModuleCategory::DATAVISUAL); + valuesviewer.setFactory([](){return new ValuesViewerModule();}); + valuesviewer.addModuleSourceFiles("Modules/ValuesViewer/"); + addModuleInfo(valuesviewer); + #endif + } diff --git a/SkywardHub.pro b/SkywardHub.pro index 596b59627bc6bb51264d827549f4f0335948d2f9..07b55cc087de519ec29a5f0fb645b9651f2856bb 100644 --- a/SkywardHub.pro +++ b/SkywardHub.pro @@ -67,6 +67,9 @@ SOURCES += \ Modules/Utility/saveconfigurationdialog.cpp \ Modules/Utility/subscriptionspanel.cpp \ Modules/Utility/togglebutton.cpp \ + Modules/ValuesViewer/valueelement.cpp \ + Modules/ValuesViewer/valuesviewerconfigpanel.cpp \ + Modules/ValuesViewer/valuesviewermodule.cpp \ Modules/moduleinfo.cpp \ Modules/moduleslist.cpp \ Modules/skywardhubstrings.cpp \ @@ -133,6 +136,9 @@ HEADERS += \ Modules/Utility/saveconfigurationdialog.h \ Modules/Utility/subscriptionspanel.h \ Modules/Utility/togglebutton.h \ + Modules/ValuesViewer/valueelement.h \ + Modules/ValuesViewer/valuesviewerconfigpanel.h \ + Modules/ValuesViewer/valuesviewermodule.h \ Modules/moduleinfo.h \ Modules/moduleslist.h \ Modules/skywardhubstrings.h @@ -166,7 +172,9 @@ FORMS += \ Modules/TreeViewer/treeviewermodule.ui \ Modules/Utility/modulespicker.ui \ Modules/Utility/saveconfigurationdialog.ui \ - Modules/Utility/subscriptionspanel.ui + Modules/Utility/subscriptionspanel.ui \ + Modules/ValuesViewer/valuesviewerconfigpanel.ui \ + Modules/ValuesViewer/valuesviewermodule.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin diff --git a/SkywardHub.pro.user b/SkywardHub.pro.user index a50f0bef2f5a6790c4952e2c5a8e7ef3c18318c8..6bb8e65bf998480e3a061039a6f8e0b891565177 100644 --- a/SkywardHub.pro.user +++ b/SkywardHub.pro.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 4.14.2, 2021-07-30T12:33:17. --> +<!-- Written by QtCreator 4.14.2, 2021-08-11T21:04:23. --> <qtcreator> <data> <variable>EnvironmentId</variable>