@danidoble/webserial
Version:
WebSerial API wrapper
766 lines (765 loc) • 33.9 kB
JavaScript
import { K as u, D as p } from "./kernel-BnWXOCde.js";
import { l } from "./relay-DP8PLsDP.js";
class _ extends u {
__coin_purse = {
available: !0
};
__banknote_purse = {
available: !0,
isRecycler: !0,
recycler: {
ict: !0,
banknote: 1
// 0: $20, 1: $50, 2: $100, 3: $200, 4: $500
}
};
__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;
}
};
__money_session = {
inserted: 0,
retired: 0,
clear() {
this.inserted = 0, this.retired = 0;
}
};
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
};
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
};
card_reader = {
available: !1,
max_pre_credit: 0
};
#n = !1;
#e = 0;
#t = 0;
constructor({ filters: n = null, config_port: e, no_device: t = 1, socket: s = !1 } = {}) {
if (super({ filters: n, config_port: e, no_device: t, socket: s }), this.__internal__.device.type = "boardroid", p.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
}, this.#p(), p.add(this);
}
#p() {
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);
}
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;
}
#s() {
return this.__banknote_purse.isRecycler && this.__banknote_purse.recycler.ict;
}
#u() {
return this.hasCoinPurse || this.hasRecycler;
}
softReload() {
super.softReload(), this.__sale.clear(), this.__money_session.clear();
}
#d(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;
}
#h(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;
}
#b(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 (const i in e)
if (e[i].includes(n)) {
t = i;
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];
}
#_(n) {
return ["g50", "c50", "p1", "p2", "p5", "p10", "p20"].includes(n);
}
#f(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 (const i in e)
if (e[i].includes(n)) {
t = i;
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];
}
#k(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;
}
#y(n) {
return ["p20", "p50", "p100", "p200", "p500", "p1000"].includes(n);
}
#w(n) {
return ["r20", "r50", "r100"].includes(n);
}
#v() {
return ["r20", "r50", "r100", "r200", "r500"][this.__banknote_purse.recycler.banknote];
}
#r(n, e, t) {
if (!n) return;
let s = !0;
if (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 i = 0;
["g50", "c50"].includes(n) ? i = 0.5 : i += parseInt(n.slice(1)), this.coins.totals[n] += i, this.__money_session.inserted += i, this.coins.total += i;
const r = this.#h(n);
r && this.dispatch("money:inserted", {
type: "coin",
money: r,
// {value:number,name:string}
where: e
});
} else if (this.#y(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);
const i = parseInt(n.slice(1));
this.banknotes.totals[n] += i, this.__money_session.inserted += i, this.banknotes.total += i;
const r = this.#k(n);
r && this.dispatch("money:inserted", {
type: "banknote",
money: r,
// {value:number,name:string}
where: e
});
} else if (this.#w(n) && e === "out" && t === "banknote") {
if (typeof this.banknotes.out[n.replace("r", "p")] > "u")
return;
this.banknotes.out[n.replace("r", "p")] += 1;
const i = parseInt(n.slice(1));
this.__money_session.retired += i, this.banknotes.recycler[n.replace("r", "p")] -= 1, this.banknotes.total -= i, s = !1, this.dispatch("session:money-dispensed", { type_money: n, retired: i, finish: !1, type: "banknotes" });
}
s && this.dispatch("session:money-request", {});
}
#C(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] = this.#b(n[2]), e.no_code = 38 + t, this.#r(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;
}
#I(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 = this.#v(), 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] = this.#f(n[2]), e.no_code = 74 + t), this.#r(e.additional.banknote, e.additional.where, "banknote"), this.dispatch("banknote-purse:event-banknote", this.banknotes), e;
}
#T(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;
}
#R(n, e) {
const t = parseInt(n[2], 16), s = 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"), s === 0 ? e.additional.scrow = "Scrow disabled, banknote received automatic" : s === 1 && (e.additional.scrow = "Scrow enabled, require manual action"), e.no_code = 5, this.dispatch("banknote-purse:config", { enabled: t === 1, scrow: s === 1 }), e;
}
#P(n, e) {
e.no_code = 6;
const [t, s, i, r, a, o] = [
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: s, p1: i, p2: r, p5: a, p10: o }
}, this.coins.tubes.g50 = t, this.coins.tubes.c50 = s, this.coins.tubes.p1 = i, this.coins.tubes.p2 = r, this.coins.tubes.p5 = a, this.coins.tubes.p10 = o, this.coins.totals.g50 = (this.coins.box.g50 + t) * 0.5, this.coins.totals.c50 = (this.coins.box.c50 + s) * 0.5, this.coins.totals.p1 = this.coins.box.p1 + i, this.coins.totals.p2 = (this.coins.box.p2 + r) * 2, this.coins.totals.p5 = (this.coins.box.p5 + a) * 5, this.coins.totals.p10 = (this.coins.box.p10 + o) * 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;
}
#$(n, e) {
e.no_code = 7;
const [t, s, i, r, a, o] = [
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: s, b100: i, b200: r, b500: a, b1000: o }
}, this.banknotes.recycler.p20 = t, this.banknotes.recycler.p50 = s, this.banknotes.recycler.p100 = i, this.banknotes.recycler.p200 = r, this.banknotes.recycler.p500 = a, this.banknotes.recycler.p1000 = o, this.banknotes.totals.p20 = (this.banknotes.stacker.p20 + t) * 20, this.banknotes.totals.p50 = (this.banknotes.stacker.p50 + s) * 50, this.banknotes.totals.p100 = (this.banknotes.stacker.p100 + i) * 100, this.banknotes.totals.p200 = (this.banknotes.stacker.p200 + r) * 200, this.banknotes.totals.p500 = (this.banknotes.stacker.p500 + a) * 500, this.banknotes.totals.p1000 = (this.banknotes.stacker.p1000 + o) * 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;
}
#B(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;
}
#q(n, e) {
const [t, s, i, r, a, o] = [
parseInt(n[2], 16),
parseInt(n[3], 16),
parseInt(n[4], 16),
parseInt(n[5], 16),
parseInt(n[6], 16),
parseInt(n[7], 16)
], c = t * 20 + s * 50 + i * 100 + r * 200 + a * 500 + o * 1e3;
return e.name = "Banknotes dispensed", e.description = c > 0 ? "Banknotes dispensed by request" : "No banknotes dispensed, recycler empty", e.no_code = 9, e.additional = {
banknotes: { b20: t, b50: s, b100: i, b200: r, b500: a, b1000: o },
total_dispensed: c
}, this.dispatch("session:money-dispensed", {
type_money: null,
retired: null,
finish: !1,
type: "banknotes",
data: e
}), e;
}
#D(n) {
n.name = "Coins dispensed", n.no_code = 10, n.description = "Coins dispensed by request", isNaN(this.__sale.last_change) && (this.__sale.last_change = 0), this.__money_session.retired += this.__sale.last_change;
const e = {
type_money: null,
retired: null,
finish: !1,
type: "coins"
};
return this.dispatchAsync("session:money-dispensed", e, 500), n;
}
#x(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;
}
#E(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;
}
#M(n, e) {
const t = parseInt(n[2], 16) * 255, s = parseInt(n[3], 16), i = (t + s) * 0.1;
return e.no_code = 15, e.name = "Temperature status", e.description = `Temperature: ${i}`, e.additional = {
high: t,
low: s,
temperature: parseFloat(i.toString())
}, this.dispatch("status:temperature", e.additional), e;
}
#S(n, e) {
const t = parseInt(n, 16);
let s = "unknown";
return t === 1 ? (e.name = "Relay on", e.description = "Relay on", e.no_code = 16, s = "on") : t === 0 ? (e.name = "Relay off", e.description = "Relay off", e.no_code = 17, s = "off") : (e.name = "Status unknown", e.description = "Status unknown", e.no_code = 400), this.dispatch("status:relay", { enabled: s === "on" }), e;
}
#m(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 s = parseInt(n[8], 16);
s === 1 ? (e.no_code = 30, e.name = "product not dispensed", e.description = "The product requested wasn't delivered") : s === 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;
}
serialMessage(n) {
n = this.fixHexArray(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 = this.#d(e);
break;
case "a0":
e.request = "--automatic", e = this.#C(n, e);
break;
case "b0":
e.request = "--automatic", e = this.#I(n, e);
break;
case "d0":
e.request = "coin-purse:config", e = this.#T(n[2], e);
break;
case "d1":
e.request = "banknote-purse:config", e.additional = { scrow: null }, e = this.#R(n, e);
break;
case "d2":
e.request = "coin-purse:read-tubes", e = this.#P(n, e);
break;
case "d3":
e.request = "banknote-purse:read-recycler", e = this.#$(n, e);
break;
case "d4":
e.request = "banknote-purse:banknote-scrow-status", e = this.#B(n[2], e);
break;
case "d5":
e.request = "banknote-purse:dispense", e = this.#q(n, e);
break;
case "d6":
e.request = "coin-purse:dispense", e = this.#D(e);
break;
case "d7":
e.request = "dispense", e = this.#x(n[5], e);
break;
case "d8":
e.request = "--automatic", e = this.#E(n[13], e);
break;
case "d9":
e.request = "status:temperature", e = this.#M(n, e);
break;
case "da":
e.request = "status:relay", e = this.#S(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", this.#m(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 l.connection({ channel: n });
}
async coinPurseConfigure({ enable: n = !1, high: e = 255, low: t = 255 } = {}) {
if (!this.__coin_purse.available) throw new Error("Coin purse not available");
return await this.appendToQueue(
l.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: s = 0, $_10: i = 0 } = {}) {
if (!this.__coin_purse.available) throw new Error("Coin purse not available");
return await this.appendToQueue(
l.coinPurseDispense({
$50c: n,
$1: e,
$2: t,
$5: s,
$10: i
}),
"coin-purse:dispense"
);
}
async coinPurseReadTubes() {
return await this.appendToQueue(l.coinPurseReadTubes(), "coin-purse:read-tubes");
}
#Q({ enable: n = !1, scrow: e = !1 } = {}) {
return l.banknotePurseICTConfigure({ enable: n, scrow: e });
}
#N({ enable: n = !1, scrow: e = !1 } = {}) {
return l.banknotePurseOtherConfigure({ enable: n, scrow: e });
}
async banknotePurseConfigure({ enable: n = !1, scrow: e = !1 } = {}) {
if (!this.__banknote_purse.available) throw new Error("Banknote purse not available");
let t;
return this.#s() ? t = this.#Q({ enable: n, scrow: e }) : t = this.#N({ enable: n, scrow: e }), await this.appendToQueue(t, "banknote-purse:config");
}
#j(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 l.banknotePurseICTDispense({ quantity: n, denomination: e });
}
#A({ $_20: n = 0, $_50: e = 0, $_100: t = 0, $_200: s = 0, $_500: i = 0, $_1000: r = 0 } = {}) {
return l.banknotePurseOtherDispense({
$20: n,
$50: e,
$100: t,
$200: s,
$500: i,
$1000: r
});
}
async banknotePurseDispense({ $_20: n = 0, $_50: e = 0, $_100: t = 0, $_200: s = 0, $_500: i = 0, $_1000: r = 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 a;
if (this.#s()) {
const o = [n, e, t, s, i];
a = this.#j(o[this.__banknote_purse.recycler.banknote]);
} else
a = this.#A({ $_20: n, $_50: e, $_100: t, $_200: s, $_500: i, $_1000: r });
await this.appendToQueue(a, "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(
l.banknotePurseAcceptInScrow(),
"banknote-purse:banknote-scrow-status"
);
}
async banknotePurseRejectInScrow() {
if (!this.__banknote_purse.available) throw new Error("Banknote purse not available");
return await this.appendToQueue(
l.banknotePurseRejectInScrow(),
"banknote-purse:banknote-scrow-status"
);
}
async banknotePurseSaveMemory({
channel: n = null,
$_20: e = null,
$_50: t = null,
$_100: s = null,
$_200: i = null,
$_500: r = null,
$_1000: a = null
} = {}) {
if (!this.__banknote_purse.available) throw new Error("Banknote purse not available");
return await this.appendToQueue(
l.banknotePurseSaveMemory({
channel: n,
$20: e,
$50: t,
$100: s,
$200: i,
$500: r,
$1000: a
}),
"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(l.banknotePurseReadRecycler(), "banknote-purse:read-recycler");
}
async cardReaderDisable() {
if (!this.card_reader.available) throw new Error("Card reader not available");
return await this.appendToQueue(l.cardReaderDisable(), "card-reader:disable");
}
async cardReaderDispense({ channel: n = 1, second_channel: e = null, sensor: t = !0, seconds: s = null, price: i = 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 = i), isNaN(i) || i <= 0) throw new Error("Price must be greater than 0");
if (i > this.card_reader.max_pre_credit) throw new Error("Price is greater than pre-credit configured");
if (!t && (s === null || s <= 0 || s > 40))
throw new Error("Invalid time to dispense without sensor, must be between 0.1 and 40.0 seconds");
return this.appendToQueue(
l.cardReaderDispense({
selection: n,
second_selection: e,
sensor: t,
seconds: s,
price: i
}),
"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(l.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(l.readTemperature(), "status:temperature");
}
async dispense({
selection: n = 1,
second_selection: e = null,
sensor: t = !0,
seconds: s = null,
retry: i = !0
} = {
selection: 1,
second_selection: null,
sensor: !0,
seconds: null,
retry: !0
}) {
if (n = parseInt(n, 10), 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 && (s === null || s <= 0 || s > 40))
throw new Error("Invalid time to dispense without sensor, must be between 0.1 and 40.0 seconds");
i && (this.__internal__.dispense.backup_dispense = {
selection: n,
second_selection: e,
sensor: t,
seconds: s
});
const r = l.dispense({
selection: n,
second_selection: e,
sensor: t,
seconds: s
});
t || (s || (s = 1.5), this.__internal__.dispense.custom_limit_counter = s + 0.2);
let a = await this.internalDispense(r);
return !a.status && i && (a = await this.internalDispense(r)), this.__internal__.dispense.custom_limit_counter = null, a;
}
#a() {
this.#n = !1, this.#e = 0, this.#t = 0;
}
#i({
dispensed: n = null,
limit: e = 80
} = {}) {
this.#t = Math.round(this.#e * 100 / e), this.dispatch("percentage:test", { percentage: this.#t, dispensed: n });
}
async testEngines({ singleEngine: n = !1 } = {}) {
if (this.isDispensing) throw new Error("Another dispensing process is running");
if (this.#n) throw new Error("Another test is running");
this.#a(), this.#n = !0;
const e = [];
this.#i();
for (let t = 1; t <= 80; t++) {
const s = await this.dispense({
selection: t,
second_selection: n ? null : t + 1,
sensor: !1,
seconds: 0.4,
retry: !1
});
e.push(s), this.#e = t, this.#i(), n || t++;
}
this.#e = 80, this.#i({ dispensed: e }), this.#a();
}
async sendCustomCode({
code: n = []
} = {
code: []
}) {
if (n.length === 0) throw new Error("Invalid code");
return await this.appendToQueue(l.customCode(n), "custom");
}
#O(n) {
const e = ["20", "50", "100", "200", "500"], t = this.__banknote_purse.recycler.banknote, s = "$_" + e[t], i = parseInt(e[t]), r = this.banknotes.recycler[`p${e[t]}`], a = Math.min(Math.floor(n / i), r), o = {
banknotes: { $_20: 0, $_50: 0, $_100: 0, $_200: 0, $_500: 0, $_1000: 0 },
pending: n,
will_dispense: a > 0
};
return this.totalInRecycler === 0 || a < 1 || n === 0 || (o.banknotes[s] = a, o.pending = parseFloat((n - a * i).toFixed(2))), o;
}
#U(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 = (s, i) => {
if (this.banknotes.recycler[i] > 0) {
const r = Math.floor(e.pending / s), a = Math.min(
r,
this.banknotes.recycler[i]
);
e.banknotes[`$_${s}`] = a, e.pending = parseFloat((e.pending - a * s).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((s) => s > 0), e;
}
#o(n) {
return this.hasRecycler ? this.#s() ? this.#O(n) : this.#U(n) : {
banknotes: { $_20: 0, $_50: 0, $_100: 0, $_200: 0, $_500: 0, $_1000: 0 },
pending: n,
will_dispense: !1
};
}
#l(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 = (s, i, r = null) => {
if (this.coins.tubes[i] > 0) {
r === null && (r = "$_" + s);
const a = Math.floor(e.pending / s), o = Math.min(a, this.coins.tubes[i]);
e.coins[r] = o, e.pending = parseFloat((e.pending - o * s).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((s) => s > 0), e;
}
hasToReturnChange(n = 0) {
let e = n;
return e <= 0 ? !0 : (e = this.#o(e).pending, e = this.#l(e).pending, !(e > 0));
}
async #c(n = null) {
if (!this.#u()) 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 s = this.#o(t);
t = s.pending;
const i = this.#l(t);
return t = i.pending, t > 0 && this.dispatch("change:pending", { pending: t }), this.dispatch("change:dispense", {
recycler: s.banknotes,
coins: i.coins,
pending: t,
delivery: e - t
}), t === e ? !1 : (s.will_dispense && await this.banknotePurseDispense(s.banknotes), i.will_dispense && await this.coinPurseDispense(i.coins), !0);
}
async returnChange() {
return await this.#c();
}
async returnInsertedMoney() {
return this.__money_session.inserted <= 0 ? !1 : await this.#c(this.__money_session.inserted);
}
// @ts-expect-error override function in Core
async serialCorruptMessage(n, e) {
this.dispatch("corrupt:message", { data: n, message: e });
}
}
export {
_ as Boardroid
};