offline track

This commit is contained in:
2026-06-22 11:00:36 +03:00
parent d4a1513a97
commit 6d1b5cf333
2 changed files with 206 additions and 43 deletions
+51 -4
View File
@@ -332,7 +332,7 @@
</div>
<div id="qualityVizPanel">
<div class="quality-viz-box">
<div class="quality-viz-title">RX Quality vs расстояние TX↔RX (распределение по отрезкам)</div>
<div class="quality-viz-title">RX Quality vs расстояние TX↔RX · колёсико — шаг шкалы</div>
<canvas id="qualityDistCanvas" width="800" height="140"></canvas>
</div>
</div>
@@ -1191,7 +1191,13 @@
const quality = rxQualityFromMeta(rxPos.meta);
if (quality == null) continue;
const distM = haversineM(txPos.lat, txPos.lon, rxPos.lat, rxPos.lon);
samples.push({ distM, quality });
samples.push({
distM,
quality,
stepIndex: i,
progress: cursor.progress,
t: cursor.t,
});
}
return samples;
}
@@ -1203,12 +1209,52 @@
timelineLinkRxPos.lat, timelineLinkRxPos.lon);
}
function currentQualityActiveSample() {
if (!qualitySamplesCache.length) return null;
const cursor = timelineCursor();
if (cursor.progress != null) {
let best = null;
let bestD = Infinity;
for (const s of qualitySamplesCache) {
if (s.progress == null) continue;
const d = Math.abs(s.progress - cursor.progress);
if (d < bestD) {
bestD = d;
best = s;
}
}
return best;
}
if (cursor.t != null) {
let best = null;
let bestD = Infinity;
for (const s of qualitySamplesCache) {
if (s.t == null) continue;
const d = Math.abs(s.t - cursor.t);
if (d < bestD) {
bestD = d;
best = s;
}
}
return best;
}
return null;
}
function qualityChartOptions() {
return {
highlightDist: currentTimelineLinkDist(),
activeSample: currentQualityActiveSample(),
meterStep: QualityViz.getMeterStep(),
};
}
function redrawQualityDistHighlight() {
if (!dualTracksActive) return;
const distCanvas = document.getElementById('qualityDistCanvas');
if (!distCanvas) return;
QualityViz.drawQualityDistChart(
distCanvas, qualitySamplesCache, qualityColor, currentTimelineLinkDist());
distCanvas, qualitySamplesCache, qualityColor, qualityChartOptions());
}
function rebuildQualityViz() {
@@ -1220,8 +1266,9 @@
}
qualitySamplesCache = buildQualitySamples();
const distCanvas = document.getElementById('qualityDistCanvas');
QualityViz.attachInteractions(distCanvas, () => redrawQualityDistHighlight());
QualityViz.drawQualityDistChart(
distCanvas, qualitySamplesCache, qualityColor, currentTimelineLinkDist());
distCanvas, qualitySamplesCache, qualityColor, qualityChartOptions());
panel?.classList.add('visible');
}