diff --git a/apps.json b/apps.json
index c46d5f8a9..d0be75c34 100644
--- a/apps.json
+++ b/apps.json
@@ -337,5 +337,52 @@
{"name":".tfmodel","url":"gesture-tfmodel.js","evaluate":true},
{"name":"*gesture","url":"gesture-icon.js","evaluate":true}
]
+ },
+ { "id": "pparrot",
+ "name": "Party Parrot",
+ "icon": "party-parrot.png",
+ "description": "Party with a parrot on your wrist",
+ "tags": "party,parrot,lol",
+ "type":"app",
+ "storage": [
+ {"name":"+pparrot","url":"party-parrot.json"},
+ {"name":"-pparrot","url":"party-parrot.js"},
+ {"name":"*pparrot","url":"party-parrot-icon.js","evaluate":true}
+ ]
+ },
+ {
+ "id": "blescan",
+ "name": "BLE Scanner",
+ "icon": "blescan.png",
+ "description": "Scan for advertising BLE devices",
+ "tags" : "bluetooth",
+ "storage" : [
+ {"name":"+blescan","url":"blescan.json"},
+ {"name":"-blescan","url":"blescan.js"},
+ {"name":"*blescan","url":"blescan-icon.js", "evaluate":true}
+ ]
+ },
+ { "id": "mmonday",
+ "name": "Manic Monday Tone",
+ "icon": "manic-monday-icon.png",
+ "description": "The Bangles make a comeback",
+ "tags": "sound",
+ "storage": [
+ {"name":"+mmonday","url":"manic-monday.json"},
+ {"name":"-mmonday","url":"manic-monday.js"},
+ {"name":"*mmonday","url":"manic-monday-icon.js","evaluate":true}
+ ]
+ },
+ { "id": "jbells",
+ "name": "Jingle Bells",
+ "icon": "jbells.png",
+ "description": "Play Jingle Bells",
+ "tags": "sound",
+ "type":"app",
+ "storage": [
+ {"name":"+jbells","url":"jbells.json"},
+ {"name":"-jbells","url":"jbells.js"},
+ {"name":"*jbells","url":"jbells-icon.js","evaluate":true}
+ ]
}
]
diff --git a/apps/blescan-icon.js b/apps/blescan-icon.js
new file mode 100644
index 000000000..771d36657
--- /dev/null
+++ b/apps/blescan-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AH4ATmIABrdbAgQrmAAYvEAAYtkF5QxcEZAvLGDAhJF5oxWFhYAFCBFaFzQsHAAk3CQmE1wwRFxiPFMY4uBwiSRI4uEQo4GIAAIVBxTCRFwoABJITvNrYTHRqIuCAAIvPxQSBBQwvQL6aMCBQ7sQVIQuGdIjqIGCIOEm4XHForqFIAYHBm4vTFxYMDAQKeHDIwvVRAoEDdRAvPE5QcHAoTqJDQ5eZAwS7DIZovWAodaRQLqGF6bhDABouCXYIAQF+6PUrQUQd7oMKF6wbLApYaIF45gSAgxeUF5olDBIICECJIvTm4wLAAoPHm4vTC4OK12EGJYLFI5IvJGAuE1wABGAycIBRQuKF4ouCAAIvPIgOFF6QwEL6c3IRAuMGA+EWw4GIwuusAuTeQzqGF4r0LF6AwIm4mEAA03FzAwJLAxbKFygwLd5IuaMRwthGBYvKFzQxJF5AtdGZAvEFcYA/AH4AvA=="))
diff --git a/apps/blescan.js b/apps/blescan.js
new file mode 100644
index 000000000..2dc563b75
--- /dev/null
+++ b/apps/blescan.js
@@ -0,0 +1,52 @@
+// ble-scanner
+// Scan the airwaves every three seconds (which seems safe for a large number of devices)
+// Using the menu feature, display a scrollable list of BLE devices on the watch
+
+// Dummy menu item to display until we find something
+const NODEVICE = 'No devices found';
+
+const SCAN_INTERVAL = 3000;
+
+const menu = {
+};
+
+menu[NODEVICE] = {
+ value : "",
+ onchange : () => {}
+};
+
+
+function draw() {
+ Bangle.menu(menu);
+}
+
+function scan() {
+ NRF.findDevices(devices => {
+ for (let device of devices) {
+
+ // Only display devices that advertise a name
+
+ if (device.name) {
+ // Remove no devices found message if it is present
+ if (menu[NODEVICE]) {
+ delete menu[NODEVICE];
+ }
+ menu[device.name] = {
+ value : device.rssi,
+ onchange : () => {}
+ };
+ }
+ }
+ draw();
+ }, { active: true });
+}
+
+
+function waitMessage() {
+ E.showMessage('scanning');
+}
+
+scan();
+waitMessage();
+
+setInterval(scan, SCAN_INTERVAL);
diff --git a/apps/blescan.json b/apps/blescan.json
new file mode 100644
index 000000000..d9e7f28f1
--- /dev/null
+++ b/apps/blescan.json
@@ -0,0 +1,7 @@
+
+{
+ "name": "BLE Scanner",
+ "type":"app",
+ "icon": "*blescan",
+ "src": "-blescan"
+}
diff --git a/apps/blescan.png b/apps/blescan.png
new file mode 100644
index 000000000..efe76af51
Binary files /dev/null and b/apps/blescan.png differ
diff --git a/apps/clock-analog.js b/apps/clock-analog.js
index 8e6650508..dfd1a7ddb 100644
--- a/apps/clock-analog.js
+++ b/apps/clock-analog.js
@@ -3,13 +3,11 @@ g.clear();
var minuteDate = new Date();
var secondDate = new Date();
-function line(angle, r1,r2) {
+function seconds(angle, r) {
var a = angle*Math.PI/180;
- g.drawLine(
- 120+Math.sin(a)*r1,
- 120-Math.cos(a)*r1,
- 120+Math.sin(a)*r2,
- 120-Math.cos(a)*r2);
+ var x = 120+Math.sin(a)*r;
+ var y = 120-Math.cos(a)*r;
+ g.fillRect(x-1,y-1,x+1,y+1);
}
function hand(angle, r1,r2) {
var a = angle*Math.PI/180;
@@ -28,20 +26,20 @@ function hand(angle, r1,r2) {
function drawAll() {
g.clear();
- g.setColor(0,0,0.3);
+ g.setColor(0,0,0.6);
for (var i=0;i<60;i++)
- line(360*i/60, 92, 95);
+ seconds(360*i/60, 90);
secondDate = minuteDate = new Date();
onSecond();
onMinute();
}
function onSecond() {
- g.setColor(0,0,0.3);
- line(360*secondDate.getSeconds()/60, 92, 95);
+ g.setColor(0,0,0.6);
+ seconds(360*secondDate.getSeconds()/60, 90);
g.setColor(1,0,0);
secondDate = new Date();
- line(360*secondDate.getSeconds()/60, 92, 95);
+ seconds(360*secondDate.getSeconds()/60, 90);
g.setColor(1,1,1);
}
@@ -49,11 +47,11 @@ function onSecond() {
function onMinute() {
g.setColor(0,0,0);
hand(360*minuteDate.getHours()/12, -10, 50);
- hand(360*minuteDate.getMinutes()/60, -10, 85);
+ hand(360*minuteDate.getMinutes()/60, -10, 82);
oldMinute = new Date();
g.setColor(1,1,1);
hand(360*minuteDate.getHours()/12, -10, 50);
- hand(360*minuteDate.getMinutes()/60, -10, 85);
+ hand(360*minuteDate.getMinutes()/60, -10, 82);
}
setInterval(onSecond,1000);
diff --git a/apps/jbells-icon.js b/apps/jbells-icon.js
new file mode 100644
index 000000000..dc602af1f
--- /dev/null
+++ b/apps/jbells-icon.js
@@ -0,0 +1 @@
+E.toArrayBuffer(atob("MDCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAABEAAAAAAAAAAAAAAAAAAAAAERAAAAAAAREAAAAAAAAAAAAAAAAAAAABERAAAAAAAREQAAAAAAAAAAAAAAAQAAAREREAAAAAERERAAABAAAAAAAAAAARERERERFMwAzEERERERERAAAAAAAAAAARERERERHMzMzMERERERERAAAAAAAAAAARERERERHMzdzMERERERERAAAAAAAAAAERERERER3d3d3d0REREREREAAAAAAAAAEREREWYe7u3d3u7hZhEREREAAAAAAAABERFmZmHu7u3d3u7uFmZmEREQAAAAAAARFmZmZm3u7u3d3u7u1mZmZmERAAAAAAFmZmZmZh7u7u7u7u7u4WZmZmZmYAAAAABmZmZmZk7u7u7u7u7u5GZmZmZmAAAAAAAABmZmZt7u7u7u7u7u7WZmZmAAAAAAAAAAAGZmZu7u7u7u7u7u7mZmZgAAAAAAAAAAAAZmYO7u7u7u7u7u7gZmYAAAAAAAAAAAAABmAO7u7u7u7u7u7gBmAAAAAAAAAAAAAAAAAO7u7u7u7u7u7gAAAAAAAAAAAAAAAAAAAO7u7u7u7u7u7gAAAAAAAAAAAAAAAAAAAO7u7u7u7u7u7gAAAAAAAAAAAAAAAAAAAO7u7u7u7u7u7gAAAAAAAAAAAAAAAAAADu7u7u7u7u7u7uAAAAAAAAAAAAAAAAAA7u7u7u7u7u7u7u4AAAAAAAAAAAAAAAAO7u7u7u7u7u7u7u7gAAAAAAAAAAAAAAAO7u7u7u7u7u7u7u7gAAAAAAAAAAAAAADu7u7u7u7u7u7u7u7uAAAAAAAAAAAAAA7u7u7u7u7u7u7u7u7u4AAAAAAAAAAAAO7u7u7u7u7u7u7u7u7u7gAAAAAAAAAADjM+7u7u7u7u7u7u7u7uM+AAAAAAAAAADuMzMz7u7u7u7u7u7jMzPuAAAAAAAAAA7u7u4zMzMzMzMzMzMzPu7u4AAAAAAAAA7u7u7u7uMzMzMzM+7u7u7u4AAAAAAAAADu7u7u7u7u7u7u7u7u7u7uAAAAAAAAAAAADu7u7u7u7u7u7u7u7uAAAAAAAAAAAAAAAAAA7u7u7u7u7u4AAAAAAAAAAAAAAAAAAAAAAABEREREAAAAAAAAAAAAAAAAAAAAAAAAAABEREREAAAAAAAAAAAAAAAAAAAAAAAAAADd3d3dAAAAAAAAAAAAAAAAAAAAAAAAAAAN3d3QAAAAAAAAAAAAAAAAAAAAAAAAAAAA3d0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="))
\ No newline at end of file
diff --git a/apps/jbells.js b/apps/jbells.js
new file mode 100644
index 000000000..faab3defd
--- /dev/null
+++ b/apps/jbells.js
@@ -0,0 +1,38 @@
+E.showMessage("Jingle Bells");
+
+var eventEmitter = new Object();
+
+function strofa(notes, times, current, next){
+eventEmitter.on(current, () => {
+ if (notes.length == 0) {
+ eventEmitter.emit(next);
+ return;
+ }
+ let note = notes.shift();
+ let time = times.shift();
+ Bangle.beep(time, note).then(() => {
+ setTimeout(() => {
+ eventEmitter.emit(current);
+ }, time);
+ });
+});
+}
+
+var one = [2637, 2637, 2637, 2637, 2637, 2637, 2637, 3135, 2093, 2349, 2637];
+var one_t = [160, 160, 320, 160, 160, 320, 160, 160, 160, 160, 320];
+
+var two = [2793, 2793, 2793, 2637, 2637, 2637, 2349, 2349, 2349, 2637, 2349, 3135];
+var two_t = [160, 160, 320, 160, 160, 320, 160, 160, 160, 160, 320, 320];
+
+var three = [2637, 2637, 2637, 2637, 2637, 2637, 2637, 3135, 2093, 2349, 2637];
+var three_t = [160, 160, 320, 160, 160, 320, 160, 160, 160, 160, 320];
+
+var four = [2793, 2793, 2793, 2637, 2637, 2637, 3135, 2793, 2637, 2349, 2093];
+var four_t = [160, 160, 320, 160, 160, 320, 160, 160, 160, 160, 320];
+
+strofa(one, one_t, "one", "two");
+strofa(two, two_t, "two", "three");
+strofa(three, three_t, "three", "four");
+strofa(four, four_t, "four", "stop");
+
+eventEmitter.emit("one");
\ No newline at end of file
diff --git a/apps/jbells.json b/apps/jbells.json
new file mode 100644
index 000000000..20638a2d6
--- /dev/null
+++ b/apps/jbells.json
@@ -0,0 +1,5 @@
+{
+ "name":"Jingle Bells","type":"app",
+ "icon":"*jbells",
+ "src":"-jbells"
+}
\ No newline at end of file
diff --git a/apps/jbells.png b/apps/jbells.png
new file mode 100644
index 000000000..a70257396
Binary files /dev/null and b/apps/jbells.png differ
diff --git a/apps/manic-monday-icon.js b/apps/manic-monday-icon.js
new file mode 100644
index 000000000..feba5fe86
--- /dev/null
+++ b/apps/manic-monday-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("MDABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"))
diff --git a/apps/manic-monday-icon.png b/apps/manic-monday-icon.png
new file mode 100644
index 000000000..bddb14ea4
Binary files /dev/null and b/apps/manic-monday-icon.png differ
diff --git a/apps/manic-monday.js b/apps/manic-monday.js
new file mode 100644
index 000000000..a2245e7e7
--- /dev/null
+++ b/apps/manic-monday.js
@@ -0,0 +1,46 @@
+// made using https://www.espruino.com/Making+Music
+// Manic Monday tone by The Bangles
+
+var SPEAKER_PIN = D18;
+
+function freq(f) {
+ if (f===0) digitalWrite(SPEAKER_PIN, 0);
+ else analogWrite(SPEAKER_PIN, 0.5, {freq: f});
+}
+freq(1000);
+freq(1500);
+freq(0);
+
+var pitches = {
+ 'G': 207.65,
+ 'a': 220.00,
+ 'b': 246.94,
+ 'c': 261.63,
+ 'd': 293.66,
+ 'e': 329.63,
+ 'f': 369.99,
+ 'g': 392.00,
+ 'A': 440.00,
+ 'B': 493.88,
+ 'C': 523.25,
+ 'D': 587.33,
+ 'E': 659.26,
+ 'F': 698.46
+};
+
+function step() {
+ var ch = tune[pos];
+ if (ch !== undefined) pos++;
+ if (ch in pitches) freq(pitches[ch]);
+ else freq(0); // off
+}
+
+var tune = "aggffefed";
+var pos = 0;
+
+setWatch(() => {
+ var playing = setInterval(step, 500);
+ if(playing === 0) clearInterval(playing);
+}, BTN1);
+
+E.showMessage('BTN1 to start', 'Manic Monday');
diff --git a/apps/manic-monday.json b/apps/manic-monday.json
new file mode 100644
index 000000000..1454658dd
--- /dev/null
+++ b/apps/manic-monday.json
@@ -0,0 +1,5 @@
+{
+ "name":"Manic Monday tone",
+ "icon": "*mmonday",
+ "src":"-mmonday"
+}
diff --git a/apps/party-parrot-icon.js b/apps/party-parrot-icon.js
new file mode 100644
index 000000000..4a80a51af
--- /dev/null
+++ b/apps/party-parrot-icon.js
@@ -0,0 +1 @@
+require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A5wNcp8AgEswFdFktVFYMAp9QudPgwGBldWF0ErEoPJz3J5PI4YDB4WlMwMrFz1cgF05Gl4fI5ICC5OfAYN0gGHFzhcBLYOeAYQABA4RhC5IQBriMcEQV6GgiXCRgPCBYUALzZTDF4i5Bq0xqA9BuYvcqwgBL4WkK4K9BgElrmArskp/JvOfHAIuXwJeE0oyCYYVcveArj8BCAQKBF64eBK4IfBz4DBAwJVBrmBF4KZBvRACgGHXq7tDMIulQoKOBwGAgCQBBYMrSC8AknJ0phDR4gvDOAN6TYouU1kAuZdCYQYCB4YvBd4IBBR4SbDlYvUlclLYqPCEgKbBwIuBqzvDL4TxULwItD0owC5HDAYMrgC9BrouCHgSbCFyYhBFwy/E5NPMAMxkgOEpMG1gvSbYIvBdgRaB5DzDAQOlKoLtEAQJeU/wuBbgQfEeQYGCvRACNokALycAlfCU4OfeAQsCEoRfCK4IKBBgY3BFyWBJYLlBGYLpDMBJeFp8HFyKqBuYaCuaREcYbBCNAwUCwIuSvJYBE4ZhBzwtN4T2BRyUAp4YCD4ZMBYYgwCMpAvRXYK8BFgaKCboYACLQozEOQQuSJIYfGdwqLFAwYvQFwIfCL4gfEG54vORg/I4elAQIJE0gGF5GfCYQJCX5ysHLYgCCLYYQDSYprCkgvM1kAp6sLGCVWgGsF5UrF4IAGpNPlYJIAAQMEBIjAMq0GkqRBAb9cYJgA/AH4A/AH4A/ABA"))
diff --git a/apps/party-parrot.js b/apps/party-parrot.js
new file mode 100644
index 000000000..a62b88bc9
--- /dev/null
+++ b/apps/party-parrot.js
@@ -0,0 +1,22 @@
+var imgs = [
+ atob("qE5xH+AH4A/AH4A/AH4A/AHeBq1WlcAAAUrqwJBwJM/IQJLEABBUBw5N8IotPAAhRHJu+HJolPvWe4XJAAvCz1zkhRDeuuBdIdzzxLGAA+eUwUreeacDJqCkDuah0JwUkJoTiBdg4AJKAZO2z0kA4KjH4RbGUAcAqxOtwJOCHgY6Dp5FEz1PBQUAuYLCvQIDlesJ1eHlaWGJ4YJEzwIDAARlCCYkAwLtucopPH4SdCldWqxmCp5PGlbttGwJPMTwVWrgACW4aqDLwSgqTxBHBkjiE5I/CJwYABNIeeud6KYSgp1iFBTwzoCvQ7BAoQ+CJ4qgCLwS4EUFDuCTwwAHdw4ABXQ4RDd2JPReAV6CQigqaYMkJxpPNuYSId1AyFJ61PCYskgErd25PUeAWsJ8/Cd8Lwow7uRAAITBlZPIvRPIeEjuSAANPCgJOFDpJPCgBPjlcAkhOQ5N6eA5PwwLQIABY8CJ4ptJJ8usGALuSeBCeCNo5iDT0kA4RPSHoUrJwlPDo96BYOBJ0GHTwRPUUAbxBXhYQBlesJ8CACJ63CkhQCAQNzB5DujdoaCKeJ5rLBwTuhZ4VzAQN6J6nJDIQaKf4WHT0TPBFAMkJ6oZDTxDujJwQwCZATwVDISeJvTuhwLtCJIaGLKBwXJEgMr1hOhP4igCp7xWVRTuf1lWEQNzZZAJGADFzdz5ODSpDMBBYLyWAAwgBlaedJwZCJKAUkzzudTzpONZ4gQBzyjYvRPewKPCHhuekhRCKQNzAAJUTNwWsJzsAbx/CvRREDCIADp8AlZPaJyajEudPKYQZTCwJPaJy6mFdyafcJzgAWJ7ROz5NzGYJPWJ2nJvQ0BwJOUw8rJ2fJzxPXqwYBvROxAAI2BqyeUC4NPJ2fJuY4Bw5PSwLt0eAqgTlafCAGo4BleBJ6gA5lZPRqxP7eJY"),
+ atob("qE5xH+AH4A/AH4A/ABOBq0AAAcrq2B1hK/JgcrJogAFmOBwJN9mJMKAAtWdH8rrliAA1cm8GB4b13wLpDm9ixoALsQTCegJO1JoUxJpoADmLy2JwdcJqBQ4wMGGwKcCrgABUQ1irk3mM3MAgZCeONWTolieYZOFIoQAClZdClagydoU3IoVcIYagDLAcGKQcrCYqgu1iDBgyVDHYjkDmKTCwAABAwVcCYiguTwRFDJ5CeCmJIBAAOAdYQTEUFyHCJwbmEJ4ZDCqxPDrlWBAKkDUFyeCm5PEJAcrdwkGJwjsDDINisSmBlesJ9SFCsRPFUQQEDH4WAJwjwCgxmFeFZPCJw4AFUoSfGDQwQCUFOsg0AmJPaWIagCmKhowIsBrhPNMAJPOxs3KFRPCGYgAJlZPQxsxBANWJ8wzCJxqNDwBPICYxQCUEyNBgxPOriMCJwmADYJPHsUGEwOsd003J51iJ5AbKMgZPmrhPOxqWBlbwEdwQbIMgZPjGYViJ57wGdwYbJT9JPQRYSgDNQTuIWgdW66f2xs3RgRQBKoQTKJ4SfjaZg8KHoMxDJpdCJ/LxCAAUxCJqfkd6gABdgQYNJ9VcJ6WNdoU3CBiuCJ8eBaxqPJgy3Olafl/wnBgBPTKAKeNxs3E4OseHZfQE4KgkeAUrJ8eNmJQl1gmBUE0GKAWBJ8HXlZQCsRQkFIdW1hQfqwlCmLxksU3FQUrUT5PDgE3KEiiGJ8AlCKE2NrjzgJ4VimJTCsSipULgfBlYlBm7zDKMx8CKDWBDoNcOwcGKIUGmM3KkShDwLucEwlcKIalCeUQlBlaeamInIrk3lcrVgYAfrigY1i7CcMIAQUDDtCcESgodoUrJ2WNsQ3BqyeWduQAClaHB65OR1kGT2rwXdwVcJ+rwCJ6Tu4J4dWJ6MrCoMxAGxPUCoQA5mLvUAHZIJA=="),
+ atob("qE5xH+AH4A/AH4A/AH4A/AEOswMrgAACleB1hJ/AAeBqxMDAAsrq1WwJN+TQgALKPesTYkyq9eAAtXlhR9TghMBwYAKr0yewZQ1JwcyJphRIqxOzTgZNPAAdXDAShxToZOUUQTyy1hOCdaChKeN6dZAAcseN+BGAMybQgABcg4KKeIZPsJwUrHIczA4L1Fr0yBIQTBBYdeXQK5BBYRPrqxGFxLXCgEsIYoAFJIOJLIdeNASgqTwUzSoZPELIZDCldWAAIMDCYj6BCARQo1iNBdohPIHodcAARQCmSfFCQhQnTwTXBAAjWCHgdXAgNWJ4dcewSaBNooaCqxPmTw4ABrygCmSmDTwigEfoRSBDYYaCUEqeJKIY7DdwwACBIMzDJAVCJ8iEFABbuHeAcsxIVHq6gmGYRONRIRPJlYWMJ0WsaZSfSgAWJljwkwIyBq5PlmQMB1hPhqwlBrxONxLlCd6WDq5PkQQRPOwczCQJPIlmJJ9wkBJ6FeeBAIBmZmMJ/1WDZkyJ++DlkAlbuGDZYNBqxOh/wzNUBieCmQVKCgRPiwJPSHQRQDXRpkDJ8tXJ6A7CeIKeCNJZPm1jUNAA0zKAQCBlhjOJ80rJ6ODljsCTxgSDlesKESHCG5qNHW56gmqxPUwdXCyKzCwJPkRBw9GCqCgClZQhwLZCUCdeCiKzCKEJPDligTACUzFYRQf1krEgTxUKC1WKLxPDgFXKE1eFgZRdqwiDKFMsKL5PCq4kCmZQmKI0rKTGBJ4QjDlleKNqkX1krNgIjBmQgCmZRpmY0BKLCgCJAVXEAcyrwACUlUrKCZPClggDUQYADUs5REKCdWIY1eq7FEq71naYahTUAUyOY7wpKA1WUDQAxmTxUUAUzxODxIAFA4IJCAQg7ODgojGAgYSCwcrKCgVClgA1HAJPTeAQA5lafUAHZIJA"),
+ atob("qE5xH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AdwOBlcAAAsrq2BJn+BqxMHKX5NFJhgAFqxO5TYcruug0HLAAoIBvdQCIZN11icDqBLHAA+gMYRQ0TgcrvhNOAAaiCeWWBTgZNSKAuBJ17rDvZOVeQK4C1hOxdaYAFvbxvdgZOGbgMlLCF8DwSgrJxSKCKALvRUFmslbsJJ4YMG0F1qElld10ATGgGBJ9BOCvaLHHYgNEIoqsBKAIJFUFDtCurbIvhPHcgcrAAL9DBQclUFDtCGQIAJIIUAcYQHDq2ArmAqxsDfIL2BKFAxCvhPK0F7uoODSYVWrgACwBXCLwYQDlaekE4ROKAA97CwJODAAJuCfwYABuqglwKeNAA9QMoJPFrjwDAAjxBlesd0hOSHgeAJwjwDWRCgh1guBqBPTHYKfHOBIIBqxPhEgN7J6yfFJ5VQBILwgwJPWWwJPK0DwpJ66LBd6OgJ8TvXuoXBJ6HLBINWJ8VQJ6d8HYROEwD5BkpP/bYpPFrgIBuoUHqEAlZPiZxAAMHYWAdw18CY91BYOsJ8WgJ6d7UAzuBN5JPCwJPivagUC4MrJwoeJJ4VcJ72BJ4UrJ6igCKALtCqASJqDvhJ4bwVHodWTwQcJ0AQCJz3+QASCMABclDYd1MBmBJ76ABkrYCvZPUR4QABBxInCT0DuCJYJ3CeKt1NJZdClesd0RKBFIbxVqEldtusdwJJDvgqBqDxVTxjtgdwd8Fgd7KC77MT0H+TwLQGKAT4CJ/9WTwxQGupPbd4QABldWq2B1hPbTwwvDVYJRCUbRxDAAhTCJyusSRowEktQAAKhXvd1qBSHKKmBdxIwFuotFUjQjBvgkElZPWlaOCABRPFChwAPEYpPSqy9GAGlWJ6JO7UJgA=="),
+ atob("qE5xH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AtwNWlcAAAUrq2BJP5MJAApS/JoRMJAApR7JotPumfAA10VQlWJ2+AHwZMB4nDABHEz9PeoesJ2icDp5NLKIpkCKGesG4UlJoJOBKJQJBBYT1BeQRQwwJOCTgI/Bb4V0KAxIBp8llb+BCYlWJ2V0IYbzCgBCBJwgKDBoefkoFCUFuBGISWEIglPBI8rAAIYDCYeAJ2hPJcgmArmAqylGJ9ZODz5OEJ5IICq1cAAZQGlZOuJoiWFVQIICcgRPFrhLCuklAgOBJ0+AlZOJJAYABAwgUBJwtcDwMr4itCeE+sJwV0dgoAKU4UrwBPFeARuBUAMr1jslJyhPBIAMlJ5auCeEotCJyRPBMwRPLeAVWJ0eAE4NPJqLvR4iglwIlBFgQATH4ROFJ4qgmFYUAdqRPSWASghTwclJ6qPDJ4srBIIQGwCejT63DksAlZPHp4iD4gQCT0SfXb4ZPFA4N0CIl0eECeCZgSfWeA4hCz4QHJ7usEANPOgQtFeCagDOYV0OIpPCeDruCugkCZoqgUlbtDkpwGB4UAJ7mATYXEQoNPeC3EXYVWTwS/HJ8ErD4IlBeDXDEAQABNxBPfPQTqCEoSgXIIhtJf4ZOawIeBkomDUDYbCNhJPCwBOZwB6Hz8lK4oAT4lPNZRcCwJOheL10DJHEO4LuZdgUAugoHPAQ2JADDubToZOHAATVBBpb6YgGsJy1WdhJQIlYQMTylWJ05QEUQOfejd0EAOBJzElRh/EFwRRDAATuWkrBBJysrbaufKIhqCd1ydCJyZREQYIACDizuWJzLUDdoLyBDSq9CJ6eBJzYAbJ4WsTyuf4gAzT6usCoKfBp4AzlY4BwBPRCoQA5qxPRJ3ZQMA==")
+];
+
+function drawImg (i) {
+ g.drawImage({
+ width: 80, height: 57, bpp: 8,
+ buffer: require("heatshrink").decompress(imgs[i])
+ }, 0, 0, {scale: 3});
+}
+
+var currImg = 0;
+g.clear();
+drawImg(currImg);
+setInterval(function() {
+ currImg = (currImg + 1) % imgs.length;
+ drawImg(currImg);
+}, 200);
diff --git a/apps/party-parrot.json b/apps/party-parrot.json
new file mode 100644
index 000000000..abf950e47
--- /dev/null
+++ b/apps/party-parrot.json
@@ -0,0 +1,5 @@
+{
+ "name":"Party Parrot","type":"app",
+ "icon":"*pparrot",
+ "src":"-pparrot"
+}
\ No newline at end of file
diff --git a/apps/party-parrot.png b/apps/party-parrot.png
new file mode 100644
index 000000000..63af86ae7
Binary files /dev/null and b/apps/party-parrot.png differ
diff --git a/apps/settings-init.js b/apps/settings-init.js
index 661ae26ee..a54dbe9a3 100644
--- a/apps/settings-init.js
+++ b/apps/settings-init.js
@@ -15,12 +15,12 @@ Bangle.HID = E.toUint8Array(atob("BQEJBqEBhQIFBxngKecVACUBdQGVCIEClQF1CIEBlQV1AQ
}
setTimeout(function() {
NRF.setServices({}, adv);
- if (s.ble) NRF.wake();
- else NRF.sleep();
+ // we just reset, so BLE should be on
+ if (!s.ble) NRF.sleep(); // disable advertising if BLE should be off
},10);
- if (!s.vibrate) Bangle.buzz=()=>Promise.resolve();
- if (!s.beep) Bangle.beep=()=>Promise.resolve();
+ if (!s.vibrate) Bangle.buzz=Promise.resolve;
+ if (!s.beep) Bangle.beep=Promise.resolve;
Bangle.setLCDTimeout(s.timeout);
if (!s.timeout) Bangle.setLCDPower(1);
E.setTimeZone(s.timezone);
diff --git a/comms.js b/comms.js
index 0495af095..e0fd19d10 100644
--- a/comms.js
+++ b/comms.js
@@ -11,7 +11,7 @@ uploadApp : app => {
Puck.write("\x03reset();\n", (result) => {
if (result===null) return reject("");
setTimeout(() => { // wait for reset
- Puck.write("\x10E.showMessage('Uploading...')\n"+fileContents+"load()\n",(result) => {
+ Puck.write("\x10E.showMessage('Uploading...')\n"+fileContents+"\x10E.showMessage('Hold BTN3\\nto reload')\n",(result) => {
if (result===null) return reject("");
resolve();
});
@@ -38,7 +38,7 @@ removeApp : app => { // expects an app structure
}).join("");
console.log("removeApp", cmds);
return new Promise((resolve,reject) => {
- Puck.write("\x03"+cmds+"\x10load()\n",(result) => {
+ Puck.write("\x03"+cmds+"\x10E.showMessage('Hold BTN3\\nto reload')\n",(result) => {
if (result===null) return reject("");
resolve();
});
@@ -63,5 +63,21 @@ setTime : () => {
resolve();
});
});
+},
+watchConnectionChange : cb => {
+ var connected = Puck.isConnected();
+
+ //TODO Switch to an event listener when Puck will support it
+ var interval = setInterval(() => {
+ if (connected === Puck.isConnected()) return;
+
+ connected = Puck.isConnected();
+ cb(connected);
+ }, 1000);
+
+ //stop watching
+ return () => {
+ clearInterval(interval);
+ };
}
};
diff --git a/index.html b/index.html
index 5769dea7b..a0a147948 100644
--- a/index.html
+++ b/index.html
@@ -35,6 +35,9 @@
App Loader
+
+
+
An online map loader for Espruino...
+ Scale