QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
MAVLinkSystem.cc
Go to the documentation of this file.
1#include "MAVLinkSystem.h"
2#include "MAVLinkMessage.h"
4
5QGC_LOGGING_CATEGORY(MAVLinkSystemLog, "AnalyzeView.MAVLinkSystem")
6
7QGCMAVLinkSystem::QGCMAVLinkSystem(quint8 id, QObject *parent)
8 : QObject(parent)
9 , _systemID(id)
10 , _messages(new QmlObjectListModel(this))
11{
12 qCDebug(MAVLinkSystemLog) << "New Vehicle:" << id;
13}
14
15QGCMAVLinkSystem::~QGCMAVLinkSystem()
16{
17 _messages->clearAndDeleteContents();
18}
19
20QGCMAVLinkMessage *QGCMAVLinkSystem::findMessage(uint32_t id, uint8_t compId)
21{
22 for (int i = 0; i < _messages->count(); i++) {
23 QGCMAVLinkMessage *const msg = qobject_cast<QGCMAVLinkMessage*>(_messages->get(i));
24 if(msg) {
25 if((msg->id() == id) && (msg->compId() == compId)) {
26 return msg;
27 }
28 }
29 }
30
31 return nullptr;
32}
33
34int QGCMAVLinkSystem::findMessage(const QGCMAVLinkMessage *message)
35{
36 for (int i = 0; i < _messages->count(); i++) {
37 const QGCMAVLinkMessage *const msg = qobject_cast<const QGCMAVLinkMessage*>(_messages->get(i));
38 if (msg && (msg == message)) {
39 return i;
40 }
41 }
42
43 return -1;
44}
45
46void QGCMAVLinkSystem::_resetSelection()
47{
48 for (int i = 0; i < _messages->count(); i++) {
49 QGCMAVLinkMessage *const msg = qobject_cast<QGCMAVLinkMessage*>(_messages->get(i));
50 if (msg && msg->selected()) {
51 msg->setSelected(false);
52 emit msg->selectedChanged();
53 }
54 }
55}
56
57void QGCMAVLinkSystem::setSelected(int sel)
58{
59 if (sel >= _messages->count()) {
60 return;
61 }
62
63 _selected = sel;
64 emit selectedChanged();
65 _resetSelection();
66 QGCMAVLinkMessage *const msg = qobject_cast<QGCMAVLinkMessage*>(_messages->get(sel));
67 if(msg && !msg->selected()) {
68 msg->setSelected(true);
69 emit msg->selectedChanged();
70 }
71}
72
73QGCMAVLinkMessage *QGCMAVLinkSystem::selectedMsg()
74{
75 QGCMAVLinkMessage *selectedMsg = nullptr;
76 if (_messages->count()) {
77 selectedMsg = qobject_cast<QGCMAVLinkMessage*>(_messages->get(_selected));
78 }
79
80 return selectedMsg;
81}
82
83static bool messages_sort(const QObject *a, const QObject *b)
84{
85 const QGCMAVLinkMessage *const aa = qobject_cast<const QGCMAVLinkMessage*>(a);
86 const QGCMAVLinkMessage *const bb = qobject_cast<const QGCMAVLinkMessage*>(b);
87 if (!aa || !bb) {
88 return false;
89 }
90
91 if (aa->name() == bb->name()) {
92 return (aa->name() < bb->name());
93 }
94
95 return (aa->name() < bb->name());
96}
97
98void QGCMAVLinkSystem::append(QGCMAVLinkMessage *message)
99{
100 QGCMAVLinkMessage *selectedMsg = nullptr;
101 if (_messages->count()) {
102 selectedMsg = qobject_cast<QGCMAVLinkMessage*>(_messages->get(_selected));
103 } else {
104 message->setSelected(true);
105 }
106 _messages->append(message);
107
108 if (_messages->count() > 0) {
109 _messages->beginResetModel();
110 std::sort(_messages->objectList()->begin(), _messages->objectList()->end(), messages_sort);
111 _messages->endResetModel();
112 _checkCompID(message);
113 }
114
115 if (selectedMsg) {
116 const int idx = findMessage(selectedMsg);
117 if (idx >= 0) {
118 _selected = idx;
119 emit selectedChanged();
120 }
121 }
122}
123
124void QGCMAVLinkSystem::_checkCompID(const QGCMAVLinkMessage *message)
125{
126 if (_compIDsStr.isEmpty()) {
127 _compIDsStr << tr("Comp All");
128 }
129
130 if (!_compIDs.contains(static_cast<int>(message->compId()))) {
131 const int compId = static_cast<int>(message->compId());
132 _compIDs.append(compId);
133 _compIDsStr << tr("Comp %1").arg(compId);
134 emit compIDsChanged();
135 }
136}
static bool messages_sort(const QObject *a, const QObject *b)
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void endResetModel()
Depth-counted endResetModel — only the outermost call has effect.
void beginResetModel()
Depth-counted beginResetModel — only the outermost call has effect.
void selectedChanged()
void append(QObject *object)
Caller maintains responsibility for object ownership and deletion.
QObject * get(int index)
int count() const override final
void clearAndDeleteContents() override final
Clears the list and calls deleteLater on each entry.
QList< QObject * > * objectList()