diff --git a/src/main.js b/src/main.js index 1b5914e..0497bf8 100644 --- a/src/main.js +++ b/src/main.js @@ -1,6 +1,6 @@ // Vollstaendige Verdrahtung der App: Kamera, Barcode/OCR-Erkennung, Sitzung // und Oberflaeche. Ersetzt das fruehere Sichtpruefungs-Geruest vollstaendig. -import { startCamera, grabFrame, grabFrameRegion, imageDataFromFile } from './camera.js'; +import { startCamera, grabFrameRegion, imageDataFromFile } from './camera.js'; import { decodeBarcodes } from './barcode.js'; import { runOcr, isOcrAvailable } from './ocr.js'; import { recognize } from './pipeline.js'; @@ -50,7 +50,13 @@ let cameraUnavailableMessage = null; let currentModeId = null; const view = renderScanView(app, { - onCapture: () => processCapture(() => grabFrame(view.video)), + // "Modul scannen" ist nur in Funktion 3 ("Text erkennen") sichtbar (siehe + // applyMode()/setCaptureVisible) - der Zielrahmen suggeriert dem Nutzer dort + // einen Ausschnitt, den grabFrame() (Vollbild, herunterskaliert) bisher gar + // nicht einloeste. grabFrameRegion() liest genau den Rahmenausschnitt, in + // voller Aufloesung - derselbe Ausschnitt, den auch die Barcode-Dauersuche + // benutzt (siehe runSearchAttempt() weiter unten). + onCapture: () => processCapture(() => grabFrameRegion(view.video)), onUndo: () => { // Waehrend eine Erkennung laeuft, darf kein Eintrag zurueckgenommen // werden - sonst koennte die Rueckgaengig-Flaeche einen Eintrag treffen, @@ -150,7 +156,7 @@ async function processCapture(getFrame) { // selbst (pipeline.js) bleibt unveraendert und kennt keine Funktionen. const { decodeBarcodes: decode, runOcr: recognizeText } = buildRecognitionAdapters(currentModeId, { decodeBarcodes, runOcr }); - const { spec, source, confidence, codes } = await recognize( + const { spec, source, confidence, codes, rawText } = await recognize( frame, { decodeBarcodes: decode, runOcr: recognizeText, isKnownCode }, ); @@ -188,13 +194,25 @@ async function processCapture(getFrame) { if (targetSession !== session) return; const entry = commitAssignment(targetSession, spec, source, stackId, codes); + // entry.rawText ist rein additiv (siehe recognize() in pipeline.js) - + // session.js kennt das Feld nicht und bleibt deshalb unangetastet; es wird + // hier von aussen an den bereits gebuchten Eintrag angehaengt, genau wie + // die Stapelzuordnung selbst nie vom Rohtext abhaengt. + entry.rawText = rawText; view.setLast(describeEntry(spec, entry.stackId)); syncView(); // Nach einer manuellen Entscheidung im Rot-Dialog gibt es nichts mehr // rueckzumelden - der Dialog selbst war die Rueckmeldung. if (confidence !== 'red') { - await showResult(app, { stackId: entry.stackId, spec, confidence }); + // Nur in Funktion 3 ("Text erkennen") ist der erkannte Text lang genug, + // dass er gelesen werden will - dort bleibt die Rueckmeldung deshalb + // stehen, bis der Nutzer sie wegtippt, statt sich nach kurzer Zeit von + // selbst auszublenden (siehe showResult()). In den beiden Barcode- + // Funktionen zaehlt Tempo, dort bleibt es beim automatischen Ausblenden. + await showResult(app, { + stackId: entry.stackId, spec, confidence, rawText, autoHide: currentModeId !== 'ocr', + }); } } catch (error) { failed = true;