5#include <QtCore/QTimer>
6#include <QtCore/QDateTime>
11 : m_compId(componentid)
12 , m_severity(severity)
21 case MAV_SEVERITY_EMERGENCY:
22 case MAV_SEVERITY_ALERT:
23 case MAV_SEVERITY_CRITICAL:
24 case MAV_SEVERITY_ERROR:
34 , m_chunkedStatusTextTimer(new QTimer(this))
38 m_chunkedStatusTextTimer->setSingleShot(
true);
39 m_chunkedStatusTextTimer->setInterval(1000);
40 (void) connect(m_chunkedStatusTextTimer, &QTimer::timeout,
this, &StatusTextHandler::_chunkedStatusTextTimeout);
55 mavlink_statustext_t statusText;
56 mavlink_msg_statustext_decode(&message, &statusText);
58 char buffer[MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN + 1];
59 memcpy(buffer, statusText.text, MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN);
60 buffer[MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN] =
'\0';
62 return QString(buffer);
69 (void) result.prepend(message->getFormattedText());
77 qDeleteAll(m_messages);
80 if (m_criticalMessageCount != 0) {
81 m_criticalMessageCount = 0;
88 QString htmlText(text);
90 (void) htmlText.replace(
"\n",
"<br/>");
93 if (!description.isEmpty()) {
94 QString htmlDescription(description);
95 (void) htmlDescription.replace(
"\n",
"<br/>");
96 (void) htmlText.append(QStringLiteral(
"<br/><small><small>"));
97 (void) htmlText.append(htmlDescription);
98 (void) htmlText.append(QStringLiteral(
"</small></small>"));
101 if (m_activeComponent == MAV_COMPONENT::MAV_COMPONENT_ENUM_END) {
102 m_activeComponent = compId;
105 if (compId != m_activeComponent) {
115 case MAV_SEVERITY_EMERGENCY:
116 case MAV_SEVERITY_ALERT:
117 case MAV_SEVERITY_CRITICAL:
118 case MAV_SEVERITY_ERROR:
119 style = QStringLiteral(
"<#E>");
122 case MAV_SEVERITY_NOTICE:
123 case MAV_SEVERITY_WARNING:
124 style = QStringLiteral(
"<#I>");
128 style = QStringLiteral(
"<#N>");
132 QString severityText;
134 case MAV_SEVERITY_EMERGENCY:
135 severityText = tr(
"EMERGENCY");
138 case MAV_SEVERITY_ALERT:
139 severityText = tr(
"ALERT");
142 case MAV_SEVERITY_CRITICAL:
143 severityText = tr(
"Critical");
146 case MAV_SEVERITY_ERROR:
147 severityText = tr(
"Error");
150 case MAV_SEVERITY_WARNING:
151 severityText = tr(
"Warning");
154 case MAV_SEVERITY_NOTICE:
155 severityText = tr(
"Notice");
158 case MAV_SEVERITY_INFO:
159 severityText = tr(
"Info");
162 case MAV_SEVERITY_DEBUG:
163 severityText = tr(
"Debug");
167 qCWarning(StatusTextHandlerLog) << Q_FUNC_INFO <<
"Invalid MAV_SEVERITY";
173 compString = QString(
"COMP:%1").arg(compId);
176 const QString dateString = QDateTime::currentDateTime().toString(
"hh:mm:ss.zzz");
178 const QString formatText = QString(
"<font style=\"%1\">[%2 %3] %4: %5</font><br/>").arg(style, dateString, compString, severityText, htmlText);
185 (void) m_messages.append(message);
188 m_criticalMessageCount++;
196 if (message.msgid != MAVLINK_MSG_ID_STATUSTEXT) {
200 _handleStatusText(message);
205 mavlink_statustext_t statustext;
206 mavlink_msg_statustext_decode(&message, &statustext);
209 const bool includesNullTerminator = messageText.length() < MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN;
211 const MAV_COMPONENT compId =
static_cast<MAV_COMPONENT
>(message.compid);
212 if (m_chunkedStatusTextInfoMap.contains(compId) && (m_chunkedStatusTextInfoMap.value(compId).chunkId != statustext.id)) {
214 (void) m_chunkedStatusTextInfoMap.value(compId).rgMessageChunks.append(QString());
215 _chunkedStatusTextCompleted(compId);
218 if (statustext.id == 0) {
220 ChunkedStatusTextInfo_t chunkedInfo;
221 chunkedInfo.chunkId = 0;
222 chunkedInfo.severity =
static_cast<MAV_SEVERITY
>(statustext.severity);
223 (void) chunkedInfo.rgMessageChunks.append(messageText);
224 (void) m_chunkedStatusTextInfoMap.insert(compId, chunkedInfo);
226 if (m_chunkedStatusTextInfoMap.contains(compId)) {
228 QStringList& chunks = m_chunkedStatusTextInfoMap[compId].rgMessageChunks;
229 if (statustext.chunk_seq > chunks.size()) {
231 for (
size_t i = chunks.size(); i < statustext.chunk_seq; i++) {
232 (void) chunks.append(QString());
236 (void) chunks.append(messageText);
239 ChunkedStatusTextInfo_t chunkedInfo;
240 chunkedInfo.chunkId = statustext.id;
241 chunkedInfo.severity =
static_cast<MAV_SEVERITY
>(statustext.severity);
242 (void) chunkedInfo.rgMessageChunks.append(messageText);
243 (void) m_chunkedStatusTextInfoMap.insert(compId, chunkedInfo);
246 m_chunkedStatusTextTimer->start();
249 if ((statustext.id == 0) || includesNullTerminator) {
250 m_chunkedStatusTextTimer->stop();
251 _chunkedStatusTextCompleted(compId);
255void StatusTextHandler::_chunkedStatusTextTimeout()
257 for (
auto compId : m_chunkedStatusTextInfoMap.
keys()) {
258 auto& chunkedInfo = m_chunkedStatusTextInfoMap[compId];
259 (void) chunkedInfo.rgMessageChunks.append(QString());
260 _chunkedStatusTextCompleted(compId);
264void StatusTextHandler::_chunkedStatusTextCompleted(MAV_COMPONENT compId)
266 const ChunkedStatusTextInfo_t& chunkedInfo = m_chunkedStatusTextInfoMap.value(compId);
267 const MAV_SEVERITY severity = chunkedInfo.severity;
270 for (
const QString& chunk : std::as_const(chunkedInfo.rgMessageChunks)) {
271 if (chunk.isEmpty()) {
272 (void) messageText.append(tr(
" ... ",
"Indicates missing chunk from chunked STATUS_TEXT"));
274 (void) messageText.append(chunk);
278 (void) m_chunkedStatusTextInfoMap.remove(compId);
struct __mavlink_message mavlink_message_t
#define QGC_LOGGING_CATEGORY(name, categoryStr)
std::array< MsgOutKey, 4 > keys
void criticalMessageCountChanged()
StatusTextHandler(QObject *parent=nullptr)
void handleHTMLEscapedTextMessage(MAV_COMPONENT componentid, MAV_SEVERITY severity, const QString &text, const QString &description)
const QList< StatusText * > & messages() const
void newErrorMessage(QString message)
static QString getMessageText(const mavlink_message_t &message)
void mavlinkMessageReceived(const mavlink_message_t &message)
void textMessageReceived(MAV_COMPONENT componentid, MAV_SEVERITY severity, QString text, QString description)
void newFormattedMessage(QString message)
QString formattedMessages() const
bool severityIsError() const
void setFormatedText(const QString &formatedText)