diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..48fe40a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = LF +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..744d451 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,179 @@ +{ + "env": { + "browser": true, + "es6": true, + "node": true + }, + + "globals": { + "document": false, + "escape": false, + "navigator": false, + "unescape": false, + "window": false, + "describe": true, + "before": true, + "it": true, + "expect": true, + "sinon": true + }, + + "parser": "babel-eslint", + + "plugins": [ + + ], + + "rules": { + "block-scoped-var": 2, + "brace-style": [2, "1tbs", { "allowSingleLine": true }], + "camelcase": [2, { "properties": "always" }], + "comma-dangle": [2, "always-multiline"], + "comma-spacing": [2, { "before": false, "after": true }], + "comma-style": [2, "last"], + "complexity": 0, + "consistent-return": 2, + "consistent-this": 0, + "curly": [2, "multi-line"], + "default-case": 0, + "dot-location": [2, "property"], + "dot-notation": 0, + "eol-last": 2, + "eqeqeq": [2, "allow-null"], + "func-names": 0, + "func-style": 0, + "generator-star-spacing": [2, "both"], + "guard-for-in": 0, + "handle-callback-err": [0, "^(err|error|anySpecificError)$" ], + "indent": [2, 2, { "SwitchCase": 1 }], + "key-spacing": [2, { "beforeColon": false, "afterColon": true }], + "keyword-spacing": [2, {"before": true, "after": true}], + "linebreak-style": 0, + "max-depth": 0, + "max-len": [2, 120, 4], + "max-nested-callbacks": 0, + "max-params": 0, + "max-statements": 0, + "new-cap": [2, { "newIsCap": true, "capIsNew": false }], + "newline-after-var": [2, "always"], + "new-parens": 2, + "no-alert": 0, + "no-array-constructor": 2, + "no-bitwise": 0, + "no-caller": 2, + "no-catch-shadow": 0, + "no-cond-assign": 2, + "no-console": 0, + "no-constant-condition": 0, + "no-continue": 0, + "no-control-regex": 2, + "no-debugger": 2, + "no-delete-var": 2, + "no-div-regex": 0, + "no-dupe-args": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-else-return": 2, + "no-empty": 0, + "no-empty-character-class": 2, + "no-eq-null": 0, + "no-eval": 2, + "no-ex-assign": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": 0, + "no-extra-semi": 0, + "no-extra-strict": 0, + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-func-assign": 2, + "no-implied-eval": 2, + "no-inline-comments": 0, + "no-inner-declarations": [2, "functions"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": 2, + "no-iterator": 2, + "no-label-var": 2, + "no-labels": 2, + "no-lone-blocks": 0, + "no-lonely-if": 0, + "no-loop-func": 0, + "no-mixed-requires": 0, + "no-mixed-spaces-and-tabs": [2, false], + "no-multi-spaces": 2, + "no-multi-str": 2, + "no-multiple-empty-lines": [2, { "max": 1 }], + "no-native-reassign": 2, + "no-negated-in-lhs": 2, + "no-nested-ternary": 0, + "no-new": 2, + "no-new-func": 2, + "no-new-object": 2, + "no-new-require": 2, + "no-new-wrappers": 2, + "no-obj-calls": 2, + "no-octal": 2, + "no-octal-escape": 2, + "no-path-concat": 0, + "no-plusplus": 0, + "no-process-env": 0, + "no-process-exit": 0, + "no-proto": 2, + "no-redeclare": 2, + "no-regex-spaces": 2, + "no-reserved-keys": 0, + "no-restricted-modules": 0, + "no-return-assign": 2, + "no-script-url": 0, + "no-self-compare": 2, + "no-sequences": 2, + "no-shadow": 0, + "no-shadow-restricted-names": 2, + "no-spaced-func": 2, + "no-sparse-arrays": 2, + "no-sync": 0, + "no-ternary": 0, + "no-throw-literal": 2, + "no-trailing-spaces": 2, + "no-undef": 2, + "no-undef-init": 2, + "no-undefined": 0, + "no-underscore-dangle": 0, + "no-unneeded-ternary": 2, + "no-unreachable": 1, + "no-unused-expressions": 0, + "no-unused-vars": [2, { "vars": "all", "args": "none" }], + "no-use-before-define": 2, + "no-var": 2, + "no-void": 0, + "no-warning-comments": 0, + "no-with": 2, + "one-var": 0, + "operator-assignment": 0, + "operator-linebreak": [2, "after"], + "padded-blocks": 0, + "prefer-const": 2, + "quote-props": 0, + "quotes": [2, "single", "avoid-escape"], + "radix": 2, + "semi": [2, "always"], + "semi-spacing": 0, + "sort-vars": 0, + "space-before-blocks": [2, "always"], + "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}], + "space-in-brackets": 0, + "space-in-parens": [2, "never"], + "space-infix-ops": 2, + "space-unary-ops": [2, { "words": true, "nonwords": false }], + "spaced-comment": [2, "always"], + "strict": 2, + "use-isnan": 2, + "valid-jsdoc": 0, + "valid-typeof": 2, + "vars-on-top": 0, + "wrap-iife": [2, "any"], + "wrap-regex": 0, + "yoda": [2, "never"] + } +} diff --git a/.gitignore b/.gitignore index 8232012..aee88fd 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,9 @@ results node_modules .project .com.greenworldsoft.syncfolderspro + +# Remove some common IDE working directories +.idea +.vscode + +.DS_Store diff --git a/anim.js b/anim.js index 745b043..30c91c6 100644 --- a/anim.js +++ b/anim.js @@ -1,81 +1,83 @@ -"use strict" +const ease = require('./easing.js').ease; +const resolution = 25; -var ease = require('./easing.js').ease -var resolution = 25 +class Anim { + constructor() { + this.fxStack = []; + this.interval = null; + } -function Anim() { - this.fx_stack = [] - this.interval = null + add(to, duration = resolution, options = {}) { + options.easing = options.easing || 'linear'; + + this.fxStack.push({ 'to': to, 'duration': duration, 'options': options }); + return this; + } + + delay(duration) { + this.add({}, duration); + return this; + } + + stop() { + if (this.interval) { + clearInterval(this.interval); + } + this.fxStack = []; + } + + run(universe, onFinish) { + let config = {}; + let ticks = 0; + let duration = 0; + let animationStep; + let iid = null; + + const stack = [ ...this.fxStack ]; + + const aniSetup = () => { + animationStep = stack.shift(); + ticks = 0; + duration = animationStep.duration; + + config = {}; + for (const k in animationStep.to) { + config[k] = { + 'start': universe.get(k), + 'end': animationStep.to[k], + 'options': animationStep.options, + }; + } + }; + const aniStep = () => { + const newValues = {}; + + for (const k in config) { + const entry = config[k]; + const easing = ease[entry.options.easing]; + + newValues[k] = Math.round(entry.start + easing(ticks, 0, 1, duration) * (entry.end - entry.start)); + } + + ticks = ticks + resolution; + universe.update(newValues); + if (ticks > duration) { + if (stack.length > 0) { + aniSetup(); + } else { + clearInterval(iid); + if (onFinish) { + onFinish(); + } + } + } + }; + + aniSetup(); + iid = this.interval = setInterval(aniStep, resolution); + + return this; + } } -Anim.prototype.add = function(to, duration, options) { - var options = options || {} - var duration = duration || resolution - options.easing = options.easing || 'linear'; - - this.fx_stack.push({'to': to, 'duration': duration, 'options': options}) - return this -} - -Anim.prototype.delay = function(duration) { - return this.add({}, duration) -} - -Anim.prototype.stop = function () { - if(this.interval) { - clearInterval(this.interval) - } - this.fx_stack = [] -} - -Anim.prototype.run = function(universe, onFinish) { - var config = {} - var ticks = 0 - var duration = 0 - var animationStep - - var fx_stack = this.fx_stack; - var ani_setup = function() { - animationStep = fx_stack.shift() - ticks = 0 - duration = animationStep.duration - - config = {} - for (var k in animationStep.to) { - config[k] = { - 'start': universe.get(k), - 'end': animationStep.to[k], - 'options': animationStep.options - } - } - } - var ani_step = function() { - var newValues = {} - for (var k in config) { - var entry = config[k] - var easing = ease[entry.options.easing] - - newValues[k] = Math.round(entry.start + easing(ticks, 0, 1, duration) * (entry.end - entry.start)) - } - - ticks = ticks + resolution - universe.update(newValues) - if (ticks > duration) { - if (fx_stack.length > 0) { - ani_setup() - } else { - clearInterval(iid) - if(onFinish) { - onFinish() - } - } - } - } - - ani_setup() - var iid = this.interval = setInterval(ani_step, resolution) - - return this -} - -module.exports = Anim +module.exports = Anim; diff --git a/demo.js b/demo.js index c290746..7929e28 100644 --- a/demo.js +++ b/demo.js @@ -1,85 +1,84 @@ -"use strict" +const DMX = require('./dmx'); -var DMX = require('./dmx') - -var dmx = new DMX(); -var A = dmx.animation; +const dmx = new DMX(); +const A = dmx.animation; // var universe = dmx.addUniverse('demo', 'enttec-usb-dmx-pro', '/dev/cu.usbserial-6AVNHXS8') // var universe = dmx.addUniverse('demo', 'enttec-open-usb-dmx', '/dev/cu.usbserial-6AVNHXS8') -var universe = dmx.addUniverse('demo', 'null') +const universe = dmx.addUniverse('demo', 'null'); -universe.update({1: 1, 2: 0}) -universe.update({16: 1, 17: 255}) -universe.update({1: 255, 3: 120, 4: 230, 5: 30, 6: 110, 7: 255, 8: 10, 9: 255, 10: 255, 11: 0}) +universe.update({1: 1, 2: 0}); +universe.update({16: 1, 17: 255}); +universe.update({1: 255, 3: 120, 4: 230, 5: 30, 6: 110, 7: 255, 8: 10, 9: 255, 10: 255, 11: 0}); -function done() {console.log('DONE')} +function done() {console.log('DONE');} -function green_water(universe, channels, duration) { - var colors = [ - [160, 230, 20], - [255, 255, 0], - [110, 255, 10] - ] +function greenWater(universe, channels, duration) { + const colors = [ + [160, 230, 20], + [255, 255, 0], + [110, 255, 10], + ]; - for(var c in channels) { - var r = Math.floor((Math.random()*colors.length)) - var u = {} + for (const c in channels) { + const r = Math.floor((Math.random() * colors.length)); + const u = {}; - for(var i = 0; i < 3; i++) { - u[channels[c] + i] = colors[r][i] - } - new A().add(u, duration).run(universe) - } - setTimeout(function() {green_water(universe, channels, duration);}, duration * 2) + for (let i = 0; i < 3; i++) { + u[channels[c] + i] = colors[r][i]; + } + new A().add(u, duration).run(universe); + } + setTimeout(function () {greenWater(universe, channels, duration);}, duration * 2); } function warp(universe, channel, min, max, duration) { - var a = {}, b = {} - a[channel] = min; - b[channel] = max; - new A().add(a, duration).add(b, duration).run(universe, function() { - warp(universe, channel, min, max, duration) - }) + const a = {}, b = {}; + + a[channel] = min; + b[channel] = max; + new A().add(a, duration).add(b, duration).run(universe, function () { + warp(universe, channel, min, max, duration); + }); } -warp(universe, 1, 200, 220, 360) -warp(universe, 1+15, 200, 255, 240) -green_water(universe, [3, 6, 9], 4000) -green_water(universe, [3+15, 6+15, 9+15], 4000) +warp(universe, 1, 200, 220, 360); +warp(universe, 1 + 15, 200, 255, 240); +greenWater(universe, [3, 6, 9], 4000); +greenWater(universe, [3 + 15, 6 + 15, 9 + 15], 4000); -return +return; -var x = new A() - .add({1: 255, 6: 110, 7: 255, 8: 10}, 1200) - .delay(1000) - .add({1: 0}, 600) - .add({1: 255}, 600) - .add({5: 255, 6: 128}, 1000) - .add({1: 0}, 100) - .add({1: 255}, 100) - .add({1: 0}, 200) - .add({1: 255}, 200) - .add({1: 0}, 100) - .add({1: 255}, 100) - .add({1: 0}) - .delay(50) - .add({1: 255}) - .delay(50) - .add({1: 0}) - .delay(50) - .add({1: 255}) - .delay(50) - .add({1: 0}) - .delay(50) - .add({1: 255}) - .delay(50) - .add({2: 255}, 6000) - .delay(200) - .add({2: 0}) +const x = new A() + .add({1: 255, 6: 110, 7: 255, 8: 10}, 1200) + .delay(1000) + .add({1: 0}, 600) + .add({1: 255}, 600) + .add({5: 255, 6: 128}, 1000) + .add({1: 0}, 100) + .add({1: 255}, 100) + .add({1: 0}, 200) + .add({1: 255}, 200) + .add({1: 0}, 100) + .add({1: 255}, 100) + .add({1: 0}) + .delay(50) + .add({1: 255}) + .delay(50) + .add({1: 0}) + .delay(50) + .add({1: 255}) + .delay(50) + .add({1: 0}) + .delay(50) + .add({1: 255}) + .delay(50) + .add({2: 255}, 6000) + .delay(200) + .add({2: 0}); -var y = new A() - .add({9: 255}, 10000) +const y = new A() + .add({9: 255}, 10000); -x.run(universe, done) -y.run(universe, done) +x.run(universe, done); +y.run(universe, done); diff --git a/demo_simple.js b/demo_simple.js index 46d4976..b0e9e08 100644 --- a/demo_simple.js +++ b/demo_simple.js @@ -1,22 +1,20 @@ -"use strict" +const DMX = require('./dmx'); -var DMX = require('./dmx'); - -var dmx = new DMX(); -var A = dmx.animation; +const dmx = new DMX(); // var universe = dmx.addUniverse('demo', 'enttec-open-usb-dmx', '/dev/cu.usbserial-6AVNHXS8') -var universe = dmx.addUniverse('demo', 'null') +const universe = dmx.addUniverse('demo', 'null'); -var on = false; -setInterval(function(){ - if(on){ +let on = false; + +setInterval(() => { + if (on) { on = false; universe.updateAll(0); - console.log("off"); - }else{ + console.log('off'); + } else { on = true; universe.updateAll(250); - console.log("on"); + console.log('on'); } }, 1000); diff --git a/devices.js b/devices.js index 65a582d..2b5a401 100644 --- a/devices.js +++ b/devices.js @@ -1,116 +1,129 @@ module.exports = { - 'generic': { - channels: ['dimmer'] - }, - 'generic-rgb': { - channels: ['red', 'green', 'blue'] - }, - 'showtec-multidim2': { - channels: ['1', '2', '3', '4'] - }, - 'eurolite-led-bar': { - channels: ['ctrl', 'dimmer', 'strobe', 'red0', 'green0', 'blue0', 'red1', 'green1', 'blue1', 'red2', 'green2', 'blue2'], - ranges: { - 'ctrl': { - 'type': 'option', - 'options': [ - {'value': 0, 'label': 'Black Out'}, - {'value': 1, 'label': 'Dimmer 1'}, - {'value': 16, 'label': 'Dimmer 2'}, - {'value': 32, 'label': 'Red'}, - {'value': 48, 'label': 'Green'}, - {'value': 64, 'label': 'Blue'}, - {'value': 80, 'label': 'Purple'}, - {'value': 96, 'label': 'Yellow'}, - {'value': 112, 'label': 'Cyan'}, - {'value': 128, 'label': 'White'}, - {'value': 144, 'label': 'Color change'}, - {'value': 160, 'label': 'Color flow'}, - {'value': 176, 'label': 'Color dream'}, - {'value': 192, 'label': 'Multi flow'}, - {'value': 208, 'label': 'Dream flow'}, - {'value': 224, 'label': 'Two color flow'}, - {'value': 240, 'label': 'Sound activity'} - ] - }, - 'dimmer': { - 'type': 'slider', - 'min': 0, - 'max': 255 - } - } - }, - 'stairville-led-par-56': { - channels: ['ctrl', 'red', 'green', 'blue', 'speed'], - ranges: { - 'ctrl': { - 'type': 'option', - 'options': [ - {'value': 0, 'label': 'RGB Control'}, - {'value': 64, 'label': '7 color fade'}, - {'value': 128, 'label': '7 color change'}, - {'value': 192, 'label': '3 color change'} - ] - } - } - }, - 'ultra-pro-24ch-rdm': { - channels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24' ] - }, - 'ultra-pro-6rgbch-rdm': { - channels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24' ], - channelgroups: ['1', '2', '3', '4', '5', '6'] - }, - 'oppsk-cob-uv-par': { - channels: ['dimmer', 'strobe', 'program-speed', 'sound-activity'] - }, - 'lixda-par12-led': { - channels: ['ctrl', 'static-color', 'speed', 'dimmer', 'red', 'green', 'blue', 'white'], - ranges: { - 'ctrl': { - 'type': 'option', - 'options': [ - {'value': 0, 'label': 'Off'}, - {'value': 11, 'label': 'Static Color'}, - {'value': 51, 'label': 'Jump'}, - {'value': 101, 'label': 'Gradual'}, - {'value': 151, 'label': 'Sound Activate'}, - {'value': 200, 'label': 'Strobe'} - ] - }, - 'static-color': { - 'type': 'option', - 'options': [ - {'value': 0, 'label': 'All Color'}, - {'value': 40, 'label': 'Red'}, - {'value': 50, 'label': 'Green'}, - {'value': 60, 'label': 'Blue'}, - {'value': 70, 'label': 'Yellow'}, - {'value': 80, 'label': 'Cyan'}, - {'value': 90, 'label': 'Purple'}, - {'value': 100, 'label': 'White'}, - {'value': 110, 'label': 'Red + Green'}, - {'value': 120, 'label': 'Red + Blue'}, - {'value': 130, 'label': 'Red + White'}, - {'value': 140, 'label': 'Green + Blue'}, - {'value': 150, 'label': 'Green + White'}, - {'value': 160, 'label': 'Blue + White'}, - {'value': 170, 'label': 'Red + Green + White'}, - {'value': 180, 'label': 'Red + Blue + White'}, - {'value': 190, 'label': 'Green + Blue + White'}, - {'value': 200, 'label': 'Red + Green + Blue'}, - {'value': 210, 'label': 'Red + Green + Blue + White'} - ] - } - } - }, - 'eurolite-led-tha-120PC': { - channels: ['red', 'green', 'blue', 'white', 'dimmer', 'strobe', 'effect'] - }, - 'briteq-bt-theatre-60FC': { - channels: ['dimmer', 'strobe', 'effect', 'red', 'green', 'blue', 'white'] - }, - 'lalucenatz-led-4ch': { - channels: ['master', 'red', 'green', 'blue'] - }, -} + 'generic': { + channels: ['dimmer'], + }, + 'generic-rgb': { + channels: ['red', 'green', 'blue'], + }, + 'showtec-multidim2': { + channels: ['1', '2', '3', '4'], + }, + 'eurolite-led-bar': { + channels: [ + 'ctrl', + 'dimmer', + 'strobe', + 'red0', + 'green0', + 'blue0', + 'red1', + 'green1', + 'blue1', + 'red2', + 'green2', + 'blue2', + ], + ranges: { + 'ctrl': { + 'type': 'option', + 'options': [ + { 'value': 0, 'label': 'Black Out' }, + { 'value': 1, 'label': 'Dimmer 1' }, + { 'value': 16, 'label': 'Dimmer 2' }, + { 'value': 32, 'label': 'Red' }, + { 'value': 48, 'label': 'Green' }, + { 'value': 64, 'label': 'Blue' }, + { 'value': 80, 'label': 'Purple' }, + { 'value': 96, 'label': 'Yellow' }, + { 'value': 112, 'label': 'Cyan' }, + { 'value': 128, 'label': 'White' }, + { 'value': 144, 'label': 'Color change' }, + { 'value': 160, 'label': 'Color flow' }, + { 'value': 176, 'label': 'Color dream' }, + { 'value': 192, 'label': 'Multi flow' }, + { 'value': 208, 'label': 'Dream flow' }, + { 'value': 224, 'label': 'Two color flow' }, + { 'value': 240, 'label': 'Sound activity' }, + ], + }, + 'dimmer': { + 'type': 'slider', + 'min': 0, + 'max': 255, + }, + }, + }, + 'stairville-led-par-56': { + channels: ['ctrl', 'red', 'green', 'blue', 'speed'], + ranges: { + 'ctrl': { + 'type': 'option', + 'options': [ + { 'value': 0, 'label': 'RGB Control' }, + { 'value': 64, 'label': '7 color fade' }, + { 'value': 128, 'label': '7 color change' }, + { 'value': 192, 'label': '3 color change' }, + ], + }, + }, + }, + 'ultra-pro-24ch-rdm': { + channels: [...Array(25).keys()].slice(1), + }, + 'ultra-pro-6rgbch-rdm': { + channels: [...Array(25).keys()].slice(1), + channelgroups: ['1', '2', '3', '4', '5', '6'], + }, + 'oppsk-cob-uv-par': { + channels: ['dimmer', 'strobe', 'program-speed', 'sound-activity'], + }, + 'lixda-par12-led': { + channels: ['ctrl', 'static-color', 'speed', 'dimmer', 'red', 'green', 'blue', 'white'], + ranges: { + 'ctrl': { + 'type': 'option', + 'options': [ + { 'value': 0, 'label': 'Off' }, + { 'value': 11, 'label': 'Static Color' }, + { 'value': 51, 'label': 'Jump' }, + { 'value': 101, 'label': 'Gradual' }, + { 'value': 151, 'label': 'Sound Activate' }, + { 'value': 200, 'label': 'Strobe' }, + ], + }, + 'static-color': { + 'type': 'option', + 'options': [ + { 'value': 0, 'label': 'All Color' }, + { 'value': 40, 'label': 'Red' }, + { 'value': 50, 'label': 'Green' }, + { 'value': 60, 'label': 'Blue' }, + { 'value': 70, 'label': 'Yellow' }, + { 'value': 80, 'label': 'Cyan' }, + { 'value': 90, 'label': 'Purple' }, + { 'value': 100, 'label': 'White' }, + { 'value': 110, 'label': 'Red + Green' }, + { 'value': 120, 'label': 'Red + Blue' }, + { 'value': 130, 'label': 'Red + White' }, + { 'value': 140, 'label': 'Green + Blue' }, + { 'value': 150, 'label': 'Green + White' }, + { 'value': 160, 'label': 'Blue + White' }, + { 'value': 170, 'label': 'Red + Green + White' }, + { 'value': 180, 'label': 'Red + Blue + White' }, + { 'value': 190, 'label': 'Green + Blue + White' }, + { 'value': 200, 'label': 'Red + Green + Blue' }, + { 'value': 210, 'label': 'Red + Green + Blue + White' }, + ], + }, + }, + }, + 'eurolite-led-tha-120PC': { + channels: ['red', 'green', 'blue', 'white', 'dimmer', 'strobe', 'effect'], + }, + 'briteq-bt-theatre-60FC': { + channels: ['dimmer', 'strobe', 'effect', 'red', 'green', 'blue', 'white'], + }, + 'lalucenatz-led-4ch': { + channels: ['master', 'red', 'green', 'blue'], + }, +}; diff --git a/dmx-web.js b/dmx-web.js index 7a39c09..24e5360 100755 --- a/dmx-web.js +++ b/dmx-web.js @@ -1,129 +1,128 @@ #!/usr/bin/env node -"use strict" - -var fs = require('fs') -var http = require('http') -var body = require('body-parser') -var express = require('express') -var socketio = require('socket.io') -var program = require('commander') -var DMX = require('./dmx') -var A = DMX.Animation +const fs = require('fs'); +const http = require('http'); +const body = require('body-parser'); +const express = require('express'); +const socketio = require('socket.io'); +const program = require('commander'); +const DMX = require('./dmx'); +const A = DMX.Animation; program - .version("0.0.1") - .option('-c, --config ', 'Read config from file [/etc/dmx-web.json]', '/etc/dmx-web.json') - .parse(process.argv) + .version('0.0.1') + .option('-c, --config ', 'Read config from file [/etc/dmx-web.json]', '/etc/dmx-web.json') + .parse(process.argv); - -var config = JSON.parse(fs.readFileSync(program.config, 'utf8')) +const config = JSON.parse(fs.readFileSync(program.config, 'utf8')); function DMXWeb() { - var app = express() - var server = http.createServer(app) - var io = socketio.listen(server) + const app = express(); + const server = http.createServer(app); + const io = socketio.listen(server); - var dmx = new DMX(config) + const dmx = new DMX(config); - for(var universe in config.universes) { - dmx.addUniverse( - universe, - config.universes[universe].output.driver, - config.universes[universe].output.device, - config.universes[universe].output.options - ) - } + for (const universe in config.universes) { + dmx.addUniverse( + universe, + config.universes[universe].output.driver, + config.universes[universe].output.device, + config.universes[universe].output.options + ); + } - var listen_port = config.server.listen_port || 8080 - var listen_host = config.server.listen_host || '::' + const listenPort = config.server.listen_port || 8080; + const listenHost = config.server.listen_host || '::'; - server.listen(listen_port, listen_host, null, function() { - if(config.server.uid && config.server.gid) { - try { - process.setuid(config.server.uid) - process.setgid(config.server.gid) - } catch (err) { - console.log(err) - process.exit(1) - } - } - }) + server.listen(listenPort, listenHost, null, () => { + if (config.server.uid && config.server.gid) { + try { + process.setuid(config.server.uid); + process.setgid(config.server.gid); + } catch (err) { + console.log(err); + process.exit(1); + } + } + }); - app.use(body.json()) + app.use(body.json()); - app.get('/', function(req, res) { - res.sendFile(__dirname + '/index.html') - }) + app.get('/', (req, res) => { + res.sendFile(__dirname + '/index.html'); + }); - app.get('/config', function(req, res) { - var response = {"devices": dmx.devices, "universes": {}} - Object.keys(config.universes).forEach(function(key) { - response.universes[key] = config.universes[key].devices - }) + app.get('/config', (req, res) => { + const response = {'devices': dmx.devices, 'universes': {}}; - res.json(response) - }) + Object.keys(config.universes).forEach(key => { + response.universes[key] = config.universes[key].devices; + }); - app.get('/state/:universe', function(req, res) { - if(!(req.params.universe in dmx.universes)) { - res.status(404).json({"error": "universe not found"}) - return - } + res.json(response); + }); - res.json({"state": dmx.universeToObject(req.params.universe)}) - }) + app.get('/state/:universe', (req, res) => { + if (!(req.params.universe in dmx.universes)) { + res.status(404).json({'error': 'universe not found'}); + return; + } - app.post('/state/:universe', function(req, res) { - if(!(req.params.universe in dmx.universes)) { - res.status(404).json({"error": "universe not found"}) - return - } + res.json({'state': dmx.universeToObject(req.params.universe)}); + }); - dmx.update(req.params.universe, req.body) - res.json({"state": dmx.universeToObject(req.params.universe)}) - }) + app.post('/state/:universe', (req, res) => { + if (!(req.params.universe in dmx.universes)) { + res.status(404).json({'error': 'universe not found'}); + return; + } - app.post('/animation/:universe', function(req, res) { - try { - var universe = dmx.universes[req.params.universe] + dmx.update(req.params.universe, req.body); + res.json({'state': dmx.universeToObject(req.params.universe)}); + }); - // preserve old states - var old = dmx.universeToObject(req.params.universe) + app.post('/animation/:universe', (req, res) => { + try { + const universe = dmx.universes[req.params.universe]; - var animation = new A() - for(var step in req.body) { - animation.add( - req.body[step].to, - req.body[step].duration || 0, - req.body[step].options || {} - ) - } - animation.add(old, 0) - animation.run(universe) - res.json({"success": true}) - } catch(e) { - console.log(e) - res.json({"error": String(e)}) - } - }) + // preserve old states + const old = dmx.universeToObject(req.params.universe); - io.sockets.on('connection', function(socket) { - socket.emit('init', {'devices': dmx.devices, 'setup': config}) + const animation = new A(); - socket.on('request_refresh', function() { - for(var universe in config.universes) { - socket.emit('update', universe, dmx.universeToObject(universe)) - } - }) + for (const step in req.body) { + animation.add( + req.body[step].to, + req.body[step].duration || 0, + req.body[step].options || {} + ); + } + animation.add(old, 0); + animation.run(universe); + res.json({'success': true}); + } catch (e) { + console.log(e); + res.json({'error': String(e)}); + } + }); - socket.on('update', function(universe, update) { - dmx.update(universe, update) - }) + io.sockets.on('connection', socket => { + socket.emit('init', {'devices': dmx.devices, 'setup': config}); - dmx.on('update', function(universe, update) { - socket.emit('update', universe, update) - }) - }) + socket.on('request_refresh', () => { + for (const universe in config.universes) { + socket.emit('update', universe, dmx.universeToObject(universe)); + } + }); + + socket.on('update', (universe, update) => { + dmx.update(universe, update); + }); + + dmx.on('update', (universe, update) => { + socket.emit('update', universe, update); + }); + }); } -DMXWeb() +DMXWeb(); diff --git a/dmx.js b/dmx.js index 4bf1a42..faca3dc 100644 --- a/dmx.js +++ b/dmx.js @@ -1,55 +1,58 @@ -"use strict" +const util = require('util'); +const EventEmitter = require('events').EventEmitter; -var util = require('util') -var EventEmitter = require('events').EventEmitter +class DMX { + constructor(options) { + const opt = options || {}; + const devices = opt.devices || {}; -function DMX(options) { - var options = options || {} - var devices = options.devices || {} - this.universes = {} - this.drivers = {} - this.devices = Object.assign({}, require('./devices'), devices); - this.animation = require('./anim') + this.universes = {}; + this.drivers = {}; + this.devices = Object.assign({}, require('./devices'), devices); + this.animation = require('./anim'); - 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')) + 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')); + } + + registerDriver(name, module) { + this.drivers[name] = module; + } + + addUniverse(name, driver, deviceId, options) { + this.universes[name] = new this.drivers[driver](deviceId, options); + return this.universes[name]; + } + + update(universe, channels) { + this.universes[universe].update(channels); + this.emit('update', universe, channels); + } + + updateAll(universe, value) { + this.universes[universe].updateAll(value); + this.emit('updateAll', universe, value); + } + + universeToObject(universeKey) { + const universe = this.universes[universeKey]; + const u = {}; + + for (let i = 0; i < 512; i++) { + u[i] = universe.get(i); + } + return u; + } } -util.inherits(DMX, EventEmitter) +util.inherits(DMX, EventEmitter); -DMX.devices = require('./devices') -DMX.Animation = require('./anim') +DMX.devices = require('./devices'); +DMX.Animation = require('./anim'); -DMX.prototype.registerDriver = function(name, module) { - this.drivers[name] = module -} - -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) { - this.universes[universe].update(channels) - this.emit('update', universe, channels) -} - -DMX.prototype.updateAll = function(universe, value) { - this.universes[universe].updateAll(value) - this.emit('updateAll', universe, value) -} - -DMX.prototype.universeToObject = function(universe) { - var universe = this.universes[universe] - var u = {} - for(var i = 0; i < 512; i++) { - u[i] = universe.get(i) - } - return u -} - -module.exports = DMX +module.exports = DMX; diff --git a/drivers/artnet.js b/drivers/artnet.js index cb94962..de739cb 100644 --- a/drivers/artnet.js +++ b/drivers/artnet.js @@ -1,72 +1,67 @@ -"use strict" +const dgram = require('dgram'); -var dgram = require('dgram') +function EnttecODE(deviceId = '127.0.0.1', options = {}) { + const self = this; -function EnttecODE(device_id, options) { - var self = this + self.header = new Buffer([65, 114, 116, 45, 78, 101, 116, 0, 0, 80, 0, 14]); + self.sequence = new Buffer([0]); + self.physical = new Buffer([0]); + self.universeId = new Buffer([0x00, 0x00]); + self.length = new Buffer([0x02, 0x00]); - self.header = new Buffer([65, 114, 116, 45, 78, 101, 116, 0, 0, 80, 0, 14]) - self.sequence = new Buffer([0]) - self.physical = new Buffer([0]) - self.universe_id = new Buffer([0x00, 0x00]) - self.length = new Buffer([0x02, 0x00]) + self.universe = new Buffer(513); + self.universe.fill(0); - self.universe = new Buffer(513) - self.universe.fill(0) + self.sleepTime = 24; - self.sleepTime = 24 - - options = options || {} - self.universe_id.writeInt16LE(options.universe || 0, 0) - self.host = device_id || '127.0.0.1' - self.port = options.port || 6454 - self.dev = dgram.createSocket('udp4') - self.dev.bind(function() { - self.dev.setBroadcast(true) - }) - self.start() + self.universe_id.writeInt16LE(options.universe || 0, 0); + self.host = deviceId; + self.port = options.port || 6454; + self.dev = dgram.createSocket('udp4'); + self.dev.bind(() => self.dev.setBroadcast(true)); + self.start(); } -EnttecODE.prototype.send_universe = function() { - var pkg = Buffer.concat([ - this.header, - this.sequence, - this.physical, - this.universe_id, - this.length, - this.universe.slice(1) - ]) +EnttecODE.prototype.sendUniverse = function () { + const pkg = Buffer.concat([ + this.header, + this.sequence, + this.physical, + this.universe_id, + this.length, + this.universe.slice(1), + ]); - this.dev.send(pkg, 0, pkg.length, this.port, this.host) -} + this.dev.send(pkg, 0, pkg.length, this.port, this.host); +}; -EnttecODE.prototype.start = function() { - this.timeout = setInterval(this.send_universe.bind(this), this.sleepTime) -} +EnttecODE.prototype.start = function () { + this.timeout = setInterval(this.sendUniverse.bind(this), this.sleepTime); +}; -EnttecODE.prototype.stop = function() { - clearInterval(this.timeout) -} +EnttecODE.prototype.stop = function () { + clearInterval(this.timeout); +}; -EnttecODE.prototype.close = function(cb) { - this.stop() - cb(null) -} +EnttecODE.prototype.close = function (cb) { + this.stop(); + cb(null); +}; -EnttecODE.prototype.update = function(u) { - for (var c in u) { - this.universe[c] = u[c] - } -} +EnttecODE.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } +}; -EnttecODE.prototype.updateAll = function(v) { - for (var i = 1; i <= 512; i++) { - this.universe[i] = v - } -} +EnttecODE.prototype.updateAll = function (v) { + for (const i = 1; i <= 512; i++) { + this.universe[i] = v; + } +}; -EnttecODE.prototype.get = function(c) { - return this.universe[c] -} +EnttecODE.prototype.get = function (c) { + return this.universe[c]; +}; -module.exports = EnttecODE +module.exports = EnttecODE; diff --git a/drivers/bbdmx.js b/drivers/bbdmx.js index 92e99be..856276b 100644 --- a/drivers/bbdmx.js +++ b/drivers/bbdmx.js @@ -1,59 +1,58 @@ -'use strict' +const dgram = require('dgram'); -var dgram = require('dgram') +const UNIVERSE_LEN = 512; -var UNIVERSE_LEN = 512 +function BBDMX(deviceId = '127.0.0.1', options = {}) { + const self = this; -function BBDMX(device_id, options) { - var self = this - self.options = options || {} - self.universe = new Buffer(UNIVERSE_LEN + 1) - self.universe.fill(0) - self.host = device_id || '127.0.0.1' - self.port = self.options.port || 9930 - self.dev = dgram.createSocket('udp4') - self.sleepTime = 24 - self.start() + self.options = options; + self.universe = new Buffer(UNIVERSE_LEN + 1); + self.universe.fill(0); + self.host = deviceId; + self.port = self.options.port || 9930; + self.dev = dgram.createSocket('udp4'); + self.sleepTime = 24; + self.start(); } -BBDMX.prototype.send_universe = function() { - var channel - var messageBuffer = new Buffer(UNIVERSE_LEN.toString()) +BBDMX.prototype.sendUniverse = function () { + let channel; + let messageBuffer = new Buffer(UNIVERSE_LEN.toString()); - for (var i = 1; i <= UNIVERSE_LEN; i++) { - channel = new Buffer(' ' + this.universe[i]) - messageBuffer = Buffer.concat([messageBuffer, channel]) - } - this.dev.send(messageBuffer, 0, messageBuffer.length, this.port, this.host) -} - -BBDMX.prototype.start = function() { - this.timeout = setInterval(this.send_universe.bind(this), this.sleepTime) -} - -BBDMX.prototype.stop = function() { - clearInterval(this.timeout) -} - -BBDMX.prototype.close = function(cb) { - this.stop() - cb(null) + for (const i = 1; i <= UNIVERSE_LEN; i++) { + channel = new Buffer(' ' + this.universe[i]); + messageBuffer = Buffer.concat([messageBuffer, channel]); + } + this.dev.send(messageBuffer, 0, messageBuffer.length, this.port, this.host); }; -BBDMX.prototype.update = function(u) { - for (var c in u) { - this.universe[c] = u[c] - } -} +BBDMX.prototype.start = function () { + this.timeout = setInterval(this.sendUniverse.bind(this), this.sleepTime); +}; -BBDMX.prototype.updateAll = function(v) { - for (var i = 1; i <= UNIVERSE_LEN; i++) { - this.universe[i] = v - } -} +BBDMX.prototype.stop = function () { + clearInterval(this.timeout); +}; -BBDMX.prototype.get = function(c) { - return this.universe[c] -} +BBDMX.prototype.close = function (cb) { + this.stop(); + cb(null); +}; -module.exports = BBDMX +BBDMX.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } +}; + +BBDMX.prototype.updateAll = function (v) { + for (const i = 1; i <= UNIVERSE_LEN; i++) { + this.universe[i] = v; + } +}; + +BBDMX.prototype.get = function (c) { + return this.universe[c]; +}; + +module.exports = BBDMX; diff --git a/drivers/dmx4all.js b/drivers/dmx4all.js index 1ea67d6..bcb5d39 100644 --- a/drivers/dmx4all.js +++ b/drivers/dmx4all.js @@ -1,67 +1,66 @@ -"use strict" +const SerialPort = require('serialport'); -var SerialPort = require("serialport") +const UNIVERSE_LEN = 512; -var UNIVERSE_LEN = 512 +function DMX4ALL(deviceId, options = {}) { + const self = this; -function DMX4ALL(device_id, options) { - var self = this - options = options || {} - this.universe = new Buffer(UNIVERSE_LEN + 1) - this.universe.fill(0) + this.universe = new Buffer(UNIVERSE_LEN + 1); + this.universe.fill(0); - this.dev = new SerialPort(device_id, { - 'baudRate': 38400, - 'dataBits': 8, - 'stopBits': 1, - 'parity': 'none' - }, function(err) { - if(!err) { - self.send_universe() - } - }) - this.dev.on('data', function(data) { - //process.stdout.write(data.toString('ascii')) - }) + this.dev = new SerialPort(deviceId, { + 'baudRate': 38400, + 'dataBits': 8, + 'stopBits': 1, + 'parity': 'none', + }, err => { + if (!err) { + self.sendUniverse(); + } + }); + this.dev.on('data', data => { + // process.stdout.write(data.toString('ascii')) + }); } -DMX4ALL.prototype.send_universe = function() { - if(!this.dev.writable) { - return - } +DMX4ALL.prototype.sendUniverse = function () { + if (!this.dev.writable) { + return; + } - var msg = Buffer(UNIVERSE_LEN * 3) - for(var i = 0; i < UNIVERSE_LEN; i++) { - msg[i * 3 + 0] = (i < 256) ? 0xE2 : 0xE3 - msg[i * 3 + 1] = i - msg[i * 3 + 2] = this.universe[i + 1] - } - this.dev.write(msg) -} + const msg = Buffer(UNIVERSE_LEN * 3); -DMX4ALL.prototype.start = function() {} -DMX4ALL.prototype.stop = function() {} + for (let i = 0; i < UNIVERSE_LEN; i++) { + msg[i * 3 + 0] = (i < 256) ? 0xE2 : 0xE3; + msg[i * 3 + 1] = i; + msg[i * 3 + 2] = this.universe[i + 1]; + } + this.dev.write(msg); +}; -DMX4ALL.prototype.close = function(cb) { - this.dev.close(cb) -} +DMX4ALL.prototype.start = () => {}; +DMX4ALL.prototype.stop = () => {}; -DMX4ALL.prototype.update = function(u) { - for(var c in u) { - this.universe[c] = u[c] - } - this.send_universe() -} +DMX4ALL.prototype.close = function (cb) { + this.dev.close(cb); +}; -DMX4ALL.prototype.updateAll = function(v){ - for(var i = 1; i <= 512; i++) { - this.universe[i] = v - } - this.send_universe() -} +DMX4ALL.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } + this.sendUniverse(); +}; -DMX4ALL.prototype.get = function(c) { - return this.universe[c] -} +DMX4ALL.prototype.updateAll = function (v) { + for (let i = 1; i <= 512; i++) { + this.universe[i] = v; + } + this.sendUniverse(); +}; -module.exports = DMX4ALL +DMX4ALL.prototype.get = function (c) { + return this.universe[c]; +}; + +module.exports = DMX4ALL; diff --git a/drivers/dmxking-ultra-dmx-pro.js b/drivers/dmxking-ultra-dmx-pro.js index cc78c15..cc84256 100644 --- a/drivers/dmxking-ultra-dmx-pro.js +++ b/drivers/dmxking-ultra-dmx-pro.js @@ -1,83 +1,82 @@ -"use strict" +const SerialPort = require('serialport'); -var SerialPort = require("serialport") +const DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE = 0x00; +const DMXKING_ULTRA_DMX_PRO_START_OF_MSG = 0x7e; +const DMXKING_ULTRA_DMX_PRO_END_OF_MSG = 0xe7; +const DMXKING_ULTRA_DMX_PRO_SEND_DMX_RQ = 0x06; +const DMXKING_ULTRA_DMX_PRO_SEND_DMX_A_RQ = 0x64; +const DMXKING_ULTRA_DMX_PRO_SEND_DMX_B_RQ = 0x65; +// var DMXKING_ULTRA_DMX_PRO_RECV_DMX_PKT = 0x05; -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(deviceId, options = {}) { + const self = this; -function DMXKingUltraDMXPro(device_id, options) { - var self = this - this.options = options || {} - this.universe = Buffer.alloc(513, 0); + this.options = options; + this.universe = Buffer.alloc(513, 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.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() - } - }) + this.dev = new SerialPort(deviceId, { + 'baudRate': 250000, + 'dataBits': 8, + 'stopBits': 2, + 'parity': 'none', + }, err => { + if (!err) { + self.sendUniverse(); + } + }); } -DMXKingUltraDMXPro.prototype.send_universe = function() { - if(!this.dev.writable) { - return - } - var hdr = Buffer.from([ - DMXKING_ULTRA_DMX_PRO_START_OF_MSG, - this.sendDMXReq, - (this.universe.length) & 0xff, - ((this.universe.length) >> 8) & 0xff, - DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE - ]) +DMXKingUltraDMXPro.prototype.sendUniverse = function () { + if (!this.dev.writable) { + return; + } + const hdr = Buffer.from([ + DMXKING_ULTRA_DMX_PRO_START_OF_MSG, + this.sendDMXReq, + (this.universe.length) & 0xff, + ((this.universe.length) >> 8) & 0xff, + DMXKING_ULTRA_DMX_PRO_DMX_STARTCODE, + ]); - var msg = Buffer.concat([ - hdr, - this.universe.slice(1), - Buffer.from([DMXKING_ULTRA_DMX_PRO_END_OF_MSG]) - ]) - this.dev.write(msg) -} + const msg = Buffer.concat([ + hdr, + this.universe.slice(1), + Buffer.from([DMXKING_ULTRA_DMX_PRO_END_OF_MSG]), + ]); -DMXKingUltraDMXPro.prototype.start = function() {} -DMXKingUltraDMXPro.prototype.stop = function() {} + this.dev.write(msg); +}; -DMXKingUltraDMXPro.prototype.close = function(cb) { - this.dev.close(cb) -} +DMXKingUltraDMXPro.prototype.start = () => { }; +DMXKingUltraDMXPro.prototype.stop = () => { }; -DMXKingUltraDMXPro.prototype.update = function(u) { - for(var c in u) { - this.universe[c] = u[c] - } - this.send_universe() -} +DMXKingUltraDMXPro.prototype.close = function (cb) { + this.dev.close(cb); +}; -DMXKingUltraDMXPro.prototype.updateAll = function(v){ - for(var i = 1; i <= 512; i++) { - this.universe[i] = v - } - this.send_universe() -} +DMXKingUltraDMXPro.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } + this.sendUniverse(); +}; -DMXKingUltraDMXPro.prototype.get = function(c) { - return this.universe[c] -} +DMXKingUltraDMXPro.prototype.updateAll = function (v) { + for (let i = 1; i <= 512; i++) { + this.universe[i] = v; + } + this.sendUniverse(); +}; -module.exports = DMXKingUltraDMXPro +DMXKingUltraDMXPro.prototype.get = function (c) { + return this.universe[c]; +}; + +module.exports = DMXKingUltraDMXPro; diff --git a/drivers/enttec-open-usb-dmx.js b/drivers/enttec-open-usb-dmx.js index c2408f3..98a699f 100644 --- a/drivers/enttec-open-usb-dmx.js +++ b/drivers/enttec-open-usb-dmx.js @@ -1,75 +1,75 @@ -"use strict" +const SerialPort = require('serialport'); -var SerialPort = require("serialport") +function EnttecOpenUsbDMX(deviceId, options) { + const self = this; -function EnttecOpenUsbDMX(device_id, options) { - var self = this - options = options || {} + options = options || {}; - this.universe = new Buffer(513) - this.universe.fill(0) + this.universe = new Buffer(513); + this.universe.fill(0); - self.interval = 46 + self.interval = 46; - this.dev = new SerialPort(device_id, { - 'baudRate': 250000, - 'dataBits': 8, - 'stopBits': 2, - 'parity': 'none' - }, function(err) { - if(err) { - console.log(err) - return - } - self.start() - }) + this.dev = new SerialPort(deviceId, { + 'baudRate': 250000, + 'dataBits': 8, + 'stopBits': 2, + 'parity': 'none', + }, err => { + if (err) { + console.log(err); + return; + } + self.start(); + }); } -EnttecOpenUsbDMX.prototype.send_universe = function() { - var self = this - if(!this.dev.writable) { - return - } +EnttecOpenUsbDMX.prototype.sendUniverse = function () { + const self = this; - // toggle break - self.dev.set({brk: true, rts: true}, function(err, r) { - setTimeout(function() { - self.dev.set({brk: false, rts: true}, function(err, r) { - setTimeout(function() { - self.dev.write(Buffer.concat([Buffer([0]), self.universe.slice(1)])) - }, 1) - }) - }, 1) - }) -} + if (!this.dev.writable) { + return; + } -EnttecOpenUsbDMX.prototype.start = function() { - this.intervalhandle = setInterval(this.send_universe.bind(this), this.interval) -} + // toggle break + self.dev.set({brk: true, rts: true}, (err, r) => { + setTimeout(() => { + self.dev.set({brk: false, rts: true}, (err, r) => { + setTimeout(() => { + self.dev.write(Buffer.concat([Buffer([0]), self.universe.slice(1)])); + }, 1); + }); + }, 1); + }); +}; -EnttecOpenUsbDMX.prototype.stop = function() { - clearInterval(this.intervalhandle) -} +EnttecOpenUsbDMX.prototype.start = function () { + this.intervalhandle = setInterval(this.sendUniverse.bind(this), this.interval); +}; -EnttecOpenUsbDMX.prototype.close = function(cb) { - this.stop() - this.dev.close(cb) -} +EnttecOpenUsbDMX.prototype.stop = function () { + clearInterval(this.intervalhandle); +}; -EnttecOpenUsbDMX.prototype.update = function(u) { - for(var c in u) { - this.universe[c] = u[c] - } -} +EnttecOpenUsbDMX.prototype.close = function (cb) { + this.stop(); + this.dev.close(cb); +}; -EnttecOpenUsbDMX.prototype.updateAll = function(v) { - for(var i = 1; i <= 512; i++) { - this.universe[i] = v - } -} +EnttecOpenUsbDMX.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } +}; -EnttecOpenUsbDMX.prototype.get = function(c) { - return this.universe[c] -} +EnttecOpenUsbDMX.prototype.updateAll = function (v) { + for (let i = 1; i <= 512; i++) { + this.universe[i] = v; + } +}; -module.exports = EnttecOpenUsbDMX +EnttecOpenUsbDMX.prototype.get = function (c) { + return this.universe[c]; +}; + +module.exports = EnttecOpenUsbDMX; diff --git a/drivers/enttec-usb-dmx-pro.js b/drivers/enttec-usb-dmx-pro.js index b718be7..8fdfdf2 100644 --- a/drivers/enttec-usb-dmx-pro.js +++ b/drivers/enttec-usb-dmx-pro.js @@ -1,74 +1,72 @@ -"use strict" +const SerialPort = require('serialport'); -var SerialPort = require("serialport") +const ENTTEC_PRO_DMX_STARTCODE = 0x00; +const ENTTEC_PRO_START_OF_MSG = 0x7e; +const ENTTEC_PRO_END_OF_MSG = 0xe7; +const ENTTEC_PRO_SEND_DMX_RQ = 0x06; +// var ENTTEC_PRO_RECV_DMX_PKT = 0x05; -var ENTTEC_PRO_DMX_STARTCODE = 0x00 - , ENTTEC_PRO_START_OF_MSG = 0x7e - , ENTTEC_PRO_END_OF_MSG = 0xe7 - , ENTTEC_PRO_SEND_DMX_RQ = 0x06 - , ENTTEC_PRO_RECV_DMX_PKT = 0x05 - ; +function EnttecUSBDMXPRO(deviceId, options = {}) { + const self = this; -function EnttecUSBDMXPRO(device_id, options) { - var self = this - options = options || {} - this.universe = Buffer.alloc(513, 0); + this.universe = Buffer.alloc(513, 0); - this.dev = new SerialPort(device_id, { - 'baudRate': 250000, - 'dataBits': 8, - 'stopBits': 2, - 'parity': 'none' - }, function(err) { - if(!err) { - self.send_universe() - } - }) + this.dev = new SerialPort(deviceId, { + 'baudRate': 250000, + 'dataBits': 8, + 'stopBits': 2, + 'parity': 'none', + }, err => { + if (!err) { + self.sendUniverse(); + } + }); } -EnttecUSBDMXPRO.prototype.send_universe = function() { - if(!this.dev.writable) { - return - } - var hdr = Buffer.from([ - ENTTEC_PRO_START_OF_MSG, - ENTTEC_PRO_SEND_DMX_RQ, - (this.universe.length) & 0xff, - ((this.universe.length) >> 8) & 0xff, - ENTTEC_PRO_DMX_STARTCODE - ]) +EnttecUSBDMXPRO.prototype.sendUniverse = function () { + if (!this.dev.writable) { + return; + } + const hdr = Buffer.from([ + ENTTEC_PRO_START_OF_MSG, + ENTTEC_PRO_SEND_DMX_RQ, + (this.universe.length) & 0xff, + ((this.universe.length) >> 8) & 0xff, + ENTTEC_PRO_DMX_STARTCODE, + ]); - var msg = Buffer.concat([ - hdr, - this.universe.slice(1), - Buffer.from([ENTTEC_PRO_END_OF_MSG]) - ]) - this.dev.write(msg) -} + const msg = Buffer.concat([ + hdr, + this.universe.slice(1), + Buffer.from([ENTTEC_PRO_END_OF_MSG]), + ]); -EnttecUSBDMXPRO.prototype.start = function() {} -EnttecUSBDMXPRO.prototype.stop = function() {} + this.dev.write(msg); +}; -EnttecUSBDMXPRO.prototype.close = function(cb) { - this.dev.close(cb) -} +EnttecUSBDMXPRO.prototype.start = () => { }; +EnttecUSBDMXPRO.prototype.stop = () => { }; -EnttecUSBDMXPRO.prototype.update = function(u) { - for(var c in u) { - this.universe[c] = u[c] - } - this.send_universe() -} +EnttecUSBDMXPRO.prototype.close = function (cb) { + this.dev.close(cb); +}; -EnttecUSBDMXPRO.prototype.updateAll = function(v){ - for(var i = 1; i <= 512; i++) { - this.universe[i] = v - } - this.send_universe() -} +EnttecUSBDMXPRO.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } + this.sendUniverse(); +}; -EnttecUSBDMXPRO.prototype.get = function(c) { - return this.universe[c] -} +EnttecUSBDMXPRO.prototype.updateAll = function (v) { + for (let i = 1; i <= 512; i++) { + this.universe[i] = v; + } + this.sendUniverse(); +}; -module.exports = EnttecUSBDMXPRO +EnttecUSBDMXPRO.prototype.get = function (c) { + return this.universe[c]; +}; + +module.exports = EnttecUSBDMXPRO; diff --git a/drivers/null.js b/drivers/null.js index e8daa23..66cb412 100644 --- a/drivers/null.js +++ b/drivers/null.js @@ -1,42 +1,42 @@ -"use strict" +function Null(deviceId, options) { + const self = this; -function Null(device_id, options) { - var self = this - options = options || {} - this.universe = Buffer.alloc(513, 0); - self.start() + options = options || {}; + this.universe = Buffer.alloc(513, 0); + self.start(); } -Null.prototype.start = function() { - var self = this - self.timeout = setInterval(function() { - console.log(self.universe) - }, 1000) -} +Null.prototype.start = function () { + const self = this; -Null.prototype.stop = function() { - clearInterval(this.timeout) -} + self.timeout = setInterval(() => { + console.log(self.universe); + }, 1000); +}; -Null.prototype.close = function(cb) { - cb(null) -} +Null.prototype.stop = function () { + clearInterval(this.timeout); +}; -Null.prototype.update = function(u) { - for(var c in u) { - this.universe[c] = u[c] - } - console.log(this.universe.slice(1)) -} +Null.prototype.close = cb => { + cb(null); +}; -Null.prototype.updateAll = function(v){ - for(var i = 1; i <= 512; i++) { - this.universe[i] = v - } -} +Null.prototype.update = function (u) { + for (const c in u) { + this.universe[c] = u[c]; + } + console.log(this.universe.slice(1)); +}; -Null.prototype.get = function(c) { - return this.universe[c] -} +Null.prototype.updateAll = function (v) { + for (let i = 1; i <= 512; i++) { + this.universe[i] = v; + } +}; -module.exports = Null +Null.prototype.get = function (c) { + return this.universe[c]; +}; + +module.exports = Null; diff --git a/easing.js b/easing.js index 38dfdd5..dc31b09 100644 --- a/easing.js +++ b/easing.js @@ -2,187 +2,190 @@ * based on jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ * * TERMS OF USE - jQuery Easing - * - * Open source under the BSD License. - * + * + * Open source under the BSD License. + * * Copyright © 2008 George McGinley Smith * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, + * + * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this list of + * + * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * - * Neither the name of the author nor the names of contributors may be used to endorse + * + * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. * */ // t: current time, b: begInnIng value, c: change In value, d: duration exports.ease = { - linear: function (t, b, c, d) { return c * t/d + b; }, - inQuad: function (t, b, c, d) { return c * (t/=d) * t + b; }, - outQuad: function (t, b, c, d) { return -c * (t/=d) * (t-2) + b; }, - inOutQuad: function (t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t + b; - return -c/2 * ((--t)*(t-2) - 1) + b; - }, - inCubic: function (t, b, c, d) { return c*(t/=d)*t*t + b; }, - outCubic: function (t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; }, - inOutCubic: function (t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t + b; - return c/2*((t-=2)*t*t + 2) + b; - }, - inQuart: function (t, b, c, d) { - return c*(t/=d)*t*t*t + b; - }, - outQuart: function (t, b, c, d) { - return -c * ((t=t/d-1)*t*t*t - 1) + b; - }, - inOutQuart: function (t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t*t + b; - return -c/2 * ((t-=2)*t*t*t - 2) + b; - }, - inQuint: function (t, b, c, d) { - return c*(t/=d)*t*t*t*t + b; - }, - outQuint: function (t, b, c, d) { - return c*((t=t/d-1)*t*t*t*t + 1) + b; - }, - inOutQuint: function (t, b, c, d) { - if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; - return c/2*((t-=2)*t*t*t*t + 2) + b; - }, - inSine: function (t, b, c, d) { - return -c * Math.cos(t/d * (Math.PI/2)) + c + b; - }, - outSine: function (t, b, c, d) { - return c * Math.sin(t/d * (Math.PI/2)) + b; - }, - inOutSine: function (t, b, c, d) { - return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; - }, - inExpo: function (t, b, c, d) { - return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; - }, - outExpo: function (t, b, c, d) { - return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; - }, - inOutExpo: function (t, b, c, d) { - if (t==0) return b; - if (t==d) return b+c; - if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; - return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; - }, - inCirc: function (t, b, c, d) { - return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; - }, - outCirc: function (t, b, c, d) { - return c * Math.sqrt(1 - (t=t/d-1)*t) + b; - }, - inOutCirc: function (t, b, c, d) { - if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; - return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; - }, - inElastic: function (t, b, c, d) { - var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); - return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; - }, - outElastic: function (t, b, c, d) { - var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); - return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; - }, - inOutElastic: function (t, b, c, d) { - var s=1.70158;var p=0;var a=c; - if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); - if (a < Math.abs(c)) { a=c; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (c/a); - if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; - return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; - }, - inBack: function (t, b, c, d, s) { - if (s == undefined) s = 1.70158; - return c*(t/=d)*t*((s+1)*t - s) + b; - }, - outBack: function (t, b, c, d, s) { - if (s == undefined) s = 1.70158; - return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; - }, - inOutBack: function (t, b, c, d, s) { - if (s == undefined) s = 1.70158; - if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; - return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; - }, - inBounce: function (t, b, c, d) { - return c - exports.ease.outBounce (d-t, 0, c, d) + b; - }, - outBounce: function (t, b, c, d) { - if ((t/=d) < (1/2.75)) { - return c*(7.5625*t*t) + b; - } else if (t < (2/2.75)) { - return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; - } else if (t < (2.5/2.75)) { - return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; - } else { - return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; - } - }, - inOutBounce: function (t, b, c, d) { - if (t < d/2) return exports.ease.inBounce (t*2, 0, c, d) * .5 + b; - return exports.ease.outBounce (t*2-d, 0, c, d) * .5 + c*.5 + b; - } -} + linear(t, b, c, d) { return c * t / d + b; }, + inQuad(t, b, c, d) { return c * (t /= d) * t + b; }, + outQuad(t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, + inOutQuad(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t + b; + return -c / 2 * ((--t) * (t - 2) - 1) + b; + }, + inCubic(t, b, c, d) { return c * (t /= d) * t * t + b; }, + outCubic(t, b, c, d) { return c * ((t = t / d - 1) * t * t + 1) + b; }, + inOutCubic(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; + return c / 2 * ((t -= 2) * t * t + 2) + b; + }, + inQuart(t, b, c, d) { + return c * (t /= d) * t * t * t + b; + }, + outQuart(t, b, c, d) { + return -c * ((t = t / d - 1) * t * t * t - 1) + b; + }, + inOutQuart(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; + return -c / 2 * ((t -= 2) * t * t * t - 2) + b; + }, + inQuint(t, b, c, d) { + return c * (t /= d) * t * t * t * t + b; + }, + outQuint(t, b, c, d) { + return c * ((t = t / d - 1) * t * t * t * t + 1) + b; + }, + inOutQuint(t, b, c, d) { + if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; + return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; + }, + inSine(t, b, c, d) { + return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; + }, + outSine(t, b, c, d) { + return c * Math.sin(t / d * (Math.PI / 2)) + b; + }, + inOutSine(t, b, c, d) { + return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; + }, + inExpo(t, b, c, d) { + return (t === 0) ? b : c * (2 ** (10 * (t / d - 1))) + b; + }, + outExpo(t, b, c, d) { + return (t === d) ? b + c : c * (-(2 ** (-10 * t / d)) + 1) + b; + }, + inOutExpo(t, b, c, d) { + if (t === 0) return b; + if (t === d) return b + c; + if ((t /= d / 2) < 1) return c / 2 * (2 ** (10 * (t - 1))) + b; + return c / 2 * (-(2 ** (-10 * --t)) + 2) + b; + }, + inCirc(t, b, c, d) { + return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; + }, + outCirc(t, b, c, d) { + return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; + }, + inOutCirc(t, b, c, d) { + if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; + return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; + }, + inElastic(t, b, c, d) { + let s = 1.70158; let p = 0; let a = c; + + if (t === 0) return b; if ((t /= d) === 1) return b + c; if (!p) p = d * 0.3; + if (a < Math.abs(c)) { a = c; s = p / 4; } else s = p / (2 * Math.PI) * Math.asin(c / a); + + return -(a * (2 ** (10 * (t -= 1))) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + }, + outElastic(t, b, c, d) { + let s = 1.70158; let p = 0; let a = c; + + if (t === 0) return b; if ((t /= d) === 1) return b + c; if (!p) p = d * 0.3; + if (a < Math.abs(c)) { a = c; s = p / 4; } else s = p / (2 * Math.PI) * Math.asin(c / a); + + return a * (2 ** (-10 * t)) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; + }, + inOutElastic(t, b, c, d) { + let s = 1.70158; let p = 0; let a = c; + + if (t === 0) return b; if ((t /= d / 2) === 2) return b + c; if (!p) p = d * (0.3 * 1.5); + if (a < Math.abs(c)) { a = c; s = p / 4; } else s = p / (2 * Math.PI) * Math.asin(c / a); + + if (t < 1) return -0.5 * (a * (2 ** (10 * (t -= 1))) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; + return a * (2 ** (-10 * (t -= 1))) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b; + }, + inBack(t, b, c, d, s) { + if (s === undefined) s = 1.70158; + return c * (t /= d) * t * ((s + 1) * t - s) + b; + }, + outBack(t, b, c, d, s) { + if (s === undefined) s = 1.70158; + return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; + }, + inOutBack(t, b, c, d, s) { + if (s === undefined) s = 1.70158; + if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; + return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; + }, + inBounce(t, b, c, d) { + return c - exports.ease.outBounce(d - t, 0, c, d) + b; + }, + outBounce(t, b, c, d) { + if ((t /= d) < (1 / 2.75)) { + return c * (7.5625 * t * t) + b; + } else if (t < (2 / 2.75)) { + return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; + } else if (t < (2.5 / 2.75)) { + return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b; + } + return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; + + }, + inOutBounce(t, b, c, d) { + if (t < d / 2) return exports.ease.inBounce(t * 2, 0, c, d) * 0.5 + b; + return exports.ease.outBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; + }, +}; /* * * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * + * + * Open source under the BSD License. + * * Copyright © 2001 Robert Penner * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, + * + * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * - * Redistributions of source code must retain the above copyright notice, this list of + * + * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * - * Neither the name of the author nor the names of contributors may be used to endorse + * + * Neither the name of the author nor the names of contributors may be used to endorse * or promote products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. * - */ \ No newline at end of file + */ diff --git a/package.json b/package.json index cd0ab4d..7790305 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,36 @@ { - "name": "dmx", - "version": "0.1.1", - "author": "Sebastian Wiedenroth ", - "description": "DMX library and webservice", - "url": "https://github.com/wiedi/node-dmx", - "main": "dmx.js", - "bin": { - "dmx-web": "./dmx-web.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/wiedi/node-dmx.git" - }, - "keywords": [ - "DMX", - "light control" - ], - "dependencies": { - "serialport": "^6.0.4", - "socket.io": "^2.0.4", - "express": "^4.16.2", - "body-parser": "^1.5.2", - "commander": "^2.12.2" - }, - "licenses": [ - { - "name": "MIT", - "url": "http://www.opensource.org/licenses/mit-license.php" - } - ], - "engines": { - "node": ">=5.1.0" - } + "name": "dmx", + "version": "0.2.0", + "author": "Sebastian Wiedenroth ", + "description": "DMX library and webservice", + "url": "https://github.com/wiedi/node-dmx", + "bin": { + "dmx-web": "./dmx.js" + }, + "scripts": { + "test": "node_modules/eslint/bin/eslint.js -c .eslintrc .; exit 0" + }, + "repository": { + "type": "git", + "url": "https://github.com/wiedi/node-dmx.git" + }, + "keywords": [ + "DMX", + "light control" + ], + "dependencies": { + "body-parser": "^1.5.2", + "commander": "^2.12.2", + "express": "^4.16.2", + "serialport": "^6.0.4", + "socket.io": "^2.0.4" + }, + "devDependencies": { + "babel-eslint": "^10.0.1", + "eslint": "^5.0.1" + }, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } }