@mmote/niimblue-node
Version:
Headless clients for niimbluelib. Command line interface, simple REST server are also included.
132 lines (131 loc) • 4.04 kB
JavaScript
;
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;