Skip to content
Closed
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
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ find_package(Qt6
${QGC_QT_MINIMUM_VERSION}...${QGC_QT_MAXIMUM_VERSION}
REQUIRED
COMPONENTS
Charts
Graphs
Concurrent
Core
Core5Compat
Expand Down
105 changes: 69 additions & 36 deletions src/AnalyzeView/MAVLinkInspector/MAVLinkChart.qml
Original file line number Diff line number Diff line change
@@ -1,87 +1,120 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import QtCharts
import QtGraphs

import QGroundControl
import QGroundControl.Controls

ChartView {
GraphsView {
id: chartView
theme: ChartView.ChartThemeDark
antialiasing: true
animationOptions: ChartView.NoAnimation
legend.visible: false
backgroundColor: qgcPal.window
backgroundRoundness: 0
margins.bottom: ScreenTools.defaultFontPixelHeight * 1.5
margins.top: chartHeader.height + (ScreenTools.defaultFontPixelHeight * 2)
marginBottom: ScreenTools.defaultFontPixelHeight * 1.5
marginTop: chartHeader.height + (ScreenTools.defaultFontPixelHeight * 2)
marginLeft: 0
marginRight: 0
visible: chartController.chartFields.length > 0

required property var inspectorController
required property int chartIndex

property var _seriesColors: ["#00E04B","#DE8500","#F32836","#BFBFBF","#536DFF","#EECC44"]

Component {
id: lineSeriesComponent
LineSeries { }
}

function addDimension(field) {
var color = _seriesColors[chartView.count]
var serie = createSeries(ChartView.SeriesTypeLine, field.label)
serie.axisX = axisX
serie.axisY = axisY
serie.useOpenGL = QGroundControl.videoManager.gstreamerEnabled // Details on why here: https://github.com/mavlink/qgroundcontrol/issues/13068
serie.color = color
serie.width = 1
var color = _seriesColors[chartView.seriesList.length]
var serie = lineSeriesComponent.createObject(chartView, {color: color, width: 1})
chartView.addSeries(serie)
chartController.addSeries(field, serie)
}

function delDimension(field) {
if(chartController) {
chartView.removeSeries(field.series)
chartController.delSeries(field)
for (var i = 0; i < chartView.seriesList.length; i++) {
if (chartView.seriesList[i] === field.series) {
var s = chartView.seriesList[i]
chartView.removeSeries(i)
chartController.delSeries(field)
s.destroy()
break
}
}
}
}

function roomForNewDimension() {
return chartController.chartFields.length < _seriesColors.length
}

theme: GraphsTheme {
colorScheme: GraphsTheme.ColorScheme.Dark
backgroundColor: qgcPal.window
backgroundVisible: true
plotAreaBackgroundColor: qgcPal.window
grid.mainColor: Qt.rgba(qgcPal.text.r, qgcPal.text.g, qgcPal.text.b, 0.3)
grid.subColor: Qt.rgba(qgcPal.text.r, qgcPal.text.g, qgcPal.text.b, 0.15)
grid.mainWidth: 1
labelBackgroundVisible: false
labelTextColor: qgcPal.text
axisXLabelFont.family: ScreenTools.fixedFontFamily
axisXLabelFont.pointSize: ScreenTools.smallFontPointSize
axisYLabelFont.family: ScreenTools.fixedFontFamily
axisYLabelFont.pointSize: ScreenTools.smallFontPointSize
}

MAVLinkChartController {
id: chartController
inspectorController: chartView.inspectorController
chartIndex: chartView.chartIndex
}

DateTimeAxis {
axisX: ValueAxis {
id: axisX
min: chartController ? chartController.rangeXMin : new Date()
max: chartController ? chartController.rangeXMax : new Date()
min: chartController ? chartController.rangeXMin : 0
max: chartController ? chartController.rangeXMax : 1
visible: chartController !== null
format: "<br/>mm:ss.zzz"
tickCount: 5
gridVisible: true
labelsFont.family: ScreenTools.fixedFontFamily
labelsFont.pointSize: ScreenTools.smallFontPointSize
labelsColor: qgcPal.text
tickInterval: chartController ? chartController.rangeXMs / 3 : 5000
subTickCount: 0
labelsVisible: true
labelDelegate: Component {
Item {
property string text
implicitWidth: label.implicitWidth
implicitHeight: label.implicitHeight
Text {
id: label
text: {
var ms = parseFloat(parent.text)
if (isNaN(ms)) return parent.text
var d = new Date(ms)
return d.getMinutes().toString().padStart(2, '0') + ":" + d.getSeconds().toString().padStart(2, '0')
}
color: qgcPal.text
font.family: ScreenTools.fixedFontFamily
font.pointSize: ScreenTools.smallFontPointSize
}
}
}
}

ValueAxis {
axisY: ValueAxis {
id: axisY
min: chartController ? chartController.rangeYMin : 0
max: chartController ? chartController.rangeYMax : 0
visible: chartController !== null
lineVisible: false
labelsFont.family: ScreenTools.fixedFontFamily
labelsFont.pointSize: ScreenTools.smallFontPointSize
labelsColor: qgcPal.text
}

Row {
id: chartHeader
anchors.left: parent.left
anchors.left: parent ? parent.left : undefined
anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 4
anchors.right: parent.right
anchors.right: parent ? parent.right : undefined
anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 4
anchors.top: parent.top
anchors.top: parent ? parent.top : undefined
anchors.topMargin: ScreenTools.defaultFontPixelHeight * 1.5
spacing: ScreenTools.defaultFontPixelWidth * 2
visible: chartController !== null
Expand Down Expand Up @@ -123,7 +156,7 @@ ChartView {
model: chartController ? chartController.chartFields : []
QGCLabel {
text: modelData.label
color: chartView.series(index).color
color: index < chartView.seriesList.length ? chartView.seriesList[index].color : qgcPal.text
font.pointSize: ScreenTools.smallFontPointSize
}
}
Expand Down
18 changes: 11 additions & 7 deletions src/AnalyzeView/MAVLinkInspector/MAVLinkChartController.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@
#include "QGCApplication.h"
#include "QGCLoggingCategory.h"

#include <QtCharts/QAbstractSeries>
#include <QtGraphs/QAbstractSeries>
#include <QtCore/QTimer>

Q_DECLARE_METATYPE(QAbstractSeries*)

QGC_LOGGING_CATEGORY(MAVLinkChartControllerLog, "AnalyzeView.MAVLinkChartController")

MAVLinkChartController::MAVLinkChartController(QObject *parent)
Expand All @@ -17,8 +15,6 @@ MAVLinkChartController::MAVLinkChartController(QObject *parent)
{
// qCDebug(MAVLinkChartControllerLog) << Q_FUNC_INFO << this;

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

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

Expand Down Expand Up @@ -61,6 +57,14 @@ void MAVLinkChartController::setRangeYIndex(quint32 index)
}
}

qreal MAVLinkChartController::rangeXMs() const
{
if (_rangeXIndex < static_cast<quint32>(_inspectorController->timeScaleSt().count())) {
return static_cast<qreal>(_inspectorController->timeScaleSt()[static_cast<int>(_rangeXIndex)]->timeScale);
}
return 5000.0;
}

void MAVLinkChartController::setRangeXIndex(quint32 index)
{
if (index == _rangeXIndex) {
Expand All @@ -80,10 +84,10 @@ void MAVLinkChartController::updateXRange()
}

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

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

Expand Down
16 changes: 9 additions & 7 deletions src/AnalyzeView/MAVLinkInspector/MAVLinkChartController.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,18 @@ class MAVLinkChartController : public QObject
QML_ELEMENT
Q_MOC_INCLUDE("MAVLinkInspectorController.h")
Q_MOC_INCLUDE("MAVLinkMessageField.h")
Q_MOC_INCLUDE("QtCharts/qabstractseries.h")
Q_MOC_INCLUDE("QtGraphs/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 rangeXMin READ rangeXMin NOTIFY rangeXMinChanged)
Q_PROPERTY(qreal rangeXMax READ rangeXMax NOTIFY rangeXMaxChanged)
Q_PROPERTY(qreal rangeYMin READ rangeYMin NOTIFY rangeYMinChanged)
Q_PROPERTY(qreal rangeYMax READ rangeYMax NOTIFY rangeYMaxChanged)
Q_PROPERTY(quint32 rangeYIndex READ rangeYIndex WRITE setRangeYIndex NOTIFY rangeYIndexChanged)
Q_PROPERTY(quint32 rangeXIndex READ rangeXIndex WRITE setRangeXIndex NOTIFY rangeXIndexChanged)
Q_PROPERTY(qreal rangeXMs READ rangeXMs NOTIFY rangeXIndexChanged)


public:
Expand All @@ -42,11 +43,12 @@ class MAVLinkChartController : public QObject
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 rangeXMin() const { return _rangeXMin; }
qreal rangeXMax() const { return _rangeXMax; }
qreal rangeYMin() const { return _rangeYMin; }
qreal rangeYMax() const { return _rangeYMax; }
quint32 rangeXIndex() const { return _rangeXIndex; }
qreal rangeXMs() const;
quint32 rangeYIndex() const { return _rangeYIndex; }
int chartIndex() const { return _chartIndex; }

Expand All @@ -72,8 +74,8 @@ private slots:
MAVLinkInspectorController *_inspectorController = nullptr;
QTimer *_updateSeriesTimer = nullptr;

QDateTime _rangeXMin;
QDateTime _rangeXMax;
qreal _rangeXMin = 0;
qreal _rangeXMax = 0;
qreal _rangeYMin = 0;
qreal _rangeYMax = 1;
quint32 _rangeXIndex = 0; ///< 5 Seconds
Expand Down
2 changes: 1 addition & 1 deletion src/AnalyzeView/MAVLinkInspector/MAVLinkInspectorPage.qml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import QtQuick.Controls
import QtQuick.Layouts
import QtQuick.Dialogs
import QtQuick.Window
import QtCharts
import QtGraphs

import QGroundControl
import QGroundControl.Controls
Expand Down
4 changes: 2 additions & 2 deletions src/AnalyzeView/MAVLinkInspector/MAVLinkMessageField.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
#include "QGCApplication.h"
#include "QGCLoggingCategory.h"

#include <QtCharts/QLineSeries>
#include <QtCharts/QAbstractSeries>
#include <QtGraphs/QLineSeries>
#include <QtGraphs/QAbstractSeries>

QGC_LOGGING_CATEGORY(MAVLinkMessageFieldLog, "AnalyzeView.MAVLinkMessageField")

Expand Down
2 changes: 1 addition & 1 deletion src/AnalyzeView/MAVLinkInspector/MAVLinkMessageField.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class QGCMAVLinkMessageField : public QObject
{
Q_OBJECT
// QML_ELEMENT
Q_MOC_INCLUDE(<QtCharts/QAbstractSeries>)
Q_MOC_INCLUDE(<QtGraphs/QAbstractSeries>)
Q_PROPERTY(QString name READ name CONSTANT)
Q_PROPERTY(QString label READ label CONSTANT)
Q_PROPERTY(QString type READ type CONSTANT)
Expand Down
4 changes: 2 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ target_include_directories(${CMAKE_PROJECT_NAME}
target_link_libraries(${CMAKE_PROJECT_NAME}
PRIVATE
# Qt6 Core
Qt6::Charts
Qt6::Graphs
Qt6::Concurrent
Qt6::Core
Qt6::Core5Compat
Expand All @@ -102,7 +102,7 @@ target_link_libraries(${CMAKE_PROJECT_NAME}
Qt6::StateMachine
Qt6::Svg
Qt6::TextToSpeech
Qt6::Widgets
Qt6::Widgets # Only for Platform.cc pre-startup error dialogs (QMessageBox)
Qt6::Xml

# Qt6 QML/Quick
Expand Down
Loading
Loading