Files
mixly3/common/modules/mixly-modules/workers/nodejs/node-serial-worker.js
2024-07-20 00:12:38 +08:00

91 lines
2.2 KiB
JavaScript

importScripts('../common/serial-worker.js');
const child_process = require('node:child_process');
const serialport = require('serialport');
const {
SerialPort,
ReadlineParser,
ByteLengthParser
} = serialport;
const portsOperator = {};
class NodeSerialWorker extends SerialWorker {
#serialport_ = null;
#parserBytes_ = null;
constructor(port) {
super(port);
}
#addEventsListener_() {
this.#parserBytes_.on('data', (buffer) => {
this.onBuffer(buffer);
});
this.#serialport_.on('error', (error) => {
this.onError(error);
this.onClose(1);
});
this.#serialport_.on('open', () => {
this.onOpen();
});
this.#serialport_.on('close', () => {
this.onClose(1);
});
}
open() {
super.open();
this.#serialport_ = new SerialPort({
path: this.getPortName(),
baudRate: this.getBaudRate() - 0, // 波特率
dataBits: 8, // 数据位
parity: 'none', // 奇偶校验
stopBits: 1, // 停止位
flowControl: false,
autoOpen: false // 不自动打开
}, false);
this.#parserBytes_ = this.#serialport_.pipe(new ByteLengthParser({ length: 1 }));
this.#serialport_.open((error) => {
if (error) {
this.onError(error);
// this.onClose(1);
}
});
this.#addEventsListener_();
}
close() {
super.close();
if (this.isOpened()) {
try {
this.#serialport_.close();
} catch (error) {
console.log(error);
}
}
}
onBuffer(buffer) {
super.onBuffer(buffer);
}
}
const create = (port) => {
if (!portsOperator[port]) {
portsOperator[port] = new NodeSerialWorker(port);
}
portsOperator[port].open();
}
self.addEventListener('message', function(event) {
console.log(event.data);
const { port, type } = event.data;
if (type === 'open') {
create(port);
} else if (type === 'close') {
portsOperator[port] && portsOperator[port].close();
}
});