generated from Grigo/AndroidTemplate
offline track
This commit is contained in:
@@ -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');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user