From aa151c10e10018f2bbb6fd6a836df8b6cc67dad6 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Sat, 6 Oct 2018 02:55:59 -0400 Subject: [PATCH] Added drift protection in message buffers. Up to 10Hz per 15-second transmission cycles --- mainwindow.cpp | 52 +++++++++++++++++++++++++++++++++++++++----------- mainwindow.h | 1 + 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 8a50f02..dd6c5da 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3662,16 +3662,17 @@ void MainWindow::readFromStdout() //readFromStdout d.isBuffered = false; // if we have any "first" frame, and a buffer is already established, clear it... - if(((d.bits & Varicode::JS8CallFirst) == Varicode::JS8CallFirst) && m_messageBuffer.contains(d.freq/10*10)){ - qDebug() << "first message encountered, clearing existing buffer" << (d.freq/10*10); - m_messageBuffer.remove(d.freq/10*10); + int prevBufferOffset = -1; + if(((d.bits & Varicode::JS8CallFirst) == Varicode::JS8CallFirst) && hasExistingMessageBuffer(d.freq, true, &prevBufferOffset)){ + qDebug() << "first message encountered, clearing existing buffer" << prevBufferOffset; + m_messageBuffer.remove(d.freq); } // if we have a data frame, and a message buffer has been established, buffer it... - if(m_messageBuffer.contains(d.freq/10*10) && !decodedtext.isCompound() && !decodedtext.isDirectedMessage()){ - qDebug() << "buffering data" << (d.freq/10*10) << d.text; + if(hasExistingMessageBuffer(d.freq, true, &prevBufferOffset) && !decodedtext.isCompound() && !decodedtext.isDirectedMessage()){ + qDebug() << "buffering data" << d.freq << d.text; d.isBuffered = true; - m_messageBuffer[d.freq/10*10].msgs.append(d); + m_messageBuffer[d.freq].msgs.append(d); } @@ -3712,8 +3713,10 @@ void MainWindow::readFromStdout() //readFromStdout m_rxCommandQueue.append(d); } else { - qDebug() << "buffering compound call" << cd.call << cd.bits; - m_messageBuffer[cd.freq/10*10].compound.append(cd); + qDebug() << "buffering compound call" << cd.freq << cd.call << cd.bits; + + hasExistingMessageBuffer(cd.freq, true, nullptr); + m_messageBuffer[cd.freq].compound.append(cd); } } #endif @@ -3737,9 +3740,11 @@ void MainWindow::readFromStdout() //readFromStdout // if the command is a buffered command and its not the last frame OR we have from or to in a separate message (compound call) if((Varicode::isCommandBuffered(d.cmd) && (d.bits & Varicode::JS8CallLast) != Varicode::JS8CallLast) || d.from == "<....>" || d.to == "<....>"){ - qDebug() << "buffering cmd" << d.cmd << d.from << d.to; - m_messageBuffer[d.freq/10*10].cmd = d; - m_messageBuffer[d.freq/10*10].msgs.clear(); + qDebug() << "buffering cmd" << d.freq << d.cmd << d.from << d.to; + + hasExistingMessageBuffer(d.freq, true, nullptr); + m_messageBuffer[d.freq].cmd = d; + m_messageBuffer[d.freq].msgs.clear(); } else { m_rxCommandQueue.append(d); } @@ -3925,6 +3930,31 @@ void MainWindow::readFromStdout() //readFromStdout } +bool MainWindow::hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset){ + if(m_messageBuffer.contains(offset)){ + if(pPrevOffset) *pPrevOffset = offset; + return true; + } + + QList offsets = { + offset - 1, offset - 2, offset - 3, offset - 4, offset - 5, offset - 6, offset - 7, offset - 8, offset - 9, offset - 10, + offset + 1, offset + 2, offset + 3, offset + 4, offset + 5, offset + 6, offset + 7, offset + 8, offset + 9, offset + 10 + }; + foreach(int prevOffset, offsets){ + if(!m_messageBuffer.contains(prevOffset)){ continue; } + + if(drift){ + m_messageBuffer[offset] = m_messageBuffer[prevOffset]; + m_messageBuffer.remove(prevOffset); + } + + if(pPrevOffset) *pPrevOffset = prevOffset; + return true; + } + + return false; +} + void MainWindow::logCallActivity(CallDetail d, bool spot){ if(m_callActivity.contains(d.call)){ // update (keep grid) diff --git a/mainwindow.h b/mainwindow.h index 8392a66..848a479 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -132,6 +132,7 @@ public slots: void msgAvgDecode2(); void fastPick(int x0, int x1, int y); + bool hasExistingMessageBuffer(int offset, bool drift, int *pPrevOffset); void logCallActivity(CallDetail d, bool spot=true); QString lookupCallInCompoundCache(QString const &call); void cacheActivity(QString key);