91 lines
2.2 KiB
JavaScript
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();
|
|
}
|
|
}); |