angular-serial
Version:
NgxSerial eases the use of the Serial Web API in Angular.
101 lines • 12.5 kB
JavaScript
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==