diff --git a/README.md b/README.md index 493bf9157..d6246b29b 100644 --- a/README.md +++ b/README.md @@ -285,10 +285,12 @@ To interactively navigate the examples, visit the [Johnny-Five examples](http:// ### Keypad - [Keypad - VKEY](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-analog-vkey.md) - [Keypad - Waveshare AD](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-analog-ad.md) -- [Keypad - MPR121](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121.md) -- [Keypad - MPR121, Sensitivity](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121-sensitivity.md) -- [Keypad - MPR121QR2](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121QR2.md) -- [Keypad - Grove QTouch](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-QTOUCH.md) +- [Touchpad - MPR121](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121.md) +- [Touchpad - MPR121_SHIELD](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121_SHIELD.md) +- [Touchpad - MPR121_KEYPAD](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121_KEYPAD.md) +- [Touchpad - MPR121, Sensitivity](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121-sensitivity.md) +- [Touchpad - MPR121QR2_SHIELD](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-MPR121QR2_SHIELD.md) +- [Touchpad - Grove QTouch](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-QTOUCH.md) - [Keypad - 3x4 I2C Nano Backpack](https://github.com/rwaldron/johnny-five/blob/master/docs/keypad-3X4_I2C_NANO_BACKPACK.md) ### Relay diff --git a/docs/breadboard/keypad-MPR121.fzz b/docs/breadboard/keypad-MPR121.fzz new file mode 100644 index 000000000..b7109652e Binary files /dev/null and b/docs/breadboard/keypad-MPR121.fzz differ diff --git a/docs/breadboard/keypad-MPR121.png b/docs/breadboard/keypad-MPR121.png index 55a932a7c..ca7cdab73 100644 Binary files a/docs/breadboard/keypad-MPR121.png and b/docs/breadboard/keypad-MPR121.png differ diff --git a/docs/breadboard/keypad-MPR121QR2_SHIELD.fzz b/docs/breadboard/keypad-MPR121QR2_SHIELD.fzz new file mode 100644 index 000000000..e3e406551 Binary files /dev/null and b/docs/breadboard/keypad-MPR121QR2_SHIELD.fzz differ diff --git a/docs/breadboard/keypad-MPR121QR2_SHIELD.png b/docs/breadboard/keypad-MPR121QR2_SHIELD.png new file mode 100644 index 000000000..d8a879779 Binary files /dev/null and b/docs/breadboard/keypad-MPR121QR2_SHIELD.png differ diff --git a/docs/breadboard/keypad-MPR121_KEYPAD.png b/docs/breadboard/keypad-MPR121_KEYPAD.png new file mode 100644 index 000000000..55a932a7c Binary files /dev/null and b/docs/breadboard/keypad-MPR121_KEYPAD.png differ diff --git a/docs/breadboard/keypad-MPR121_SHIELD.png b/docs/breadboard/keypad-MPR121_SHIELD.png new file mode 100644 index 000000000..0416a4e28 Binary files /dev/null and b/docs/breadboard/keypad-MPR121_SHIELD.png differ diff --git a/docs/images/mpr121_shield.jpg b/docs/images/mpr121_shield.jpg index 8fb2d5ba0..79a0d14c7 100644 Binary files a/docs/images/mpr121_shield.jpg and b/docs/images/mpr121_shield.jpg differ diff --git a/docs/keypad-3X4_I2C_NANO_BACKPACK.md b/docs/keypad-3X4_I2C_NANO_BACKPACK.md index 7503fed53..1581a90b1 100644 --- a/docs/keypad-3X4_I2C_NANO_BACKPACK.md +++ b/docs/keypad-3X4_I2C_NANO_BACKPACK.md @@ -67,8 +67,8 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + keypad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/docs/keypad-MPR121-sensitivity.md b/docs/keypad-MPR121-sensitivity.md index f1306328d..8ddaee777 100644 --- a/docs/keypad-MPR121-sensitivity.md +++ b/docs/keypad-MPR121-sensitivity.md @@ -1,6 +1,6 @@ -# Keypad - MPR121, Sensitivity +# Touchpad - MPR121, Sensitivity @@ -13,7 +13,7 @@ -![docs/breadboard/keypad-MPR121.png](breadboard/keypad-MPR121.png)
+![docs/breadboard/keypad-MPR121_SHIELD.png](breadboard/keypad-MPR121_SHIELD.png)
  @@ -35,10 +35,10 @@ board.on("ready", function() { // MPR121 3x4 Capacitive Touch Pad // Demonstrates increasing the sensitivity // deviation for touch and release. - var keypad; + var touchpad; if (argv.show === 1) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "MPR121", sensitivity: { press: 0.10, @@ -48,7 +48,7 @@ board.on("ready", function() { } if (argv.show === 2) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "MPR121", sensitivity: { press: 0.10, @@ -64,7 +64,7 @@ board.on("ready", function() { } if (argv.show === 3) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "MPR121", sensitivity: { press: 0.10, @@ -75,7 +75,7 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { + touchpad.on(eventType, function(data) { console.log("Event: %s, Target: %s", eventType, data.which); }); }); diff --git a/docs/keypad-MPR121.md b/docs/keypad-MPR121.md index feecca3dc..14d0ec48e 100644 --- a/docs/keypad-MPR121.md +++ b/docs/keypad-MPR121.md @@ -1,6 +1,6 @@ -# Keypad - MPR121 +# Touchpad - MPR121 @@ -9,12 +9,14 @@ -##### Breadboard for "Keypad - MPR121" +##### Breadboard for "Touchpad - MPR121" ![docs/breadboard/keypad-MPR121.png](breadboard/keypad-MPR121.png)
+Fritzing diagram: [docs/breadboard/keypad-MPR121.fzz](breadboard/keypad-MPR121.fzz) +   @@ -27,42 +29,17 @@ node eg/keypad-MPR121.js ```javascript -var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); var five = require("johnny-five"); var board = new five.Board(); board.on("ready", function() { - // MPR121 3x4 Capacitive Touch Pad - var keypad; - - if (argv.show === 1) { - keypad = new five.Keypad({ - controller: "MPR121" - }); - } - - if (argv.show === 2) { - keypad = new five.Keypad({ - controller: "MPR121", - keys: [ - ["!", "@", "#"], - ["$", "%", "^"], - ["&", "-", "+"], - ["_", "=", ":"] - ] - }); - } - - if (argv.show === 3) { - keypad = new five.Keypad({ - controller: "MPR121", - keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"] - }); - } + var touchpad = new five.Touchpad({ + controller: "MPR121", + }); ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/docs/keypad-MPR121QR2_SHIELD.md b/docs/keypad-MPR121QR2_SHIELD.md new file mode 100644 index 000000000..367c70e28 --- /dev/null +++ b/docs/keypad-MPR121QR2_SHIELD.md @@ -0,0 +1,90 @@ + + +# Touchpad - MPR121QR2_SHIELD + + + + + + + + +##### Breadboard for "Touchpad - MPR121QR2_SHIELD" + + + +![docs/breadboard/keypad-MPR121QR2_SHIELD.png](breadboard/keypad-MPR121QR2_SHIELD.png)
+ +Fritzing diagram: [docs/breadboard/keypad-MPR121QR2_SHIELD.fzz](breadboard/keypad-MPR121QR2_SHIELD.fzz) + +  + + + + +Run this example from the command line with: +```bash +node eg/keypad-MPR121QR2_SHIELD.js +``` + + +```javascript +var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + // MPR121QR2 3x3 Capacitive Touch Shield + var touchpad; + + if (argv.show === 1) { + touchpad = new five.Touchpad({ + controller: "MPR121QR2_SHIELD" + }); + } + + if (argv.show === 2) { + touchpad = new five.Touchpad({ + controller: "MPR121QR2_SHIELD", + keys: [ + ["!", "@", "#"], + ["$", "%", "^"], + ["&", "-", "+"], + ] + }); + } + + if (argv.show === 3) { + touchpad = new five.Touchpad({ + controller: "MPR121QR2_SHIELD", + keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+"] + }); + } + + ["change", "press", "hold", "release"].forEach(function(eventType) { + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); + }); + }); +}); + +``` + + + + + + + + +  + + + +## License +Copyright (c) 2012, 2013, 2014 Rick Waldron +Licensed under the MIT license. +Copyright (c) 2016 The Johnny-Five Contributors +Licensed under the MIT license. + + diff --git a/docs/keypad-MPR121_KEYPAD.md b/docs/keypad-MPR121_KEYPAD.md new file mode 100644 index 000000000..632e9d125 --- /dev/null +++ b/docs/keypad-MPR121_KEYPAD.md @@ -0,0 +1,88 @@ + + +# Touchpad - MPR121_KEYPAD + + + + + + + + +##### Breadboard for "Touchpad - MPR121_KEYPAD" + + + +![docs/breadboard/keypad-MPR121_KEYPAD.png](breadboard/keypad-MPR121_KEYPAD.png)
+ +  + + + + +Run this example from the command line with: +```bash +node eg/keypad-MPR121_KEYPAD.js +``` + + +```javascript +var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var touchpad; + + if (argv.show === 1) { + touchpad = new five.Touchpad({ + controller: "MPR121_KEYPAD" + }); + } + + if (argv.show === 2) { + touchpad = new five.Touchpad({ + controller: "MPR121_KEYPAD", + keys: [ + ["!", "@", "#"], + ["$", "%", "^"], + ["&", "-", "+"], + ["_", "=", ":"] + ] + }); + } + + if (argv.show === 3) { + touchpad = new five.Touchpad({ + controller: "MPR121_KEYPAD", + keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"] + }); + } + + ["change", "press", "hold", "release"].forEach(function(eventType) { + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); + }); + }); +}); + +``` + + + + + + + + +  + + + +## License +Copyright (c) 2012, 2013, 2014 Rick Waldron +Licensed under the MIT license. +Copyright (c) 2016 The Johnny-Five Contributors +Licensed under the MIT license. + + diff --git a/docs/keypad-MPR121_SHIELD.md b/docs/keypad-MPR121_SHIELD.md new file mode 100644 index 000000000..c42442348 --- /dev/null +++ b/docs/keypad-MPR121_SHIELD.md @@ -0,0 +1,89 @@ + + +# Touchpad - MPR121_SHIELD + + + + + + + + +##### Breadboard for "Touchpad - MPR121_SHIELD" + + + +![docs/breadboard/keypad-MPR121_SHIELD.png](breadboard/keypad-MPR121_SHIELD.png)
+ +  + + + + +Run this example from the command line with: +```bash +node eg/keypad-MPR121_SHIELD.js +``` + + +```javascript +var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); +var five = require("johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + // MPR121 3x4 Capacitive Touch Shield + var touchpad; + + if (argv.show === 1) { + touchpad = new five.Touchpad({ + controller: "MPR121_SHIELD" + }); + } + + if (argv.show === 2) { + touchpad = new five.Touchpad({ + controller: "MPR121_SHIELD", + keys: [ + ["!", "@", "#"], + ["$", "%", "^"], + ["&", "-", "+"], + ["_", "=", ":"] + ] + }); + } + + if (argv.show === 3) { + touchpad = new five.Touchpad({ + controller: "MPR121_SHIELD", + keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"] + }); + } + + ["change", "press", "hold", "release"].forEach(function(eventType) { + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); + }); + }); +}); + +``` + + + + + + + + +  + + + +## License +Copyright (c) 2012, 2013, 2014 Rick Waldron +Licensed under the MIT license. +Copyright (c) 2016 The Johnny-Five Contributors +Licensed under the MIT license. + + diff --git a/docs/keypad-QTOUCH.md b/docs/keypad-QTOUCH.md index 830771916..82d4b0aeb 100644 --- a/docs/keypad-QTOUCH.md +++ b/docs/keypad-QTOUCH.md @@ -1,6 +1,6 @@ -# Keypad - Grove QTouch +# Touchpad - Grove QTouch @@ -25,16 +25,16 @@ var board = new five.Board(); board.on("ready", function() { // AT42QT1070 Capacitive Touch Shield // Same as QTOUCH - var keypad; + var touchpad; if (argv.show === 1) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "QTOUCH", // or "AT42QT1070" }); } if (argv.show === 2) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "QTOUCH", // or "AT42QT1070", keys: [ ["1", "2", "3"] @@ -43,15 +43,15 @@ board.on("ready", function() { } if (argv.show === 3) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "QTOUCH", // or "AT42QT1070", keys: ["1", "2", "3"] }); } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/docs/keypad-analog-ad.md b/docs/keypad-analog-ad.md index 4b586378e..2db8cd3a7 100644 --- a/docs/keypad-analog-ad.md +++ b/docs/keypad-analog-ad.md @@ -62,8 +62,8 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + keypad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/docs/keypad-analog-vkey.md b/docs/keypad-analog-vkey.md index 35255e819..b3298e803 100644 --- a/docs/keypad-analog-vkey.md +++ b/docs/keypad-analog-vkey.md @@ -64,8 +64,8 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + keypad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-3X4_I2C_NANO_BACKPACK.js b/eg/keypad-3X4_I2C_NANO_BACKPACK.js index d8ced0968..92380f960 100644 --- a/eg/keypad-3X4_I2C_NANO_BACKPACK.js +++ b/eg/keypad-3X4_I2C_NANO_BACKPACK.js @@ -36,8 +36,8 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + keypad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-AT42QT1070.js b/eg/keypad-AT42QT1070.js index 1e40bab59..8a0f09838 100644 --- a/eg/keypad-AT42QT1070.js +++ b/eg/keypad-AT42QT1070.js @@ -5,16 +5,16 @@ var board = new five.Board(); board.on("ready", function() { // AT42QT1070 Capacitive Touch Shield // Same as QTOUCH - var keypad; + var touchpad; if (argv.show === 1) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "AT42QT1070" }); } if (argv.show === 2) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "AT42QT1070", keys: [ ["!", "@", "#"], @@ -25,15 +25,15 @@ board.on("ready", function() { } if (argv.show === 3) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "AT42QT1070", keys: ["!", "@", "#", "$", "%", "^", "&"] }); } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-MPR121-sensitivity.js b/eg/keypad-MPR121-sensitivity.js index 1cd87f7b5..50a4712e1 100644 --- a/eg/keypad-MPR121-sensitivity.js +++ b/eg/keypad-MPR121-sensitivity.js @@ -6,10 +6,10 @@ board.on("ready", function() { // MPR121 3x4 Capacitive Touch Pad // Demonstrates increasing the sensitivity // deviation for touch and release. - var keypad; + var touchpad; if (argv.show === 1) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "MPR121", sensitivity: { press: 0.10, @@ -19,7 +19,7 @@ board.on("ready", function() { } if (argv.show === 2) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "MPR121", sensitivity: { press: 0.10, @@ -35,7 +35,7 @@ board.on("ready", function() { } if (argv.show === 3) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "MPR121", sensitivity: { press: 0.10, @@ -46,7 +46,7 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { + touchpad.on(eventType, function(data) { console.log("Event: %s, Target: %s", eventType, data.which); }); }); diff --git a/eg/keypad-MPR121.js b/eg/keypad-MPR121.js index 14a2e7319..f7f391acc 100644 --- a/eg/keypad-MPR121.js +++ b/eg/keypad-MPR121.js @@ -1,39 +1,14 @@ -var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); var five = require("../lib/johnny-five"); var board = new five.Board(); board.on("ready", function() { - // MPR121 3x4 Capacitive Touch Pad - var keypad; - - if (argv.show === 1) { - keypad = new five.Keypad({ - controller: "MPR121" - }); - } - - if (argv.show === 2) { - keypad = new five.Keypad({ - controller: "MPR121", - keys: [ - ["!", "@", "#"], - ["$", "%", "^"], - ["&", "-", "+"], - ["_", "=", ":"] - ] - }); - } - - if (argv.show === 3) { - keypad = new five.Keypad({ - controller: "MPR121", - keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"] - }); - } + var touchpad = new five.Touchpad({ + controller: "MPR121" + }); ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-MPR121QR2.js b/eg/keypad-MPR121QR2_SHIELD.js similarity index 62% rename from eg/keypad-MPR121QR2.js rename to eg/keypad-MPR121QR2_SHIELD.js index 87e46d507..936f5dd3a 100644 --- a/eg/keypad-MPR121QR2.js +++ b/eg/keypad-MPR121QR2_SHIELD.js @@ -4,17 +4,17 @@ var board = new five.Board(); board.on("ready", function() { // MPR121QR2 3x3 Capacitive Touch Shield - var keypad; + var touchpad; if (argv.show === 1) { - keypad = new five.Keypad({ - controller: "MPR121QR2" + touchpad = new five.Touchpad({ + controller: "MPR121QR2_SHIELD" }); } if (argv.show === 2) { - keypad = new five.Keypad({ - controller: "MPR121QR2", + touchpad = new five.Touchpad({ + controller: "MPR121QR2_SHIELD", keys: [ ["!", "@", "#"], ["$", "%", "^"], @@ -24,15 +24,15 @@ board.on("ready", function() { } if (argv.show === 3) { - keypad = new five.Keypad({ - controller: "MPR121QR2", + touchpad = new five.Touchpad({ + controller: "MPR121QR2_SHIELD", keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+"] }); } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-MPR121_KEYPAD.js b/eg/keypad-MPR121_KEYPAD.js new file mode 100644 index 000000000..dd97f1d77 --- /dev/null +++ b/eg/keypad-MPR121_KEYPAD.js @@ -0,0 +1,38 @@ +var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); +var five = require("../lib/johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + var touchpad; + + if (argv.show === 1) { + touchpad = new five.Touchpad({ + controller: "MPR121_KEYPAD" + }); + } + + if (argv.show === 2) { + touchpad = new five.Touchpad({ + controller: "MPR121_KEYPAD", + keys: [ + ["!", "@", "#"], + ["$", "%", "^"], + ["&", "-", "+"], + ["_", "=", ":"] + ] + }); + } + + if (argv.show === 3) { + touchpad = new five.Touchpad({ + controller: "MPR121_KEYPAD", + keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"] + }); + } + + ["change", "press", "hold", "release"].forEach(function(eventType) { + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); + }); + }); +}); diff --git a/eg/keypad-MPR121_SHIELD.js b/eg/keypad-MPR121_SHIELD.js new file mode 100644 index 000000000..c2238be41 --- /dev/null +++ b/eg/keypad-MPR121_SHIELD.js @@ -0,0 +1,39 @@ +var argv = require("minimist")(process.argv.slice(2), { default: { show: 1 } }); +var five = require("../lib/johnny-five"); +var board = new five.Board(); + +board.on("ready", function() { + // MPR121 3x4 Capacitive Touch Shield + var touchpad; + + if (argv.show === 1) { + touchpad = new five.Touchpad({ + controller: "MPR121_SHIELD" + }); + } + + if (argv.show === 2) { + touchpad = new five.Touchpad({ + controller: "MPR121_SHIELD", + keys: [ + ["!", "@", "#"], + ["$", "%", "^"], + ["&", "-", "+"], + ["_", "=", ":"] + ] + }); + } + + if (argv.show === 3) { + touchpad = new five.Touchpad({ + controller: "MPR121_SHIELD", + keys: ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"] + }); + } + + ["change", "press", "hold", "release"].forEach(function(eventType) { + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); + }); + }); +}); diff --git a/eg/keypad-QTOUCH.js b/eg/keypad-QTOUCH.js index 9c8b94853..aaa5d1ef7 100644 --- a/eg/keypad-QTOUCH.js +++ b/eg/keypad-QTOUCH.js @@ -5,16 +5,16 @@ var board = new five.Board(); board.on("ready", function() { // AT42QT1070 Capacitive Touch Shield // Same as QTOUCH - var keypad; + var touchpad; if (argv.show === 1) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "QTOUCH", // or "AT42QT1070" }); } if (argv.show === 2) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "QTOUCH", // or "AT42QT1070", keys: [ ["1", "2", "3"] @@ -23,15 +23,15 @@ board.on("ready", function() { } if (argv.show === 3) { - keypad = new five.Keypad({ + touchpad = new five.Touchpad({ controller: "QTOUCH", // or "AT42QT1070", keys: ["1", "2", "3"] }); } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + touchpad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-analog-ad.js b/eg/keypad-analog-ad.js index 991d62ea0..ba90b9018 100644 --- a/eg/keypad-analog-ad.js +++ b/eg/keypad-analog-ad.js @@ -33,8 +33,8 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + keypad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/eg/keypad-analog-vkey.js b/eg/keypad-analog-vkey.js index 18d079d40..122917834 100644 --- a/eg/keypad-analog-vkey.js +++ b/eg/keypad-analog-vkey.js @@ -35,8 +35,8 @@ board.on("ready", function() { } ["change", "press", "hold", "release"].forEach(function(eventType) { - keypad.on(eventType, function(data) { - console.log("Event: %s, Target: %s", eventType, data.which); + keypad.on(eventType, function(event) { + console.log("Event: %s, Target: %s", eventType, event.which); }); }); }); diff --git a/firmwares/keypad_3x4_i2c_nano_backpack.ino b/firmwares/keypad_3x4_i2c_nano_backpack.ino index 8968c3a9d..0a089b084 100644 --- a/firmwares/keypad_3x4_i2c_nano_backpack.ino +++ b/firmwares/keypad_3x4_i2c_nano_backpack.ino @@ -49,20 +49,24 @@ void setup() { void loop() { int state = read(); - int index = toIndex(state); + // int index = toIndex(state); - if (state == 0) { - index = 0xFF; - } + // if (state == 0) { + // index = 0xFF; + // } - #if DEBUG_MODE - if (index != 0xff) { - Serial.println(index); - } - #endif + // #if DEBUG_MODE + // if (index != 0xff) { + // Serial.println(index); + // } + // #endif + + // buffer[0] = index >> 8; + // buffer[1] = index & 0xFF; + + buffer[0] = state >> 8; + buffer[1] = state & 0xFF; - buffer[0] = index >> 8; - buffer[1] = index & 0xFF; delay(10); } diff --git a/lib/definitions/mpr121.js b/lib/definitions/mpr121.js index 01caca00a..55b16861e 100644 --- a/lib/definitions/mpr121.js +++ b/lib/definitions/mpr121.js @@ -1,7 +1,7 @@ // MPR121* Register Defines module.exports = { MAPS: { - MPR121QR2: { + MPR121QR2_SHIELD: { KEYS: { 0: 1, 1: 2, @@ -26,6 +26,36 @@ module.exports = { } }, MPR121: { + KEYS: { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + 10: 10, + 11: 11, + }, + TARGETS: { + 1: 0, + 2: 1, + 4: 2, + 8: 3, + 16: 4, + 32: 5, + 64: 6, + 128: 7, + 256: 8, + 512: 9, + 1024: 10, + 2048: 11, + } + }, + MPR121_KEYPAD: { KEYS: { 0: 1, 1: 2, @@ -53,7 +83,37 @@ module.exports = { 1: 9, 16: 10, 256: 11, - } + }, + }, + MPR121_SHIELD: { + KEYS: { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + 10: 10, + 11: 11, + }, + TARGETS: { + 1: 0, + 2: 1, + 4: 2, + 8: 3, + 16: 4, + 32: 5, + 64: 6, + 128: 7, + 256: 8, + 512: 9, + 1024: 10, + 2048: 11, + }, }, }, MPR121_DEFAULT_ADDRESS: 0x5A, diff --git a/lib/keypad.js b/lib/keypad.js index 6ecc7b839..f2f8ce92f 100644 --- a/lib/keypad.js +++ b/lib/keypad.js @@ -13,13 +13,13 @@ var aliases = { hold: ["hold"] }; -var trigger = function(key, value) { - var event = { which: value, timestamp: Date.now() }; - aliases[key].forEach(function(type) { +var trigger = function(type, value) { + var event = { type: type, which: value, timestamp: Date.now() }; + aliases[type].forEach(function(type) { this.emit(type, event); }, this); - this.emit("change", Object.assign({}, event, { type: key })); + this.emit("change", Object.assign({}, event)); }; @@ -45,7 +45,10 @@ function flatKeys(opts) { // // var Controllers = { - MPR121QR2: { + MPR121: { + ADDRESSES: { + value: [0x5A, 0x5B, 0x5C, 0x5D] + }, REGISTER: { value: require("./definitions/mpr121.js") }, @@ -53,7 +56,7 @@ var Controllers = { value: function(opts, dataHandler) { var state = priv.get(this); - var address = opts.address || 0x5A; + var address = opts.address || this.ADDRESSES[0]; var keys = flatKeys(opts); var keyMap = this.REGISTER.MAPS[opts.controller].KEYS; var targets = this.REGISTER.MAPS[opts.controller].TARGETS; @@ -106,6 +109,12 @@ var Controllers = { // https://github.com/adafruit/Adafruit_MPR121/blob/master/Adafruit_MPR121.cpp#L43 }; + // If keys were specified for a MPR121_SHIELD (adafruit shield), + // then reverse the keys to align with the output of the. + if (opts.keys && opts.controller === "MPR121_SHIELD") { + keys = keys.reverse(); + } + if (opts.sensitivity) { if (Array.isArray(opts.sensitivity)) { // Initialized as: @@ -185,6 +194,7 @@ var Controllers = { state.keys = keys; state.mapping = mapping; state.targets = targets; + state.isMultitouch = true; this.io.i2cRead(address, 0x00, 2, function(bytes) { dataHandler(uint16(bytes[1], bytes[0])); @@ -197,13 +207,18 @@ var Controllers = { return state.keys[index]; } }, - toIndex: { + toIndices: { value: function(raw) { var state = priv.get(this); - // console.log("raw", raw, state.targets[raw]); - return state.targets[raw]; + var indices = []; + for (var i = 0; i < 12; i++) { + if (raw & (1 << i)) { + indices.push(state.targets[raw & (1 << i)]); + } + } + return indices; } - } + }, }, // https://learn.sparkfun.com/tutorials/vkey-voltage-keypad-hookup-guide @@ -227,6 +242,7 @@ var Controllers = { state.touches = touches(length); state.mapping = mapping; state.keys = keys; + state.isMultitouch = false; this.io.pinMode(this.pin, this.io.MODES.ANALOG); this.io.analogRead(this.pin, function(adc) { @@ -240,17 +256,17 @@ var Controllers = { return state.keys[index]; } }, - toIndex: { + toIndices: { value: function(raw) { var state = priv.get(this); var scale = state.scale; var length = state.length; if (raw < scale.bottom || raw > scale.top) { - return null; + return []; } - return (length - ((raw - scale.bottom) / scale.step)) | 0; + return [ (length - ((raw - scale.bottom) / scale.step)) | 0 ]; } } }, @@ -301,6 +317,7 @@ var Controllers = { state.touches = touches(length); state.mapping = mapping; state.keys = keys; + state.isMultitouch = true; this.io.pinMode(this.pin, this.io.MODES.ANALOG); this.io.analogRead(this.pin, function(adc) { @@ -314,7 +331,7 @@ var Controllers = { return state.keys[index]; } }, - toIndex: { + toIndices: { value: function(raw) { var state = priv.get(this); var ranges = state.ranges; @@ -327,10 +344,10 @@ var Controllers = { } if (index < 0) { - return null; + return []; } - return index; + return [index]; } } }, @@ -361,6 +378,7 @@ var Controllers = { state.touches = touches(length); state.mapping = mapping; state.keys = keys; + state.isMultitouch = true; this.io.i2cConfig(opts); this.io.i2cRead(address, this.REGISTER.READ, 1, function(data) { @@ -374,13 +392,15 @@ var Controllers = { return state.keys[index]; } }, - toIndex: { + toIndices: { value: function(raw) { + var indices = []; for (var i = 0; i < 7; i++) { if (raw & (1 << i)) { - return i; + indices.push(i); } } + return indices; } } }, @@ -407,6 +427,7 @@ var Controllers = { state.touches = touches(length); state.mapping = mapping; state.keys = keys; + state.isMultitouch = true; opts.address = address; @@ -422,9 +443,16 @@ var Controllers = { return state.keys[index]; } }, - toIndex: { + toIndices: { value: function(raw) { - return raw; + var state = priv.get(this); + var indices = []; + for (var i = 0; i < state.length; i++) { + if (raw & (1 << i)) { + indices.push(i); + } + } + return indices; } } }, @@ -432,12 +460,18 @@ var Controllers = { // Otherwise known as... -Controllers.MPR121 = Controllers.MPR121QR2; +Controllers.MPR121QR2 = Controllers.MPR121; +Controllers.MPR121QR2_SHIELD = Controllers.MPR121; +Controllers.MPR121_KEYPAD = Controllers.MPR121; +Controllers.MPR121_SHIELD = Controllers.MPR121; Controllers.QTOUCH = Controllers.AT42QT1070; function touches(length) { return Array.from({ length: length }, function() { - return 0; + return { + timeout: null, + value: 0, + }; }); } @@ -463,8 +497,6 @@ function Keypad(opts) { holdtime: null, }; - - if (opts.controller && typeof opts.controller === "string") { controller = Controllers[opts.controller.toUpperCase()]; } else { @@ -483,43 +515,70 @@ function Keypad(opts) { if (typeof this.initialize === "function") { this.initialize(opts, function(data) { - var target = this.toIndex(data); - var length = state.length; - var alias = null; raw = data; - for (var i = 0; i < length; i++) { - alias = this.toAlias(i); + var now = Date.now(); + var indices = this.toIndices(data); + var iLength = indices.length; + var kLength = state.length; + var aliases = indices.map(function(index) { + return this.toAlias(index); + }, this); + + var lists = { + down: [], + hold: [], + up: [], + }; + + var target = null; + var alias = null; + + for (var k = 0; k < kLength; k++) { + alias = this.toAlias(k); - if (target === i) { - if (state.touches[i] === 0) { + if (indices.includes(k)) { + if (state.touches[k].value === 0) { - state.timeout = Date.now() + state.holdtime; - trigger.call(this, "down", alias); + state.touches[k].timeout = now + state.holdtime; + lists.down.push(alias); - } else if (state.touches[i] === 1) { - if (state.timeout !== null && Date.now() > state.timeout) { - state.timeout = Date.now() + state.holdtime; - trigger.call(this, "hold", alias); + } else if (state.touches[k].value === 1) { + if (state.touches[k].timeout !== null && now > state.touches[k].timeout) { + state.touches[k].timeout = now + state.holdtime; + lists.hold.push(alias); } } - state.touches[i] = 1; + state.touches[k].value = 1; } else { - if (state.touches[i] === 1) { - state.timeout = null; - trigger.call(this, "up", alias); + if (state.touches[k].value === 1) { + state.touches[k].timeout = null; + lists.up.push(alias); } - - state.touches[i] = 0; + state.touches[k].value = 0; } + target = null; alias = null; } + + Object.keys(lists).forEach(function(key) { + var list = lists[key]; + + if (list.length) { + trigger.call(this, key, list); + } + }, this); }.bind(this)); } Object.defineProperties(this, { + isMultitouch: { + get: function() { + return state.isMultitouch; + } + }, value: { get: function() { return raw; @@ -527,7 +586,7 @@ function Keypad(opts) { }, target: { get: function() { - return state.keys[this.toIndex(this.value)]; + return state.keys[this.toIndices(this.value)]; } } }); diff --git a/test/keypad.js b/test/keypad.js index 07a4e5d4f..a63c10a77 100644 --- a/test/keypad.js +++ b/test/keypad.js @@ -107,7 +107,7 @@ exports["Keypad: Analog"] = { callback(960); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -150,7 +150,7 @@ exports["Keypad: Analog"] = { callback(960); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -188,7 +188,7 @@ exports["Keypad: Analog"] = { callback(960); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -318,7 +318,7 @@ exports["Keypad: VKey"] = { callback(38); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -358,7 +358,7 @@ exports["Keypad: VKey"] = { callback(38); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -393,7 +393,7 @@ exports["Keypad: VKey"] = { callback(38); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -464,7 +464,7 @@ exports["Keypad: VKey"] = { } }; -exports["Keypad: MPR121QR2"] = { +exports["Keypad: MPR121"] = { setUp: function(done) { this.board = newBoard(); this.clock = sinon.useFakeTimers(); @@ -473,7 +473,7 @@ exports["Keypad: MPR121QR2"] = { this.i2cRead = sinon.spy(MockFirmata.prototype, "i2cRead"); this.keypad = new Keypad({ - controller: "MPR121QR2", + controller: "MPR121", address: 0x5A, board: this.board }); @@ -493,7 +493,7 @@ exports["Keypad: MPR121QR2"] = { this.i2cConfig.reset(); new Keypad({ - controller: "MPR121QR2", + controller: "MPR121", address: 0xff, bus: "i2c-1", board: this.board @@ -533,11 +533,11 @@ exports["Keypad: MPR121QR2"] = { test.expect(9); var keys = Array.from({ length: 9 }, function(_, index) { - return index + 1; + return index; }); var keypad = new five.Keypad({ board: this.board, - controller: "MPR121QR2", + controller: "MPR121", address: 0x5A }); var callback = this.i2cRead.getCall(1).args[3]; @@ -545,18 +545,21 @@ exports["Keypad: MPR121QR2"] = { keypad.on("down", spy); - callback([ 0, 1 ]); - callback([ 32, 0 ]); + callback([ 1, 0 ]); + callback([ 2, 0 ]); callback([ 4, 0 ]); - callback([ 128, 0 ]); + callback([ 8, 0 ]); callback([ 16, 0 ]); - callback([ 2, 0 ]); + callback([ 32, 0 ]); callback([ 64, 0 ]); - callback([ 8, 0 ]); - callback([ 1, 0 ]); + callback([ 128, 0 ]); + callback([ 256, 0 ]); + callback([ 512, 0 ]); + callback([ 1024, 0 ]); + callback([ 2048, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -568,7 +571,7 @@ exports["Keypad: MPR121QR2"] = { var keys = ["!", "@", "#", "$", "%", "^", "&", "-", "+"]; var keypad = new five.Keypad({ board: this.board, - controller: "MPR121QR2", + controller: "MPR121", address: 0x5A, keys: [ ["!", "@", "#"], @@ -581,18 +584,31 @@ exports["Keypad: MPR121QR2"] = { keypad.on("down", spy); - callback([ 0, 1 ]); - callback([ 32, 0 ]); + // callback([ 0, 1 ]); + // callback([ 32, 0 ]); + // callback([ 4, 0 ]); + // callback([ 128, 0 ]); + // callback([ 16, 0 ]); + // callback([ 2, 0 ]); + // callback([ 64, 0 ]); + // callback([ 8, 0 ]); + // callback([ 1, 0 ]); + + callback([ 1, 0 ]); + callback([ 2, 0 ]); callback([ 4, 0 ]); - callback([ 128, 0 ]); + callback([ 8, 0 ]); callback([ 16, 0 ]); - callback([ 2, 0 ]); + callback([ 32, 0 ]); callback([ 64, 0 ]); - callback([ 8, 0 ]); - callback([ 1, 0 ]); + callback([ 128, 0 ]); + callback([ 256, 0 ]); + callback([ 512, 0 ]); + callback([ 1024, 0 ]); + callback([ 2048, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -604,7 +620,7 @@ exports["Keypad: MPR121QR2"] = { var keys = ["!", "@", "#", "$", "%", "^", "&", "-", "+"]; var keypad = new five.Keypad({ board: this.board, - controller: "MPR121QR2", + controller: "MPR121", address: 0x5A, keys: keys }); @@ -613,19 +629,31 @@ exports["Keypad: MPR121QR2"] = { keypad.on("down", spy); - callback([ 0, 1 ]); - callback([ 32, 0 ]); + // callback([ 0, 1 ]); + // callback([ 32, 0 ]); + // callback([ 4, 0 ]); + // callback([ 128, 0 ]); + // callback([ 16, 0 ]); + // callback([ 2, 0 ]); + // callback([ 64, 0 ]); + // callback([ 8, 0 ]); + // callback([ 1, 0 ]); + + callback([ 1, 0 ]); + callback([ 2, 0 ]); callback([ 4, 0 ]); - callback([ 128, 0 ]); + callback([ 8, 0 ]); callback([ 16, 0 ]); - callback([ 2, 0 ]); + callback([ 32, 0 ]); callback([ 64, 0 ]); - callback([ 8, 0 ]); - callback([ 1, 0 ]); - + callback([ 128, 0 ]); + callback([ 256, 0 ]); + callback([ 512, 0 ]); + callback([ 1024, 0 ]); + callback([ 2048, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -642,14 +670,32 @@ exports["Keypad: MPR121QR2"] = { // Only 3 are valid. callback([ 64, 0 ]); callback([ 2, 0 ]); - callback([ 4, 0, 0 ]); - callback([ 4 ]); + callback([ 0, 0 ]); callback([ 4, 0 ]); + callback([ 0, 0 ]); test.equal(spy.callCount, 3); test.done(); }, + multiPress: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[3]; + var spy = sinon.spy(); + + this.keypad.on("down", spy); + + callback([ 192, 0 ]); + callback([ 48, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 6, 7 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 4, 5 ]); + + test.done(); + }, + hold: function(test) { test.expect(1); @@ -666,6 +712,27 @@ exports["Keypad: MPR121QR2"] = { test.done(); }, + multiHold: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[3]; + var spy = sinon.spy(); + + this.keypad.on("hold", spy); + + callback([ 192, 0 ]); + this.clock.tick(600); + callback([ 192, 0 ]); + this.clock.tick(600); + callback([ 128, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 6, 7 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 7 ]); + + test.done(); + }, + release: function(test) { test.expect(1); @@ -681,6 +748,25 @@ exports["Keypad: MPR121QR2"] = { test.done(); }, + multiRelease: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[3]; + var spy = sinon.spy(); + + this.keypad.on("release", spy); + + callback([ 192, 0 ]); + callback([ 128, 0 ]); + callback([ 0, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 6 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 7 ]); + + test.done(); + }, + sensitivityDefault: function(test) { test.expect(26); @@ -712,7 +798,7 @@ exports["Keypad: MPR121QR2"] = { // Set custom this.keypad = new Keypad({ board: this.board, - controller: "MPR121QR2", + controller: "MPR121", sensitivity: { press: 0.5, release: 0, @@ -746,7 +832,7 @@ exports["Keypad: MPR121QR2"] = { // Set custom this.keypad = new Keypad({ board: this.board, - controller: "MPR121QR2", + controller: "MPR121", sensitivity: { press: 1, release: 0.9, @@ -780,7 +866,7 @@ exports["Keypad: MPR121QR2"] = { // Set a custom this.keypad = new Keypad({ board: this.board, - controller: "MPR121QR2", + controller: "MPR121", sensitivity: [ { press: 1, release: 0.5, }, { press: 1, release: 0.5, }, @@ -817,7 +903,7 @@ exports["Keypad: MPR121QR2"] = { }; -exports["Keypad: MPR121"] = { +exports["Keypad: MPR121_KEYPAD"] = { setUp: function(done) { this.board = newBoard(); this.clock = sinon.useFakeTimers(); @@ -826,7 +912,7 @@ exports["Keypad: MPR121"] = { this.i2cRead = sinon.spy(MockFirmata.prototype, "i2cRead"); this.keypad = new Keypad({ - controller: "MPR121", + controller: "MPR121_KEYPAD", address: 0x5A, board: this.board }); @@ -846,7 +932,7 @@ exports["Keypad: MPR121"] = { this.i2cConfig.reset(); new Keypad({ - controller: "MPR121", + controller: "MPR121_KEYPAD", address: 0xff, bus: "i2c-1", board: this.board @@ -890,7 +976,7 @@ exports["Keypad: MPR121"] = { }); var keypad = new five.Keypad({ board: this.board, - controller: "MPR121", + controller: "MPR121_KEYPAD", address: 0x5A }); var callback = this.i2cRead.getCall(1).args[3]; @@ -900,19 +986,19 @@ exports["Keypad: MPR121"] = { callback([ 8, 0 ]); callback([ 128, 0 ]); - callback([ 0, 8 ]); + callback([ 2048, 0 ]); callback([ 4, 0 ]); callback([ 64, 0 ]); - callback([ 0, 4 ]); + callback([ 1024 , 0 ]); callback([ 2, 0 ]); callback([ 32, 0 ]); - callback([ 0, 2 ]); + callback([ 512, 0 ]); callback([ 1, 0 ]); callback([ 16, 0 ]); - callback([ 0, 1 ]); + callback([ 256, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -924,7 +1010,7 @@ exports["Keypad: MPR121"] = { var keys = ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"]; var keypad = new five.Keypad({ board: this.board, - controller: "MPR121", + controller: "MPR121_KEYPAD", address: 0x5A, keys: [ ["!", "@", "#"], @@ -952,7 +1038,7 @@ exports["Keypad: MPR121"] = { callback([ 0, 1 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -964,7 +1050,7 @@ exports["Keypad: MPR121"] = { var keys = ["!", "@", "#", "$", "%", "^", "&", "-", "+", "_", "=", ":"]; var keypad = new five.Keypad({ board: this.board, - controller: "MPR121", + controller: "MPR121_KEYPAD", address: 0x5A, keys: keys }); @@ -987,7 +1073,7 @@ exports["Keypad: MPR121"] = { callback([ 0, 1 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1004,14 +1090,32 @@ exports["Keypad: MPR121"] = { // Only 3 are valid. callback([ 64, 0 ]); callback([ 2, 0 ]); - callback([ 4, 0, 0 ]); - callback([ 4 ]); + callback([ 0, 0 ]); callback([ 4, 0 ]); + callback([ 0, 0 ]); test.equal(spy.callCount, 3); test.done(); }, + multiPress: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[3]; + var spy = sinon.spy(); + + this.keypad.on("down", spy); + + callback([ 65, 0 ]); + callback([ 7, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 5, 10 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 4, 7 ]); + + test.done(); + }, + hold: function(test) { test.expect(1); @@ -1028,6 +1132,27 @@ exports["Keypad: MPR121"] = { test.done(); }, + multiHold: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[3]; + var spy = sinon.spy(); + + this.keypad.on("hold", spy); + + callback([ 3, 0 ]); + this.clock.tick(600); + callback([ 3, 0 ]); + this.clock.tick(600); + callback([ 2, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 7, 10 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 7 ]); + + test.done(); + }, + release: function(test) { test.expect(1); @@ -1042,6 +1167,26 @@ exports["Keypad: MPR121"] = { test.equal(spy.callCount, 1); test.done(); }, + + multiRelease: function(test) { + // test.expect(1); + + var callback = this.i2cRead.getCall(0).args[3]; + var spy = sinon.spy(); + + this.keypad.on("release", spy); + + callback([ 3, 0 ]); + callback([ 2, 0 ]); + callback([ 1, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 10 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 7 ]); + + test.done(); + }, + }; @@ -1122,7 +1267,7 @@ exports["Keypad: QTOUCH"] = { callback([ 64 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1156,7 +1301,7 @@ exports["Keypad: QTOUCH"] = { callback([ 64 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1186,7 +1331,7 @@ exports["Keypad: QTOUCH"] = { callback([ 64 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1311,21 +1456,21 @@ exports["Keypad: 3X4_I2C_NANO_BACKPACK"] = { keypad.on("down", spy); - callback([ 0, 0 ]); callback([ 0, 1 ]); callback([ 0, 2 ]); - callback([ 0, 3 ]); callback([ 0, 4 ]); - callback([ 0, 5 ]); - callback([ 0, 6 ]); - callback([ 0, 7 ]); callback([ 0, 8 ]); - callback([ 0, 9 ]); - callback([ 0, 10 ]); - callback([ 0, 11 ]); + callback([ 0, 16 ]); + callback([ 0, 32 ]); + callback([ 0, 64 ]); + callback([ 0, 128 ]); + callback([ 1, 0 ]); + callback([ 2, 0 ]); + callback([ 4, 0 ]); + callback([ 8, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1351,22 +1496,22 @@ exports["Keypad: 3X4_I2C_NANO_BACKPACK"] = { keypad.on("down", spy); - callback([ 0, 0 ]); callback([ 0, 1 ]); callback([ 0, 2 ]); - callback([ 0, 3 ]); callback([ 0, 4 ]); - callback([ 0, 5 ]); - callback([ 0, 6 ]); - callback([ 0, 7 ]); callback([ 0, 8 ]); - callback([ 0, 9 ]); - callback([ 0, 10 ]); - callback([ 0, 11 ]); + callback([ 0, 16 ]); + callback([ 0, 32 ]); + callback([ 0, 64 ]); + callback([ 0, 128 ]); + callback([ 1, 0 ]); + callback([ 2, 0 ]); + callback([ 4, 0 ]); + callback([ 8, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1387,21 +1532,21 @@ exports["Keypad: 3X4_I2C_NANO_BACKPACK"] = { keypad.on("down", spy); - callback([ 0, 0 ]); callback([ 0, 1 ]); callback([ 0, 2 ]); - callback([ 0, 3 ]); callback([ 0, 4 ]); - callback([ 0, 5 ]); - callback([ 0, 6 ]); - callback([ 0, 7 ]); callback([ 0, 8 ]); - callback([ 0, 9 ]); - callback([ 0, 10 ]); - callback([ 0, 11 ]); + callback([ 0, 16 ]); + callback([ 0, 32 ]); + callback([ 0, 64 ]); + callback([ 0, 128 ]); + callback([ 1, 0 ]); + callback([ 2, 0 ]); + callback([ 4, 0 ]); + callback([ 8, 0 ]); keys.forEach(function(key, index) { - test.equal(spy.args[index][0].which, key); + test.deepEqual(spy.args[index][0].which, [key]); }); test.done(); @@ -1415,17 +1560,37 @@ exports["Keypad: 3X4_I2C_NANO_BACKPACK"] = { this.keypad.on("down", spy); + // Only 3 are valid. - callback([ 0, 0 ]); + callback([ 0, 1 ]); callback([ 0, 20 ]); - callback([ 0, 6 ]); + callback([ 0, 4 ]); callback([ 0, 10 ]); - callback([ 0, 14 ]); + callback([ 0, 8 ]); test.equal(spy.callCount, 3); test.done(); }, + multiPress: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[2]; + var spy = sinon.spy(); + + this.keypad.on("down", spy); + + callback([ 0, 3 ]); + callback([ 12, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 1, 2 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 0, "#" ]); + + test.done(); + }, + + hold: function(test) { test.expect(1); @@ -1434,14 +1599,36 @@ exports["Keypad: 3X4_I2C_NANO_BACKPACK"] = { this.keypad.on("hold", spy); - callback([ 0, 11 ]); + callback([ 0, 8 ]); this.clock.tick(600); - callback([ 0, 11 ]); + callback([ 0, 8 ]); test.equal(spy.callCount, 1); test.done(); }, + multiHold: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[2]; + var spy = this.sandbox.spy(); + + this.keypad.on("hold", spy); + + callback([ 0, 3 ]); + this.clock.tick(600); + callback([ 0, 3 ]); + this.clock.tick(600); + callback([ 0, 1 ]); + + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 1, 2 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 1 ]); + + test.done(); + }, + release: function(test) { test.expect(1); @@ -1450,10 +1637,29 @@ exports["Keypad: 3X4_I2C_NANO_BACKPACK"] = { this.keypad.on("release", spy); - callback([ 0, 11 ]); - callback([ 0, 255 ]); + callback([ 0, 1 ]); + callback([ 0, 0 ]); test.equal(spy.callCount, 1); test.done(); }, + + multiRelease: function(test) { + test.expect(3); + + var callback = this.i2cRead.getCall(0).args[2]; + var spy = this.sandbox.spy(); + + this.keypad.on("release", spy); + + callback([ 0, 3 ]); + callback([ 0, 1 ]); + callback([ 0, 0 ]); + + test.equal(spy.callCount, 2); + test.deepEqual(spy.firstCall.args[0].which, [ 2 ]); + test.deepEqual(spy.lastCall.args[0].which, [ 1 ]); + + test.done(); + }, }; diff --git a/tpl/programs.json b/tpl/programs.json index 67555587e..219c4dd34 100644 --- a/tpl/programs.json +++ b/tpl/programs.json @@ -572,7 +572,7 @@ }, { "topic": "Keypad", - "classes": ["Keypad"], + "classes": ["Keypad", "Touchpad"], "examples": [ { "file": "keypad-analog-vkey.js", @@ -584,22 +584,30 @@ }, { "file": "keypad-MPR121.js", - "title": "Keypad - MPR121" + "title": "Touchpad - MPR121" + }, + { + "file": "keypad-MPR121_SHIELD.js", + "title": "Touchpad - MPR121_SHIELD" + }, + { + "file": "keypad-MPR121_KEYPAD.js", + "title": "Touchpad - MPR121_KEYPAD" }, { "file": "keypad-MPR121-sensitivity.js", - "title": "Keypad - MPR121, Sensitivity", + "title": "Touchpad - MPR121, Sensitivity", "breadboards": [ - {"name": "keypad-MPR121"} + {"name": "keypad-MPR121_SHIELD"} ] }, { - "file": "keypad-MPR121QR2.js", - "title": "Keypad - MPR121QR2" + "file": "keypad-MPR121QR2_SHIELD.js", + "title": "Touchpad - MPR121QR2_SHIELD" }, { "file": "keypad-QTOUCH.js", - "title": "Keypad - Grove QTouch" + "title": "Touchpad - Grove QTouch" }, { "file": "keypad-3X4_I2C_NANO_BACKPACK.js",