From 674cfcbd3ad461b861d4b543c1ed9430ea156345 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Thu, 7 Sep 2023 22:36:18 +0100 Subject: [PATCH 01/51] Created app.js --- apps/Tyreid/app.js | 272 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 apps/Tyreid/app.js diff --git a/apps/Tyreid/app.js b/apps/Tyreid/app.js new file mode 100644 index 000000000..8490a8b97 --- /dev/null +++ b/apps/Tyreid/app.js @@ -0,0 +1,272 @@ +//---------------------------- Tyreid ----------------------------// +// +// Bluetooth war-driving app for the Bangle.js 2 +// +// TH10111 2023 +// + +Bangle.loadWidgets(); +Bangle.drawWidgets(); // <-- for development only (shouldn't need for a real app) + +// Global variables +var gpsFix_flag = 0; +var bt_id_arr = []; +var num_bt_devices = 0; +var running_flag = 0; // 0 = stopped, 1 = running, 2 = paused + +// Log file +var file = require("Storage").open("tyreid_log.csv","w"); + +// Logo +var logo = { + width : 176, height : 176, bpp : 2, + buffer : atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC///QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC////QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv/////QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///v//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+f//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+/4f//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//b/gf//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/8v+Af//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//C/4Af//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4L/gAf//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC//Av+AAb//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/0C/0AAb//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AP/QAAb//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/wA/9AAAb//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AD/0AAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv/gAP/QAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AA/9AAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAD/0AAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/8AAP/QAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAA/9AAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAD/0AAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAP/QAAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAA/9AAAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/+AAAD/0AAAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/wAAAP/QAAAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAA/9AAAAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv/wAAAD/0AAAAAAAL//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8AAAAP/QAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAA/9AAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAD/0AAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAP/QAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/4AAAAA/9AAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAAAD/0AAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAP/QAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC//AAAAAA/9AAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wAAAAAD/0AAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAP/QAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/wAAAAAA/9AAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9AAAAAAD/0AAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv/gAAAAAAP/QAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/8AAAAAAA/9AAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//QAAAAAAD/0AAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/8AAAAAAAP/QAAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAAAAAA/8AAAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AAAAAAAD/wAAAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAAAAAAP/AAAAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/0AAAAAAAA/8AAAAAAAAAAAAAAH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAD/wAAAAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAf/wAAAAAAAAP/AAAAAAAAAAAAAAAH//QAAAAAAAAAAAAAAAAAAAAAAAAAAAv9AAAAAAAAA/8AAAAAAAAAAAAAAAv/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAD/wAAAAAAAAAAAAAAP//0AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAP/AAAAAAAAAAAAAAH//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAB///QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAAAAAv//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAP//5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAH//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAAAB///QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAv//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAL//5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAAD//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAB///QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAf//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAL//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAAD//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAAB///QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAf//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAAH//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAC//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAABv/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAAf//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAL//4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAH//9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAv/+QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAC//kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAH/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAAAAAH/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAL/5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAf/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAv/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAv/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAB//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAB//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAC/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAG/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAH/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAH/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAL/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAf/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAf/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAv/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAv/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAB//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAC/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAH/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAH/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAL/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAL/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAf/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAv/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAv/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAC/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAH/0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+AAAAAAAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==") +}; + + +// +// Functions +// + +function gpsTick(fix) { // GPS fix callback + //console.log(fix); // print GPS Fix info to console + if (fix.fix > 0) { + gpsFix_flag = 1; + } else { + gpsFix_flag = 0; + } + WIDGETS["widTyreid"].draw(WIDGETS["widTyreid"]); // update widget with gps tick + Bangle.drawWidgets(); // Not sure why I need this here, but otherwise the widget draws over itself without clearing first! +} + +function gpsON() { // Turn GPS on + Bangle.on('GPS',gpsTick); + Bangle.setGPSPower(true); +} + +function gpsOFF() { // Turn GPS off + Bangle.setGPSPower(false); +} + +function btPacket(packet) { // BT packet callback + let latest_fix = Bangle.getGPSFix(); + let mac = packet.id.substring(0,17); + let mac_info = packet.id.substring(18); + +// console.log(" "); +// console.log(packet); // print packet info + //console.log(mac); + //console.log(5*latest_fix.hdop); // print latest GPS fix info +// console.log(" "); + + // Compile the values to be stored + var new_data = [ + latest_fix.time, + latest_fix.lat, + latest_fix.lon, + latest_fix.alt, + latest_fix.hdop*5, + packet.name, + mac, + mac_info, + packet.manufacturer, + packet.rssi, + packet.services, + packet.data, + packet.serviceData, + packet.manufacturerData + ]; + // Write data to the file (including a new line) + file.write(new_data.join(",")+"\n"); + + if (num_bt_devices < 99) { + if (!bt_id_arr.includes(mac)) { // if device id has not been recorded + bt_id_arr[num_bt_devices] = mac; // note the id + num_bt_devices++; // increment the number of devices found + // Add the new device to the devices menu, with information... + //console.log(" "); + //console.log(mac); + //console.log(packet.manufacturer); + //console.log(latest_fix.time); + //console.log(packet.rssi); + //console.log(" "); + // Add the new device to the devices menu, with information... + device_menu[mac] = () => { + E.showPrompt([mac,mac_info],{title:"MAC",buttons:{"Ok":true}}).then(function(v){ + E.showPrompt(packet.manufacturer,{title:"Manufacturer",buttons:{"Ok":true}}).then(function(v){ + E.showPrompt(latest_fix.time,{title:"First Seen",buttons:{"Ok":true}}).then(function(v){ + E.showPrompt(packet.rssi,{title:"RSSI",buttons:{"Ok":true}}).then(function(v){ + E.showMenu(device_menu); + }); + }); + }); + }); + }; + } + } +} + +function headings() { // Add headings to the file + // Compile the values to be stored + var new_data = [ + "Time", + "Latitude", + "Longitude", + "Altitude", + "Accuracy", + "Name", + "MAC", + "MAC Info", + "Manufacturer", + "RSSI", + "Services", + "Data", + "Service Data", + "Manufacturer Data" + ]; + // Write data to the file (including a new line) + file.write(new_data.join(",")+"\n"); +} + +function btON() { // Turn Bluetooth on + NRF.setScan(btPacket); +} + +function btOFF() { // Turn Bluetooth off + NRF.setScan(); +} + +function start() { // Start the application + bt_id_arr = []; + headings(); + num_bt_devices = 0; + btON(); + running_flag = 1; + E.showMenu(running_menu); +} + +function exit() { // Exit the application + gpsOFF(); + btOFF(); + running_flag = 0; + load(); +} + +function pause() { // Pause the application + btOFF(); + running_flag = 2; + //console.log(bt_id_arr); + E.showMenu(pause_menu); +} + +function resume() { // Continue after pause + btON(); + running_flag = 1; + E.showMenu(running_menu); +} + +function marker() { // add a marker packet to the log + let latest_fix = Bangle.getGPSFix(); + +// console.log(" "); +// console.log("MARKER"); // print packet info +// console.log(" "); + + // Compile the values to be stored + var new_data = [ + latest_fix.time, + latest_fix.lat, + latest_fix.lon, + latest_fix.alt, + latest_fix.hdop, + "MARKER" + ]; + + // Write data to the file (including a new line) + file.write(new_data.join(",")+"\n"); + + // Indicate that the marker has been added + E.showMessage("Marker Added."); + + // Back to the menu + if (running_flag == 0) { + E.showMenu(init_menu); + } else if (running_flag == 1) { + E.showMenu(running_menu); + } else { + E.showMenu(pause_menu); + } +} + +setWatch(() => { // If the button is pressed, then add a marker + marker(); +}, BTN1, {repeat:true}); + +WIDGETS["widTyreid"]={ + area:"tl", // tl (top left), tr (top right), bl (bottom left), br (bottom right) + width: 24, // width of the widget + draw: function() { + let disp_dev_val = "-"; + g.reset(); // reset the graphics context to defaults (color/font/etc) + if (gpsFix_flag == 1) { + g.setColor(0,1,0); // green + } else { + g.setColor(1,0,0); // red + } + if (num_bt_devices < 99) { + disp_dev_val = num_bt_devices.toString(); + } else { + disp_dev_val = "99+"; + } + g.setFont("6x8",3); + g.drawString(disp_dev_val, this.x+24/2, this.y); + } + }; + + +let init_menu = { + "": { "title": "Tyreid" }, + "Start": function() { start(); }, + "Marker": function() { marker(); }, + "Exit": function() { exit(); }, +}; + +let running_menu = { + "": { "title": "[Running]" }, + "Pause": function() { pause(); }, + "Marker": function() { marker(); }, + "Exit": function() { exit(); }, +}; + +let pause_menu = { + "": { "title": "[Paused]" }, + "Continue": function() { resume(); }, + "Devices": function() { E.showMenu(device_menu); }, + "Marker": function() { marker(); }, + "Exit": function() { exit(); }, +}; + +let device_menu = { + "": { "title": "Devices:" }, + "Back": function() { + if (running_flag == 0) { + E.showMenu(init_menu); + } else if (running_flag == 1) { + E.showMenu(running_menu); + } else { + E.showMenu(pause_menu); + } + }, +}; + + +// Main +gpsON(); // turn GPS on straight away to start trying for a fix +g.setColor(1,1,1).fillRect(0,0,176,176); +g.drawImage(logo,0,0); // splash screen +// 2sec wait before starting initial menu +setTimeout(function () { + E.showMenu(init_menu); +}, 2*1000); + + From 5f589ad2474d678c223be700d735a42411af7b9c Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Thu, 7 Sep 2023 22:48:43 +0100 Subject: [PATCH 02/51] Created app-icon.js --- apps/Tyreid/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/Tyreid/app-icon.js diff --git a/apps/Tyreid/app-icon.js b/apps/Tyreid/app-icon.js new file mode 100644 index 000000000..503a87b59 --- /dev/null +++ b/apps/Tyreid/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("MDACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAtAAAAAAAAAAAAAAB/QAAAAAAAAAAAAAD/0AAAAAAAAAAAAAH+9AAAAAAAAAAAAAPtfQAAAAAAAAAAAAudH0AAAAAAAAAAAB8tB9AAAAAAAAAAAD0tAfQAAAAAAAAAAHgtAH0AAAAAAAAAAPAtAB9AAAAAAAAAAtAtAAfQAAAAAAAAB8AtAAH0AAAAAAAAD0AtAAB9AAAAAAAALgAtAAAfQAAAAAAAfAAtAAAH0AAAAAAA9AAtAAAB9AAAAAAC4AAtAAAAfQAAAAADwAAtAAAALwAAAAAAQAAtAAAAvgAAAAAAAAAsAAAC9AAAAAAAAAAsAAAP0AAAAAAAAAAsAAB/AAAAAAAAAAAsAAH4AAAAAAAAAAAsAAvQAAAAAAAAAAAsAD9AAAAAAAAAAAAsAD0AAAAAAAAAAAAsAB8AAAAAAAAAAAAsAAtAAAAAAAAAAAAsAAPQAAAAAAAAAAAsAAHwAAAAAAAAAAAsAAC4AAAAAAAAAAAsAAA9AAAAAAAAAAAsAAAPAAAAAAAAAAAsAAAHgAAAAAAAAAA8AAAC0AAAAAAAAAA8AAAA8AAAAAAAAAA8AAAAEAAAAAAAAAA8AAAAAAAAAAAAAAA8AAAAAAAAAAAAAAA8AAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")) From 2129518bac3c589e15a540a5ad3815d71d0648c0 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Thu, 7 Sep 2023 22:52:54 +0100 Subject: [PATCH 03/51] Create metadata.json --- apps/Tyreid/metadata.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apps/Tyreid/metadata.json diff --git a/apps/Tyreid/metadata.json b/apps/Tyreid/metadata.json new file mode 100644 index 000000000..c84c04113 --- /dev/null +++ b/apps/Tyreid/metadata.json @@ -0,0 +1,14 @@ +{ "id": "Tyreid", + "name": "Tyreid", + "shortName":"Tyreid", + "version":"0.01", + "description": "Bluetooth war-driving app for Bangle.js 2", + "icon": "Tyreid.img", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"Tyreid.app.js","url":"app.js"}, + {"name":"Tyreid.img","url":"app-icon.js","evaluate":true} + ] +} From 8ba28925da3204b98ebd62b4c22b1ccb1fd1c689 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Thu, 7 Sep 2023 23:08:25 +0100 Subject: [PATCH 04/51] Update metadata.json --- apps/Tyreid/metadata.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/Tyreid/metadata.json b/apps/Tyreid/metadata.json index c84c04113..20f605c4a 100644 --- a/apps/Tyreid/metadata.json +++ b/apps/Tyreid/metadata.json @@ -6,7 +6,6 @@ "icon": "Tyreid.img", "tags": "", "supports" : ["BANGLEJS2"], - "readme": "README.md", "storage": [ {"name":"Tyreid.app.js","url":"app.js"}, {"name":"Tyreid.img","url":"app-icon.js","evaluate":true} From 7fc876f747d953f3f4b01ac9e1c5361f5841fe49 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Fri, 8 Sep 2023 06:47:52 +0100 Subject: [PATCH 05/51] Create README.md --- apps/Tyreid/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/Tyreid/README.md diff --git a/apps/Tyreid/README.md b/apps/Tyreid/README.md new file mode 100644 index 000000000..8178c76d6 --- /dev/null +++ b/apps/Tyreid/README.md @@ -0,0 +1 @@ +readme From 1c693d85f8a82527ed8347c2789a1042331c51be Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Fri, 8 Sep 2023 07:03:47 +0100 Subject: [PATCH 06/51] Update README.md --- apps/Tyreid/README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/Tyreid/README.md b/apps/Tyreid/README.md index 8178c76d6..28647e569 100644 --- a/apps/Tyreid/README.md +++ b/apps/Tyreid/README.md @@ -1 +1,17 @@ -readme +Tyreid + +Tyreid is a Bluetooth war-driving app for the Bangle.js 2. + +Menu options: +- Start: This turns on the Bluetooth and starts logging Bluetooth packets with time, latitude, and longitude information to a CSV file. +- Pause/Continue: These functions pause the capture and then allow it to resume. +- Devices: When paused this menu option will display the MAC addresses of discovered Bluetooth devices. Selecting a device will then display the MAC, Manufacturer code, the time it was first seen, and the RSSI of the first sighting. +- Marker: This command adds a 'marker' to the CSV log, which consists of the time and location information, but the Bluetooth packet information is replaced with the word MARKER. Markers can also be added by pressing the watch's button. +- Exit: This exits the app. + +The current number of discovered devices is displayed in the top left corner. + +To retrieve the CSV file, connect to the watch through the Espruino web IDE (https://www.espruino.com/ide/). From there the files stored on the watch can be downloaded by clicking the storage icon in the IDE's central column. + + + From f4cd093fb0c4f0661c441cadaf96af370e1717fc Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Fri, 8 Sep 2023 07:04:21 +0100 Subject: [PATCH 07/51] Update metadata.json --- apps/Tyreid/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/Tyreid/metadata.json b/apps/Tyreid/metadata.json index 20f605c4a..c84c04113 100644 --- a/apps/Tyreid/metadata.json +++ b/apps/Tyreid/metadata.json @@ -6,6 +6,7 @@ "icon": "Tyreid.img", "tags": "", "supports" : ["BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"Tyreid.app.js","url":"app.js"}, {"name":"Tyreid.img","url":"app-icon.js","evaluate":true} From 2697c544f030199c967af0d6729d2bc54ef6344d Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Sun, 10 Sep 2023 20:32:17 +0100 Subject: [PATCH 08/51] Update app.js --- apps/Tyreid/app.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/Tyreid/app.js b/apps/Tyreid/app.js index 8490a8b97..8ab63cabd 100644 --- a/apps/Tyreid/app.js +++ b/apps/Tyreid/app.js @@ -207,21 +207,21 @@ WIDGETS["widTyreid"]={ width: 24, // width of the widget draw: function() { let disp_dev_val = "-"; - g.reset(); // reset the graphics context to defaults (color/font/etc) - if (gpsFix_flag == 1) { - g.setColor(0,1,0); // green - } else { - g.setColor(1,0,0); // red - } + if (num_bt_devices < 99) { disp_dev_val = num_bt_devices.toString(); } else { disp_dev_val = "99+"; } + g.setFont("6x8",3); - g.drawString(disp_dev_val, this.x+24/2, this.y); - } - }; + if (gpsFix_flag == 1) { + g.setColor(0,1,0).drawString(disp_dev_val, this.x+24/2, this.y); // green + } else { + g.setColor(1,0,0).drawString(disp_dev_val, this.x+24/2, this.y); // red + } + } +}; let init_menu = { From 0474abef3bb7169a8018c92afd4ca1278e1eac76 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Sun, 10 Sep 2023 20:32:37 +0100 Subject: [PATCH 09/51] Update metadata.json --- apps/Tyreid/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/Tyreid/metadata.json b/apps/Tyreid/metadata.json index c84c04113..adb9c459d 100644 --- a/apps/Tyreid/metadata.json +++ b/apps/Tyreid/metadata.json @@ -1,7 +1,7 @@ { "id": "Tyreid", "name": "Tyreid", "shortName":"Tyreid", - "version":"0.01", + "version":"0.02", "description": "Bluetooth war-driving app for Bangle.js 2", "icon": "Tyreid.img", "tags": "", From 1438501215c1e559173bf172272cf8485f371a0d Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:26:52 +0100 Subject: [PATCH 10/51] Update README.md --- apps/Tyreid/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/Tyreid/README.md b/apps/Tyreid/README.md index 28647e569..5c205ab57 100644 --- a/apps/Tyreid/README.md +++ b/apps/Tyreid/README.md @@ -10,6 +10,7 @@ Menu options: - Exit: This exits the app. The current number of discovered devices is displayed in the top left corner. +This value is displayed in green when the GPS has a fix, or red otherwise. To retrieve the CSV file, connect to the watch through the Espruino web IDE (https://www.espruino.com/ide/). From there the files stored on the watch can be downloaded by clicking the storage icon in the IDE's central column. From 421302eac51d83f2c7c39394848f2e7c869b4da5 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 1 Nov 2023 01:59:56 -0400 Subject: [PATCH 11/51] added approxclock --- apps/approxclock/app-icon.js | 1 + apps/approxclock/app.js | 125 ++++++++++++++++++++++++++++++++ apps/approxclock/app.png | Bin 0 -> 2033 bytes apps/approxclock/metadata.json | 16 ++++ apps/approxclock/screenshot.png | Bin 0 -> 1968 bytes 5 files changed, 142 insertions(+) create mode 100644 apps/approxclock/app-icon.js create mode 100644 apps/approxclock/app.js create mode 100644 apps/approxclock/app.png create mode 100644 apps/approxclock/metadata.json create mode 100644 apps/approxclock/screenshot.png diff --git a/apps/approxclock/app-icon.js b/apps/approxclock/app-icon.js new file mode 100644 index 000000000..d63ad4b1f --- /dev/null +++ b/apps/approxclock/app-icon.js @@ -0,0 +1 @@ +atob("MDAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArgVYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABW19cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrNcrAACBVoGsVgAAgVaBrFYAAKzXK4GsKwAAgayBAAAAgVYAVoEAAAAAAAAAAADXVqyBAACs14Gs1ysArNeBrNcrAIHX14HXgQCB14HXrAAAVtdW11YAAAAAAAAAAFbXK4GsAACs1wAr11YArNcAK9dWAADXrABWVgDXgQCB1wAAAKzXgQAAAAAAAAAAAKzXrNfXKwCs1wAA14EArKwAK9dWAADXVgAAAADXgQBW1ysAAIHXVgAAAAAAAAAAANfXgYHXVgCs11aB11YArNcrgddWACvXgSsAAACsrCus1wAAK9es1ysAAAAAAAAAK9dWAACsrACsrKzXrAAArKzX16wAVtfX16wAAAAr19fXKwAArKwArKwAAAAAAAAAAAAAAAAAAACsrAArAAAArIEAKwAAAAAAAAAAAAAAACsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrAAAAAAArIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWVgAAAAAAVlYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArVoErAAAAAAAAAAAAAAAAAAAAAAArVgAAAAAAAAAAAAAAAAAAAAAAAAArrNfXgQCBrNdWAAAAAAAAAAAAAAAAAAAAAABW1wAAAAAAAAAAAAAAAAAAAAAAACvXrCtWgQAAANdWAAAAAAArKwAAAAAAACsAAABW1wAAAAAAAAAAAAAAAAAAAAAAAFbXKwAAAAAAANdWAAAAAIHX16wAAACB19fXVgBW1wAA14EAAAAAAAAAAAAAAAAAAIGsAAAAAAAAANdWAAAAK9eBVteBACvXgSuBVgBW1wBW1ysAAAAAAAAAAAAAAAAAAIHXAAAAAAAAANdWAAAAVtcrAKyBAFbXKwAAAABW16zX1wAAAAAAAAAAAAAAAAAAAFbXVgAAAAAAANeBAAAAVtcrANeBAFbXKwAAAABW14HXrAAAAAAAAAAAAAAAAAAAAACs14GBrAAAAKzXrIEAK9esrNdWACvX14GBVgBW1wAr11YAAAAAAAAAAAAAAAAAAAAAVoGBgQAAACusrIEAACusrFYAAAArgaysVgBWgQAAgYEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") \ No newline at end of file diff --git a/apps/approxclock/app.js b/apps/approxclock/app.js new file mode 100644 index 000000000..c172891bf --- /dev/null +++ b/apps/approxclock/app.js @@ -0,0 +1,125 @@ +//load fonts +require("FontSinclair").add(Graphics); +require("FontTeletext5x9Ascii").add(Graphics); + +//const + +const numbers = { + "0": "Twelve", + "1": "One", + "2": "Two", + "3": "Three", + "4": "Four", + "5": "Five", + "6": "Six", + "7": "Seven", + "8": "Eight", + "9": "Nine", + "10": "Ten", + "11": "Eleven", + "12": "Twelve", + "13": "One", + "14": "Two", + "15": "Three", + "16": "Four", + "17": "Five", + "18": "Six", + "19": "Seven", + "20": "Eight", + "21": "Nine", + "22": "Ten", + "23": "Eleven", + "24": "Twelve", +}; + +const width = g.getWidth(); +const height = g.getHeight(); +let idTimeout = null; + +const getMinuteString = (minutes) => { + if (minutes >= 10 && minutes < 20){ + return "Fifteen"; + } + else if (minutes >= 20 && minutes < 40) { + return "Thirty"; + } + else if (minutes >= 40 && minutes < 50){ + return "Fourty-Five"; + } + else { + return "O'Clock"; + } +}; + +const getNearestHour = (hours, minutes) => { + if (minutes > 49){ + return hours + 1; + } + return hours; +}; + +const getApproximatePrefix = () => { + var date = Date(); + var minutes = date.getMinutes(); + + if(minutes === 0 || minutes === 15 || minutes === 30 || minutes === 45){ + return " exactly"; + } + else{ + return " about"; + } +}; + +const drawTime = () => { + //Grab time vars + var date = Date(); + var hour = date.getHours(); + var minutes = date.getMinutes(); + + //reset graphics + g.clear(); + g.reset(); + + g.setColor(0,0,0); + g.fillRect(0, 0, width, height); + g.setFont("Vector", 24); + g.setColor(1,1,1); + g.drawString("It's about", (width - g.stringWidth("It's" + getApproximatePrefix()))/2, height * 0.2, false); + g.setFont("Vector", 24); + g.drawString(numbers[getNearestHour(hour, minutes)], (width - g.stringWidth(numbers[getNearestHour(hour, minutes)]))/2, height * 0.4, false); + g.setFont("Vector", 24); + g.drawString(getMinuteString(minutes), (width - g.stringWidth(getMinuteString(minutes)))/2, height * 0.6, false); + let d = Date(); + let t = d.getSeconds()*1000 + d.getMilliseconds(); + idTimeout = setTimeout(drawTime, 60000 - t); +}; + +g.clear(); +drawTime(); + +Bangle.on('lcdPower', function(on){ + if (on) { + drawTime(); + } else { + if(idTimeout) { + clearTimeout(idTimeout); + } + } +}); + +//var secondInterval = setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on +//Bangle.on('lcdPower',on=>{ +// if (secondInterval) clearInterval(secondInterval); +// secondInterval = undefined; +// if (on) { +// secondInterval = setInterval(draw, 1000); +// g.clear(); +// draw(); // draw immediately +// } +//}); + +// Show launcher when button pressed +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/approxclock/app.png b/apps/approxclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fd8db831ba915b2b86e27c9a89f9dee144a12a GIT binary patch literal 2033 zcmVEzLt>Nxhg23=knh3@O#hiaPGNa4ds-)-ZKyRLP-k;1D@5`n#b{u z6AN}GnTRX8x)fQA(lve_rB>p>Z}#e5*D;*Ql&*lKS9n%YwUV$*Lujj{n!G1GsAS_w z;S*t>CIbrJntGzaZzg9N{AIEh4KIMz?CHt0aiWcttdZ#!i6cW+ygpIO(lsSHEqY3x92Il# z|M#h-Ga8ph`+IQF4dHH_a=!>FBs?FFt2Eq_t=H1{ofwWWEF!My{QH!Ur3 z09U&(^sL6UcwMr|v8L1TaRL1?7`TVN^~SE6_nbdLbX$JW9ULCPnAE#B{s1=tXd@SA z#3ld$010qNS#tmY4`BcR4`BhQKc{H`00t>ZL_t(&1?^W`NLE`A9?i0gMyBK~BfH^4 zq7PCp32ODwMeL%zln+KAh6UOM!5$8Q4+$Am4`o4wbfN4D+0DulQM){p4~3cdP?8m< z-OS47%r~61&;IxS|DKM&D8j#B?>(0_v)0V4*=r_%h*+L6I|9e-&i~oC-+9p${}J-hfj*1-BjB?OeN^C&fR7IJS=?g;=FXimC;tzse@M~&nC^k0M;vYSFl%70!LRD2&6crVv z^oWQEx^(Fhi8B@7wQCn$xNw1>&pBK?ESu&ZKYs9*EnB#)t&J-xDlGnu8#gpE7cX99 zSy166OO_~K3|3r@9=Ei#D4dj(#8anEWzaBsdwcoBi4*+u=TA%T`Sa)b`}gmB^5jYW z^yw4V*VkL?$) z6E7N$_ua1rmh2On?pFNc$B+7jPQbr^|E5Qe z9?|mU%jxms$GWagaJ($5V4)dDjvQe*bBb=;woT`l2&`SZmiO)3r@W0DH!9B@q1CHb z^PxkBl$V*A$?zs<7_xC*uwa3;p6r94J$uGtIImc-f}cKp%Hkl640tIiDSDi*UAv}{ zN={C8k;NR?ViC=;*tBVrMT64o*RLxM10;F*&6_v6AxTc2IB}x#V8H$R_xZzz56VO6 z$B!S+Yu2n$+`OQ}z9x>FL{r(w0T>JZv}x10y}h09-o2{^VXfBIR?R89yukk&5EK-| zNaAth##xKVF<=R);#j<{u8t>9p3KM*oKYhW11?{_tn#yG&$iAhbRvwr%2 ztUewEgeZR@dinCD3){ID`7;t8=Wt76=L9>B|FC$#PO{+Br%#hyd=@@ZK!7ZSkc`>k z@g^Qi*7yw=?Pz(i>}zFJ4UP>FHEn zUaq(BpGv#@S4GGLU%GUuULd$>(_b#m6VjY$T)TUDK2G<>T~|< z2a_K(2V!Dk=<3z0TC1QG-mqZ~z&9rFI zBHF%vy9%PRloDK37zwS#CJZE zjS5N>Ncss9kCUOn7z}h;l0$Uo&K zLHAto*w;1M@Q?|(+e#qMpsvt$NX{1cs*mN03~U)t&{$g zrJv=SH*dPk2VaUiMm2iw+&Se*a_jj;H+S#eJw59=IXTLc9|KDR!(s@d6NAq6>(?vK zo&%c;^X5r!iY2;H1g=sq)#TP{b|OG8H6ZG8E>uU1pLLE z(<38|51Payy_un`=Qm&|UK>sse*}ipn?up%kHAp8Hk>m42n?q;hob9m2i#}3?cdnh P00000NkvXXu0mjfZ+GlH literal 0 HcmV?d00001 diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json new file mode 100644 index 000000000..e639a2215 --- /dev/null +++ b/apps/approxclock/metadata.json @@ -0,0 +1,16 @@ +{ "id": "approxclock", + "name": "Approximate Clock", + "shortName" : "Approx Clock", + "icon": "app.png", + "description": "A really basic spelled out time display for people looking for the vague time at a glance.", + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"approxclock.app.js","url":"app.js"}, + {"name":"approxclock.img","url":"app-icon.js","evaluate":true} + ], + "screenshots": [ + {"url": "screenshot.png"} + ] +} \ No newline at end of file diff --git a/apps/approxclock/screenshot.png b/apps/approxclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fe13bbe3303c491f9edaaebc9df1c28103da8e3f GIT binary patch literal 1968 zcmd6o`#02i7{@=~`5H5kOSOqK!>%q{k!dwa%@8re){=^Blk2vsQBjj=810OXA}zzI zr8;6agqTsAL1BDLn@OTchLrJD2~BfxnHiU2?VqrFPUq|o&-4E2{XXY8=Xsyk`JMiB zGn1tz001*TU+-OWdh4IT8_(^^ns;Gy014D+&%a?u|X2{3FViBe!GnVn)p>Pa3t8hfvk;-2q0p3!qNgE z*{cB9-kiz-=b*zl5VG0*AxxV8h}yH_+LE zix|zP#mb~}ygj+`EE*F+v%Lu{VR(=WASVA6_`qNpld-U6Xd*O~?0n*!KTdyxOKQV( zPy1+mzdxF>Fhv%gAtUcoGVamjS0F=*v?SCk%5=TSEnJ!lDvWQHTRkw953!NDw$i~4 zJbB%vg=jzk?Y`Kais@ft&6Pta;>6KeJ(xPNIBO>Mkj3(Vd>DaDM4)>Nd#K3P!{!n3 zD4^J&f!k^<1$y4VJkPB&m5cBi_dB?X^7ou-TA-lKnm0|XHBeZtO&w(6PbE@u{VIa+ zcs2{oSry(djele~HdirW)Am~D;{5;st?)UAg@+w%6E~b^aZdTkeVtja$)~Oy>!GVsr9=}-Ce37~&pe20fPq5z`kL=q4lR(S@MkyBc z+5gy|Z%#982_QV)@0KgHIK?jNGn@&zZP4 zjiR}#B3mlxt|{X*_ErigFw)8x1Yv_lDoNyHAD00Ng!XKFGc>>j6ipZu0rKe`W_vNH zAK*$jzfD$4(r%yC_RRxH-yya|vQv{75|}2`0yOxPIw6@ncz+g0!{y`S%w8xQNXovo zEb~^kIPrGIDx=_-*lV5oynb2@F{gU5M+sbcnR)#x*c8~kHpc{6d*f>9O5p#MKD`*D zO)pz{a~^-u*@mbxP#<;kJQIU@M^=Wc0sqyK198UBwe^5jt)uI>@1MYw z(T|s1Q3bia%V5;$@?NduZlDiJF-JUumIf+s1tWzqAzgxViwQi#RA2-3?Fy)x$gXnl z%NUjL`a8PiyB|$omfC*H#aw8G&@{%9Or6?Cczgk0STi(!a^j8?jNT!rYbDs96CM|i z2>FFERV}r)zt?qX(p)J%$4q7L-VM@xGP8}_)!Url@71Cb7*y`Enx<60dxy_#Kom%W zeS-c`c3wq%16S8hc3{;rmRAb0dn%WjB8y9$wDtWQ=w@hp&u;EqUwm7%$A~}+1HHsU zXnf$Lz(e_dT=DRr07h+ro*k{p&a3GV89NhdWyEN#3R^C2)?q$Uu~&k+UWSrSoE|p+ zbQ&kAS(wSYe*fBOll65l7tAbsJJLEjzPiBKBF^GhDvO!yUIyn*1t*7?qfU6|2*q)$ zB>J_Pq4|b2e5&#zc|6a}qxe;DK-flNzT-1EcQ3C Date: Wed, 1 Nov 2023 02:06:46 -0400 Subject: [PATCH 12/51] edit to metadata --- apps/approxclock/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json index e639a2215..3d08a41b0 100644 --- a/apps/approxclock/metadata.json +++ b/apps/approxclock/metadata.json @@ -1,6 +1,7 @@ { "id": "approxclock", "name": "Approximate Clock", "shortName" : "Approx Clock", + "version": "0.1", "icon": "app.png", "description": "A really basic spelled out time display for people looking for the vague time at a glance.", "type": "clock", From 60a7cbcf5b346be9afee75c269076f3ec386815b Mon Sep 17 00:00:00 2001 From: Gabriele Monaco Date: Wed, 1 Nov 2023 11:07:00 +0100 Subject: [PATCH 13/51] cards: hiding widgets while showing the code --- apps/cards/app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/cards/app.js b/apps/cards/app.js index dcef7da76..33b4c9e15 100644 --- a/apps/cards/app.js +++ b/apps/cards/app.js @@ -18,9 +18,8 @@ Bangle.drawWidgets(); const WHITE=-1 const BLACK=0 -var FILE = "android.cards.json"; - -var Locale = require("locale"); +const Locale = require("locale"); +const widget_utils = require('widget_utils'); var fontSmall = "6x8"; var fontMedium = g.getFonts().includes("6x15")?"6x15":"6x8:2"; @@ -90,6 +89,7 @@ function printLinearCode(binary) { } function showCode(card) { + widget_utils.hide(); E.showScroller(); // keeping it on rising edge would come back twice.. setWatch(()=>showCard(card), BTN, {edge:"falling"}); @@ -151,6 +151,7 @@ function showCard(card) { var titleColor = g.theme.fg2; if (card.color) titleColor = isLight(titleBgColor) ? BLACK : WHITE; + widget_utils.show(); E.showScroller({ h : g.getFontHeight(), // height of each menu item in pixels c : lines.length, // number of menu items From 4c2170f9c5e476a036dec9a2d2ea33c9ba4f5ea2 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 1 Nov 2023 17:57:50 +0000 Subject: [PATCH 14/51] astral: setUI before loading widgets This fixes the sanity check warning: ``` Clock astral file calls loadWidgets before setUI (clock widget/etc won't be aware a clock app is running) ``` --- apps/astral/ChangeLog | 1 + apps/astral/app.js | 4 ++-- apps/astral/metadata.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/astral/ChangeLog b/apps/astral/ChangeLog index 17b623677..e77aa2ca2 100644 --- a/apps/astral/ChangeLog +++ b/apps/astral/ChangeLog @@ -5,3 +5,4 @@ 0.05: Added adjustment for Bangle.js magnetometer heading fix 0.06: optimized to update much faster 0.07: added support for bangle.js 2 +0.08: call setUI before loading widgets to indicate we're a clock diff --git a/apps/astral/app.js b/apps/astral/app.js index 88f3f7e0d..7c8f5512a 100644 --- a/apps/astral/app.js +++ b/apps/astral/app.js @@ -850,6 +850,8 @@ g.setBgColor(0, 0, 0); g.fillRect(0, 0, 175, 175); current_moonphase = getMoonPhase(); +Bangle.setUI("clock"); + // Load widgets Bangle.loadWidgets(); Bangle.drawWidgets(); @@ -865,8 +867,6 @@ Bangle.setGPSPower(1); var secondInterval; -Bangle.setUI("clock"); - autoUpdate(); setWatch(SwitchSensorState, BTN1, { repeat: true }); diff --git a/apps/astral/metadata.json b/apps/astral/metadata.json index 4b4922169..16696056f 100644 --- a/apps/astral/metadata.json +++ b/apps/astral/metadata.json @@ -1,7 +1,7 @@ { "id": "astral", "name": "Astral Clock", - "version": "0.07", + "version": "0.08", "description": "Clock that calculates and displays Alt Az positions of all planets, Sun as well as several other astronomy targets (customizable) and current Moon phase. Coordinates are calculated by GPS & time and onscreen compass assists orienting. See Readme before using.", "icon": "app-icon.png", "type": "clock", From 40968a24fc84a4327407031c5ad5bf46f4ce218e Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 19:36:21 -0700 Subject: [PATCH 15/51] add cadence to gpx data --- apps/recorder/interface.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index f2774c79f..f47171a01 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -95,17 +95,29 @@ function saveGPX(track, title) { ${title} `; + let lastTime = 0; track.forEach(pt=>{ + let cadence; + if (!pt.Steps || lastTime === 0){ + + } else { + cadence = pt.Steps * 60000 / (pt.Time.getUTCMilliseconds() - lastTime); + } + lastTime = pt.Time.getUTCMilliseconds(); + gpx += ` ${pt.Altitude} - ${pt.Heartrate ? `${pt.Heartrate}`:``}${""/*...65*/} + ${pt.Heartrate ? `${pt.Heartrate}`:``} + ${cadence ? `${cadence}`:``} + ${""/*...65*/} `; + }); // https://www8.garmin.com/xmlschemas/TrackPointExtensionv1.xsd gpx += ` From b5182301fbb66e7ae514c9c94d2e21078e4bdf61 Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 19:38:39 -0700 Subject: [PATCH 16/51] increment version --- apps/recorder/ChangeLog | 3 ++- apps/recorder/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 9e78bc7a2..5570601af 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -37,4 +37,5 @@ 0.29: When plotting with OpenStMap scale map to track width & height 0.30: Add clock info for showing and toggling recording state 0.31: Ensure that background-drawn tracks can get cancelled, and draw less at a time to make updates smoother - plotTrack now draws the current track even if you're not actively recording \ No newline at end of file + plotTrack now draws the current track even if you're not actively recording +0.32 Add cadence data to output files \ No newline at end of file diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index b47fb9ded..a95ddf470 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -2,7 +2,7 @@ "id": "recorder", "name": "Recorder", "shortName": "Recorder", - "version": "0.31", + "version": "0.32", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget,clkinfo", From 3b1c75e874d5189330b989b3d104c4b850f2e402 Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 19:41:19 -0700 Subject: [PATCH 17/51] forgot colon --- apps/recorder/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 5570601af..c3ea6041a 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -38,4 +38,4 @@ 0.30: Add clock info for showing and toggling recording state 0.31: Ensure that background-drawn tracks can get cancelled, and draw less at a time to make updates smoother plotTrack now draws the current track even if you're not actively recording -0.32 Add cadence data to output files \ No newline at end of file +0.32: Add cadence data to output files \ No newline at end of file From 8ceae6df47a1ac34d18389c8116db800be6d6ad7 Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 20:05:37 -0700 Subject: [PATCH 18/51] fix check for cadence calculation --- apps/recorder/interface.html | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index f47171a01..4475f624f 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -98,9 +98,7 @@ function saveGPX(track, title) { let lastTime = 0; track.forEach(pt=>{ let cadence; - if (!pt.Steps || lastTime === 0){ - - } else { + if (pt.Steps && lastTime != 0){ cadence = pt.Steps * 60000 / (pt.Time.getUTCMilliseconds() - lastTime); } lastTime = pt.Time.getUTCMilliseconds(); @@ -112,8 +110,7 @@ function saveGPX(track, title) { ${pt.Heartrate ? `${pt.Heartrate}`:``} - ${cadence ? `${cadence}`:``} - ${""/*...65*/} + ${cadence ? `${cadence}`:``} ${""/*...65*/} `; From 2ce1d4b510c748ecb750a5f41559ee5771bda642 Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 20:28:03 -0700 Subject: [PATCH 19/51] print for debug --- apps/recorder/interface.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 4475f624f..8bb2868c4 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -102,6 +102,7 @@ function saveGPX(track, title) { cadence = pt.Steps * 60000 / (pt.Time.getUTCMilliseconds() - lastTime); } lastTime = pt.Time.getUTCMilliseconds(); + Console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getUTCMilliseconds() - lastTime)); gpx += ` From 465aa25ffc70b3394e9d15340eefef58580fb37d Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 20:36:08 -0700 Subject: [PATCH 20/51] Apparently i forgot how to console.log --- apps/recorder/interface.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 8bb2868c4..3f84bb8ea 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -102,7 +102,7 @@ function saveGPX(track, title) { cadence = pt.Steps * 60000 / (pt.Time.getUTCMilliseconds() - lastTime); } lastTime = pt.Time.getUTCMilliseconds(); - Console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getUTCMilliseconds() - lastTime)); + console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getUTCMilliseconds() - lastTime)); gpx += ` From ccc21082e3617102a42c9f6cc0f41d7a2cba8b8c Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 20:40:09 -0700 Subject: [PATCH 21/51] account for my lack of thought and print more stuff --- apps/recorder/interface.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 3f84bb8ea..9e5acaffa 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -101,8 +101,9 @@ function saveGPX(track, title) { if (pt.Steps && lastTime != 0){ cadence = pt.Steps * 60000 / (pt.Time.getUTCMilliseconds() - lastTime); } + + console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getUTCMilliseconds() - lastTime) + " pt time " + pt.Time.getUTCMilliseconds() + " last time " + lastTime); lastTime = pt.Time.getUTCMilliseconds(); - console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getUTCMilliseconds() - lastTime)); gpx += ` From e1d9701bbf7d259e804845ddc3806c793ecd9a8c Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:04:09 -0700 Subject: [PATCH 22/51] change getUTCMilliseconds to getTime --- apps/recorder/interface.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 9e5acaffa..f3e963aa0 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -99,11 +99,11 @@ function saveGPX(track, title) { track.forEach(pt=>{ let cadence; if (pt.Steps && lastTime != 0){ - cadence = pt.Steps * 60000 / (pt.Time.getUTCMilliseconds() - lastTime); + cadence = pt.Steps * 60000 / (pt.Time.getTime() - lastTime); } - console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getUTCMilliseconds() - lastTime) + " pt time " + pt.Time.getUTCMilliseconds() + " last time " + lastTime); - lastTime = pt.Time.getUTCMilliseconds(); + console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getTime() - lastTime) + " pt time " + pt.Time.getTime() + " last time " + lastTime); + lastTime = pt.Time.getTime(); gpx += ` From 9ec73873abd10009a0950655556e12ce9430f1a7 Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:10:13 -0700 Subject: [PATCH 23/51] cleanup code --- apps/recorder/interface.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index f3e963aa0..ca6b1e83c 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -101,8 +101,6 @@ function saveGPX(track, title) { if (pt.Steps && lastTime != 0){ cadence = pt.Steps * 60000 / (pt.Time.getTime() - lastTime); } - - console.log("lt: " +lastTime + " steps: " + pt.Steps + " cadence: " + cadence + " dt: " + (pt.Time.getTime() - lastTime) + " pt time " + pt.Time.getTime() + " last time " + lastTime); lastTime = pt.Time.getTime(); gpx += ` From 9afd4ef79a3b603d31fb13bbe129a4f1dd7a63b6 Mon Sep 17 00:00:00 2001 From: Mineinjava <65673396+Mineinjava@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:22:39 -0700 Subject: [PATCH 24/51] divide by two --- apps/recorder/interface.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index ca6b1e83c..7f1e3bbc6 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -100,6 +100,7 @@ function saveGPX(track, title) { let cadence; if (pt.Steps && lastTime != 0){ cadence = pt.Steps * 60000 / (pt.Time.getTime() - lastTime); + cadence = cadence / 2; /*Convert from rpm to spm (one cycle is two steps), see https://github.com/espruino/BangleApps/pull/3068#issuecomment-1790041058*/ } lastTime = pt.Time.getTime(); From 39a9b2e3b47f448d3678165a82d753dc254ac013 Mon Sep 17 00:00:00 2001 From: charlestietjen Date: Thu, 2 Nov 2023 08:32:38 -0400 Subject: [PATCH 25/51] refactor and added before and after strings --- apps/approxclock/app.js | 67 +++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/apps/approxclock/app.js b/apps/approxclock/app.js index c172891bf..26da19b7c 100644 --- a/apps/approxclock/app.js +++ b/apps/approxclock/app.js @@ -32,25 +32,17 @@ const numbers = { "24": "Twelve", }; +const minutesByQuarterString = { + 0: "O'Clock", + 15: "Fifteen", + 30: "Thirty", + 45: "Fourty-Five" +}; + const width = g.getWidth(); const height = g.getHeight(); let idTimeout = null; -const getMinuteString = (minutes) => { - if (minutes >= 10 && minutes < 20){ - return "Fifteen"; - } - else if (minutes >= 20 && minutes < 40) { - return "Thirty"; - } - else if (minutes >= 40 && minutes < 50){ - return "Fourty-Five"; - } - else { - return "O'Clock"; - } -}; - const getNearestHour = (hours, minutes) => { if (minutes > 49){ return hours + 1; @@ -58,15 +50,29 @@ const getNearestHour = (hours, minutes) => { return hours; }; -const getApproximatePrefix = () => { - var date = Date(); - var minutes = date.getMinutes(); - - if(minutes === 0 || minutes === 15 || minutes === 30 || minutes === 45){ +const getApproximatePrefix = (minutes, minutesByQuarter) => { + if (minutes === minutesByQuarter){ return " exactly"; + } else if (minutesByQuarter - minutes < -5){ + return " after"; + } else if (minutesByQuarter - minutes < 0){ + return " just after"; + } else if (minutesByQuarter - minutes > 5){ + return " before"; + } else { + return " nearly"; } - else{ - return " about"; +}; + +const getMinutesByQuarter = minutes => { + if (minutes < 10){ + return 0; + } else if (minutes < 20) { + return 15; + } else if (minutes < 40){ + return 30; + } else { + return 45; } }; @@ -75,20 +81,21 @@ const drawTime = () => { var date = Date(); var hour = date.getHours(); var minutes = date.getMinutes(); + var minutesByQuarter = getMinutesByQuarter(minutes); //reset graphics g.clear(); g.reset(); - g.setColor(0,0,0); - g.fillRect(0, 0, width, height); - g.setFont("Vector", 24); + g.setBgColor(0,0,0); + g.clearRect(0, 0, width, height); + g.setFont("Vector", 22); g.setColor(1,1,1); - g.drawString("It's about", (width - g.stringWidth("It's" + getApproximatePrefix()))/2, height * 0.2, false); - g.setFont("Vector", 24); - g.drawString(numbers[getNearestHour(hour, minutes)], (width - g.stringWidth(numbers[getNearestHour(hour, minutes)]))/2, height * 0.4, false); - g.setFont("Vector", 24); - g.drawString(getMinuteString(minutes), (width - g.stringWidth(getMinuteString(minutes)))/2, height * 0.6, false); + g.drawString("It's" + getApproximatePrefix(minutes, minutesByQuarter), (width - g.stringWidth("It's" + getApproximatePrefix(minutes, minutesByQuarter)))/2, height * 0.25, false); + g.setFont("Vector", 30); + g.drawString(numbers[getNearestHour(hour, minutes)], (width - g.stringWidth(numbers[getNearestHour(hour, minutes)]))/2, height * 0.45, false); + g.setFont("Vector", 22); + g.drawString(minutesByQuarterString[minutesByQuarter], (width - g.stringWidth(minutesByQuarterString[minutesByQuarter]))/2, height * 0.7, false); let d = Date(); let t = d.getSeconds()*1000 + d.getMilliseconds(); idTimeout = setTimeout(drawTime, 60000 - t); From 117a7aa55219548fe339a6ee82a2a1c92351b8bd Mon Sep 17 00:00:00 2001 From: charlestietjen Date: Thu, 2 Nov 2023 08:40:33 -0400 Subject: [PATCH 26/51] remove some comments --- apps/approxclock/ChangeLog | 2 ++ apps/approxclock/app.js | 13 +------------ apps/approxclock/metadata.json | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) create mode 100644 apps/approxclock/ChangeLog diff --git a/apps/approxclock/ChangeLog b/apps/approxclock/ChangeLog new file mode 100644 index 000000000..2d2969315 --- /dev/null +++ b/apps/approxclock/ChangeLog @@ -0,0 +1,2 @@ +0.1: Initial release +0.2: Added more descriptive approximations \ No newline at end of file diff --git a/apps/approxclock/app.js b/apps/approxclock/app.js index 26da19b7c..4fdabc316 100644 --- a/apps/approxclock/app.js +++ b/apps/approxclock/app.js @@ -87,6 +87,7 @@ const drawTime = () => { g.clear(); g.reset(); + //Build watch face g.setBgColor(0,0,0); g.clearRect(0, 0, width, height); g.setFont("Vector", 22); @@ -114,18 +115,6 @@ Bangle.on('lcdPower', function(on){ } }); -//var secondInterval = setInterval(draw, 1000); -// Stop updates when LCD is off, restart when on -//Bangle.on('lcdPower',on=>{ -// if (secondInterval) clearInterval(secondInterval); -// secondInterval = undefined; -// if (on) { -// secondInterval = setInterval(draw, 1000); -// g.clear(); -// draw(); // draw immediately -// } -//}); - // Show launcher when button pressed Bangle.setUI("clock"); Bangle.loadWidgets(); diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json index 3d08a41b0..12b468747 100644 --- a/apps/approxclock/metadata.json +++ b/apps/approxclock/metadata.json @@ -1,7 +1,7 @@ { "id": "approxclock", "name": "Approximate Clock", "shortName" : "Approx Clock", - "version": "0.1", + "version": "0.2", "icon": "app.png", "description": "A really basic spelled out time display for people looking for the vague time at a glance.", "type": "clock", From d2692aa36c55214d51e9f921c3b8e9d68375b1ad Mon Sep 17 00:00:00 2001 From: charlestietjen Date: Thu, 2 Nov 2023 09:04:37 -0400 Subject: [PATCH 27/51] fixed incorrect hour drawn --- apps/approxclock/app.js | 56 +++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/apps/approxclock/app.js b/apps/approxclock/app.js index 4fdabc316..fd7730936 100644 --- a/apps/approxclock/app.js +++ b/apps/approxclock/app.js @@ -41,23 +41,25 @@ const minutesByQuarterString = { const width = g.getWidth(); const height = g.getHeight(); -let idTimeout = null; +let drawTimeout; const getNearestHour = (hours, minutes) => { - if (minutes > 49){ + if (minutes > 54) { return hours + 1; } return hours; }; const getApproximatePrefix = (minutes, minutesByQuarter) => { - if (minutes === minutesByQuarter){ + if (minutes === minutesByQuarter) { return " exactly"; - } else if (minutesByQuarter - minutes < -5){ + } else if (minutesByQuarter - minutes < -54) { + return " nearly"; + } else if (minutesByQuarter - minutes < -5) { return " after"; - } else if (minutesByQuarter - minutes < 0){ - return " just after"; - } else if (minutesByQuarter - minutes > 5){ + } else if (minutesByQuarter - minutes < 0) { + return " just after"; + } else if (minutesByQuarter - minutes > 5) { return " before"; } else { return " nearly"; @@ -65,51 +67,61 @@ const getApproximatePrefix = (minutes, minutesByQuarter) => { }; const getMinutesByQuarter = minutes => { - if (minutes < 10){ + if (minutes < 10) { return 0; } else if (minutes < 20) { return 15; - } else if (minutes < 40){ + } else if (minutes < 40) { return 30; - } else { + } else if (minutes < 55) { return 45; + } else { + return 0; } }; +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + drawTime(); + }, 60000 - (Date.now() % 60000)); +} + const drawTime = () => { //Grab time vars var date = Date(); var hour = date.getHours(); var minutes = date.getMinutes(); var minutesByQuarter = getMinutesByQuarter(minutes); - + //reset graphics g.clear(); g.reset(); - + //Build watch face - g.setBgColor(0,0,0); + g.setBgColor(0, 0, 0); g.clearRect(0, 0, width, height); g.setFont("Vector", 22); - g.setColor(1,1,1); - g.drawString("It's" + getApproximatePrefix(minutes, minutesByQuarter), (width - g.stringWidth("It's" + getApproximatePrefix(minutes, minutesByQuarter)))/2, height * 0.25, false); + g.setColor(1, 1, 1); + g.drawString("It's" + getApproximatePrefix(minutes, minutesByQuarter), (width - g.stringWidth("It's" + getApproximatePrefix(minutes, minutesByQuarter))) / 2, height * 0.25, false); g.setFont("Vector", 30); - g.drawString(numbers[getNearestHour(hour, minutes)], (width - g.stringWidth(numbers[getNearestHour(hour, minutes)]))/2, height * 0.45, false); + g.drawString(numbers[getNearestHour(hour, minutes)], (width - g.stringWidth(numbers[getNearestHour(hour, minutes)])) / 2, height * 0.45, false); g.setFont("Vector", 22); - g.drawString(minutesByQuarterString[minutesByQuarter], (width - g.stringWidth(minutesByQuarterString[minutesByQuarter]))/2, height * 0.7, false); - let d = Date(); - let t = d.getSeconds()*1000 + d.getMilliseconds(); - idTimeout = setTimeout(drawTime, 60000 - t); + g.drawString(minutesByQuarterString[minutesByQuarter], (width - g.stringWidth(minutesByQuarterString[minutesByQuarter])) / 2, height * 0.7, false); + + queueDraw(); }; g.clear(); drawTime(); -Bangle.on('lcdPower', function(on){ +Bangle.on('lcdPower', function (on) { if (on) { drawTime(); } else { - if(idTimeout) { + if (idTimeout) { clearTimeout(idTimeout); } } From a80a7f21621159c440b520cdff46ca489e8a4457 Mon Sep 17 00:00:00 2001 From: charlestietjen Date: Thu, 2 Nov 2023 09:06:00 -0400 Subject: [PATCH 28/51] version increment, changelog notes --- apps/approxclock/ChangeLog | 3 ++- apps/approxclock/metadata.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/approxclock/ChangeLog b/apps/approxclock/ChangeLog index 2d2969315..e44f187a5 100644 --- a/apps/approxclock/ChangeLog +++ b/apps/approxclock/ChangeLog @@ -1,2 +1,3 @@ 0.1: Initial release -0.2: Added more descriptive approximations \ No newline at end of file +0.2: Added more descriptive approximations +0.2f: Bug fixes: Incorrect hour drawn after 50 mins, incorrect quarter minute drawn after 50 mins \ No newline at end of file diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json index 12b468747..63cd51ae1 100644 --- a/apps/approxclock/metadata.json +++ b/apps/approxclock/metadata.json @@ -1,7 +1,7 @@ { "id": "approxclock", "name": "Approximate Clock", "shortName" : "Approx Clock", - "version": "0.2", + "version": "0.2f", "icon": "app.png", "description": "A really basic spelled out time display for people looking for the vague time at a glance.", "type": "clock", From a2751d8ddd192cb3f776afb27ddc6b14de4ad764 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:37:02 +0000 Subject: [PATCH 29/51] Create ChangeLog --- apps/Tyreid/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/Tyreid/ChangeLog diff --git a/apps/Tyreid/ChangeLog b/apps/Tyreid/ChangeLog new file mode 100644 index 000000000..2f792c8de --- /dev/null +++ b/apps/Tyreid/ChangeLog @@ -0,0 +1 @@ +0.01: Change log created From 815c77b8c125c4002a78d6ca18de5056384dc6c6 Mon Sep 17 00:00:00 2001 From: th10111 <144286414+th10111@users.noreply.github.com> Date: Thu, 2 Nov 2023 19:38:59 +0000 Subject: [PATCH 30/51] Add files via upload --- apps/Tyreid/small_logo.png | Bin 0 -> 8371 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/Tyreid/small_logo.png diff --git a/apps/Tyreid/small_logo.png b/apps/Tyreid/small_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b705cd3f2553ed924e5c35f099b9c22f5a9611a GIT binary patch literal 8371 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 Date: Thu, 2 Nov 2023 19:56:20 +0000 Subject: [PATCH 31/51] Update metadata.json --- apps/Tyreid/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/Tyreid/metadata.json b/apps/Tyreid/metadata.json index adb9c459d..608387322 100644 --- a/apps/Tyreid/metadata.json +++ b/apps/Tyreid/metadata.json @@ -3,7 +3,7 @@ "shortName":"Tyreid", "version":"0.02", "description": "Bluetooth war-driving app for Bangle.js 2", - "icon": "Tyreid.img", + "icon": "small_logo.png", "tags": "", "supports" : ["BANGLEJS2"], "readme": "README.md", From 822dbf78119f8415abf738ec3337639a95aa0c66 Mon Sep 17 00:00:00 2001 From: charlestietjen Date: Thu, 2 Nov 2023 16:39:53 -0400 Subject: [PATCH 32/51] touch interaction added --- apps/approxclock/ChangeLog | 3 ++- apps/approxclock/app.js | 23 +++++++++++++++++++++++ apps/approxclock/metadata.json | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/approxclock/ChangeLog b/apps/approxclock/ChangeLog index e44f187a5..9ba3e983a 100644 --- a/apps/approxclock/ChangeLog +++ b/apps/approxclock/ChangeLog @@ -1,3 +1,4 @@ 0.1: Initial release 0.2: Added more descriptive approximations -0.2f: Bug fixes: Incorrect hour drawn after 50 mins, incorrect quarter minute drawn after 50 mins \ No newline at end of file +0.2f: Bug fixes: Incorrect hour drawn after 50 mins, incorrect quarter minute drawn after 50 mins +0.3: Added touch interaction to display exact time and date. \ No newline at end of file diff --git a/apps/approxclock/app.js b/apps/approxclock/app.js index fd7730936..4f0bb570a 100644 --- a/apps/approxclock/app.js +++ b/apps/approxclock/app.js @@ -89,6 +89,24 @@ function queueDraw() { }, 60000 - (Date.now() % 60000)); } +const drawTimeExact = () => { + var dateTime = Date(); + var hours = dateTime.getHours(); + var minutes = dateTime.getMinutes().toString().padStart(2,0); + var day = dateTime.getDay(); + var date = dateTime.getDate(); + var month = dateTime.getMonth(); + var year = dateTime.getFullYear(); + g.clear(); + g.setBgColor(0,0,0); + g.clearRect(0,0,width, height); + g.setColor(1,1,1); + g.setFont("Vector", 30); + g.drawString(hours + ":" + minutes, (width - g.stringWidth(hours + ":" + minutes))/2, height * 0.3, false); + g.setFont("Vector", 26); + g.drawString(month + 1 + "/" + date + "/" + year, (width - g.stringWidth(month + 1 + "/" + date + "/" + year))/2, height * 0.6, false); +}; + const drawTime = () => { //Grab time vars var date = Date(); @@ -127,6 +145,11 @@ Bangle.on('lcdPower', function (on) { } }); +Bangle.on('touch', function(button, xy){ + drawTimeExact(); + setTimeout(drawTime, 7000); +}); + // Show launcher when button pressed Bangle.setUI("clock"); Bangle.loadWidgets(); diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json index 63cd51ae1..00c4d0099 100644 --- a/apps/approxclock/metadata.json +++ b/apps/approxclock/metadata.json @@ -1,7 +1,7 @@ { "id": "approxclock", "name": "Approximate Clock", "shortName" : "Approx Clock", - "version": "0.2f", + "version": "0.3", "icon": "app.png", "description": "A really basic spelled out time display for people looking for the vague time at a glance.", "type": "clock", From 4f504f5c1cef400990d00ad26185733de2e2e6b6 Mon Sep 17 00:00:00 2001 From: charlestietjen Date: Thu, 2 Nov 2023 17:21:05 -0400 Subject: [PATCH 33/51] added readme --- apps/approxclock/readme.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 apps/approxclock/readme.md diff --git a/apps/approxclock/readme.md b/apps/approxclock/readme.md new file mode 100644 index 000000000..aa1b74267 --- /dev/null +++ b/apps/approxclock/readme.md @@ -0,0 +1,7 @@ +## Approximate Clock + +### Description + +Get a rough idea of the time at a quick glance, mostly made for myself based on a similar watchface on pebble. I find this keeps me from checking my watch too often and also saves me from moments of severe brainfart staring at these mysterious symbols we call numbers. + +Exact time and date can be viewed temporarily by touching the screen. \ No newline at end of file From 6433ae0a11b798d9298b593a84b51e1a994ee610 Mon Sep 17 00:00:00 2001 From: Gabriele Monaco Date: Fri, 3 Nov 2023 06:51:30 +0100 Subject: [PATCH 34/51] cards: bump version and changelog --- apps/cards/ChangeLog | 1 + apps/cards/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/cards/ChangeLog b/apps/cards/ChangeLog index 00945cd13..24c1bf8ff 100644 --- a/apps/cards/ChangeLog +++ b/apps/cards/ChangeLog @@ -1 +1,2 @@ 0.01: Simple app to display loyalty cards +0.02: Hiding widgets while showing the code diff --git a/apps/cards/metadata.json b/apps/cards/metadata.json index 63b7da847..810741d5f 100644 --- a/apps/cards/metadata.json +++ b/apps/cards/metadata.json @@ -1,7 +1,7 @@ { "id": "cards", "name": "Cards", - "version": "0.01", + "version": "0.02", "description": "Display loyalty cards", "icon": "app.png", "screenshots": [{"url":"screenshot_cards_overview.png"}, {"url":"screenshot_cards_card1.png"}, {"url":"screenshot_cards_card2.png"}, {"url":"screenshot_cards_barcode.png"}, {"url":"screenshot_cards_qrcode.png"}], From f03f39e413e0c0b4e31a3fc24671d97ef088b6b7 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Fri, 3 Nov 2023 08:25:34 +0000 Subject: [PATCH 35/51] tyreid: match changelog version --- apps/Tyreid/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/Tyreid/metadata.json b/apps/Tyreid/metadata.json index 608387322..4663287e8 100644 --- a/apps/Tyreid/metadata.json +++ b/apps/Tyreid/metadata.json @@ -1,7 +1,7 @@ { "id": "Tyreid", "name": "Tyreid", "shortName":"Tyreid", - "version":"0.02", + "version":"0.01", "description": "Bluetooth war-driving app for Bangle.js 2", "icon": "small_logo.png", "tags": "", From e4b0ed2ecf92e930d905f19c633e7582757f3e33 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 3 Nov 2023 08:32:29 +0000 Subject: [PATCH 36/51] link in readme --- apps/approxclock/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/approxclock/metadata.json b/apps/approxclock/metadata.json index 00c4d0099..80e476e5b 100644 --- a/apps/approxclock/metadata.json +++ b/apps/approxclock/metadata.json @@ -4,6 +4,7 @@ "version": "0.3", "icon": "app.png", "description": "A really basic spelled out time display for people looking for the vague time at a glance.", + "readme": "readme.md", "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], @@ -14,4 +15,4 @@ "screenshots": [ {"url": "screenshot.png"} ] -} \ No newline at end of file +} From 319d22fab675bd9ca0c81ab26c58b2aeb6d1299f Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 3 Nov 2023 08:42:14 +0000 Subject: [PATCH 37/51] widclk 0.08: Ensure we clear the whole rect so we don't end up leaving old text when time changes (fix #3073) --- apps/widclk/ChangeLog | 1 + apps/widclk/metadata.json | 2 +- apps/widclk/widget.js | 6 +++--- apps/widclkbttm/ChangeLog | 2 +- apps/widclkbttm/metadata.json | 2 +- apps/widclkbttm/widclkbttm.wid.js | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/widclk/ChangeLog b/apps/widclk/ChangeLog index 1a89e2780..bbf9f2762 100644 --- a/apps/widclk/ChangeLog +++ b/apps/widclk/ChangeLog @@ -4,3 +4,4 @@ 0.05: Don't show clock widget if already showing clock app 0.06: Use 7 segment font, update *on* the minute, use less memory 0.07: allow turning on/off when quick-switching apps +0.08: Ensure we clear the whole rect so we don't end up leaving old text when time changes (fix #3073) \ No newline at end of file diff --git a/apps/widclk/metadata.json b/apps/widclk/metadata.json index e4d7d76d1..b0e345ad9 100644 --- a/apps/widclk/metadata.json +++ b/apps/widclk/metadata.json @@ -1,7 +1,7 @@ { "id": "widclk", "name": "Digital clock widget", - "version": "0.07", + "version": "0.08", "description": "A simple digital clock widget that appears when not showing a fullscreen clock", "icon": "widget.png", "type": "widget", diff --git a/apps/widclk/widget.js b/apps/widclk/widget.js index a31bd4772..af35ae459 100644 --- a/apps/widclk/widget.js +++ b/apps/widclk/widget.js @@ -7,13 +7,13 @@ WIDGETS["wdclk"]={area:"tl",width:Bangle.CLOCK?0:52/* g.stringWidth("00:00") */, return setTimeout(Bangle.drawWidgets,1); // widget changed size - redraw } if (!this.width) return; // if not visible, return -g.reset().setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 512+9); +g.reset().setFontCustom(atob("AAAAAAAAAAIAAAQCAQAAAd0BgMBdwAAAAAAAdwAB0RiMRcAAAERiMRdwAcAQCAQdwAcERiMRBwAd0RiMRBwAAEAgEAdwAd0RiMRdwAcERiMRdwAFAAd0QiEQdwAdwRCIRBwAd0BgMBAAABwRCIRdwAd0RiMRAAAd0QiEQAAAAAAAAAA="), 32, atob("BgAAAAAAAAAAAAAAAAYCAAYGBgYGBgYGBgYCAAAAAAAABgYGBgYG"), 512+9).setFontAlign(0,0); var time = require("locale").time(new Date(),1); - g.drawString(time, this.x, this.y+3, true); // 5 * 6*2 = 60 + g.clearRect(this.x, this.y, this.x+this.width-1, this.y+23).drawString(time, this.x+this.width/2, this.y+12); // 5 * 6*2 = 60 // queue draw in one minute if (this.drawTimeout) clearTimeout(this.drawTimeout); this.drawTimeout = setTimeout(()=>{ this.drawTimeout = undefined; this.draw(); }, 60000 - (Date.now() % 60000)); -}}; +}}; \ No newline at end of file diff --git a/apps/widclkbttm/ChangeLog b/apps/widclkbttm/ChangeLog index 373337378..29958b249 100644 --- a/apps/widclkbttm/ChangeLog +++ b/apps/widclkbttm/ChangeLog @@ -3,4 +3,4 @@ 0.03: based in widclk v0.05 compatible at same time, bottom area and color 0.04: refactored to use less memory, and allow turning on/off when quick-switching apps 0.05: Remove cyan color, use theme foreground instead - +0.06: Ensure we clear the whole rect so we don't end up leaving old text when time changes diff --git a/apps/widclkbttm/metadata.json b/apps/widclkbttm/metadata.json index 4b14ef9c6..5721f0114 100644 --- a/apps/widclkbttm/metadata.json +++ b/apps/widclkbttm/metadata.json @@ -2,7 +2,7 @@ "id": "widclkbttm", "name": "Digital clock (Bottom) widget", "shortName": "Digital clock Bottom Widget", - "version": "0.05", + "version": "0.06", "description": "Displays time HH:mm in the bottom of the screen (may not be compatible with some apps)", "icon": "widclkbttm.png", "type": "widget", diff --git a/apps/widclkbttm/widclkbttm.wid.js b/apps/widclkbttm/widclkbttm.wid.js index 50142a5b9..55c841500 100644 --- a/apps/widclkbttm/widclkbttm.wid.js +++ b/apps/widclkbttm/widclkbttm.wid.js @@ -4,7 +4,7 @@ WIDGETS["wdclkbttm"]={area:"br",width:Bangle.CLOCK?0:60,draw:function() { return setTimeout(Bangle.drawWidgets,1); // widget changed size - redraw } if (!this.width) return; // if not visible, return - g.reset().setFont("6x8", 2).setFontAlign(-1, 0); + g.reset().setFont("6x8", 2).setFontAlign(-1, 0).clearRect(this.x, this.y, this.x+this.width-1, this.y+23); var time = require("locale").time(new Date(),1); g.drawString(time, this.x, this.y+11, true); // 5 * 6*2 = 60 // queue draw in one minute From 98ecd6c9c770ddadafbb5e2a97a94edcfd738414 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 15:20:03 +0100 Subject: [PATCH 38/51] tetris: implement level/mode selection Implement level selection, and allow user to slect controls. --- apps/tetris/ChangeLog | 1 + apps/tetris/metadata.json | 2 +- apps/tetris/tetris.app.js | 141 ++++++++++++++++++++++++++++++++------ 3 files changed, 121 insertions(+), 23 deletions(-) diff --git a/apps/tetris/ChangeLog b/apps/tetris/ChangeLog index 6366af6c0..aae9b12d7 100644 --- a/apps/tetris/ChangeLog +++ b/apps/tetris/ChangeLog @@ -1,2 +1,3 @@ 0.01: New app! 0.02: Better controls, implement game over. +0.03: Implement mode and level selection screens. diff --git a/apps/tetris/metadata.json b/apps/tetris/metadata.json index f10c06c54..f0a7fd9ab 100644 --- a/apps/tetris/metadata.json +++ b/apps/tetris/metadata.json @@ -1,7 +1,7 @@ { "id": "tetris", "name": "Tetris", "shortName":"Tetris", - "version":"0.02", + "version":"0.03", "description": "Tetris", "icon": "tetris.png", "readme": "README.md", diff --git a/apps/tetris/tetris.app.js b/apps/tetris/tetris.app.js index 77c40de9a..ac9954093 100644 --- a/apps/tetris/tetris.app.js +++ b/apps/tetris/tetris.app.js @@ -36,11 +36,27 @@ const tiles = [ const ox = 176/2 - 5*8; const oy = 8; -var pf = Array(23).fill().map(()=>Array(12).fill(0)); // field is really 10x20, but adding a border for collision checks -pf[20].fill(1); -pf[21].fill(1); -pf[22].fill(1); -pf.forEach((x,i) => { pf[i][0] = 1; pf[i][11] = 1; }); +/* 0 .. simulated arrows + 1 .. drag piece + 2 .. accelerometer. 12 lines record. + 3 .. altimeter + */ +var control = 0, level = 0; +var alt_start = -9999; /* For altimeter control */ +/* 0 .. menu + 1 .. game + 2 .. game over */ +var state = 0; + +var pf; + +function initGame() { + pf = Array(23).fill().map(()=>Array(12).fill(0)); // field is really 10x20, but adding a border for collision checks + pf[20].fill(1); + pf[21].fill(1); + pf[22].fill(1); + pf.forEach((x,i) => { pf[i][0] = 1; pf[i][11] = 1; }); +} function rotateTile(t, r) { var nt = JSON.parse(JSON.stringify(t)); @@ -98,6 +114,8 @@ function redrawPF(ly) { function gameOver() { g.setColor(1, 1, 1).setFontAlign(0, 1, 0).setFont("Vector",22) .drawString("Game Over", 176/2, 76); + state = 0; + E.showAlert("Game Over").then(selectGame, print); } function insertAndCheck() { @@ -138,6 +156,8 @@ function moveOk(t, dx, dy) { } function gameStep() { + if (state != 1) + return; if (Date.now()-time > dropInterval) { // drop one step time = Date.now(); if (moveOk(ct, 0, 1)) { @@ -169,12 +189,50 @@ function move(x, y) { } } -Bangle.setUI(); -Bangle.on("drag", (e) => { - let h = 176/2; - if (!e.b) +function linear(x) { + print("Linear: ", x); + let now = px / 10; + if (x < now-0.06) + move(-1, 0); + if (x > now+0.06) + move(1, 0); +} + +function newGame() { + E.showMenu(); + Bangle.setUI(); + if (control == 2) { + Bangle.on("accel", (e) => { + if (state != 1) return; + if (control != 2) return; + print(e.x); + linear((0.2-e.x) * 2.5); + }); + } + if (control == 3) { + Bangle.setBarometerPower(true); + Bangle.on("pressure", (e) => { + if (state != 1) return; + if (control != 3) return; + let a = e.altitude; + if (alt_start == -9999) + alt_start = a; + a = a - alt_start; + print(e.altitude, a); + linear(a); + }); + } + Bangle.on("drag", (e) => { + let h = 176/2; + if (state == 2) { + if (e.b) + selectGame(); + return; + } + if (!e.b) return; - if (e.y < h) { + if (state == 0) return; + if (e.y < h) { if (e.x < h) rotate(); else { @@ -184,21 +242,60 @@ Bangle.on("drag", (e) => { g.flip(); } } - } else { + } else { + if (control == 1) + linear((e.x - 20) / 156); + if (control != 0) + return; if (e.x < h) move(-1, 0); else move(1, 0); - } -}); + } + }); -Bangle.on("swipe", (x,y) => { - if (y<0) y = 0; - move(x, y); -}); + initGame(); + drawGame(); + state = 1; + var step = 450 - 50*level; + if (control == 3) + step = step*2; + dropInterval = step; + var gi = setInterval(gameStep, 50); +} -drawBoundingBox(); -g.setColor(1, 1, 1).setFontAlign(0, 1, 0).setFont("6x15", 1).drawString("Lines", 22, 30).drawString("Next", 176-22, 30); -showNext(ntn, ntr); -g.setColor(0).fillRect(5, 30, 41, 80).setColor(1, 1, 1).drawString(nlines.toString(), 22, 50); -var gi = setInterval(gameStep, 20); +function drawGame() { + drawBoundingBox(); + g.setColor(1, 1, 1).setFontAlign(0, 1, 0) + .setFont("6x15", 1).drawString("Lines", 22, 30) + .drawString("Next", 176-22, 30); + showNext(ntn, ntr); + g.setColor(0).fillRect(5, 30, 41, 80) + .setColor(1, 1, 1).drawString(nlines.toString(), 22, 50); +} + +function selectLevel() { + print("Level selection menu"); + + var menu = {}; + menu["Level 1"] = () => { level = 0; selectGame(); }; + menu["Level 2"] = () => { level = 1; selectGame(); }; + menu["Level 3"] = () => { level = 2; selectGame(); }; + E.showMenu(menu); +} + +function selectGame() { + state = 0; + print("Game selection menu"); + //for (let i = 0; i < 100000; i++) ; + + var menu = {}; + menu["Normal"] = () => { control = 0; newGame(); }; + menu["Drag"] = () => { control = 1; newGame(); }; + menu["Tilt"] = () => { control = 2; newGame(); }; + menu["Move"] = () => { control = 3; newGame(); }; + menu["Level"] = () => { selectLevel(); }; + E.showMenu(menu); +} + +selectGame(); From 0bc7cb491891853c89cb5b5ecebf343173bac1e3 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Sat, 28 Oct 2023 11:36:34 +0200 Subject: [PATCH 39/51] stacker: Add documentation, allow on emulator. --- apps/stacker/README.md | 3 ++- apps/stacker/metadata.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/stacker/README.md b/apps/stacker/README.md index 5be5b7bee..e1019f970 100644 --- a/apps/stacker/README.md +++ b/apps/stacker/README.md @@ -5,7 +5,8 @@ A simple game of stacking cubes. ## Usage -Press the button to stack! +Boxes move horizontally. Use button to stack them on top of existing +boxes. You win when you reach top of the screen. ## Creator diff --git a/apps/stacker/metadata.json b/apps/stacker/metadata.json index abaf49a6d..3516625a1 100644 --- a/apps/stacker/metadata.json +++ b/apps/stacker/metadata.json @@ -6,6 +6,7 @@ "icon": "app.png", "tags": "game", "supports" : ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, "readme": "README.md", "storage": [ {"name":"stacker.app.js","url":"app.js"}, From 4ca2f69e9903a42924c4916974f6a63bc0b458b4 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Thu, 12 Oct 2023 14:22:43 +0200 Subject: [PATCH 40/51] [] sixths: Implemented compass / navigating back to waypoints. These are summary changes from devel_clock branch. --- apps/sixths/README.md | 8 +- apps/sixths/app.js | 450 +++++++++++++++++++++++++++----------- apps/sixths/metadata.json | 3 +- 3 files changed, 335 insertions(+), 126 deletions(-) diff --git a/apps/sixths/README.md b/apps/sixths/README.md index e5d76d5ad..18f6bdf99 100644 --- a/apps/sixths/README.md +++ b/apps/sixths/README.md @@ -48,4 +48,10 @@ night. I'd like to make display nicer, and likely more dynamic, displaying whatever application believes is most important at the time (and -possibly allowing scrolling). \ No newline at end of file +possibly allowing scrolling). + +Todo: + +*) only turn on compass when needed + +*) adjust draw timeouts to save power \ No newline at end of file diff --git a/apps/sixths/app.js b/apps/sixths/app.js index ce036f79d..40a35590d 100644 --- a/apps/sixths/app.js +++ b/apps/sixths/app.js @@ -1,20 +1,45 @@ +// Sixth sense + +// Options you'll want to edit +const rest_altitude = 354; +const geoid_to_sea_level = 0; // Maybe BangleJS2 already compensates? + const W = g.getWidth(); const H = g.getHeight(); var cx = 100; cy = 105; sc = 70; -var buzz = "", msg = ""; temp = 0; alt = 0; bpm = 0; -var buzz = "", msg = "", inm = "", l = "", note = "(NOTEHERE)"; -var mode = 0, mode_time = 0; // 0 .. normal, 1 .. note +var buzz = "", /* Set this to transmit morse via vibrations */ + inm = "", l = "", /* For incoming morse handling */ + in_str = "", + note = "(NOTEHERE)", + debug = "v930", debug2 = "(otherdb)", debug3 = "(short)"; +var mode = 0, mode_time = 0; // 0 .. normal, 1 .. note, 2.. mark name +var disp_mode = 0; // 0 .. normal, 1 .. small time -var gps_on = 0, last_fix = 0, last_restart = 0, last_pause = 0, last_fstart = 0; // utime -var gps_needed = 0, gps_limit = 0; // seconds +// GPS handling +var gps_on = 0, // time GPS was turned on + last_fix = 0, // time of last fix + last_restart = 0, last_pause = 0, last_fstart = 0; // utime +var gps_needed = 0, // how long to wait for a fix + gps_limit = 0, // timeout -- when to stop recording + gps_speed_limit = 0; var prev_fix = null; var gps_dist = 0; -var is_active = false; -var cur_altitude = 0, cur_temperature = 0, alt_adjust = 0; -const rest_altitude = 354; +var mark_heading = -1; + +// Is the human present? +var is_active = false, last_active = getTime(); +var is_level = false; + +// For altitude handling. +var cur_altitude = 0; +var cur_temperature = 0, alt_adjust = 0; +var alt_adjust_mode = ""; + +// Marks +var cur_mark = null; function toMorse(x) { r = ""; @@ -28,12 +53,10 @@ function toMorse(x) { } return r; } - function aload(s) { buzz += toMorse(' E'); load(s); } - function gpsRestart() { print("gpsRestart"); Bangle.setGPSPower(1, "sixths"); @@ -41,33 +64,154 @@ function gpsRestart() { last_pause = 0; last_fstart = 0; } - function gpsPause() { print("gpsPause"); Bangle.setGPSPower(0, "sixths"); last_restart = 0; last_pause = getTime(); } - function gpsOn() { gps_on = getTime(); gps_needed = 1000; - gps_limit = 60*60*4; last_fix = 0; prev_fix = null; gps_dist = 0; gpsRestart(); } - function gpsOff() { Bangle.setGPSPower(0, "sixths"); gps_on = 0; } +function fmtDist(km) { return km.toFixed(1) + "km"; } +function fmtSteps(n) { return fmtDist(0.001 * 0.719 * n); } +function fmtTimeDiff(d) { + if (d < 180) + return ""+d.toFixed(0); + d = d/60; + return ""+d.toFixed(0)+"m"; +} +function gpsHandleFix(fix) { + if (!prev_fix) { + show("GPS acquired", 10); + buzz += " ."; + prev_fix = fix; + } + if (0) { + /* GPS altitude fluctuates a lot, not really usable */ + alt_adjust = cur_altitude - (fix.alt + geoid_to_sea_level); + alt_adjust_mode = "g"; + } + if (1) { + debug = ""+fix.alt+"m "+alt_adjust; + } + if (1) { + let now1 = Date(); + let now2 = fix.time; + n1 = now1.getMinutes() * 60 + now1.getSeconds(); + n2 = now2.getMinutes() * 60 + now2.getSeconds(); + debug2 = "te "+(n2-n1)+"s"; + } + loggps(fix); + d = calcDistance(fix, prev_fix); + if (d > 30) { + prev_fix = fix; + gps_dist += d/1000; + } +} +function gpsHandle() { + let msg = ""; + if (!last_restart) { + d = (getTime()-last_pause); + if (last_fix) + msg = "PL"+ fmtTimeDiff(getTime()-last_fix); + else + msg = "PN"+ fmtTimeDiff(getTime()-gps_on); + print("gps on, paused ", d, gps_needed); + if (d > gps_needed * 2) { + gpsRestart(); + } + } else { + fix = Bangle.getGPSFix(); + if (fix && fix.fix && fix.lat) { + gpsHandleFix(fix); + msg = fix.speed.toFixed(1) + " km/h"; + print("GPS FIX", msg); + + if (!last_fstart) + last_fstart = getTime(); + last_fix = getTime(); + gps_needed = 60; + } else { + if (last_fix) + msg = "L"+ fmtTimeDiff(getTime()-last_fix); + else { + msg = "N"+ fmtTimeDiff(getTime()-gps_on); + if (fix) { + msg += " " + fix.satellites + "sats"; + } + } + } + + d = (getTime()-last_restart); + d2 = (getTime()-last_fstart); + print("gps on, restarted ", d, gps_needed, d2, fix.lat); + if (getTime() > gps_speed_limit && + (d > gps_needed || (last_fstart && d2 > 10))) { + gpsPause(); + gps_needed = gps_needed * 1.5; + print("Pausing, next try", gps_needed); + } + } + msg += " "+gps_dist.toFixed(1)+"km"; + return msg; +} +function markNew() { + let r = {}; + r.time = getTime(); + r.fix = prev_fix; + r.steps = Bangle.getHealthStatus("day").steps; + r.gps_dist = gps_dist; + r.altitude = cur_altitude; + r.name = "auto"; + return r; +} +function markHandle() { + let m = cur_mark; + msg = m.name + ">" + fmtTimeDiff(getTime()- m.time); + if (m.fix && m.fix.fix) { + let s = fmtDist(calcDistance(m.fix, prev_fix)/1000) + "km"; + msg += " " + s; + debug = "wp>" + s; + mark_heading = 180 + calcBearing(m.fix, prev_fix); + debug2 = "wp>" + mark_heading; + } else { + msg += " w" + fmtDist(gps_dist - m.gps_dist); + } + return msg; +} +function entryDone() { + show(":" + in_str); + buzz += " ."; + switch (mode) { + case 1: logstamp(">" + in_str); break; + case 2: cur_mark.name = in_str; break; + } + in_str = 0; + mode = 0; +} function inputHandler(s) { - print("Ascii: ", s); - if (mode == 1) { - note = note + s; + print("Ascii: ", s, s[0], s[1]); + if (s[0] == '^') { + switch (s[1]) { + case 'E': mode = 0; break; + case 'T': entryDone(); break; + } + return; + } + if ((mode == 1) || (mode == 2)){ + in_str = in_str + s; + show(">"+in_str, 10); mode_time = getTime(); return; } @@ -80,12 +224,21 @@ function inputHandler(s) { else s = s+(bat/5); buzz += toMorse(s); + show("Bat "+bat+"%", 60); + break; + case 'F': gpsOff(); show("GPS off", 3); break; + case 'G': gpsOn(); gps_limit = getTime() + 60*60*4; show("GPS on", 3); break; + case 'I': + disp_mode += 1; + if (disp_mode == 2) { + disp_mode = 0; + } break; - case 'F': gpsOff(); break; - case 'G': gpsOn(); break; case 'L': aload("altimeter.app.js"); break; - case 'N': mode = 1; note = ">"; mode_time = getTime(); break; + case 'M': mode = 2; show("M>", 10); cur_mark = markNew(); mode_time = getTime(); break; + case 'N': mode = 1; show(">", 10); mode_time = getTime(); break; case 'O': aload("orloj.app.js"); break; + case 'S': gpsOn(); gps_limit = getTime() + 60*30; gps_speed_limit = gps_limit; show("GPS on", 3); break; case 'T': s = ' T'; d = new Date(); @@ -94,9 +247,9 @@ function inputHandler(s) { buzz += toMorse(s); break; case 'R': aload("run.app.js"); break; + case 'Y': buzz += " ."; Bangle.resetCompass(); break; } } - const morseDict = { '.-': 'A', '-...': 'B', @@ -135,37 +288,46 @@ const morseDict = { '-....': '6', '-----': '0', }; - let asciiDict = {}; - for (let k in morseDict) { print(k, morseDict[k]); asciiDict[morseDict[k]] = k; } - - function morseToAscii(morse) { return morseDict[morse]; } - function asciiToMorse(char) { return asciiDict[char]; } - function morseHandler() { - inputHandler(morseToAscii(inm)); + if (inm[0] == "^") { + inputHandler("^"+morseToAscii(inm.substr(1))); + } else { + inputHandler(morseToAscii(inm)); + } + inm = ""; l = ""; } - function touchHandler(d) { let x = Math.floor(d.x); let y = Math.floor(d.y); - g.setColor(0.25, 0, 0); - g.fillCircle(W-x, W-y, 5); - - if (d.b) { + if (1) { /* Just a debugging feature */ + g.setColor(0.25, 0, 0); + if (0) + g.fillCircle(W-x, W-y, 5); + else + g.fillCircle(x, y, 5); + } + if (!d.b) { + morseHandler(); + l = ""; + return; + } + if (y > H/2 && l == "") { + inm = "^"; + } if (x < W/2 && y < H/2 && l != ".u") { inm = inm + "."; l = ".u"; @@ -181,14 +343,10 @@ function touchHandler(d) { if (x > W/2 && y > H/2 && l != "-d") { inm = inm + "-"; l = "-d"; - } + } - } else - morseHandler(); - - print(inm, "drag:", d); + //print(inm, "drag:", d); } - function add0(i) { if (i > 9) { return ""+i; @@ -196,18 +354,14 @@ function add0(i) { return "0"+i; } } - var lastHour = -1, lastMin = -1; - function logstamp(s) { logfile.write("utime=" + getTime() + " " + s + "\n"); } - function loggps(fix) { logfile.write(fix.lat + " " + fix.lon + " "); logstamp(""); } - function hourly() { print("hourly"); s = ' T'; @@ -215,31 +369,35 @@ function hourly() { buzz += toMorse(s); logstamp(""); } - +function show(msg, timeout) { + note = msg; +} function fivemin() { print("fivemin"); s = ' B'; bat = E.getBattery(); - if (bat < 45) { - s = s+(bat/5); + if (bat < 25) { if (is_active) buzz += toMorse(s); + show("Bat "+bat+"%", 60); } - if (0) + try { Bangle.getPressure().then((x) => { cur_altitude = x.altitude; cur_temperature = x.temperature; }, - print) - .catch(print); + print); + } catch (e) { + print("Altimeter error", e); + } + } - function every(now) { - if ((mode > 0) && (mode_time - getTime() > 60)) { + if ((mode > 0) && (getTime() - mode_time > 10)) { if (mode == 1) { - logstamp(">" + note); + entryDone(); } mode = 0; } - if (gps_on && getTime() - gps_on > gps_limit) { + if (gps_on && getTime() > gps_limit && getTime() > gps_speed_limit) { Bangle.setGPSPower(0, "sixths"); gps_on = 0; } @@ -255,96 +413,136 @@ function every(now) { } +function radians(a) { return a*Math.PI/180; } +function degrees(a) { return a*180/Math.PI; } // distance between 2 lat and lons, in meters, Mean Earth Radius = 6371km // https://www.movable-type.co.uk/scripts/latlong.html // (Equirectangular approximation) function calcDistance(a,b) { - function radians(a) { return a*Math.PI/180; } var x = radians(b.lon-a.lon) * Math.cos(radians((a.lat+b.lat)/2)); var y = radians(b.lat-a.lat); return Math.sqrt(x*x + y*y) * 6371000; } +// thanks to waypointer +function calcBearing(a,b){ + var delta = radians(b.lon-a.lon); + var alat = radians(a.lat); + var blat = radians(b.lat); + var y = Math.sin(delta) * Math.cos(blat); + var x = Math.cos(alat)*Math.sin(blat) - + Math.sin(alat)*Math.cos(blat)*Math.cos(delta); + return Math.round(degrees(Math.atan2(y, x))); +} +function testBearing() { + let p1 = {}, p2 = {}; + p1.lat = 40; p2.lat = 50; + p1.lon = 14; p2.lon = 14; + print("bearing = ", calcBearing(p1, p2)); +} +function radA(p) { return p*(Math.PI*2); } +function radD(d) { return d*(H/2); } +function radX(p, d) { + let a = radA(p); + return H/2 + Math.sin(a)*radD(d); +} +function radY(p, d) { + let a = radA(p); + return W/2 - Math.cos(a)*radD(d); +} +function drawDot(h, d, s) { + let x = radX(h/360, d); + let y = radY(h/360, d); + g.fillCircle(x,y, 10); +} +function drawBackground() { + acc = Bangle.getAccel(); + is_level = (acc.z < -0.95); + if (is_level) { + let obj = Bangle.getCompass(); + if (obj) { + let h = 360-obj.heading; + print("Compass", h); + g.setColor(0.5, 0.5, 1); + drawDot(h, 0.7, 10); + } + } + if (prev_fix && prev_fix.fix) { + g.setColor(0.5, 1, 0.5); + drawDot(prev_fix.course, 0.5, 6); + } + if (mark_heading != -1) { + g.setColor(1, 0.5, 0.5); + drawDot(mark_heading, 0.6, 8); + } +} +function drawTime(now) { + if (disp_mode == 0) + g.setFont('Vector', 60); + else + g.setFont('Vector', 26); + g.setFontAlign(1, 1); + g.drawString(now.getHours() + ":" + add0(now.getMinutes()), W, 90); +} function draw() { + if (disp_mode == 2) { + draw_all(); + return; + } g.setColor(1, 1, 1); - g.fillRect(0, 25, W, H); - g.setFont('Vector', 60); + g.fillRect(0, 24, W, H); + + if (0) { + g.setColor(0.25, 1, 1); + g.fillPoly([ W/2, 24, W, 80, 0, 80 ]); + } + let msg = ""; + if (gps_on) { + msg = gpsHandle(); + } else { + msg = note; + } + drawBackground(); - g.setColor(0, 0, 0); - g.setFontAlign(-1, 1); let now = new Date(); - g.drawString(now.getHours() + ":" + add0(now.getMinutes()), 10, 90); + g.setColor(0, 0, 0); + drawTime(now); every(now); let km = 0.001 * 0.719 * Bangle.getHealthStatus("day").steps; + g.setFontAlign(-1, 1); g.setFont('Vector', 26); const weekday = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]; - g.drawString(weekday[now.getDay()] + "" + now.getDate() + ". " + km.toFixed(1) + "km", 10, 115); + g.drawString(weekday[now.getDay()] + "" + now.getDate() + ". " + + fmtSteps(Bangle.getHealthStatus("day").steps), 10, 115); - if (gps_on) { - if (!last_restart) { - d = (getTime()-last_pause); - if (last_fix) - msg = "PL"+ (getTime()-last_fix).toFixed(0); - else - msg = "PN"+ (getTime()-gps_on).toFixed(0); - - print("gps on, paused ", d, gps_needed); - if (d > gps_needed * 2) { - gpsRestart(); - } - } else { - fix = Bangle.getGPSFix(); - if (fix.fix && fix.lat) { - if (!prev_fix) { - prev_fix = fix; - } - msg = fix.speed.toFixed(1) + " km/h"; - if (!last_fstart) - last_fstart = getTime(); - last_fix = getTime(); - gps_needed = 60; - loggps(fix); - print("GPS FIX", msg); - d = calcDistance(fix, prev_fix); - if (d > 30) { - prev_fix = fix; - gps_dist += d/1000; - } - } else { - if (last_fix) - msg = "L"+ (getTime()-last_fix).toFixed(0); - else - msg = "N"+ (getTime()-gps_on).toFixed(0); - } - - d = (getTime()-last_restart); - d2 = (getTime()-last_fstart); - print("gps on, restarted ", d, gps_needed, d2, fix.lat); - if (d > gps_needed || (last_fstart && d2 > 10)) { - gpsPause(); - gps_needed = gps_needed * 1.5; - print("Pausing, next try", gps_needed); - } - } - msg += " "+gps_dist.toFixed(1)+"km"; - } else { - msg = note; - } g.drawString(msg, 10, 145); - if (is_active) { - g.drawString("act " + (cur_altitude - alt_adjust).toFixed(0), 10, 175); - } else { + + if (getTime() - last_active > 15*60) { alt_adjust = cur_altitude - rest_altitude; - g.drawString(alt_adjust.toFixed(0) + "m " + cur_temperature.toFixed(1)+"C", 10, 175); + alt_adjust_mode = "h"; + msg = "H)" + alt_adjust.toFixed(0) + "m"; + } else { + msg = alt_adjust_mode+")"+(cur_altitude - alt_adjust).toFixed(0) + "m"; } + msg = msg + " " + cur_temperature.toFixed(1)+"C"; + if (cur_mark) { + msg = markHandle(); + } + g.drawString(msg, 10, 175); + + if (disp_mode == 1) { + g.drawString(debug, 10, 45); + g.drawString(debug2, 10, 65); + g.drawString(debug3, 10, 85); + } + queueDraw(); } - function draw_all() { g.setColor(0, 0, 0); g.fillRect(0, 0, W, H); @@ -394,14 +592,13 @@ function draw_all() { g.setFont('Vector', 22); g.drawString(now.getDate()+"."+(now.getMonth()+1)+" "+now.getDay(), 3, 60); - g.drawString(msg, 3, 80); + g.drawString("(message here)", 3, 80); g.drawString("S" + step + " B" + Math.round(bat/10) + (Bangle.isCharging()?"c":""), 3, 100); g.drawString("A" + Math.round(alt) + " T" + Math.round(temp), 3, 120); g.drawString("C" + Math.round(co.heading) + " B" + bpm, 3, 140); queueDraw(); } - function accelTask() { tm = 100; acc = Bangle.getAccel(); @@ -424,7 +621,6 @@ function accelTask() { setTimeout(accelTask, tm); } - function buzzTask() { if (buzz != "") { now = buzz[0]; @@ -442,9 +638,8 @@ function buzzTask() { setTimeout(buzzTask, 6*dot); } else print("Unknown character -- ", now, buzz); } else - setTimeout(buzzTask, 60000); + setTimeout(buzzTask, 1000); } - function aliveTask() { function cmp(s) { let d = acc[s] - last_acc[s]; @@ -456,6 +651,7 @@ function aliveTask() { if (cmp("x") || cmp("y") || cmp("z")) { print("active"); is_active = true; + last_active = getTime(); } last_acc = acc; @@ -476,14 +672,15 @@ function queueDraw() { }, next - (Date.now() % next)); } - function start() { Bangle.on("drag", touchHandler); if (0) Bangle.on("accel", accelHandler); - if (0) { + if (1) { Bangle.setCompassPower(1, "sixths"); Bangle.setBarometerPower(1, "sixths"); + } + if (0) { Bangle.setHRMPower(1, "sixths"); Bangle.setGPSPower(1, "sixths"); Bangle.on("HRM", (hrm) => { bpm = hrm.bpm; } ); @@ -500,9 +697,14 @@ function start() { } g.reset(); -Bangle.setUI(); +Bangle.setUI({ + mode : "clock" +}); Bangle.loadWidgets(); Bangle.drawWidgets(); let logfile = require("Storage").open("sixths.egt", "a"); -start(); +if (0) { + testBearing(); +} else + start(); diff --git a/apps/sixths/metadata.json b/apps/sixths/metadata.json index ece88348d..7580623dc 100644 --- a/apps/sixths/metadata.json +++ b/apps/sixths/metadata.json @@ -5,7 +5,8 @@ "icon": "app.png", "readme": "README.md", "supports" : ["BANGLEJS2"], - "tags": "", + "type": "clock", + "tags": "clock", "storage": [ {"name":"sixths.app.js","url":"app.js"}, {"name":"sixths.img","url":"app-icon.js","evaluate":true} From b24e9ca07953a2202d8c3810900b03af1f3313b1 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 16:13:32 +0100 Subject: [PATCH 41/51] [] sixths: update docs. --- apps/sixths/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sixths/README.md b/apps/sixths/README.md index 18f6bdf99..17369c7a0 100644 --- a/apps/sixths/README.md +++ b/apps/sixths/README.md @@ -25,8 +25,9 @@ minutes, real distance will be usually higher than approximation. Useful gestures: F -- disable GPS. -G -- enable GPS for 4 hours. +G -- enable GPS for 4 hours in low power mode. N -- take a note and write it to the log. +S -- enable GPS for 30 minutes in high power mode. When application detects watch is being worn, it will use vibrations to communicate back to the user. From 7eb9d6cd86fd9e5fe5307a5e959baf881a47c38f Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 16:13:43 +0100 Subject: [PATCH 42/51] [] sixths: use icons to save screen space. --- apps/sixths/app.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/apps/sixths/app.js b/apps/sixths/app.js index 40a35590d..ddb41ab0e 100644 --- a/apps/sixths/app.js +++ b/apps/sixths/app.js @@ -41,6 +41,14 @@ var alt_adjust_mode = ""; // Marks var cur_mark = null; +// Icons + +icon_alt = "\0\x08\x1a\1\x00\x00\x00\x20\x30\x78\x7C\xFE\xFF\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00"; +icon_m = "\0\x08\x1a\1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00"; +icon_km = "\0\x08\x1a\1\xC3\xC6\xCC\xD8\xF0\xD8\xCC\xC6\xC3\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00"; +icon_kph = "\0\x08\x1a\1\xC3\xC6\xCC\xD8\xF0\xD8\xCC\xC6\xC3\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\xFF\x00\xC3\xC3\xFF\xC3\xC3"; +icon_c = "\0\x08\x1a\1\x00\x00\x60\x90\x90\x60\x00\x7F\xFF\xC0\xC0\xC0\xC0\xC0\xFF\x7F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + function toMorse(x) { r = ""; for (var i = 0; i < x.length; i++) { @@ -82,8 +90,9 @@ function gpsOff() { Bangle.setGPSPower(0, "sixths"); gps_on = 0; } -function fmtDist(km) { return km.toFixed(1) + "km"; } +function fmtDist(km) { return km.toFixed(1) + icon_km; } function fmtSteps(n) { return fmtDist(0.001 * 0.719 * n); } +function fmtAlt(m) { return m.toFixed(0) + icon_alt; } function fmtTimeDiff(d) { if (d < 180) return ""+d.toFixed(0); @@ -135,7 +144,7 @@ function gpsHandle() { fix = Bangle.getGPSFix(); if (fix && fix.fix && fix.lat) { gpsHandleFix(fix); - msg = fix.speed.toFixed(1) + " km/h"; + msg = fix.speed.toFixed(1) + icon_kph; print("GPS FIX", msg); if (!last_fstart) @@ -163,7 +172,7 @@ function gpsHandle() { print("Pausing, next try", gps_needed); } } - msg += " "+gps_dist.toFixed(1)+"km"; + msg += " "+gps_dist.toFixed(1)+icon_km; return msg; } function markNew() { @@ -180,7 +189,7 @@ function markHandle() { let m = cur_mark; msg = m.name + ">" + fmtTimeDiff(getTime()- m.time); if (m.fix && m.fix.fix) { - let s = fmtDist(calcDistance(m.fix, prev_fix)/1000) + "km"; + let s = fmtDist(calcDistance(m.fix, prev_fix)/1000) + icon_km; msg += " " + s; debug = "wp>" + s; mark_heading = 180 + calcBearing(m.fix, prev_fix); @@ -525,11 +534,11 @@ function draw() { if (getTime() - last_active > 15*60) { alt_adjust = cur_altitude - rest_altitude; alt_adjust_mode = "h"; - msg = "H)" + alt_adjust.toFixed(0) + "m"; + msg = "H)" + fmtAlt(alt_adjust.toFixed(0)); } else { - msg = alt_adjust_mode+")"+(cur_altitude - alt_adjust).toFixed(0) + "m"; + msg = alt_adjust_mode+")"+fmtAlt(cur_altitude - alt_adjust); } - msg = msg + " " + cur_temperature.toFixed(1)+"C"; + msg = msg + " " + cur_temperature.toFixed(1)+icon_c; if (cur_mark) { msg = markHandle(); } From c03776c767e0e02af3fcea201f6cdbb6cb1994f4 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 16:20:12 +0100 Subject: [PATCH 43/51] [] sixths: v0.02, allow on emulator --- apps/sixths/ChangeLog | 1 + apps/sixths/metadata.json | 5 +++-- apps/sixths/{app.js => sixths.app.js} | 0 3 files changed, 4 insertions(+), 2 deletions(-) rename apps/sixths/{app.js => sixths.app.js} (100%) diff --git a/apps/sixths/ChangeLog b/apps/sixths/ChangeLog index 263d4078d..454f6d101 100644 --- a/apps/sixths/ChangeLog +++ b/apps/sixths/ChangeLog @@ -1 +1,2 @@ 0.01: attempt to import +0.02: better GPS support, adding altitude and temperature support diff --git a/apps/sixths/metadata.json b/apps/sixths/metadata.json index 7580623dc..d79e72ced 100644 --- a/apps/sixths/metadata.json +++ b/apps/sixths/metadata.json @@ -1,14 +1,15 @@ { "id": "sixths", "name": "Sixth sense", - "version":"0.01", + "version":"0.02", "description": "Clock for outdoor use with GPS support", "icon": "app.png", "readme": "README.md", "supports" : ["BANGLEJS2"], + "allow_emulator": true, "type": "clock", "tags": "clock", "storage": [ - {"name":"sixths.app.js","url":"app.js"}, + {"name":"sixths.app.js","url":"sixths.app.js"}, {"name":"sixths.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/sixths/app.js b/apps/sixths/sixths.app.js similarity index 100% rename from apps/sixths/app.js rename to apps/sixths/sixths.app.js From 35751aae3b1d1510afc536f9f81413008e5b4f9c Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 18:32:10 +0100 Subject: [PATCH 44/51] sixths: Fix altitude display. --- apps/sixths/sixths.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sixths/sixths.app.js b/apps/sixths/sixths.app.js index ddb41ab0e..2749a02c0 100644 --- a/apps/sixths/sixths.app.js +++ b/apps/sixths/sixths.app.js @@ -534,7 +534,7 @@ function draw() { if (getTime() - last_active > 15*60) { alt_adjust = cur_altitude - rest_altitude; alt_adjust_mode = "h"; - msg = "H)" + fmtAlt(alt_adjust.toFixed(0)); + msg = "H)" + fmtAlt(alt_adjust); } else { msg = alt_adjust_mode+")"+fmtAlt(cur_altitude - alt_adjust); } From 9690e8128b5d184a5c3606415057acd9eb6b9479 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Thu, 12 Oct 2023 14:30:30 +0200 Subject: [PATCH 45/51] [] wp_edit: implement marking. These are changes from devel_wp branch. Graphical cleanups would be good, otherwise it should work. --- apps/waypoint_editor/app.js | 104 ++++++++++++++++++++++++----- apps/waypoint_editor/metadata.json | 1 + 2 files changed, 87 insertions(+), 18 deletions(-) diff --git a/apps/waypoint_editor/app.js b/apps/waypoint_editor/app.js index 48a956d82..6bba59a1d 100644 --- a/apps/waypoint_editor/app.js +++ b/apps/waypoint_editor/app.js @@ -13,6 +13,10 @@ var wp = require('Storage').readJSON("waypoints.json", true) || []; 2 .. DD MM'ss" */ var mode = 1; +var key; /* Shared between functions, typically wp name */ +var fix; /* GPS fix */ +var cancel_gps; +var gps_start; function writeWP() { require('Storage').writeJSON("waypoints.json", wp); @@ -30,12 +34,72 @@ function mainMenu() { menu["Add"]=addCard; menu["Remove"]=removeCard; menu["Format"]=setFormat; + menu["Mark GPS"]=markGps; g.clear(); E.showMenu(menu); } +function updateGps() { + let have = false, lat = "lat", lon = "lon", alt = "alt", speed = "speed"; + + if (cancel_gps) + return; + fix = Bangle.getGPSFix(); + + speed = getTime() - gps_start; + + if (fix && fix.fix && fix.lat) { + lat = "" + fix.lat; + lon = "" + fix.lon; + alt = "" + fix.alt; + speed = "" + fix.speed; + have = true; + } + + g.reset().setFont("Vector", 20) + .setColor(1,1,1) + .fillRect(0, 0, 176, 120) + .setColor(0,0,0) + .drawString(key, 0, 0) + .drawString(lat, 0, 20) + .drawString(lon, 0, 40) + .drawString(alt, 0, 60) + .drawString(speed, 0, 80); + + setTimeout(updateGps, 100); +} + +function stopGps() { + cancel_gps=true; + Bangle.setGPSPower(0, "waypoint_editor"); +} + +function confirmGps() { + var la = new Layout ( + {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, + {type:"h", c: [ + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{ + print("should mark", key, fix); createWP(fix.lat, fix.lon, key); cancel_gps=true; mainMenu(); + }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{ cancel_gps=true; mainMenu(); }} + ]} + ], lazy:true}); + g.clear(); + la.render(); + updateGps(); +} + +function markGps() { + cancel_gps = false; + Bangle.setGPSPower(1, "waypoint_editor"); + gps_start = getTime(); + showNumpad("mkXX", "mark", confirmGps); +} + function setFormat() { - var confirmRemove = new Layout ( + var la = new Layout ( {type:"v", c: [ {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Format"}, {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD.dddd", cb:l=>{ mode = 0; mainMenu(); }}, @@ -43,7 +107,7 @@ function setFormat() { {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM'ss"+'"', cb:l=>{ mode = 2; mainMenu(); }}, ], lazy:true}); g.clear(); - confirmRemove.render(); + la.render(); } function format(x) { @@ -87,14 +151,14 @@ function lon(x) { function decode(pin) { print(pin); var i = wp[pin]; - var pinDecrypted=i["name"] + "\n" + lat(i["lat"]) + "\n" + lon(i["lon"]); - var showPin = new Layout ({ + var l = i["name"] + "\n" + lat(i["lat"]) + "\n" + lon(i["lon"]); + var la = new Layout ({ type:"v", c: [ - {type:"txt", font:"10%", pad:1, fillx:1, filly:1, label: pinDecrypted}, + {type:"txt", font:"10%", pad:1, fillx:1, filly:1, label: l}, {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label:"OK", cb:l=>{mainMenu();}} ], lazy:true}); g.clear(); - showPin.render(); + la.render(); } function showNumpad(text, key_, callback) { @@ -155,10 +219,10 @@ function showNumpad(text, key_, callback) { function removeCard() { var menu = { - "" : {title : "select card"}, + "" : {title : "Select WP"}, "< Back" : mainMenu }; - if (Object.keys(wp).length==0) Object.assign(menu, {"NO CARDS":""}); + if (Object.keys(wp).length==0) Object.assign(menu, {"No WPs":""}); else { wp.forEach((val, card) => { const name = wp[card].name; @@ -186,14 +250,14 @@ function removeCard() { } function ask01(t, cb) { - var confirmRemove = new Layout ( + var la = new Layout ( {type:"v", c: [ - {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Format"}, + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Select"}, {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: t[0], cb:l=>{ cb(1); }}, {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: t[1], cb:l=>{ cb(-1); }}, ], lazy:true}); g.clear(); - confirmRemove.render(); + la.render(); } @@ -237,6 +301,16 @@ function askPosition(callback) { }); } +function createWP(lat, lon, name) { + let n = {}; + n["name"] = name; + n["lat"] = lat; + n["lon"] = lon; + wp.push(n); + print("add -- waypoints", wp); + writeWP(); +} + function addCard() { showNumpad("wpXX", "wp", function() { result = key; @@ -257,13 +331,7 @@ function addCard() { g.clear(); askPosition(function(lat, lon) { print("position -- ", lat, lon); - let n = {}; - n["name"] = result; - n["lat"] = lat; - n["lon"] = lon; - wp.push(n); - print("add -- waypoints", wp); - writeWP(); + createWP(lat, lon, result); mainMenu(); }); }); diff --git a/apps/waypoint_editor/metadata.json b/apps/waypoint_editor/metadata.json index 12ff6e095..be3e14d76 100644 --- a/apps/waypoint_editor/metadata.json +++ b/apps/waypoint_editor/metadata.json @@ -5,6 +5,7 @@ "icon": "app.png", "readme": "README.md", "supports" : ["BANGLEJS2"], + "allow_emulator": true, "tags": "tool,outdoors,gps", "storage": [ {"name":"waypoint_editor.app.js","url":"app.js"}, From 73375ebe964bc1bf72b8506869fa0e6b6718239a Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Wed, 1 Nov 2023 11:36:59 +0100 Subject: [PATCH 46/51] [] wp_edit: use text entry for waypoint names --- apps/waypoint_editor/app.js | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/apps/waypoint_editor/app.js b/apps/waypoint_editor/app.js index 6bba59a1d..cdc752c79 100644 --- a/apps/waypoint_editor/app.js +++ b/apps/waypoint_editor/app.js @@ -26,8 +26,10 @@ function mainMenu() { var menu = { "< Back" : Bangle.load }; - if (Object.keys(wp).length==0) Object.assign(menu, {"NO WPs":""}); - else for (let id in wp) { + if (Object.keys(wp).length==0) { + //Object.assign(menu, {"NO WPs":""}); + print("(no waypoints)"); + } else for (let id in wp) { let i = id; menu[wp[id]["name"]]=()=>{ decode(i); }; } @@ -74,7 +76,8 @@ function stopGps() { Bangle.setGPSPower(0, "waypoint_editor"); } -function confirmGps() { +function confirmGps(s) { + key = s; var la = new Layout ( {type:"v", c: [ {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, @@ -95,7 +98,9 @@ function markGps() { cancel_gps = false; Bangle.setGPSPower(1, "waypoint_editor"); gps_start = getTime(); - showNumpad("mkXX", "mark", confirmGps); + require("textinput").input({text:"wp"}).then(key => { + confirmGps(key); + }); } function setFormat() { @@ -311,8 +316,17 @@ function createWP(lat, lon, name) { writeWP(); } +function addCardName(name) { + g.clear(); + askPosition(function(lat, lon) { + print("position -- ", lat, lon); + createWP(lat, lon, result); + mainMenu(); + }); +} + function addCard() { - showNumpad("wpXX", "wp", function() { + require("textinput").input({text:"wp"}).then(key => { result = key; if (wp[result]!=undefined) { E.showMenu(); @@ -321,19 +335,14 @@ function addCard() { {type:"txt", font:Math.min(15,100/result.length)+"%", pad:1, fillx:1, filly:1, label:result}, {type:"txt", font:"12%", pad:1, fillx:1, filly:1, label:"already exists."}, {type:"h", c: [ - {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "REPLACE", cb:l=>{encodeCard(result);}}, + {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "REPLACE", cb:l=>{addCardName(result);}}, {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label: "CANCEL", cb:l=>{mainMenu();}} ]} ], lazy:true}); g.clear(); alreadyExists.render(); - } - g.clear(); - askPosition(function(lat, lon) { - print("position -- ", lat, lon); - createWP(lat, lon, result); - mainMenu(); - }); + } + addCardName(result); }); } From dbde4923c61566ca64db33def196332625c4f1c8 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 21:56:10 +0100 Subject: [PATCH 47/51] [] wp_editor: reindent, minor cleanups. --- apps/waypoint_editor/app.js | 87 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/apps/waypoint_editor/app.js b/apps/waypoint_editor/app.js index cdc752c79..c9327d621 100644 --- a/apps/waypoint_editor/app.js +++ b/apps/waypoint_editor/app.js @@ -31,7 +31,7 @@ function mainMenu() { print("(no waypoints)"); } else for (let id in wp) { let i = id; - menu[wp[id]["name"]]=()=>{ decode(i); }; + menu[wp[id]["name"]]=()=>{ show(i); }; } menu["Add"]=addCard; menu["Remove"]=removeCard; @@ -78,17 +78,17 @@ function stopGps() { function confirmGps(s) { key = s; - var la = new Layout ( - {type:"v", c: [ - {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, - {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, - {type:"h", c: [ - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{ - print("should mark", key, fix); createWP(fix.lat, fix.lon, key); cancel_gps=true; mainMenu(); - }}, - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{ cancel_gps=true; mainMenu(); }} - ]} - ], lazy:true}); + var la = new Layout ( + {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, + {type:"h", c: [ + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{ + print("should mark", key, fix); createWP(fix.lat, fix.lon, key); cancel_gps=true; mainMenu(); + }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{ cancel_gps=true; mainMenu(); }} + ]} + ], lazy:true}); g.clear(); la.render(); updateGps(); @@ -105,12 +105,12 @@ function markGps() { function setFormat() { var la = new Layout ( - {type:"v", c: [ - {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Format"}, - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD.dddd", cb:l=>{ mode = 0; mainMenu(); }}, - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM.mmm'", cb:l=>{ mode = 1; mainMenu(); }}, - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM'ss"+'"', cb:l=>{ mode = 2; mainMenu(); }}, - ], lazy:true}); + {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:"Format"}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD.dddd", cb:l=>{ mode = 0; mainMenu(); }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM.mmm'", cb:l=>{ mode = 1; mainMenu(); }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "DD MM'ss"+'"', cb:l=>{ mode = 2; mainMenu(); }}, + ], lazy:true}); g.clear(); la.render(); } @@ -134,7 +134,6 @@ function format(x) { return "" + d + " " + mf + "'" + s + '"'; } } - function lat(x) { c = "N"; if (x<0) { @@ -143,7 +142,6 @@ function lat(x) { } return c+format(x); } - function lon(x) { c = "E"; if (x<0) { @@ -153,17 +151,17 @@ function lon(x) { return c+format(x); } -function decode(pin) { - print(pin); - var i = wp[pin]; - var l = i["name"] + "\n" + lat(i["lat"]) + "\n" + lon(i["lon"]); - var la = new Layout ({ - type:"v", c: [ - {type:"txt", font:"10%", pad:1, fillx:1, filly:1, label: l}, - {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label:"OK", cb:l=>{mainMenu();}} - ], lazy:true}); - g.clear(); - la.render(); +function show(pin) { + print(pin); + var i = wp[pin]; + var l = i["name"] + "\n" + lat(i["lat"]) + "\n" + lon(i["lon"]); + var la = new Layout ({ + type:"v", c: [ + {type:"txt", font:"10%", pad:1, fillx:1, filly:1, label: l}, + {type:"btn", font:"10%", pad:1, fillx:1, filly:1, label:"OK", cb:l=>{mainMenu();}} + ], lazy:true}); + g.clear(); + la.render(); } function showNumpad(text, key_, callback) { @@ -307,22 +305,22 @@ function askPosition(callback) { } function createWP(lat, lon, name) { - let n = {}; - n["name"] = name; - n["lat"] = lat; - n["lon"] = lon; - wp.push(n); - print("add -- waypoints", wp); - writeWP(); + let n = {}; + n["name"] = name; + n["lat"] = lat; + n["lon"] = lon; + wp.push(n); + print("add -- waypoints", wp); + writeWP(); } function addCardName(name) { - g.clear(); - askPosition(function(lat, lon) { - print("position -- ", lat, lon); - createWP(lat, lon, result); - mainMenu(); - }); + g.clear(); + askPosition(function(lat, lon) { + print("position -- ", lat, lon); + createWP(lat, lon, result); + mainMenu(); + }); } function addCard() { @@ -346,7 +344,6 @@ function addCard() { }); } - g.reset(); Bangle.setUI(); mainMenu(); From b814454d90f70e9d839c492364840f7dda1e6286 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 22:03:44 +0100 Subject: [PATCH 48/51] [] wp_edit: Graphical fixes for waypoint marking. --- apps/waypoint_editor/app.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/waypoint_editor/app.js b/apps/waypoint_editor/app.js index c9327d621..db77cf794 100644 --- a/apps/waypoint_editor/app.js +++ b/apps/waypoint_editor/app.js @@ -48,13 +48,13 @@ function updateGps() { return; fix = Bangle.getGPSFix(); - speed = getTime() - gps_start; + speed = "no fix for " + (getTime() - gps_start).toFixed(0) + "s"; if (fix && fix.fix && fix.lat) { - lat = "" + fix.lat; - lon = "" + fix.lon; - alt = "" + fix.alt; - speed = "" + fix.speed; + lat = "" + lat(fix.lat); + lon = "" + lon(fix.lon); + alt = "alt " + fix.alt.toFixed(0) + "m"; + speed = "speed " + fix.speed.toFixed(1) + "kt"; have = true; } @@ -80,6 +80,7 @@ function confirmGps(s) { key = s; var la = new Layout ( {type:"v", c: [ + {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, {type:"h", c: [ @@ -263,7 +264,6 @@ function ask01(t, cb) { la.render(); } - function askCoordinate(t1, t2, callback) { let sign = 1; ask01(t1, function(sign) { From 9dd09945a1d06498bcbb03e2be9f93752a16f8ab Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 22:05:47 +0100 Subject: [PATCH 49/51] [] wp_edit: mark this as v0.03 --- apps/waypoint_editor/ChangeLog | 1 + apps/waypoint_editor/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/waypoint_editor/ChangeLog b/apps/waypoint_editor/ChangeLog index 0ec5d2df8..0f45b79cc 100644 --- a/apps/waypoint_editor/ChangeLog +++ b/apps/waypoint_editor/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Display waypoint name instead of its index in remove menu and fix icon +0.03: Use text input for waypoint names, allow marking waypoint with current GPS position diff --git a/apps/waypoint_editor/metadata.json b/apps/waypoint_editor/metadata.json index be3e14d76..d43c6b6bf 100644 --- a/apps/waypoint_editor/metadata.json +++ b/apps/waypoint_editor/metadata.json @@ -1,6 +1,6 @@ { "id": "waypoint_editor", "name": "Waypoint editor", - "version":"0.02", + "version":"0.03", "description": "Allows editing waypoints on device", "icon": "app.png", "readme": "README.md", From b735ae13e46bd0273b6903b2fe4367511c2b3f20 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Fri, 3 Nov 2023 22:19:08 +0100 Subject: [PATCH 50/51] waypoint_editor: fix tabs vs. spaces. --- apps/waypoint_editor/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/waypoint_editor/app.js b/apps/waypoint_editor/app.js index db77cf794..cbdcdbfd3 100644 --- a/apps/waypoint_editor/app.js +++ b/apps/waypoint_editor/app.js @@ -84,10 +84,10 @@ function confirmGps(s) { {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, {type:"txt", font:"15%", pad:1, fillx:1, filly:1, label:""}, {type:"h", c: [ - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{ - print("should mark", key, fix); createWP(fix.lat, fix.lon, key); cancel_gps=true; mainMenu(); - }}, - {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{ cancel_gps=true; mainMenu(); }} + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: "YES", cb:l=>{ + print("should mark", key, fix); createWP(fix.lat, fix.lon, key); cancel_gps=true; mainMenu(); + }}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label: " NO", cb:l=>{ cancel_gps=true; mainMenu(); }} ]} ], lazy:true}); g.clear(); From 3f064961f025ef80134702213690ef943a6fd367 Mon Sep 17 00:00:00 2001 From: Pavel Machek Date: Sat, 4 Nov 2023 09:08:53 +0100 Subject: [PATCH 51/51] wp_edit: we use textinput, include it in dependencies --- apps/waypoint_editor/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/waypoint_editor/metadata.json b/apps/waypoint_editor/metadata.json index d43c6b6bf..87f0ed8ce 100644 --- a/apps/waypoint_editor/metadata.json +++ b/apps/waypoint_editor/metadata.json @@ -7,6 +7,7 @@ "supports" : ["BANGLEJS2"], "allow_emulator": true, "tags": "tool,outdoors,gps", + "dependencies": {"textinput":"type"}, "storage": [ {"name":"waypoint_editor.app.js","url":"app.js"}, {"name":"waypoint_editor.img","url":"app-icon.js","evaluate":true}