imageclock - Initial implementation of remove UI

pull/2156/head
Martin Boonk 2022-09-27 20:44:32 +02:00
parent a818496f45
commit 8b2fac1a71
1 changed files with 767 additions and 703 deletions

View File

@ -1,3 +1,7 @@
let unlockedDrawInterval = [];
let lockedDrawInterval = [];
{
let watchface = require("Storage").readJSON("imageclock.face.json"); let watchface = require("Storage").readJSON("imageclock.face.json");
let watchfaceResources = require("Storage").readJSON("imageclock.resources.json"); let watchfaceResources = require("Storage").readJSON("imageclock.resources.json");
let precompiledJs = eval(require("Storage").read("imageclock.draw.js")); let precompiledJs = eval(require("Storage").read("imageclock.draw.js"));
@ -38,7 +42,7 @@ let palette = new Uint16Array([
0xffff, //white 0xffff, //white
0xffff, //white 0xffff, //white
0xffff, //white 0xffff, //white
]) ]);
let p0 = g; let p0 = g;
let p1; let p1;
@ -75,12 +79,21 @@ if (settings.perflog){
}; };
} }
let delayTimeouts = [];
function delay(t) { function delay(t) {
return new Promise(function (resolve) { return new Promise(function (resolve) {
setTimeout(resolve, t); delayTimeouts.push(setTimeout(resolve, t));
}); });
} }
function cleanupDelays(){
for (let t of delayTimeouts){
clearTimeout(t);
}
delayTimeouts = [];
}
function prepareImg(resource){ function prepareImg(resource){
startPerfLog("prepareImg"); startPerfLog("prepareImg");
//print("prepareImg: ", resource); //print("prepareImg: ", resource);
@ -553,10 +566,13 @@ let drawingTime;
let start; let start;
let deferredTimout;
function initialDraw(resources, face){ function initialDraw(resources, face){
//print("Free memory", process.memory(false).free); //print("Free memory", process.memory(false).free);
requestedDraws++; requestedDraws++;
if (!isDrawing){ if (!isDrawing){
cleanupDelays();
//print(new Date().toISOString(), "Can draw,", requestedDraws, "draws requested so far"); //print(new Date().toISOString(), "Can draw,", requestedDraws, "draws requested so far");
isDrawing = true; isDrawing = true;
resetPerfLog(); resetPerfLog();
@ -570,7 +586,7 @@ function initialDraw(resources, face){
promise.then(()=>{ promise.then(()=>{
let currentDrawingTime = Date.now(); let currentDrawingTime = Date.now();
if (showWidgets){ if (showWidgets && global.WIDGETS){
//print("Draw widgets"); //print("Draw widgets");
Bangle.drawWidgets(); Bangle.drawWidgets();
g.setColor(g.theme.fg); g.setColor(g.theme.fg);
@ -590,7 +606,7 @@ function initialDraw(resources, face){
if (requestedDraws > 0){ if (requestedDraws > 0){
//print(new Date().toISOString(), "Had deferred drawing left, drawing again"); //print(new Date().toISOString(), "Had deferred drawing left, drawing again");
requestedDraws = 0; requestedDraws = 0;
setTimeout(()=>{initialDraw(resources, face);}, 10); deferredTimout = setTimeout(()=>{initialDraw(resources, face);}, 10);
} }
} //else { } //else {
//print("queued draw"); //print("queued draw");
@ -601,7 +617,7 @@ function handleHrm(e){
if (e.confidence > 70){ if (e.confidence > 70){
pulse = e.bpm; pulse = e.bpm;
if (!redrawEvents || redrawEvents.includes("HRM") && !Bangle.isLocked()){ if (!redrawEvents || redrawEvents.includes("HRM") && !Bangle.isLocked()){
//print("Redrawing on HRM"); print("Redrawing on HRM");
initialDraw(watchfaceResources, watchface); initialDraw(watchfaceResources, watchface);
} }
} }
@ -631,20 +647,16 @@ function getMatchedWaitingTime(time){
return result; return result;
} }
function setMatchedInterval(callable, time, intervalHandler, delay){ function setMatchedInterval(callable, time, intervalHandler, delay){
//print("Setting matched interval for", time); //print("Setting matched interval for", time, intervalHandler);
let matchedTime = getMatchedWaitingTime(time + delay); let matchedTime = getMatchedWaitingTime(time + delay);
setTimeout(()=>{ return setTimeout(()=>{
let interval = setInterval(callable, time); let interval = setInterval(callable, time);
if (intervalHandler) intervalHandler(interval); if (intervalHandler) intervalHandler(interval);
callable(); callable();
}, matchedTime); }, matchedTime);
} }
let unlockedDrawInterval;
let lockedDrawInterval;
let lastDrawTime = 0; let lastDrawTime = 0;
let firstDraw = true; let firstDraw = true;
@ -659,20 +671,33 @@ let events = getByPath(watchface, ["Properties","Events"]);
//print("events", events); //print("events", events);
//print("redrawEvents", redrawEvents); //print("redrawEvents", redrawEvents);
let initialDrawTimeoutUnlocked;
let initialDrawTimeoutLocked;
function handleLock(isLocked, forceRedraw){ function handleLock(isLocked, forceRedraw){
//print("isLocked", Bangle.isLocked()); //print("isLocked", Bangle.isLocked());
if (lockedDrawInterval) clearInterval(lockedDrawInterval); for (let i of unlockedDrawInterval){
if (unlockedDrawInterval) clearInterval(unlockedDrawInterval); //print("Clearing unlocked", i);
clearInterval(i);
}
for (let i of lockedDrawInterval){
//print("Clearing locked", i);
clearInterval(i);
}
unlockedDrawInterval = [];
lockedDrawInterval = [];
if (!isLocked){ if (!isLocked){
if (forceRedraw || !redrawEvents || (redrawEvents.includes("unlock"))){ if (forceRedraw || !redrawEvents || (redrawEvents.includes("unlock"))){
//print("Redrawing on unlock", isLocked); //print("Redrawing on unlock", isLocked);
initialDraw(watchfaceResources, watchface); initialDraw(watchfaceResources, watchface);
} }
setMatchedInterval(()=>{ initialDrawTimeoutUnlocked = setMatchedInterval(()=>{
//print("Redrawing on unlocked interval"); //print("Redrawing on unlocked interval");
initialDraw(watchfaceResources, watchface); initialDraw(watchfaceResources, watchface);
},unlockedRedraw, (v)=>{ },unlockedRedraw, (v)=>{
unlockedDrawInterval = v; //print("New matched unlocked interval", v);
unlockedDrawInterval.push(v);
}, lastDrawTime); }, lastDrawTime);
if (!events || events.includes("HRM")) Bangle.setHRMPower(1, "imageclock"); if (!events || events.includes("HRM")) Bangle.setHRMPower(1, "imageclock");
if (!events || events.includes("pressure")) Bangle.setBarometerPower(1, 'imageclock'); if (!events || events.includes("pressure")) Bangle.setBarometerPower(1, 'imageclock');
@ -681,11 +706,12 @@ function handleLock(isLocked, forceRedraw){
//print("Redrawing on lock", isLocked); //print("Redrawing on lock", isLocked);
initialDraw(watchfaceResources, watchface); initialDraw(watchfaceResources, watchface);
} }
setMatchedInterval(()=>{ initialDrawTimeoutLocked = setMatchedInterval(()=>{
//print("Redrawing on locked interval"); //print("Redrawing on locked interval");
initialDraw(watchfaceResources, watchface); initialDraw(watchfaceResources, watchface);
},lockedRedraw, (v)=>{ },lockedRedraw, (v)=>{
lockedDrawInterval = v; //print("New matched locked interval", v);
lockedDrawInterval.push(v);
}, lastDrawTime); }, lastDrawTime);
Bangle.setHRMPower(0, "imageclock"); Bangle.setHRMPower(0, "imageclock");
Bangle.setBarometerPower(0, 'imageclock'); Bangle.setBarometerPower(0, 'imageclock');
@ -697,21 +723,25 @@ let showWidgets = false;
let showWidgetsChanged = false; let showWidgetsChanged = false;
let currentDragDistance = 0; let currentDragDistance = 0;
Bangle.setUI("clock"); function restoreWidgetDraw(){
Bangle.on('drag', (e)=>{ if (global.WIDGETS) {
for (let w in global.WIDGETS) {
let wd = global.WIDGETS[w];
wd.draw = originalWidgetDraw[w];
wd.area = originalWidgetArea[w];
}
}
}
function handleDrag(e){
//print("handleDrag");
currentDragDistance += e.dy; currentDragDistance += e.dy;
if (Math.abs(currentDragDistance) < 10) return; if (Math.abs(currentDragDistance) < 10) return;
dragDown = currentDragDistance > 0; dragDown = currentDragDistance > 0;
currentDragDistance = 0; currentDragDistance = 0;
if (!showWidgets && dragDown){ if (!showWidgets && dragDown){
//print("Enable widgets"); //print("Enable widgets");
if (WIDGETS && typeof WIDGETS === "object") { restoreWidgetDraw();
for (let w in WIDGETS) {
let wd = WIDGETS[w];
wd.draw = originalWidgetDraw[w];
wd.area = originalWidgetArea[w];
}
}
showWidgetsChanged = true; showWidgetsChanged = true;
} }
if (showWidgets && !dragDown){ if (showWidgets && !dragDown){
@ -727,7 +757,8 @@ Bangle.on('drag', (e)=>{
initialDraw(); initialDraw();
} }
} }
);
Bangle.on('drag', handleDrag);
if (!events || events.includes("pressure")){ if (!events || events.includes("pressure")){
Bangle.on('pressure', handlePressure); Bangle.on('pressure', handlePressure);
@ -753,11 +784,11 @@ let originalWidgetArea = {};
function clearWidgetsDraw(){ function clearWidgetsDraw(){
//print("Clear widget draw calls"); //print("Clear widget draw calls");
if (WIDGETS && typeof WIDGETS === "object") { if (global.WIDGETS) {
originalWidgetDraw = {}; originalWidgetDraw = {};
originalWidgetArea = {}; originalWidgetArea = {};
for (let w in WIDGETS) { for (let w in global.WIDGETS) {
let wd = WIDGETS[w]; let wd = global.WIDGETS[w];
originalWidgetDraw[w] = wd.draw; originalWidgetDraw[w] = wd.draw;
originalWidgetArea[w] = wd.area; originalWidgetArea[w] = wd.area;
wd.draw = () => {}; wd.draw = () => {};
@ -766,9 +797,42 @@ function clearWidgetsDraw(){
} }
} }
setTimeout(()=>{ if (!global.WIDGETS) Bangle.loadWidgets();
Bangle.loadWidgets(); if (!showWidgets) clearWidgetsDraw();
clearWidgetsDraw();
}, 0);
handleLock(Bangle.isLocked()); handleLock(Bangle.isLocked());
Bangle.setUI({
mode : "clock",
remove : function() {
//print("remove calls");
// Called to unload all of the clock app
Bangle.setHRMPower(0, "imageclock");
Bangle.setBarometerPower(0, 'imageclock');
Bangle.removeListener('drag', handleDrag);
Bangle.removeListener('lock', handleLock);
Bangle.removeListener('charging', handleCharging);
Bangle.removeListener('HRM', handleHrm);
Bangle.removeListener('pressure', handlePressure);
if (deferredTimout) clearTimeout(deferredTimout);
if (initialDrawTimeoutUnlocked) clearTimeout(initialDrawTimeoutUnlocked);
if (initialDrawTimeoutLocked) clearTimeout(initialDrawTimeoutLocked);
for (let i of unlockedDrawInterval){
//print("Clearing unlocked", i);
clearInterval(i);
}
delete unlockedDrawInterval;
for (let i of lockedDrawInterval){
//print("Clearing locked", i);
clearInterval(i);
}
delete lockedDrawInterval;
cleanupDelays();
restoreWidgetDraw();
}
});
}