Merge pull request #35 from shiftcars/master

Adds Code 39 vin reader and min/max aspect ratio
pull/40/head
Christoph Oberhofer 10 years ago
commit 0da82b05c8

164
dist/quagga.js vendored

@ -437,7 +437,7 @@ define("almond", function(){});
define( define(
'barcode_reader',[],function() { 'barcode_reader',[],function() {
"use strict";
function BarcodeReader() { function BarcodeReader() {
this._row = []; this._row = [];
@ -631,7 +631,7 @@ define(
"./barcode_reader" "./barcode_reader"
], ],
function(BarcodeReader) { function(BarcodeReader) {
"use strict";
function Code128Reader() { function Code128Reader() {
BarcodeReader.call(this); BarcodeReader.call(this);
@ -1079,7 +1079,7 @@ define(
"./barcode_reader" "./barcode_reader"
], ],
function(BarcodeReader) { function(BarcodeReader) {
"use strict";
function EANReader() { function EANReader() {
BarcodeReader.call(this); BarcodeReader.call(this);
@ -1379,7 +1379,7 @@ define(
/* global define */ /* global define */
define('image_loader',[],function() { define('image_loader',[],function() {
"use strict";
var ImageLoader = {}; var ImageLoader = {};
ImageLoader.load = function(directory, callback, offset, size, sequence) { ImageLoader.load = function(directory, callback, offset, size, sequence) {
@ -1443,7 +1443,7 @@ define('image_loader',[],function() {
/* global define */ /* global define */
define('input_stream',["image_loader"], function(ImageLoader) { define('input_stream',["image_loader"], function(ImageLoader) {
"use strict";
var InputStream = {}; var InputStream = {};
InputStream.createVideoStream = function(video) { InputStream.createVideoStream = function(video) {
@ -1732,7 +1732,7 @@ define("typedefs", (function (global) {
/* global define */ /* global define */
define('subImage',["typedefs"], function() { define('subImage',["typedefs"], function() {
"use strict";
/** /**
* Construct representing a part of another {ImageWrapper}. Shares data * Construct representing a part of another {ImageWrapper}. Shares data
@ -1829,7 +1829,7 @@ define('subImage',["typedefs"], function() {
/* global define, vec2 */ /* global define, vec2 */
define('cluster',[],function() { define('cluster',[],function() {
"use strict";
/** /**
* Creates a cluster for grouping similar orientations of datapoints * Creates a cluster for grouping similar orientations of datapoints
@ -4174,7 +4174,7 @@ define("glMatrixAddon", ["glMatrix"], (function (global) {
/* global define */ /* global define */
define('array_helper',[],function() { define('array_helper',[],function() {
"use strict";
return { return {
init : function(arr, val) { init : function(arr, val) {
@ -4261,7 +4261,7 @@ define('array_helper',[],function() {
define('cv_utils',['cluster', 'glMatrixAddon', "array_helper"], function(Cluster2, glMatrixAddon, ArrayHelper) { define('cv_utils',['cluster', 'glMatrixAddon', "array_helper"], function(Cluster2, glMatrixAddon, ArrayHelper) {
"use strict";
/* /*
* cv_utils.js * cv_utils.js
* Collection of CV functions and libraries * Collection of CV functions and libraries
@ -4904,7 +4904,7 @@ define('image_wrapper',[
], ],
function(SubImage, CVUtils, ArrayHelper) { function(SubImage, CVUtils, ArrayHelper) {
'use strict';
/** /**
* Represents a basic image combining the data and size. * Represents a basic image combining the data and size.
@ -5325,7 +5325,7 @@ define('image_wrapper',[
* http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
*/ */
define('tracer',[],function() { define('tracer',[],function() {
"use strict";
var Tracer = { var Tracer = {
searchDirections : [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]], searchDirections : [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]],
@ -5434,7 +5434,7 @@ define('tracer',[],function() {
* http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization * http://www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
*/ */
define('rasterizer',["tracer"], function(Tracer) { define('rasterizer',["tracer"], function(Tracer) {
"use strict";
var Rasterizer = { var Rasterizer = {
createContour2D : function() { createContour2D : function() {
@ -5630,7 +5630,7 @@ define('rasterizer',["tracer"], function(Tracer) {
/* global define */ /* global define */
define('skeletonizer',[],function() { define('skeletonizer',[],function() {
"use strict";
/* @preserve ASM BEGIN */ /* @preserve ASM BEGIN */
function Skeletonizer(stdlib, foreign, buffer) { function Skeletonizer(stdlib, foreign, buffer) {
@ -5835,7 +5835,7 @@ define('skeletonizer',[],function() {
/* global define */ /* global define */
define('image_debug',[],function() { define('image_debug',[],function() {
"use strict";
return { return {
drawRect: function(pos, size, ctx, style){ drawRect: function(pos, size, ctx, style){
@ -6380,7 +6380,7 @@ function(ImageWrapper, CVUtils, Rasterizer, Tracer, skeletonizer, ArrayHelper, I
/* global define */ /* global define */
define('bresenham',[],function() { define('bresenham',[],function() {
"use strict";
var Bresenham = {}; var Bresenham = {};
var Slope = { var Slope = {
@ -6586,7 +6586,7 @@ define(
"./array_helper" "./array_helper"
], ],
function(BarcodeReader, ArrayHelper) { function(BarcodeReader, ArrayHelper) {
"use strict";
function Code39Reader() { function Code39Reader() {
BarcodeReader.call(this); BarcodeReader.call(this);
@ -6783,12 +6783,72 @@ define(
/* jshint undef: true, unused: true, browser:true, devel: true */ /* jshint undef: true, unused: true, browser:true, devel: true */
/* global define */ /* global define */
define(
'code_39_vin_reader',[
"./code_39_reader"
],
function(Code39Reader) {
"use strict";
function Code39VINReader() {
Code39Reader.call(this);
}
var patterns = {
IOQ: /[IOQ]/g,
AZ09: /[A-Z0-9]{17}/
};
Code39VINReader.prototype = Object.create(Code39Reader.prototype);
Code39VINReader.prototype.constructor = Code39VINReader;
// Cribbed from:
// https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
Code39VINReader.prototype._decode = function() {
var result = Code39Reader.prototype._decode.apply(this);
if (!result) {
return null;
}
var code = result.code;
if (!code) {
return;
}
code = code.replace(patterns.IOQ, '');
if (!code.match(patterns.AZ09)) {
console.log('Failed AZ09 pattern code:', code);
return null;
}
if (!this._checkChecksum(code)) {
return null;
}
result.code = code;
return result;
};
Code39VINReader.prototype._checkChecksum = function(code) {
// TODO
return !!code;
};
return (Code39VINReader);
}
);
/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define */
define( define(
'codabar_reader',[ 'codabar_reader',[
"./barcode_reader" "./barcode_reader"
], ],
function(BarcodeReader) { function(BarcodeReader) {
"use strict";
function CodabarReader() { function CodabarReader() {
BarcodeReader.call(this); BarcodeReader.call(this);
@ -7101,7 +7161,7 @@ define(
"./ean_reader" "./ean_reader"
], ],
function(EANReader) { function(EANReader) {
"use strict";
function UPCReader() { function UPCReader() {
EANReader.call(this); EANReader.call(this);
@ -7132,7 +7192,7 @@ define(
"./ean_reader" "./ean_reader"
], ],
function(EANReader) { function(EANReader) {
"use strict";
function EAN8Reader() { function EAN8Reader() {
EANReader.call(this); EANReader.call(this);
@ -7177,7 +7237,7 @@ define(
"./ean_reader" "./ean_reader"
], ],
function(EANReader) { function(EANReader) {
"use strict";
function UPCEReader() { function UPCEReader() {
EANReader.call(this); EANReader.call(this);
@ -7287,6 +7347,7 @@ define('barcode_decoder',[
'code_128_reader', 'code_128_reader',
'ean_reader', 'ean_reader',
'code_39_reader', 'code_39_reader',
'code_39_vin_reader',
'codabar_reader', 'codabar_reader',
'upc_reader', 'upc_reader',
'ean_8_reader', 'ean_8_reader',
@ -7297,17 +7358,19 @@ define('barcode_decoder',[
Code128Reader, Code128Reader,
EANReader, EANReader,
Code39Reader, Code39Reader,
Code39VINReader,
CodabarReader, CodabarReader,
UPCReader, UPCReader,
EAN8Reader, EAN8Reader,
UPCEReader) { UPCEReader) {
"use strict";
var readers = { var readers = {
code_128_reader: Code128Reader, code_128_reader: Code128Reader,
ean_reader: EANReader, ean_reader: EANReader,
ean_8_reader: EAN8Reader, ean_8_reader: EAN8Reader,
code_39_reader: Code39Reader, code_39_reader: Code39Reader,
code_39_vin_reader: Code39VINReader,
codabar_reader: CodabarReader, codabar_reader: CodabarReader,
upc_reader: UPCReader, upc_reader: UPCReader,
upc_e_reader: UPCEReader upc_e_reader: UPCEReader
@ -7328,7 +7391,7 @@ define('barcode_decoder',[
}, },
_barcodeReaders = [], _barcodeReaders = [],
_barcodeReader = null; _barcodeReader = null;
initCanvas(); initCanvas();
initReaders(); initReaders();
initConfig(); initConfig();
@ -7393,9 +7456,9 @@ define('barcode_decoder',[
} }
/** /**
* extend the line on both ends * extend the line on both ends
* @param {Array} line * @param {Array} line
* @param {Number} angle * @param {Number} angle
*/ */
function getExtendedLine(line, angle, ext) { function getExtendedLine(line, angle, ext) {
function extendLine(amount) { function extendLine(amount) {
@ -7421,7 +7484,7 @@ define('barcode_decoder',[
} }
return line; return line;
} }
function getLine(box) { function getLine(box) {
return [{ return [{
x : (box[1][0] - box[0][0]) / 2 + box[0][0], x : (box[1][0] - box[0][0]) / 2 + box[0][0],
@ -7431,12 +7494,12 @@ define('barcode_decoder',[
y : (box[3][1] - box[2][1]) / 2 + box[2][1] y : (box[3][1] - box[2][1]) / 2 + box[2][1]
}]; }];
} }
function tryDecode(line) { function tryDecode(line) {
var result = null, var result = null,
i, i,
barcodeLine = Bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]); barcodeLine = Bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]);
if (config.showFrequency) { if (config.showFrequency) {
ImageDebug.drawPath(line, {x: 'x', y: 'y'}, _canvas.ctx.overlay, {color: 'red', lineWidth: 3}); ImageDebug.drawPath(line, {x: 'x', y: 'y'}, _canvas.ctx.overlay, {color: 'red', lineWidth: 3});
Bresenham.debug.printFrequency(barcodeLine.line, _canvas.dom.frequency); Bresenham.debug.printFrequency(barcodeLine.line, _canvas.dom.frequency);
@ -7445,7 +7508,7 @@ define('barcode_decoder',[
if (config.showPattern) { if (config.showPattern) {
Bresenham.debug.printPattern(barcodeLine.line, _canvas.dom.pattern); Bresenham.debug.printPattern(barcodeLine.line, _canvas.dom.pattern);
} }
for ( i = 0; i < _barcodeReaders.length && result === null; i++) { for ( i = 0; i < _barcodeReaders.length && result === null; i++) {
result = _barcodeReaders[i].decodePattern(barcodeLine.line); result = _barcodeReaders[i].decodePattern(barcodeLine.line);
if (result !== null) { if (result !== null) {
@ -7459,15 +7522,15 @@ define('barcode_decoder',[
codeResult: result, codeResult: result,
barcodeLine: barcodeLine barcodeLine: barcodeLine
}; };
} }
/** /**
* This method slices the given area apart and tries to detect a barcode-pattern * This method slices the given area apart and tries to detect a barcode-pattern
* for each slice. It returns the decoded barcode, or null if nothing was found * for each slice. It returns the decoded barcode, or null if nothing was found
* @param {Array} box * @param {Array} box
* @param {Array} line * @param {Array} line
* @param {Number} lineAngle * @param {Number} lineAngle
*/ */
function tryDecodeBruteForce(box, line, lineAngle) { function tryDecodeBruteForce(box, line, lineAngle) {
var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow((box[1][1] - box[0][1]), 2)), var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow((box[1][1] - box[0][1]), 2)),
@ -7478,7 +7541,7 @@ define('barcode_decoder',[
extension, extension,
xdir = Math.sin(lineAngle), xdir = Math.sin(lineAngle),
ydir = Math.cos(lineAngle); ydir = Math.cos(lineAngle);
for ( i = 1; i < slices && result === null; i++) { for ( i = 1; i < slices && result === null; i++) {
// move line perpendicular to angle // move line perpendicular to angle
dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1); dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1);
@ -7503,7 +7566,7 @@ define('barcode_decoder',[
} }
/** /**
* With the help of the configured readers (Code128 or EAN) this function tries to detect a * With the help of the configured readers (Code128 or EAN) this function tries to detect a
* valid barcode pattern within the given area. * valid barcode pattern within the given area.
* @param {Object} box The area to search in * @param {Object} box The area to search in
* @returns {Object} the result {codeResult, line, angle, pattern, threshold} * @returns {Object} the result {codeResult, line, angle, pattern, threshold}
@ -7531,7 +7594,7 @@ define('barcode_decoder',[
if(result === null) { if(result === null) {
result = tryDecodeBruteForce(box, line, lineAngle); result = tryDecodeBruteForce(box, line, lineAngle);
} }
if(result === null) { if(result === null) {
return null; return null;
} }
@ -7573,12 +7636,13 @@ define('barcode_decoder',[
}; };
return (BarcodeDecoder); return (BarcodeDecoder);
}); });
/* jshint undef: true, unused: true, browser:true, devel: true */ /* jshint undef: true, unused: true, browser:true, devel: true */
/* global define */ /* global define */
define('frame_grabber',["cv_utils"], function(CVUtils) { define('frame_grabber',["cv_utils"], function(CVUtils) {
"use strict";
var FrameGrabber = {}; var FrameGrabber = {};
@ -7660,7 +7724,7 @@ define('frame_grabber',["cv_utils"], function(CVUtils) {
/* global define */ /* global define */
define('html_utils',[], function() { define('html_utils',[], function() {
"use strict";
function createNode(htmlStr) { function createNode(htmlStr) {
var temp = document.createElement('div'); var temp = document.createElement('div');
@ -7697,7 +7761,7 @@ define('html_utils',[], function() {
}; };
}); });
/** /**
* The basic configuration * The basic configuration
*/ */
define('config',[],function(){ define('config',[],function(){
@ -7707,6 +7771,8 @@ define('config',[],function(){
constraints: { constraints: {
width: 640, width: 640,
height: 480, height: 480,
minAspectRatio: 1,
maxAspectRatio: 1,
facing: "environment" // or user facing: "environment" // or user
} }
}, },
@ -7744,14 +7810,15 @@ define('config',[],function(){
} }
} }
}; };
return config; return config;
}); });
/* jshint undef: true, unused: true, browser:true, devel: true */ /* jshint undef: true, unused: true, browser:true, devel: true */
/* global define */ /* global define */
define('events',[],function() { define('events',[],function() {
"use strict";
var _events = function() { var _events = function() {
var events = {}; var events = {};
@ -7842,10 +7909,10 @@ define('events',[],function() {
/* global define, MediaStreamTrack */ /* global define, MediaStreamTrack */
define('camera_access',["html_utils"], function(HtmlUtils) { define('camera_access',["html_utils"], function(HtmlUtils) {
"use strict";
var streamRef, var streamRef,
loadedDataHandler; loadedDataHandler;
/** /**
* Wraps browser-specific getUserMedia * Wraps browser-specific getUserMedia
* @param {Object} constraints * @param {Object} constraints
@ -7914,6 +7981,8 @@ define('camera_access',["html_utils"], function(HtmlUtils) {
videoConstraints = HtmlUtils.mergeObjects({ videoConstraints = HtmlUtils.mergeObjects({
width: 640, width: 640,
height: 480, height: 480,
minAspectRatio: 1,
maxAspectRatio: 1,
facing: "environment" facing: "environment"
}, config); }, config);
@ -7929,7 +7998,9 @@ define('camera_access',["html_utils"], function(HtmlUtils) {
constraints.video = { constraints.video = {
mandatory: { mandatory: {
minWidth: videoConstraints.width, minWidth: videoConstraints.width,
minHeight: videoConstraints.height minHeight: videoConstraints.height,
minAspectRatio: videoConstraints.minAspectRatio,
maxAspectRatio: videoConstraints.maxAspectRatio
}, },
optional: [{ optional: [{
sourceId: videoSourceId sourceId: videoSourceId
@ -7972,7 +8043,8 @@ define('camera_access',["html_utils"], function(HtmlUtils) {
streamRef = null; streamRef = null;
} }
}; };
}); });
/* jshint undef: true, unused: true, browser:true, devel: true, evil: true */ /* jshint undef: true, unused: true, browser:true, devel: true, evil: true */
/* global define, vec2 */ /* global define, vec2 */
@ -8004,7 +8076,7 @@ function(Code128Reader,
CameraAccess, CameraAccess,
ImageDebug, ImageDebug,
CVUtils) { CVUtils) {
"use strict";
var _inputStream, var _inputStream,
_framegrabber, _framegrabber,

@ -37,6 +37,7 @@
<select name="decoder_readers;input-stream_src"> <select name="decoder_readers;input-stream_src">
<option value="code_128" selected="selected">Code 128</option> <option value="code_128" selected="selected">Code 128</option>
<option value="code_39">Code 39</option> <option value="code_39">Code 39</option>
<option value="code_39_vin">Code 39 VIN</option>
<option value="ean">EAN</option> <option value="ean">EAN</option>
<option value="ean_8">EAN-8</option> <option value="ean_8">EAN-8</option>
<option value="upc">UPC</option> <option value="upc">UPC</option>

@ -92,8 +92,9 @@ $(function() {
} }
} }
}; };
App.init(); App.init();
window.App = App;
Quagga.onProcessed(function(result) { Quagga.onProcessed(function(result) {
var drawingCtx = Quagga.canvas.ctx.overlay, var drawingCtx = Quagga.canvas.ctx.overlay,
@ -129,4 +130,4 @@ $(function() {
$node.find("h4.code").html(detectedCode); $node.find("h4.code").html(detectedCode);
$("#result_strip ul.thumbnails").prepend($node); $("#result_strip ul.thumbnails").prepend($node);
}); });
}); });

@ -4,7 +4,7 @@
"description": "An advanced barcode-scanner written in JavaScript", "description": "An advanced barcode-scanner written in JavaScript",
"main": "dist/quagga.js", "main": "dist/quagga.js",
"devDependencies": { "devDependencies": {
"grunt": "~0.4.6", "grunt": "~0.4.5",
"grunt-contrib-jshint": "~0.10.0", "grunt-contrib-jshint": "~0.10.0",
"grunt-contrib-nodeunit": "~0.4.1", "grunt-contrib-nodeunit": "~0.4.1",
"grunt-contrib-uglify": "~0.5.0", "grunt-contrib-uglify": "~0.5.0",

@ -7,6 +7,7 @@ define([
'code_128_reader', 'code_128_reader',
'ean_reader', 'ean_reader',
'code_39_reader', 'code_39_reader',
'code_39_vin_reader',
'codabar_reader', 'codabar_reader',
'upc_reader', 'upc_reader',
'ean_8_reader', 'ean_8_reader',
@ -17,17 +18,19 @@ define([
Code128Reader, Code128Reader,
EANReader, EANReader,
Code39Reader, Code39Reader,
Code39VINReader,
CodabarReader, CodabarReader,
UPCReader, UPCReader,
EAN8Reader, EAN8Reader,
UPCEReader) { UPCEReader) {
"use strict"; "use strict";
var readers = { var readers = {
code_128_reader: Code128Reader, code_128_reader: Code128Reader,
ean_reader: EANReader, ean_reader: EANReader,
ean_8_reader: EAN8Reader, ean_8_reader: EAN8Reader,
code_39_reader: Code39Reader, code_39_reader: Code39Reader,
code_39_vin_reader: Code39VINReader,
codabar_reader: CodabarReader, codabar_reader: CodabarReader,
upc_reader: UPCReader, upc_reader: UPCReader,
upc_e_reader: UPCEReader upc_e_reader: UPCEReader
@ -48,7 +51,7 @@ define([
}, },
_barcodeReaders = [], _barcodeReaders = [],
_barcodeReader = null; _barcodeReader = null;
initCanvas(); initCanvas();
initReaders(); initReaders();
initConfig(); initConfig();
@ -113,9 +116,9 @@ define([
} }
/** /**
* extend the line on both ends * extend the line on both ends
* @param {Array} line * @param {Array} line
* @param {Number} angle * @param {Number} angle
*/ */
function getExtendedLine(line, angle, ext) { function getExtendedLine(line, angle, ext) {
function extendLine(amount) { function extendLine(amount) {
@ -141,7 +144,7 @@ define([
} }
return line; return line;
} }
function getLine(box) { function getLine(box) {
return [{ return [{
x : (box[1][0] - box[0][0]) / 2 + box[0][0], x : (box[1][0] - box[0][0]) / 2 + box[0][0],
@ -151,12 +154,12 @@ define([
y : (box[3][1] - box[2][1]) / 2 + box[2][1] y : (box[3][1] - box[2][1]) / 2 + box[2][1]
}]; }];
} }
function tryDecode(line) { function tryDecode(line) {
var result = null, var result = null,
i, i,
barcodeLine = Bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]); barcodeLine = Bresenham.getBarcodeLine(inputImageWrapper, line[0], line[1]);
if (config.showFrequency) { if (config.showFrequency) {
ImageDebug.drawPath(line, {x: 'x', y: 'y'}, _canvas.ctx.overlay, {color: 'red', lineWidth: 3}); ImageDebug.drawPath(line, {x: 'x', y: 'y'}, _canvas.ctx.overlay, {color: 'red', lineWidth: 3});
Bresenham.debug.printFrequency(barcodeLine.line, _canvas.dom.frequency); Bresenham.debug.printFrequency(barcodeLine.line, _canvas.dom.frequency);
@ -165,7 +168,7 @@ define([
if (config.showPattern) { if (config.showPattern) {
Bresenham.debug.printPattern(barcodeLine.line, _canvas.dom.pattern); Bresenham.debug.printPattern(barcodeLine.line, _canvas.dom.pattern);
} }
for ( i = 0; i < _barcodeReaders.length && result === null; i++) { for ( i = 0; i < _barcodeReaders.length && result === null; i++) {
result = _barcodeReaders[i].decodePattern(barcodeLine.line); result = _barcodeReaders[i].decodePattern(barcodeLine.line);
if (result !== null) { if (result !== null) {
@ -179,15 +182,15 @@ define([
codeResult: result, codeResult: result,
barcodeLine: barcodeLine barcodeLine: barcodeLine
}; };
} }
/** /**
* This method slices the given area apart and tries to detect a barcode-pattern * This method slices the given area apart and tries to detect a barcode-pattern
* for each slice. It returns the decoded barcode, or null if nothing was found * for each slice. It returns the decoded barcode, or null if nothing was found
* @param {Array} box * @param {Array} box
* @param {Array} line * @param {Array} line
* @param {Number} lineAngle * @param {Number} lineAngle
*/ */
function tryDecodeBruteForce(box, line, lineAngle) { function tryDecodeBruteForce(box, line, lineAngle) {
var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow((box[1][1] - box[0][1]), 2)), var sideLength = Math.sqrt(Math.pow(box[1][0] - box[0][0], 2) + Math.pow((box[1][1] - box[0][1]), 2)),
@ -198,7 +201,7 @@ define([
extension, extension,
xdir = Math.sin(lineAngle), xdir = Math.sin(lineAngle),
ydir = Math.cos(lineAngle); ydir = Math.cos(lineAngle);
for ( i = 1; i < slices && result === null; i++) { for ( i = 1; i < slices && result === null; i++) {
// move line perpendicular to angle // move line perpendicular to angle
dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1); dir = sideLength / slices * i * (i % 2 === 0 ? -1 : 1);
@ -223,7 +226,7 @@ define([
} }
/** /**
* With the help of the configured readers (Code128 or EAN) this function tries to detect a * With the help of the configured readers (Code128 or EAN) this function tries to detect a
* valid barcode pattern within the given area. * valid barcode pattern within the given area.
* @param {Object} box The area to search in * @param {Object} box The area to search in
* @returns {Object} the result {codeResult, line, angle, pattern, threshold} * @returns {Object} the result {codeResult, line, angle, pattern, threshold}
@ -251,7 +254,7 @@ define([
if(result === null) { if(result === null) {
result = tryDecodeBruteForce(box, line, lineAngle); result = tryDecodeBruteForce(box, line, lineAngle);
} }
if(result === null) { if(result === null) {
return null; return null;
} }
@ -293,4 +296,4 @@ define([
}; };
return (BarcodeDecoder); return (BarcodeDecoder);
}); });

@ -5,7 +5,7 @@ define(["html_utils"], function(HtmlUtils) {
"use strict"; "use strict";
var streamRef, var streamRef,
loadedDataHandler; loadedDataHandler;
/** /**
* Wraps browser-specific getUserMedia * Wraps browser-specific getUserMedia
* @param {Object} constraints * @param {Object} constraints
@ -74,6 +74,8 @@ define(["html_utils"], function(HtmlUtils) {
videoConstraints = HtmlUtils.mergeObjects({ videoConstraints = HtmlUtils.mergeObjects({
width: 640, width: 640,
height: 480, height: 480,
minAspectRatio: 0,
maxAspectRatio: 100,
facing: "environment" facing: "environment"
}, config); }, config);
@ -89,7 +91,9 @@ define(["html_utils"], function(HtmlUtils) {
constraints.video = { constraints.video = {
mandatory: { mandatory: {
minWidth: videoConstraints.width, minWidth: videoConstraints.width,
minHeight: videoConstraints.height minHeight: videoConstraints.height,
minAspectRatio: videoConstraints.minAspectRatio,
maxAspectRatio: videoConstraints.maxAspectRatio
}, },
optional: [{ optional: [{
sourceId: videoSourceId sourceId: videoSourceId
@ -132,4 +136,4 @@ define(["html_utils"], function(HtmlUtils) {
streamRef = null; streamRef = null;
} }
}; };
}); });

@ -0,0 +1,59 @@
/* jshint undef: true, unused: true, browser:true, devel: true */
/* global define */
define(
[
"./code_39_reader"
],
function(Code39Reader) {
"use strict";
function Code39VINReader() {
Code39Reader.call(this);
}
var patterns = {
IOQ: /[IOQ]/g,
AZ09: /[A-Z0-9]{17}/
};
Code39VINReader.prototype = Object.create(Code39Reader.prototype);
Code39VINReader.prototype.constructor = Code39VINReader;
// Cribbed from:
// https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
Code39VINReader.prototype._decode = function() {
var result = Code39Reader.prototype._decode.apply(this);
if (!result) {
return null;
}
var code = result.code;
if (!code) {
return;
}
code = code.replace(patterns.IOQ, '');
if (!code.match(patterns.AZ09)) {
console.log('Failed AZ09 pattern code:', code);
return null;
}
if (!this._checkChecksum(code)) {
return null;
}
result.code = code;
return result;
};
Code39VINReader.prototype._checkChecksum = function(code) {
// TODO
return !!code;
};
return (Code39VINReader);
}
);

@ -1,5 +1,5 @@
/** /**
* The basic configuration * The basic configuration
*/ */
define(function(){ define(function(){
@ -9,6 +9,8 @@ define(function(){
constraints: { constraints: {
width: 640, width: 640,
height: 480, height: 480,
minAspectRatio: 0,
maxAspectRatio: 100,
facing: "environment" // or user facing: "environment" // or user
} }
}, },
@ -46,6 +48,6 @@ define(function(){
} }
} }
}; };
return config; return config;
}); });

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 513 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Loading…
Cancel
Save