diff --git a/mainwindow.cpp b/mainwindow.cpp index e817991..a91df7f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1479,6 +1479,7 @@ void MainWindow::initializeDummyData(){ cd.ackTimestamp = i == 1 ? dt.addSecs(-900) : QDateTime{}; cd.utcTimestamp = dt; cd.grid = i == 5 ? "J042" : i == 6 ? " FN42FN42FN" : ""; + cd.tdrift = 0.1*i; logCallActivity(cd, false); ActivityDetail ad = {}; @@ -3667,6 +3668,7 @@ void MainWindow::readFromStdout() //readFromStdout cmd.grid = cd.grid; cmd.freq = cd.freq; cmd.utcTimestamp = cd.utcTimestamp; + cmd.tdrift = cd.tdrift; m_rxCommandQueue.append(cmd); } @@ -3709,6 +3711,7 @@ void MainWindow::readFromStdout() //readFromStdout cmdcd.freq = cmd.freq; cmdcd.utcTimestamp = cmd.utcTimestamp; cmdcd.ackTimestamp = cmd.to == m_config.my_callsign() ? cmd.utcTimestamp : QDateTime{}; + cmdcd.tdrift = cmd.tdrift; logCallActivity(cmdcd, false); } @@ -3740,7 +3743,8 @@ void MainWindow::readFromStdout() //readFromStdout td.snr = snr; td.freq = cmd.freq; td.utcTimestamp = cmd.utcTimestamp; - m_callActivity[relayCall] = td; + td.tdrift = cmd.tdrift; + logCallActivity(td, true); } } #endif @@ -4973,6 +4977,8 @@ void MainWindow::clearActivity(){ m_rxCommandQueue.clear(); m_lastTxMessage.clear(); + resetTimeDeltaAverage(); + clearTableWidget(ui->tableWidgetCalls); createAllcallTableRows(ui->tableWidgetCalls, ""); @@ -7074,11 +7080,13 @@ void MainWindow::on_driftSyncEndButton_clicked(){ void MainWindow::on_driftSyncResetButton_clicked(){ setDrift(0); + resetTimeDeltaAverage(); } void MainWindow::setDrift(int n){ DriftingDateTime::setDrift(n); + qDebug() << qSetRealNumberPrecision(12) << "Average delta:" << m_timeDeltaMsMMA; qDebug() << qSetRealNumberPrecision(12) << "Drift milliseconds:" << n; qDebug() << qSetRealNumberPrecision(12) << "Clock time:" << QDateTime::currentDateTimeUtc(); qDebug() << qSetRealNumberPrecision(12) << "Drifted time:" << DriftingDateTime::currentDateTimeUtc(); @@ -8230,6 +8238,25 @@ void MainWindow::processActivity(bool force) { m_rxDirty = false; } +void MainWindow::observeTimeDeltaForAverage(float delta){ + // compute average drift + if(m_timeDeltaMsMMA_N == 0){ + m_timeDeltaMsMMA_N++; + m_timeDeltaMsMMA = (int)(delta*1000); + } else { + m_timeDeltaMsMMA_N++; + m_timeDeltaMsMMA = (((m_timeDeltaMsMMA_N-1)*m_timeDeltaMsMMA) + (int)(delta*1000))/ min(m_timeDeltaMsMMA_N, 100); + } + + // display average + ui->driftAvgLabel->setText(QString("Avg RX Drift: %1 ms").arg(m_timeDeltaMsMMA)); +} + +void MainWindow::resetTimeDeltaAverage(){ + m_timeDeltaMsMMA = 0; + m_timeDeltaMsMMA_N = 0; +} + void MainWindow::processRxActivity() { if(m_rxActivityQueue.isEmpty()){ return; @@ -8240,6 +8267,8 @@ void MainWindow::processRxActivity() { while (!m_rxActivityQueue.isEmpty()) { ActivityDetail d = m_rxActivityQueue.dequeue(); + observeTimeDeltaForAverage(d.tdrift); + // use the actual frequency and check its delta from our current frequency // meaning, if our current offset is 1502 and the d.freq is 1492, the delta is <= 10; bool shouldDisplay = abs(d.freq - freqOffset) <= NEAR_THRESHOLD_RX; @@ -8555,6 +8584,7 @@ void MainWindow::processCommandActivity() { cd.bits = d.bits; cd.ackTimestamp = d.text.contains("HEARTBEAT ACK") || toMe ? d.utcTimestamp : QDateTime{}; cd.utcTimestamp = d.utcTimestamp; + cd.tdrift = d.tdrift; logCallActivity(cd, true); // we're only responding to allcall, groupcalls, and our callsign at this point, so we'll end after logging the callsigns we've heard @@ -8788,6 +8818,7 @@ void MainWindow::processCommandActivity() { cd.freq = d.freq; cd.through = d.from; cd.utcTimestamp = DriftingDateTime::currentDateTimeUtc(); + cd.tdrift = d.tdrift; logCallActivity(cd, false); } @@ -8881,6 +8912,7 @@ void MainWindow::processCommandActivity() { cd.grid = grid; cd.snr = d.snr; cd.utcTimestamp = d.utcTimestamp; + cd.tdrift = d.tdrift; m_aprsCallCache.remove(cd.call); m_aprsCallCache.remove(APRSISClient::replaceCallsignSuffixWithSSID(cd.call, Radio::base_callsign(cd.call))); @@ -9270,7 +9302,7 @@ void MainWindow::displayBandActivity() { snrItem->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter); ui->tableWidgetRXAll->setItem(row, col++, snrItem); - auto tdriftItem = new QTableWidgetItem(QString::number(tdrift, 'f', 2)); + auto tdriftItem = new QTableWidgetItem(QString("%1 ms").arg((int)(1000*tdrift))); tdriftItem->setData(Qt::UserRole, QVariant(tdrift)); ui->tableWidgetRXAll->setItem(row, col++, tdriftItem); @@ -9480,7 +9512,7 @@ void MainWindow::displayCallActivity() { ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("(%1)").arg(since(d.utcTimestamp)))); ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1").arg(Varicode::formatSNR(d.snr)))); ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1").arg(d.freq))); - ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString::number(d.tdrift, 'f', 2))); + ui->tableWidgetCalls->setItem(row, col++, new QTableWidgetItem(QString("%1 ms").arg((int)(1000*d.tdrift)))); auto gridItem = new QTableWidgetItem(QString("%1").arg(d.grid.trimmed().left(4))); gridItem->setToolTip(d.grid.trimmed()); diff --git a/mainwindow.h b/mainwindow.h index 720edce..129cf1a 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -741,7 +741,8 @@ private: QString m_txTextDirtyLastSelectedCall; QString m_lastTxMessage; QDateTime m_lastTxTime; - + int m_timeDeltaMsMMA; + int m_timeDeltaMsMMA_N; enum Priority { PriorityLow = 10, @@ -897,6 +898,8 @@ private: void markOffsetDirected(int offset, bool isAllCall); void clearOffsetDirected(int offset); void processActivity(bool force=false); + void observeTimeDeltaForAverage(float delta); + void resetTimeDeltaAverage(); void processRxActivity(); void processCompoundActivity(); void processBufferedActivity(); diff --git a/mainwindow.ui b/mainwindow.ui index f8fdbd9..1cf06ab 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -1420,11 +1420,6 @@ QTextEdit[transmitting="true"] { Callsign - - - Offset - - Age @@ -1435,6 +1430,11 @@ QTextEdit[transmitting="true"] { SNR + + + Offset + + Time Drift @@ -2048,6 +2048,13 @@ background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #2ecc71, stop:1 #00FF 0 + + + + Avg RX Drift: 0 ms + + +