@danidoble/webserial
Version:
WebSerial API wrapper
3 lines (2 loc) • 9.66 kB
JavaScript
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./webserial-core-BgEbN4Gb.cjs");class d extends s.v{__hoppers__={levels:[{id:1,currency:10,key:"Hopper 1",name:"10 Pesos",amount:0,capacity:1e3},{id:2,currency:5,key:"Hopper 2",name:"5 Pesos",amount:0,capacity:1e3},{id:3,currency:2,key:"Hopper 3",name:"2 Pesos",amount:0,capacity:1e3},{id:4,currency:1,key:"Hopper 4",name:"1 Peso",amount:0,capacity:1e3}],balance:0,current:null};constructor({filters:e=null,config_port:t={baudRate:115200,dataBits:8,stopBits:1,parity:"none",bufferSize:32768,flowControl:"none"},no_device:r=1,socket:n=!1}={filters:null,config_port:{baudRate:115200,dataBits:8,stopBits:1,parity:"none",bufferSize:32768,flowControl:"none"},no_device:1,socket:!1}){if(super({filters:e,config_port:t,no_device:r,socket:n}),this.__internal__.device.type="hopper",s.s.getCustom(this.typeDevice,r))throw new Error(`Device ${this.typeDevice} ${r} already exists`);this.__internal__.time.response_connection=7e3,this.__internal__.time.response_general=7e3,this.__internal__.serial.delay_first_connection=500,this.__internal__.serial.response.replacer="",this.__internal__.serial.response.limiter=`\r
`,s.s.add(this),this.#s()}#s(){const e=["levels","hopper:updated","dispense-change","balance:updated","validator:status","change:1x1"];for(const t of e)this.serialRegisterAvailableListener(t)}get balance(){return this.__hoppers__.balance}get currentHopper(){return this.__hoppers__.current}get levels(){return this.__hoppers__.levels}setMaxCapacity({hopper:e=1,capacity:t=1e3}={hopper:1,capacity:1e3}){return this.#r(e),this.__hoppers__.levels[e-1].capacity=t,this}setHopperName({hopper:e=1,name:t=""}={hopper:1,name:""}){if(this.#r(e),typeof t!="string"||t.length===0)throw new TypeError("Name must be a non-empty string");return this.__hoppers__.levels[e-1].name=t,this}setHopperKey({hopper:e=1,key:t=""}={hopper:1,key:""}){if(this.#r(e),typeof t!="string"||t.length===0)throw new TypeError("Key must be a non-empty string");return this.__hoppers__.levels[e-1].key=t,this}setHopperCurrency({hopper:e=1,currency:t=1}={hopper:1,currency:1}){if(this.#r(e),typeof t!="number"||t<=0)throw new RangeError("Currency must be a positive number");return this.__hoppers__.levels[e-1].currency=t,this}#n(e){e.error=!0,e.ascii.includes("ffffff")?(e.name="SINTAX",e.description="Error de Sintaxis",e.no_code=400):e.ascii.includes("ffaaaa")?(e.name="LOWLEVEL",e.description="Bajo nivel de monedas en Hopper (99)",e.no_code=401):e.ascii.includes("ffbbbb")?(e.name="TIMEOUT_DISPENSE",e.description="Error de dispensado, timeout",e.no_code=402):(e.name="UNKNOWN_ERROR",e.description="Unknown error occurred",e.no_code=999),this.dispatch("serial:message",e)}#i(e){if(this.lastAction==="status")e.name="STATUS",e.description="Hoppers status",e.no_code=1,this.__hoppers__.levels[0].amount=this.#t(e.code[9],e.code[10]),this.__hoppers__.levels[1].amount=this.#t(e.code[7],e.code[8]),this.__hoppers__.levels[2].amount=this.#t(e.code[5],e.code[6]),this.__hoppers__.levels[3].amount=this.#t(e.code[3],e.code[4]),e.data=this.__hoppers__.levels,this.dispatch("levels",e.data);else if(this.lastAction==="readHopper"){e.name="READ_HOPPER",e.description=`Hopper ${this.__hoppers__.current} level`,e.no_code=2;const t=(this.__hoppers__.current||1)-1;this.__hoppers__.levels[t].amount=this.#t(e.code[9],e.code[10]),e.data=this.__hoppers__.levels,e.hopperId=this.__hoppers__.current,this.dispatch("hopper:updated",this.__hoppers__.levels[t])}else if(this.lastAction==="writeHopper"){e.name="WRITE_HOPPER",e.description="Hopper "+this.__hoppers__.current+" write",e.no_code=3,this.__hoppers__.levels[(this.__hoppers__.current||1)-1].amount=this.#t(e.code[9],e.code[10]),e.data=this.__hoppers__.levels,e.hopperId=this.__hoppers__.current;const t=(this.__hoppers__.current||1)-1;this.dispatch("hopper:updated",this.__hoppers__.levels[t])}else if(this.lastAction==="dispenseHopper"){e.name="DISPENSEHOPPER",e.description="Hopper "+this.__hoppers__.current+" dispense",e.no_code=4,this.__hoppers__.levels[(this.__hoppers__.current||1)-1].amount=this.#t(e.code[9],e.code[10]),e.data=this.__hoppers__.levels,e.hopperId=this.__hoppers__.current;const t=(this.__hoppers__.current||0)-1;this.dispatch("hopper:updated",this.__hoppers__.levels[t])}else this.lastAction==="dispenseChange"?(e.name="DISPENSE_CHANGE",e.description="Change dispensed",e.no_code=5,e.data=this.#t(e.code[9],e.code[10]),this.dispatch("dispense-change",{amount:e.data})):this.lastAction==="readBalance"?(e.name="READ_BALANCE",e.description="Read Balance",e.no_code=6,this.__hoppers__.balance=this.#t(e.code[9],e.code[10]),e.data=this.__hoppers__.balance,this.dispatch("balance:updated",{balance:e.data})):this.lastAction==="clearBalance"?(e.name="CLEAR_BALANCE",e.description="Clared hoppers balance",e.no_code=7,this.__hoppers__.balance=this.#t(e.code[9],e.code[10]),e.data=this.__hoppers__.balance,this.dispatch("balance:updated",{balance:e.data})):this.lastAction==="configValidator"?(e.code[2]===1?(e.name="ENABLE_VALIDATOR",e.description="Validator enabled",e.no_code=8,this.dispatch("validator:status",{enabled:!0})):(e.name="DISABLE_VALIDATOR",e.description="Validator disabled",e.no_code=9,this.dispatch("validator:status",{enabled:!1})),e.no_code=400,e.data=e.code[2]===1?"enabled":"disabled"):this.lastAction?.includes("change1x1Hopper")&&(e.code[2]===1?(e.name="CHANGE_1X1_HOPPER_1",e.description="Change 1x1 Hopper 1",e.no_code=10):e.code[2]===2?(e.name="CHANGE_1X1_HOPPER_2",e.description="Change 1x1 Hopper 2",e.no_code=11):e.code[2]===3?(e.name="CHANGE_1X1_HOPPER_3",e.description="Change 1x1 Hopper 3",e.no_code=12):e.code[2]===4?(e.name="CHANGE_1X1_HOPPER_4",e.description="Change 1x1 Hopper 4",e.no_code=13):(e.name="CHANGE_1X1_HOPPER_UNKNOWN",e.description="Change 1x1 Hopper Unknown",e.no_code=14),this.dispatch("change:1x1",{hopperId:e.code[2]}));this.dispatch("serial:message",e)}serialMessage(e){const t=e,r=this.parseUint8ArrayToString(t),i={ascii:this.asciiToHex(r),code:t,name:"",description:"",request:this.lastAction,no_code:0,error:!1,data:null};if(t.length===3){this.#n(i);return}const p=Array.from(t);if(t.length!==13){const c=this.#p({array:p,chunkSize:13});for(const o of c){const a=this.parseUint8ArrayToString(new Uint8Array(o)),h=this.asciiToHex(a),_=this.stringToArrayHex(a);i.code=o,i.hex=_,i.ascii=h,o.length!==13?this.#n(i):this.#i(i)}return}this.#i(i)}#t(e,t){return(e<<8|t)<<16>>16}#r(e){if(typeof e!="number"||e<1||e>4)throw new RangeError("Hopper ID must be a number between 1 and 4");if(typeof e!="number"||!Number.isInteger(e))throw new TypeError("Hopper ID must be an integer")}#o(e){if(typeof e!="number"||e<-32768||e>32767)throw new RangeError("Quantity must be a number between -32768 and 32767");if(typeof e!="number"||!Number.isInteger(e))throw new TypeError("Quantity must be an integer")}#a(e){this.#o(e);const t=e&65535,r=t>>8&255,n=t&255;return[r,n]}#p({array:e,chunkSize:t=13}={array:[],chunkSize:13}){if(!Array.isArray(e))throw new TypeError("Expected an array");if(typeof t!="number"||t<=0)throw new RangeError("Chunk size must be a positive number");const r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}#e(e){e.length<11&&(e=[...e,...Array(11-e.length).fill(0)]);const r=e.slice(1,11).reduce((n,i)=>{if(typeof i!="number")throw new TypeError("Array must contain only numbers");return n+i},0)&255;return e[11]=r,e[12]=15,e}serialSetConnectionConstant(){return[10,0,0,0,0,0,0,0,0,0,0,0,15]}async sendConnect(){const e=this.#e([10]);return await this.appendToQueue(e,"connect")}async requestStatus(){const e=this.#e([10,10,11,12]);return await this.appendToQueue(e,"status")}async readBalance(){const e=this.#e([10,192,1]);return await this.appendToQueue(e,"readBalance")}async clearBalance(){const e=this.#e([10,192,2]);return await this.appendToQueue(e,"clearBalance")}async forceInvalid(){const e="0A000F00".match(/.{1,2}/g);return await this.appendToQueue(e,"ForceInvalid")}async readHopper({hopper:e=1}={hopper:1}){this.#r(e),this.__hoppers__.current=e;const t=this.#e([10,e,e]);return await this.appendToQueue(t,"readHopper")}async writeHopper({hopper:e=1,quantity:t=0}={hopper:1,quantity:0}){this.#r(e),this.#o(t),this.__hoppers__.current=e;const[r,n]=this.#a(t),i=this.#e([10,240,e,0,0,0,0,0,0,r,n]);return await this.appendToQueue(i,"writeHopper")}async dispenseHopper({hopper:e=1}={hopper:1}){this.#r(e),this.__hoppers__.current=e;const t=this.#e([10,2,e]);return await this.appendToQueue(t,"dispenseHopper")}async dispenseChange({change:e=0}={change:0}){if(typeof e!="number"||e<0||e>32767)throw new RangeError("Change must be a number between 0 and 32767");if(typeof e!="number"||!Number.isInteger(e))throw new TypeError("Change must be an integer");const t=e&255,r=e>>8&255,n=this.#e([10,204,170,0,0,0,0,0,0,r,t]);return await this.appendToQueue(n,"dispenseChange")}async configValidator({enable:e=!1}={enable:!1}){if(typeof e!="boolean")throw new TypeError("Enable must be a boolean");const t=this.#e([10,176,e?1:0]);return await this.appendToQueue(t,"configValidator")}async disableValidator(){return await this.configValidator({enable:!1})}async enableValidator(){return await this.configValidator({enable:!0})}async change1x1({hopper:e=1}={hopper:1}){this.#r(e),this.__hoppers__.current=e;const t=this.#e([10,224,e]);return await this.appendToQueue(t,"change1x1Hopper-"+e)}async sendCustomCode({code:e=[]}={code:[]}){if(!Array.isArray(e)||!e.every(r=>typeof r=="number"&&r>=0&&r<=255))throw new TypeError("Code must be an array of numbers between 0 and 255");const t=this.#e(e);await this.appendToQueue(t,"custom")}}exports.Hopper=d;