From 7bdeb887f4aebcd346cd9bca0acf1175f041ab87 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Thu, 17 Nov 2022 14:41:36 +0100 Subject: [PATCH 01/42] gipy: rescale when lost + indicate nearest point --- apps/gipy/ChangeLog | 4 ++++ apps/gipy/app.js | 36 ++++++++++++++++++++++++++++-------- apps/gipy/metadata.json | 2 +- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 3b0d62009..449f7a1b6 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -63,3 +63,7 @@ * Record traveled distance to get a good average speed. * Breaks (low speed) will not count in average speed. * Bugfix in average speed. + +0.16: + * When lost indicates nearest point on path. + * Rescale display if lost and too far. diff --git a/apps/gipy/app.js b/apps/gipy/app.js index ae82e5dfb..b0b9d3fb8 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -32,6 +32,7 @@ function binary_search(array, x) { class Status { constructor(path) { this.path = path; + this.scale_factor = 40000.0; // multiply geo coordinates by this to get pixels coordinates this.on_path = false; // are we on the path or lost ? this.position = null; // where we are this.adjusted_cos_direction = null; // cos of where we look at @@ -230,8 +231,18 @@ class Status { ); return distance_to_nearest > 50; } + compute_scale() { + if (this.on_path) { + this.scale = 40000.0; + } else { + let projection = this.closest_segment_point(this.path.point(segment), this.path.point(segment+1)); + let distance_to_nearest = this.position.fake_distance(projection); + this.scale = Math.min(66.0 / distance_to_nearest, 40000.0); + } + } display(orientation) { g.clear(); + this.compute_scale(); this.display_map(); this.display_interest_points(); @@ -265,7 +276,8 @@ class Status { let c = interest_point.coordinates( this.position, this.adjusted_cos_direction, - this.adjusted_sin_direction + this.adjusted_sin_direction, + this.scale_factor ); g.setColor(color).fillCircle(c[0], c[1], 5); } @@ -343,9 +355,10 @@ class Status { let half_height = g.getHeight() / 2; let previous_x = null; let previous_y = null; + let scale_factor = this.scale_factor; for (let i = start; i < end; i++) { - let tx = (points[2 * i] - cx) * 40000.0; - let ty = (points[2 * i + 1] - cy) * 40000.0; + let tx = (points[2 * i] - cx) * scale_factor; + let ty = (points[2 * i + 1] - cy) * scale_factor; let rotated_x = tx * cos - ty * sin; let rotated_y = tx * sin + ty * cos; let x = half_width - Math.round(rotated_x); // x is inverted @@ -407,8 +420,8 @@ class Status { this.path.point(this.current_segment + 1) ); - let tx = (projection.lon - cx) * 40000.0; - let ty = (projection.lat - cy) * 40000.0; + let tx = (projection.lon - cx) * scale_factor; + let ty = (projection.lat - cy) * scale_factor; let rotated_x = tx * cos - ty * sin; let rotated_y = tx * sin + ty * cos; let x = half_width - Math.round(rotated_x); // x is inverted @@ -419,7 +432,14 @@ class Status { // display direction to next point if lost if (!this.on_path) { let next_point = this.path.point(this.current_segment + 1); - let diff = next_point.minus(this.position); + let previous_point = this.path.point(this.current_segment); + let nearest_point; + if (previous_point.fake_distance(this.position) < next_point.fake_distance(this.position) { + nearest_point = previous_point; + } else { + nearest_point = next_point; + } + let diff = nearest_point.minus(this.position); let angle = Math.atan2(diff.lat, diff.lon); let tx = Math.cos(angle) * 50.0; let ty = Math.sin(angle) * 50.0; @@ -589,8 +609,8 @@ class Point { this.lon = lon; this.lat = lat; } - coordinates(current_position, cos_direction, sin_direction) { - let translated = this.minus(current_position).times(40000.0); + coordinates(current_position, cos_direction, sin_direction, scale_factor) { + let translated = this.minus(current_position).times(scale_factor); let rotated_x = translated.lon * cos_direction - translated.lat * sin_direction; let rotated_y = diff --git a/apps/gipy/metadata.json b/apps/gipy/metadata.json index 2d06a7c2d..b5e8231dc 100644 --- a/apps/gipy/metadata.json +++ b/apps/gipy/metadata.json @@ -2,7 +2,7 @@ "id": "gipy", "name": "Gipy", "shortName": "Gipy", - "version": "0.15", + "version": "0.16", "description": "Follow gpx files", "allow_emulator":false, "icon": "gipy.png", From 7e1edf763f53bb3a36cfebbccbe162f04a92d318 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Thu, 17 Nov 2022 14:51:21 +0100 Subject: [PATCH 02/42] gipy: correcting typo --- apps/gipy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index b0b9d3fb8..0618a9595 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -434,7 +434,7 @@ class Status { let next_point = this.path.point(this.current_segment + 1); let previous_point = this.path.point(this.current_segment); let nearest_point; - if (previous_point.fake_distance(this.position) < next_point.fake_distance(this.position) { + if (previous_point.fake_distance(this.position) < next_point.fake_distance(this.position)) { nearest_point = previous_point; } else { nearest_point = next_point; From 4e5d2ddd348557ea74f97fd394eccbcd8ad9e3ad Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Thu, 17 Nov 2022 17:08:54 +0100 Subject: [PATCH 03/42] gipy: bugfixes in scale code --- apps/gipy/app.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 0618a9595..39d0987ed 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -233,11 +233,14 @@ class Status { } compute_scale() { if (this.on_path) { - this.scale = 40000.0; + this.scale_factor = 40000.0; } else { - let projection = this.closest_segment_point(this.path.point(segment), this.path.point(segment+1)); - let distance_to_nearest = this.position.fake_distance(projection); - this.scale = Math.min(66.0 / distance_to_nearest, 40000.0); + let segment = this.current_segment; + let distance_to_nearest = this.position.fake_distance_to_segment( + this.path.point(segment), + this.path.point(segment + 1) + ); + this.scale_factor = Math.min(66.0 / distance_to_nearest, 40000.0); } } display(orientation) { @@ -434,7 +437,10 @@ class Status { let next_point = this.path.point(this.current_segment + 1); let previous_point = this.path.point(this.current_segment); let nearest_point; - if (previous_point.fake_distance(this.position) < next_point.fake_distance(this.position)) { + if ( + previous_point.fake_distance(this.position) < + next_point.fake_distance(this.position) + ) { nearest_point = previous_point; } else { nearest_point = next_point; @@ -691,7 +697,7 @@ function simulate_gps(status) { return; } let point_index = Math.floor(fake_gps_point); - if (point_index >= status.path.len) { + if (point_index >= status.path.len - 1) { return; } //let p1 = status.path.point(0); From f6a7e5665b9197337d50b94654d5603951d116ad Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Sat, 19 Nov 2022 13:48:26 +0100 Subject: [PATCH 04/42] gipy: minor speed improvements + profiling --- apps/gipy/ChangeLog | 2 + apps/gipy/app.js | 92 ++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 52 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 449f7a1b6..5ecb43663 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -67,3 +67,5 @@ 0.16: * When lost indicates nearest point on path. * Rescale display if lost and too far. + * New setting to hide points and increase display speed. + * Minor speed optimisations. diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 39d0987ed..9d85402d9 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -1,4 +1,4 @@ -let simulated = false; +let simulated = true; let file_version = 3; let code_key = 47490; @@ -6,10 +6,23 @@ var settings = Object.assign( { keep_gps_alive: true, max_speed: 35, + display_points: true, }, require("Storage").readJSON("gipy.json", true) || {} ); +let profile_start_times = []; + +function start_profiling() { + profile_start_times.push(getTime()); +} + +function end_profiling(label) { + let end_time = getTime(); + let elapsed = end_time - profile_start_times.pop(); + console.log("profile:", label, "took", elapsed); +} + let interests_colors = [ 0xf800, // Bakery, red 0x001f, // DrinkingWater, blue @@ -42,6 +55,7 @@ class Status { this.distance_to_next_point = null; // how far are we from next point ? this.paused_time = 0.0; // how long did we stop (stops don't count in avg speed) this.paused_since = getTime(); + this.projected_point = null; let r = [0]; // let's do a reversed prefix computations on all distances: @@ -224,29 +238,29 @@ class Status { return this.remaining_distances[0] - remaining_in_correct_orientation; } } + // check if we are lost (too far from segment we think we are on) + // if we are adjust scale so that path will still be displayed. + // we do the scale adjustment here to avoid recomputations later on. is_lost(segment) { - let distance_to_nearest = this.position.distance_to_segment( + let projection = this.position.closest_segment_point( this.path.point(segment), this.path.point(segment + 1) ); - return distance_to_nearest > 50; - } - compute_scale() { - if (this.on_path) { - this.scale_factor = 40000.0; + this.projected_point = projection; // save this info for display + let distance_to_projection = this.position.distance(projection); + if (distance_to_projection > 50) { + this.scale_factor = Math.min(66.0 / distance_to_projection, 40000.0); + return true; } else { - let segment = this.current_segment; - let distance_to_nearest = this.position.fake_distance_to_segment( - this.path.point(segment), - this.path.point(segment + 1) - ); - this.scale_factor = Math.min(66.0 / distance_to_nearest, 40000.0); + this.scale_factor = 40000.0; + return false; } } display(orientation) { g.clear(); - this.compute_scale(); + // start_profiling(); this.display_map(); + // end_profiling("display_map"); this.display_interest_points(); this.display_stats(orientation); @@ -380,10 +394,12 @@ class Status { g.setColor(g.theme.bg); g.fillCircle(previous_x, previous_y, 5); } - g.setColor(g.theme.fg); - g.fillCircle(previous_x, previous_y, 4); - g.setColor(g.theme.bg); - g.fillCircle(previous_x, previous_y, 3); + if (settings.display_points) { + g.setColor(g.theme.fg); + g.fillCircle(previous_x, previous_y, 4); + g.setColor(g.theme.bg); + g.fillCircle(previous_x, previous_y, 3); + } } previous_x = x; @@ -405,26 +421,9 @@ class Status { g.setColor(g.theme.fgH); g.fillCircle(half_width, half_height, 5); - // display old points for direction debug - // for (let i = 0; i < this.old_points.length; i++) { - // let tx = (this.old_points[i].lon - cx) * 40000.0; - // let ty = (this.old_points[i].lat - cy) * 40000.0; - // let rotated_x = tx * cos - ty * sin; - // let rotated_y = tx * sin + ty * cos; - // let x = half_width - Math.round(rotated_x); // x is inverted - // let y = half_height + Math.round(rotated_y); - // g.setColor((i + 1) / 4.0, 0.0, 0.0); - // g.fillCircle(x, y, 3); - // } - - // display current-segment's projection for debug - let projection = pos.closest_segment_point( - this.path.point(this.current_segment), - this.path.point(this.current_segment + 1) - ); - - let tx = (projection.lon - cx) * scale_factor; - let ty = (projection.lat - cy) * scale_factor; + // display current-segment's projection + let tx = (this.projected_point.lon - cx) * scale_factor; + let ty = (this.projected_point.lat - cy) * scale_factor; let rotated_x = tx * cos - ty * sin; let rotated_y = tx * sin + ty * cos; let x = half_width - Math.round(rotated_x); // x is inverted @@ -679,14 +678,6 @@ class Point { let t = Math.max(0, Math.min(1, this.minus(v).dot(w.minus(v)) / l2)); return v.plus(w.minus(v).times(t)); // Projection falls on the segment } - distance_to_segment(v, w) { - let projection = this.closest_segment_point(v, w); - return this.distance(projection); - } - fake_distance_to_segment(v, w) { - let projection = this.closest_segment_point(v, w); - return this.fake_distance(projection); - } } Bangle.loadWidgets(); @@ -697,14 +688,11 @@ function simulate_gps(status) { return; } let point_index = Math.floor(fake_gps_point); - if (point_index >= status.path.len - 1) { + if (point_index >= status.path.len / 2 - 1) { return; } - //let p1 = status.path.point(0); - //let n = status.path.len; - //let p2 = status.path.point(n - 1); - let p1 = status.path.point(point_index); - let p2 = status.path.point(point_index + 1); + let p1 = status.path.point(2 * point_index); + let p2 = status.path.point(2 * (point_index + 1)); let alpha = fake_gps_point - point_index; let pos = p1.times(1 - alpha).plus(p2.times(alpha)); From 7685d347fd2465b7dfa0e3a77694553cf0a308f2 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Sun, 20 Nov 2022 08:40:33 +0100 Subject: [PATCH 05/42] gipy: speeding up lost code --- apps/gipy/ChangeLog | 2 +- apps/gipy/app.js | 117 ++++++++++++++++++++++++-------------------- 2 files changed, 64 insertions(+), 55 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 5ecb43663..35dadeb15 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -68,4 +68,4 @@ * When lost indicates nearest point on path. * Rescale display if lost and too far. * New setting to hide points and increase display speed. - * Minor speed optimisations. + * Speed optimisations. diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 9d85402d9..cb00bca84 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -1,4 +1,4 @@ -let simulated = true; +let simulated = false; let file_version = 3; let code_key = 47490; @@ -168,6 +168,7 @@ class Status { let next_segment = res[1]; if (this.is_lost(next_segment)) { + // start_profiling(); // it did not work, try anywhere res = this.path.nearest_segment( this.position, @@ -178,6 +179,7 @@ class Status { ); orientation = res[0]; next_segment = res[1]; + // end_profiling("repositioning"); } // now check if we strayed away from path or back to it let lost = this.is_lost(next_segment); @@ -373,6 +375,30 @@ class Status { let previous_x = null; let previous_y = null; let scale_factor = this.scale_factor; + + // display direction to next point if lost + if (!this.on_path) { + let next_point = this.path.point(this.current_segment + 1); + let previous_point = this.path.point(this.current_segment); + let nearest_point; + if ( + previous_point.fake_distance(this.position) < + next_point.fake_distance(this.position) + ) { + nearest_point = previous_point; + } else { + nearest_point = next_point; + } + let tx = (nearest_point.lon - cx) * scale_factor; + let ty = (nearest_point.lat - cy) * scale_factor; + let rotated_x = tx * cos - ty * sin; + let rotated_y = tx * sin + ty * cos; + let x = half_width - Math.round(rotated_x); // x is inverted + let y = half_height + Math.round(rotated_y); + g.setColor(g.theme.fgH).drawLine(half_width, half_height, x, y); + } + + // now display path for (let i = start; i < end; i++) { let tx = (points[2 * i] - cx) * scale_factor; let ty = (points[2 * i + 1] - cy) * scale_factor; @@ -381,11 +407,7 @@ class Status { let x = half_width - Math.round(rotated_x); // x is inverted let y = half_height + Math.round(rotated_y); if (previous_x !== null) { - if (i == this.current_segment + 1) { - g.setColor(0.0, 1.0, 0.0); - } else { - g.setColor(1.0, 0.0, 0.0); - } + g.setColor(g.theme.fg); g.drawLine(previous_x, previous_y, x, y); if (this.path.is_waypoint(i - 1)) { @@ -428,32 +450,8 @@ class Status { let rotated_y = tx * sin + ty * cos; let x = half_width - Math.round(rotated_x); // x is inverted let y = half_height + Math.round(rotated_y); - g.setColor(g.theme.fg); + g.setColor(g.theme.fgH); g.fillCircle(x, y, 4); - - // display direction to next point if lost - if (!this.on_path) { - let next_point = this.path.point(this.current_segment + 1); - let previous_point = this.path.point(this.current_segment); - let nearest_point; - if ( - previous_point.fake_distance(this.position) < - next_point.fake_distance(this.position) - ) { - nearest_point = previous_point; - } else { - nearest_point = next_point; - } - let diff = nearest_point.minus(this.position); - let angle = Math.atan2(diff.lat, diff.lon); - let tx = Math.cos(angle) * 50.0; - let ty = Math.sin(angle) * 50.0; - let rotated_x = tx * cos - ty * sin; - let rotated_y = tx * sin + ty * cos; - let x = half_width - Math.round(rotated_x); // x is inverted - let y = half_height + Math.round(rotated_y); - g.setColor(g.theme.fgH).drawLine(half_width, half_height, x, y); - } } } @@ -569,25 +567,12 @@ class Path { this.on_segments( function (p1, p2, i) { // we use the dot product to figure out if oriented correctly - // let distance = point.fake_distance_to_segment(p1, p2); + let closest_point = point.closest_segment_point(p1, p2); + let distance = point.length_squared(closest_point); - let projection = point.closest_segment_point(p1, p2); - let distance = point.fake_distance(projection); - - // let d = projection.minus(point).times(40000.0); - // let rotated_x = d.lon * acos - d.lat * asin; - // let rotated_y = d.lon * asin + d.lat * acos; - // let x = g.getWidth() / 2 - Math.round(rotated_x); // x is inverted - // let y = g.getHeight() / 2 + Math.round(rotated_y); - // - let diff = p2.minus(p1); - let dot = cos_direction * diff.lon + sin_direction * diff.lat; + let dot = + cos_direction * (p2.lon - p1.lon) + sin_direction * (p2.lat - p1.lat); let orientation = +(dot < 0); // index 0 is good orientation - // g.setColor(0.0, 0.0 + orientation, 1.0 - orientation).fillCircle( - // x, - // y, - // 10 - // ); if (distance <= mins[orientation]) { mins[orientation] = distance; indices[orientation] = i - 1; @@ -598,7 +583,7 @@ class Path { ); // by default correct orientation (0) wins // but if other one is really closer, return other one - if (mins[1] < mins[0] / 10.0) { + if (mins[1] < mins[0] / 100.0) { return [1, indices[1]]; } else { return [0, indices[0]]; @@ -634,8 +619,9 @@ class Point { return new Point(this.lon + other_point.lon, this.lat + other_point.lat); } length_squared(other_point) { - let d = this.minus(other_point); - return d.lon * d.lon + d.lat * d.lat; + let londiff = this.lon - other_point.lon; + let latdiff = this.lat - other_point.lat; + return londiff * londiff + latdiff * latdiff; } times(scalar) { return new Point(this.lon * scalar, this.lat * scalar); @@ -664,10 +650,15 @@ class Point { fake_distance(other_point) { return Math.sqrt(this.length_squared(other_point)); } + // return closest point from 'this' on [v,w] segment. + // since this function is critical we inline all code here. closest_segment_point(v, w) { // from : https://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment // Return minimum distance between line segment vw and point p - let l2 = v.length_squared(w); // i.e. |w-v|^2 - avoid a sqrt + let segment_londiff = w.lon - v.lon; + let segment_latdiff = w.lat - v.lat; + let l2 = + segment_londiff * segment_londiff + segment_latdiff * segment_latdiff; // i.e. |w-v|^2 - avoid a sqrt if (l2 == 0.0) { return v; // v == w case } @@ -675,8 +666,22 @@ class Point { // We find projection of point p onto the line. // It falls where t = [(p-v) . (w-v)] / |w-v|^2 // We clamp t from [0,1] to handle points outside the segment vw. - let t = Math.max(0, Math.min(1, this.minus(v).dot(w.minus(v)) / l2)); - return v.plus(w.minus(v).times(t)); // Projection falls on the segment + + // let t = Math.max(0, Math.min(1, this.minus(v).dot(w.minus(v)) / l2)); //inlined below + let start_londiff = this.lon - v.lon; + let start_latdiff = this.lat - v.lat; + let t = + (start_londiff * segment_londiff + start_latdiff * segment_latdiff) / l2; + if (t < 0) { + t = 0; + } else { + if (t > 1) { + t = 1; + } + } + let lon = v.lon + segment_londiff * t; + let lat = v.lat + segment_latdiff * t; + return new Point(lon, lat); } } @@ -684,6 +689,9 @@ Bangle.loadWidgets(); let fake_gps_point = 0.0; function simulate_gps(status) { + // let's keep the screen on in simulations + Bangle.setLCDTimeout(0); + Bangle.setLCDPower(1); if (fake_gps_point > status.path.len - 1) { return; } @@ -699,6 +707,7 @@ function simulate_gps(status) { let old_pos = status.position; fake_gps_point += 0.05; // advance simulation + // status.update_position(new Point(1, 1), null); // uncomment to be always lost status.update_position(pos, null); } From adc83746ad4da5ab0e049cba04086fe654035369 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Sun, 20 Nov 2022 12:04:49 +0100 Subject: [PATCH 06/42] gipy: more lost speedup + scale bugfix --- apps/gipy/app.js | 51 +++++++++++++++++++----------------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index cb00bca84..0077ef509 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -251,7 +251,8 @@ class Status { this.projected_point = projection; // save this info for display let distance_to_projection = this.position.distance(projection); if (distance_to_projection > 50) { - this.scale_factor = Math.min(66.0 / distance_to_projection, 40000.0); + this.scale_factor = + Math.min(66.0 / distance_to_projection, 1.0) * 40000.0; return true; } else { this.scale_factor = 40000.0; @@ -525,20 +526,6 @@ class Path { return r != 0; } - // execute op on all segments. - // start is index of first wanted segment - // end is 1 after index of last wanted segment - on_segments(op, start, end) { - let previous_point = null; - for (let i = start; i < end + 1; i++) { - let point = new Point(this.points[2 * i], this.points[2 * i + 1]); - if (previous_point !== null) { - op(previous_point, point, i); - } - previous_point = point; - } - } - // return point at given index point(index) { let lon = this.points[2 * index]; @@ -564,23 +551,25 @@ class Path { // we are going to compute two min distances, one for each direction. let indices = [0, 0]; let mins = [Number.MAX_VALUE, Number.MAX_VALUE]; - this.on_segments( - function (p1, p2, i) { - // we use the dot product to figure out if oriented correctly - let closest_point = point.closest_segment_point(p1, p2); - let distance = point.length_squared(closest_point); - let dot = - cos_direction * (p2.lon - p1.lon) + sin_direction * (p2.lat - p1.lat); - let orientation = +(dot < 0); // index 0 is good orientation - if (distance <= mins[orientation]) { - mins[orientation] = distance; - indices[orientation] = i - 1; - } - }, - start, - end - ); + let p1 = new Point(this.points[2 * start], this.points[2 * start + 1]); + for (let i = start + 1; i < end + 1; i++) { + let p2 = new Point(this.points[2 * i], this.points[2 * i + 1]); + + let closest_point = point.closest_segment_point(p1, p2); + let distance = point.length_squared(closest_point); + + let dot = + cos_direction * (p2.lon - p1.lon) + sin_direction * (p2.lat - p1.lat); + let orientation = +(dot < 0); // index 0 is good orientation + if (distance <= mins[orientation]) { + mins[orientation] = distance; + indices[orientation] = i - 1; + } + + p1 = p2; + } + // by default correct orientation (0) wins // but if other one is really closer, return other one if (mins[1] < mins[0] / 100.0) { From 71245dcff6c7d3c6fcab3924a85cdd025d19a4aa Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Mon, 21 Nov 2022 14:08:02 +0100 Subject: [PATCH 07/42] gipy : new interface to double check upload --- apps/gipy/interface.html | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/gipy/interface.html b/apps/gipy/interface.html index a1c405ed7..552e7be17 100644 --- a/apps/gipy/interface.html +++ b/apps/gipy/interface.html @@ -182,12 +182,21 @@ document document .getElementById("upload") .addEventListener('click', function() { + document.getElementById('upload').disabled = true; status.innerHTML = "uploading file"; console.log("uploading"); let gpc_string = vec_to_string(gpc_content); Util.writeStorage(gpc_filename + ".gpc", gpc_string, () => { - status.innerHTML = `${gpc_filename}.gpc uploaded`; - console.log("DONE"); + status.innerHTML = "Checking upload"; + Util.readStorage(gpc_filename + ".gpc", uploaded_content => { + if (uploaded_content == gpc_string) { + status.innerHTML = `${gpc_filename}.gpc uploaded`; + console.log("DONE"); + } else { + status.innerHTML = "Upload FAILED"; + document.getElementById('upload').disabled = false; + } + }); }); }); From 230800d403fc8bb9b37b1e03135caf82de9f986a Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Tue, 22 Nov 2022 13:48:12 +0100 Subject: [PATCH 08/42] gipy : checking file size somehow it does not load on the watch --- apps/gipy/app.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 0077ef509..f5c15d084 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -458,6 +458,7 @@ class Status { function load_gpc(filename) { let buffer = require("Storage").readArrayBuffer(filename); + let file_size = buffer.length; let offset = 0; // header @@ -499,6 +500,20 @@ function load_gpc(filename) { let interests_starts = Uint16Array(buffer, offset, starts_length); offset += 2 * starts_length; + console.log("checksuming file"); + // checksum file size + let expected_size = 10 + 16 * (points_number + interests_number) + 2 * (Math.ceil(interests_on_path_number / 5)+1); + if (expected_size != file_size) { + console.log("invalid checksum", file_size, expected_size); + let msg = "invalid file\nsize is" + str(file_size) + "\ninstead of"+str(expected_size) + "\ncontinue ?"; + E.showPrompt(msg).then(() => { + if (!v) { + load(); + } + }); + } + console.log("file loaded"); + return [ points, waypoints, From 45e39af3597f87121408855e5ab5b7a140d67a16 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Tue, 22 Nov 2022 19:53:25 +0100 Subject: [PATCH 09/42] gipy: checking file size but we can't hide the alert ? --- apps/gipy/app.js | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index f5c15d084..42d3f64ce 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -500,21 +500,7 @@ function load_gpc(filename) { let interests_starts = Uint16Array(buffer, offset, starts_length); offset += 2 * starts_length; - console.log("checksuming file"); - // checksum file size - let expected_size = 10 + 16 * (points_number + interests_number) + 2 * (Math.ceil(interests_on_path_number / 5)+1); - if (expected_size != file_size) { - console.log("invalid checksum", file_size, expected_size); - let msg = "invalid file\nsize is" + str(file_size) + "\ninstead of"+str(expected_size) + "\ncontinue ?"; - E.showPrompt(msg).then(() => { - if (!v) { - load(); - } - }); - } - console.log("file loaded"); - - return [ + let path_data = [ points, waypoints, interests_coordinates, @@ -522,6 +508,18 @@ function load_gpc(filename) { interests_on_path, interests_starts, ]; + + // checksum file size + if (offset != file_size) { + console.log("invalid file size", file_size, "expected", offset); + let msg = "invalid file\nsize " + file_size + "\ninstead of"+ offset; + E.showAlert(msg).then(function() { + E.showAlert(); + start_gipy(path_data); + }); + } else { + start_gipy(path_data); + } } class Path { @@ -733,8 +731,12 @@ function start(fn) { E.showMenu(); console.log("loading", fn); - // let path = new Path(load_gpx("test.gpx")); - let path = new Path(load_gpc(fn)); + load_gpc(fn); +} + +function start_gipy(path_data) { + console.log("starting"); + let path = new Path(path_data); let status = new Status(path); if (simulated) { From 2abe29d8ee2fb04ed88ab6708830f85b130479f9 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Fri, 25 Nov 2022 20:59:33 +0100 Subject: [PATCH 10/42] gipy : eta + arrow --- apps/gipy/ChangeLog | 2 ++ apps/gipy/app.js | 53 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 35dadeb15..b4057af13 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -69,3 +69,5 @@ * Rescale display if lost and too far. * New setting to hide points and increase display speed. * Speed optimisations. + * Display small arrow symbol if going backwards. + * Estimated time of Arrival. diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 42d3f64ce..9f02032b6 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -11,6 +11,20 @@ var settings = Object.assign( require("Storage").readJSON("gipy.json", true) || {} ); +let back_arrow = ` + ***** + * ***** + * ***** + ** ***** + ************** +*************** + ************* + ** + * + * +`; +let back_arrow_img = Graphics.createImage(back_arrow); + let profile_start_times = []; function start_profiling() { @@ -42,6 +56,25 @@ function binary_search(array, x) { return start; } +// return a string containing estimated time of arrival. +// speed is in km/h +// remaining distance in km +// hour, minutes is current time +function compute_eta(hour, minutes, approximate_speed, remaining_distance) { + if (isNaN(approximate_speed) || approximate_speed < 0.1) { + return ""; + } + let time_needed = (remaining_distance * 60) / approximate_speed; // in minutes + let eta_in_minutes = hour * 60 + minutes + time_needed; + let eta_minutes = Math.round(eta_in_minutes % 60); + let eta_hour = Math.round((eta_in_minutes - eta_minutes) / 60) % 24; + if (eta_minutes < 10) { + return eta_hour.toString() + ":0" + eta_minutes; + } else { + return eta_hour.toString() + ":" + eta_minutes; + } +} + class Status { constructor(path) { this.path = path; @@ -328,8 +361,22 @@ class Status { let approximate_speed = Math.round( (this.advanced_distance * 3.6) / done_in ); - let approximate_instant_speed = Math.round(this.instant_speed * 3.6); + let eta = compute_eta( + now.getHours(), + now.getMinutes(), + approximate_speed, + remaining_distance / 1000 + ); + g.setFont("6x8:2") + .setFontAlign(-1, -1, 0) + .setColor(g.theme.fg) + .drawString(eta, 0, 48); + if (this.orientation == 1) { + g.drawImage(back_arrow_img, 62, 32); + } + + let approximate_instant_speed = Math.round(this.instant_speed * 3.6); g.setFont("6x8:2") .setFontAlign(-1, -1, 0) .drawString( @@ -512,8 +559,8 @@ function load_gpc(filename) { // checksum file size if (offset != file_size) { console.log("invalid file size", file_size, "expected", offset); - let msg = "invalid file\nsize " + file_size + "\ninstead of"+ offset; - E.showAlert(msg).then(function() { + let msg = "invalid file\nsize " + file_size + "\ninstead of" + offset; + E.showAlert(msg).then(function () { E.showAlert(); start_gipy(path_data); }); From 60fc2d6d888d72b33ab6e79a8a87edc7b9fc25d3 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Sat, 26 Nov 2022 21:34:48 +0100 Subject: [PATCH 11/42] gipy: minor bugfix for orientation display --- apps/gipy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 9f02032b6..8c706e0eb 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -372,7 +372,7 @@ class Status { .setFontAlign(-1, -1, 0) .setColor(g.theme.fg) .drawString(eta, 0, 48); - if (this.orientation == 1) { + if (orientation == 1) { g.drawImage(back_arrow_img, 62, 32); } From 8b11c8f4d97b88df58d9f9039fb6b1482df88fb2 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Mon, 19 Dec 2022 20:42:54 +0100 Subject: [PATCH 12/42] gipy: eta + zoom changes --- apps/gipy/ChangeLog | 3 +-- apps/gipy/app.js | 61 ++++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index b4057af13..40eb3d9a8 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -69,5 +69,4 @@ * Rescale display if lost and too far. * New setting to hide points and increase display speed. * Speed optimisations. - * Display small arrow symbol if going backwards. - * Estimated time of Arrival. + * Estimated time of Arrival/Going back. diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 8c706e0eb..974ad2528 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -11,20 +11,6 @@ var settings = Object.assign( require("Storage").readJSON("gipy.json", true) || {} ); -let back_arrow = ` - ***** - * ***** - * ***** - ** ***** - ************** -*************** - ************* - ** - * - * -`; -let back_arrow_img = Graphics.createImage(back_arrow); - let profile_start_times = []; function start_profiling() { @@ -285,7 +271,7 @@ class Status { let distance_to_projection = this.position.distance(projection); if (distance_to_projection > 50) { this.scale_factor = - Math.min(66.0 / distance_to_projection, 1.0) * 40000.0; + Math.min(88.0 / distance_to_projection, 1.0) * 40000.0; return true; } else { this.scale_factor = 40000.0; @@ -336,8 +322,10 @@ class Status { } } display_stats(orientation) { - let remaining_distance = this.remaining_distance(orientation); - let rounded_distance = Math.round(remaining_distance / 100) / 10; + let remaining_forward_distance = this.remaining_distance(0); + let remaining_backward_distance = this.remaining_distance(1); + let rounded_forward_distance = + Math.round(remaining_forward_distance / 100) / 10; let total = Math.round(this.remaining_distances[0] / 100) / 10; let now = new Date(); let minutes = now.getMinutes().toString(); @@ -345,11 +333,7 @@ class Status { minutes = "0" + minutes; } let hours = now.getHours().toString(); - g.setFont("6x8:2") - .setFontAlign(-1, -1, 0) - .setColor(g.theme.fg) - .drawString(hours + ":" + minutes, 0, 30); - + // now, distance to next point in meters g.setFont("6x8:2").drawString( "" + this.distance_to_next_point + "m", 0, @@ -362,20 +346,37 @@ class Status { (this.advanced_distance * 3.6) / done_in ); - let eta = compute_eta( + let forward_eta = compute_eta( now.getHours(), now.getMinutes(), approximate_speed, - remaining_distance / 1000 + remaining_forward_distance / 1000 ); + + let backward_eta = compute_eta( + now.getHours(), + now.getMinutes(), + approximate_speed, + remaining_backward_distance / 1000 + ); + + // display backward ETA g.setFont("6x8:2") .setFontAlign(-1, -1, 0) .setColor(g.theme.fg) - .drawString(eta, 0, 48); - if (orientation == 1) { - g.drawImage(back_arrow_img, 62, 32); - } + .drawString(backward_eta, 0, 30); + // display the clock + g.setFont("6x8:2") + .setFontAlign(-1, -1, 0) + .setColor(g.theme.fg) + .drawString(hours + ":" + minutes, 0, 48); + // now display ETA + g.setFont("6x8:2") + .setFontAlign(-1, -1, 0) + .setColor(g.theme.fg) + .drawString(forward_eta, 0, 66); + // display speed (avg and instant) let approximate_instant_speed = Math.round(this.instant_speed * 3.6); g.setFont("6x8:2") .setFontAlign(-1, -1, 0) @@ -385,12 +386,14 @@ class Status { g.getHeight() - 15 ); + // display distance on path g.setFont("6x8:2").drawString( - "" + rounded_distance + "/" + total, + "" + rounded_forward_distance + "/" + total, 0, g.getHeight() - 32 ); + // display various indicators if (this.distance_to_next_point <= 100) { if (this.path.is_waypoint(this.reaching)) { g.setColor(0.0, 1.0, 0.0) From 5fe225dc0bcc890bf07d92dc2ad8869155cb56ec Mon Sep 17 00:00:00 2001 From: Simon Weis Date: Sun, 25 Dec 2022 20:03:14 +0100 Subject: [PATCH 13/42] [entonclk] Add timer function --- apps/entonclk/ChangeLog | 3 +- apps/entonclk/README.md | 14 +++- apps/entonclk/app.js | 150 +++++++++++++++++++++++++----------- apps/entonclk/metadata.json | 4 +- 4 files changed, 121 insertions(+), 50 deletions(-) diff --git a/apps/entonclk/ChangeLog b/apps/entonclk/ChangeLog index 62e2d0c20..e16defa54 100644 --- a/apps/entonclk/ChangeLog +++ b/apps/entonclk/ChangeLog @@ -1 +1,2 @@ -0.1: New App! \ No newline at end of file +0.1: New App! +0.2: Now with timer function diff --git a/apps/entonclk/README.md b/apps/entonclk/README.md index 8c788c7a5..c67cc19c8 100644 --- a/apps/entonclk/README.md +++ b/apps/entonclk/README.md @@ -6,4 +6,16 @@ Things I changed: - The main font for the time is now Audiowide - Removed the written out day name and replaced it with steps and bpm -- Changed the date string to a (for me) more readable string \ No newline at end of file +- Changed the date string to a (for me) more readable string + +Timer function: +- Touch the right side, to start the timer +- Initial timer timeout is 300s/5min +- Right touch again, add 300s/5min to timeout +- Left touch, decrease timeout by 60s/1min +- So it is easy, to add timeouts like 7min/3min or 12min +- Special thanks to the maintainer of the a_clock_timer app from which I borrowed the code. + +Todo: +- Make displayed information configurable, after https://github.com/espruino/BangleApps/issues/2226 +- Clean up code diff --git a/apps/entonclk/app.js b/apps/entonclk/app.js index 69fdea479..f86b02cbd 100644 --- a/apps/entonclk/app.js +++ b/apps/entonclk/app.js @@ -7,61 +7,119 @@ Graphics.prototype.setFontAudiowide = function() { }; function getSteps() { - var steps = 0; - try{ - if (WIDGETS.wpedom !== undefined) { - steps = WIDGETS.wpedom.getSteps(); - } else if (WIDGETS.activepedom !== undefined) { - steps = WIDGETS.activepedom.getSteps(); - } else { - steps = Bangle.getHealthStatus("day").steps; - } + var steps = 0; + try{ + if (WIDGETS.wpedom !== undefined) { + steps = WIDGETS.wpedom.getSteps(); + } else if (WIDGETS.activepedom !== undefined) { + steps = WIDGETS.activepedom.getSteps(); + } else { + steps = Bangle.getHealthStatus("day").steps; + } } catch(ex) { - // In case we failed, we can only show 0 steps. - return "?"; + // In case we failed, we can only show 0 steps. + return "?"; } - return Math.round(steps); + return Math.round(steps); } { // must be inside our own scope here so that when we are unloaded everything disappears // we also define functions using 'let fn = function() {..}' for the same reason. function decls are global -let drawTimeout; + let drawTimeout; -// Actually draw the watch face -let draw = function() { - var x = g.getWidth() / 2; - var y = g.getHeight() / 2; - g.reset().clearRect(Bangle.appRect); // clear whole background (w/o widgets) - var date = new Date(); - var timeStr = require("locale").time(date, 1); // Hour and minute - g.setFontAlign(0, 0).setFont("Audiowide").drawString(timeStr, x, y); - var dateStr = require("locale").date(date, 1).toUpperCase(); - g.setFontAlign(0, 0).setFont("6x8", 2).drawString(dateStr, x, y+28); - g.setFontAlign(0, 0).setFont("6x8", 2); - g.drawString(getSteps(), 50, y+70); - g.drawString(Math.round(Bangle.getHealthStatus("last").bpm), g.getWidth() -37, y + 70); + // Actually draw the watch face + let draw = function() { + var x = g.getWidth() / 2; + var y = g.getHeight() / 2; + g.reset().clearRect(Bangle.appRect); // clear whole background (w/o widgets) + var date = new Date(); + var timeStr = require("locale").time(date, 1); // Hour and minute + g.setFontAlign(0, 0).setFont("Audiowide").drawString(timeStr, x, y); + var dateStr = require("locale").date(date, 1).toUpperCase(); + g.setFontAlign(0, 0).setFont("6x8", 2).drawString(dateStr, x, y+28); + g.setFontAlign(0, 0).setFont("6x8", 2); + g.drawString(getSteps(), 50, y+70); + g.drawString(Math.round(Bangle.getHealthStatus("last").bpm), g.getWidth() -37, y + 70); - // queue next draw - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); -}; - -// Show launcher when middle button pressed -Bangle.setUI({ - mode : "clock", - remove : function() { - // Called to unload all of the clock app + // queue next draw if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - delete Graphics.prototype.setFontAnton; - }}); -// Load widgets -Bangle.loadWidgets(); -draw(); -setTimeout(Bangle.drawWidgets,0); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); + }; + + // Show launcher when middle button pressed + Bangle.setUI({ + mode : "clock", + remove : function() { + // Called to unload all of the clock app + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + delete Graphics.prototype.setFontAnton; + }}); + // Load widgets + Bangle.loadWidgets(); + draw(); + setTimeout(Bangle.drawWidgets,0); +} + +// Timer function +var timervalue = 0; +var istimeron = false; +var timertick; + +Bangle.on('touch',t => { + if (t == 1) { + // Touch on the left, reduce timervalue about 60s + Bangle.buzz(30); + if (timervalue < 60) { timervalue = 1 ; } + else { timervalue -= 60; } + } + // Touch on the right, raise timervaule about 300s + else if (t == 2) { + Bangle.buzz(30); + if (!istimeron) { + istimeron = true; + timertick = setInterval(countDown, 1000); + } + timervalue += 60*5; + } +}); + +function timeToString(duration) { + var hrs = ~~(duration / 3600); + var mins = ~~((duration % 3600) / 60); + var secs = ~~duration % 60; + var ret = ""; + if (hrs > 0) { + ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); + } + ret += "" + mins + ":" + (secs < 10 ? "0" : ""); + ret += "" + secs; + return ret; +} + +function countDown() { + timervalue--; + + g.reset().clearRect(0, 40, 44+99, g.getHeight()/2-25); + + g.setFontAlign(0, -1, 0); + g.setFont("6x8", 2).drawString(timeToString(timervalue), 95, g.getHeight()/2-50); + + if (timervalue <= 0) { + istimeron = false; + clearInterval(timertick); + + Bangle.buzz().then(()=>{ + return new Promise(resolve=>setTimeout(resolve, 500)); + }).then(()=>{ + return Bangle.buzz(1000); + }); + } + else + if ((timervalue <= 30) && (timervalue % 10 == 0)) { Bangle.buzz(); } } diff --git a/apps/entonclk/metadata.json b/apps/entonclk/metadata.json index 7e4947406..4b7174263 100644 --- a/apps/entonclk/metadata.json +++ b/apps/entonclk/metadata.json @@ -1,8 +1,8 @@ { "id": "entonclk", "name": "Enton Clock", - "version": "0.1", - "description": "A simple clock using the Audiowide font. ", + "version": "0.2", + "description": "A simple clock using the Audiowide font with timer. ", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", From 068e639405542c2b82a54b16bb569efe4ef455bc Mon Sep 17 00:00:00 2001 From: Simon Weis Date: Sun, 25 Dec 2022 19:28:20 +0000 Subject: [PATCH 14/42] [entonclk] Rearrange the code a litte bit for better readability --- apps/entonclk/app.js | 122 ++++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/apps/entonclk/app.js b/apps/entonclk/app.js index f86b02cbd..292030b86 100644 --- a/apps/entonclk/app.js +++ b/apps/entonclk/app.js @@ -1,11 +1,17 @@ +// Fonts Graphics.prototype.setFontAudiowide = function() { - // Actual height 33 (36 - 4) var widths = atob("CiAsESQjJSQkHyQkDA=="); var font = atob("AAAAAAAAAAAAAAAAAAAAAPAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAADgAAAAAAHgAAAAAAfgAAAAAA/gAAAAAD/gAAAAAH/gAAAAAf/AAAAAB/8AAAAAD/4AAAAAP/gAAAAAf/AAAAAB/8AAAAAD/4AAAAAP/gAAAAAf+AAAAAB/8AAAAAH/wAAAAAP/gAAAAA/+AAAAAB/8AAAAAD/wAAAAAD/gAAAAAD+AAAAAAD4AAAAAADwAAAAAADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAA//+AAAAB///AAAAH///wAAAP///4AAAf///8AAA////+AAA/4AP+AAB/gAD/AAB/AA9/AAD+AB+/gAD+AD+/gAD+AD+/gAD8AH+fgAD8AP8fgAD8AP4fgAD8Af4fgAD8A/wfgAD8A/gfgAD8B/gfgAD8D/AfgAD8D+AfgAD8H+AfgAD8P8AfgAD8P4AfgAD8f4AfgAD8/wAfgAD8/gAfgAD+/gA/gAD+/AA/gAB/eAB/AAB/sAD/AAB/wAH/AAA////+AAAf///8AAAP///4AAAH///wAAAD///gAAAA//+AAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAD8AAAAAAD8AAAAAAD8AAAAAAD8AAAAAAD8AAAAAAD/////gAD/////gAD/////gAD/////gAD/////gAD/////gAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAH//gAAAAP//gAD8Af//gAD8A///gAD8B///gAD8B///gAD8B/AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD+D+AfgAD//+AfgAD//+AfgAB//8AfgAA//4AfgAAf/wAfgAAP/gAfgAAB8AAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD+B+A/gAD/////gAB/////AAB/////AAA////+AAAf///8AAAP///4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAD//8AAAAD//+AAAAD//+AAAAD//+AAAAD//+AAAAD//+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAAAB+AAAAD/////gAD/////gAD/////gAD/////gAD/////gAD/////gAD/////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AAfgAD//wAfgAD//4AfgAD//8AfgAD//8AfgAD//+AfgAD8D+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B/A/gAD8B///gAD8B///gAD8A///AAD8A///AAAAAf/+AAAAAP/4AAAAAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAAH///wAAAf///8AAAf///8AAA////+AAB/////AAB/h+H/AAD/B+B/gAD+B+A/gAD+B+A/gAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B/A/gAD8B///gAD8B///gAD8A///AAAAAf//AAAAAf/+AAAAAH/4AAAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAD8AAAAAAD8AAAAAAD8AAAAAAD8AAAAgAD8AAABgAD8AAAHgAD8AAAfgAD8AAA/gAD8AAD/gAD8AAP/gAD8AA//gAD8AB//AAD8AH/8AAD8Af/wAAD8A//AAAD8D/+AAAD8P/4AAAD8f/gAAAD9//AAAAD//8AAAAD//wAAAAD//gAAAAD/+AAAAAD/4AAAAAD/wAAAAAD/AAAAAAD8AAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAH/4AAAAAP/8AAAH+f/+AAAf////AAA/////gAB/////gAB///A/gAD//+AfgAD//+AfgAD+D+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD+D+AfgAD//+AfgAD//+AfgAB///A/gAB/////gAA/////AAAP////AAAD+f/+AAAAAP/8AAAAAH/4AAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAf/wAAAAA//4AAAAB//8AAAAB//8AfgAD//+AfgAD/D+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD8B+AfgAD+B+A/gAD+B+A/gAD/B+B/gAB/////AAB/////AAA////+AAAf///8AAAP///4AAAH///wAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAPAAAA/AAfgAAA/AAfgAAA/AAfgAAA/AAfgAAAeAAPAAAAAAAAAAAAAAAAAAAAAAAAAA"); var scale = 1; // size multiplier for this font g.setFontCustom(font, 46, widths, 48+(scale<<8)+(1<<16)); }; +// Globals variables +var timervalue = 0; +var istimeron = false; +var timertick; + +// Functions function getSteps() { var steps = 0; try{ @@ -24,6 +30,60 @@ function getSteps() { return Math.round(steps); } +function timeToString(duration) { + var hrs = ~~(duration / 3600); + var mins = ~~((duration % 3600) / 60); + var secs = ~~duration % 60; + var ret = ""; + if (hrs > 0) { + ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); + } + ret += "" + mins + ":" + (secs < 10 ? "0" : ""); + ret += "" + secs; + return ret; +} + +function countDown() { + timervalue--; + + g.reset().clearRect(0, 40, 44+99, g.getHeight()/2-25); + + g.setFontAlign(0, -1, 0); + g.setFont("6x8", 2).drawString(timeToString(timervalue), 95, g.getHeight()/2-50); + + if (timervalue <= 0) { + istimeron = false; + clearInterval(timertick); + + Bangle.buzz().then(()=>{ + return new Promise(resolve=>setTimeout(resolve, 500)); + }).then(()=>{ + return Bangle.buzz(1000); + }); + } + else + if ((timervalue <= 30) && (timervalue % 10 == 0)) { Bangle.buzz(); } +} + +// Touch +Bangle.on('touch',t => { + if (t == 1) { + // Touch on the left, reduce timervalue about 60s + Bangle.buzz(30); + if (timervalue < 60) { timervalue = 1 ; } + else { timervalue -= 60; } + } + // Touch on the right, raise timervaule about 300s + else if (t == 2) { + Bangle.buzz(30); + if (!istimeron) { + istimeron = true; + timertick = setInterval(countDown, 1000); + } + timervalue += 60*5; + } +}); + { // must be inside our own scope here so that when we are unloaded everything disappears // we also define functions using 'let fn = function() {..}' for the same reason. function decls are global let drawTimeout; @@ -64,62 +124,4 @@ function getSteps() { Bangle.loadWidgets(); draw(); setTimeout(Bangle.drawWidgets,0); -} - -// Timer function -var timervalue = 0; -var istimeron = false; -var timertick; - -Bangle.on('touch',t => { - if (t == 1) { - // Touch on the left, reduce timervalue about 60s - Bangle.buzz(30); - if (timervalue < 60) { timervalue = 1 ; } - else { timervalue -= 60; } - } - // Touch on the right, raise timervaule about 300s - else if (t == 2) { - Bangle.buzz(30); - if (!istimeron) { - istimeron = true; - timertick = setInterval(countDown, 1000); - } - timervalue += 60*5; - } -}); - -function timeToString(duration) { - var hrs = ~~(duration / 3600); - var mins = ~~((duration % 3600) / 60); - var secs = ~~duration % 60; - var ret = ""; - if (hrs > 0) { - ret += "" + hrs + ":" + (mins < 10 ? "0" : ""); - } - ret += "" + mins + ":" + (secs < 10 ? "0" : ""); - ret += "" + secs; - return ret; -} - -function countDown() { - timervalue--; - - g.reset().clearRect(0, 40, 44+99, g.getHeight()/2-25); - - g.setFontAlign(0, -1, 0); - g.setFont("6x8", 2).drawString(timeToString(timervalue), 95, g.getHeight()/2-50); - - if (timervalue <= 0) { - istimeron = false; - clearInterval(timertick); - - Bangle.buzz().then(()=>{ - return new Promise(resolve=>setTimeout(resolve, 500)); - }).then(()=>{ - return Bangle.buzz(1000); - }); - } - else - if ((timervalue <= 30) && (timervalue % 10 == 0)) { Bangle.buzz(); } -} +} \ No newline at end of file From b00b4395fb0321344e435332a09b62efe48f1932 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Thu, 29 Dec 2022 16:31:53 +0100 Subject: [PATCH 15/42] gipy: color current and next segment --- apps/gipy/ChangeLog | 1 + apps/gipy/TODO | 8 ++------ apps/gipy/app.js | 18 ++++++++++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 40eb3d9a8..11899c3e1 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -70,3 +70,4 @@ * New setting to hide points and increase display speed. * Speed optimisations. * Estimated time of Arrival/Going back. + * Display current and next segment in red so that you know where to go. diff --git a/apps/gipy/TODO b/apps/gipy/TODO index 53c3530e2..9f5372190 100644 --- a/apps/gipy/TODO +++ b/apps/gipy/TODO @@ -1,10 +1,7 @@ -* bugs ++ use Bangle.project(latlong) ++ try to avoid camera turning when stopped but still work when walking -- when exactly on turn, distance to next point is still often 50m - -----> it does not buzz very often on turns - -- when going backwards we have a tendencing to get a wrong current_segment * additional features @@ -15,7 +12,6 @@ (and look at more than next point) - display distance to next water/toilet ? -- dynamic map rescale - display scale (100m) - compress path ? diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 974ad2528..eec2396d8 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -334,11 +334,13 @@ class Status { } let hours = now.getHours().toString(); // now, distance to next point in meters - g.setFont("6x8:2").drawString( - "" + this.distance_to_next_point + "m", - 0, - g.getHeight() - 49 - ); + g.setFont("6x8:2") + .setColor(g.theme.fg) + .drawString( + "" + this.distance_to_next_point + "m", + 0, + g.getHeight() - 49 + ); let point_time = this.old_times[this.old_times.length - 1]; let done_in = point_time - this.starting_time - this.paused_time; @@ -458,7 +460,11 @@ class Status { let x = half_width - Math.round(rotated_x); // x is inverted let y = half_height + Math.round(rotated_y); if (previous_x !== null) { - g.setColor(g.theme.fg); + let segment_color = g.theme.fg; + if (i == this.current_segment + 1 || i == this.current_segment + 2) { + segment_color = 0xf800; + } + g.setColor(segment_color); g.drawLine(previous_x, previous_y, x, y); if (this.path.is_waypoint(i - 1)) { From ad94ea3965fa8b8e7aeecc1a2b98f7461fd11fc2 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Thu, 29 Dec 2022 17:35:38 +0100 Subject: [PATCH 16/42] gipy: avoid angles flickering at low speed --- apps/gipy/ChangeLog | 2 ++ apps/gipy/app.js | 68 ++++++++++++++++----------------------------- 2 files changed, 26 insertions(+), 44 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 11899c3e1..521a86d57 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -71,3 +71,5 @@ * Speed optimisations. * Estimated time of Arrival/Going back. * Display current and next segment in red so that you know where to go. + * Back to old instant speed algorithm (slow update if moving slowly (no + update if you don't move) but no angle flickering at low speed) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index eec2396d8..09e81049a 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -72,8 +72,6 @@ class Status { this.current_segment = null; // which segment is closest this.reaching = null; // which waypoint are we reaching ? this.distance_to_next_point = null; // how far are we from next point ? - this.paused_time = 0.0; // how long did we stop (stops don't count in avg speed) - this.paused_since = getTime(); this.projected_point = null; let r = [0]; @@ -88,7 +86,7 @@ class Status { previous_point = point; } this.remaining_distances = r; // how much distance remains at start of each segment - this.starting_time = this.paused_since; // time we start + this.starting_time = getTime(); // time we start this.advanced_distance = 0.0; this.gps_coordinates_counter = 0; // how many coordinates did we receive this.old_points = []; @@ -98,57 +96,39 @@ class Status { // we try to figure out direction by looking at previous points // instead of the gps course which is not very nice. this.gps_coordinates_counter += 1; - let now = getTime(); + + if (this.old_points.length == 0) { + this.old_points.push(position); + let now = getTime(); + this.old_times.push(now); + return null; + } else { + let previous_point = this.old_points[this.old_points.length - 1]; + let distance_to_previous = previous_point.distance(position); + // gps signal is noisy but rarely above 4 meters + if (distance_to_previous < 4) { + return null; + } + } this.old_points.push(position); + let now = getTime(); this.old_times.push(now); - if (this.old_points.length == 1) { - return null; - } - - let last_point = this.old_points[this.old_points.length - 1]; let oldest_point = this.old_points[0]; + let distance_to_oldest = oldest_point.distance(position); - // every 7 points we count the distance - if (this.gps_coordinates_counter % 7 == 0) { - let distance = last_point.distance(oldest_point); - if (distance < 150.0) { + // every 3 points we count the distance + if (this.gps_coordinates_counter % 3 == 0) { + if (distance_to_oldest < 150.0) { // to avoid gps glitches - this.advanced_distance += distance; + this.advanced_distance += distance_to_oldest; } } - if (this.old_points.length == 8) { - let p1 = this.old_points[0] - .plus(this.old_points[1]) - .plus(this.old_points[2]) - .plus(this.old_points[3]) - .times(1 / 4); - let p2 = this.old_points[4] - .plus(this.old_points[5]) - .plus(this.old_points[6]) - .plus(this.old_points[7]) - .times(1 / 4); - let t1 = (this.old_times[1] + this.old_times[2]) / 2; - let t2 = (this.old_times[5] + this.old_times[6]) / 2; - this.instant_speed = p1.distance(p2) / (t2 - t1); + this.instant_speed = distance_to_oldest / (now - this.old_times[0]); + if (this.old_points.length == 4) { this.old_points.shift(); this.old_times.shift(); - } else { - this.instant_speed = - oldest_point.distance(last_point) / (now - this.old_times[0]); - - // update paused time if we are too slow - if (this.instant_speed < 2) { - if (this.paused_since === null) { - this.paused_since = now; - } - } else { - if (this.paused_since !== null) { - this.paused_time += now - this.paused_since; - this.paused_since = null; - } - } } // let's just take angle of segment between newest point and a point a bit before let previous_index = this.old_points.length - 3; @@ -343,7 +323,7 @@ class Status { ); let point_time = this.old_times[this.old_times.length - 1]; - let done_in = point_time - this.starting_time - this.paused_time; + let done_in = point_time - this.starting_time; let approximate_speed = Math.round( (this.advanced_distance * 3.6) / done_in ); From 7c161a144ef34888ff26883796d745f1cb021ce6 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Fri, 30 Dec 2022 11:22:24 +0100 Subject: [PATCH 17/42] gipy: mixing both styles of recording of gps points this way we can get a correct instant speed AND avoid angles flickering at low speed. --- apps/gipy/ChangeLog | 3 +-- apps/gipy/TODO | 2 -- apps/gipy/app.js | 39 +++++++++++++++++++++++++++++++++------ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 521a86d57..8346e6c42 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -71,5 +71,4 @@ * Speed optimisations. * Estimated time of Arrival/Going back. * Display current and next segment in red so that you know where to go. - * Back to old instant speed algorithm (slow update if moving slowly (no - update if you don't move) but no angle flickering at low speed) + * Avoid angles flickering at low speed at the cost of less refresh. diff --git a/apps/gipy/TODO b/apps/gipy/TODO index 9f5372190..266a1c5c9 100644 --- a/apps/gipy/TODO +++ b/apps/gipy/TODO @@ -1,7 +1,5 @@ + use Bangle.project(latlong) -+ try to avoid camera turning when stopped but still work when walking - * additional features diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 09e81049a..1439fe300 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -1,4 +1,4 @@ -let simulated = false; +let simulated = true; let file_version = 3; let code_key = 47490; @@ -89,17 +89,46 @@ class Status { this.starting_time = getTime(); // time we start this.advanced_distance = 0.0; this.gps_coordinates_counter = 0; // how many coordinates did we receive - this.old_points = []; - this.old_times = []; + this.old_points = []; // record previous points but only when enough distance between them + this.old_times = []; // the corresponding times + this.unfiltered_old_points = []; // record previous points + this.unfiltered_old_times = []; // the corresponding times } new_position_reached(position) { // we try to figure out direction by looking at previous points // instead of the gps course which is not very nice. this.gps_coordinates_counter += 1; + this.unfiltered_old_points.push(position); + let now = getTime(); + this.unfiltered_old_times.push(now); + // compute instant speed using unfiltered points + // we average the first four points, then the last four + // and compute the speed between the two averages. + // this way, at speed 0 we will get a speed close to 0 + // whereas taking speed between first and last point will not. + if (this.unfiltered_old_points.length == 8) { + let p1 = this.unfiltered_old_points[0] + .plus(this.unfiltered_old_points[1]) + .plus(this.unfiltered_old_points[2]) + .plus(this.unfiltered_old_points[3]) + .times(1 / 4); + let p2 = this.unfiltered_old_points[4] + .plus(this.unfiltered_old_points[5]) + .plus(this.unfiltered_old_points[6]) + .plus(this.unfiltered_old_points[7]) + .times(1 / 4); + let t1 = + (this.unfiltered_old_times[1] + this.unfiltered_old_times[2]) / 2; + let t2 = + (this.unfiltered_old_times[5] + this.unfiltered_old_times[6]) / 2; + this.instant_speed = p1.distance(p2) / (t2 - t1); + this.unfiltered_old_points.shift(); + this.unfiltered_old_times.shift(); + } + if (this.old_points.length == 0) { this.old_points.push(position); - let now = getTime(); this.old_times.push(now); return null; } else { @@ -111,7 +140,6 @@ class Status { } } this.old_points.push(position); - let now = getTime(); this.old_times.push(now); let oldest_point = this.old_points[0]; @@ -125,7 +153,6 @@ class Status { } } - this.instant_speed = distance_to_oldest / (now - this.old_times[0]); if (this.old_points.length == 4) { this.old_points.shift(); this.old_times.shift(); From 09e637ba67c037b9422bc7c628e542096410a886 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Fri, 30 Dec 2022 11:33:06 +0100 Subject: [PATCH 18/42] gipy: forgot to turn off simulation before commit --- apps/gipy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 1439fe300..4e1aedcd9 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -1,4 +1,4 @@ -let simulated = true; +let simulated = false; let file_version = 3; let code_key = 47490; From 5d821bc4fa326a7d2d9601625024bf565cf0e3ec Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Fri, 30 Dec 2022 16:06:18 +0100 Subject: [PATCH 19/42] gipy: documentation update --- apps/gipy/README.md | 22 +++++++++++++++------- apps/gipy/legend.png | Bin 0 -> 29552 bytes apps/gipy/lost.png | Bin 0 -> 3197 bytes 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 apps/gipy/legend.png create mode 100644 apps/gipy/lost.png diff --git a/apps/gipy/README.md b/apps/gipy/README.md index 6c9b87c23..87eadc3b6 100644 --- a/apps/gipy/README.md +++ b/apps/gipy/README.md @@ -20,10 +20,10 @@ It provides the following features : - display the path with current position from gps - detects and buzzes if you leave the path - buzzes before sharp turns -- buzzes before nodes with comments +- buzzes before waypoints (for example when you need to turn in https://mapstogpx.com/) - display instant / average speed -- display distance to next node +- display distance to next point - display additional data from openstreetmap : - water points - toilets @@ -57,19 +57,22 @@ Your path will be displayed in svg. Once you start gipy you will have a menu for selecting your trace (if more than one). Choose the one you want and here you go : -![Screenshot](screenshot2.png) +![Screenshot](legend.png) On your screen you can see : - yourself (the big black dot) - the path (the top of the screen is in front of you) +- on the path, current and next segments are red and other ones are black - if needed a projection of yourself on the path (small black dot) -- extremities of segments as white dots -- turning points as doubled white dots +- points as white dots +- waypoints as doubled white dots - some text on the left (from top to bottom) : + * time to reach start point at current average speed * current time + * time to reach end point at current average speed * left distance till end of current segment - * distance from start of path / path length + * remaining distance / path length * average speed / instant speed - interest points from openstreetmap as color dots : * red : bakery @@ -79,7 +82,11 @@ On your screen you can see : - a *turn* indicator on the top right when you reach a turning point - a *gps* indicator (blinking) on the top right if you lose gps signal - a *lost* indicator on the top right if you stray too far away from path -- a black segment extending from you when you are lost, indicating the rough direction of where to go + +If you stray away from path we will rescale the display to continue displaying nearby segments and +display the direction to follow as a black segment. + +![Lost](lost.png) ### Settings @@ -87,6 +94,7 @@ Few settings for now (feel free to suggest me more) : - keep gps alive : if turned off, will try to save battery by turning the gps off on long segments - max speed : used to compute how long to turn the gps off +- display points : display/hide points (not waypoints) ### Caveats diff --git a/apps/gipy/legend.png b/apps/gipy/legend.png new file mode 100644 index 0000000000000000000000000000000000000000..9040f6df8f0f05be5ad7c00aedf8cb8c41944f3d GIT binary patch literal 29552 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 CA>(rZ literal 0 HcmV?d00001 diff --git a/apps/gipy/lost.png b/apps/gipy/lost.png new file mode 100644 index 0000000000000000000000000000000000000000..348eaed8e704b8c54eb660c4cb40a89743c85e9c GIT binary patch literal 3197 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 Date: Fri, 30 Dec 2022 18:05:13 +0100 Subject: [PATCH 20/42] gipy: new file upload code we don't simplify paths too much if they are already simple enough --- apps/gipy/pkg/gpconv.d.ts | 4 +-- apps/gipy/pkg/gpconv.js | 48 +++++++++++++++--------------- apps/gipy/pkg/gpconv_bg.wasm | Bin 605249 -> 602158 bytes apps/gipy/pkg/gpconv_bg.wasm.d.ts | 4 +-- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/apps/gipy/pkg/gpconv.d.ts b/apps/gipy/pkg/gpconv.d.ts index ecffa7b69..2bb57f651 100644 --- a/apps/gipy/pkg/gpconv.d.ts +++ b/apps/gipy/pkg/gpconv.d.ts @@ -46,11 +46,11 @@ export interface InitOutput { readonly __wbindgen_malloc: (a: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number) => number; readonly __wbindgen_export_2: WebAssembly.Table; - readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0601691a32604cdd: (a: number, b: number, c: number) => void; + readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h317df853f2d4653e: (a: number, b: number, c: number) => void; readonly __wbindgen_add_to_stack_pointer: (a: number) => number; readonly __wbindgen_free: (a: number, b: number) => void; readonly __wbindgen_exn_store: (a: number) => void; - readonly wasm_bindgen__convert__closures__invoke2_mut__h25ed812378167476: (a: number, b: number, c: number, d: number) => void; + readonly wasm_bindgen__convert__closures__invoke2_mut__h573cb80e0bf72240: (a: number, b: number, c: number, d: number) => void; } export type SyncInitInput = BufferSource | WebAssembly.Module; diff --git a/apps/gipy/pkg/gpconv.js b/apps/gipy/pkg/gpconv.js index 97b37e340..b9271ad4b 100644 --- a/apps/gipy/pkg/gpconv.js +++ b/apps/gipy/pkg/gpconv.js @@ -98,14 +98,6 @@ function getInt32Memory0() { return cachedInt32Memory0; } -const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); - -cachedTextDecoder.decode(); - -function getStringFromWasm0(ptr, len) { - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); -} - function addHeapObject(obj) { if (heap_next === heap.length) heap.push(heap.length + 1); const idx = heap_next; @@ -115,6 +107,14 @@ function addHeapObject(obj) { return idx; } +const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +function getStringFromWasm0(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + function debugString(val) { // primitive types const type = typeof val; @@ -205,7 +205,7 @@ function makeMutClosure(arg0, arg1, dtor, f) { return real; } function __wbg_adapter_24(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0601691a32604cdd(arg0, arg1, addHeapObject(arg2)); + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h317df853f2d4653e(arg0, arg1, addHeapObject(arg2)); } function _assertClass(instance, klass) { @@ -310,7 +310,7 @@ function handleError(f, args) { } } function __wbg_adapter_69(arg0, arg1, arg2, arg3) { - wasm.wasm_bindgen__convert__closures__invoke2_mut__h25ed812378167476(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); + wasm.wasm_bindgen__convert__closures__invoke2_mut__h573cb80e0bf72240(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); } /** @@ -371,13 +371,13 @@ async function load(module, imports) { function getImports() { const imports = {}; imports.wbg = {}; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; imports.wbg.__wbg_gpcsvg_new = function(arg0) { const ret = GpcSvg.__wrap(arg0); return addHeapObject(ret); }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; imports.wbg.__wbindgen_string_get = function(arg0, arg1) { const obj = getObject(arg1); const ret = typeof(obj) === 'string' ? obj : undefined; @@ -386,15 +386,15 @@ function getImports() { getInt32Memory0()[arg0 / 4 + 1] = len0; getInt32Memory0()[arg0 / 4 + 0] = ptr0; }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; imports.wbg.__wbindgen_object_clone_ref = function(arg0) { const ret = getObject(arg0); return addHeapObject(ret); }; - imports.wbg.__wbg_fetch_386f87a3ebf5003c = function(arg0) { + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_fetch_3894579f6e2af3be = function(arg0) { const ret = fetch(getObject(arg0)); return addHeapObject(ret); }; @@ -558,10 +558,6 @@ function getImports() { const ret = new Uint8Array(getObject(arg0)); return addHeapObject(ret); }; - imports.wbg.__wbg_stringify_d6471d300ded9b68 = function() { return handleError(function (arg0) { - const ret = JSON.stringify(getObject(arg0)); - return addHeapObject(ret); - }, arguments) }; imports.wbg.__wbg_get_765201544a2b6869 = function() { return handleError(function (arg0, arg1) { const ret = Reflect.get(getObject(arg0), getObject(arg1)); return addHeapObject(ret); @@ -574,6 +570,10 @@ function getImports() { const ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2)); return ret; }, arguments) }; + imports.wbg.__wbg_stringify_d6471d300ded9b68 = function() { return handleError(function (arg0) { + const ret = JSON.stringify(getObject(arg0)); + return addHeapObject(ret); + }, arguments) }; imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { const ret = debugString(getObject(arg1)); const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); @@ -588,8 +588,8 @@ function getImports() { const ret = wasm.memory; return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper947 = function(arg0, arg1, arg2) { - const ret = makeMutClosure(arg0, arg1, 147, __wbg_adapter_24); + imports.wbg.__wbindgen_closure_wrapper929 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 143, __wbg_adapter_24); return addHeapObject(ret); }; diff --git a/apps/gipy/pkg/gpconv_bg.wasm b/apps/gipy/pkg/gpconv_bg.wasm index edeb4eb593024e5882a02a601d156f9dd67671b8..245afc20c57cfd98de4594b7c748f1bbc491a9b3 100644 GIT binary patch delta 205500 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´< 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 zȁ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 delta 208178 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

List of products

+ + + + + + + + + + + + +
namequantitydoneactions
+

+

Add a new product

+
+
+
+ +
+
+ +
+
+ +
+
+
+

+ + + + + + + + + + diff --git a/apps/grocery/metadata.json b/apps/grocery/metadata.json index e0cf24a4b..ef073a1b2 100644 --- a/apps/grocery/metadata.json +++ b/apps/grocery/metadata.json @@ -8,6 +8,7 @@ "tags": "tool,outdoors,shopping,list", "supports": ["BANGLEJS", "BANGLEJS2"], "custom": "grocery.html", + "interface": "interface.html", "allow_emulator": true, "storage": [ {"name":"grocery.app.js","url":"app.js"}, From 239038d58da1c1f81f3c0f0e1168e2be79ac4255 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 5 Jan 2023 19:55:12 +0100 Subject: [PATCH 39/42] Removed one old Screenshot --- apps/bwclk/metadata.json | 2 +- apps/bwclk/screenshot_4.png | Bin 3283 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 apps/bwclk/screenshot_4.png diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index f2e7ef428..e26307410 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -5,7 +5,7 @@ "description": "A very minimalistic clock.", "readme": "README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}, {"url":"screenshot_4.png"}], + "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}], "type": "clock", "tags": "clock,clkinfo", "supports": ["BANGLEJS2"], diff --git a/apps/bwclk/screenshot_4.png b/apps/bwclk/screenshot_4.png deleted file mode 100644 index 83de5c2ce095c7fc8ea6c37ec86a29024048dea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3283 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 Date: Thu, 5 Jan 2023 20:56:05 +0100 Subject: [PATCH 40/42] Minor changes --- apps/bwclk/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index b0b727fd2..a8c9f1b80 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -132,10 +132,9 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { var midx = options.x+options.w/2; // Draw - if (image) { var scale = imgWidth / image.width; - g.drawImage(image, midx-16-parseInt(strWidth/2), options.y+8, {scale: scale}); + g.drawImage(image, midx-14-parseInt(strWidth/2), options.y+6, {scale: scale}); } g.drawString(text, midx+imgWidth-6, options.y+20); } From bdefe4217cae08524359c29c58ac95c358e3ae92 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 5 Jan 2023 21:02:55 +0100 Subject: [PATCH 41/42] Minor changes --- apps/bwclk/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index a8c9f1b80..b5e485822 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -134,9 +134,9 @@ let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { // Draw if (image) { var scale = imgWidth / image.width; - g.drawImage(image, midx-14-parseInt(strWidth/2), options.y+6, {scale: scale}); + g.drawImage(image, midx-parseInt(imgWidth*1.3/2)-parseInt(strWidth/2), options.y+6, {scale: scale}); } - g.drawString(text, midx+imgWidth-6, options.y+20); + g.drawString(text, midx+parseInt(imgWidth*1.3/2), options.y+20); } }); From 3c1465ae46c00f6e1af3ab02e2f89abb6dee8ecb Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 5 Jan 2023 22:05:52 +0100 Subject: [PATCH 42/42] AI Clock - Use clock_info.addInteractive instead of a custom implementation --- apps/aiclock/ChangeLog | 3 +- apps/aiclock/README.md | 3 +- apps/aiclock/aiclock.app.js | 331 ++++++++++-------------------------- apps/aiclock/metadata.json | 2 +- apps/bwclk/app.js | 2 +- 5 files changed, 96 insertions(+), 245 deletions(-) diff --git a/apps/aiclock/ChangeLog b/apps/aiclock/ChangeLog index 15a7d0a14..6d6eeb55e 100644 --- a/apps/aiclock/ChangeLog +++ b/apps/aiclock/ChangeLog @@ -3,4 +3,5 @@ 0.03: Indicate battery level through line occurrence. 0.04: Use widget_utils module. 0.05: Support for clkinfo. -0.06: ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc. \ No newline at end of file +0.06: ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc. +0.07: Use clock_info.addInteractive instead of a custom implementation \ No newline at end of file diff --git a/apps/aiclock/README.md b/apps/aiclock/README.md index 31dd5aa29..521bd2c5e 100644 --- a/apps/aiclock/README.md +++ b/apps/aiclock/README.md @@ -11,8 +11,7 @@ The original output of stable diffusion is shown here: My implementation is shown below. Note that horizontal lines occur randomly, but the probability is correlated with the battery level. So if your screen contains only a few lines its time to charge your bangle again ;) Also note that the upper text -implementes the clkinfo module and can be configured via touch left/right/up/down. -Touch at the center to trigger the selected action. +implements the clkinfo module and can be configured via touch and swipe left/right and up/down. ![](impl.png) diff --git a/apps/aiclock/aiclock.app.js b/apps/aiclock/aiclock.app.js index 66fa2ca6a..350832367 100644 --- a/apps/aiclock/aiclock.app.js +++ b/apps/aiclock/aiclock.app.js @@ -1,7 +1,6 @@ /************************************************ * AI Clock */ - const storage = require('Storage'); const clock_info = require("clock_info"); @@ -21,124 +20,14 @@ Graphics.prototype.setFontGochiHand = function(scale) { return this; } -/************************************************ - * Set some important constants such as width, height and center - */ -var W = g.getWidth(),R=W/2; -var H = g.getHeight(); -var cx = W/2; -var cy = H/2; -var drawTimeout; - -/************************************************ - * SETTINGS - */ -const SETTINGS_FILE = "aiclock.setting.json"; -let settings = { - menuPosX: 0, - menuPosY: 0, -}; -let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; -for (const key in saved_settings) { - settings[key] = saved_settings[key] -} - - -/************************************************ - * Menu - */ -function getDate(){ - var date = new Date(); - return ("0"+date.getDate()).substr(-2) + "/" + ("0"+(date.getMonth()+1)).substr(-2) -} - - -// Custom clockItems menu - therefore, its added here and not in a clkinfo.js file. -var clockItems = { - name: getDate(), - img: null, - items: [ - { name: "Week", - get: () => ({ text: "Week " + weekOfYear(), img: null}), - show: function() { clockItems.items[0].emit("redraw"); }, - hide: function () {} - }, - ] - }; - -function weekOfYear() { - var date = new Date(); - date.setHours(0, 0, 0, 0); - // Thursday in current week decides the year. - date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); - // January 4 is always in week 1. - var week1 = new Date(date.getFullYear(), 0, 4); - // Adjust to Thursday in week 1 and count number of weeks from date to week1. - return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - - 3 + (week1.getDay() + 6) % 7) / 7); -} - - - -// Load menu -var menu = clock_info.load(); -menu = menu.concat(clockItems); - - - // Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it. - if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){ - settings.menuPosX = 0; - settings.menuPosY = 0; - } - - function canRunMenuItem(){ - if(settings.menuPosY == 0){ - return false; - } - - var menuEntry = menu[settings.menuPosX]; - var item = menuEntry.items[settings.menuPosY-1]; - return item.run !== undefined; - } - - - function runMenuItem(){ - if(settings.menuPosY == 0){ - return; - } - - var menuEntry = menu[settings.menuPosX]; - var item = menuEntry.items[settings.menuPosY-1]; - try{ - var ret = item.run(); - if(ret){ - Bangle.buzz(300, 0.6); - } - } catch (ex) { - // Simply ignore it... - } - } - - -/* - * Based on the great multi clock from https://github.com/jeffmer/BangleApps/ - */ -Graphics.prototype.drawRotRect = function(w, r1, r2, angle) { - angle = angle % 360; - var w2=w/2, h=r2-r1, theta=angle*Math.PI/180; - return this.fillPoly(this.transformVertices([-w2,0,-w2,-h,w2,-h,w2,0], - {x:cx+r1*Math.sin(theta),y:cy-r1*Math.cos(theta),rotate:theta})); -}; - - -function drawBackground() { +function drawBackground(start, end) { g.setFontAlign(0,0); - g.setColor(g.theme.fg); + g.setColor("#000"); var bat = E.getBattery() / 100.0; - var y = 0; - while(y < H){ + var y = start; + while(y < end){ // Show less lines in case of small battery level. if(Math.random() > bat){ y += 5; @@ -154,6 +43,30 @@ function drawBackground() { } +/************************************************ + * Set some important constants such as width, height and center + */ +var W = g.getWidth(),R=W/2; +var H = g.getHeight(); +var cx = W/2; +var cy = H/2; +var drawTimeout; + +var clkInfoY = 60; + + +/* + * Based on the great multi clock from https://github.com/jeffmer/BangleApps/ + */ +Graphics.prototype.drawRotRect = function(w, r1, r2, angle) { + angle = angle % 360; + var w2=w/2, h=r2-r1, theta=angle*Math.PI/180; + return this.fillPoly(this.transformVertices([-w2,0,-w2,-h,w2,-h,w2,0], + {x:cx+r1*Math.sin(theta),y:cy-r1*Math.cos(theta),rotate:theta})); +}; + + + function drawCircle(isLocked){ g.setColor(g.theme.fg); g.fillCircle(cx, cy, 12); @@ -163,54 +76,6 @@ function drawCircle(isLocked){ g.fillCircle(cx, cy, 6); } -function toAngle(a){ - if (a < 0){ - return 360 + a; - } - - if(a > 360) { - return 360 - a; - } - - return a -} - - -function drawMenuItem(text, image){ - if(text == null){ - drawTime(); - return - } - text = String(text); - - g.reset().setBgColor("#fff").setColor("#000"); - g.setFontAlign(0,0); - g.setFont("Vector", 20); - - var imgWidth = image == null ? 0 : 24; - var strWidth = g.stringWidth(text); - var strHeight = text.split('\n').length > 1 ? 40 : Math.max(24, imgWidth+2); - var w = imgWidth + strWidth; - - g.clearRect(cx-w/2-8, 40-strHeight/2-1, cx+w/2+4, 40+strHeight/2) - - // Draw right line as designed by stable diffusion - g.drawLine(cx+w/2+5, 40-strHeight/2-1, cx+w/2+5, 40+strHeight/2); - g.drawLine(cx+w/2+6, 40-strHeight/2-1, cx+w/2+6, 40+strHeight/2); - g.drawLine(cx+w/2+7, 40-strHeight/2-1, cx+w/2+7, 40+strHeight/2); - - // And finally the text - g.drawString(text, cx+imgWidth/2, 42); - g.drawString(text, cx+1+imgWidth/2, 41); - - if(image != null) { - var scale = image.width ? imgWidth / image.width : 1; - g.drawImage(image, W/2 + -strWidth/2-4 - parseInt(imgWidth/2), 41-12, {scale: scale}); - } - - drawTime(); -} - function drawTime(){ // Draw digital time first @@ -267,34 +132,23 @@ function drawDigits(){ } -function drawMenu(){ - var menuEntry = menu[settings.menuPosX]; - - // The first entry is the overview... - if(settings.menuPosY == 0){ - drawMenuItem(menuEntry.name, menuEntry.img); - return; - } - - // Draw item if needed - var item = menuEntry.items[settings.menuPosY-1].get(); - drawMenuItem(item.text, item.img); +function draw(){ + // Note that we force a redraw also of the clock info as + // we want to ensure (for design purpose) that the hands + // are above the clkinfo section. + clockInfoMenu.redraw(); } - - - -function draw(){ +function drawMainClock(){ // Queue draw in one minute queueDraw(); - g.reset(); - g.clearRect(0, 0, g.getWidth(), g.getHeight()); - g.setColor(1,1,1); + g.setColor("#fff"); + g.reset().clearRect(0, clkInfoY, g.getWidth(), g.getHeight()); - drawBackground(); - drawMenu(); + drawBackground(clkInfoY, H); + drawTime(); drawCircle(Bangle.isLocked()); } @@ -304,7 +158,7 @@ function draw(){ */ Bangle.on('lcdPower',on=>{ if (on) { - draw(true); + draw(); } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; @@ -315,62 +169,10 @@ Bangle.on('lock', function(isLocked) { drawCircle(isLocked); }); -Bangle.on('touch', function(btn, e){ - var left = parseInt(g.getWidth() * 0.22); - var right = g.getWidth() - left; - var upper = parseInt(g.getHeight() * 0.22); - var lower = g.getHeight() - upper; - - var is_upper = e.y < upper; - var is_lower = e.y > lower; - var is_left = e.x < left && !is_upper && !is_lower; - var is_right = e.x > right && !is_upper && !is_lower; - var is_center = !is_upper && !is_lower && !is_left && !is_right; - - if(is_lower){ - Bangle.buzz(40, 0.6); - settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1); - - draw(); - } - - if(is_upper){ - Bangle.buzz(40, 0.6); - settings.menuPosY = settings.menuPosY-1; - settings.menuPosY = settings.menuPosY < 0 ? menu[settings.menuPosX].items.length : settings.menuPosY; - - draw(); - } - - if(is_right){ - Bangle.buzz(40, 0.6); - settings.menuPosX = (settings.menuPosX+1) % menu.length; - settings.menuPosY = 0; - draw(); - } - - if(is_left){ - Bangle.buzz(40, 0.6); - settings.menuPosY = 0; - settings.menuPosX = settings.menuPosX-1; - settings.menuPosX = settings.menuPosX < 0 ? menu.length-1 : settings.menuPosX; - draw(); - } - - if(is_center){ - if(canRunMenuItem()){ - runMenuItem(); - } - } -}); - E.on("kill", function(){ - try{ - storage.write(SETTINGS_FILE, settings); - } catch(ex){ - // If this fails, we still kill the app... - } + clockInfoMenu.remove(); + delete clockInfoMenu; }); @@ -386,6 +188,55 @@ function queueDraw() { } +/************************************************ + * Clock Info + */ +let clockInfoItems = clock_info.load(); +let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { + x : 0, + y: 0, + w: W, + h: clkInfoY, + draw : (itm, info, options) => { + g.setFontAlign(0,0); + g.setFont("Vector", 20); + + g.setColor("#fff"); + g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); + drawBackground(0, clkInfoY+2); + + // Set text and font + var image = info.img; + var text = String(info.text); + + var imgWidth = image == null ? 0 : 24; + var strWidth = g.stringWidth(text); + var strHeight = text.split('\n').length > 1 ? 40 : Math.max(24, imgWidth+2); + var w = imgWidth + strWidth; + + // Draw right line as designed by stable diffusion + g.setColor(options.focus ? "#0f0" : "#fff"); + g.fillRect(cx-w/2-8, 40-strHeight/2-1, cx+w/2+4, 40+strHeight/2) + + g.setColor("#000"); + g.drawLine(cx+w/2+5, 40-strHeight/2-1, cx+w/2+5, 40+strHeight/2); + g.drawLine(cx+w/2+6, 40-strHeight/2-1, cx+w/2+6, 40+strHeight/2); + g.drawLine(cx+w/2+7, 40-strHeight/2-1, cx+w/2+7, 40+strHeight/2); + + // Draw text and image + g.drawString(text, cx+imgWidth/2, 42); + g.drawString(text, cx+1+imgWidth/2, 41); + + if(image != null) { + var scale = image.width ? imgWidth / image.width : 1; + g.drawImage(image, W/2 + -strWidth/2-4 - parseInt(imgWidth/2), 41-12, {scale: scale}); + } + + drawMainClock(); + } +}); + + /* * Lets start widgets, listen for btn etc. */ @@ -400,7 +251,7 @@ Bangle.loadWidgets(); require('widget_utils').hide(); // Clear the screen once, at startup and draw clock -g.setTheme({bg:"#fff",fg:"#000",dark:false}).clear(); +g.setTheme({bg:"#fff",fg:"#000",dark:false}); draw(); // After drawing the watch face, we can draw the widgets diff --git a/apps/aiclock/metadata.json b/apps/aiclock/metadata.json index 4ff40ca65..4c01ecaa9 100644 --- a/apps/aiclock/metadata.json +++ b/apps/aiclock/metadata.json @@ -3,7 +3,7 @@ "name": "AI Clock", "shortName":"AI Clock", "icon": "aiclock.png", - "version":"0.06", + "version":"0.07", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "A watch face that was designed by an AI (stable diffusion) and implemented by a human.", diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index b5e485822..05db62779 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -97,7 +97,7 @@ let imgLock = function() { /************************************************ - * Menu + * Clock Info */ let clockInfoItems = clock_info.load(); let clockInfoMenu = clock_info.addInteractive(clockInfoItems, {

R;7O&KHvc@+7eNBSeeh)Tl%8(hgW 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 Date: Sat, 31 Dec 2022 11:28:07 +0100 Subject: [PATCH 21/42] gipy: splash + old instant speed --- apps/gipy/ChangeLog | 1 + apps/gipy/README.md | 13 ++++++--- apps/gipy/app.js | 68 +++++++++++++++++-------------------------- apps/gipy/splash.png | Bin 0 -> 5736 bytes 4 files changed, 37 insertions(+), 45 deletions(-) create mode 100644 apps/gipy/splash.png diff --git a/apps/gipy/ChangeLog b/apps/gipy/ChangeLog index 8346e6c42..f913c9e58 100644 --- a/apps/gipy/ChangeLog +++ b/apps/gipy/ChangeLog @@ -72,3 +72,4 @@ * Estimated time of Arrival/Going back. * Display current and next segment in red so that you know where to go. * Avoid angles flickering at low speed at the cost of less refresh. + * Splash screen while waiting for gps signal. diff --git a/apps/gipy/README.md b/apps/gipy/README.md index 87eadc3b6..113ec0416 100644 --- a/apps/gipy/README.md +++ b/apps/gipy/README.md @@ -2,12 +2,10 @@ Gipy allows you to follow gpx traces on your watch. -![Screenshot](screenshot1.png) +![Screenshot](splash.png) -It is for now meant for bicycling and not hiking -(it uses your movement to figure out your orientation -and walking is too slow). +It is for now meant for bicycling and but hiking might be fine. It is untested on Banglejs1. If you can try it, you would be welcome. @@ -83,11 +81,18 @@ On your screen you can see : - a *gps* indicator (blinking) on the top right if you lose gps signal - a *lost* indicator on the top right if you stray too far away from path +### Lost + If you stray away from path we will rescale the display to continue displaying nearby segments and display the direction to follow as a black segment. +Note that while lost, the app will slow down a lot since it will start scanning all possible points to figure out where you +are. On path it just needed to scan a few points ahead and behind. + ![Lost](lost.png) +The distance to next point displayed corresponds to the length of the black segment. + ### Settings Few settings for now (feel free to suggest me more) : diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 4e1aedcd9..630633f97 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -13,6 +13,10 @@ var settings = Object.assign( let profile_start_times = []; +let splashscreen = atob( + "sLCDBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W222W222222222222222yySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W2WySSSSSSSSSSSSSySSSySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W222W22222ySSSSSSySSSySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2WySSSSSSSSSSSSSSSSSSSSSSSySSSySySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWW/2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W222SSSSSSSSSSSSSySSSySyT//2SySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WSWWWWWWWWWWWWWWWWWW//2WSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2WySSSSSSSSSSSSSSSSSSSX//222f2SSySSSySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWe//2WWf+2yWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2SSSSSSSSSSSSSSSSSSSSX/+22z/+222SSySySyOOCySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyWSWSWSWSWSWSWWWSWWWf/+2WT/2yyySy2WWXxxxx2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWySSSSSSSSSSSSSSSSSSSX/222z/2222W222Sf/+OOOSSySySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyy2WWSWWWWWWWWWWWWWWWWf/2WWT+2yyz2yyyzxxwBxx2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2SSSSSSSSSSSSSSSSSSSSX2222z+222z+22SeAP+AAOOCSySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyWSWSWSWSWSWSWSWWWSSS2WWWX+2yyz2yy2QBxxwABxwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSQS222e2222y222SOOP+OAAOOSWySSSySySySySySySySySySyyySyyyyyyyyyyyyyyyy2SWSWSWSWSWWWSWWWWWWSASQWW2yyyT2yyxwBxxxwABwyCyy2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2SSSSSSSSSSSSSSSSSSSSSSAASSQ222W22WeAOOP+AAOOGQ223/yySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyySSWSSSWSWSWSWSWSWSWSSSSAAASSCSyyyyBxxxxxwBxyyyy2/yWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSSSSSSSSAACSG2WWOOOOP+AAOGS222/y22/+SySSSySySySySySySySySySyyySyyySyy2SWSWSWSWSWSWSWSWWWSWWWSSSSSSQACSQyxxxxx/xxxyyyyy3wyy3+WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQOASWeOOP//+OWWW223+G2/+SSySySySySySySyyySyyyyyyyyyyyyyyyySSSSSSSSWSSSWSWSWSWSWSWSWSSSSSSRxxyRxxxx//wyySyy2+Sy3+SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSST//ySSSSSSSSSSSSSSSSSSOOOOOOOP//+GWWW222+W2/+SSSSSSSySSSySySySySySySySySySyyySySWSSSWSWSf//+WSWSWSWSWSWSWWSSSTwBxxxxxxxxwyyyCyy2+Sy++SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSST////ySSSSSSSSSSSSSSSSSOAOOOOP//+ACGWw2222G22+SSSSySySySySySySySySySySyyySyyyyyySSSSSSSSf////+SSSSWSSSWSWSWSWSSRxxxxxxxxwSQCSSCyy3wyy2SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQSQSSST//////ySSSSSSSSSSSSSSSSeAOOOOP/+CSSQAACSSGy22+SSSSSSSSSSSSSSSSSySSSySySySySySySySSSSSSSX//////+WSWSWSWSWSWSWSWSTxxxxxxxwSSSSSSQAACSSW2SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQSQSQf///////ySSSSSSSSSSSSSSSSOOOOP/+CSSSSSSSSSQAACSSSSSSSySSSySySySySySySySySySySyyySCSCSSSSf///////+SSSSSSSSWSSSWSWSRxxxxxwSSSWSWSWSSSSSQASWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQR/////////ySSSSSSSSSSSSSSSSOOP/+CSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSySSSySySySyCCSCSCT/////////+WSSSWSWSWSWSWSWSRxxxwSWSWWWSWWWWWWSSSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQf//////////ySSSSSSSSSSSSSSSSeOOSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSySSSySySySySySySySCCCCCCP//////////+SSSSSSSSSSSSSSSSSSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWWWWWWWQAQAQAR////////////yQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSyCCCCCP////////////ySSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQAAQAR/////////////+SQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSySSSySySySyQCCCCD//x////x//////ySSSSSSSSSSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWQAAAAB//////////////wQQQQQQQQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSACACP/xx///xxxx////+SCSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWWWWWWQAAAB////////////////wQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSyQAAAB/xxxxxxxxxxxxxxxxyCCCSCSCSSSSSSSSSSSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWQAAAP//////////////////wQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQAAAPxxxxxxxxxxxxxxxxxxwCCCSCSCSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWQAAB+P/////////////////+AQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQAABxxxxxxxxxxxxxxxxxxxxwCCCCCCCCCSCSSSSSSSSSSSSSSSSSWSSSWSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWQAAAP/////////////////+P/wQAQAQQQQQQQQQQQQQQQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTwAABxxxxxxxxxxxxxxxxxxxxxxyCCCCCCCCSCSCSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWfwAAP+P+OP///////////+P/+P+OAAQAQAQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSST/wABxxxxxxxxxxxxxxxxxxxxxxxxxyCCCCCCCCCCCCCCCSCSSSSSSSSSSSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWf/wAOP+OOOP////////////////+OOPwAAAAAAQAQQQQQQQQQQQQQQQQQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSST//wABxxxxxxxxxxxxxxxxxxxxxxxxxxwCCCCCCCCCCCCCCCSCSCSSSWSSSWSSSWSWSWSWSWSWSWSWSWSWf2WWSWX/xwAOP+OOP////////////+OP///////wAAAAAAQAQAQQQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSST//ySSSf//wBxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAACACCCCCCCCCCCCCCCSCSCSCSSSSSSSSSSSSSWSSSWSWSWf///yWTxxxwOP+P////////////////+P/+P/////+AAAAAAAAAP//wAQAQQQQQQQQQQQQQSQSQSQSSSSSSSSSST/+OOOCf///xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwACACACCP////yCCCCCCCSCSCSSSSSSSSSWSSSWSWSWSX/xxxxwBxxxx+P/+P/////////////////+P/+P//////+AAAAAP//////+QAQAQQQQQQQQQQQQQSQSQSSSSSSSSeOOOOAAOP//+BxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAAP/////////yCCCCCCCCCCCSCSSSSSSSSSSSSSTxxxxxwBxxxxx////////////////////////////////////wP///////////wAAQAQAQQQQQQQQQQQQQQQSQSSOOOOOOAOOOOOOBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/////////////yCCCCCCCCCSCSCSSSWSSSWSRxxxxxxxxxxxxx//+P//////////////////////+P+P////////+P////////////+QAQAQQQQQQQQQQQQQQQSeOOOOOOAOAOAOOOBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/////xxxxxxxx+CCCCCCCCCCCCCSCSCTxxxwAAAAAAAAAAAP/////////////////////////+P/+P///+OP////+OP///+OOOOOOOOEAAAAAQAQQQQQQQQOOOOOOOOOAOAOAOEhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBxxxxxxxxxxxx0kkCiCCCCCCCCCCRxwAAAAAAAAAAAAkkv+P//////////////////////+OOP/+P//+OOOOP//+AAAOOOOOOEkkOEuukkAgQAQAQQQQOOOOOOOAOAOAOAkkshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAAABxxxxwkkkkkkkkkkkCCCCCCBwBwAAAAAAAAAEkkkkuOP////////////////////////+OOOOOP/+OOOOOP////wAAOOOOsuuusssskkkkkAAAOOOOOOOOOOOOOkkkksshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBxxxxxxxxwABx0kkkkkkkkkkkkkiBwAAAAAAAAAAAAkkkkkkkuP///////////////////+P////+OOOOOOOOOOOAAAOOOP/+l/+OOsssssskskkkkuOOOOOOOOOOOOOOksssssskhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBxxwAAABxx0kh1xwkkkkkkkkkklxwBwBwBwAAAAEgAkkkkkkkkkuP////+P///////+P/////+P/////+OOOOOOOAOAAAAAAAOEkuukkgkskggkkkuOOOOOOOOOOOOOOkksuuussssshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAAAAAAAAAB0kkkkkkkkkkkkhwBwBwBwBwAAAAAAkkkkkkkkkkkuP//+OOP///////+P/////+OP/////+OOAAOOuAAOOskkkOAOMusssssgkkkOOOOOOOOOOOOOOOOksuuuusssssshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBwkhwAkkkkkkhx0kkkkkkkklxxxxxxxxwBwBwBwkkkkkkkkkkkkkkuP/+OOOP///////+OOP//+OOP///+OOOOOOAOskuAOuuusskuEksskgkkkOOOOOOOOOOOOOOOOkssuuuussskssghxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0kkkkkhwkkkkkkkkkkkkkklxxxwBwBwBwBwAAAAkkkkkkkkkkkkkkkv//+OOP/////////+OOOP/+OOP+OOOOOOOMkuuukksuussssskgsskkuOOOOOOOOOOOOOOOOkksssuuuskgsskgghxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxwBwBwEkkkkkkkkkkkkkkkkkv+OOOP/+OP//////+OOOOOOOOOOOOOEuOAEssusskssssssskggkkkOOOOOOOOOOOOOOEkskuuuusuussssusskshxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0klx0kkkkkkkkkkkkkkkkklxxxxxxxxxwBwBwAgkkkkkkkkkkkkkkkkkkkuOOOOP+OOP//+OOP+OOOOOOOAOOOAAOsukkssukksskkgkkkggkkOOOOOOOOOOOOOOOEEsssuuussuusssuusssshxxxxxxxxxxxxxxxxxxwBxxxwBxxwAAkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkuOOOOOOOOP//+OOP+OOOAAAOOAOOOAAuuskssukkkssggggggkOOOOOOOOOOOOOOOOOkssssussssuussksusggshxxxxxxwBxxxxxxxxxxwlwAAAAAFxwkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxwAkkkkkkkkkkkkkkkkkkkkkkuOOOOOOAOP+OOOOOOOOOOkAAAAAEuOksuusksukgkkkggkkkOOOOOOOP+OOOOOOOEkkksksskssksusssssskgsshwBxxxwABxxxxxxxxxxx0kkkkkkkl0kkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkuAOOOEOEOP+OOOOOOOOkOukuuuukkuusssssuukggkkkkkOOOOOOOP+OOOOOOuOEssssssskkkkkksssssksgsskgBxxx1wkhxxxxwlxxxwkklwkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxwlwkkkkkkkkkkkkkkkkkkkkkkkkkgAEOOEuuuOOOuOkuOOOsuuMsuuuukuksssksskgggggkuOOOOOOOOOOOOOOOOkkksksksssggsssssssssssskssgAlxwkkkhxwAlwklxwAkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkgAuOEuuuuOOOkOuuOuOsuuksssuusssksskkkkgggkkOOOOOOOP+OOOOOOEuEsssskkgkgkgkkkssgkkskkggkssgkhwkkkklxwEkkkkkgB0kkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkkkkkguuOuuuukOAEuusuukAMuukssssssssskskggggkkuOOOOOOOP+OOOOOOOOskuuussgkskssussggggkkksggsssgkh0kkkklwAkkkkkkkgEkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkgusuuuuuuOEksusuuuuEuuskssskkkskgkkgggkkOOOOOOOOOOOOOOOOOEkssuuussgssuuuusskksssuuussssskkkkkkkkkh0kkkkkkkh0kkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuuuugusukkgkususssssussskskgkkgggggkkOOOOOOOOP+OOOOOOOEMssskskksssssusskssssgkuuuussksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksuuusuuuskssussssssssksskgkgkgggggkuOOOOOOOOP+OOOOOOEAksussssssgkssskkkkkkkkgkuuusssgkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxwEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksssuussusksuussssssksggskgkggggkkkOOOOOOOOOOOOOOOOOAssuuusksgksggsssssksuuuusggkssssgsskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxttgEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkssssssksssssussksssssskkkgggggkkuOOOOOOOP/+OOOONttsEsuuussskgkssgksksskuuuusssgsskgssuskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxtptNEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksgsskkkskskssskssskskskgkggggkuOOOOOOOOP+OOOOONttppkuksskkguuskssskggkksuussskgskkgsuuskkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxx9tttMEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksssskgkgkskksskgkgkkssgggggkkOOOOOOOOOOOOOOOOPtttth0uskkggguusskksssgkgsssssssgkkssuuuskkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxttttOEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksssskgkggkgkksggkussskkggkkOOOOOOOOP/+OOOOOOOP9tttx0P8sskgsussskksssskgsksksssgksuuuusskkkkkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxwB///+OB0EkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskkskguskkggkskkuuskkkkkggOOOOOOOOP/+OOOOOOEOlwP//xwgskusksskksskkkkssgkksksskkkuusussskkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxx0kF/wOOOEAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskgggkuusskkkksusukgkkgguOOOOOOOOP/+OOOOOOOuOB////xwEskusuusgkgggkkkkskggkksskkssssuusskkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxx0kh1wP/+OEv0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggksuuuukuskkssskkkguOOOOOOOOOP/+OOOOOOOEEkF/xx/wkkMkuuuusssgkggggkkkssggskkkskkssssskkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxxx0kkgkv+kkggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkskssusuuuuskksskggOOOOOOOOP+OOOOOOOOOOOkkkEugl1wEEskskussssssggkgkkkssggskkkkgkssssskkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxwgkkglwkkkEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkssksusksskskgkgggOOOOOOOOP/+OOOOOOOOOOukskEEkEEsggsskksssskkkssskkkksssgkkssssgkkssgkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxwlxxwkkkkkkEggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgksskkskkkskskggguOOOOOOOOP/+OOOOOOOEkOOusskssgkkssgkkkkskkkkkksssssskkssssuuussgkkksgkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxx0l0kkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggkssskkkgkkgkggguOOOOOOOOP/+OOOOOOOOEukkuskkskgggssskkkgkkkkkkkkssssskkusksusskssggkkgkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxx0kkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkksksskkggkgggkOOOOOOOOOP/+OOOOOOOOOEuuuuukkkksggssskssggkkkksskksskkkkuusuusskksggkggkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxxxwkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskkkkkkggggguOOOOOOOOOOOOOOOOOOOOOOOsssuuskkksggkkkkssksssssssskkkkgskuuuussskgsggkggkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxxxxxx0kkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskssskkkgkggggOOOOOOOOOOOOOOOOOOOOOOOkkkskgsskksskggkkssssssssssskkkkggssssuuusskgkkkskgkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkssskkkgkgggggOOOOOOOOOOOOOOOOOOOOOOuEuskssgsuskksskssksssskssksksskskggssskssssskgkkkssgkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxx0kh0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskkkgkggggOOOOOOOOOP/+OOOOOOOOEOuukuuuksgsuusksskkuukkkkksskkkkkkukgksssgkkkkskkksksskkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxx10kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskgkgggggOOOOOOOOOP/+OOOOOOOOOkuussksusskssuskksskuusgkskkgsskkguusskskkggkkkkksuusssskkkkkkkkkkhxxxxxxxxxxxxxxxxxxxxwl0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskgkggguOOOOOOOOOP/+OOOOOOOOOOkuuusksssskssssskssksuusgskggsskgguussgkkkgkkkkkkuuusssskkkkkkkklxxxxxxxxxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkskgggguOOOOOOOOOP/+OOOOOOOOOOOEksussskkskskkkskkskssuuuusssssssguuksgkkkkgkskkguuusssskkkkkkklxxxxxxxxxxxxxxxxxxxxxxxx0kkkkkkgkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkkkggguOOOOOOOOOOP/+OOOOOOOOOOEskskskkkkkssksksskkksssuuussksssskssksksksskssskguuuskkskkkkkklxxxxxxxxxxxxxxxxxxxxxxxxx0kkkkgkggkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggkgggkOOOOOOOOOOP/+OOOOOOOOOOOOssskskkkkkuuuskkkkggssksusssksskkskssssuuuusksskguuuskkskkkkkkhxxxxxxxxxxxxxxxxxxxxxxwggEkkkkgkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggggkOOOOOOOOOOP/+OOOOOOOOOOOsskkkkkksksssuussskkkgskkssskssskuksksksussuuusssskssskskkkkkkkhxxxxxxxxxxxxxxxxxxxxxxx10kkkgkkkkkkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggggOOOOOOOOOOOOOOOOOOOOOOOOEssskkskkskussssssskkkgsksssskssskuuussssusksuuussssssssskgkkkkhxxxxxxxxxxxxxxxxxxxxxxxx0kkkggkkkkkkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggguOOOOOOOOOOOOOOOOOOOOOuOEEskskkkksskuuksskskkkkkskssskgssksuuuussuussssusssssgskuskgkkklxxxxxxxxxxxxxxxxxxxxxwkh0gkgkkkgkkkkkkkkkkkkggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggguOOOOOOOOOOOOOOOOOOOOOOkkEskkskkkksssuskksksskkkkkgkssssssksssuusksusssksssgssgskuusgkkkhxxxxxxxxxxxxxxxxxxxxxwl10kkkkkkgkkkkkkkkkkkkggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggOOOOOOOOOP/+OOOOOOOOOOOkuusskskskkukssssksskskkkkkkkssssssssskssskskssgkkgsgssgskuuskkklxxxxxxxxxxxxxxxxxxxxxxx10kkkkkgkkkkkkkkkgkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgguOOOOOOOOP/+OOOOOOOOOOOOEMussskkukuukksskksskskkkkkkkkskskssksssskkkgssgkkgkkssgsksussklxxxxxxxxxxxxxxxxxxxxxxxxwkkkkkkgkkkkgkkkkgkkgkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkguOOOOOOOOP/+OOOOOOOOOOOOEOskksskkuusskkskkkkkkkkkkksskkskskssgksssksggsggkkgkkksgskkssskhxxxxxxxxxxxxxxxxxxxxxxwlwkgkkkkkkkkkgkkkgkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgOOOOOOOOP//+OOOOOOOOOOOEsgkkkskuskukkkkkkkskkkkkkkksskkkkkkkkgkkkkssggssgkkkkkkkgkkkksshxxxxxxxxxxxxxxxxxxxxxxxwkgEgkkkkkkkkgkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOOOP//+OOOOOOOOOOOOOMkEkskkuskskkkskkssuukkuuskksskkkkkggggkgkssssksgkkuuskkgkkkksshxxxxxxxxxxxxxxxxxxxxxxwgkkkgkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOOP//+OOOOOOOOOOOOOussskssksuukkkksussusussuussgksskkskgggsssksssskkkksuuukkkkkkksshxxxxxxxxxxxxxxxxxxxxxxwgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOOP/+OOOOOOOOOOOOOOsEssksssssuuskkssskukksksskgggksskskgkssskgkssskkkgsuuuskksggksshxxxxxxxxxxxxxxxxxxxxxx0kEkkkkkkkkkkkkgkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOP//+OOOOOOOOOOOOOEskkskkskkkkuskkkkkkkkkkksskgkgksskkkkkksskggskskkggskuuussssgkkghxxxxxxxxxxxxxxxxxxxxwkkkgkkgkkkggkkkggkkkgkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOP//+OOOOOOOOOOOOOEkkkkkkkkkkkkkkkkkkkkkkkkkskkgkgkkkkkkkgkkkgggksskgggskkkssssskggghxxxxxxxxxxxxxxxxxxxxxwkkgkggkkkgkkkkgkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOP///+OOOOOOOOOOOOOOEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkkkgggkkkkgggsggkkkkkkkgggg==" +); + function start_profiling() { profile_start_times.push(getTime()); } @@ -91,43 +95,15 @@ class Status { this.gps_coordinates_counter = 0; // how many coordinates did we receive this.old_points = []; // record previous points but only when enough distance between them this.old_times = []; // the corresponding times - this.unfiltered_old_points = []; // record previous points - this.unfiltered_old_times = []; // the corresponding times } new_position_reached(position) { // we try to figure out direction by looking at previous points // instead of the gps course which is not very nice. - this.gps_coordinates_counter += 1; - this.unfiltered_old_points.push(position); let now = getTime(); - this.unfiltered_old_times.push(now); - // compute instant speed using unfiltered points - // we average the first four points, then the last four - // and compute the speed between the two averages. - // this way, at speed 0 we will get a speed close to 0 - // whereas taking speed between first and last point will not. - if (this.unfiltered_old_points.length == 8) { - let p1 = this.unfiltered_old_points[0] - .plus(this.unfiltered_old_points[1]) - .plus(this.unfiltered_old_points[2]) - .plus(this.unfiltered_old_points[3]) - .times(1 / 4); - let p2 = this.unfiltered_old_points[4] - .plus(this.unfiltered_old_points[5]) - .plus(this.unfiltered_old_points[6]) - .plus(this.unfiltered_old_points[7]) - .times(1 / 4); - let t1 = - (this.unfiltered_old_times[1] + this.unfiltered_old_times[2]) / 2; - let t2 = - (this.unfiltered_old_times[5] + this.unfiltered_old_times[6]) / 2; - this.instant_speed = p1.distance(p2) / (t2 - t1); - this.unfiltered_old_points.shift(); - this.unfiltered_old_times.shift(); - } if (this.old_points.length == 0) { + this.gps_coordinates_counter += 1; this.old_points.push(position); this.old_times.push(now); return null; @@ -139,6 +115,7 @@ class Status { return null; } } + this.gps_coordinates_counter += 1; this.old_points.push(position); this.old_times.push(now); @@ -153,6 +130,8 @@ class Status { } } + this.instant_speed = distance_to_oldest / (now - this.old_times[0]); + if (this.old_points.length == 4) { this.old_points.shift(); this.old_times.shift(); @@ -578,10 +557,10 @@ function load_gpc(filename) { let msg = "invalid file\nsize " + file_size + "\ninstead of" + offset; E.showAlert(msg).then(function () { E.showAlert(); - start_gipy(path_data); + start_gipy(filename, path_data); }); } else { - start_gipy(path_data); + start_gipy(filename, path_data); } } @@ -750,8 +729,6 @@ class Point { } } -Bangle.loadWidgets(); - let fake_gps_point = 0.0; function simulate_gps(status) { // let's keep the screen on in simulations @@ -764,8 +741,10 @@ function simulate_gps(status) { if (point_index >= status.path.len / 2 - 1) { return; } - let p1 = status.path.point(2 * point_index); + let p1 = status.path.point(2 * point_index); // use these to approximately follow path let p2 = status.path.point(2 * (point_index + 1)); + // let p1 = status.path.point(point_index); // use these to strictly follow path + // let p2 = status.path.point(point_index + 1); let alpha = fake_gps_point - point_index; let pos = p1.times(1 - alpha).plus(p2.times(alpha)); @@ -797,7 +776,7 @@ function start(fn) { load_gpc(fn); } -function start_gipy(path_data) { +function start_gipy(filename, path_data) { console.log("starting"); let path = new Path(path_data); let status = new Status(path); @@ -806,15 +785,18 @@ function start_gipy(path_data) { status.position = new Point(status.path.point(0)); setInterval(simulate_gps, 500, status); } else { - // let's display start while waiting for gps signal - let p1 = status.path.point(0); - let p2 = status.path.point(1); - let diff = p2.minus(p1); - let direction = Math.atan2(diff.lat, diff.lon); + // let's display splash screen while waiting for gps signal + g.clear(); + g.drawImage(splashscreen, 0, 0); + g.setFont("6x8:2") + .setFontAlign(-1, -1, 0) + .setColor(0xf800) + .drawString(filename, 0, g.getHeight() - 30); + Bangle.setLocked(false); - status.update_position(p1, direction); let frame = 0; + let started = false; let set_coordinates = function (data) { frame += 1; // 0,0 coordinates are considered invalid since we sometimes receive them out of nowhere @@ -823,6 +805,10 @@ function start_gipy(path_data) { !isNaN(data.lon) && (data.lat != 0.0 || data.lon != 0.0); if (valid_coordinates) { + if (!started) { + Bangle.loadWidgets(); // i don't know why i cannot load them at start : they would display on splash screen + started = true; + } status.update_position(new Point(data.lon, data.lat), null); } let gps_status_color; diff --git a/apps/gipy/splash.png b/apps/gipy/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..56d4de06bb0dd97e60564c7f43ed709695042784 GIT binary patch literal 5736 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 avz Date: Sat, 31 Dec 2022 12:33:36 +0100 Subject: [PATCH 22/42] gipy: fix doc --- apps/gipy/README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/gipy/README.md b/apps/gipy/README.md index 113ec0416..4ca98dea8 100644 --- a/apps/gipy/README.md +++ b/apps/gipy/README.md @@ -5,7 +5,7 @@ Gipy allows you to follow gpx traces on your watch. ![Screenshot](splash.png) -It is for now meant for bicycling and but hiking might be fine. +It is mainly meant for bicycling but hiking might be fine. It is untested on Banglejs1. If you can try it, you would be welcome. @@ -52,12 +52,13 @@ Your path will be displayed in svg. ### Starting Gipy -Once you start gipy you will have a menu for selecting your trace (if more than one). -Choose the one you want and here you go : +At start you will have a menu for selecting your trace (if more than one). +Choose the one you want and you will reach the splash screen where you'll wait for the gps signal. +Once you have a signal you will reach the main screen: ![Screenshot](legend.png) -On your screen you can see : +On your screen you can see: - yourself (the big black dot) - the path (the top of the screen is in front of you) @@ -65,7 +66,7 @@ On your screen you can see : - if needed a projection of yourself on the path (small black dot) - points as white dots - waypoints as doubled white dots -- some text on the left (from top to bottom) : +- some text on the left (from top to bottom): * time to reach start point at current average speed * current time * time to reach end point at current average speed @@ -73,10 +74,10 @@ On your screen you can see : * remaining distance / path length * average speed / instant speed - interest points from openstreetmap as color dots : - * red : bakery - * deep blue : water point - * cyan : toilets (often doubles as water point) - * green : artwork + * red: bakery + * deep blue: water point + * cyan: toilets (often doubles as water point) + * green: artwork - a *turn* indicator on the top right when you reach a turning point - a *gps* indicator (blinking) on the top right if you lose gps signal - a *lost* indicator on the top right if you stray too far away from path From 7d6e2dffa7f0aa7d7e7771701229974c84447a06 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Sat, 31 Dec 2022 17:08:36 +0100 Subject: [PATCH 23/42] gipy: compressing splash --- apps/gipy/app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 630633f97..2cdcd66bd 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -13,8 +13,10 @@ var settings = Object.assign( let profile_start_times = []; -let splashscreen = atob( - "sLCDBWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W222W222222222222222yySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W2WySSSSSSSSSSSSSySSSySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W222W22222ySSSSSSySSSySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2WySSSSSSSSSSSSSSSSSSSSSSSySSSySySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWW/2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2W2W2W2W222SSSSSSSSSSSSSySSSySyT//2SySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WSWWWWWWWWWWWWWWWWWW//2WSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2WySSSSSSSSSSSSSSSSSSSX//222f2SSySSSySySySySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy2WWWWWWWWWWWWWWWWWWWe//2WWf+2yWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2W2W2W2SSSSSSSSSSSSSSSSSSSSX/+22z/+222SSySySyOOCySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyWSWSWSWSWSWSWWWSWWWf/+2WT/2yyySy2WWXxxxx2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWySSSSSSSSSSSSSSSSSSSX/222z/2222W222Sf/+OOOSSySySySySySySySySySySySyyySyyyyyyyyyyyyyyyyyy2WWSWWWWWWWWWWWWWWWWf/2WWT+2yyz2yyyzxxwBxx2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2WWW2W2W2W2SSSSSSSSSSSSSSSSSSSSX2222z+222z+22SeAP+AAOOCSySySySySyyySyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyWSWSWSWSWSWSWSWWWSSS2WWWX+2yyz2yy2QBxxwABxwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSQS222e2222y222SOOP+OAAOOSWySSSySySySySySySySySySyyySyyyyyyyyyyyyyyyy2SWSWSWSWSWWWSWWWWWWSASQWW2yyyT2yyxwBxxxwABwyCyy2WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW2SSSSSSSSSSSSSSSSSSSSSSAASSQ222W22WeAOOP+AAOOGQ223/yySySySySySySyyySyyyyyyyyyyyyyyyyyyyyyySSWSSSWSWSWSWSWSWSWSSSSAAASSCSyyyyBxxxxxwBxyyyy2/yWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSSSSSSSSAACSG2WWOOOOP+AAOGS222/y22/+SySSSySySySySySySySySySyyySyyySyy2SWSWSWSWSWSWSWSWWWSWWWSSSSSSQACSQyxxxxx/xxxyyyyy3wyy3+WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQOASWeOOP//+OWWW223+G2/+SSySySySySySySyyySyyyyyyyyyyyyyyyySSSSSSSSWSSSWSWSWSWSWSWSWSSSSSSRxxyRxxxx//wyySyy2+Sy3+SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSSST//ySSSSSSSSSSSSSSSSSSOOOOOOOP//+GWWW222+W2/+SSSSSSSySSSySySySySySySySySySyyySySWSSSWSWSf//+WSWSWSWSWSWSWWSSSTwBxxxxxxxxwyyyCyy2+Sy++SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWSSSSSSSSST////ySSSSSSSSSSSSSSSSSOAOOOOP//+ACGWw2222G22+SSSSySySySySySySySySySySyyySyyyyyySSSSSSSSf////+SSSSWSSSWSWSWSWSSRxxxxxxxxwSQCSSCyy3wyy2SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQSQSSST//////ySSSSSSSSSSSSSSSSeAOOOOP/+CSSQAACSSGy22+SSSSSSSSSSSSSSSSSySSSySySySySySySySSSSSSSX//////+WSWSWSWSWSWSWSWSTxxxxxxxwSSSSSSQAACSSW2SWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQSQSQf///////ySSSSSSSSSSSSSSSSOOOOP/+CSSSSSSSSSQAACSSSSSSSySSSySySySySySySySySySySyyySCSCSSSSf///////+SSSSSSSSWSSSWSWSRxxxxxwSSSWSWSWSSSSSQASWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQR/////////ySSSSSSSSSSSSSSSSOOP/+CSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSySSSySySySyCCSCSCT/////////+WSSSWSWSWSWSWSWSRxxxwSWSWWWSWWWWWWSSSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQQQQQQQf//////////ySSSSSSSSSSSSSSSSeOOSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSySSSySySySySySySySCCCCCCP//////////+SSSSSSSSSSSSSSSSSSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWWWWWWWQAQAQAR////////////yQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSyCCCCCP////////////ySSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWQAAQAR/////////////+SQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSySSSySySySyQCCCCD//x////x//////ySSSSSSSSSSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWQAAAAB//////////////wQQQQQQQQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSACACP/xx///xxxx////+SCSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWWWWWWWQAAAB////////////////wQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSyQAAAB/xxxxxxxxxxxxxxxxyCCCSCSCSSSSSSSSSSSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWQAAAP//////////////////wQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQAAAPxxxxxxxxxxxxxxxxxxwCCCSCSCSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWWWWWWWWWWWWQAAB+P/////////////////+AQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSQAABxxxxxxxxxxxxxxxxxxxxwCCCCCCCCCSCSSSSSSSSSSSSSSSSSWSSSWSSSWSWSWSWSWSWSWSWSWSWWWSWWWWWQAAAP/////////////////+P/wQAQAQQQQQQQQQQQQQQQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTwAABxxxxxxxxxxxxxxxxxxxxxxyCCCCCCCCSCSCSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWSWSWSWWWSWWWWWWWWWfwAAP+P+OP///////////+P/+P+OAAQAQAQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSST/wABxxxxxxxxxxxxxxxxxxxxxxxxxyCCCCCCCCCCCCCCCSCSSSSSSSSSSSSSSSSSSSSSWSSSWSWSWSWSWSWSWSWf/wAOP+OOOP////////////////+OOPwAAAAAAQAQQQQQQQQQQQQQQQQQSQSSSSSSSSSSSSSSSSSSSSSSSSSSSST//wABxxxxxxxxxxxxxxxxxxxxxxxxxxwCCCCCCCCCCCCCCCSCSCSSSWSSSWSSSWSWSWSWSWSWSWSWSWSWf2WWSWX/xwAOP+OOP////////////+OP///////wAAAAAAQAQAQQQQQQQQQQQQQQQSQSQSSSSSSSSSSSSSSSSSST//ySSSf//wBxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAACACCCCCCCCCCCCCCCSCSCSCSSSSSSSSSSSSSWSSSWSWSWf///yWTxxxwOP+P////////////////+P/+P/////+AAAAAAAAAP//wAQAQQQQQQQQQQQQQSQSQSQSSSSSSSSSST/+OOOCf///xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwACACACCP////yCCCCCCCSCSCSSSSSSSSSWSSSWSWSWSX/xxxxwBxxxx+P/+P/////////////////+P/+P//////+AAAAAP//////+QAQAQQQQQQQQQQQQQSQSQSSSSSSSSeOOOOAAOP//+BxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAAP/////////yCCCCCCCCCCCSCSSSSSSSSSSSSSTxxxxxwBxxxxx////////////////////////////////////wP///////////wAAQAQAQQQQQQQQQQQQQQQSQSSOOOOOOAOOOOOOBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/////////////yCCCCCCCCCSCSCSSSWSSSWSRxxxxxxxxxxxxx//+P//////////////////////+P+P////////+P////////////+QAQAQQQQQQQQQQQQQQQSeOOOOOOAOAOAOOOBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/////xxxxxxxx+CCCCCCCCCCCCCSCSCTxxxwAAAAAAAAAAAP/////////////////////////+P/+P///+OP////+OP///+OOOOOOOOEAAAAAQAQQQQQQQQOOOOOOOOOAOAOAOEhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBxxxxxxxxxxxx0kkCiCCCCCCCCCCRxwAAAAAAAAAAAAkkv+P//////////////////////+OOP/+P//+OOOOP//+AAAOOOOOOEkkOEuukkAgQAQAQQQQOOOOOOOAOAOAOAkkshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAAABxxxxwkkkkkkkkkkkCCCCCCBwBwAAAAAAAAAEkkkkuOP////////////////////////+OOOOOP/+OOOOOP////wAAOOOOsuuusssskkkkkAAAOOOOOOOOOOOOOkkkksshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBxxxxxxxxwABx0kkkkkkkkkkkkkiBwAAAAAAAAAAAAkkkkkkkuP///////////////////+P////+OOOOOOOOOOOAAAOOOP/+l/+OOsssssskskkkkuOOOOOOOOOOOOOOksssssskhxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBxxwAAABxx0kh1xwkkkkkkkkkklxwBwBwBwAAAAEgAkkkkkkkkkuP////+P///////+P/////+P/////+OOOOOOOAOAAAAAAAOEkuukkgkskggkkkuOOOOOOOOOOOOOOkksuuussssshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAAAAAAAAAB0kkkkkkkkkkkkhwBwBwBwBwAAAAAAkkkkkkkkkkkuP//+OOP///////+P/////+OP/////+OOAAOOuAAOOskkkOAOMusssssgkkkOOOOOOOOOOOOOOOOksuuuusssssshxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwBwkhwAkkkkkkhx0kkkkkkkklxxxxxxxxwBwBwBwkkkkkkkkkkkkkkuP/+OOOP///////+OOP//+OOP///+OOOOOOAOskuAOuuusskuEksskgkkkOOOOOOOOOOOOOOOOkssuuuussskssghxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0kkkkkhwkkkkkkkkkkkkkklxxxwBwBwBwBwAAAAkkkkkkkkkkkkkkkv//+OOP/////////+OOOP/+OOP+OOOOOOOMkuuukksuussssskgsskkuOOOOOOOOOOOOOOOOkksssuuuskgsskgghxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwAkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxwBwBwEkkkkkkkkkkkkkkkkkv+OOOP/+OP//////+OOOOOOOOOOOOOEuOAEssusskssssssskggkkkOOOOOOOOOOOOOOEkskuuuusuussssusskshxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0klx0kkkkkkkkkkkkkkkkklxxxxxxxxxwBwBwAgkkkkkkkkkkkkkkkkkkkuOOOOP+OOP//+OOP+OOOOOOOAOOOAAOsukkssukksskkgkkkggkkOOOOOOOOOOOOOOOEEsssuuussuusssuusssshxxxxxxxxxxxxxxxxxxwBxxxwBxxwAAkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkuOOOOOOOOP//+OOP+OOOAAAOOAOOOAAuuskssukkkssggggggkOOOOOOOOOOOOOOOOOkssssussssuussksusggshxxxxxxwBxxxxxxxxxxwlwAAAAAFxwkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxwAkkkkkkkkkkkkkkkkkkkkkkuOOOOOOAOP+OOOOOOOOOOkAAAAAEuOksuusksukgkkkggkkkOOOOOOOP+OOOOOOOEkkksksskssksusssssskgsshwBxxxwABxxxxxxxxxxx0kkkkkkkl0kkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkuAOOOEOEOP+OOOOOOOOkOukuuuukkuusssssuukggkkkkkOOOOOOOP+OOOOOOuOEssssssskkkkkksssssksgsskgBxxx1wkhxxxxwlxxxwkklwkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxwlwkkkkkkkkkkkkkkkkkkkkkkkkkgAEOOEuuuOOOuOkuOOOsuuMsuuuukuksssksskgggggkuOOOOOOOOOOOOOOOOkkksksksssggsssssssssssskssgAlxwkkkhxwAlwklxwAkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkgAuOEuuuuOOOkOuuOuOsuuksssuusssksskkkkgggkkOOOOOOOP+OOOOOOEuEsssskkgkgkgkkkssgkkskkggkssgkhwkkkklxwEkkkkkgB0kkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkkkkkguuOuuuukOAEuusuukAMuukssssssssskskggggkkuOOOOOOOP+OOOOOOOOskuuussgkskssussggggkkksggsssgkh0kkkklwAkkkkkkkgEkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkgusuuuuuuOEksusuuuuEuuskssskkkskgkkgggkkOOOOOOOOOOOOOOOOOEkssuuussgssuuuusskksssuuussssskkkkkkkkkh0kkkkkkkh0kkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuuuugusukkgkususssssussskskgkkgggggkkOOOOOOOOP+OOOOOOOEMssskskksssssusskssssgkuuuussksskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksuuusuuuskssussssssssksskgkgkgggggkuOOOOOOOOP+OOOOOOEAksussssssgkssskkkkkkkkgkuuusssgkskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxwEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksssuussusksuussssssksggskgkggggkkkOOOOOOOOOOOOOOOOOAssuuusksgksggsssssksuuuusggkssssgsskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxttgEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkssssssksssssussksssssskkkgggggkkuOOOOOOOP/+OOOONttsEsuuussskgkssgksksskuuuusssgsskgssuskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxtptNEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksgsskkkskskssskssskskskgkggggkuOOOOOOOOP+OOOOONttppkuksskkguuskssskggkksuussskgskkgsuuskkkkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxx9tttMEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksssskgkgkskksskgkgkkssgggggkkOOOOOOOOOOOOOOOOPtttth0uskkggguusskksssgkgsssssssgkkssuuuskkkkkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxttttOEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksssskgkggkgkksggkussskkggkkOOOOOOOOP/+OOOOOOOP9tttx0P8sskgsussskksssskgsksksssgksuuuusskkkkkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxwB///+OB0EkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskkskguskkggkskkuuskkkkkggOOOOOOOOP/+OOOOOOEOlwP//xwgskusksskksskkkkssgkksksskkkuusussskkkkkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxx0kF/wOOOEAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskgggkuusskkkksusukgkkgguOOOOOOOOP/+OOOOOOOuOB////xwEskusuusgkgggkkkkskggkksskkssssuusskkkkkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxx0kh1wP/+OEv0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggksuuuukuskkssskkkguOOOOOOOOOP/+OOOOOOOEEkF/xx/wkkMkuuuusssgkggggkkkssggskkkskkssssskkkkkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxxx0kkgkv+kkggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkskssusuuuuskksskggOOOOOOOOP+OOOOOOOOOOOkkkEugl1wEEskskussssssggkgkkkssggskkkkgkssssskkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxwgkkglwkkkEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkssksusksskskgkgggOOOOOOOOP/+OOOOOOOOOOukskEEkEEsggsskksssskkkssskkkksssgkkssssgkkssgkkkkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxwlxxwkkkkkkEggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgksskkskkkskskggguOOOOOOOOP/+OOOOOOOEkOOusskssgkkssgkkkkskkkkkksssssskkssssuuussgkkksgkkkkkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxx0l0kkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggkssskkkgkkgkggguOOOOOOOOP/+OOOOOOOOEukkuskkskgggssskkkgkkkkkkkkssssskkusksusskssggkkgkkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxx0kkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkksksskkggkgggkOOOOOOOOOP/+OOOOOOOOOEuuuuukkkksggssskssggkkkksskksskkkkuusuusskksggkggkkkkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxxxwkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskkkkkkggggguOOOOOOOOOOOOOOOOOOOOOOOsssuuskkksggkkkkssksssssssskkkkgskuuuussskgsggkggkkkkkkkkkkkkkklxxxxxxxxxxxxxxxxxxxxxxx0kkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskssskkkgkggggOOOOOOOOOOOOOOOOOOOOOOOkkkskgsskksskggkkssssssssssskkkkggssssuuusskgkkkskgkkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxxxxwkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkssskkkgkgggggOOOOOOOOOOOOOOOOOOOOOOuEuskssgsuskksskssksssskssksksskskggssskssssskgkkkssgkkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxxx0kh0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkksskkkgkggggOOOOOOOOOP/+OOOOOOOOEOuukuuuksgsuusksskkuukkkkksskkkkkkukgksssgkkkkskkksksskkkkkkkkkkkkhxxxxxxxxxxxxxxxxxxx10kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskgkgggggOOOOOOOOOP/+OOOOOOOOOkuussksusskssuskksskuusgkskkgsskkguusskskkggkkkkksuusssskkkkkkkkkkhxxxxxxxxxxxxxxxxxxxxwl0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkskgkggguOOOOOOOOOP/+OOOOOOOOOOkuuusksssskssssskssksuusgskggsskgguussgkkkgkkkkkkuuusssskkkkkkkklxxxxxxxxxxxxxxxxxxxxxxx0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkskgggguOOOOOOOOOP/+OOOOOOOOOOOEksussskkskskkkskkskssuuuusssssssguuksgkkkkgkskkguuusssskkkkkkklxxxxxxxxxxxxxxxxxxxxxxxx0kkkkkkgkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkkkggguOOOOOOOOOOP/+OOOOOOOOOOEskskskkkkkssksksskkksssuuussksssskssksksksskssskguuuskkskkkkkklxxxxxxxxxxxxxxxxxxxxxxxxx0kkkkgkggkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggkgggkOOOOOOOOOOP/+OOOOOOOOOOOOssskskkkkkuuuskkkkggssksusssksskkskssssuuuusksskguuuskkskkkkkkhxxxxxxxxxxxxxxxxxxxxxxwggEkkkkgkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggggkOOOOOOOOOOP/+OOOOOOOOOOOsskkkkkksksssuussskkkgskkssskssskuksksksussuuusssskssskskkkkkkkhxxxxxxxxxxxxxxxxxxxxxxx10kkkgkkkkkkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggggOOOOOOOOOOOOOOOOOOOOOOOOEssskkskkskussssssskkkgsksssskssskuuussssusksuuussssssssskgkkkkhxxxxxxxxxxxxxxxxxxxxxxxx0kkkggkkkkkkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggguOOOOOOOOOOOOOOOOOOOOOuOEEskskkkksskuuksskskkkkkskssskgssksuuuussuussssusssssgskuskgkkklxxxxxxxxxxxxxxxxxxxxxwkh0gkgkkkgkkkkkkkkkkkkggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkggguOOOOOOOOOOOOOOOOOOOOOOkkEskkskkkksssuskksksskkkkkgkssssssksssuusksusssksssgssgskuusgkkkhxxxxxxxxxxxxxxxxxxxxxwl10kkkkkkgkkkkkkkkkkkkggkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgggOOOOOOOOOP/+OOOOOOOOOOOkuusskskskkukssssksskskkkkkkkssssssssskssskskssgkkgsgssgskuuskkklxxxxxxxxxxxxxxxxxxxxxxx10kkkkkgkkkkkkkkkgkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgguOOOOOOOOP/+OOOOOOOOOOOOEMussskkukuukksskksskskkkkkkkkskskssksssskkkgssgkkgkkssgsksussklxxxxxxxxxxxxxxxxxxxxxxxxwkkkkkkgkkkkgkkkkgkkgkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkguOOOOOOOOP/+OOOOOOOOOOOOEOskksskkuusskkskkkkkkkkkkksskkskskssgksssksggsggkkgkkksgskkssskhxxxxxxxxxxxxxxxxxxxxxxwlwkgkkkkkkkkkgkkkgkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgOOOOOOOOP//+OOOOOOOOOOOEsgkkkskuskukkkkkkkskkkkkkkksskkkkkkkkgkkkkssggssgkkkkkkkgkkkksshxxxxxxxxxxxxxxxxxxxxxxxwkgEgkkkkkkkkgkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOOOP//+OOOOOOOOOOOOOMkEkskkuskskkkskkssuukkuuskksskkkkkggggkgkssssksgkkuuskkgkkkksshxxxxxxxxxxxxxxxxxxxxxxwgkkkgkkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOOP//+OOOOOOOOOOOOOussskssksuukkkksussusussuussgksskkskgggsssksssskkkksuuukkkkkkksshxxxxxxxxxxxxxxxxxxxxxxwgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOOP/+OOOOOOOOOOOOOOsEssksssssuuskkssskukksksskgggksskskgkssskgkssskkkgsuuuskksggksshxxxxxxxxxxxxxxxxxxxxxx0kEkkkkkkkkkkkkgkkkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOOP//+OOOOOOOOOOOOOEskkskkskkkkuskkkkkkkkkkksskgkgksskkkkkksskggskskkggskuuussssgkkghxxxxxxxxxxxxxxxxxxxxwkkkgkkgkkkggkkkggkkkgkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOOP//+OOOOOOOOOOOOOEkkkkkkkkkkkkkkkkkkkkkkkkkskkgkgkkkkkkkgkkkgggksskgggskkkssssskggghxxxxxxxxxxxxxxxxxxxxxwkkgkggkkkgkkkkgkkkkgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuOOOP///+OOOOOOOOOOOOOOEkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkgkkkgggkkkkgggsggkkkkkkkgggg==" +let splashscreen = require("heatshrink").decompress( + atob( + "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" + ) ); function start_profiling() { From 790c1e199a4adc9dacdea39809ca4842f1c622bf Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Sat, 31 Dec 2022 17:22:53 +0100 Subject: [PATCH 24/42] gipy: metadata --- apps/gipy/metadata.json | 4 ++-- apps/gipy/screenshot1.png | Bin 2859 -> 0 bytes apps/gipy/screenshot2.png | Bin 3024 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 apps/gipy/screenshot1.png delete mode 100644 apps/gipy/screenshot2.png diff --git a/apps/gipy/metadata.json b/apps/gipy/metadata.json index b5e8231dc..97d18f5fe 100644 --- a/apps/gipy/metadata.json +++ b/apps/gipy/metadata.json @@ -3,12 +3,12 @@ "name": "Gipy", "shortName": "Gipy", "version": "0.16", - "description": "Follow gpx files", + "description": "Follow gpx files using the gps. Don't get lost in your bike trips and hikes.", "allow_emulator":false, "icon": "gipy.png", "type": "app", "tags": "tool,outdoors,gps", - "screenshots": [], + "screenshots": [{"url":"splash.png"}], "supports": ["BANGLEJS2"], "readme": "README.md", "interface": "interface.html", diff --git a/apps/gipy/screenshot1.png b/apps/gipy/screenshot1.png deleted file mode 100644 index c7c45fa3b5a4a7d54f7c5e7702c2bede0eb7b3a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2859 zcmV+`3)J+9P)kDe;@o!QQ-6A^EJ-b$B*o- z&!z-(lR-WKc-~9`aJ<$49It8D;|Rc?pZ~M=#8A6K&Hln(j(=}V0G>z%0Ncba@a{nj zz&1_I)>~*TonJNbZw8*7`RZ89H^EVH^dJUc3snQQPXc&b?QFLOdY?;j*3h;f24G1= zXL~fji@%bcouQe!OBr~9w1#&1_xAGwvS;7x57g{JnC8)J48T8N7m#bvw}MI;mkeyi z&)?xG0Iz%6)rLt6+&zGQe6)8RsDb?~4taPI!0*}gf9732FJ*%S@D^frA%>8P?Q}PQ zYjw7}5|N8I4ZJJt)WEU8{@H%oTt2pp)Z0codJ(q=u;utPw$eom0M@AJw0Tknc1rcu zoeUhQrqh=d;_WtBy?ynB3|zy@l{hDW(cNpH_x5$K4zOm?_P+RI7b2RsaDP_@*m^11 z0x3VFRkw*2kho4a!*ZUkUeZOlIKd?fA&u;yl-pAz8xrXNiPW*1^U zqv0jQSq@<&18-xu-iapF#?-(EkTH^h4+yh4q;(g<6So8}HLyorM_&uTj$t0rl?;5q zGy`y)=l~q2X6z z0FS6<>hsFL*}z!+TkTCpJUlvGj~Y`Sc<5Z zaVa4ro-2pfT#8EGo2e|yCsF(4IFy7q=ZAPUA9z}7i9{?+LdmO+QsDCw! zxUy5x+MOsyYHV%EaY|L!w8o7*Gv)?>vs4D)EM?#Pax+hs%mAFF zECA0@mJ(uy⪼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 So*tM00000 Date: Sun, 1 Jan 2023 18:35:27 +0100 Subject: [PATCH 25/42] gipy : fix start time --- apps/gipy/app.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 2cdcd66bd..cbfbfa840 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -1,4 +1,4 @@ -let simulated = false; +let simulated = true; let file_version = 3; let code_key = 47490; @@ -92,7 +92,7 @@ class Status { previous_point = point; } this.remaining_distances = r; // how much distance remains at start of each segment - this.starting_time = getTime(); // time we start + this.starting_time = null; // time we start this.advanced_distance = 0.0; this.gps_coordinates_counter = 0; // how many coordinates did we receive this.old_points = []; // record previous points but only when enough distance between them @@ -745,8 +745,8 @@ function simulate_gps(status) { } let p1 = status.path.point(2 * point_index); // use these to approximately follow path let p2 = status.path.point(2 * (point_index + 1)); - // let p1 = status.path.point(point_index); // use these to strictly follow path - // let p2 = status.path.point(point_index + 1); + //let p1 = status.path.point(point_index); // use these to strictly follow path + //let p2 = status.path.point(point_index + 1); let alpha = fake_gps_point - point_index; let pos = p1.times(1 - alpha).plus(p2.times(alpha)); @@ -798,7 +798,6 @@ function start_gipy(filename, path_data) { Bangle.setLocked(false); let frame = 0; - let started = false; let set_coordinates = function (data) { frame += 1; // 0,0 coordinates are considered invalid since we sometimes receive them out of nowhere @@ -807,9 +806,9 @@ function start_gipy(filename, path_data) { !isNaN(data.lon) && (data.lat != 0.0 || data.lon != 0.0); if (valid_coordinates) { - if (!started) { + if (this.starting_time === null) { + this.starting_time = getTime(); Bangle.loadWidgets(); // i don't know why i cannot load them at start : they would display on splash screen - started = true; } status.update_position(new Point(data.lon, data.lat), null); } From c07261f927e028f5495c977c6ed6ce142cedfb71 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Mon, 2 Jan 2023 20:18:38 +0100 Subject: [PATCH 26/42] gipy: disable simulator --- apps/gipy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index cbfbfa840..0a53a12b1 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -1,4 +1,4 @@ -let simulated = true; +let simulated = false; let file_version = 3; let code_key = 47490; From 4aa06762d45ba934172e65fcb063236e8f9cb96c Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Tue, 3 Jan 2023 09:30:46 +0100 Subject: [PATCH 27/42] gipy: minor fix --- apps/gipy/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 0a53a12b1..9e3d95295 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -784,6 +784,7 @@ function start_gipy(filename, path_data) { let status = new Status(path); if (simulated) { + status.starting_time = getTime(); status.position = new Point(status.path.point(0)); setInterval(simulate_gps, 500, status); } else { @@ -807,7 +808,7 @@ function start_gipy(filename, path_data) { (data.lat != 0.0 || data.lon != 0.0); if (valid_coordinates) { if (this.starting_time === null) { - this.starting_time = getTime(); + status.starting_time = getTime(); Bangle.loadWidgets(); // i don't know why i cannot load them at start : they would display on splash screen } status.update_position(new Point(data.lon, data.lat), null); From 109fb2902e415e62ed8df8757a144f9306685180 Mon Sep 17 00:00:00 2001 From: frederic wagner Date: Wed, 4 Jan 2023 08:58:13 +0100 Subject: [PATCH 28/42] gipy: minor fix --- apps/gipy/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/gipy/app.js b/apps/gipy/app.js index 9e3d95295..c9d018cac 100644 --- a/apps/gipy/app.js +++ b/apps/gipy/app.js @@ -807,7 +807,7 @@ function start_gipy(filename, path_data) { !isNaN(data.lon) && (data.lat != 0.0 || data.lon != 0.0); if (valid_coordinates) { - if (this.starting_time === null) { + if (status.starting_time === null) { status.starting_time = getTime(); Bangle.loadWidgets(); // i don't know why i cannot load them at start : they would display on splash screen } From 4846c45885ab7565f44d3eb342a0b69f9edfd3ab Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 5 Jan 2023 06:35:42 -0500 Subject: [PATCH 29/42] Update app.js --- apps/a_clock_timer/app.js | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/apps/a_clock_timer/app.js b/apps/a_clock_timer/app.js index d13098b26..07be1964f 100644 --- a/apps/a_clock_timer/app.js +++ b/apps/a_clock_timer/app.js @@ -18,19 +18,29 @@ var timervalue = 0; var istimeron = false; var timertick; -Bangle.on('touch',t=>{ - if (t == 1) { +Bangle.on('touch',(touchside, touchdata)=>{ + if (touchside == 1) { Bangle.buzz(30); - if (timervalue < 5*60) { timervalue = 1 ; } - else { timervalue -= 5*60; } + var changevalue = 0; + if(touchdata.y > 88) { + changevalue += 60*5; + } else { + changevalue += 60*1; + } + if (timervalue < changevalue) { timervalue = 1 ; } + else { timervalue -= changevalue; } } - else if (t == 2) { + else if (touchside == 2) { Bangle.buzz(30); if (!istimeron) { istimeron = true; timertick = setInterval(countDown, 1000); } - timervalue += 60*10; + if(touchdata.y > 88) { + timervalue += 60*10; + } else { + timervalue += 60*1; + } } }); @@ -103,18 +113,21 @@ function draw() { g.reset().clearRect(0,24,g.getWidth(),g.getHeight()-IMAGEHEIGHT); g.drawImage(getImg(),0,g.getHeight()-IMAGEHEIGHT); - var x_sun = 176 - (getGmt().getHours() / 24 * 176 + 4); + var gmtHours = getGmt().getHours(); + + var x_sun = 176 - (gmtHours / 24 * 176 + 4); g.setColor('#ff0').drawLine(x_sun, g.getHeight()-IMAGEHEIGHT, x_sun, g.getHeight()); g.reset(); - var x_night_start = 176 - (((getGmt().getHours()-6)%24) / 24 * 176 + 4); - var x_night_end = 176 - (((getGmt().getHours()+6)%24) / 24 * 176 + 4); - for (let x = x_night_start; x < 176; x+=2) { - g.setColor('#000').drawLine(x, g.getHeight()-IMAGEHEIGHT, x, g.getHeight()); + var x_night_start = 176 - (((gmtHours-6)%24) / 24 * 176 + 4); + var x_night_end = 176 - (((gmtHours+6)%24) / 24 * 176 + 4); + g.setColor('#000'); + for (let x = x_night_start; x < (x_night_end < x_night_start ? 176 : x_night_end); x+=2) { + g.drawLine(x, g.getHeight()-IMAGEHEIGHT, x, g.getHeight()); } if (x_night_end < x_night_start) { for (let x = 0; x < x_night_end; x+=2) { - g.setColor('#000').drawLine(x, g.getHeight()-IMAGEHEIGHT, x, g.getHeight()); + g.drawLine(x, g.getHeight()-IMAGEHEIGHT, x, g.getHeight()); } } From 5b5410e77e9aebcff0cdf39649c3798a15234f25 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 5 Jan 2023 06:39:51 -0500 Subject: [PATCH 30/42] Update README.md --- apps/a_clock_timer/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/a_clock_timer/README.md b/apps/a_clock_timer/README.md index e435bdb3f..3fcc00b28 100644 --- a/apps/a_clock_timer/README.md +++ b/apps/a_clock_timer/README.md @@ -2,7 +2,10 @@ * Works with Bangle 2 * Timer - * Right tap: start/increase by 10 minutes; Left tap: decrease by 5 minutes + * Top Right tap: increase by 1 minute + * Top Left tap: decrease by 1 minute + * Bottom Right tap: increase by 10 minutes + * Bottom Left tap: decrease by 5 minutes * Short buzz at T-30, T-20, T-10 ; Double buzz at T * Other time zones * Currently hardcoded to Paris and Tokyo (this will be customizable in a future version) From 3abf65dffbbc212b706829e3b39f726f92702370 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 5 Jan 2023 06:40:53 -0500 Subject: [PATCH 31/42] Update metadata.json --- apps/a_clock_timer/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/a_clock_timer/metadata.json b/apps/a_clock_timer/metadata.json index b488f33bc..4e7a36b8a 100644 --- a/apps/a_clock_timer/metadata.json +++ b/apps/a_clock_timer/metadata.json @@ -1,7 +1,7 @@ { "id": "a_clock_timer", "name": "A Clock with Timer", - "version": "0.02", + "version": "0.03", "description": "A Clock with Timer, Map and Time Zones", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], From 6b736e971d091b6fde0d75839496f6b7c0b09482 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 5 Jan 2023 06:40:55 -0500 Subject: [PATCH 32/42] Update ChangeLog --- apps/a_clock_timer/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/a_clock_timer/ChangeLog b/apps/a_clock_timer/ChangeLog index 26b8d73d7..262f30295 100644 --- a/apps/a_clock_timer/ChangeLog +++ b/apps/a_clock_timer/ChangeLog @@ -1,2 +1,3 @@ 0.01: Beta version for Bangle 2 (2021/11/28) 0.02: Shows night time on the map (2022/12/28) +0.03: Add 1 minute timer with upper taps (2023/01/05) From 30edc6d144f2f608c2abbd1cea3952ef06db2f2d Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 5 Jan 2023 06:44:33 -0500 Subject: [PATCH 33/42] Update app.js --- apps/a_clock_timer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/a_clock_timer/app.js b/apps/a_clock_timer/app.js index 07be1964f..441229842 100644 --- a/apps/a_clock_timer/app.js +++ b/apps/a_clock_timer/app.js @@ -83,7 +83,7 @@ function countDown() { function showWelcomeMessage() { g.reset().clearRect(0, 76, 44+44, g.getHeight()/2+6); g.setFontAlign(0, 0).setFont("6x8"); - g.drawString("Touch right to", 44, 80); + g.drawString("Tap right to", 44, 80); g.drawString("start timer", 44, 88); setTimeout(function(){ g.reset().clearRect(0, 76, 44+44, g.getHeight()/2+6); }, 8000); } From 5b246e13122bf3e84dc5ddb5573d4a279956e2df Mon Sep 17 00:00:00 2001 From: thyttan <6uuxstm66@mozmail.comā©> Date: Thu, 5 Jan 2023 13:31:23 +0100 Subject: [PATCH 34/42] widget field follow correct theme immediately --- apps/dtlaunch/ChangeLog | 2 ++ apps/dtlaunch/app-b2.js | 1 + apps/dtlaunch/metadata.json | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index 044b8c35f..b353459b9 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -23,4 +23,6 @@ button to exit is no longer an option. facilitate 'fast switching' of apps where available. 0.20: Bangle 2: Revert use of Bangle.load() to classic load() calls since widgets would still be loaded when they weren't supposed to. +0.21: Bangle 2: Call Bangle.drawWidgets() early on so that the widget field +immediately follows the correct theme. diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index a7a318c18..e1ce6d8d1 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -84,6 +84,7 @@ g.flip(); }; + Bangle.drawWidgets(); // To immediately update widget field to follow current theme - remove leftovers if previous app set custom theme. Bangle.loadWidgets(); drawPage(0); diff --git a/apps/dtlaunch/metadata.json b/apps/dtlaunch/metadata.json index b69a1a5e6..d1aa6f679 100644 --- a/apps/dtlaunch/metadata.json +++ b/apps/dtlaunch/metadata.json @@ -1,7 +1,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.20", + "version": "0.21", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", From 83e76d400136553ce0caf47e50e00664fd5625be Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Thu, 5 Jan 2023 18:41:51 +0100 Subject: [PATCH 35/42] grocery Sort selected items to bottom and enable Widgets --- apps/grocery/ChangeLog | 1 + apps/grocery/app.js | 44 +++++++++++++++++++++++++------------- apps/grocery/metadata.json | 2 +- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/apps/grocery/ChangeLog b/apps/grocery/ChangeLog index 906046782..294dab597 100644 --- a/apps/grocery/ChangeLog +++ b/apps/grocery/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Refactor code to store grocery list in separate file +0.03: Sort selected items to bottom and enable Widgets diff --git a/apps/grocery/app.js b/apps/grocery/app.js index 481efc3d9..a68f53010 100644 --- a/apps/grocery/app.js +++ b/apps/grocery/app.js @@ -1,5 +1,6 @@ var filename = 'grocery_list.json'; var settings = require("Storage").readJSON(filename,1)|| { products: [] }; +let menu; function updateSettings() { require("Storage").writeJSON(filename, settings); @@ -11,19 +12,32 @@ function twoChat(n){ return ''+n; } -const mainMenu = settings.products.reduce(function(m, p, i){ - const name = twoChat(p.quantity)+' '+p.name; - m[name] = { - value: p.ok, - format: v => v?'[x]':'[ ]', - onchange: v => { - settings.products[i].ok = v; - updateSettings(); - } - }; - return m; -}, { - '': { 'title': 'Grocery list' } -}); +function sortMenu() { + mainMenu.sort((a,b) => { + const byValue = a.value-b.value; + return byValue !== 0 ? byValue : a.index-b.index; + }); + if (menu) { + menu.draw(); + } +} + +const mainMenu = settings.products.map((p,i) => ({ + title: twoChat(p.quantity)+' '+p.name, + value: p.ok, + format: v => v?'[x]':'[ ]', + index: i, + onchange: v => { + settings.products[i].ok = v; + updateSettings(); + sortMenu(); + } +})); +sortMenu(); + +mainMenu[''] = { 'title': 'Grocery list' }; mainMenu['< Back'] = ()=>{load();}; -E.showMenu(mainMenu); + +Bangle.loadWidgets(); +menu = E.showMenu(mainMenu); +Bangle.drawWidgets(); diff --git a/apps/grocery/metadata.json b/apps/grocery/metadata.json index 8c0e34dff..e0cf24a4b 100644 --- a/apps/grocery/metadata.json +++ b/apps/grocery/metadata.json @@ -1,7 +1,7 @@ { "id": "grocery", "name": "Grocery", - "version": "0.02", + "version": "0.03", "description": "Simple grocery (shopping) list - Display a list of product and track if you already put them in your cart.", "icon": "grocery.png", "type": "app", From 7b5f6e10c55a78f53fc0cc0a99cf069b7684da2f Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 5 Jan 2023 19:39:02 +0100 Subject: [PATCH 36/42] Use clock_info.addInteractive instead of a custom implementation --- apps/bwclk/ChangeLog | 2 +- apps/bwclk/app.js | 268 ++++++++++----------------------------- apps/bwclk/metadata.json | 2 +- 3 files changed, 69 insertions(+), 203 deletions(-) diff --git a/apps/bwclk/ChangeLog b/apps/bwclk/ChangeLog index cd52c7665..4bd8664c1 100644 --- a/apps/bwclk/ChangeLog +++ b/apps/bwclk/ChangeLog @@ -24,4 +24,4 @@ 0.24: Update clock_info to avoid a redraw 0.25: Use Bangle.setUI({remove:...}) to allow loading the launcher without a full reset on fw2v16. ClockInfo Fix: Use .get instead of .show as .show is not implemented for weather etc. - +0.26: Use clkinfo.addInteractive instead of a custom implementation diff --git a/apps/bwclk/app.js b/apps/bwclk/app.js index db531a22f..b0b727fd2 100644 --- a/apps/bwclk/app.js +++ b/apps/bwclk/app.js @@ -31,6 +31,19 @@ for (const key in saved_settings) { settings[key] = saved_settings[key]; } +let isFullscreen = function() { + var s = settings.screen.toLowerCase(); + if(s == "dynamic"){ + return Bangle.isLocked(); + } else { + return s == "full"; + } +}; + +let getLineY = function(){ + return H/5*2 + (isFullscreen() ? 0 : 8); +} + /************************************************ * Assets */ @@ -86,70 +99,47 @@ let imgLock = function() { /************************************************ * Menu */ -// Custom bwItems menu - therefore, its added here and not in a clkinfo.js file. -let bwItems = { - name: null, - img: null, - items: [ - { name: "WeekOfYear", - get: () => ({ text: "Week " + weekOfYear(), img: null}), - show: function() {}, - hide: function () {} - }, - ] -}; +let clockInfoItems = clock_info.load(); +let clockInfoMenu = clock_info.addInteractive(clockInfoItems, { + x : 0, + y: 135, + w: W, + h: H-135, + draw : (itm, info, options) => { + g.setColor(g.theme.fg); + g.fillRect(options.x, options.y, options.x+options.w, options.y+options.h); -let weekOfYear = function() { - var date = new Date(); - date.setHours(0, 0, 0, 0); - // Thursday in current week decides the year. - date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); - // January 4 is always in week 1. - var week1 = new Date(date.getFullYear(), 0, 4); - // Adjust to Thursday in week 1 and count number of weeks from date to week1. - return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - - 3 + (week1.getDay() + 6) % 7) / 7); -}; + g.setFontAlign(0,0); + g.setColor(g.theme.bg); - -// Load menu -let menu = clock_info.load(); -menu = menu.concat(bwItems); - - -// Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it. -if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){ - settings.menuPosX = 0; - settings.menuPosY = 0; -} - -let canRunMenuItem = function() { - if(settings.menuPosY == 0){ - return false; - } - - var menuEntry = menu[settings.menuPosX]; - var item = menuEntry.items[settings.menuPosY-1]; - return item.run !== undefined; -}; - - -let runMenuItem = function() { - if(settings.menuPosY == 0){ - return; - } - - var menuEntry = menu[settings.menuPosX]; - var item = menuEntry.items[settings.menuPosY-1]; - try{ - var ret = item.run(); - if(ret){ - Bangle.buzz(300, 0.6); + if (options.focus){ + g.drawRect(options.x, options.y, options.x+options.w-2, options.y+options.h-1); // show if focused + g.drawRect(options.x+1, options.y+1, options.x+options.w-3, options.y+options.h-2); // show if focused } - } catch (ex) { - // Simply ignore it... + + // Set text and font + var image = info.img; + var text = String(info.text); + if(text.split('\n').length > 1){ + g.setMiniFont(); + } else { + g.setSmallFont(); + } + + // Compute sizes + var strWidth = g.stringWidth(text); + var imgWidth = image == null ? 0 : 24; + var midx = options.x+options.w/2; + + // Draw + + if (image) { + var scale = imgWidth / image.width; + g.drawImage(image, midx-16-parseInt(strWidth/2), options.y+8, {scale: scale}); + } + g.drawString(text, midx+imgWidth-6, options.y+20); } -}; +}); /************************************************ @@ -161,7 +151,7 @@ let draw = function() { // Draw clock drawDate(); - drawMenuAndTime(); + drawTime(); drawLock(); drawWidgets(); }; @@ -169,7 +159,7 @@ let draw = function() { let drawDate = function() { // Draw background - var y = H/5*2 + (isFullscreen() ? 0 : 8); + var y = getLineY() g.reset().clearRect(0,0,W,y); // Draw date @@ -197,14 +187,12 @@ let drawDate = function() { }; -let drawTime = function(y, smallText) { +let drawTime = function() { // Draw background + var y1 = getLineY(); + var y = y1; var date = new Date(); - // Draw time - g.setColor(g.theme.bg); - g.setFontAlign(0,0); - var hours = String(date.getHours()); var minutes = date.getMinutes(); minutes = minutes < 10 ? String("0") + minutes : minutes; @@ -212,67 +200,18 @@ let drawTime = function(y, smallText) { var timeStr = hours + colon + minutes; // Set y coordinates correctly - y += parseInt((H - y)/2) + 5; + y += parseInt((H - y)/2)-10; - // Show large or small time depending on info entry - if(smallText){ - y -= 15; - g.setMediumFont(); - } else { - g.setLargeFont(); - } + // Clear region + g.setColor(g.theme.fg); + g.fillRect(0,y1,W,y+20); + + g.setMediumFont(); + g.setColor(g.theme.bg); + g.setFontAlign(0,0); g.drawString(timeStr, W/2, y); }; -let drawMenuItem = function(text, image) { - // First clear the time region - var y = H/5*2 + (isFullscreen() ? 0 : 8); - - g.setColor(g.theme.fg); - g.fillRect(0,y,W,H); - - // Draw menu text - var hasText = (text != null && text != ""); - if(hasText){ - g.setFontAlign(0,0); - - // For multiline text we show an even smaller font... - text = String(text); - if(text.split('\n').length > 1){ - g.setMiniFont(); - } else { - g.setSmallFont(); - } - - var imgWidth = image == null ? 0 : 24; - var strWidth = g.stringWidth(text); - g.setColor(g.theme.fg).fillRect(0, 149-14, W, H); - g.setColor(g.theme.bg).drawString(text, W/2 + imgWidth/2 + 2, 149+3); - - if(image != null){ - var scale = imgWidth / image.width; - g.drawImage(image, W/2 + -strWidth/2-4 - parseInt(imgWidth/2), 149 - parseInt(imgWidth/2), {scale: scale}); - } - } - - // Draw time - drawTime(y, hasText); -}; - - -let drawMenuAndTime = function() { - var menuEntry = menu[settings.menuPosX]; - - // The first entry is the overview... - if(settings.menuPosY == 0){ - drawMenuItem(menuEntry.name, menuEntry.img); - return; - } - - // Draw item if needed - var item = menuEntry.items[settings.menuPosY-1].get(); - drawMenuItem(item.text, item.img); -}; let drawLock = function() { if(settings.showLock && Bangle.isLocked()){ @@ -291,17 +230,6 @@ let drawWidgets = function() { }; -let isFullscreen = function() { - var s = settings.screen.toLowerCase(); - if(s == "dynamic"){ - return Bangle.isLocked(); - } else { - return s == "full"; - } -}; - - - /************************************************ * Listener */ @@ -343,74 +271,12 @@ let lockListenerBw = function(isLocked) { }; Bangle.on('lock', lockListenerBw); -let chargingListenerBw = function(charging) { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - // Jump to battery - settings.menuPosX = 0; - settings.menuPosY = 1; - draw(); +let kill = function(){ + clockInfoMenu.remove(); + delete clockInfoMenu; }; -Bangle.on('charging', chargingListenerBw); - -let touchListenerBw = function(btn, e) { - var widget_size = isFullscreen() ? 0 : 20; // Its not exactly 24px -- empirically it seems that 20 worked better... - var left = parseInt(g.getWidth() * 0.22); - var right = g.getWidth() - left; - var upper = parseInt(g.getHeight() * 0.22) + widget_size; - var lower = g.getHeight() - upper; - - var is_upper = e.y < upper; - var is_lower = e.y > lower; - var is_left = e.x < left && !is_upper && !is_lower; - var is_right = e.x > right && !is_upper && !is_lower; - var is_center = !is_upper && !is_lower && !is_left && !is_right; - - if(is_lower){ - Bangle.buzz(40, 0.6); - settings.menuPosY = (settings.menuPosY+1) % (menu[settings.menuPosX].items.length+1); - - drawMenuAndTime(); - } - - if(is_upper){ - if(e.y < widget_size){ - return; - } - - Bangle.buzz(40, 0.6); - settings.menuPosY = settings.menuPosY-1; - settings.menuPosY = settings.menuPosY < 0 ? menu[settings.menuPosX].items.length : settings.menuPosY; - - drawMenuAndTime(); - } - - if(is_right){ - Bangle.buzz(40, 0.6); - settings.menuPosX = (settings.menuPosX+1) % menu.length; - settings.menuPosY = 0; - drawMenuAndTime(); - } - - if(is_left){ - Bangle.buzz(40, 0.6); - settings.menuPosY = 0; - settings.menuPosX = settings.menuPosX-1; - settings.menuPosX = settings.menuPosX < 0 ? menu.length-1 : settings.menuPosX; - drawMenuAndTime(); - } - - if(is_center){ - if(canRunMenuItem()){ - runMenuItem(); - } - } -}; -Bangle.on('touch', touchListenerBw); - -let save = () => storage.write(SETTINGS_FILE, settings); -E.on("kill", save); +E.on("kill", kill); /************************************************ * Startup Clock diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index 376124a96..c464e51aa 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -1,7 +1,7 @@ { "id": "bwclk", "name": "BW Clock", - "version": "0.25", + "version": "0.26", "description": "A very minimalistic clock to mainly show date and time.", "readme": "README.md", "icon": "app.png", From 85f7d3e739313865c9148a024e9ec821563fcac3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 5 Jan 2023 19:50:35 +0100 Subject: [PATCH 37/42] Updated readme --- apps/bwclk/README.md | 37 ++++++++----------------------------- apps/bwclk/metadata.json | 2 +- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/apps/bwclk/README.md b/apps/bwclk/README.md index d869fa2cf..b19e52787 100644 --- a/apps/bwclk/README.md +++ b/apps/bwclk/README.md @@ -3,18 +3,16 @@ A very minimalistic clock. ![](screenshot.png) +## ToDos and known issues +- [ ] The clkinfo is always shown and its, therefore, not possible to only show the time as shown in the screenshot. +- [ ] The weeknumber is currently not an option in clkinfo. +- [ ] Its not possible to run clkinfo items (e.g. trigger home assistant). + ## Features The BW clock implements features that are exposed by other apps through the `clkinfo` module. -For example, if you install the HomeAssistant app, this menu item will be shown if you click right -and additionally allows you to send triggers directly from the clock (select triggers via up/down and -send via click center). Here are examples of other apps that are integrated: - -- Bangle data such as steps, heart rate, battery or charging state. -- Show agenda entries. A timer for an agenda entry can also be set by simply clicking in the middle of the screen. This can be used to not forget a meeting etc. Note that only one agenda-timer can be set at a time. *Requirement: Gadgetbridge calendar sync enabled* -- Weather temperature as well as the wind speed can be shown. *Requirement: Weather app* -- HomeAssistant triggers can be executed directly. *Requirement: HomeAssistant app* - -Note: If some apps are not installed (e.gt. weather app), then this menu item is hidden. +For example, if you install the HomeAssistant app, this menu item will be shown if you first +touch the bottom of the screen and then swipe left/right to the home assistant menu. To select +sub-items simply swipe up/down. ## Settings - Screen: Normal (widgets shown), Dynamic (widgets shown if unlocked) or Full (widgets are hidden). @@ -22,25 +20,6 @@ Note: If some apps are not installed (e.gt. weather app), then this menu item is - The colon (e.g. 7:35 = 735) can be hidden in the settings for an even larger time font to improve readability further. - Your bangle uses the sys color settings so you can change the color too. -## Menu structure -2D menu allows you to display lots of different data including data from 3rd party apps and it's also possible to control things e.g. to trigger HomeAssistant. - -Simply click left / right to go through the menu entries such as Bangle, Weather etc. -and click up/down to move into this sub-menu. You can then click in the middle of the screen -to e.g. send a trigger via HomeAssistant once you selected it. The actions really depend -on the app that provide this sub-menu through the `clkinfo` module. - -``` - Bangle -- Agenda -- Weather -- HomeAssistant - | | | | - Battery Entry 1 Temperature Trigger1 - | | | | - Steps ... ... ... - | - ... -``` - - ## Thanks to - Thanks to Gordon Williams not only for the great BangleJs, but specifically also for the implementation of `clkinfo` which simplified the BWClock a lot and moved complexety to the apps where it should be located. - Icons created by Flaticon diff --git a/apps/bwclk/metadata.json b/apps/bwclk/metadata.json index c464e51aa..f2e7ef428 100644 --- a/apps/bwclk/metadata.json +++ b/apps/bwclk/metadata.json @@ -2,7 +2,7 @@ "id": "bwclk", "name": "BW Clock", "version": "0.26", - "description": "A very minimalistic clock to mainly show date and time.", + "description": "A very minimalistic clock.", "readme": "README.md", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}, {"url":"screenshot_2.png"}, {"url":"screenshot_3.png"}, {"url":"screenshot_4.png"}], From 9cbc192708318ed7d7792ea4653bb2736583f4f8 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Thu, 5 Jan 2023 19:53:44 +0100 Subject: [PATCH 38/42] grocery: Add interface.html Allow to edit items without reuploading entire app with interface.html which is a modifed grocery.html --- apps/grocery/interface.html | 138 ++++++++++++++++++++++++++++++++++++ apps/grocery/metadata.json | 1 + 2 files changed, 139 insertions(+) create mode 100644 apps/grocery/interface.html diff --git a/apps/grocery/interface.html b/apps/grocery/interface.html new file mode 100644 index 000000000..65528c8e6 --- /dev/null +++ b/apps/grocery/interface.html @@ -0,0 +1,138 @@ + + + + + + +