| 70 | } // namespace |
| 71 | |
| 72 | QString buildNetworkTooltip(const RadioModel& model) |
| 73 | { |
| 74 | const PanadapterStream::CategoryStats audioStats = |
| 75 | model.categoryStats(PanadapterStream::CatAudio); |
| 76 | const PanadapterStream::CategoryStats fftStats = |
| 77 | model.categoryStats(PanadapterStream::CatFFT); |
| 78 | const PanadapterStream::CategoryStats waterfallStats = |
| 79 | model.categoryStats(PanadapterStream::CatWaterfall); |
| 80 | const PanadapterStream::CategoryStats meterStats = |
| 81 | model.categoryStats(PanadapterStream::CatMeter); |
| 82 | const PanadapterStream::CategoryStats daxStats = |
| 83 | model.categoryStats(PanadapterStream::CatDAX); |
| 84 | |
| 85 | QStringList lines; |
| 86 | lines |
| 87 | << QString("Network: %1").arg(model.networkQuality()) |
| 88 | << QString("Latency (RTT): %1").arg(formatNetworkMs(model.lastPingRtt())) |
| 89 | << QString("Max RTT (session): %1").arg(formatNetworkMs(model.maxPingRtt())) |
| 90 | << QString("Packet loss (%1s): %2") |
| 91 | .arg(model.packetLossWindowSeconds()) |
| 92 | .arg(formatNetworkSeqErrors(model.packetLossWindowDrops(), |
| 93 | model.packetLossWindowPackets())) |
| 94 | << QString("Network jitter: %1").arg(formatNetworkMs(model.audioPacketJitterMs())) |
| 95 | << QString("Audio gap: %1 (max %2)") |
| 96 | .arg(formatNetworkMs(model.audioPacketGapMs()), |
| 97 | formatNetworkMs(model.audioPacketGapMaxMs())) |
| 98 | << QString("Total sequence gaps: %1") |
| 99 | .arg(formatNetworkSeqErrors(model.packetDropCount(), model.packetTotalCount())) |
| 100 | << QString("Audio: %1").arg(formatCategorySeqErrors(audioStats)) |
| 101 | << QString("FFT: %1").arg(formatCategorySeqErrors(fftStats)) |
| 102 | << QString("Waterfall: %1").arg(formatCategorySeqErrors(waterfallStats)) |
| 103 | << QString("Meters: %1").arg(formatCategorySeqErrors(meterStats)) |
| 104 | << QString("DAX: %1").arg(formatCategorySeqErrors(daxStats)) |
| 105 | << QString("UDP RX bytes: %1").arg(QLocale().formattedDataSize(model.rxBytes())) |
| 106 | << QString("UDP TX bytes: %1").arg(QLocale().formattedDataSize(model.txBytes())) |
| 107 | << "Double-click for full diagnostics"; |
| 108 | return lines.join('\n'); |
| 109 | } |
| 110 | |
| 111 | // ─── TNF tooltip ───────────────────────────────────────────────────────────── |
| 112 |
no test coverage detected