/** * 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();