@ombori/epc-ean
Version:
EPC Tag Data Standard encoding and decoding library, written in javascript
162 lines (138 loc) • 4.57 kB
JavaScript
import Utils from '../utils/utils';
import { Epc } from '../epc';
import { Type } from '../type';
import { Grai96 } from './grai96';
export class Grai170 extends Epc {
constructor(hexEpc) {
super(Grai170.TOTAL_BITS);
if (hexEpc) {
super.setFromHexString(hexEpc);
} else {
super.set(Grai170.EPC_HEADER, Epc.EPC_HEADER_OFFSET, Epc.EPC_HEADER_END);
}
}
clone() {
return new Grai170().setFromBitArray(this);
}
getType() {
return Type.GRAI170;
}
fromTagURI(uri) {
const value = uri.split(':');
try {
if (value[3] === this.TAG_URI) {
const data = value[4].split('.');
const result = new Grai170();
result.setFilter(parseInt(data[0]));
result.setPartition(12 - data[1].length);
result.setCompanyPrefix(parseInt(data[1]));
result.setAssetType(parseInt(data[2]));
result.setSerial(data[3]);
return result;
}
} catch (e) {
// console.log(e)
}
throw new Error(`${uri} is not a known EPC tag URI scheme`);
}
toTagURI() {
// F.C.I.S (Filter, Company, Asset Type, Serial)
let partition = Grai96.PARTITIONS[this.getPartition()];
return Grai170.TAG_URI_TEMPLATE(
this.getFilter(),
this.getSegmentString(partition.a),
this.getSegmentString(partition.b),
this.getSerial(),
);
}
toIdURI() {
// C.I.S (Company, Asset Type, Serial)
let partition = Grai96.PARTITIONS[this.getPartition()];
return Grai170.PID_URI_TEMPLATE(
this.getSegmentString(partition.a),
this.getSegmentString(partition.b),
this.getSerial(),
);
}
toBarcode() {
return this.getGrai();
}
getTotalBits() {
return Grai170.TOTAL_BITS;
}
getHeader() {
return Grai170.EPC_HEADER;
}
getPartition() {
return super.get(Grai170.PARTITION_OFFSET, Grai170.PARTITION_END);
}
setPartition(value) {
if (value < 0 || value >= Grai96.PARTITIONS.length) {
throw new Error(
`Value '${value}' out of range (min: 0, max: ${Grai96.PARTITIONS.length - 1})`,
);
}
super.set(value, Grai170.PARTITION_OFFSET, Grai170.PARTITION_END);
return this;
}
getGrai() {
let partition = Grai96.PARTITIONS[this.getPartition()];
let companyPrefix = super.getSegmentString(partition.a);
let assetType = super.getSegmentString(partition.b);
let result = companyPrefix + assetType;
return result + Utils.computeCheckDigit(result) + this.getSerial();
}
setGrai(grai) {
let partition = Grai96.PARTITIONS[this.getPartition()];
super.setSegment(grai.substring(0, partition.a.digits), partition.a);
let tmp = partition.a.digits + partition.b.digits;
super.setSegment(grai.substring(partition.a.digits, tmp), partition.b);
this.setSerial(String(grai.substring(tmp + 1, grai.length)));
return this;
}
getCompanyPrefix() {
return super.getSegment(Grai96.PARTITIONS[this.getPartition()].a);
}
setCompanyPrefix(value) {
super.setSegment(value, Grai96.PARTITIONS[this.getPartition()].a);
return this;
}
getAssetType() {
return super.getSegment(Grai96.PARTITIONS[this.getPartition()].b);
}
setAssetType(value) {
super.setSegment(value, Grai96.PARTITIONS[this.getPartition()].b);
return this;
}
getSerial() {
return super.getString(Grai170.SERIAL_OFFSET, Grai170.SERIAL_END, Grai170.CHAR_BITS);
}
/**
* All values permitted by GS1 General Specifications (up to 16 alphanumeric characters)
* @param value
*/
setSerial(value) {
if (!value || value.length > Grai170.MAX_SERIAL_LEN)
throw new Error(
`Value '${value}' length out of range (max length: ${Grai170.MAX_SERIAL_LEN})`,
);
super.setString(value, Grai170.SERIAL_OFFSET, Grai170.SERIAL_END, Grai170.CHAR_BITS);
return this;
}
}
Grai170.EPC_HEADER = 0x37;
Grai170.TOTAL_BITS = 170;
Grai170.PARTITION_OFFSET = 11;
Grai170.PARTITION_END = 14;
Grai170.SERIAL_OFFSET = 58;
Grai170.SERIAL_END = Grai170.TOTAL_BITS;
Grai170.SERIAL_BITS = 112;
Grai170.MAX_SERIAL_LEN = 16;
Grai170.CHAR_BITS = (Grai170.SERIAL_END - Grai170.SERIAL_OFFSET) / Grai170.MAX_SERIAL_LEN; // 7
Grai170.TAG_URI = 'grai-170';
Grai170.TAG_URI_TEMPLATE = (filter, company, asset, serial) => {
return `urn:epc:tag:${this.TAG_URI}:${filter}.${company}.${asset}.${serial}`;
}; // F.C.A.S (Filter, Company, AssetType, Serial)
Grai170.PID_URI_TEMPLATE = (company, asset, serial) => {
return `urn:epc:id:grai:${company}.${asset}.${serial}`;
}; // C.A.S (Company, AssetType, Serial)