p5.j5
Version:
johnny-five library for p5.js
121 lines (108 loc) • 3.25 kB
JavaScript
const { EventEmitter } = require('events');
class SerialPort extends EventEmitter {
constructor(port, options) {
super(options);
this.options = options || {};
this.browser = true;
this.path = this.options.path;
this.isOpen = false;
this.port = null;
this.writer = null;
this.reader = null;
this.baudRate = this.options.baudRate;
this.requestOptions = this.options.requestOptions || {};
if (this.options.autoOpen) this.open();
}
list(callback) {
return navigator.serial.getPorts()
.then((list) => {if (callback) {return callback(null, list)}})
.catch((error) => {if (callback) {return callback(error)}});
}
open(callback) {
window.navigator.serial.requestPort(this.requestOptions)
.then(serialPort => {
this.port = serialPort;
if (this.isOpen) return;
return this.port.open({ baudRate: this.baudRate || 57600 });
})
.then(() => this.writer = this.port.writable.getWriter())
.then(() => this.reader = this.port.readable.getReader())
.then(async () => {
this.emit('open');
this.isOpen = true;
callback(null);
while (this.port.readable.locked) {
try {
const { value, done } = await this.reader.read();
if (done) {
break;
}
this.emit('data', Buffer.from(value));
} catch (e) {
console.error(e);
}
}
})
.catch(error => {callback(error)});
}
async close(callback) {
try {
await this.reader.releaseLock();
await this.writer.releaseLock();
await this.port.close();
this.isOpen = false;
} catch (error) {
if (callback) return callback(error);
throw error;
}
callback && callback(null);
}
async set(props = {}, callback) {
try {
const signals = {};
if (Object.prototype.hasOwnProperty.call(props, 'dtr')) {
signals.dataTerminalReady = props.dtr;
}
if (Object.prototype.hasOwnProperty.call(props, 'rts')) {
signals.requestToSend = props.rts;
}
if (Object.prototype.hasOwnProperty.call(props, 'brk')) {
signals.break = props.brk;
}
if (Object.keys(signals).length > 0) {
await this.port.setSignals(signals);
}
} catch (error) {
if (callback) return callback(error);
throw error;
}
if (callback) return callback(null);
}
write(buffer, callback) {
this.writer.write(buffer);
if (callback) return callback(null);
}
async read(callback) {
let buffer;
try {
buffer = await this.reader.read();
} catch (error) {
if (callback) return callback(error);
throw error;
}
if (callback) callback(null, buffer);
}
// TODO: is this correct?
flush(callback) {
//this.port.flush(); // is this sync or a promise?
console.warn('flush method is a NOP right now');
if (callback) return callback(null);
}
// TODO: is this correct?
drain(callback) {
// this.port.drain(); // is this sync or a promise?
console.warn('drain method is a NOP right now');
if (callback) return callback(null);
}
}
module.exports = SerialPort;