Added pebble client.

This commit is contained in:
Tobias Blum
2016-06-04 23:26:30 +02:00
parent c1c82222b5
commit 91a3c69414
14 changed files with 1491 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
{
"appKeys": {},
"capabilities": [
"configurable"
],
"companyName": "pebble@tobiasblum.de",
"longName": "McLighting",
"projectType": "pebblejs",
"resources": {
"media": [
{
"file": "images/menu_icon.png",
"menuIcon": true,
"name": "IMAGE_MENU_ICON",
"type": "bitmap"
},
{
"file": "images/logo_splash.png",
"name": "IMAGE_LOGO_SPLASH",
"type": "bitmap"
},
{
"file": "images/tile_splash.png",
"name": "IMAGE_TILE_SPLASH",
"type": "bitmap"
},
{
"file": "fonts/UbuntuMono-Regular.ttf",
"name": "MONO_FONT_14",
"type": "font"
}
]
},
"sdkVersion": "3",
"shortName": "McLighting",
"targetPlatforms": [
"aplite"
],
"uuid": "11c1a793-0ddf-4045-8a40-4b4d059763ea",
"versionCode": 1,
"versionLabel": "1.0",
"watchapp": {
"hiddenApp": false,
"watchface": false
}
}
+393
View File
@@ -0,0 +1,393 @@
/**
* Welcome to Pebble.js!
*
* This is where you write your app.
*/
var UI = require('ui');
var Settings = require('settings');
//var ajax = require('ajax');
var wsUri = "ws://esp8266_01.local:81/";
var websocket;
var main = new UI.Card({
title: 'Mc Lighting',
icon: 'images/menu_icon.png',
//subtitle: 'Hello World!',
body: 'Loading ...'
});
var colors = [
["White", "ffffff"],
["Red", "ff0000"],
["Blue", "0000ff"],
["Green", "00ff00"],
["Yellow", "ffff00"],
["White", "ffffff"],
["Pink", "ff1493"],
["Maroon", "800000"],
["Forest", "228b22"],
["Orange", "ff4500"],
["Cyan", "00ffff"]
];
var modes = ["Hold", "Off", "All", "Wipe", "Rainbow", "Rainbow Cycle", "Theater Chase", "Theater Chase Rainbow", "TV"];
// **********************************
// Init app
// **********************************
function init() {
console.log("init()");
//var options = Settings.option();
//console.log("Settings: ", JSON.stringify(options));
var esp_url = Settings.option('esp_url');
if (esp_url === "") {
//main.body('NO');
esp_url = wsUri;
} else {
//main.body('YES'+esp_url);
}
// Connect Websocket
websocket = new WebSocket(esp_url);
websocket.onopen = function(evt) {
main.body('WebSocket connected!');
console.log("init() CONN");
websocket.send("$");
};
websocket.onclose = function(evt) {
console.log("init() CLOSE", JSON.stringify(evt));
errorMessage("WebSocket connection closed");
};
websocket.onmessage = function(evt) {
//console.log("WS received: ");
updateStatus(evt.data);
};
websocket.onerror = function(evt) {
console.log("init() ERROR", JSON.stringify(evt));
errorMessage("WebSocket error");
};
main.show();
}
function updateStatus(msg) {
console.log("updateStatus: ", msg);
if (msg != "OK" && msg != "Connected") {
try {
var json = JSON.parse(msg);
var str_status = '';
if (json.mode !== undefined) {
console.log("JSON mode: ", json.mode);
str_status += 'Mode: ' + modes[json.mode] + "\n";
str_status += 'Brightness: ' + Math.round(json.brightness / 2.55) + "%\n";
str_status += 'Delay: ' + json.delay_ms + " ms\n";
str_status += 'Color: #' + decimalToHex(json.color[0], 2) + decimalToHex(json.color[1], 2) + decimalToHex(json.color[2], 2) + "\n";
main.body(str_status);
}
}
catch(evt) {
console.log("JSON parse error: ", JSON.stringify(evt));
}
}
}
function decimalToHex(decimal, chars) {
return (decimal + Math.pow(16, chars)).toString(16).slice(-chars).toUpperCase();
}
function errorMessage(message) {
var error_card = new UI.Card({
title: 'Error occurred',
icon: 'images/menu_icon.png',
subtitle: 'Press any button.',
body: message,
});
error_card.show();
}
// **********************************
// Main Menu
// **********************************
main.on('click', 'select', function(e) {
var menu = new UI.Menu({
sections: [{
items: [
{
title: 'Mode',
//icon: 'images/menu_icon.png',
subtitle: 'Choose working mode'
}, {
title: 'Brightness',
subtitle: 'Let it shine'
}, {
title: 'Color',
subtitle: 'Bring color to the world'
}, {
title: 'Delay',
subtitle: 'Forever faster'
}
]
}]
});
// **********************************
// Main Menu Selected
// **********************************
menu.on('select', function(e) {
console.log('Selected item #' + e.itemIndex + ' of section #' + e.sectionIndex);
console.log('The item is titled "' + e.item.title + '"');
// Mode selection
var mode_menu;
if (e.itemIndex === 0) {
mode_menu = new UI.Menu({
sections: [{
items: [
{
title: 'Off',
subtitle: 'Turn it off'
}, {
title: 'All',
subtitle: 'All LEDs on'
}, {
title: 'Wipe',
subtitle: 'Wipe it bright'
}, {
title: 'Rainbow',
subtitle: 'Bring color to the world'
}, {
title: 'Rainbow Cycle',
subtitle: 'Like a unicorn'
},{
title: 'Theater Chase',
subtitle: 'Disco'
},{
title: 'Theater Chase Rainbow',
subtitle: 'Unicorn disco'
}, {
title: 'TV',
subtitle: 'Video killed the radio star'
}
]
}]
});
mode_menu.show();
// **********************************
// Mode Selected
// **********************************
mode_menu.on('select', function(e) {
// Select mode
console.log('Selected mode #' + e.itemIndex + ' of section #' + e.sectionIndex);
setMode(e.itemIndex);
});
}
// Brightness selection
var brightness_menu;
if (e.itemIndex === 1) {
var brightness_items = [];
for (var i = 0; i<=10; i++) {
var brightness_item = {
title: (i*10) + " %",
};
brightness_items.push(brightness_item);
}
brightness_menu = new UI.Menu({
sections: [{
items: brightness_items
}]
});
brightness_menu.show();
// **********************************
// Brightness Selected
// **********************************
brightness_menu.on('select', function(e) {
// Select mode
console.log('Selected mode #' + e.itemIndex + ' of section #' + e.sectionIndex);
setBrightness(e.itemIndex);
});
}
// Color selection
var color_menu;
if (e.itemIndex === 2) {
var color_items = [];
for (var k = 0; k < colors.length; k++) {
var color_item = {
title: colors[k][0]
};
color_items.push(color_item);
}
color_menu = new UI.Menu({
sections: [{
items: color_items
}]
});
color_menu.show();
// **********************************
// Brightness Selected
// **********************************
color_menu.on('select', function(e) {
// Select mode
console.log('Selected mode #' + e.itemIndex + ' of section #' + e.sectionIndex);
setColor(e.itemIndex);
});
}
// Delay selection
var delay_menu;
if (e.itemIndex === 3) {
var delay_items = [];
for (var j = 0; j<=15; j++) {
var delay_item = {
title: Math.round(j*10) + " ms",
};
delay_items.push(delay_item);
}
delay_menu = new UI.Menu({
sections: [{
items: delay_items
}]
});
delay_menu.show();
// **********************************
// Brightness Selected
// **********************************
delay_menu.on('select', function(e) {
// Select mode
console.log('Selected mode #' + e.itemIndex + ' of section #' + e.sectionIndex);
setDelay(e.itemIndex);
});
}
});
menu.show();
});
// **********************************
// Requests
// **********************************
function setMode(mode) {
if (mode === 0) {
performRequest("=off");
}
if (mode === 1) {
performRequest("=all");
}
if (mode === 2) {
performRequest("=wipe");
}
if (mode === 3) {
performRequest("=rainbow");
}
if (mode === 4) {
performRequest("=rainbowCycle");
}
if (mode === 5) {
performRequest("=theaterchase");
}
if (mode === 6) {
performRequest("=theaterchaseRainbow");
}
if (mode === 7) {
performRequest("=tv");
}
}
function setBrightness(index) {
var value = Math.round(index * 25.5);
performRequest("%"+value);
}
function setColor(index) {
var value = colors[index][1];
performRequest("*"+value);
}
function setDelay(index) {
var value = Math.round(index * 10);
performRequest("?"+value);
}
function performRequest(message) {
websocket.send(message);
}
main.on('click', 'up', function(e) {
// Restart websocket connection
//websocket.send("$");
websocket.close();
init();
});
main.on('click', 'down', function(e) {
// Update status
websocket.send("$");
});
// **********************************
// Settings
// **********************************
// https://pebble.github.io/pebblejs/#settings
// https://github.com/pebble/slate
// Set a configurable with just the close callback
Settings.config(
{ url: 'https://mclighting-pebble-config.firebaseapp.com' },
function(e) {
console.log('closed configurable');
// Show the parsed response
console.log(JSON.stringify(e.options));
init();
// Show the raw response if parsing failed
if (e.failed) {
console.log(e.response);
}
}
);
init();