From 07316ad789b5e9fffe46a5bbb5e5dffd105e9b05 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Sun, 16 Jul 2017 09:53:44 -0700 Subject: [PATCH] Added support for DMXKing interface (dual channel) --- dmx-web.js | 3 +- dmx.js | 17 ++++--- drivers/dmxking-ultra-dmx-pro.js | 84 ++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 drivers/dmxking-ultra-dmx-pro.js diff --git a/dmx-web.js b/dmx-web.js index 9f1dd99..06073df 100755 --- a/dmx-web.js +++ b/dmx-web.js @@ -28,7 +28,8 @@ function DMXWeb() { dmx.addUniverse( universe, config.universes[universe].output.driver, - config.universes[universe].output.device + config.universes[universe].output.device, + config.universes[universe].output.options ) } diff --git a/dmx.js b/dmx.js index 78c937a..45d4695 100644 --- a/dmx.js +++ b/dmx.js @@ -9,12 +9,13 @@ function DMX(options) { this.drivers = {} this.devices = options.devices || require('./devices') - this.registerDriver('null', require('./drivers/null')) - 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('artnet', require('./drivers/artnet')) - this.registerDriver('bbdmx', require('./drivers/bbdmx')) + this.registerDriver('null', require('./drivers/null')) + 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('dmxking-ultra-dmx-pro', require('./drivers/dmxking-ultra-dmx-pro')) + this.registerDriver('artnet', require('./drivers/artnet')) + this.registerDriver('bbdmx', require('./drivers/bbdmx')) } util.inherits(DMX, EventEmitter) @@ -26,8 +27,8 @@ DMX.prototype.registerDriver = function(name, module) { this.drivers[name] = module } -DMX.prototype.addUniverse = function(name, driver, device_id) { - return this.universes[name] = new this.drivers[driver](device_id) +DMX.prototype.addUniverse = function(name, driver, device_id, options) { + return this.universes[name] = new this.drivers[driver](device_id, options) } DMX.prototype.update = function(universe, channels) { diff --git a/drivers/dmxking-ultra-dmx-pro.js b/drivers/dmxking-ultra-dmx-pro.js new file mode 100644 index 0000000..6805bd8 --- /dev/null +++ b/drivers/dmxking-ultra-dmx-pro.js @@ -0,0 +1,84 @@ +"use strict" + +var SerialPort = require("serialport") + +var DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE = 0x00 + , DMXKING_ULTRA_DMX_PRO_START_OF_MSG = 0x7e + , DMXKING_ULTRA_DMX_PRO_END_OF_MSG = 0xe7 + , DMXKING_ULTRA_DMX_PRO_SEND_DMX_RQ = 0x06 + , DMXKING_ULTRA_DMX_PRO_SEND_DMX_A_RQ = 0x64 + , DMXKING_ULTRA_DMX_PRO_SEND_DMX_B_RQ = 0x65 + , DMXKING_ULTRA_DMX_PRO_RECV_DMX_PKT = 0x05 + ; + +function DMXKingUltraDMXPro(device_id, options) { + var self = this + this.options = options || {} + this.universe = new Buffer(512) + this.universe.fill(0) + + this.sendDMXReq = DMXKING_ULTRA_DMX_PRO_SEND_DMX_RQ + if (this.options.port === "A") { + this.sendDMXReq = DMXKING_ULTRA_DMX_PRO_SEND_DMX_A_RQ + } else if (this.options.port === "B") { + this.sendDMXReq = DMXKING_ULTRA_DMX_PRO_SEND_DMX_B_RQ + } + + this.dev = new SerialPort(device_id, { + 'baudrate': 250000, + 'databits': 8, + 'stopbits': 2, + 'parity': 'none' + }, function(err) { + if(!err) { + self.send_universe() + } + }) +} + +DMXKingUltraDMXPro.prototype.send_universe = function() { + if(!this.dev.isOpen()) { + return + } + var hdr = Buffer([ + DMXKING_ULTRA_DMX_PRO_START_OF_MSG, + this.sendDMXReq, + (this.universe.length + 1) & 0xff, + ((this.universe.length + 1) >> 8) & 0xff, + DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE + ]) + + var msg = Buffer.concat([ + hdr, + this.universe, + Buffer([DMXKING_ULTRA_DMX_PRO_END_OF_MSG]) + ]) + this.dev.write(msg) +} + +DMXKingUltraDMXPro.prototype.start = function() {} +DMXKingUltraDMXPro.prototype.stop = function() {} + +DMXKingUltraDMXPro.prototype.close = function(cb) { + this.dev.close(cb) +} + +DMXKingUltraDMXPro.prototype.update = function(u) { + for(var c in u) { + this.universe[c] = u[c] + } + this.send_universe() +} + +DMXKingUltraDMXPro.prototype.updateAll = function(v){ + for(var i = 0; i < 512; i++) { + this.universe[i] = v + } + this.send_universe() +} + +DMXKingUltraDMXPro.prototype.get = function(c) { + return this.universe[c] +} + +module.exports = DMXKingUltraDMXPro \ No newline at end of file