Do not use resources/face variables from global scope but as parameters

pull/1916/head
Martin Boonk 2022-03-02 21:39:10 +01:00
parent ec7125c7dd
commit 0bbf574613
2 changed files with 55 additions and 56 deletions

View File

@ -1,5 +1,5 @@
var face = require("Storage").readJSON("imageclock.face.json"); var watchface = require("Storage").readJSON("imageclock.face.json");
var resources = require("Storage").readJSON("imageclock.resources.json"); var watchfaceResources = require("Storage").readJSON("imageclock.resources.json");
var precompiledJs = require("Storage").read("imageclock.draw.js"); var precompiledJs = require("Storage").read("imageclock.draw.js");
var performanceLog = {}; var performanceLog = {};
@ -88,7 +88,7 @@ function splitNumberToDigits(num){
return String(num).split('').map(item => Number(item)); return String(num).split('').map(item => Number(item));
} }
function drawNumber(element, offset){ function drawNumber(resources, element, offset){
startPerfLog("drawNumber"); startPerfLog("drawNumber");
var number = numbers[element.Value](); var number = numbers[element.Value]();
var spacing = element.Spacing ? element.Spacing : 0; var spacing = element.Spacing ? element.Spacing : 0;
@ -175,9 +175,9 @@ function drawNumber(element, offset){
if (isNegative && minusImage){ if (isNegative && minusImage){
//print("Draw minus at", currentX); //print("Draw minus at", currentX);
if (imageIndexMinus){ if (imageIndexMinus){
drawElement({X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "" + (0 + imageIndexMinus)); drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "" + (0 + imageIndexMinus));
} else { } else {
drawElement({X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "minus"); drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "minus");
} }
currentX += minusImage.width + spacing; currentX += minusImage.width + spacing;
} }
@ -190,14 +190,14 @@ function drawNumber(element, offset){
currentDigit = 0; currentDigit = 0;
} }
//print("Digit " + currentDigit + " " + currentX); //print("Digit " + currentDigit + " " + currentX);
drawElement({X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, currentDigit + imageIndex); drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, currentDigit + imageIndex);
currentX += firstImage.width + spacing; currentX += firstImage.width + spacing;
} }
if (imageIndexUnit){ if (imageIndexUnit){
//print("Draw unit at", currentX); //print("Draw unit at", currentX);
drawElement({X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "" + (0 + imageIndexUnit)); drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, "" + (0 + imageIndexUnit));
} else if (element.Unit){ } else if (element.Unit){
drawElement({X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, getMultistate(element.Unit,"unknown")); drawElement(resources, {X:currentX,Y:firstDigitY}, numberOffset, element.ImagePath, getMultistate(element.Unit,"unknown"));
} }
element.lastDrawnValue = number; element.lastDrawnValue = number;
@ -209,7 +209,7 @@ function setColors(properties){
if (properties.bg) g.setBgColor(properties.bg); if (properties.bg) g.setBgColor(properties.bg);
} }
function drawElement(pos, offset, path, lastElem){ function drawElement(resources, pos, offset, path, lastElem){
startPerfLog("drawElement"); startPerfLog("drawElement");
//print("drawElement ",pos, offset, path, lastElem); //print("drawElement ",pos, offset, path, lastElem);
//print("drawElement offset", offset, pos.X, pos.Y); //print("drawElement offset", offset, pos.X, pos.Y);
@ -260,7 +260,7 @@ function getMultistate(name, defaultValue){
return undefined; return undefined;
} }
function drawScale(scale, offset){ function drawScale(resources, scale, offset){
startPerfLog("drawScale"); startPerfLog("drawScale");
//print("drawScale", scale, offset); //print("drawScale", scale, offset);
var segments = scale.Segments; var segments = scale.Segments;
@ -275,35 +275,35 @@ function drawScale(scale, offset){
var segmentsToDraw = Math.ceil(value * segments.length); var segmentsToDraw = Math.ceil(value * segments.length);
for (var i = 0; i < segmentsToDraw; i++){ for (var i = 0; i < segmentsToDraw; i++){
drawElement(segments[i], scaleOffset, scale.ImagePath, imageIndex + i); drawElement(resources, segments[i], scaleOffset, scale.ImagePath, imageIndex + i);
} }
scale.lastDrawnValue = segmentsToDraw; scale.lastDrawnValue = segmentsToDraw;
endPerfLog("drawScale"); endPerfLog("drawScale");
} }
function drawDigit(element, offset, digit){ function drawDigit(resources, element, offset, digit){
drawElement(element, offset, element.ImagePath, digit); drawElement(resources, element, offset, element.ImagePath, digit);
} }
function drawImage(image, offset, name){ function drawImage(resources, image, offset, name){
startPerfLog("drawImage"); startPerfLog("drawImage");
var imageOffset = updateColors(image, offset); var imageOffset = updateColors(image, offset);
//print("drawImage", image, offset, name); //print("drawImage", image, offset, name);
if (image.Value && image.Steps){ if (image.Value && image.Steps){
var steps = Math.floor(scaledown(image.Value, image.MinValue, image.MaxValue) * (image.Steps - 1)); var steps = Math.floor(scaledown(image.Value, image.MinValue, image.MaxValue) * (image.Steps - 1));
//print("Step", steps, "of", image.Steps); //print("Step", steps, "of", image.Steps);
drawElement(image, imageOffset, image.ImagePath, "" + steps); drawElement(resources, image, imageOffset, image.ImagePath, "" + steps);
} else if (image.ImageIndex !== undefined) { } else if (image.ImageIndex !== undefined) {
drawElement(image, imageOffset, image.ImagePath, image.ImageIndex); drawElement(resources, image, imageOffset, image.ImagePath, image.ImageIndex);
} else { } else {
drawElement(image, imageOffset, image.ImagePath, name ? "" + name: undefined); drawElement(resources, image, imageOffset, image.ImagePath, name ? "" + name: undefined);
} }
endPerfLog("drawImage"); endPerfLog("drawImage");
} }
function drawCodedImage(image, offset){ function drawCodedImage(resources, image, offset){
startPerfLog("drawCodedImage"); startPerfLog("drawCodedImage");
var code = getValue(image.Value); var code = getValue(image.Value);
//print("drawCodedImage", image, offset, code); //print("drawCodedImage", image, offset, code);
@ -321,10 +321,10 @@ function drawCodedImage(image, offset){
} }
if (code / factor > 1){ if (code / factor > 1){
//print("found match"); //print("found match");
drawImage(image, offset, currentCode); drawImage(resources, image, offset, currentCode);
} else { } else {
//print("fallback"); //print("fallback");
drawImage(image, offset, "fallback"); drawImage(resources, image, offset, "fallback");
} }
} }
image.lastDrawnValue = code; image.lastDrawnValue = code;
@ -398,7 +398,7 @@ function radians(rotation){
return value; return value;
} }
function drawPoly(element, offset){ function drawPoly(resources, element, offset){
startPerfLog("drawPoly"); startPerfLog("drawPoly");
var vertices = []; var vertices = [];
var primitiveOffset = offset.clone(); var primitiveOffset = offset.clone();
@ -433,7 +433,7 @@ function drawPoly(element, offset){
g.drawPoly(vertices,true); g.drawPoly(vertices,true);
endPerfLog("drawPoly_g.drawPoly"); endPerfLog("drawPoly_g.drawPoly");
startPerfLog("drawPoly"); endPerfLog("drawPoly");
} }
var numbers = {}; var numbers = {};
@ -487,17 +487,17 @@ multistates.WeatherTemperatureNegative = () => { return getWeatherTemperature().
multistates.WeatherTemperatureUnit = () => { return getWeatherTemperature().unit; }; multistates.WeatherTemperatureUnit = () => { return getWeatherTemperature().unit; };
multistates.StepsGoal = () => { return (numbers.Steps() >= stepsgoal) ? "on": "off"; }; multistates.StepsGoal = () => { return (numbers.Steps() >= stepsgoal) ? "on": "off"; };
function drawMultiState(element, offset){ function drawMultiState(resources, element, offset){
startPerfLog("drawMultiState"); startPerfLog("drawMultiState");
//print("drawMultiState", element, offset); //print("drawMultiState", element, offset);
var value = multistates[element.Value](); var value = multistates[element.Value]();
//print("drawImage from drawMultiState", element, offset, value); //print("drawImage from drawMultiState", element, offset, value);
drawImage(element, offset, value); drawImage(resources, element, offset, value);
element.lastDrawnValue = value; element.lastDrawnValue = value;
endPerfLog("drawMultiState"); endPerfLog("drawMultiState");
} }
function drawIteratively(items){ function drawIteratively(resources, items){
//print("drawIteratively"); //print("drawIteratively");
startPerfLog("drawIteratively"); startPerfLog("drawIteratively");
for (var c of items){ for (var c of items){
@ -508,22 +508,22 @@ function drawIteratively(items){
} }
switch(c.type){ switch(c.type){
case "MultiState": case "MultiState":
drawMultiState(c.value, zeroOffset); drawMultiState(resources, c.value, zeroOffset);
break; break;
case "Image": case "Image":
drawImage(c.value, zeroOffset); drawImage(resources, c.value, zeroOffset);
break; break;
case "CodedImage": case "CodedImage":
drawCodedImage(c.value, zeroOffset); drawCodedImage(resources, c.value, zeroOffset);
break; break;
case "Number": case "Number":
drawNumber(c.value, zeroOffset); drawNumber(resources, c.value, zeroOffset);
break; break;
case "Poly": case "Poly":
drawPoly(c.value, zeroOffset); drawPoly(resources, c.value, zeroOffset);
break; break;
case "Scale": case "Scale":
drawScale(c.value, zeroOffset); drawScale(resources, c.value, zeroOffset);
break; break;
} }
endPerfLog("drawIteratively_handling_" + c.type); endPerfLog("drawIteratively_handling_" + c.type);
@ -531,10 +531,10 @@ function drawIteratively(items){
endPerfLog("drawIteratively"); endPerfLog("drawIteratively");
} }
function draw(root, path, offset){ function draw(resources, root, path, offset){
//print("draw", path); //print("draw", path);
startPerfLog("draw_"+ path.join("_")); startPerfLog("draw_"+ path.join("_"));
var element = getByPath(root, path); var element = getByPath(root, path);
var elementOffset = updateOffset(element, offset); var elementOffset = updateOffset(element, offset);
setColors(elementOffset); setColors(elementOffset);
@ -559,22 +559,22 @@ function draw(root, path, offset){
//print("Hiding", current); //print("Hiding", current);
break; break;
case "MultiState": case "MultiState":
drawMultiState(currentElement, elementOffset); drawMultiState(resources, currentElement, elementOffset);
break; break;
case "Image": case "Image":
drawImage(currentElement, elementOffset); drawImage(resources, currentElement, elementOffset);
break; break;
case "CodedImage": case "CodedImage":
drawCodedImage(currentElement, elementOffset); drawCodedImage(resources, currentElement, elementOffset);
break; break;
case "Number": case "Number":
drawNumber(currentElement, elementOffset); drawNumber(resources, currentElement, elementOffset);
break; break;
case "Poly": case "Poly":
drawPoly(currentElement, elementOffset); drawPoly(currentElement, elementOffset);
break; break;
case "Scale": case "Scale":
drawScale(currentElement, elementOffset); drawScale(resources, currentElement, elementOffset);
break; break;
default: default:
//print("Enter next level", elementOffset); //print("Enter next level", elementOffset);
@ -582,7 +582,7 @@ function draw(root, path, offset){
//print("Hiding", current); //print("Hiding", current);
continue; continue;
} }
draw(root, path.concat(current), elementOffset); draw(resources, root, path.concat(current), elementOffset);
//print("Done next level"); //print("Done next level");
} }
endPerfLog("draw_handling_"+ path.join("_")+"_"+current); endPerfLog("draw_handling_"+ path.join("_")+"_"+current);
@ -606,7 +606,7 @@ var zeroOffset={X:0,Y:0};
var requestedDraws = 0; var requestedDraws = 0;
var isDrawing = false; var isDrawing = false;
function initialDraw(){ function initialDraw(resources, face){
//print("Free memory", process.memory(false).free); //print("Free memory", process.memory(false).free);
requestedDraws++; requestedDraws++;
if (!isDrawing){ if (!isDrawing){
@ -625,10 +625,10 @@ function initialDraw(){
eval(precompiledJs); eval(precompiledJs);
} else if (face.Collapsed){ } else if (face.Collapsed){
//print("Collapsed"); //print("Collapsed");
drawIteratively(face.Collapsed); drawIteratively(resources, face.Collapsed);
} else { } else {
//print("Full"); //print("Full");
draw(face, [], zeroOffset); draw(resources, face, [], zeroOffset);
} }
endPerfLog("initialDraw"); endPerfLog("initialDraw");
//print(new Date().toISOString(), "Drawing done", (Date.now() - start).toFixed(0)); //print(new Date().toISOString(), "Drawing done", (Date.now() - start).toFixed(0));
@ -636,7 +636,7 @@ function initialDraw(){
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, 10); setTimeout(()=>{initialDraw(resources, face);}, 10);
} }
} else { } else {
print("queued draw"); print("queued draw");
@ -648,7 +648,7 @@ function handleHrm(e){
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(); initialDraw(watchfaceResources, watchface);
} }
} }
} }
@ -659,14 +659,14 @@ function handlePressure(e){
press = e.pressure; press = e.pressure;
if (!redrawEvents || redrawEvents.includes("pressure") && !Bangle.isLocked()){ if (!redrawEvents || redrawEvents.includes("pressure") && !Bangle.isLocked()){
//print("Redrawing on pressure"); //print("Redrawing on pressure");
initialDraw(); initialDraw(watchfaceResources, watchface);
} }
} }
function handleCharging(e){ function handleCharging(e){
if (!redrawEvents || redrawEvents.includes("charging") && !Bangle.isLocked()){ if (!redrawEvents || redrawEvents.includes("charging") && !Bangle.isLocked()){
//print("Redrawing on charging"); //print("Redrawing on charging");
initialDraw(); initialDraw(watchfaceResources, watchface);
} }
} }
@ -691,12 +691,11 @@ function setMatchedInterval(callable, time, intervalHandler){
var unlockedDrawInterval; var unlockedDrawInterval;
var lockedDrawInterval; var lockedDrawInterval;
var lockedRedraw = getByPath(face, ["Properties","Redraw","Locked"]) || 60000; var lockedRedraw = getByPath(watchface, ["Properties","Redraw","Locked"]) || 60000;
var unlockedRedraw = getByPath(face, ["Properties","Redraw","Unlocked"]) || 1000; var unlockedRedraw = getByPath(watchface, ["Properties","Redraw","Unlocked"]) || 1000;
var defaultRedraw = getByPath(face, ["Properties","Redraw","Default"]) || "Always"; var defaultRedraw = getByPath(watchface, ["Properties","Redraw","Default"]) || "Always";
var redrawEvents = getByPath(face, ["Properties","Redraw","Events"]); var redrawEvents = getByPath(watchface, ["Properties","Redraw","Events"]);
var cacheBuffers = getByPath(face, ["Properties","CacheBuffers"]) || false; var events = getByPath(watchface, ["Properties","Events"]);
var events = getByPath(face, ["Properties","Events"]);
var stepsgoal = 2000; var stepsgoal = 2000;
@ -707,14 +706,14 @@ function handleLock(isLocked, forceRedraw){
//print("isLocked", Bangle.isLocked()); //print("isLocked", Bangle.isLocked());
if (forceRedraw || !redrawEvents || redrawEvents.includes("lock")){ if (forceRedraw || !redrawEvents || redrawEvents.includes("lock")){
//print("Redrawing on lock", isLocked); //print("Redrawing on lock", isLocked);
initialDraw(); initialDraw(watchfaceResources, watchface);
} }
if (lockedDrawInterval) clearInterval(lockedDrawInterval); if (lockedDrawInterval) clearInterval(lockedDrawInterval);
if (unlockedDrawInterval) clearInterval(unlockedDrawInterval); if (unlockedDrawInterval) clearInterval(unlockedDrawInterval);
if (!isLocked){ if (!isLocked){
setMatchedInterval(()=>{ setMatchedInterval(()=>{
//print("Redrawing on unlocked interval"); //print("Redrawing on unlocked interval");
initialDraw(); initialDraw(watchfaceResources, watchface);
},unlockedRedraw, (v)=>{ },unlockedRedraw, (v)=>{
unlockedDrawInterval = v; unlockedDrawInterval = v;
}); });
@ -723,7 +722,7 @@ function handleLock(isLocked, forceRedraw){
} else { } else {
setMatchedInterval(()=>{ setMatchedInterval(()=>{
//print("Redrawing on locked interval"); //print("Redrawing on locked interval");
initialDraw(); initialDraw(watchfaceResources, watchface);
},lockedRedraw, (v)=>{ },lockedRedraw, (v)=>{
lockedDrawInterval = v; lockedDrawInterval = v;
}); });

View File

@ -569,7 +569,7 @@
condition = 'if (!Bangle.isLocked())'; condition = 'if (!Bangle.isLocked())';
} }
code += condition + " draw" + c.type + "(face.Collapsed[" + i + "].value, zeroOffset);\n"; code += condition + " draw" + c.type + "(watchfaceResources, watchface.Collapsed[" + i + "].value, {X:0,Y:0});\n";
} }
console.log("Code:", code); console.log("Code:", code);
return code return code