From 64e2ceb7c3eacf9dd5501b20cc4b815e520ec726 Mon Sep 17 00:00:00 2001 From: andz-bb Date: Fri, 7 Jul 2023 18:06:55 +0100 Subject: [PATCH] add scanner beep on successful qr/barcode scan --- packages/client/manifest.json | 40 +++++++++++++++++++ .../components/app/forms/CodeScanner.svelte | 30 ++++++++++++++ .../app/forms/CodeScannerField.svelte | 6 +++ 3 files changed, 76 insertions(+) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 212042d3c0..90fbca0fe2 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -3172,6 +3172,46 @@ "key": "allowManualEntry", "defaultValue": false }, + { + "type": "boolean", + "label": "Play sound on scan", + "key": "beepOnScan", + "defaultValue": false + }, + { + "type": "select", + "label": "Sound pitch", + "key": "beepFrequency", + "dependsOn": "beepOnScan", + "defaultValue": 2637, + "options": [ + { + "label": "Low", + "value": 2096 + }, + { + "label": "Regular", + "value": 2637 + }, + { + "label": "High", + "value": 3136 + }, + { "label": "Custom", "value": "custom" } + ] + }, + { + "type": "number", + "label": "Sound frequency (Hz)", + "key": "customFrequency", + "defaultValue": 1046, + "min": 20, + "max": 8000, + "dependsOn": { + "setting": "beepFrequency", + "value": "custom" + } + }, { "type": "validation/string", "label": "Validation", diff --git a/packages/client/src/components/app/forms/CodeScanner.svelte b/packages/client/src/components/app/forms/CodeScanner.svelte index 5dff3a96fa..9895413446 100644 --- a/packages/client/src/components/app/forms/CodeScanner.svelte +++ b/packages/client/src/components/app/forms/CodeScanner.svelte @@ -8,6 +8,10 @@ export let disabled = false export let allowManualEntry = false export let scanButtonText = "Scan code" + export let beepOnScan = false + export let beepFrequency = 2637 + export let customFrequency = 1046 + const dispatch = createEventDispatcher() let videoEle @@ -21,8 +25,13 @@ fps: 25, qrbox: { width: 250, height: 250 }, } + const audioCtx = new (window.AudioContext || window.webkitAudioContext)() + const onScanSuccess = decodedText => { if (value != decodedText) { + if (beepOnScan) { + beep() + } dispatch("change", decodedText) } } @@ -84,6 +93,27 @@ } camModal.hide() } + + const beep = () => { + const oscillator = audioCtx.createOscillator() + const gainNode = audioCtx.createGain() + + oscillator.connect(gainNode) + gainNode.connect(audioCtx.destination) + + const frequency = + beepFrequency === "custom" ? customFrequency : beepFrequency + oscillator.frequency.value = frequency + oscillator.type = "square" + + const duration = 420 + const endTime = audioCtx.currentTime + duration / 1000 + gainNode.gain.setValueAtTime(1, audioCtx.currentTime) + gainNode.gain.exponentialRampToValueAtTime(0.001, endTime) + + oscillator.start() + oscillator.stop(endTime) + }
diff --git a/packages/client/src/components/app/forms/CodeScannerField.svelte b/packages/client/src/components/app/forms/CodeScannerField.svelte index 7e020aa9c7..c408f78d7c 100644 --- a/packages/client/src/components/app/forms/CodeScannerField.svelte +++ b/packages/client/src/components/app/forms/CodeScannerField.svelte @@ -11,6 +11,9 @@ export let onChange export let allowManualEntry export let scanButtonText + export let beepOnScan + export let beepFrequency + export let customFrequency let fieldState let fieldApi @@ -42,6 +45,9 @@ disabled={fieldState.disabled} {allowManualEntry} scanButtonText={scanText} + {beepOnScan} + {beepFrequency} + {customFrequency} /> {/if}