Made betterer

This commit is contained in:
Nathan Kunicki 2018-02-05 21:54:45 +00:00
parent 320d8d73b1
commit c4969214e5
9 changed files with 565 additions and 105 deletions

View File

@ -1,28 +0,0 @@
{
"name": "Lego Dimensions",
"description": "Node.js and Wirething module for interacting with the Lego Dimensions ToyPad",
"author": "Nathan Kunicki <me@nathankunicki.com>",
"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": []
}]
}

View File

@ -10,6 +10,8 @@
"87 b8 1a 7f 49 80": "Peter Venkman", "87 b8 1a 7f 49 80": "Peter Venkman",
"0a 2e aa 5c 49 81": "Kai", "0a 2e aa 5c 49 81": "Kai",
"cc cb 22 55 42 80": "Scooby-Doo", "cc cb 22 55 42 80": "Scooby-Doo",
"5f 33 9a 58 49 80": "Green Lantern", "5f 33 9a 58 49 80": "Green Arrow",
"28 9e 32 83 49 80": "Supergirl" "28 9e 32 83 49 80": "Supergirl",
"f5 c2 12 9e 4a 80": "Batgirl",
"45 c2 c2 9d 4a 81": "Robin"
} }

41
examples/minifig.js Normal file
View File

@ -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();

76
examples/rgb.js Normal file
View File

@ -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();

View File

@ -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;

28
main.js
View File

@ -1,28 +1,4 @@
let ToyPad = require("./src/toypad.js"), const ToyPad = require("./src/toypad.js");
toyPad = new ToyPad();
toyPad.on("connect", () => {
console.log("Toy Pad connected");
});
toyPad.on("error", () => { module.exports = ToyPad;
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();

411
package-lock.json generated Normal file
View File

@ -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="
}
}
}

View File

@ -1,7 +1,7 @@
{ {
"name": "node-legodimensions", "name": "node-legodimensions",
"version": "1.0.0", "version": "1.0.1",
"description": "Lego Dimensions", "description": "Lego Dimensions ToyPad library for Node.js",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
@ -9,7 +9,7 @@
"author": "Nathan Kunicki <me@nathankunicki.com>", "author": "Nathan Kunicki <me@nathankunicki.com>",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"debug": "^2.6.0", "debug": "^3.1.0",
"node-hid": "^0.5.2" "node-hid": "^0.7.2"
} }
} }

View File

@ -1,5 +1,6 @@
const EventEmitter = require("events").EventEmitter, const EventEmitter = require("events").EventEmitter,
HID = require("node-hid"); HID = require("node-hid"),
debug = require("debug")("LegoDimensions");
const minifigData = require("../data/minifigs.json"); const minifigData = require("../data/minifigs.json");
@ -16,6 +17,12 @@ const Action = {
}; };
const Type = {
RESPONSE: 0x55,
EVENT: 0x56
}
const Command = { const Command = {
CONNECTED: 0x19, CONNECTED: 0x19,
ACTION: 0x0b ACTION: 0x0b
@ -30,15 +37,19 @@ const Panel = {
}; };
const Request = {
COLOR: 0xc0
}
class ToyPad extends EventEmitter { class ToyPad extends EventEmitter {
constructor () { constructor () {
super(); super();
this.uuid = "1";
this.deviceType = "toypad";
this._device = null; this._device = null;
this._requestId = 0; this._requestId = 0;
this._callbacks = {};
} }
@ -56,7 +67,7 @@ class ToyPad extends EventEmitter {
if (minifigData[sig]) { if (minifigData[sig]) {
return minifigData[sig]; return minifigData[sig];
} else { } else {
return "Unknown"; return null;
} }
} }
@ -84,7 +95,7 @@ class ToyPad extends EventEmitter {
static _pad (data) { static _pad (data) {
while (data.length < 32) { while (data.length < 31) {
data.push(0x00); data.push(0x00);
} }
return data; return data;
@ -99,11 +110,12 @@ class ToyPad extends EventEmitter {
this._device.on("data", (data) => { 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"); this.emit("connect");
} else if (cmd == Command.ACTION) { } else if (type === Type.EVENT && cmd == Command.ACTION) {
let action = data[5], let action = data[5],
sig = ToyPad._bufferToHexString(data.slice(7, 13)); sig = ToyPad._bufferToHexString(data.slice(7, 13));
@ -120,6 +132,8 @@ class ToyPad extends EventEmitter {
this.emit("remove", emitPayload); 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 = [ let data = [
this._requestId & 0xff, this._requestId & 0xff,
panel, panel & 0xff,
((1 - speed) * 0xff) & 0xff, (color >> 16) & 0xff,
0x01, (color >> 16) & 0xff,
(color >> 8) & 0xff, (color >> 8) & 0xff,
color & 0xff color & 0xff
]; ];
this._requestId++; 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) { _write (data) {
this._device.write([0x00].concat(ToyPad._pad(ToyPad._checksum(data)))); this._device.write(ToyPad._pad(ToyPad._checksum(data)));
} }