UNPKG

angular-serial

Version:

NgxSerial eases the use of the Serial Web API in Angular.

101 lines 12.5 kB
export class NgxSerial { port; options = { baudRate: 9600, dataBits: 8, parity: 'none', bufferSize: 256, flowControl: 'none' }; //Default writer; readFunction; controlCharacter = "\n"; reader; readableStreamClosed; writableStreamClosed; keepReading = true; constructor(readFunction, options, controlCharacter) { this.readFunction = readFunction; if (options) this.options = options; if (controlCharacter) this.controlCharacter = controlCharacter; } async sendData(data) { await this.writer.write(data); } async readLoop() { 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 } = await this.reader.read(); if (done) { break; } if (value) { this.readFunction(value); } } } catch (error) { console.error("Read Loop error. Have the serial device been disconnected ? "); } } } async close(callback) { this.keepReading = false; this.reader.cancel(); await this.readableStreamClosed.catch(() => { }); this.writer.close(); await this.writableStreamClosed; await this.port.close(); callback(null); } async connect(callback) { this.keepReading = true; if ("serial" in navigator) { // The Web Serial API is supported by the browser. let nav = navigator; const ports = await nav.serial.getPorts(); try { this.port = await nav.serial.requestPort(); } catch (error) { console.error("Requesting port error: " + error); return; } try { await 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 { container = ""; controlCharacter; constructor(controlCharacter) { 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItc2VyaWFsL3NyYy9saWIvbmd4LXNlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sU0FBUztJQUVWLElBQUksQ0FBTTtJQUNWLE9BQU8sR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUztJQUMxRyxNQUFNLENBQU07SUFDWixZQUFZLENBQVc7SUFDdkIsZ0JBQWdCLEdBQVcsSUFBSSxDQUFDO0lBQ2hDLE1BQU0sQ0FBSztJQUNYLG9CQUFvQixDQUFLO0lBQ3pCLG9CQUFvQixDQUFLO0lBQ3pCLFdBQVcsR0FBVyxJQUFJLENBQUM7SUFFbkMsWUFBWSxZQUFzQixFQUFFLE9BQWEsRUFBRSxnQkFBc0I7UUFDdkUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxPQUFPO1lBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDekIsSUFBSSxnQkFBZ0I7WUFDbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBRTdDLENBQUM7SUFDTSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQVk7UUFDaEMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFFBQVE7UUFHcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFHO1lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFB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VixnQkFBZ0IsQ0FBUztJQUVqQyxZQUFZLGdCQUF3QjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUE7SUFDMUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFTLEVBQUUsVUFBYztRQUNqQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN4QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFjO1FBQ2xCLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5PTkVfVFlQRSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlclwiO1xuXG5leHBvcnQgY2xhc3MgTmd4U2VyaWFsIHtcblxuICAgIHByaXZhdGUgcG9ydDogYW55O1xuICAgIHByaXZhdGUgb3B0aW9ucyA9IHsgYmF1ZFJhdGU6IDk2MDAsIGRhdGFCaXRzOiA4LCBwYXJpdHk6ICdub25lJywgYnVmZmVyU2l6ZTogMjU2LCBmbG93Q29udHJvbDogJ25vbmUnIH07IC8vRGVmYXVsdFxuICAgIHByaXZhdGUgd3JpdGVyOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkRnVuY3Rpb246IEZ1bmN0aW9uO1xuICAgIHByaXZhdGUgY29udHJvbENoYXJhY3Rlcjogc3RyaW5nID0gXCJcXG5cIjtcbiAgICBwcml2YXRlIHJlYWRlcjphbnk7XG4gICAgcHJpdmF0ZSByZWFkYWJsZVN0cmVhbUNsb3NlZDphbnk7XG4gICAgcHJpdmF0ZSB3cml0YWJsZVN0cmVhbUNsb3NlZDphbnk7XG4gICAgcHJpdmF0ZSBrZWVwUmVhZGluZzpib29sZWFuID0gdHJ1ZTtcbiAgXG4gICAgY29uc3RydWN0b3IocmVhZEZ1bmN0aW9uOiBGdW5jdGlvbiwgb3B0aW9ucz86IGFueSwgY29udHJvbENoYXJhY3Rlcj86IGFueSkge1xuICAgICAgdGhpcy5yZWFkRnVuY3Rpb24gPSByZWFkRnVuY3Rpb247XG4gICAgICBpZiAob3B0aW9ucylcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIGlmIChjb250cm9sQ2hhcmFjdGVyKVxuICAgICAgICB0aGlzLmNvbnRyb2xDaGFyYWN0ZXIgPSBjb250cm9sQ2hhcmFjdGVyO1xuICBcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNlbmREYXRhKGRhdGE6IHN0cmluZykge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZXIud3JpdGUoZGF0YSk7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGFzeW5jIHJlYWRMb29wKCkge1xuICAgICAgXG4gIFxuICAgICAgd2hpbGUgKHRoaXMucG9ydC5yZWFkYWJsZSAmJiB0aGlzLmtlZXBSZWFkaW5nICkge1xuICAgICAgICBjb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlclN0cmVhbSgpO1xuICAgICAgICB0aGlzLnJlYWRhYmxlU3RyZWFtQ2xvc2VkID0gdGhpcy5wb3J0LnJlYWRhYmxlLnBpcGVUbyh0ZXh0RGVjb2Rlci53cml0YWJsZSk7XG4gICAgICAgIHRoaXMucmVhZGVyID0gdGV4dERlY29kZXIucmVhZGFibGVcbiAgICAgICAgICAucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShuZXcgTGluZUJyZWFrVHJhbnNmb3JtZXIodGhpcy5jb250cm9sQ2hhcmFjdGVyKSkpXG4gICAgICAgICAgLmdldFJlYWRlcigpO1xuICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgdGhpcy5yZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZWFkRnVuY3Rpb24odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVhZCBMb29wIGVycm9yLiBIYXZlIHRoZSBzZXJpYWwgZGV2aWNlIGJlZW4gZGlzY29ubmVjdGVkID8gXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBjbG9zZShjYWxsYmFjazpGdW5jdGlvbikge1xuICAgICAgdGhpcy5rZWVwUmVhZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZWFkZXIuY2FuY2VsKCk7XG4gICAgICBhd2FpdCB0aGlzLnJlYWRhYmxlU3RyZWFtQ2xvc2VkLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMud3JpdGVyLmNsb3NlKCk7XG4gICAgICBhd2FpdCB0aGlzLndyaXRhYmxlU3RyZWFtQ2xvc2VkO1xuICAgICAgYXdhaXQgdGhpcy5wb3J0LmNsb3NlKCk7XG4gICAgICBjYWxsYmFjayhudWxsKTtcbiAgICB9XG4gIFxuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KGNhbGxiYWNrOkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmtlZXBSZWFkaW5nID0gdHJ1ZTtcbiAgICAgIGlmIChcInNlcmlhbFwiIGluIG5hdmlnYXRvcikge1xuICAgICAgICAvLyBUaGUgV2ViIFNlcmlhbCBBUEkgaXMgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLlxuICAgICAgICBsZXQgbmF2OiBhbnkgPSBuYXZpZ2F0b3I7XG4gICAgICAgIGNvbnN0IHBvcnRzID0gYXdhaXQgbmF2LnNlcmlhbC5nZXRQb3J0cygpO1xuICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnBvcnQgPSBhd2FpdCBuYXYuc2VyaWFsLnJlcXVlc3RQb3J0KCk7XG4gIFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJSZXF1ZXN0aW5nIHBvcnQgZXJyb3I6IFwiICsgZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgIGF3YWl0IHRoaXMucG9ydC5vcGVuKHRoaXMub3B0aW9ucyk7XG4gIFxuICBcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiT3BlbmluZyBwb3J0IGVycm9yOiBcIiArIGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgXG4gICAgICAgIGNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyU3RyZWFtKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGVTdHJlYW1DbG9zZWQgPSB0ZXh0RW5jb2Rlci5yZWFkYWJsZS5waXBlVG8odGhpcy5wb3J0LndyaXRhYmxlKTtcbiAgICAgICAgdGhpcy53cml0ZXIgPSB0ZXh0RW5jb2Rlci53cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgXG4gICAgICAgIHRoaXMucmVhZExvb3AoKTtcbiAgXG4gICAgICAgIGNhbGxiYWNrKHRoaXMucG9ydCk7XG4gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlRoaXMgYnJvd3NlciBkb2VzIE5PVCBzdXBwb3J0IHRoZSBXZWIgU2VyaWFsIEFQSVwiKTtcbiAgICAgIH1cbiAgXG4gICAgfVxuICB9XG4gIFxuICBjbGFzcyBMaW5lQnJlYWtUcmFuc2Zvcm1lciB7XG4gICAgY29udGFpbmVyOiBhbnk9XCJcIjtcbiAgICBwcml2YXRlIGNvbnRyb2xDaGFyYWN0ZXI6IHN0cmluZztcbiAgXG4gICAgY29uc3RydWN0b3IoY29udHJvbENoYXJhY3Rlcjogc3RyaW5nKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9ICcnO1xuICAgICAgdGhpcy5jb250cm9sQ2hhcmFjdGVyID0gY29udHJvbENoYXJhY3RlclxuICAgIH1cbiAgXG4gICAgdHJhbnNmb3JtKGNodW5rOmFueSwgY29udHJvbGxlcjphbnkpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyICs9IGNodW5rO1xuICAgICAgY29uc3QgbGluZXMgPSB0aGlzLmNvbnRhaW5lci5zcGxpdCh0aGlzLmNvbnRyb2xDaGFyYWN0ZXIpO1xuICAgICAgdGhpcy5jb250YWluZXIgPSBsaW5lcy5wb3AoKTtcbiAgICAgIGxpbmVzLmZvckVhY2goKGxpbmU6IGFueSkgPT4gY29udHJvbGxlci5lbnF1ZXVlKGxpbmUpKTtcbiAgICB9XG4gIFxuICAgIGZsdXNoKGNvbnRyb2xsZXI6YW55KSB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUodGhpcy5jb250YWluZXIpO1xuICAgIH1cbiAgfSJdfQ==