mirror of
https://github.com/JS8Call-improved/JS8Call-improved
synced 2026-08-13 17:47:36 -04:00
102 lines
3.5 KiB
C++
102 lines
3.5 KiB
C++
|
|
/**
|
||
|
|
* @file processBufferedActivity.cpp
|
||
|
|
* @brief member function of the UI_Constructor class
|
||
|
|
* processes buffered MSG's in m_messageBuffer
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "JS8_UI/mainwindow.h"
|
||
|
|
|
||
|
|
void UI_Constructor::processBufferedActivity() {
|
||
|
|
if (m_messageBuffer.isEmpty())
|
||
|
|
return;
|
||
|
|
|
||
|
|
foreach (auto freq, m_messageBuffer.keys()) {
|
||
|
|
auto buffer = m_messageBuffer[freq];
|
||
|
|
|
||
|
|
// check to make sure we empty old buffers by getting the latest
|
||
|
|
// timestamp and checking to see if it's older than one minute.
|
||
|
|
auto dt = DriftingDateTime::currentDateTimeUtc().addDays(-1);
|
||
|
|
if (buffer.cmd.utcTimestamp.isValid()) {
|
||
|
|
dt = qMax(dt, buffer.cmd.utcTimestamp);
|
||
|
|
}
|
||
|
|
if (!buffer.compound.isEmpty()) {
|
||
|
|
dt = qMax(dt, buffer.compound.last().utcTimestamp);
|
||
|
|
}
|
||
|
|
if (!buffer.msgs.isEmpty()) {
|
||
|
|
dt = qMax(dt, buffer.msgs.last().utcTimestamp);
|
||
|
|
}
|
||
|
|
|
||
|
|
// if the buffer has messages older than 1 minute, and we still haven't
|
||
|
|
// closed it, let's mark it as the last frame
|
||
|
|
if (dt.secsTo(DriftingDateTime::currentDateTimeUtc()) > 60 &&
|
||
|
|
!buffer.msgs.isEmpty()) {
|
||
|
|
buffer.msgs.last().bits |= Varicode::JS8CallLast;
|
||
|
|
}
|
||
|
|
|
||
|
|
// but, if the buffer is older than 1.5 minutes, and we still haven't
|
||
|
|
// closed it, just remove it and skip
|
||
|
|
if (dt.secsTo(DriftingDateTime::currentDateTimeUtc()) > 90) {
|
||
|
|
m_messageBuffer.remove(freq);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
// if the buffer has no messages, skip
|
||
|
|
if (buffer.msgs.isEmpty()) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
// if the buffered message hasn't seen the last message, skip
|
||
|
|
if ((buffer.msgs.last().bits & Varicode::JS8CallLast) !=
|
||
|
|
Varicode::JS8CallLast) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
QString message;
|
||
|
|
foreach (auto part, buffer.msgs) {
|
||
|
|
message.append(part.text);
|
||
|
|
}
|
||
|
|
message = Varicode::rstrip(message);
|
||
|
|
|
||
|
|
QString checksum;
|
||
|
|
|
||
|
|
bool valid = false;
|
||
|
|
|
||
|
|
if (Varicode::isCommandBuffered(buffer.cmd.cmd)) {
|
||
|
|
int checksumSize = Varicode::isCommandChecksumed(buffer.cmd.cmd);
|
||
|
|
|
||
|
|
if (checksumSize == 32) {
|
||
|
|
message = Varicode::lstrip(message);
|
||
|
|
checksum = message.right(6);
|
||
|
|
message = message.left(message.length() - 7);
|
||
|
|
valid = Varicode::checksum32Valid(checksum, message);
|
||
|
|
} else if (checksumSize == 16) {
|
||
|
|
message = Varicode::lstrip(message);
|
||
|
|
checksum = message.right(3);
|
||
|
|
message = message.left(message.length() - 4);
|
||
|
|
valid = Varicode::checksum16Valid(checksum, message);
|
||
|
|
} else if (checksumSize == 0) {
|
||
|
|
valid = true;
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
valid = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (valid) {
|
||
|
|
buffer.cmd.bits |= Varicode::JS8CallLast;
|
||
|
|
buffer.cmd.text = message;
|
||
|
|
buffer.cmd.isBuffered = true;
|
||
|
|
m_rxCommandQueue.append(buffer.cmd);
|
||
|
|
} else {
|
||
|
|
qCDebug(mainwindow_js8)
|
||
|
|
<< "Buffered message failed checksum...discarding";
|
||
|
|
qCDebug(mainwindow_js8) << "Checksum:" << checksum;
|
||
|
|
qCDebug(mainwindow_js8) << "Message:" << message;
|
||
|
|
}
|
||
|
|
|
||
|
|
// regardless of valid or not, remove the "complete" buffered message
|
||
|
|
// from the buffer cache
|
||
|
|
m_messageBuffer.remove(freq);
|
||
|
|
m_lastClosedMessageBufferOffset = freq;
|
||
|
|
}
|
||
|
|
}
|