ngx-serial
Version:
NgxSerial eases the use of the Serial Web API in Angular.
103 lines • 12.9 kB
JavaScript
import { __awaiter } from "tslib";
export class NgxSerial {
constructor(readFunction, options, controlCharacter) {
this.options = { baudRate: 9600, dataBits: 8, parity: 'none', bufferSize: 256, flowControl: 'none' }; //Default
this.controlCharacter = "\n";
this.keepReading = true;
this.readFunction = readFunction;
if (options)
this.options = options;
if (controlCharacter)
this.controlCharacter = controlCharacter;
}
sendData(data) {
return __awaiter(this, void 0, void 0, function* () {
yield this.writer.write(data);
});
}
readLoop() {
return __awaiter(this, void 0, void 0, function* () {
while (this.port.readable && this.keepReading) {
const textDecoder = new TextDecoderStream();
this.readableStreamClosed = this.port.readable.pipeTo(textDecoder.writable);
this.reader = textDecoder.readable
.pipeThrough(new TransformStream(new LineBreakTransformer(this.controlCharacter)))
.getReader();
try {
while (true) {
const { value, done } = yield this.reader.read();
if (done) {
break;
}
if (value) {
this.readFunction(value);
}
}
}
catch (error) {
console.error("Read Loop error. Have the serial device been disconnected ? ");
}
}
});
}
close(callback) {
return __awaiter(this, void 0, void 0, function* () {
this.keepReading = false;
this.reader.cancel();
yield this.readableStreamClosed.catch(() => { });
this.writer.close();
yield this.writableStreamClosed;
yield this.port.close();
callback(null);
});
}
connect(callback) {
return __awaiter(this, void 0, void 0, function* () {
this.keepReading = true;
if ("serial" in navigator) {
// The Web Serial API is supported by the browser.
let nav = navigator;
const ports = yield nav.serial.getPorts();
try {
this.port = yield nav.serial.requestPort();
}
catch (error) {
console.error("Requesting port error: " + error);
return;
}
try {
yield this.port.open(this.options);
}
catch (error) {
console.error("Opening port error: " + error);
return;
}
const textEncoder = new TextEncoderStream();
this.writableStreamClosed = textEncoder.readable.pipeTo(this.port.writable);
this.writer = textEncoder.writable.getWriter();
this.readLoop();
callback(this.port);
}
else {
console.error("This browser does NOT support the Web Serial API");
}
});
}
}
class LineBreakTransformer {
constructor(controlCharacter) {
this.container = "";
this.container = '';
this.controlCharacter = controlCharacter;
}
transform(chunk, controller) {
this.container += chunk;
const lines = this.container.split(this.controlCharacter);
this.container = lines.pop();
lines.forEach((line) => controller.enqueue(line));
}
flush(controller) {
controller.enqueue(this.container);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zZXJpYWwvc3JjL2xpYi9uZ3gtc2VyaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxNQUFNLE9BQU8sU0FBUztJQVlsQixZQUFZLFlBQXNCLEVBQUUsT0FBYSxFQUFFLGdCQUFzQjtRQVRqRSxZQUFPLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLFNBQVM7UUFHMUcscUJBQWdCLEdBQVcsSUFBSSxDQUFDO1FBSWhDLGdCQUFXLEdBQVcsSUFBSSxDQUFDO1FBR2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksT0FBTztZQUNULElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLElBQUksZ0JBQWdCO1lBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUU3QyxDQUFDO0lBQ1ksUUFBUSxDQUFDLElBQVk7O1lBQ2hDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsQ0FBQztLQUFBO0lBRWEsUUFBUTs7WUFHcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFHO2dCQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1RSxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRO3FCQUMv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QTtJQUMxQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQVMsRUFBRSxVQUFjO1FBQ2pDLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQWM7UUFDbEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTk9ORV9UWVBFIH0gZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBOZ3hTZXJpYWwge1xuXG4gICAgcHJpdmF0ZSBwb3J0OiBhbnk7XG4gICAgcHJpdmF0ZSBvcHRpb25zID0geyBiYXVkUmF0ZTogOTYwMCwgZGF0YUJpdHM6IDgsIHBhcml0eTogJ25vbmUnLCBidWZmZXJTaXplOiAyNTYsIGZsb3dDb250cm9sOiAnbm9uZScgfTsgLy9EZWZhdWx0XG4gICAgcHJpdmF0ZSB3cml0ZXI6IGFueTtcbiAgICBwcml2YXRlIHJlYWRGdW5jdGlvbjogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBjb250cm9sQ2hhcmFjdGVyOiBzdHJpbmcgPSBcIlxcblwiO1xuICAgIHByaXZhdGUgcmVhZGVyOmFueTtcbiAgICBwcml2YXRlIHJlYWRhYmxlU3RyZWFtQ2xvc2VkOmFueTtcbiAgICBwcml2YXRlIHdyaXRhYmxlU3RyZWFtQ2xvc2VkOmFueTtcbiAgICBwcml2YXRlIGtlZXBSZWFkaW5nOmJvb2xlYW4gPSB0cnVlO1xuICBcbiAgICBjb25zdHJ1Y3RvcihyZWFkRnVuY3Rpb246IEZ1bmN0aW9uLCBvcHRpb25zPzogYW55LCBjb250cm9sQ2hhcmFjdGVyPzogYW55KSB7XG4gICAgICB0aGlzLnJlYWRGdW5jdGlvbiA9IHJlYWRGdW5jdGlvbjtcbiAgICAgIGlmIChvcHRpb25zKVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgaWYgKGNvbnRyb2xDaGFyYWN0ZXIpXG4gICAgICAgIHRoaXMuY29udHJvbENoYXJhY3RlciA9IGNvbnRyb2xDaGFyYWN0ZXI7XG4gIFxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgc2VuZERhdGEoZGF0YTogc3RyaW5nKSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlci53cml0ZShkYXRhKTtcbiAgICB9XG4gIFxuICAgIHByaXZhdGUgYXN5bmMgcmVhZExvb3AoKSB7XG4gICAgICBcbiAgXG4gICAgICB3aGlsZSAodGhpcy5wb3J0LnJlYWRhYmxlICYmIHRoaXMua2VlcFJlYWRpbmcgKSB7XG4gICAgICAgIGNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyU3RyZWFtKCk7XG4gICAgICAgIHRoaXMucmVhZGFibGVTdHJlYW1DbG9zZWQgPSB0aGlzLnBvcnQucmVhZGFibGUucGlwZVRvKHRleHREZWNvZGVyLndyaXRhYmxlKTtcbiAgICAgICAgdGhpcy5yZWFkZXIgPSB0ZXh0RGVjb2Rlci5yZWFkYWJsZVxuICAgICAgICAgIC5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKG5ldyBMaW5lQnJlYWtUcmFuc2Zvcm1lcih0aGlzLmNvbnRyb2xDaGFyYWN0ZXIpKSlcbiAgICAgICAgICAuZ2V0UmVhZGVyKCk7XG4gIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCB0aGlzLnJlYWRlci5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLnJlYWRGdW5jdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZWFkIExvb3AgZXJyb3IuIEhhdmUgdGhlIHNlcmlhbCBkZXZpY2UgYmVlbiBkaXNjb25uZWN0ZWQgPyBcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGNsb3NlKGNhbGxiYWNrOkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmtlZXBSZWFkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnJlYWRlci5jYW5jZWwoKTtcbiAgICAgIGF3YWl0IHRoaXMucmVhZGFibGVTdHJlYW1DbG9zZWQuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgdGhpcy53cml0ZXIuY2xvc2UoKTtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGFibGVTdHJlYW1DbG9zZWQ7XG4gICAgICBhd2FpdCB0aGlzLnBvcnQuY2xvc2UoKTtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoY2FsbGJhY2s6RnVuY3Rpb24pIHtcbiAgICAgIHRoaXMua2VlcFJlYWRpbmcgPSB0cnVlO1xuICAgICAgaWYgKFwic2VyaWFsXCIgaW4gbmF2aWdhdG9yKSB7XG4gICAgICAgIC8vIFRoZSBXZWIgU2VyaWFsIEFQSSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuXG4gICAgICAgIGxldCBuYXY6IGFueSA9IG5hdmlnYXRvcjtcbiAgICAgICAgY29uc3QgcG9ydHMgPSBhd2FpdCBuYXYuc2VyaWFsLmdldFBvcnRzKCk7XG4gIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucG9ydCA9IGF3YWl0IG5hdi5zZXJpYWwucmVxdWVzdFBvcnQoKTtcbiAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlcXVlc3RpbmcgcG9ydCBlcnJvcjogXCIgKyBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gIFxuICAgICAgICB0cnkge1xuICAgICAgICAgYXdhaXQgdGhpcy5wb3J0Lm9wZW4odGhpcy5vcHRpb25zKTtcbiAgXG4gIFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJPcGVuaW5nIHBvcnQgZXJyb3I6IFwiICsgZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICBcbiAgICAgICAgY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXJTdHJlYW0oKTtcbiAgICAgICAgdGhpcy53cml0YWJsZVN0cmVhbUNsb3NlZCA9IHRleHRFbmNvZGVyLnJlYWRhYmxlLnBpcGVUbyh0aGlzLnBvcnQud3JpdGFibGUpO1xuICAgICAgICB0aGlzLndyaXRlciA9IHRleHRFbmNvZGVyLndyaXRhYmxlLmdldFdyaXRlcigpO1xuICBcbiAgICAgICAgdGhpcy5yZWFkTG9vcCgpO1xuICBcbiAgICAgICAgY2FsbGJhY2sodGhpcy5wb3J0KTtcbiAgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGRvZXMgTk9UIHN1cHBvcnQgdGhlIFdlYiBTZXJpYWwgQVBJXCIpO1xuICAgICAgfVxuICBcbiAgICB9XG4gIH1cbiAgXG4gIGNsYXNzIExpbmVCcmVha1RyYW5zZm9ybWVyIHtcbiAgICBjb250YWluZXI6IGFueT1cIlwiO1xuICAgIHByaXZhdGUgY29udHJvbENoYXJhY3Rlcjogc3RyaW5nO1xuICBcbiAgICBjb25zdHJ1Y3Rvcihjb250cm9sQ2hhcmFjdGVyOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gJyc7XG4gICAgICB0aGlzLmNvbnRyb2xDaGFyYWN0ZXIgPSBjb250cm9sQ2hhcmFjdGVyXG4gICAgfVxuICBcbiAgICB0cmFuc2Zvcm0oY2h1bms6YW55LCBjb250cm9sbGVyOmFueSkge1xuICAgICAgdGhpcy5jb250YWluZXIgKz0gY2h1bms7XG4gICAgICBjb25zdCBsaW5lcyA9IHRoaXMuY29udGFpbmVyLnNwbGl0KHRoaXMuY29udHJvbENoYXJhY3Rlcik7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGxpbmVzLnBvcCgpO1xuICAgICAgbGluZXMuZm9yRWFjaCgobGluZTogYW55KSA9PiBjb250cm9sbGVyLmVucXVldWUobGluZSkpO1xuICAgIH1cbiAgXG4gICAgZmx1c2goY29udHJvbGxlcjphbnkpIHtcbiAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZSh0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuICB9Il19