|
|
@@ -721,13 +721,36 @@ function renderVarvTimeline(rows) {
|
|
|
}).join("");
|
|
|
}
|
|
|
|
|
|
+function varvReflectance(c) {
|
|
|
+ const d = varvCalibData && varvCalibData.dark;
|
|
|
+ const w = varvCalibData && varvCalibData.white;
|
|
|
+ if (!d || !w) return null;
|
|
|
+ const out = {};
|
|
|
+ for (const b of VARV_BANDS) {
|
|
|
+ const s = Number(c.bands[b[0]]) || 0;
|
|
|
+ const dv = Number(d[b[0]]) || 0;
|
|
|
+ const wv = Number(w[b[0]]) || 0;
|
|
|
+ out[b[0]] = (wv - dv) > 0 ? Math.max(0, (s - dv) / (wv - dv)) : 0;
|
|
|
+ }
|
|
|
+ return out;
|
|
|
+}
|
|
|
+
|
|
|
function renderVarvSpectrum() {
|
|
|
const el = document.getElementById("chart-varv-spectrum");
|
|
|
if (!el || !varvLatest.length) { if (chartVarvSpectrum) chartVarvSpectrum.clear(); return; }
|
|
|
const c = varvLatest[Math.min(varvSelected, varvLatest.length - 1)];
|
|
|
+ const refl = varvReflectance(c);
|
|
|
const label = document.getElementById("varv-spectrum-label");
|
|
|
- if (label) label.textContent = `— ${c.ts} · ${c.rgb_hex.toUpperCase()}`;
|
|
|
+ if (label) {
|
|
|
+ label.textContent = refl
|
|
|
+ ? `— ${c.ts} · ${((c.rgb_hex_cal || c.rgb_hex) || "").toUpperCase()} · reflekteeruvus %`
|
|
|
+ : `— ${c.ts} · ${c.rgb_hex.toUpperCase()} · toored kanalid (valgusti-domineeritud)`;
|
|
|
+ }
|
|
|
if (!chartVarvSpectrum) chartVarvSpectrum = echarts.init(el, null, { renderer: "canvas" });
|
|
|
+ const data = VARV_BANDS.map((b) => ({
|
|
|
+ value: refl ? Math.round((refl[b[0]] || 0) * 1000) / 10 : (c.bands[b[0]] || 0),
|
|
|
+ itemStyle: { color: b[2] },
|
|
|
+ }));
|
|
|
chartVarvSpectrum.setOption({
|
|
|
grid: { left: 56, right: 16, top: 16, bottom: 32 },
|
|
|
xAxis: {
|
|
|
@@ -737,17 +760,18 @@ function renderVarvSpectrum() {
|
|
|
},
|
|
|
yAxis: {
|
|
|
type: "value",
|
|
|
- axisLabel: { color: cssVar("--muted") },
|
|
|
+ max: refl ? 100 : undefined,
|
|
|
+ axisLabel: {
|
|
|
+ color: cssVar("--muted"),
|
|
|
+ formatter: refl ? "{value}%" : "{value}",
|
|
|
+ },
|
|
|
splitLine: { lineStyle: { color: cssVar("--border") } },
|
|
|
},
|
|
|
tooltip: { trigger: "axis" },
|
|
|
series: [{
|
|
|
type: "bar",
|
|
|
barWidth: "62%",
|
|
|
- data: VARV_BANDS.map((b) => ({
|
|
|
- value: c.bands[b[0]] || 0,
|
|
|
- itemStyle: { color: b[2] },
|
|
|
- })),
|
|
|
+ data,
|
|
|
}],
|
|
|
}, true);
|
|
|
chartVarvSpectrum.resize();
|
|
|
@@ -871,6 +895,7 @@ async function setVarvPower(on) {
|
|
|
|
|
|
// --- Värv: kalibreerimine (tume/valge; nupud ainult sisselogitult) ---
|
|
|
let varvCalibView = false;
|
|
|
+let varvCalibData = null;
|
|
|
let varvCalibWired = false;
|
|
|
|
|
|
function varvBandSum(c) {
|
|
|
@@ -901,6 +926,7 @@ function initVarvCalibButtons() {
|
|
|
}
|
|
|
|
|
|
function renderVarvCalib(d) {
|
|
|
+ varvCalibData = d;
|
|
|
const st = document.getElementById("varv-calib-status");
|
|
|
if (st) {
|
|
|
const haveD = !!d.dark;
|
|
|
@@ -919,6 +945,7 @@ function renderVarvCalib(d) {
|
|
|
? "Kuva kalibreeritud värvi"
|
|
|
: "Kuva kalibreeritud värvi (vaja tume + valge)";
|
|
|
}
|
|
|
+ renderVarvSpectrum();
|
|
|
}
|
|
|
|
|
|
async function loadVarvCalib() {
|