From 8f53f2db2db7e314d9de7015a0cc3d8841b30b8e Mon Sep 17 00:00:00 2001 From: David Ruckes Date: Fri, 18 Aug 2023 10:02:14 +0200 Subject: [PATCH] Add new device FTDI-FT232R --- drivers/ftdi-ft232r-usb-dmx.js | 84 ++++++++++++++++++++++++++++++++++ index.js | 1 + 2 files changed, 85 insertions(+) create mode 100644 drivers/ftdi-ft232r-usb-dmx.js diff --git a/drivers/ftdi-ft232r-usb-dmx.js b/drivers/ftdi-ft232r-usb-dmx.js new file mode 100644 index 0000000..e12989e --- /dev/null +++ b/drivers/ftdi-ft232r-usb-dmx.js @@ -0,0 +1,84 @@ +const { SerialPort } = require('serialport'); +const util = require('util'); +const EventEmitter = require('events').EventEmitter; + +function FTDIFT232RUsbDMX(deviceId, options = {}) { + this.universe = Buffer.alloc(513); + this.readyToWrite = true; + this.interval = options.dmx_speed ? (1000 / options.dmx_speed) : 46; + this.deviceId = deviceId; + + this.dev = new SerialPort({ + path: deviceId, + 'baudRate': 250000, + 'dataBits': 8, + 'stopBits': 2, + 'parity': 'none', + }, err => { + if (!err) { + this.start(); + } + }).on('error', function (err) { + console.warn(err); + }); +} + +FTDIFT232RUsbDMX.prototype.sendUniverse = function () { + const self = this; + + if (!this.dev.writable) { + return; + } + + // toggle break + self.dev.set({ brk: true, rts: true }, (err, r) => { + setTimeout(() => { + self.dev.set({ brk: false, rts: true }, (err, r) => { + setTimeout(() => { + if (self.readyToWrite) { + self.readyToWrite = false; + self.dev.write(Buffer.concat([Buffer.from([0]), self.universe.slice(1)])); + self.dev.drain(() => { + self.readyToWrite = true; + }); + } + }, 1); + }); + }, 1); + }); +}; + +FTDIFT232RUsbDMX.prototype.start = function () { + this.intervalhandle = setInterval(this.sendUniverse.bind(this), this.interval); +}; + +FTDIFT232RUsbDMX.prototype.stop = function () { + clearInterval(this.intervalhandle); +}; + +FTDIFT232RUsbDMX.prototype.close = function (cb) { + this.stop(); + this.dev.close(cb); +}; + +FTDIFT232RUsbDMX.prototype.update = function (u, extraData) { + for (const c in u) { + this.universe[c] = u[c]; + } + + this.emit('update', u, extraData); +}; + +FTDIFT232RUsbDMX.prototype.updateAll = function (v) { + for (let i = 1; i <= 512; i++) { + this.universe[i] = v; + } +}; + +FTDIFT232RUsbDMX.prototype.get = function (c) { + return this.universe[c]; +}; + +util.inherits(FTDIFT232RUsbDMX, EventEmitter); + +module.exports = FTDIFT232RUsbDMX; diff --git a/index.js b/index.js index a04535a..f49715c 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,7 @@ class DMX { this.registerDriver('dmx4all', require('./drivers/dmx4all')); this.registerDriver('enttec-usb-dmx-pro', require('./drivers/enttec-usb-dmx-pro')); this.registerDriver('enttec-open-usb-dmx', require('./drivers/enttec-open-usb-dmx')); + this.registerDriver('ftdi-ft232r-usb-dmx', require('./drivers/ftdi-ft232r-usb-dmx')); this.registerDriver('dmxking-ultra-dmx-pro', require('./drivers/dmxking-ultra-dmx-pro')); this.registerDriver('artnet', require('./drivers/artnet')); this.registerDriver('bbdmx', require('./drivers/bbdmx'));