qrcodedetector.js 2.6 KB
import ARCS from '../engine/arcs.js';

let QRCodeDetector;
QRCodeDetector = ARCS.Component.create(
    function() {
        let self = this;
        
        let makeFromJSQR = function(code) {
            return {
                id: code.data,
                corners: [
                    code.location.topLeftCorner,
                    code.location.topRightCorner,
                    code.location.bottomRightCorner,
                    code.location.bottomLeftCorner                
                ]                
            };            
        };
        
        let makeFromBarcodeReader = function(code) {
            return {
                id: code.rawValue,
                corners: [
                    code.cornerPoints[3],
                    code.cornerPoints[2],
                    code.cornerPoints[1],
                    code.cornerPoints[0]
                ]
            };
        };
        
        
        if (window.BarcodeDetector) {
            let detector = new BarcodeDetector();
                        
            this.detect= async function(imageData) {
                let codes = await detector.detect(imageData);
                for(const code of codes) {
                    if (code.format === 'qr_code') {
                        this.emit('onQRCode', [ makeFromBarcodeReader(code)]);                        
                    }                    
                }
            };
        } else {        
            let busy = false;
            let dataCache = null;

            const worker = new Worker('../../deps/jsqr/worker.js');
            worker.addEventListener("message", ((data) => {
                busy = false;
                dataCache = data.data;
            }));
            
            this.detect= function(imageData) {
                if (!busy) {
                    busy = true;
                    worker.postMessage(imageData);
                } 
                if (dataCache !== null) {
                    console.log("qrdata", makeFromJSQR(dataCache));
                    this.emit('onQRCode', [makeFromJSQR(dataCache)]);
                }            
            };
        }
    },
    ['detect'],
    ['onQRCode']    
);

export default {QRCodeDetector: QRCodeDetector};

/*
ARCS.__lib__`
{
    "components": {
        "QRCodeDetector": {
            "description": "Detect QR codes in an image",
            "keywords": [
                "qr",
                "code",
                "detector"
            ]
        }
    },
    "dependencies": [ "jsqr"],
    "recipes": [
        { "from": "node_modules/jsqr/dist/jsQR.js", "to": "deps/jsqr/jsQR.js"}
    ]
}`;
*/