mirror of https://github.com/espruino/BangleApps
imageclock - Initial implementation of remove UI
parent
a818496f45
commit
8b2fac1a71
|
@ -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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue