Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions src/AnalyzeView/MAVLinkChartController.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,43 +18,49 @@

Q_DECLARE_METATYPE(QAbstractSeries*)

QGC_LOGGING_CATEGORY(MAVLinkChartControllerLog, "qgc.analyzeview.mavlinkchartcontroller")
QGC_LOGGING_CATEGORY(MAVLinkChartControllerLog, "MAVLinkChartControllerLog")

MAVLinkChartController::MAVLinkChartController(MAVLinkInspectorController *controller, int index, QObject *parent)
MAVLinkChartController::MAVLinkChartController(QObject *parent)
: QObject(parent)
, _index(index)
, _controller(controller)
, _updateSeriesTimer(new QTimer(this))
{
// qCDebug(MAVLinkChartControllerLog) << Q_FUNC_INFO << this;

(void) qRegisterMetaType<QAbstractSeries*>("QAbstractSeries*");

(void) connect(_updateSeriesTimer, &QTimer::timeout, this, &MAVLinkChartController::_refreshSeries);

updateXRange();
}

MAVLinkChartController::~MAVLinkChartController()
{
// qCDebug(MAVLinkChartControllerLog) << Q_FUNC_INFO << this;
}

void MAVLinkChartController::setInspectorController(MAVLinkInspectorController *controller)
{
if (_inspectorController == controller) {
return;
}

_inspectorController = controller;
updateXRange();
}

void MAVLinkChartController::setRangeYIndex(quint32 index)
{
if (index == _rangeYIndex) {
return;
}

if (index >= static_cast<quint32>(_controller->rangeSt().count())) {
if (index >= static_cast<quint32>(_inspectorController->rangeSt().count())) {
return;
}

_rangeYIndex = index;
emit rangeYIndexChanged();

// If not Auto, use defined range
const qreal range = _controller->rangeSt()[static_cast<int>(index)]->range;
const qreal range = _inspectorController->rangeSt()[static_cast<int>(index)]->range;
if (_rangeYIndex > 0) {
_rangeYMin = -range;
emit rangeYMinChanged();
Expand All @@ -78,15 +84,15 @@ void MAVLinkChartController::setRangeXIndex(quint32 index)

void MAVLinkChartController::updateXRange()
{
if (_rangeXIndex >= static_cast<quint32>(_controller->timeScaleSt().count())) {
if (_rangeXIndex >= static_cast<quint32>(_inspectorController->timeScaleSt().count())) {
return;
}

const qint64 bootTime = static_cast<qint64>(qgcApp()->msecsSinceBoot());
_rangeXMax = QDateTime::fromMSecsSinceEpoch(bootTime);
emit rangeXMaxChanged();

_rangeXMin = QDateTime::fromMSecsSinceEpoch(bootTime - _controller->timeScaleSt()[static_cast<int>(_rangeXIndex)]->timeScale);
_rangeXMin = QDateTime::fromMSecsSinceEpoch(bootTime - _inspectorController->timeScaleSt()[static_cast<int>(_rangeXIndex)]->timeScale);
emit rangeXMinChanged();
}

Expand Down
21 changes: 10 additions & 11 deletions src/AnalyzeView/MAVLinkChartController.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,6 @@
*
****************************************************************************/

/// @file
/// @brief MAVLink message inspector and charting controller
/// @author Gus Grubba <gus@auterion.com>

#pragma once

#include <QtCore/QDateTime>
Expand All @@ -30,35 +26,38 @@ class MAVLinkChartController : public QObject
{
Q_OBJECT
QML_ELEMENT
Copy link

Copilot AI Sep 21, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removing QML_UNCREATABLE(\"\") makes this type creatable from QML, but the constructor now requires parameters that can't be provided from QML creation. Consider keeping QML_UNCREATABLE or adding a default constructor that handles uninitialized state gracefully.

Suggested change
QML_ELEMENT
QML_UNCREATABLE("Cannot be created from QML. Use factory or set required properties.")

Copilot uses AI. Check for mistakes.

QML_UNCREATABLE("")
Q_MOC_INCLUDE("MAVLinkInspectorController.h")
Q_MOC_INCLUDE("MAVLinkMessageField.h")
Q_MOC_INCLUDE("QtCharts/qabstractseries.h")

Q_PROPERTY(MAVLinkInspectorController* inspectorController READ inspectorController WRITE setInspectorController REQUIRED)
Q_PROPERTY(int chartIndex MEMBER _chartIndex REQUIRED)
Q_PROPERTY(QVariantList chartFields READ chartFields NOTIFY chartFieldsChanged)
Q_PROPERTY(QDateTime rangeXMin READ rangeXMin NOTIFY rangeXMinChanged)
Q_PROPERTY(QDateTime rangeXMax READ rangeXMax NOTIFY rangeXMaxChanged)
Q_PROPERTY(qreal rangeYMin READ rangeYMin NOTIFY rangeYMinChanged)
Q_PROPERTY(qreal rangeYMax READ rangeYMax NOTIFY rangeYMaxChanged)
Q_PROPERTY(int chartIndex READ chartIndex CONSTANT)
Q_PROPERTY(quint32 rangeYIndex READ rangeYIndex WRITE setRangeYIndex NOTIFY rangeYIndexChanged)
Q_PROPERTY(quint32 rangeXIndex READ rangeXIndex WRITE setRangeXIndex NOTIFY rangeXIndexChanged)


public:
explicit MAVLinkChartController(MAVLinkInspectorController *controller, int index, QObject *parent = nullptr);
explicit MAVLinkChartController(QObject *parent = nullptr);
~MAVLinkChartController();

Q_INVOKABLE void addSeries(QGCMAVLinkMessageField *field, QAbstractSeries *series);
Q_INVOKABLE void delSeries(QGCMAVLinkMessageField *field);
Q_INVOKABLE MAVLinkInspectorController *controller() const { return _controller; }

void setInspectorController(MAVLinkInspectorController *inspectorController);
MAVLinkInspectorController *inspectorController() const { return _inspectorController; }
QVariantList chartFields() const { return _chartFields; }
QDateTime rangeXMin() const { return _rangeXMin; }
QDateTime rangeXMax() const { return _rangeXMax; }
qreal rangeYMin() const { return _rangeYMin; }
qreal rangeYMax() const { return _rangeYMax; }
quint32 rangeXIndex() const { return _rangeXIndex; }
quint32 rangeYIndex() const { return _rangeYIndex; }
int chartIndex() const { return _index; }
int chartIndex() const { return _chartIndex; }

void setRangeXIndex(quint32 index);
void setRangeYIndex(quint32 index);
Expand All @@ -78,8 +77,8 @@ private slots:
void _refreshSeries();

private:
int _index = 0;
MAVLinkInspectorController *_controller = nullptr;
int _chartIndex = 0;
MAVLinkInspectorController *_inspectorController = nullptr;
QTimer *_updateSeriesTimer = nullptr;

QDateTime _rangeXMin;
Expand Down
37 changes: 1 addition & 36 deletions src/AnalyzeView/MAVLinkInspectorController.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

#include <QtQml/QQmlEngine>

QGC_LOGGING_CATEGORY(MAVLinkInspectorControllerLog, "qgc.analyzeview.mavlinkinspectorcontroller")
QGC_LOGGING_CATEGORY(MAVLinkInspectorControllerLog, "MAVLinkInspectorControllerLog")

MAVLinkInspectorController::TimeScale_st::TimeScale_st(const QString &label_, uint32_t timeScale_)
: label(label_)
Expand All @@ -44,7 +44,6 @@ MAVLinkInspectorController::MAVLinkInspectorController(QObject *parent)
: QObject(parent)
, _updateFrequencyTimer(new QTimer(this))
, _systems(new QmlObjectListModel(this))
, _charts(new QmlObjectListModel(this))
{
// qCDebug(MAVLinkInspectorControllerLog) << Q_FUNC_INFO << this;

Expand Down Expand Up @@ -84,7 +83,6 @@ MAVLinkInspectorController::~MAVLinkInspectorController()
{
qDeleteAll(_timeScaleSt);
qDeleteAll(_rangeSt);
_charts->clearAndDeleteContents();
_systems->clearAndDeleteContents();

// qCDebug(MAVLinkInspectorControllerLog) << Q_FUNC_INFO << this;
Expand Down Expand Up @@ -227,39 +225,6 @@ void MAVLinkInspectorController::_receiveMessage(LinkInterface *link, const mavl
}
}

MAVLinkChartController *MAVLinkInspectorController::createChart()
{
MAVLinkChartController *const pChart = new MAVLinkChartController(this, _charts->count());
QQmlEngine::setObjectOwnership(pChart, QQmlEngine::CppOwnership);

_charts->append(pChart);
emit chartsChanged();

return pChart;
}

void MAVLinkInspectorController::deleteChart(MAVLinkChartController *chart)
{
if (!chart) {
return;
}

bool found = false;
for (int i = 0; i < _charts->count(); i++) {
MAVLinkChartController *const controller = qobject_cast<MAVLinkChartController*>(_charts->get(i));
if (controller && (controller == chart)) {
found = true;
_charts->removeOne(controller);
delete controller;
break;
}
}

if (found) {
emit chartsChanged();
}
}

void MAVLinkInspectorController::setActiveSystem(int systemId)
{
QGCMAVLinkSystem *const system = _findVehicle(systemId);
Expand Down
6 changes: 0 additions & 6 deletions src/AnalyzeView/MAVLinkInspectorController.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ class MAVLinkInspectorController : public QObject
Q_MOC_INCLUDE("MAVLinkChartController.h")
Q_MOC_INCLUDE("QmlObjectListModel.h")
Q_PROPERTY(QmlObjectListModel *systems READ systems NOTIFY systemsChanged)
Q_PROPERTY(QmlObjectListModel *charts READ charts NOTIFY chartsChanged)
Q_PROPERTY(QGCMAVLinkSystem *activeSystem READ activeSystem NOTIFY activeSystemChanged)
Q_PROPERTY(QStringList timeScales READ timeScales NOTIFY timeScalesChanged)
Q_PROPERTY(QStringList rangeList READ rangeList NOTIFY rangeListChanged)
Expand All @@ -62,13 +61,10 @@ class MAVLinkInspectorController : public QObject
explicit MAVLinkInspectorController(QObject *parent = nullptr);
~MAVLinkInspectorController();

Q_INVOKABLE MAVLinkChartController *createChart();
Q_INVOKABLE void deleteChart(MAVLinkChartController *chart);
Q_INVOKABLE void setActiveSystem(int systemId);
Q_INVOKABLE void setMessageInterval(int32_t rate) const;

QmlObjectListModel *systems() const { return _systems; }
QmlObjectListModel *charts() const { return _charts; }
QGCMAVLinkSystem *activeSystem() const { return _activeSystem; }
QStringList systemNames() const { return _systemNames; }
QStringList timeScales();
Expand All @@ -79,7 +75,6 @@ class MAVLinkInspectorController : public QObject

signals:
void activeSystemChanged();
void chartsChanged();
void rangeListChanged();
void systemsChanged();
void timeScalesChanged();
Expand All @@ -104,5 +99,4 @@ private slots:
QGCMAVLinkSystem *_activeSystem = nullptr;
QTimer *_updateFrequencyTimer = nullptr;
QmlObjectListModel *_systems = nullptr; ///< List of QGCMAVLinkSystem
QmlObjectListModel *_charts = nullptr; ///< List of MAVLinkCharts
};
35 changes: 16 additions & 19 deletions src/AnalyzeView/MAVLinkInspectorPage.qml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ import QGroundControl

import QGroundControl.Controls



AnalyzePage {
id: root
headerComponent: headerComponent
Expand All @@ -45,27 +43,22 @@ AnalyzePage {
if(!checkBox) {
continue
}
const object = message.fields.get(i)
checkBox.enabled = isCheckboxEnabled(checkBox, object, chart)
const messageField = message.fields.get(i)
checkBox.enabled = isCheckboxEnabled(checkBox, messageField, chart)
}
}

function isCheckboxEnabled(checkBox, object, chart) {
function isCheckboxEnabled(checkBox, messageField, chart) {
if(checkBox.checkState === Qt.Checked) {
return true
}
if(!object.selectable) {
if(!messageField.selectable) {
return false
}
if(object.series !== null) {
if(messageField.series !== null) {
return false
}
if(chart.chartController !== null) {
if (chart.chartController.chartFields.length >= chart.seriesColors.length) {
return false
}
}
return true
return chart.roomForNewDimension()
}

Component {
Expand Down Expand Up @@ -338,14 +331,18 @@ AnalyzePage {
}
Item { height: ScreenTools.defaultFontPixelHeight * 0.25; width: 1 }
MAVLinkChart {
id: chart1
height: ScreenTools.defaultFontPixelHeight * 20
width: parent.width
id: chart1
height: ScreenTools.defaultFontPixelHeight * 20
width: parent.width
inspectorController: controller
chartIndex: 0
}
MAVLinkChart {
id: chart2
height: ScreenTools.defaultFontPixelHeight * 20
width: parent.width
id: chart2
height: ScreenTools.defaultFontPixelHeight * 20
width: parent.width
inspectorController: controller
chartIndex: 1
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions src/AnalyzeView/MAVLinkMessageField.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ QGCMAVLinkMessageField::~QGCMAVLinkMessageField()
// qCDebug(MAVLinkMessageFieldLog) << Q_FUNC_INFO << this;
}

void QGCMAVLinkMessageField::addSeries(MAVLinkChartController *chart, QAbstractSeries *series)
void QGCMAVLinkMessageField::addSeries(MAVLinkChartController *chartController, QAbstractSeries *series)
{
if (_pSeries) {
return;
}

_chart = chart;
_chartController = chartController;
_pSeries = series;
emit seriesChanged();

Expand All @@ -58,7 +58,7 @@ void QGCMAVLinkMessageField::delSeries()
QLineSeries *const lineSeries = static_cast<QLineSeries*>(_pSeries);
lineSeries->replace(_values);
_pSeries = nullptr;
_chart = nullptr;
_chartController = nullptr;
emit seriesChanged();
_msg->updateFieldSelection();
}
Expand All @@ -78,8 +78,8 @@ void QGCMAVLinkMessageField::setSelectable(bool sel)

int QGCMAVLinkMessageField::chartIndex() const
{
if (_chart) {
return _chart->chartIndex();
if (_chartController) {
return _chartController->chartIndex();
}

return 0;
Expand All @@ -92,7 +92,7 @@ void QGCMAVLinkMessageField::updateValue(const QString &newValue, qreal v)
emit valueChanged();
}

if (!_pSeries || !_chart) {
if (!_pSeries || !_chartController) {
return;
}

Expand All @@ -109,7 +109,7 @@ void QGCMAVLinkMessageField::updateValue(const QString &newValue, qreal v)
_dataIndex++;
}

if (_chart->rangeYIndex() != 0) {
if (_chartController->rangeYIndex() != 0) {
return;
}

Expand Down Expand Up @@ -137,7 +137,7 @@ void QGCMAVLinkMessageField::updateValue(const QString &newValue, qreal v)
}

if (changed) {
_chart->updateYRange();
_chartController->updateYRange();
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/AnalyzeView/MAVLinkMessageField.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class QGCMAVLinkMessageField : public QObject
void setSelectable(bool sel);
void updateValue(const QString &newValue, qreal v);

void addSeries(MAVLinkChartController *chart, QAbstractSeries *series);
void addSeries(MAVLinkChartController *chartController, QAbstractSeries *series);
void delSeries();
void updateSeries();

Expand All @@ -75,5 +75,5 @@ class QGCMAVLinkMessageField : public QObject
QList<QPointF> _values;

QAbstractSeries *_pSeries = nullptr;
MAVLinkChartController *_chart = nullptr;
MAVLinkChartController *_chartController = nullptr;
};
Loading
Loading