summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-alexa-led/COPYING.MIT17
-rw-r--r--meta-alexa-led/LICENSE2
-rw-r--r--meta-alexa-led/README64
-rw-r--r--meta-alexa-led/conf/layer.conf10
-rw-r--r--meta-alexa-led/recipes-demo/alexa-led/alexa-led.bb16
-rw-r--r--meta-alexa-led/recipes-demo/alexa-led/files/COPYING.MIT17
-rw-r--r--meta-alexa-led/recipes-demo/alexa-led/files/LICENSE2
-rw-r--r--meta-alexa-led/recipes-demo/alexa-led/files/index.js142
-rwxr-xr-xmeta-alexa-led/recipes-demo/alexa-led/files/main.js89
9 files changed, 359 insertions, 0 deletions
diff --git a/meta-alexa-led/COPYING.MIT b/meta-alexa-led/COPYING.MIT
new file mode 100644
index 0000000..89de354
--- /dev/null
+++ b/meta-alexa-led/COPYING.MIT
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/meta-alexa-led/LICENSE b/meta-alexa-led/LICENSE
new file mode 100644
index 0000000..5190d8e
--- /dev/null
+++ b/meta-alexa-led/LICENSE
@@ -0,0 +1,2 @@
+All files in this layer are under the MIT license unless a file specifically notes otherwise.
+See COPYING.MIT for license details.
diff --git a/meta-alexa-led/README b/meta-alexa-led/README
new file mode 100644
index 0000000..c671cfe
--- /dev/null
+++ b/meta-alexa-led/README
@@ -0,0 +1,64 @@
+This README file contains information on the contents of the
+alexa-led layer.
+
+Please see the corresponding sections below for details.
+
+
+Dependencies
+============
+
+This layer depends on:
+
+ URI: git://git.openembedded.org/bitbake
+ branch: master
+
+ URI: git://git.openembedded.org/openembedded-core
+ layers: meta
+ branch: master
+
+ URI: git://git.yoctoproject.org/xxxx
+ layers: xxxx
+ branch: master
+
+
+Patches
+=======
+
+Please submit any patches against the alexa-led layer to the
+xxxx mailing list (xxxx@zzzz.org) and cc: the maintainer:
+
+Maintainer: XXX YYYYYY <xxx.yyyyyy@zzzzz.com>
+
+
+Table of Contents
+=================
+
+ I. Adding the alexa-led layer to your build
+ II. Misc
+
+
+I. Adding the alexa-led layer to your build
+=================================================
+
+--- replace with specific instructions for the alexa-led layer ---
+
+In order to use this layer, you need to make the build system aware of
+it.
+
+Assuming the alexa-led layer exists at the top-level of your
+yocto build tree, you can add it to the build system by adding the
+location of the alexa-led layer to bblayers.conf, along with any
+other layers needed. e.g.:
+
+ BBLAYERS ?= " \
+ /path/to/yocto/meta \
+ /path/to/yocto/meta-poky \
+ /path/to/yocto/meta-yocto-bsp \
+ /path/to/yocto/meta-alexa-led \
+ "
+
+
+II. Misc
+========
+
+--- replace with specific information about the alexa-led layer ---
diff --git a/meta-alexa-led/conf/layer.conf b/meta-alexa-led/conf/layer.conf
new file mode 100644
index 0000000..d469d0a
--- /dev/null
+++ b/meta-alexa-led/conf/layer.conf
@@ -0,0 +1,10 @@
+# We have a conf and classes directory, add to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have recipes-* directories, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
+ ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "alexa-led"
+BBFILE_PATTERN_alexa-led = "^${LAYERDIR}/"
+BBFILE_PRIORITY_alexa-led = "6"
diff --git a/meta-alexa-led/recipes-demo/alexa-led/alexa-led.bb b/meta-alexa-led/recipes-demo/alexa-led/alexa-led.bb
new file mode 100644
index 0000000..3e09f30
--- /dev/null
+++ b/meta-alexa-led/recipes-demo/alexa-led/alexa-led.bb
@@ -0,0 +1,16 @@
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=afaffb6a59e1896be335c5dd05c69e4b"
+
+SRC_URI = "file://main.js"
+
+RDEPENDS_${PN} = "nodejs \
+ alexapi"
+
+do_install () {
+ install -d ${D}${libdir}/node_modules/alexa_led
+ install ${WORKDIR}/main.js ${D}${libdir}/node_modules/alexa_led
+}
+
+FILES_${PN} = " \
+ ${libdir}/node_modules \
+ "
diff --git a/meta-alexa-led/recipes-demo/alexa-led/files/COPYING.MIT b/meta-alexa-led/recipes-demo/alexa-led/files/COPYING.MIT
new file mode 100644
index 0000000..89de354
--- /dev/null
+++ b/meta-alexa-led/recipes-demo/alexa-led/files/COPYING.MIT
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/meta-alexa-led/recipes-demo/alexa-led/files/LICENSE b/meta-alexa-led/recipes-demo/alexa-led/files/LICENSE
new file mode 100644
index 0000000..5190d8e
--- /dev/null
+++ b/meta-alexa-led/recipes-demo/alexa-led/files/LICENSE
@@ -0,0 +1,2 @@
+All files in this layer are under the MIT license unless a file specifically notes otherwise.
+See COPYING.MIT for license details.
diff --git a/meta-alexa-led/recipes-demo/alexa-led/files/index.js b/meta-alexa-led/recipes-demo/alexa-led/files/index.js
new file mode 100644
index 0000000..5c5503f
--- /dev/null
+++ b/meta-alexa-led/recipes-demo/alexa-led/files/index.js
@@ -0,0 +1,142 @@
+'use strict';
+var config = {};
+
+var AWS = require('aws-sdk');
+var Alexa = require('alexa-sdk');
+
+//replace with endpoint from AWS IoT Device
+var iotData = new AWS.IotData({endpoint: 'a22iwj71w43omu.iot.us-east-2.amazonaws.com', region: 'us-east-2'});
+var APP_ID = undefined; //OPTIONAL: replace with 'amzn1.echo-sdk-ams.app.[your-unique-value-here]';
+var SKILL_NAME = 'gateway-demo';
+
+exports.handler = function(event, context, callback) {
+ var alexa = Alexa.handler(event, context);
+ alexa.APP_ID = APP_ID;
+ alexa.registerHandlers(handlers);
+ alexa.execute();
+};
+
+var led_state = 0;
+
+var handlers = {
+ 'LaunchRequest': function () {
+
+ var LEDState = [
+ {"state":{ "desired":{"device":"minnowboard_1","led":0}}}
+ ];
+ var speechOutput="Gateway Operational";
+ AWSIoT.sendMessage(this, LEDState,speechOutput);
+
+ },
+ 'DeviceStateIntent': function () {
+
+ var speechOutput;
+ var itemSlot = this.event.request.intent.slots.LEDState;
+ console.log("itemSlot: "+itemSlot);
+ var LED_State="none";
+ if (itemSlot && itemSlot.value) {
+ LED_State = itemSlot.value.toLowerCase();
+ }
+ console.log("LED_State: "+ LED_State);
+ var deviceState=null;
+
+ switch (LED_State) {
+ case "on":
+ led_state = 1;
+ deviceState = [
+ {'state':{ 'desired':{'device':'minnowboard_1','led_state':led_state}}}
+ ];
+ speechOutput="L E D on";
+ console.log('on recieved')
+ break;
+ case "off":
+ led_state = 0;
+ deviceState = [
+ {'state':{ 'desired':{'device':'minnowboard_1','led_state':led_state}}}
+ ];
+ speechOutput="L E D off";
+ break;
+ default:
+ speechOutput="no L E D state";
+ break;
+ }
+ if (deviceState===null) {
+ this.emit(':tell',speechOutput);
+ } else {
+ AWSIoT.sendMessage(this, deviceState, speechOutput);
+ console.log("message sent: ", deviceState )
+ }
+
+
+ },
+ 'AMAZON.HelpIntent': function () {
+ this.attributes['speechOutput'] = 'You can ask questions such as, what\'s the L E D state, or, you can say exit... ' +
+ 'Now, what can I help you with?';
+ this.attributes['repromptSpeech'] = 'You can say things like, what\'s the L E D state, or you can say exit...' +
+ ' Now, what can I help you with?';
+ this.emit(':ask', this.attributes['speechOutput'], this.attributes['repromptSpeech'])
+ },
+ 'AMAZON.RepeatIntent': function () {
+ this.emit(':ask', this.attributes['speechOutput'], this.attributes['repromptSpeech'])
+ },
+ 'AMAZON.StopIntent': function () {
+ this.emit('SessionEndedRequest');
+ },
+ 'AMAZON.CancelIntent': function () {
+ this.emit('SessionEndedRequest');
+ },
+ 'SessionEndedRequest':function () {
+ this.emit(':tell', 'Goodbye!');
+ }
+ };
+
+var AWSIoT = {
+ postSendMessage: function (thisOfParent,speechOutput) {
+ console.log('doot doot, all doot');
+ thisOfParent.emit(':tell', speechOutput);
+ },
+ sendMessage: function (thisOfParent, deviceState, speechOutput) {
+
+ var itemsProcessed = 0;
+
+ deviceState.forEach((item, index, array) => {
+ console.log("item "+index+": "+JSON.stringify(item));
+ console.log("device "+index+": "+item.state.desired.device)
+
+ var thingNameAndPayload= {
+ thingName: 'minnowboard_1',
+ payload: JSON.stringify(item)
+ };
+
+ iotData.updateThingShadow(thingNameAndPayload, function(err, data) {
+ console.log('sent shadow update')
+ if (err) console.log(err, err.stack); // an error occurred
+ else console.log(data); // successful response
+
+
+ if (err){
+ console.log("update error: ");
+ console.log(err);
+ //Handle the error here
+ speechOutput += " - Error updating device state: " + err + " ";
+ speechOutput += thingNameAndPayload.thingName + " ";
+ speechOutput += thingNameAndPayload.payload;
+ }
+
+ else {
+ console.log("update success: ");
+ console.log(data);
+ }
+ itemsProcessed++;
+ if(itemsProcessed === array.length) {
+ AWSIoT.postSendMessage(thisOfParent, speechOutput);
+ }
+
+
+ });
+
+ });
+
+ }
+
+ };
diff --git a/meta-alexa-led/recipes-demo/alexa-led/files/main.js b/meta-alexa-led/recipes-demo/alexa-led/files/main.js
new file mode 100755
index 0000000..6224890
--- /dev/null
+++ b/meta-alexa-led/recipes-demo/alexa-led/files/main.js
@@ -0,0 +1,89 @@
+"use strict" ;
+
+var APP_NAME = "Alexa Demo" ;
+console.log("Initializing " + APP_NAME) ;
+
+
+var fs = require ('fs');
+if (!fs.existsSync('/sys/class/gpio/gpio360/value')) {
+ fs.writeFile('/sys/class/gpio/export', 360, (err) => {
+ if (err) console.log('Error - couldnt export gpio 360');
+ });
+}
+fs.writeFile('/sys/class/gpio/gpio360/direction', 'out', (err) => {
+ if (err) console.log('Error - couldnt set gpio direction');
+});
+
+fs.writeFile('/sys/class/gpio/gpio360/value', '0', (err) => {
+ if (err) console.log('Error - couldnt set gpio value');
+});
+
+console.log("GPIO initialized...");
+
+const deviceModule = require('aws-iot-device-sdk').device;
+
+console.log("Device module found...");
+
+function connectAWS() {
+
+ const device = deviceModule({
+ keyPath: "/connect_device_package/Minnowboard.private.key", //Make sure these paths match your certifacte locations
+ certPath: "/connect_device_package/Minnowboard.cert.pem",
+ caPath: "/connect_device_package/root-CA.crt",
+ host: "a22iwj71w43omu.iot.us-east-2.amazonaws.com", //Replace with your endpoint from AWS IoT Device Dashboard
+ });
+ console.log("deviceModule initialized...");
+
+ device.subscribe('$aws/things/minnowboard_1/shadow/update/accepted');
+ device.publish('topic_1', 'hello from Minnowboard')
+ console.log("Publish and subscribe started...");
+
+device
+ .on('connect', function() {
+ console.log('connect');
+ });
+ device
+ .on('close', function() {
+ console.log('close');
+ });
+ device
+ .on('reconnect', function() {
+ console.log('reconnect');
+ });
+ device
+ .on('offline', function() {
+ console.log('offline');
+ });
+ device
+ .on('error', function(error) {
+ console.log('error', error);
+ });
+ device
+ .on('message', function(topic, payload) {
+ console.log('message', topic, payload.toString());
+ updateState(payload)
+ });
+
+ console.log("Device callbacks set...");
+}
+
+
+//globals:
+var led_state = 0;
+var shadow = null;
+
+function updateState(payload){
+ var pay_json=JSON.parse(payload.toString())
+ led_state = 1 - pay_json.state.desired.led_state; // Invert state since on/off are 0/1
+
+ console.log("Setting gpio 360 (LED) to " + led_state);
+
+ fs.writeFile('/sys/class/gpio/gpio360/value', led_state, (err) => {
+ if (err) console.log('Error - couldnt set gpio value');
+});
+
+};
+
+
+connectAWS();
+