diff --git a/apps.json b/apps.json index 24be2e83a..76151a627 100644 --- a/apps.json +++ b/apps.json @@ -736,5 +736,20 @@ {"name":"*ctrclk","url":"app-icon.js","evaluate":true} ], "sortorder" : -9 + }, + { "id": "demoapp", + "name": "Demo Loop", + "icon": "app.png", + "version":"0.01", + "description": "Simple demo app - displays Bangle.js, JS logo, graphics, and Bangle.js information", + "tags": "", + "type":"app", + "allow_emulator":true, + "storage": [ + {"name":"+demoapp","url":"app.json"}, + {"name":"-demoapp","url":"app.js"}, + {"name":"*demoapp","url":"app-icon.js","evaluate":true} + ], + "sortorder" : -9 } ] diff --git a/apps/_example_app/app-icon.js b/apps/_example_app/app-icon.js index 52a11577f..49232b838 100644 --- a/apps/_example_app/app-icon.js +++ b/apps/_example_app/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA==")); +require("heatshrink").decompress(atob("mEwwJC/AH4A/AH4AgA==")) diff --git a/apps/demoapp/app-icon.js b/apps/demoapp/app-icon.js new file mode 100644 index 000000000..5fa471ab6 --- /dev/null +++ b/apps/demoapp/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/AH4AT7oAQC43e9oXU73u93hiIALC5PiC6YWBAAOIABWBC7xHDC9fdl3ilAXUjAVLC5NETQQaLC46zEDAmCAogXGgLMFCwcuM4gXGcgwqBwMU9wXSDAICB7wXTAAUiO5YXKMgYXTU5gSFwLEJC5gNBFwf/AAPzC52IFwYXRqoALqAXWqoXIioXRoIXW9shC4UQNQgAMh1BinUC4Xd6AKBhqJDBAYAEoNN7tBiASBCYQDBCYIIEAAkBBIPRC6gvXL60BR6oXBkUikMQgQEBBIIDBkEABAgAEBIUiiADCkAIDDYQcCAAgJCABwXdAH4A/ABg")) diff --git a/apps/demoapp/app.js b/apps/demoapp/app.js new file mode 100644 index 000000000..b84839b45 --- /dev/null +++ b/apps/demoapp/app.js @@ -0,0 +1,168 @@ +Bangle.setLCDPower(1); +Bangle.setLCDTimeout(0); + +var scenes = [ + function() { + y = -100; + var step = 4; + var i = setInterval(function() { + y+=step; + if (y>70) { + clearInterval(i); + i = undefined; + } + g.clearRect(0,y-(step+1),240,y-1); + g.drawImage(Bangle.getLogo(),0,y); + }, 20); + Bangle.setLCDMode(); + g.clear(); + return function() { + if (i) clearInterval(i); + }; + }, + function() { + var txt = [" ____ _ \n"+ + "| __|___ ___ ___ _ _|_|___ ___ \n"+ + "| __|_ -| . | _| | | | | . |\n"+ + "|____|___| _|_| |___|_|_|_|___|\n"+ + " |_| espruino.com\n\n", + "The JavaScript Interpreter for uCs\n", + " * On-chip JS Interpreter", + " * GPS, Acclerometer, Compass", + " * 64 MHz, 64kB RAM, 512kB + 4MB Flash", + " * 240x240 IPS LCD", + " * Speaker & Vibration motor", + " * Bluetooth LE", + " * 1 week battery life", + "", + "Includes:", + " * Tensorflow AI", + " * Bluetooth LE central & periph", + " * Graphics Library", + " * VT100 terminal", + "","","" + ]; + var n=0; + var i = setInterval(function() { + Terminal.println(txt[n]); + n++; + if (n>=txt.length) { + clearInterval(i); + i=undefined; + } + }, 200); + Bangle.setLCDMode(); + return function() { + + + if (i) clearInterval(i); + }; + }, + function() { + var img = require("heatshrink").decompress(atob("oNBxH+5wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHGpAAoQKv4ADCBQAeqsrAAejBw9/B4oABqt/IGepHw5CEQspALH5hBC5pAvv4/MAALFkIBWpPI6IHqpAu0Z3GfYOpRYdPQEhALYIp2FBYNVI4JAvvL4LH0yBYAFJAQQQ5Ay1JAFftBAQBYxCDv+qIGiCHIQiGnIBfOv5BJIQRAyIJkrvKEkIBrFBB4qEGIGRCNYsZAQIQV/IZDEiICRCDQVJAUIQVPC4lVIF6yJQYpAZ5t/FYvNIBepqtVIJGjIDoqBDY2pdYo3DfAhBIQLmpvIcDvIrC5oJEIAhTCGQmj5qgEC4t5e7YrBqt5BI6UFBg15v4XHbQwAQb4oAKv7NKABdVRoYATUAwnICqjZFIMdVE4+jXI4XGYCxBFFZN/M5OpCxUrvJ/ZFYmjvNVAAY+KCwpDBC6YAV5vNC9oA/AH4A/AHYA==")); + + g.clear(); + y = 0; + var step = 4; + var i = setInterval(function() { + y+=step; + g.clear(); + g.drawImage(img,60,60,{rotate:Math.sin(y*0.03)*0.5}); + g.flip(); + }, 20); + Bangle.setLCDMode("120x120"); + return function() { + if (i) clearInterval(i); + }; + }, + function() { + var rx = 0, ry = 0; + + // draw a cube + function draw() { + var rcx=Math.cos(rx), + rsx=Math.sin(rx), + rcy=Math.cos(ry), + rsy=Math.sin(ry); + // Project 3D coordinates into 2D + function p(x,y,z) { + var t; + t = x*rcy + z*rsy; + z = z*rcy - x*rsy; + x=t; + t = y*rcx + z*rsx; + z = z*rcx - y*rsx; + y=t; + z += 6; + return [240 * (0.5 + x/z), 240 * (0.3 + y/z)]; + } + + var a; + // draw a series of lines to make up our cube + a = p(-1,-1,-1); g.moveTo(a[0],a[1]); + a = p(1,-1,-1); g.lineTo(a[0],a[1]); + a = p(1,1,-1); g.lineTo(a[0],a[1]); + a = p(-1,1,-1); g.lineTo(a[0],a[1]); + a = p(-1,-1,-1); g.lineTo(a[0],a[1]); + a = p(-1,-1,1); g.moveTo(a[0],a[1]); + a = p(1,-1,1); g.lineTo(a[0],a[1]); + a = p(1,1,1); g.lineTo(a[0],a[1]); + a = p(-1,1,1); g.lineTo(a[0],a[1]); + a = p(-1,-1,1); g.lineTo(a[0],a[1]); + a = p(-1,-1,-1); g.moveTo(a[0],a[1]); + a = p(-1,-1,1); g.lineTo(a[0],a[1]); + a = p(1,-1,-1); g.moveTo(a[0],a[1]); + a = p(1,-1,1); g.lineTo(a[0],a[1]); + a = p(1,1,-1); g.moveTo(a[0],a[1]); + a = p(1,1,1); g.lineTo(a[0],a[1]); + a = p(-1,1,-1); g.moveTo(a[0],a[1]); + a = p(-1,1,1); g.lineTo(a[0],a[1]); + } + + // rotate and redraw the cube + function step() { + // rotate + rx += 0.1; + ry += 0.11; + // draw + g.clear(); + g.setColor(0xFFFF); + draw(); + g.flip(); + } + + Bangle.setLCDMode("doublebuffered"); + g.clear();g.flip(); + var i = setInterval(step,50); + return function() { + clearInterval(i); + }; + }, + function() { + var img = require("heatshrink").decompress(atob("oNBxH+5wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHGpAAoQKv4ADCBQAeqsrAAejBw9/B4oABqt/IGepHw5CEQspALH5hBC5pAvv4/MAALFkIBWpPI6IHqpAu0Z3GfYOpRYdPQEhALYIp2FBYNVI4JAvvL4LH0yBYAFJAQQQ5Ay1JAFftBAQBYxCDv+qIGiCHIQiGnIBfOv5BJIQRAyIJkrvKEkIBrFBB4qEGIGRCNYsZAQIQV/IZDEiICRCDQVJAUIQVPC4lVIF6yJQYpAZ5t/FYvNIBepqtVIJGjIDoqBDY2pdYo3DfAhBIQLmpvIcDvIrC5oJEIAhTCGQmj5qgEC4t5e7YrBqt5BI6UFBg15v4XHbQwAQb4oAKv7NKABdVRoYATUAwnICqjZFIMdVE4+jXI4XGYCxBFFZN/M5OpCxUrvJ/ZFYmjvNVAAY+KCwpDBC6YAV5vNC9oA/AH4A/AHYA==")); + + g.clear(); + y = 0; + var step = 4; + var i = setInterval(function() { + y+=step; + g.scroll(0,1); + g.drawImage(img,Math.random()*240,Math.random()*240, + {rotate:Math.random()*6.3, scale:0.5+Math.random()}); + }, 1); + Bangle.setLCDMode(); + return function() { + if (i) clearInterval(i); + }; + } + +]; +var sceneNo = scenes.length-1; + +var stop = scenes[sceneNo](); +setInterval(function() { + sceneNo++; + if (sceneNo>=scenes.length) sceneNo=0; + stop(); + stop = scenes[sceneNo](); +}, 10000); diff --git a/apps/demoapp/app.json b/apps/demoapp/app.json new file mode 100644 index 000000000..fab184c15 --- /dev/null +++ b/apps/demoapp/app.json @@ -0,0 +1,5 @@ +{ + "name":"Demo Loop", + "icon":"*demoapp", + "src":"-demoapp" +} diff --git a/apps/demoapp/app.png b/apps/demoapp/app.png new file mode 100644 index 000000000..6904814f3 Binary files /dev/null and b/apps/demoapp/app.png differ diff --git a/bin/firmwaremaker.js b/bin/firmwaremaker.js index c03e6deb2..8346b3c00 100755 --- a/bin/firmwaremaker.js +++ b/bin/firmwaremaker.js @@ -11,6 +11,7 @@ var APPJSON = ROOTDIR+'/apps.json'; var OUTFILE = ROOTDIR+'/firmware.js'; var APPS = [ // IDs of apps to install "boot", + "launch", "mclock", "setting", "astroid",