UNPKG

@mmote/niimblue-node

Version:

Headless clients for niimbluelib. Command line interface, simple REST server are also included.

132 lines (131 loc) 4.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NiimbotHeadlessSerialClient = void 0; const serialport_1 = require("serialport"); const niimbluelib_1 = require("@mmote/niimbluelib"); // Open SerialPort asynchronously instead of callback const serialOpenAsync = (path) => { return new Promise((resolve, reject) => { const p = new serialport_1.SerialPort({ path, baudRate: 115200, endOnClose: true, autoOpen: false }); p.open((err) => { if (err) { reject(err); } else { resolve(p); } }); }); }; /** WIP. Uses serial communication (serialport lib) */ class NiimbotHeadlessSerialClient extends niimbluelib_1.NiimbotAbstractClient { constructor() { super(); this.isOpen = false; } /** Set port for connect */ setPort(portName) { this.portName = portName; } async connect() { await this.disconnect(); if (!this.portName) { throw new Error("Port not set"); } const _port = await serialOpenAsync(this.portName); this.isOpen = true; _port.on("close", () => { this.isOpen = false; this.emit("disconnect", new niimbluelib_1.DisconnectEvent()); }); _port.on("readable", () => { this.dataReady(); }); this.device = _port; try { await this.initialNegotiate(); await this.fetchPrinterInfo(); } catch (e) { console.error("Unable to fetch printer info (is it turned on?)."); console.error(e); } const result = { deviceName: `Serial (${this.portName})`, result: this.info.connectResult ?? niimbluelib_1.ConnectResult.FirmwareErrors, }; this.emit("connect", new niimbluelib_1.ConnectEvent(result)); return result; } dataReady() { while (true) { try { const result = this.device.read(); if (result !== null) { if (this.debug) { console.info(`<< serial chunk ${niimbluelib_1.Utils.bufToHex(result)}`); } this.processRawPacket(result); } else { break; } } catch (_e) { break; } } } async disconnect() { this.stopHeartbeat(); if (this.device) { return new Promise((resolve, reject) => { this.device.close((e) => { if (e) { reject(e); } else { resolve(); } }); }); } } isConnected() { return this.isOpen; } async sendRaw(data, force) { const send = async () => { if (!this.isConnected()) { throw new Error("Not connected"); } await niimbluelib_1.Utils.sleep(this.packetIntervalMs); this.device.write(Buffer.from(data)); this.emit("rawpacketsent", new niimbluelib_1.RawPacketSentEvent(data)); }; if (force) { await send(); } else { await this.mutex.runExclusive(send); } } static async scan() { const ports = await serialport_1.SerialPort.list(); return ports.map((p) => { let name = "unknown"; let pRaw = p; if (pRaw["friendlyName"] !== undefined) { name = pRaw["friendlyName"]; } else if (p.pnpId !== undefined) { name = p.pnpId; } return { name, address: p.path, }; }); } } exports.NiimbotHeadlessSerialClient = NiimbotHeadlessSerialClient;