fix: clarify snapshot and calibration controls

This commit is contained in:
Codex
2026-08-28 18:59:18 +09:00
parent 256558e601
commit 713debaf9b
2 changed files with 15 additions and 3 deletions
+6 -3
View File
@@ -1,4 +1,5 @@
import { evaluateDasBand, exportBandEvaluation } from "/packages/acoustics-core/evaluation.js"; import { evaluateDasBand, exportBandEvaluation } from "/packages/acoustics-core/evaluation.js";
import { DEFAULT_MAX_COMPENSATION_DB } from "/packages/acoustics-core/frequency-response.js";
import { downloadJson, readJsonFile } from "/packages/contracts/io.js"; import { downloadJson, readJsonFile } from "/packages/contracts/io.js";
import { import {
validateArrayDefinition, validateArrayDefinition,
@@ -405,10 +406,12 @@ function renderAcousticSummary() {
const responseCurveCount = state.arrayDefinition.microphones.filter( const responseCurveCount = state.arrayDefinition.microphones.filter(
(microphone) => microphone.frequencyResponse?.length >= 2, (microphone) => microphone.frequencyResponse?.length >= 2,
).length; ).length;
const maxCompensationDb =
state.experiment.beamforming.maxCompensationDb ?? DEFAULT_MAX_COMPENSATION_DB;
const responseMode = const responseMode =
state.experiment.beamforming.compensateFrequencyResponse === false state.experiment.beamforming.compensateFrequencyResponse === false
? "응답 역보정 꺼짐" ? "응답 역보정 꺼짐"
: "알려진 응답 역보정"; : "알려진 응답 역보정 ≤ " + formatNumber(maxCompensationDb, 0) + " dB";
elements.acousticEnvironmentSummary.textContent = elements.acousticEnvironmentSummary.textContent =
profileLabels[profile] + " · 수신점당 최대 " + profileLabels[profile] + " · 수신점당 최대 " +
maximumSparsePathsPerReceiver(state.scene) + "개 sparse path · 응답 curve " + maximumSparsePathsPerReceiver(state.scene) + "개 sparse path · 응답 curve " +
@@ -894,7 +897,7 @@ function applyValidation(validation) {
if (!state.active) { if (!state.active) {
elements.runButton.disabled = !validation.valid; elements.runButton.disabled = !validation.valid;
if (validation.valid) { if (validation.valid) {
elements.runButton.textContent = state.lastRun ? "▶ 다시 실행" : "▶ 기본 예제 실행"; elements.runButton.textContent = state.lastRun ? "▶ 다시 실행" : "▶ Snapshot 실행";
if (!state.lastRun && document.documentElement.dataset.runState === "idle") { if (!state.lastRun && document.documentElement.dataset.runState === "idle") {
setRunStatus( setRunStatus(
`${state.arrayDefinition.microphones.length} ch · ` + `${state.arrayDefinition.microphones.length} ch · ` +
@@ -1143,7 +1146,7 @@ async function runSimulation() {
activity.worker?.terminate(); activity.worker?.terminate();
if (state.active === activity) state.active = null; if (state.active === activity) state.active = null;
setConfigurationLocked(false); setConfigurationLocked(false);
elements.runButton.textContent = state.lastRun ? "▶ 다시 실행" : "▶ 기본 예제 실행"; elements.runButton.textContent = state.lastRun ? "▶ 다시 실행" : "▶ Snapshot 실행";
renderBandEditors(); renderBandEditors();
await validateCurrent(); await validateCurrent();
} }
+9
View File
@@ -86,6 +86,10 @@ test("Acoustic Camera가 8×8 CPU 실행·결과 저장·stale·재실행 흐름
documentObject.querySelector("#acoustic-environment-summary").textContent.includes("sparse path"), documentObject.querySelector("#acoustic-environment-summary").textContent.includes("sparse path"),
"bounded acoustic cost is visible", "bounded acoustic cost is visible",
); );
assert(
documentObject.querySelector("#acoustic-environment-summary").textContent.includes("≤ 24 dB"),
"safe inverse-response boost limit is visible",
);
const canvas = documentObject.querySelector("#scene-canvas"); const canvas = documentObject.querySelector("#scene-canvas");
await waitFor(() => canvas.width > 0 && canvas.height > 0, "scene canvas 초기 렌더"); await waitFor(() => canvas.width > 0 && canvas.height > 0, "scene canvas 초기 렌더");
@@ -103,6 +107,11 @@ test("Acoustic Camera가 8×8 CPU 실행·결과 저장·stale·재실행 흐름
!documentObject.querySelector("#run-button").disabled, !documentObject.querySelector("#run-button").disabled,
"8×8 CPU 입력 검증", "8×8 CPU 입력 검증",
); );
assertEqual(
documentObject.querySelector("#run-button").textContent.trim(),
"▶ Snapshot 실행",
"snapshot label survives runtime validation",
);
assertEqual(documentObject.querySelector("#grid-preset").value, "custom", "custom grid preset"); assertEqual(documentObject.querySelector("#grid-preset").value, "custom", "custom grid preset");
assert( assert(
documentObject.documentElement.dataset.unsavedWork.includes("Experiment"), documentObject.documentElement.dataset.unsavedWork.includes("Experiment"),