6#include <QtCore/QTimeZone>
16 qCDebug(MAVLinkMessageLog) <<
this;
18 const mavlink_message_info_t *
const msgInfo = mavlink_get_message_info(&message);
20 qCWarning(MAVLinkMessageLog) << QStringLiteral(
"QGCMAVLinkMessage NULL msgInfo msgid(%1)").arg(message.msgid);
24 _name = QString(msgInfo->name);
25 qCDebug(MAVLinkMessageLog) <<
"New Message:" << _name;
27 for (
unsigned int i = 0; i < msgInfo->num_fields; ++i) {
28 QString type = QStringLiteral(
"?");
29 switch (msgInfo->fields[i].type) {
30 case MAVLINK_TYPE_CHAR: type = QString(
"char");
break;
31 case MAVLINK_TYPE_UINT8_T: type = QString(
"uint8_t");
break;
32 case MAVLINK_TYPE_INT8_T: type = QString(
"int8_t");
break;
33 case MAVLINK_TYPE_UINT16_T: type = QString(
"uint16_t");
break;
34 case MAVLINK_TYPE_INT16_T: type = QString(
"int16_t");
break;
35 case MAVLINK_TYPE_UINT32_T: type = QString(
"uint32_t");
break;
36 case MAVLINK_TYPE_INT32_T: type = QString(
"int32_t");
break;
37 case MAVLINK_TYPE_FLOAT: type = QString(
"float");
break;
38 case MAVLINK_TYPE_DOUBLE: type = QString(
"double");
break;
39 case MAVLINK_TYPE_UINT64_T: type = QString(
"uint64_t");
break;
40 case MAVLINK_TYPE_INT64_T: type = QString(
"int64_t");
break;
44 _fields->append(field);
48QGCMAVLinkMessage::~QGCMAVLinkMessage()
52 qCDebug(MAVLinkMessageLog) <<
this;
55void QGCMAVLinkMessage::updateFieldSelection()
59 for (
int i = 0; i < _fields->
count(); ++i) {
61 if (field && field->selected()) {
67 if (sel != _fieldSelected) {
73void QGCMAVLinkMessage::updateFreq()
75 const quint64 msgCount = _count - _lastCount;
76 const qreal lastRateHz = _actualRateHz;
77 _actualRateHz = (0.2 * _actualRateHz) + (0.8 * msgCount);
79 if (_actualRateHz != lastRateHz) {
84void QGCMAVLinkMessage::setSelected(
bool sel)
86 if (sel != _selected) {
93void QGCMAVLinkMessage::setTargetRateHz(int32_t rate)
95 if (rate != _targetRateHz) {
106 if (_selected || _fieldSelected) {
113void QGCMAVLinkMessage::_updateFields()
115 const mavlink_message_info_t *msgInfo = mavlink_get_message_info(&_message);
117 qCWarning(MAVLinkMessageLog) <<
"QGCMAVLinkMessage::update NULL msgInfo msgid" << _message.msgid;
121 if (_fields->
count() !=
static_cast<int>(msgInfo->num_fields)) {
122 qCWarning(MAVLinkMessageLog) <<
"QGCMAVLinkMessage::update msgInfo field count mismatch msgid" << _message.msgid;
126 uint8_t *
const msg =
reinterpret_cast<uint8_t*
>(&_message.payload64[0]);
127 for (
unsigned int i = 0; i < msgInfo->num_fields; ++i) {
133 const unsigned int offset = msgInfo->fields[i].wire_offset;
134 const unsigned int array_length = msgInfo->fields[i].array_length;
135 static const unsigned int array_buffer_length = (MAVLINK_MAX_PAYLOAD_LEN + MAVLINK_NUM_CHECKSUM_BYTES + 7);
137 switch (msgInfo->fields[i].type) {
138 case MAVLINK_TYPE_CHAR:
139 field->setSelectable(
false);
140 if (array_length > 0) {
141 char *
const str =
reinterpret_cast<char*
>(msg + offset);
142 str[array_length - 1] =
'\0';
143 const QString v(str);
144 field->updateValue(v, 0);
146 char b = *(
reinterpret_cast<char*
>(msg + offset));
148 field->updateValue(v, 0);
151 case MAVLINK_TYPE_UINT8_T:
152 if (array_length > 0) {
153 const uint8_t *
const nums = msg + offset;
154 const QString tmp(
"%1, ");
156 for (
unsigned int j = 0; j < array_length - 1; ++j) {
157 string += tmp.arg(nums[j]);
159 string += QString::number(nums[array_length - 1]);
160 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
162 const uint8_t u = *(msg + offset);
163 field->updateValue(QString::number(u),
static_cast<qreal
>(u));
166 case MAVLINK_TYPE_INT8_T:
167 if (array_length > 0) {
168 const int8_t *
const nums =
reinterpret_cast<int8_t*
>(msg + offset);
169 const QString tmp(
"%1, ");
171 for (
unsigned int j = 0; j < array_length - 1; ++j) {
172 string += tmp.arg(nums[j]);
174 string += QString::number(nums[array_length - 1]);
175 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
177 const int8_t n = *(
reinterpret_cast<int8_t*
>(msg + offset));
178 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
181 case MAVLINK_TYPE_UINT16_T:
182 if (array_length > 0) {
183 uint16_t nums[array_buffer_length /
sizeof(uint16_t)]{};
184 (void) memcpy(nums, msg + offset,
sizeof(uint16_t) * array_length);
185 const QString tmp(
"%1, ");
187 for (
unsigned int j = 0; j < array_length - 1; ++j) {
188 string += tmp.arg(nums[j]);
190 string += QString::number(nums[array_length - 1]);
191 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
194 (void) memcpy(&n, msg + offset,
sizeof(uint16_t));
195 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
198 case MAVLINK_TYPE_INT16_T:
199 if (array_length > 0) {
200 int16_t nums[array_buffer_length /
sizeof(int16_t)]{};
201 (void) memcpy(nums, msg + offset,
sizeof(int16_t) * array_length);
202 const QString tmp(
"%1, ");
204 for (
unsigned int j = 0; j < array_length - 1; ++j) {
205 string += tmp.arg(nums[j]);
207 string += QString::number(nums[array_length - 1]);
208 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
211 memcpy(&n, msg + offset,
sizeof(int16_t));
212 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
215 case MAVLINK_TYPE_UINT32_T:
216 if (array_length > 0) {
217 uint32_t nums[array_buffer_length /
sizeof(uint32_t)]{};
218 (void) memcpy(nums, msg + offset,
sizeof(uint32_t) * array_length);
219 const QString tmp(
"%1, ");
221 for (
unsigned int j = 0; j < array_length - 1; ++j) {
222 string += tmp.arg(nums[j]);
224 string += QString::number(nums[array_length - 1]);
225 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
228 (void) memcpy(&n, msg + offset,
sizeof(uint32_t));
229 if (_message.msgid == MAVLINK_MSG_ID_SYSTEM_TIME) {
230 const QDateTime d = QDateTime::fromMSecsSinceEpoch(
static_cast<qint64
>(n), QTimeZone::utc());
231 field->updateValue(d.toString(
"HH:mm:ss"),
static_cast<qreal
>(n));
233 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
237 case MAVLINK_TYPE_INT32_T:
238 if (array_length > 0) {
239 int32_t nums[array_buffer_length /
sizeof(int32_t)]{};
240 (void) memcpy(nums, msg + offset,
sizeof(int32_t) * array_length);
241 const QString tmp(
"%1, ");
243 for (
unsigned int j = 0; j < array_length - 1; ++j) {
244 string += tmp.arg(nums[j]);
246 string += QString::number(nums[array_length - 1]);
247 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
250 (void) memcpy(&n, msg + offset,
sizeof(int32_t));
251 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
254 case MAVLINK_TYPE_FLOAT:
255 if (array_length > 0) {
256 float nums[array_buffer_length /
sizeof(float)]{};
257 (void) memcpy(nums, msg + offset,
sizeof(
float) * array_length);
258 const QString tmp(
"%1, ");
260 for (
unsigned int j = 0; j < array_length - 1; ++j) {
261 string += tmp.arg(
static_cast<double>(nums[j]));
263 string += QString::number(
static_cast<double>(nums[array_length - 1]));
264 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
267 (void) memcpy(&fv, msg + offset,
sizeof(
float));
268 field->updateValue(QString::number(
static_cast<double>(fv)),
static_cast<qreal
>(fv));
271 case MAVLINK_TYPE_DOUBLE:
272 if (array_length > 0) {
273 double nums[array_buffer_length /
sizeof(double)]{};
274 (void) memcpy(nums, msg + offset,
sizeof(
double) * array_length);
275 const QString tmp(
"%1, ");
277 for (
unsigned int j = 0; j < array_length - 1; ++j) {
278 string += tmp.arg(nums[j]);
280 string += QString::number(
static_cast<double>(nums[array_length - 1]));
281 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
284 (void) memcpy(&d, msg + offset,
sizeof(
double));
285 field->updateValue(QString::number(d),
static_cast<qreal
>(d));
288 case MAVLINK_TYPE_UINT64_T:
289 if (array_length > 0) {
290 uint64_t nums[array_buffer_length /
sizeof(uint64_t)]{};
291 (void) memcpy(nums, msg + offset,
sizeof(uint64_t) * array_length);
292 const QString tmp(
"%1, ");
294 for (
unsigned int j = 0; j < array_length - 1; ++j) {
295 string += tmp.arg(nums[j]);
297 string += QString::number(nums[array_length - 1]);
298 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
301 (void) memcpy(&n, msg + offset,
sizeof(uint64_t));
302 if(_message.msgid == MAVLINK_MSG_ID_SYSTEM_TIME) {
303 const QDateTime d = QDateTime::fromMSecsSinceEpoch(n / 1000, QTimeZone::utc());
304 field->updateValue(d.toString(
"yyyy MM dd HH:mm:ss"),
static_cast<qreal
>(n));
306 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
310 case MAVLINK_TYPE_INT64_T:
311 if (array_length > 0) {
312 int64_t nums[array_buffer_length /
sizeof(int64_t)]{};
313 (void) memcpy(nums, msg + offset,
sizeof(int64_t) * array_length);
314 const QString tmp(
"%1, ");
316 for (
unsigned int j = 0; j < array_length - 1; ++j) {
317 string += tmp.arg(nums[j]);
319 string += QString::number(nums[array_length - 1]);
320 field->updateValue(
string,
static_cast<qreal
>(nums[0]));
323 (void) memcpy(&n, msg + offset,
sizeof(int64_t));
324 field->updateValue(QString::number(n),
static_cast<qreal
>(n));
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void targetRateHzChanged()
void actualRateHzChanged()
void fieldSelectedChanged()
int count() const override final
void clearAndDeleteContents() override final
Clears the list and calls deleteLater on each entry.