1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// Author: cirakg & claude ai
// Summary: Interleaved 2 of 5 (ITF) encoder: digit pairs, optional mod-10 check digit, wide bars 3 modules (as zxing).
import Toybox.Lang;
module Itf {
// Five elements per digit, first element = bit 4, 1 = wide.
const PATTERNS = [0x06, 0x11, 0x09, 0x18, 0x05, 0x14, 0x0C, 0x03, 0x12, 0x0A];
function encode(text as String, withCheck as Boolean) as Codes.LinearCode or Codes.CodeError {
var values = Codes.digits(text);
if (values == null || values.size() == 0) {
return new Codes.CodeError("ITF takes digits only");
}
if (withCheck) {
values.add(Ean.checkDigit(values));
}
if (values.size() % 2 != 0) {
return new Codes.CodeError(withCheck
? "ITF with a check digit needs an odd number of digits: add a leading 0"
: "ITF needs an even number of digits: add a leading 0");
}
var m = []b;
Codes.addRuns(m, [1, 1, 1, 1], true);
for (var i = 0; i < values.size(); i += 2) {
var bars = PATTERNS[values[i]] as Number;
var spaces = PATTERNS[values[i + 1]] as Number;
var widths = [] as Array<Number>;
for (var k = 4; k >= 0; k--) {
widths.add(((bars >> k) & 1) == 1 ? 3 : 1);
widths.add(((spaces >> k) & 1) == 1 ? 3 : 1);
}
Codes.addRuns(m, widths, true);
}
Codes.addRuns(m, [3, 1, 1], true);
return new Codes.LinearCode(m, Codes.digitsText(values));
}
}
|