Diagnoseanzeige fuer die Funktion "Zählen" ergaenzt

Der Nutzer meldet eine stark schwankende Zaehlanzeige im Livebetrieb
(3-60), obwohl dasselbe Verfahren an einem Standfoto stabil 18 liefert -
er kann aber keine Bilder hochladen und muss Messwerte daher vom
Bildschirm ablesen und durchgeben koennen.

- count-objects.js liefert additiv Zwischenwerte (Bildgroesse nach
  Normierung, Flaechen vor/nach Filterung, groesste Flaeche, typische
  Groesse, gewinnende Polaritaet) - auch bei count 0 sinnvoll belegt.
  Die eigentliche Zaehllogik bleibt unveraendert.
- count-history.js (neu): gleitender Median der letzten 9 Messungen,
  unterdrueckt einzelne Ausreisser ohne die Anzeige traege zu machen.
- main.js zeigt den Median als grosse Zahl, misst den Zeitbedarf des
  Zaehldurchlaufs und baut daraus die Diagnosezeile; der Verlauf wird
  bei jedem Funktionswechsel zurueckgesetzt.
- scan-view.js/styles.css: die grosse Zahl ist antippbar und blendet
  eine anfangs verborgene Diagnosezeile ein/aus, ohne selbst zu
  verrutschen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 08:56:26 +02:00
co-authored by Claude Opus 5
parent f0705a010c
commit d84c15e0d0
7 changed files with 509 additions and 68 deletions
+51 -7
View File
@@ -10,7 +10,11 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
<div class="camera">
<video id="preview" playsinline muted></video>
<div class="frame"></div>
<div class="count-display" id="count-display" hidden aria-live="polite"></div>
<div class="count-display" id="count-display" hidden>
<button class="count-number" id="count-number" type="button" aria-live="polite"
aria-label="Messwerte zur Zaehlung ein- oder ausblenden"></button>
<div class="count-diagnostics" id="count-diagnostics" hidden aria-live="polite"></div>
</div>
</div>
<div class="status" id="status"></div>
<button class="action capture" id="capture" hidden>Modul scannen</button>
@@ -32,6 +36,14 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
const captureEl = root.querySelector('#capture');
const modeButtonEl = root.querySelector('#mode-button');
const countDisplayEl = root.querySelector('#count-display');
const countNumberEl = root.querySelector('#count-number');
const countDiagnosticsEl = root.querySelector('#count-diagnostics');
// Ob die Diagnosezeile unter der grossen Zahl gerade eingeblendet ist -
// rein lokaler Anzeigezustand dieser Ansicht, siehe setCountVisible()
// (Zuruecksetzen beim Verlassen der Funktion "Zählen") und den Klick-
// Handler auf die grosse Zahl unten (Umschalten).
let countDiagnosticsVisible = false;
// FRAME_INSET (camera.js) ist die einzige Quelle der Rahmenmasse - sowohl
// fuer diesen sichtbaren Rahmen als auch fuer den nativen Ausschnitt
@@ -52,6 +64,16 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
if (fileEl.files[0]) onPickFile(fileEl.files[0]);
fileEl.value = '';
});
// Antippen der grossen Zahl blendet die Diagnosezeile ein, nochmaliges
// Antippen wieder aus (siehe Moduldoku zu setCount()/setCountDiagnostics()
// unten) - reiner Anzeigezustand dieser Ansicht, main.js muss davon
// nichts wissen. Die grosse Zahl selbst bleibt dabei an derselben Stelle
// stehen: die Diagnosezeile ist eigenstaendig positioniert (siehe
// styles.css), ihr Ein-/Ausblenden nimmt der Zahl nicht den Platz weg.
countNumberEl.addEventListener('click', () => {
countDiagnosticsVisible = !countDiagnosticsVisible;
countDiagnosticsEl.hidden = !countDiagnosticsVisible;
});
return {
video: root.querySelector('#preview'),
@@ -136,22 +158,44 @@ export function renderScanView(root, { onCapture, onUndo, onOpenList, onPickFile
* Blendet die grosse Zaehlanzeige ein oder aus (nur in Funktion
* "Zählen" sichtbar, siehe applyMode() in main.js). Beim Ausblenden wird
* die zuletzt angezeigte Zahl geloescht, damit beim naechsten Wechsel in
* diese Funktion nicht kurz eine veraltete Zahl aufblitzt.
* diese Funktion nicht kurz eine veraltete Zahl aufblitzt - ebenso die
* Diagnosezeile: sie faellt dabei wieder in ihren Ausgangszustand
* (verborgen, leer) zurueck, damit sie nach einem Funktionswechsel nicht
* ungefragt (weil sie beim letzten Mal offen war) oder mit veralteten
* Werten wieder auftaucht.
* @param {boolean} visible
*/
setCountVisible(visible) {
countDisplayEl.hidden = !visible;
if (!visible) countDisplayEl.textContent = '';
if (!visible) {
countNumberEl.textContent = '';
countDiagnosticsEl.textContent = '';
countDiagnosticsVisible = false;
countDiagnosticsEl.hidden = true;
}
},
/**
* Zeigt die zuletzt ermittelte Anzahl gefundener Fundstuecke (siehe
* count-objects.js) - gross und aus Armlaenge lesbar, aktualisiert sich
* mit jedem Durchlauf der Dauerzaehlung.
* Zeigt die (bereits ueber die letzten Messungen geglaettete) Anzahl
* gefundener Fundstuecke (siehe count-history.js) - gross und aus
* Armlaenge lesbar, aktualisiert sich mit jedem Durchlauf der
* Dauerzaehlung. Ein Antippen blendet die Diagnosezeile darunter ein
* oder aus (siehe Klick-Handler oben).
* @param {number} count
*/
setCount(count) {
countDisplayEl.textContent = String(count);
countNumberEl.textContent = String(count);
},
/**
* Setzt den Text der kleinen Diagnosezeile unter der grossen Zahl (siehe
* main.js fuer den genauen Wortlaut) - unabhaengig davon, ob sie gerade
* eingeblendet ist. Reine Textaktualisierung, die Sichtbarkeit steuert
* ausschliesslich der Klick auf die grosse Zahl (siehe oben).
* @param {string} text
*/
setCountDiagnostics(text) {
countDiagnosticsEl.textContent = text;
},
};
}