UNPKG

@danidoble/webserial

Version:
732 lines (731 loc) 35.6 kB
var ce = Object.defineProperty; var D = (c) => { throw TypeError(c); }; var pe = (c, p, n) => p in c ? ce(c, p, { enumerable: !0, configurable: !0, writable: !0, value: n }) : c[p] = n; var h = (c, p, n) => pe(c, typeof p != "symbol" ? p + "" : p, n), I = (c, p, n) => p.has(c) || D("Cannot " + n); var w = (c, p, n) => (I(c, p, "read from private field"), n ? n.call(c) : p.get(c)), y = (c, p, n) => p.has(c) ? D("Cannot add the same private member more than once") : p instanceof WeakSet ? p.add(c) : p.set(c, n), b = (c, p, n, e) => (I(c, p, "write to private field"), e ? e.call(c, n) : p.set(c, n), n), a = (c, p, n) => (I(c, p, "access private method"), n); import { K as ue, h as x } from "./kernel-BLbpgXHp.js"; import { l as d } from "./relay-Dop4mFk-.js"; var f, _, k, s, E, M, v, S, m, Q, N, F, j, O, U, A, L, T, V, z, W, K, Y, G, H, J, X, Z, g, ee, ne, te, se, ie, re, ae, R, C, oe, le, P, $, B; class _e extends ue { constructor({ filters: n = null, config_port: e = null, no_device: t = 1 } = {}) { super({ filters: n, config_port: e, no_device: t }); y(this, s); h(this, "__coin_purse", { available: !0 }); h(this, "__banknote_purse", { available: !0, isRecycler: !0, recycler: { ict: !0, banknote: 1 // 0: $20, 1: $50, 2: $100, 3: $200, 4: $500 } }); h(this, "__sale", { price: 0, change: 0, change_verified: 0, dispense_all: !0, last_change: 0, clear() { this.price = 0, this.change = 0, this.change_verified = 0, this.dispense_all = !0, this.last_change = 0; } }); h(this, "__money_session", { inserted: 0, retired: 0, clear() { this.inserted = 0, this.retired = 0; } }); h(this, "coins", { tubes: { g50: 0, c50: 0, p1: 0, p2: 0, p5: 0, p10: 0 }, box: { g50: 0, c50: 0, p1: 0, p2: 0, p5: 0, p10: 0 }, totals: { g50: 0, c50: 0, p1: 0, p2: 0, p5: 0, p10: 0 }, total: 0 }); h(this, "banknotes", { stacker: { p20: 0, p50: 0, p100: 0, p200: 0, p500: 0, p1000: 0 }, recycler: { p20: 0, p50: 0, p100: 0, p200: 0, p500: 0, p1000: 0 }, out: { p20: 0, p50: 0, p100: 0, p200: 0, p500: 0, p1000: 0 }, totals: { p20: 0, p50: 0, p100: 0, p200: 0, p500: 0, p1000: 0 }, total: 0 }); h(this, "card_reader", { available: !1, max_pre_credit: 0 }); y(this, f, !1); y(this, _, 0); y(this, k, 0); if (this.__internal__.device.type = "boardroid", x.getCustom(this.typeDevice, t)) throw new Error(`Device ${this.typeDevice} ${t} already exists`); this.__internal__.serial.config_port.baudRate = 115200, this.__internal__.serial.response.length = 14, this.__internal__.time.response_connection = 600, this.__internal__.time.response_general = 4e3, this.__internal__.time.response_engines = 15e3, this.__internal__.dispense.limit_counter = 15, this.__internal__.dispense.custom_limit_counter = null, this.__internal__.dispense.backup_dispense = { channel: 1, second_channel: null, sensor: !0, seconds: null }, a(this, s, E).call(this), a(this, s, M).call(this); } get totalInTubes() { return this.coins.tubes.g50 * 0.5 + this.coins.tubes.c50 * 0.5 + this.coins.tubes.p1 + this.coins.tubes.p2 * 2 + this.coins.tubes.p5 * 5 + this.coins.tubes.p10 * 10; } get totalInRecycler() { return this.banknotes.recycler.p20 * 20 + this.banknotes.recycler.p50 * 50 + this.banknotes.recycler.p100 * 100 + this.banknotes.recycler.p200 * 200 + this.banknotes.recycler.p500 * 500 + this.banknotes.recycler.p1000 * 1e3; } get hasRecycler() { return this.__banknote_purse.available && this.__banknote_purse.isRecycler; } set hasRecycler(n) { this.__banknote_purse.isRecycler = n; } get hasICT() { return this.hasRecycler && this.__banknote_purse.recycler.ict; } set hasICT(n) { this.__banknote_purse.recycler.ict = n; } set banknoteICT(n) { if (![20, 50, 100, 200, 500].includes(n)) throw new Error(`Invalid banknote value: ${n}`); n = [20, 50, 100, 200, 500].indexOf(n), this.__banknote_purse.recycler.banknote = n; } get banknoteICT() { return [20, 50, 100, 200, 500][this.__banknote_purse.recycler.banknote]; } get hasCoinPurse() { return this.__coin_purse.available; } set hasCoinPurse(n) { if (typeof n != "boolean") throw new Error(`Invalid value: ${n}`); this.__coin_purse.available = n; } set price(n) { let e = parseFloat(n); (isNaN(e) || e < 0) && (e = 0), this.__sale.price = e; } get price() { return this.__sale.price; } get change() { return this.__sale.price <= 0 || this.__money_session.inserted <= this.__sale.price ? 0 : this.__money_session.inserted - this.__sale.price; } softReload() { super.softReload(), this.__sale.clear(), this.__money_session.clear(); } serialMessage(n) { let e = { code: n, name: null, description: null, request: null, no_code: 0 }; const t = (5 + this.deviceNumber).toString(16).padStart(2, "0").toLowerCase(); switch (n[1]) { case t: e.request = "connect", e = a(this, s, m).call(this, e); break; case "a0": e.request = "--automatic", e = a(this, s, V).call(this, n, e); break; case "b0": e.request = "--automatic", e = a(this, s, z).call(this, n, e); break; case "d0": e.request = "coin-purse:config", e = a(this, s, W).call(this, n[2], e); break; case "d1": e.request = "banknote-purse:config", e.additional = { scrow: null }, e = a(this, s, K).call(this, n, e); break; case "d2": e.request = "coin-purse:read-tubes", e = a(this, s, Y).call(this, n, e); break; case "d3": e.request = "banknote-purse:read-recycler", e = a(this, s, G).call(this, n, e); break; case "d4": e.request = "banknote-purse:banknote-scrow-status", e = a(this, s, H).call(this, n[2], e); break; case "d5": e.request = "banknote-purse:dispense", e = a(this, s, J).call(this, n, e); break; case "d6": e.request = "coin-purse:dispense", e = a(this, s, X).call(this, n, e); break; case "d7": e.request = "dispense", e = a(this, s, Z).call(this, n[5], e); break; case "d8": e.request = "--automatic", e = a(this, s, g).call(this, n[13], e); break; case "d9": e.request = "status:temperature", e = a(this, s, ee).call(this, n, e); break; case "da": e.request = "status:relay", e = a(this, s, ne).call(this, n[2], e); break; case "db": e.request = "banknote-purse:save-memory", e.no_code = 18, e.name = "Bill purse memory saved?", e.description = "The memory of bill purse was saved successfully?", this.dispatch("banknote-purse:save-memory", { message: e }); break; case "dc": e.request = "coin-purse:read-memory", e.no_code = 19, e.name = "Coin purse memory read?", e.description = "The memory of coin purse was read successfully?", this.dispatch("banknote-purse:read-memory", { message: e }); break; case "dd": e.request = "card-reader", a(this, s, te).call(this, n, e); break; default: e.request = "--unknown", e.name = "Response unrecognized", e.description = "The response of application was received, but dont identify with any of current parameters", e.no_code = 400, this.dispatch("unknown", e); break; } this.dispatch("serial:message", e); } serialSetConnectionConstant(n = 1) { return d.connection({ channel: n }); } async coinPurseConfigure({ enable: n = !1, high: e = "FF", low: t = "FF" } = {}) { if (!this.__coin_purse.available) throw new Error("Coin purse not available"); return e = this.hexToDec(e), t = this.hexToDec(t), await this.appendToQueue( d.coinPurseConfiguration({ enable: n, high: e, low: t }), "coin-purse:config" ); } async coinPurseEnable() { await this.coinPurseConfigure({ enable: !0 }); } async coinPurseDisable() { await this.coinPurseConfigure({ enable: !1 }); } async coinPurseDispense({ $_50c: n = 0, $_1: e = 0, $_2: t = 0, $_5: i = 0, $_10: r = 0 } = {}) { if (!this.__coin_purse.available) throw new Error("Coin purse not available"); return await this.appendToQueue( d.coinPurseDispense({ $50c: n, $1: e, $2: t, $5: i, $10: r }), "coin-purse:dispense" ); } async coinPurseReadTubes() { return await this.appendToQueue(d.coinPurseReadTubes(), "coin-purse:read-tubes"); } async banknotePurseConfigure({ enable: n = !1, scrow: e = !1 } = {}) { if (!this.__banknote_purse.available) throw new Error("Banknote purse not available"); let t; return a(this, s, v).call(this) ? t = a(this, s, se).call(this, { enable: n, scrow: e }) : t = a(this, s, ie).call(this, { enable: n, scrow: e }), await this.appendToQueue(t, "banknote-purse:config"); } async banknotePurseDispense({ $_20: n = 0, $_50: e = 0, $_100: t = 0, $_200: i = 0, $_500: r = 0, $_1000: o = 0 } = {}) { if (!this.__banknote_purse.available) throw new Error("Banknote purse not available"); if (!this.__banknote_purse.isRecycler) throw new Error("Banknote purse is not recycler"); let l; if (a(this, s, v).call(this)) { const u = [n, e, t, i, r]; l = a(this, s, re).call(this, u[this.__banknote_purse.recycler.banknote]); } else l = a(this, s, ae).call(this, { $_20: n, $_50: e, $_100: t, $_200: i, $_500: r, $_1000: o }); await this.appendToQueue(l, "banknote-purse:dispense"); } async banknotePurseEnable({ scrow: n = !1 }) { return await this.banknotePurseConfigure({ enable: !0, scrow: n }); } async banknotePurseDisable() { return await this.banknotePurseConfigure({ enable: !1 }); } async banknotePurseAcceptInScrow() { if (!this.__banknote_purse.available) throw new Error("Banknote purse not available"); return await this.appendToQueue( d.banknotePurseAcceptInScrow(), "banknote-purse:banknote-scrow-status" ); } async banknotePurseRejectInScrow() { if (!this.__banknote_purse.available) throw new Error("Banknote purse not available"); return await this.appendToQueue( d.banknotePurseRejectInScrow(), "banknote-purse:banknote-scrow-status" ); } async banknotePurseSaveMemory({ channel: n = null, $_20: e = null, $_50: t = null, $_100: i = null, $_200: r = null, $_500: o = null, $_1000: l = null } = {}) { if (!this.__banknote_purse.available) throw new Error("Banknote purse not available"); return await this.appendToQueue( d.banknotePurseSaveMemory({ channel: n, $20: e, $50: t, $100: i, $200: r, $500: o, $1000: l }), "banknote-purse:save-memory" ); } async banknotePurseReadRecycler() { if (!this.__banknote_purse.available) throw new Error("Banknote purse not available"); if (!this.__banknote_purse.isRecycler) throw new Error("Banknote purse is not recycler"); return await this.appendToQueue(d.banknotePurseReadRecycler(), "banknote-purse:read-recycler"); } async cardReaderDisable() { if (!this.card_reader.available) throw new Error("Card reader not available"); return await this.appendToQueue(d.cardReaderDisable(), "card-reader:disable"); } async cardReaderDispense({ channel: n = 1, second_channel: e = null, sensor: t = !0, seconds: i = null, price: r = 0 } = {}) { if (!this.card_reader.available) throw new Error("Card reader not available"); if ((isNaN(this.card_reader.max_pre_credit) || this.card_reader.max_pre_credit === 0) && (this.card_reader.max_pre_credit = r), isNaN(r) || r <= 0) throw new Error("Price must be greater than 0"); if (r > this.card_reader.max_pre_credit) throw new Error("Price is greater than pre-credit configured"); if (!t && (i === null || i <= 0 || i > 40)) throw new Error("Invalid time to dispense without sensor, must be between 0.1 and 40.0 seconds"); return this.appendToQueue( d.cardReaderDispense({ selection: n, second_selection: e, sensor: t, seconds: i, price: r }), "card-reader:dispense" ); } async paymentPursesDisable({ coin: n = !0, banknote: e = !0, cardReader: t = !1 } = {}) { n && this.__coin_purse.available && await this.coinPurseDisable(), e && this.__banknote_purse.available && await this.banknotePurseDisable(), t && this.card_reader.available && await this.cardReaderDisable(); } async paymentPursesEnable({ coin: n = !0, banknote: e = !0, scrowBanknote: t = !1 } = {}) { n && this.__coin_purse.available && await this.coinPurseEnable(), e && this.__banknote_purse.available && await this.banknotePurseEnable({ scrow: t }); } async coolingRelayConfigure({ enable: n = !1 } = {}) { return await this.appendToQueue(d.coolingRelayConfigure({ enable: n }), "status:relay"); } async coolingRelayEnable() { return await this.coolingRelayConfigure({ enable: !0 }); } async coolingRelayDisable() { return await this.coolingRelayConfigure({ enable: !1 }); } async readTemperature() { return await this.appendToQueue(d.readTemperature(), "status:temperature"); } /** * Dispense a product from the machine * @param {number|string} selection * @param {null|number|string} second_selection * @param {boolean} sensor * @param {null|number} seconds * @param {boolean} retry * @return {Promise<unknown>} */ async dispense({ selection: n = 1, second_selection: e = null, sensor: t = !0, seconds: i = null, retry: r = !0 } = {}) { if (n = parseInt(n), isNaN(n) || n < 1 || n > 80) throw new Error("Invalid channel number"); if (e !== null && (e < 1 || e > 80 || e === n)) throw new Error("Invalid second channel number"); if (!t && (i === null || i <= 0 || i > 40)) throw new Error("Invalid time to dispense without sensor, must be between 0.1 and 40.0 seconds"); r && (this.__internal__.dispense.backup_dispense = { selection: n, second_selection: e, sensor: t, seconds: i }); const o = d.dispense({ selection: n, second_selection: e, sensor: t, seconds: i }); t || (i || (i = 1.5), this.__internal__.dispense.custom_limit_counter = i + 0.2); let l = await this.internalDispense(o); return !l.dispensed && r && (l = await this.internalDispense(o)), this.__internal__.dispense.custom_limit_counter = null, l; } async testEngines({ singleEngine: n = !1 } = {}) { if (this.isDispensing) throw new Error("Another dispensing process is running"); if (w(this, f)) throw new Error("Another test is running"); a(this, s, R).call(this), b(this, f, !0); const e = []; a(this, s, C).call(this); for (let t = 1; t <= 80; t++) { const i = await this.dispense({ selection: t, second_selection: n ? null : t + 1, sensor: !1, seconds: 0.4, retry: !1 }); e.push(i), b(this, _, t), a(this, s, C).call(this), n || t++; } b(this, _, 80), a(this, s, C).call(this, { dispensed: e }), a(this, s, R).call(this); } async sendCustomCode({ code: n = [] } = {}) { if (n.length === 0) throw new Error("Invalid code"); return await this.appendToQueue(d.customCode(n), "custom"); } hasToReturnChange(n = 0) { let e = n; return e <= 0 ? !0 : (e = a(this, s, P).call(this, e).pending, e = a(this, s, $).call(this, e).pending, !(e > 0)); } async returnChange() { return await a(this, s, B).call(this); } async returnInsertedMoney() { return this.__money_session.inserted <= 0 ? !1 : await a(this, s, B).call(this, this.__money_session.inserted); } async serialCorruptMessage(n, e) { this.dispatch("corrupt:message", { data: n, message: e }); } } f = new WeakMap(), _ = new WeakMap(), k = new WeakMap(), s = new WeakSet(), E = function() { const n = [ "banknote-purse:banknote-scrow-status", "banknote-purse:config", "banknote-purse:event-banknote", "banknote-purse:read-memory", "banknote-purse:recycler", "banknote-purse:save-memory", "card-reader:event", "change:pending", "change:dispense", "coin-purse:coin-event", "coin-purse:config", "coin-purse:reject-lever", "coin-purse:reset", "coin-purse:tubes", "percentage:test", "run:default-load", "session:money-dispensed", "session:money-request", "event:door", "door:event", "status:relay", "status:temperature", "money:inserted" ]; for (const e of n) this.serialRegisterAvailableListener(e); }, M = function() { x.add(this); }, v = function() { return this.__banknote_purse.isRecycler && this.__banknote_purse.recycler.ict; }, S = function() { return this.hasCoinPurse || this.hasRecycler; }, m = function(n) { return n.name = "Connection with the serial device completed.", n.description = "Your connection with the serial device was successfully completed.", n.no_code = 1, this.dispatch("run:default-load", {}), n; }, Q = function(n) { const e = { g50: { value: 0.5, name: "50 pennies (the big one)" }, c0: { value: 0.5, name: "50 pennies (the little one)" }, p1: { value: 1, name: "1 peso" }, p2: { value: 2, name: "2 pesos" }, p5: { value: 5, name: "5 pesos" }, p10: { value: 10, name: "10 pesos" }, p20: { value: 20, name: "20 pesos" } }; return e[n] ? e[n] : !1; }, N = function(n) { const e = { g50: ["40", "50", "60", "70", "90"], c50: ["41", "51", "61", "71", "91"], p1: ["42", "52", "62", "72", "92"], p2: ["43", "53", "63", "73", "93"], p5: ["44", "54", "64", "74", "94"], p10: ["45", "55", "65", "75", "95"], p20: ["47", "57", "67", "77", "97"] }; let t = null; for (let r in e) if (e[r].includes(n)) { t = r; break; } return t ? [{ g50: "50 pennies (the big one)", c0: "50 pennies (the little one)", p1: "1 peso", p2: "2 pesos", p5: "5 pesos", p10: "10 pesos", p20: "20 pesos" }[t], t] : [`Undefined value: ¿${n}?`, null]; }, F = function(n) { return ["g50", "c50", "p1", "p2", "p5", "p10", "p20"].includes(n); }, j = function(n) { const e = { p20: ["80", "90", "a0", "b0"], p50: ["81", "91", "a1", "b1"], p100: ["82", "92", "a2", "b2"], p200: ["83", "93", "a3", "b3"], p500: ["84", "94", "a4", "b4"], p1000: ["85", "95", "a5", "b5"] }; let t = null; for (let r in e) if (e[r].includes(n)) { t = r; break; } return t ? [{ p20: "20 pesos", p50: "50 pesos", p100: "100 pesos", p200: "200 pesos", p500: "500 pesos", p1000: "1000 pesos" }[t], t] : [`Undefined value: ¿${n}?`, null]; }, O = function(n) { const e = { p20: { value: 20, name: "20 pesos" }, p50: { value: 50, name: "50 pesos" }, p100: { value: 100, name: "100 pesos" }, p200: { value: 200, name: "200 pesos" }, p500: { value: 500, name: "500 pesos" }, p1000: { value: 1e3, name: "1000 pesos" } }; return e[n] ? e[n] : !1; }, U = function(n) { return ["p20", "p50", "p100", "p200", "p500", "p1000"].includes(n); }, A = function(n) { return ["r20", "r50", "r100"].includes(n); }, L = function() { return ["r20", "r50", "r100", "r200", "r500"][this.__banknote_purse.recycler.banknote]; }, T = function(n, e, t) { if (!n) return; let i = !0; if (a(this, s, F).call(this, n) && t === "coin") { if (typeof this.coins.tubes[n] > "u") return; e === "tube" ? this.coins.tubes[n] += 1 : e === "box" && (this.coins.box[n] += 1); let r = 0; ["g50", "c50"].includes(n) ? r = 0.5 : r += parseInt(n.slice(1)), this.coins.totals[n] += r, this.__money_session.inserted += r, this.coins.total += r; const o = a(this, s, Q).call(this, n); o && this.dispatch("money:inserted", { type: "coin", money: o, // {value:number,name:string} where: e }); } else if (a(this, s, U).call(this, n) && t === "banknote") { if (typeof this.banknotes.recycler[n] > "u") return; e === "recycler" ? this.banknotes.recycler[n] += 1 : e === "stacker" && (this.banknotes.stacker[n] += 1); let r = parseInt(n.slice(1)); this.banknotes.totals[n] += r, this.__money_session.inserted += r, this.banknotes.total += r; const o = a(this, s, O).call(this, n); o && this.dispatch("money:inserted", { type: "banknote", money: o, // {value:number,name:string} where: e }); } else if (a(this, s, A).call(this, n) && e === "out" && t === "banknote") { if (typeof this.banknotes.out[n.replace("r", "p")] > "u") return; this.banknotes.out[n.replace("r", "p")] += 1; let r = parseInt(n.slice(1)); this.__money_session.retired += r, this.banknotes.recycler[n.replace("r", "p")] -= 1, this.banknotes.total -= r, i = !1, this.dispatch("session:money-dispensed", { type_money: n, retired: r, finish: !1, type: "banknotes" }); } i && this.dispatch("session:money-request", {}); }, V = function(n, e) { const t = parseInt(n[2], 16); return e.name = "Coin Inserted", e.no_code = 2, e.additional = { where: null, coin: null }, t === 1 ? (e.name = "Lever pressed", e.description = "Reject lever", e.no_code = 100, this.dispatch("coin-purse:reject-lever", {})) : t === 2 ? (e.name = "Reset coin purse", e.description = "The configuration of coin purse was reset", e.no_code = 101, this.dispatch("coin-purse:reset", {})) : t >= 64 && t <= 79 ? (e.name = "Coin inserted in profit box", e.additional.where = "box") : t >= 80 && t <= 95 ? (e.name = "Coin inserted in tube", e.additional.where = "tube") : t >= 96 && t <= 111 ? (e.name = "Unused coin", e.description = "Something come from coin changer but in MDB Docs is unused", e.additional.where = "unused") : t >= 112 && t <= 127 ? (e.name = "Coin rejected", e.additional.where = "rejected") : t >= 144 && t <= 159 ? (e.name = "Coin dispensed", e.additional.where = "out", e.description = `Undefined value: ¿${n[2]}?`) : (e.name = "Coin inserted", e.description = "Undefined status. Without information of this", e.no_code = 400), t === 1 || t === 2 || t >= 160 || t >= 128 && t <= 143 || ([e.description, e.additional.coin] = a(this, s, N).call(this, n[2]), e.no_code = 38 + t, a(this, s, T).call(this, e.additional.coin, e.additional.where, "coin"), ["tube", "out"].includes(e.additional.where) && this.dispatch("coin-purse:tubes", this.coins.tubes), this.dispatch("coin-purse:coin-event", this.coins)), e; }, z = function(n, e) { const t = parseInt(n[2], 16); return e.name = "Banknote Inserted", e.no_code = 2, e.additional = { where: null, banknote: null }, t === 42 ? (e.name = "Banknote dispensed", e.description = "Banknote dispensed by request.", e.additional.banknote = a(this, s, L).call(this), e.additional.where = "out", e.no_code = 200) : t >= 128 && t <= 143 ? (e.name = "Banknote inserted", e.additional.where = "stacker") : t >= 144 && t <= 159 ? (e.name = "Banknote inserted in pre stacker", e.additional.where = "tmp") : t >= 160 && t <= 175 ? (e.name = "Banknote rejected", e.additional.where = "nothing") : t >= 176 && t <= 191 && (e.name = "Banknote inserted", e.additional.where = "recycler"), t >= 128 && t <= 191 && ([e.description, e.additional.banknote] = a(this, s, j).call(this, n[2]), e.no_code = 74 + t), a(this, s, T).call(this, e.additional.banknote, e.additional.where, "banknote"), this.dispatch("banknote-purse:event-banknote", this.banknotes), e; }, W = function(n, e) { const t = parseInt(n, 16); return t === 1 ? (e.name = "Coin purse enabled", e.description = "Configuration complete, enabled", e.no_code = 3) : t === 0 ? (e.name = "Coin purse disabled", e.description = "Disabled by system request", e.no_code = 4) : (e.name = "Status unknown", e.description = "The response of coin purse doesn't identify successfully", e.no_code = 400), this.dispatch("coin-purse:config", { enabled: t === 1 }), e; }, K = function(n, e) { const t = parseInt(n[2], 16), i = parseInt(n[3], 16); return t === 0 ? (e.name = "Bill purse disabled", e.description = "Configuration complete, disabled") : t === 1 && (e.name = "Bill purse enabled", e.description = "Configuration complete, enabled"), i === 0 ? e.additional.scrow = "Scrow disabled, banknote received automatic" : i === 1 && (e.additional.scrow = "Scrow enabled, require manual action"), e.no_code = 5, this.dispatch("banknote-purse:config", { enabled: t === 1, scrow: i === 1 }), e; }, Y = function(n, e) { e.no_code = 6; const [t, i, r, o, l, u] = [ parseInt(n[2], 16), parseInt(n[3], 16), parseInt(n[4], 16), parseInt(n[5], 16), parseInt(n[6], 16), parseInt(n[7], 16) ]; return e.additional = { coins: { g50: t, c50: i, p1: r, p2: o, p5: l, p10: u } }, this.coins.tubes.g50 = t, this.coins.tubes.c50 = i, this.coins.tubes.p1 = r, this.coins.tubes.p2 = o, this.coins.tubes.p5 = l, this.coins.tubes.p10 = u, this.coins.totals.g50 = (this.coins.box.g50 + t) * 0.5, this.coins.totals.c50 = (this.coins.box.c50 + i) * 0.5, this.coins.totals.p1 = this.coins.box.p1 + r, this.coins.totals.p2 = (this.coins.box.p2 + o) * 2, this.coins.totals.p5 = (this.coins.box.p5 + l) * 5, this.coins.totals.p10 = (this.coins.box.p10 + u) * 10, this.coins.total = this.coins.totals.g50 + this.coins.totals.c50 + this.coins.totals.p1 + this.coins.totals.p2 + this.coins.totals.p5 + this.coins.totals.p10, e.name = "Read tubes", e.description = "Quantity of coins approximated", this.dispatch("coin-purse:tubes", this.coins.tubes), e; }, G = function(n, e) { e.no_code = 7; const [t, i, r, o, l, u] = [ parseInt(n[2], 16), parseInt(n[3], 16), parseInt(n[4], 16), parseInt(n[5], 16), parseInt(n[6], 16), parseInt(n[7], 16) ]; return e.additional = { banknotes: { b20: t, b50: i, b100: r, b200: o, b500: l, b1000: u } }, this.banknotes.recycler.p20 = t, this.banknotes.recycler.p50 = i, this.banknotes.recycler.p100 = r, this.banknotes.recycler.p200 = o, this.banknotes.recycler.p500 = l, this.banknotes.recycler.p1000 = u, this.banknotes.totals.p20 = (this.banknotes.stacker.p20 + t) * 20, this.banknotes.totals.p50 = (this.banknotes.stacker.p50 + i) * 50, this.banknotes.totals.p100 = (this.banknotes.stacker.p100 + r) * 100, this.banknotes.totals.p200 = (this.banknotes.stacker.p200 + o) * 200, this.banknotes.totals.p500 = (this.banknotes.stacker.p500 + l) * 500, this.banknotes.totals.p1000 = (this.banknotes.stacker.p1000 + u) * 1e3, this.banknotes.total = this.banknotes.totals.p20 + this.banknotes.totals.p50 + this.banknotes.totals.p100 + this.banknotes.totals.p200 + this.banknotes.totals.p500 + this.banknotes.totals.p1000, e.name = "Read recycler", e.description = "Quantity of banknotes approximated", this.dispatch("banknote-purse:recycler", this.banknotes.recycler), e; }, H = function(n, e) { const t = parseInt(n, 16); return t === 1 ? e.name = "Banknote accepted" : t === 0 ? e.name = "Banknote rejected" : e.name = "Unknown status banknote", e.no_code = 8, this.dispatch("banknote-purse:banknote-scrow-status", { status: t === 1 }), e; }, J = function(n, e) { const [t, i, r, o, l, u] = [ parseInt(n[2], 16), parseInt(n[3], 16), parseInt(n[4], 16), parseInt(n[5], 16), parseInt(n[6], 16), parseInt(n[7], 16) ], q = t * 20 + i * 50 + r * 100 + o * 200 + l * 500 + u * 1e3; return e.name = "Banknotes dispensed", e.description = q > 0 ? "Banknotes dispensed by request" : "No banknotes dispensed, recycler empty", e.no_code = 9, e.additional = { banknotes: { b20: t, b50: i, b100: r, b200: o, b500: l, b1000: u }, total_dispensed: q }, this.dispatch("session:money-dispensed", { type_money: null, retired: null, finish: !1, type: "banknotes", data: e }), e; }, X = function(n, e) { return e.name = "Coins dispensed", e.no_code = 10, e.description = "Coins dispensed by request", isNaN(this.__sale.last_change) && (this.__sale.last_change = 0), this.__money_session.retired += this.__sale.last_change, this.dispatchAsync( "session:money-dispensed", { type_money: null, retired: null, finish: !1, type: "coins" }, 500 ), e; }, Z = function(n, e) { const t = parseInt(n, 16); return t === 1 ? (e.name = "Product not delivered", e.description = "The product requested wasn't delivered", e.no_code = 11, this.__internal__.dispense.status = !1) : t === 0 ? (e.name = "Product delivered", e.description = "The product requested was delivered", e.no_code = 12, this.__internal__.dispense.status = !0) : (e.name = "Unknown status product", e.description = "The response of product doesn't identify successfully", e.no_code = 400, this.__internal__.dispense.status = !1), this.dispatch("dispensed", {}), e; }, g = function(n, e) { let t = "closed"; return n === "db" ? (e.name = "Door closed", e.no_code = 13) : n === "dc" ? (e.name = "Door open", e.no_code = 14, t = "open") : (e.name = "Unknown status door", e.description = "The response of door doesn't identify successfully", e.no_code = 400, t = "unknown"), this.__internal__.device.door_open = t === "open", this.dispatch("event:door", { open: t === "open" }), this.dispatch("door:event", { open: t === "open" }), e; }, ee = function(n, e) { const t = parseInt(n[2], 16) * 255, i = parseInt(n[3], 16), r = (t + i) * 0.1; return e.no_code = 15, e.name = "Temperature status", e.description = `Temperature: ${r}`, e.additional = { high: t, low: i, temperature: parseFloat(r.toString()) }, this.dispatch("status:temperature", e.additional), e; }, ne = function(n, e) { const t = parseInt(n, 16); let i = "unknown"; return t === 1 ? (e.name = "Relay on", e.description = "Relay on", e.no_code = 16, i = "on") : t === 0 ? (e.name = "Relay off", e.description = "Relay off", e.no_code = 17, i = "off") : (e.name = "Status unknown", e.description = "Status unknown", e.no_code = 400), this.dispatch("status:relay", { enabled: i === "on" }), e; }, te = function(n, e) { const t = parseInt(n[2], 16); if (e.no_code = 20 + t, e.name = "Status unknown", e.description = "The status of card reader does not identified correctly", t === 0) e.request += ":disable", e.name = "Card reader disabled", e.description = "Card reader device was disabled successfully"; else if (t === 1 || t === 2) e.request += ":dispense", e.name = "Card reader enabled", e.description = "Card reader device is now enabled"; else if (t === 3) e.request += ":pre-authorize", e.name = "Pre-authorized credit", e.description = "The pre credit was authorized successfully"; else if (t === 4) e.request += ":cancel", e.name = "Cancellation in progress", e.description = "Cancellation request done successfully"; else if (t === 5) e.request += ":sell", e.name = "Sell approved", e.description = "Sell approved, starting dispense product"; else if (t === 6) e.request += ":sell", e.name = "Sell denied", e.description = "This sell was denied, try again"; else if (t === 7) e.request += ":end", e.name = "Session ended", e.description = "The session ended"; else if (t === 8) e.request += ":cancel", e.name = "Cancelled", e.description = "Cancellation complete"; else if (t === 10) { const i = parseInt(n[8], 16); i === 1 ? (e.no_code = 30, e.name = "product not dispensed", e.description = "The product requested wasn't delivered") : i === 0 ? (e.no_code = 31, e.name = "product dispensed", e.description = "The product requested was delivered") : (e.name = "finished-unknown", e.no_code = 400); } else e.no_code = 400; return this.dispatch("card-reader:event", e), e; }, se = function({ enable: n = !1, scrow: e = !1 } = {}) { return d.banknotePurseICTConfigure({ enable: n, scrow: e }); }, ie = function({ enable: n = !1, scrow: e = !1 } = {}) { return d.banknotePurseOtherConfigure({ enable: n, scrow: e }); }, re = function(n = 1) { if (n < 1) throw new Error("No banknotes to dispense"); const e = [20, 50, 100, 200, 500][this.__banknote_purse.recycler.banknote]; return d.banknotePurseICTDispense({ quantity: n, denomination: e }); }, ae = function({ $_20: n = 0, $_50: e = 0, $_100: t = 0, $_200: i = 0, $_500: r = 0, $_1000: o = 0 } = {}) { return d.banknotePurseOtherDispense({ $20: n, $50: e, $100: t, $200: i, $500: r, $1000: o }); }, R = function() { b(this, f, !1), b(this, _, 0), b(this, k, 0); }, /** * * @param {null|object} dispensed * @param {number} limit */ C = function({ dispensed: n = null, limit: e = 80 } = {}) { b(this, k, Math.round(w(this, _) * 100 / e)), this.dispatch("percentage:test", { percentage: w(this, k), dispensed: n }); }, oe = function(n) { const e = ["20", "50", "100", "200", "500"], t = this.__banknote_purse.recycler.banknote, i = "$_" + e[t], r = parseInt(e[t]), o = this.banknotes.recycler[`p${e[t]}`], l = Math.min(Math.floor(n / r), o), u = { banknotes: { $_20: 0, $_50: 0, $_100: 0, $_200: 0, $_500: 0, $_1000: 0 }, pending: n, will_dispense: l > 0 }; return this.totalInRecycler === 0 || l < 1 || n === 0 || (u.banknotes[i] = l, u.pending = parseFloat((n - l * r).toFixed(2))), u; }, le = function(n) { const e = { banknotes: { $_20: 0, $_50: 0, $_100: 0, $_200: 0, $_500: 0, $_1000: 0 }, pending: n, will_dispense: !1 }; if (this.totalInRecycler === 0 || n === 0) return e; const t = (i, r) => { if (this.banknotes.recycler[r] > 0) { const o = Math.floor(e.pending / i), l = Math.min(o, this.banknotes.recycler[r]); e.banknotes[`$_${i}`] = l, e.pending = parseFloat((e.pending - l * i).toFixed(2)); } }; return t(1e3, "p1000"), t(500, "p500"), t(200, "p200"), t(100, "p100"), t(50, "p50"), t(20, "p20"), e.will_dispense = Object.values(e.banknotes).some((i) => i > 0), e; }, P = function(n) { return this.hasRecycler ? a(this, s, v).call(this) ? a(this, s, oe).call(this, n) : a(this, s, le).call(this, n) : { banknotes: { $_20: 0, $_50: 0, $_100: 0, $_200: 0, $_500: 0, $_1000: 0 }, pending: n, will_dispense: !1 }; }, $ = function(n) { const e = { coins: { $_50c: 0, $_1: 0, $_2: 0, $_5: 0, $_10: 0 }, pending: n, will_dispense: !1 }; if (!this.hasCoinPurse || n <= 0 || this.totalInTubes === 0) return e; const t = (i, r, o = null) => { if (this.coins.tubes[r] > 0) { o === null && (o = "$_" + i); const l = Math.floor(e.pending / i), u = Math.min(l, this.coins.tubes[r]); e.coins[o] = u, e.pending = parseFloat((e.pending - u * i).toFixed(2)); } }; return t(10, "p10"), t(5, "p5"), t(2, "p2"), t(1, "p1"), t(0.5, "g50", "$_50c"), e.will_dispense = Object.values(e.coins).some((i) => i > 0), e; }, B = async function(n = null) { if (!a(this, s, S).call(this)) throw new Error("Change not available"); let e = this.change, t = this.change; if (n !== null && (e = n, t = n), t <= 0) return !1; const i = a(this, s, P).call(this, t); t = i.pending; const r = a(this, s, $).call(this, t); return t = r.pending, t > 0 && this.dispatch("change:pending", { pending: t }), this.dispatch("change:dispense", { recycler: i.banknotes, coins: r.coins, pending: t, delivery: e - t }), t === e ? !1 : (i.will_dispense && await this.banknotePurseDispense(i.banknotes), r.will_dispense && await this.coinPurseDispense(r.coins), !0); }; export { _e as Boardroid };