diff --git a/Wirefile b/Wirefile deleted file mode 100644 index 9f8523d..0000000 --- a/Wirefile +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "Lego Dimensions", - "description": "Node.js and Wirething module for interacting with the Lego Dimensions ToyPad", - "author": "Nathan Kunicki ", - "main": "./index.js", - "devices": [{ - "name": "ToyPad", - "type": "toypad", - "outputs": [{ - "name": "Add", - "event": "add", - "params": [{ - "name": "Decoded Payload", - "param": "payload", - "type": "Object" - }] - },{ - "name": "Remove", - "event": "remove", - "params": [{ - "name": "Decoded Payload", - "param": "payload", - "type": "Object" - }] - }], - "inputs": [] - }] -} \ No newline at end of file diff --git a/data/minifigs.json b/data/minifigs.json index 6800f0e..712299e 100644 --- a/data/minifigs.json +++ b/data/minifigs.json @@ -10,6 +10,8 @@ "87 b8 1a 7f 49 80": "Peter Venkman", "0a 2e aa 5c 49 81": "Kai", "cc cb 22 55 42 80": "Scooby-Doo", - "5f 33 9a 58 49 80": "Green Lantern", - "28 9e 32 83 49 80": "Supergirl" + "5f 33 9a 58 49 80": "Green Arrow", + "28 9e 32 83 49 80": "Supergirl", + "f5 c2 12 9e 4a 80": "Batgirl", + "45 c2 c2 9d 4a 81": "Robin" } \ No newline at end of file diff --git a/examples/minifig.js b/examples/minifig.js new file mode 100644 index 0000000..89e9a5e --- /dev/null +++ b/examples/minifig.js @@ -0,0 +1,41 @@ +const ToyPad = require("../main.js"), + toyPad = new ToyPad(); + + +toyPad.on("connect", () => { + console.log("ToyPad connected"); +}); + + +toyPad.on("error", () => { + console.log("ToyPad connection error"); +}); + + +toyPad.on("add", (data) => { + const name = ToyPad.minifigNameFromSignature(data.sig); + if (name) { + console.log(`Minifig added to panel ${data.panel} (${name})`); + } else { + console.log(`Minifig added to panel ${data.panel} (Unknown signature - ${data.sig})`); + } + if (data.panel == ToyPad.Panel.CENTER) { + toyPad.setColor(data.panel, 0xffff, 0.5); + } +}); + + +toyPad.on("remove", (data) => { + const name = ToyPad.minifigNameFromSignature(data.sig); + if (name) { + console.log(`Minifig removed from panel ${data.panel} (${name})`); + } else { + console.log(`Minifig removed from panel ${data.panel} (Unknown signature - ${data.sig})`); + } + if (data.panel == ToyPad.Panel.CENTER) { + toyPad.setColor(data.panel, 0, 0.9); + } +}); + + +toyPad.connect(); \ No newline at end of file diff --git a/examples/rgb.js b/examples/rgb.js new file mode 100644 index 0000000..3d7ba7a --- /dev/null +++ b/examples/rgb.js @@ -0,0 +1,76 @@ +const ToyPad = require("../main.js"); + toyPad = new ToyPad(); + + +let PanelStates = {}; +PanelStates[ToyPad.Panel.LEFT] = 0; +PanelStates[ToyPad.Panel.RIGHT] = 0; +PanelStates[ToyPad.Panel.CENTER] = 0; + + +toyPad.on("connect", () => { + console.log("ToyPad connected"); +}); + + +toyPad.on("error", () => { + console.log("ToyPad connection error"); +}); + + +toyPad.on("add", (data) => { + + const name = ToyPad.minifigNameFromSignature(data.sig); + + if (name) { + console.log(`Minifig added to panel ${data.panel} (${name})`); + } else { + console.log(`Minifig added to panel ${data.panel} (Unknown signature - ${data.sig})`); + } + + switch (name) { + case "Wyldstyle": + PanelStates[data.panel] = PanelStates[data.panel] | 0xff0000; + break; + case "Batman": + PanelStates[data.panel] = PanelStates[data.panel] | 0x00ff00; + break; + case "Gandalf": + PanelStates[data.panel] = PanelStates[data.panel] | 0x0000ff; + break; + } + + //console.log(PanelStates[data.panel]); + toyPad.setColor(data.panel, PanelStates[data.panel]); + +}); + + +toyPad.on("remove", (data) => { + + const name = ToyPad.minifigNameFromSignature(data.sig); + if (name) { + console.log(`Minifig removed from panel ${data.panel} (${name})`); + } else { + console.log(`Minifig removed from panel ${data.panel} (Unknown signature - ${data.sig})`); + } + + switch (name) { + case "Wyldstyle": + PanelStates[data.panel] = PanelStates[data.panel] ^ 0xff0000; + break; + case "Batman": + PanelStates[data.panel] = PanelStates[data.panel] ^ 0x00ff00; + break; + case "Gandalf": + PanelStates[data.panel] = PanelStates[data.panel] ^ 0x0000ff; + break; + } + + //console.log(PanelStates[data.panel]); + toyPad.setColor(data.panel, PanelStates[data.panel]); + +}); + + +toyPad.connect(); \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index dfd7614..0000000 --- a/index.js +++ /dev/null @@ -1,31 +0,0 @@ -const EventEmitter = require("events").EventEmitter, - debugLog = require("debug")("LegoDimensions"), - fs = require("fs"); - - -const ToyPad = require("./src/toypad.js"); - - -class LegoDimensions extends EventEmitter { - - - constructor (config) { - super(); - } - - - wirethingInit () { - let toyPad = new ToyPad(); - this.emit("discover", toyPad); - } - - - static get wirething () { - return JSON.parse(fs.readFileSync(`${__dirname}/Wirefile`)); - } - - -} - - -module.exports = LegoDimensions; \ No newline at end of file diff --git a/main.js b/main.js index d3844db..4aeb088 100644 --- a/main.js +++ b/main.js @@ -1,28 +1,4 @@ -let ToyPad = require("./src/toypad.js"), - toyPad = new ToyPad(); +const ToyPad = require("./src/toypad.js"); -toyPad.on("connect", () => { - console.log("Toy Pad connected"); -}); -toyPad.on("error", () => { - console.log("Toy Pad connection error"); -}); - -toyPad.on("add", (data) => { - let name = ToyPad.minifigNameFromSignature(data.sig); - console.log(`Minifig added to panel ${data.panel} (${name})`); - if (data.panel == ToyPad.Panel.CENTER) { - toyPad.setColor(data.panel, 0xffff44, 0.5); - } -}); - -toyPad.on("remove", (data) => { - let name = ToyPad.minifigNameFromSignature(data.sig); - console.log(`Minifig removed from panel ${data.panel} (${name})`); - if (data.panel == ToyPad.Panel.CENTER) { - toyPad.setColor(data.panel, 0, 0.9); - } -}); - -toyPad.connect(); \ No newline at end of file +module.exports = ToyPad; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5c1b407 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,411 @@ +{ + "name": "node-legodimensions", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "bindings": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", + "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" + } + }, + "expand-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.0.tgz", + "integrity": "sha512-kkjwkMqj0h4w/sb32ERCDxCQkREMCAgS39DscDnSwDsbxnwwM1BTZySdC3Bn1lhY7vL08n9GoO/fVTynjDgRyQ==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=" + }, + "node-abi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.2.0.tgz", + "integrity": "sha512-FqVC0WNNL8fQWQK3GYTESfwZXZKDbSIiEEIvufq7HV6Lj0IDDZRVa4CU/KTA0JVlqY9eTDSuPiC8FS9UfGVuzA==", + "requires": { + "semver": "5.5.0" + } + }, + "node-hid": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/node-hid/-/node-hid-0.7.2.tgz", + "integrity": "sha512-ZLbw4zH7ogLsHtaH1BFOXiG+iirs2GFEuattKABdql4qZ8PaBdJnXPMB0ul2uPXa7F6X+OXtIShEKA0Mywm9lQ==", + "requires": { + "bindings": "1.3.0", + "nan": "2.8.0", + "prebuild-install": "2.5.0" + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "prebuild-install": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.0.tgz", + "integrity": "sha512-3wlyZgmkeeyduOR8Ursu5gKr3yWAYObACa5aJOtt2farRRFV/+zXk/Y3wM6yQRMqmqHh+pHAwyKp5r82K699Rg==", + "requires": { + "detect-libc": "1.0.3", + "expand-template": "1.1.0", + "github-from-package": "0.0.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.2.0", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "1.0.3", + "rc": "1.2.5", + "simple-get": "1.4.3", + "tar-fs": "1.16.0", + "tunnel-agent": "0.6.0", + "xtend": "4.0.1" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "rc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", + "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-get": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", + "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", + "requires": { + "once": "1.4.0", + "unzip-response": "1.0.2", + "xtend": "4.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar-fs": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.0.tgz", + "integrity": "sha512-I9rb6v7mjWLtOfCau9eH5L7sLJyU2BnxtEZRQ5Mt+eRKmf1F0ohXmT/Jc3fr52kDvjJ/HV5MH3soQfPL5bQ0Yg==", + "requires": { + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.5.5" + } + }, + "tar-stream": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", + "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.1", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/package.json b/package.json index c1ce875..aa7bd97 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-legodimensions", - "version": "1.0.0", - "description": "Lego Dimensions", + "version": "1.0.1", + "description": "Lego Dimensions ToyPad library for Node.js", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" @@ -9,7 +9,7 @@ "author": "Nathan Kunicki ", "license": "MIT", "dependencies": { - "debug": "^2.6.0", - "node-hid": "^0.5.2" + "debug": "^3.1.0", + "node-hid": "^0.7.2" } } diff --git a/src/toypad.js b/src/toypad.js index db6fd5a..6f37e97 100644 --- a/src/toypad.js +++ b/src/toypad.js @@ -1,5 +1,6 @@ const EventEmitter = require("events").EventEmitter, - HID = require("node-hid"); + HID = require("node-hid"), + debug = require("debug")("LegoDimensions"); const minifigData = require("../data/minifigs.json"); @@ -16,6 +17,12 @@ const Action = { }; +const Type = { + RESPONSE: 0x55, + EVENT: 0x56 +} + + const Command = { CONNECTED: 0x19, ACTION: 0x0b @@ -30,15 +37,19 @@ const Panel = { }; +const Request = { + COLOR: 0xc0 +} + + class ToyPad extends EventEmitter { constructor () { super(); - this.uuid = "1"; - this.deviceType = "toypad"; this._device = null; this._requestId = 0; + this._callbacks = {}; } @@ -56,7 +67,7 @@ class ToyPad extends EventEmitter { if (minifigData[sig]) { return minifigData[sig]; } else { - return "Unknown"; + return null; } } @@ -84,7 +95,7 @@ class ToyPad extends EventEmitter { static _pad (data) { - while (data.length < 32) { + while (data.length < 31) { data.push(0x00); } return data; @@ -99,11 +110,12 @@ class ToyPad extends EventEmitter { this._device.on("data", (data) => { - let cmd = data[1]; + let type = data[0], + cmd = data[1]; - if (cmd == Command.CONNECTED) { + if (type === Type.RESPONSE && cmd == Command.CONNECTED) { this.emit("connect"); - } else if (cmd == Command.ACTION) { + } else if (type === Type.EVENT && cmd == Command.ACTION) { let action = data[5], sig = ToyPad._bufferToHexString(data.slice(7, 13)); @@ -120,6 +132,8 @@ class ToyPad extends EventEmitter { this.emit("remove", emitPayload); } + } else if (type === Type.RESPONSE) { + //console.log(data); } }); @@ -137,17 +151,16 @@ class ToyPad extends EventEmitter { } - setColor (panel, color, speed = 1) { + setColor (panel, color) { let data = [ this._requestId & 0xff, - panel, - ((1 - speed) * 0xff) & 0xff, - 0x01, (color >> 16) & 0xff, + panel & 0xff, + (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff ]; this._requestId++; - this._write([0x55, 0x08, 0xc2].concat(data)); + this._write([0x55, (data.length + 1) & 0xff, Request.COLOR].concat(data)); }; @@ -165,7 +178,7 @@ class ToyPad extends EventEmitter { _write (data) { - this._device.write([0x00].concat(ToyPad._pad(ToyPad._checksum(data)))); + this._device.write(ToyPad._pad(ToyPad._checksum(data))); }