summaryrefslogtreecommitdiff
path: root/source/codes/Itf.mc
blob: 0d74c3be666326b762405f90bd8c82aced8aa72e (plain) (blame)
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));
    }
}