Skip to content

Commit ff7777a

Browse files
authored
Merge pull request #2305 from halemmerich/imageclock
Imageclock - Better widgets and performance
2 parents 11f63df + 22bf24f commit ff7777a

File tree

4 files changed

+101
-110
lines changed

4 files changed

+101
-110
lines changed

apps/imageclock/ChangeLog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@
1616
Fix colorsetting in promises in generated code
1717
Some performance improvements by caching lookups
1818
Activate UI after first draw is complete to prevent drawing over launcher
19+
0.13: Use widget_utils swipeOn()
20+
Allows minification by combining all but picture data into one file

apps/imageclock/app.js

Lines changed: 48 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
let unlockedDrawInterval = [];
2-
let lockedDrawInterval = [];
3-
let showWidgets = false;
4-
let firstDraw = true;
1+
let s = {};
2+
// unlocked draw intervals
3+
s.udi = [];
4+
// locked draw intervals
5+
s.ldi = [];
6+
// full draw
7+
s.fd = true;
8+
// performance log
9+
s.pl = {};
510

611
{
712
let x = g.getWidth()/2;
@@ -21,12 +26,10 @@ let firstDraw = true;
2126
let precompiledJs = eval(require("Storage").read("imageclock.draw.js"));
2227
let settings = require('Storage').readJSON("imageclock.json", true) || {};
2328

24-
let performanceLog = {};
25-
2629
let startPerfLog = () => {};
2730
let endPerfLog = () => {};
2831
Bangle.printPerfLog = () => {print("Deactivated");};
29-
Bangle.resetPerfLog = () => {performanceLog = {};};
32+
Bangle.resetPerfLog = () => {s.pl = {};};
3033

3134
let colormap={
3235
"#000":0,
@@ -64,35 +67,37 @@ let firstDraw = true;
6467
if (settings.perflog){
6568
startPerfLog = function(name){
6669
let time = getTime();
67-
if (!performanceLog.start) performanceLog.start={};
68-
performanceLog.start[name] = time;
70+
if (!s.pl.start) s.pl.start={};
71+
s.pl.start[name] = time;
6972
};
70-
endPerfLog = function (name){
73+
endPerfLog = function (name, once){
7174
let time = getTime();
72-
if (!performanceLog.last) performanceLog.last={};
73-
let duration = time - performanceLog.start[name];
74-
performanceLog.last[name] = duration;
75-
if (!performanceLog.cum) performanceLog.cum={};
76-
if (!performanceLog.cum[name]) performanceLog.cum[name] = 0;
77-
performanceLog.cum[name] += duration;
78-
if (!performanceLog.count) performanceLog.count={};
79-
if (!performanceLog.count[name]) performanceLog.count[name] = 0;
80-
performanceLog.count[name]++;
75+
if (!s.pl.start[name]) return;
76+
if (!s.pl.last) s.pl.last={};
77+
let duration = time - s.pl.start[name];
78+
s.pl.last[name] = duration;
79+
if (!s.pl.cum) s.pl.cum={};
80+
if (!s.pl.cum[name]) s.pl.cum[name] = 0;
81+
s.pl.cum[name] += duration;
82+
if (!s.pl.count) s.pl.count={};
83+
if (!s.pl.count[name]) s.pl.count[name] = 0;
84+
s.pl.count[name]++;
85+
if (once){s.pl.start[name] = undefined}
8186
};
8287

8388
Bangle.printPerfLog = function(){
8489
let result = "";
8590
let keys = [];
86-
for (let c in performanceLog.cum){
91+
for (let c in s.pl.cum){
8792
keys.push(c);
8893
}
8994
keys.sort();
9095
for (let k of keys){
91-
print(k, "last:", (performanceLog.last[k] * 1000).toFixed(0), "average:", (performanceLog.cum[k]/performanceLog.count[k]*1000).toFixed(0), "count:", performanceLog.count[k], "total:", (performanceLog.cum[k] * 1000).toFixed(0));
96+
print(k, "last:", (s.pl.last[k] * 1000).toFixed(0), "average:", (s.pl.cum[k]/s.pl.count[k]*1000).toFixed(0), "count:", s.pl.count[k], "total:", (s.pl.cum[k] * 1000).toFixed(0));
9297
}
9398
};
9499
}
95-
100+
startPerfLog("fullDraw");
96101
startPerfLog("loadFunctions");
97102

98103
let delayTimeouts = {};
@@ -609,15 +614,22 @@ let firstDraw = true;
609614

610615
promise.then(()=>{
611616
let currentDrawingTime = Date.now();
612-
if (showWidgets){
613-
restoreWidgetDraw();
614-
}
615617
lastDrawTime = Date.now() - start;
616618
isDrawing=false;
617-
firstDraw=false;
619+
s.fd=false;
618620
requestRefresh = false;
619621
endPerfLog("initialDraw");
620-
if (!Bangle.uiRemove) setUi();
622+
endPerfLog("fullDraw", true);
623+
624+
if (!Bangle.uiRemove){
625+
setUi();
626+
let orig = Bangle.drawWidgets;
627+
Bangle.drawWidgets = ()=>{};
628+
Bangle.loadWidgets();
629+
Bangle.drawWidgets = orig;
630+
require("widget_utils").swipeOn();
631+
Bangle.drawWidgets();
632+
}
621633
}).catch((e)=>{
622634
print("Error during drawing", e);
623635
});
@@ -701,16 +713,16 @@ let firstDraw = true;
701713

702714
let handleLock = function(isLocked, forceRedraw){
703715
//print("isLocked", Bangle.isLocked());
704-
for (let i of unlockedDrawInterval){
716+
for (let i of s.udi){
705717
//print("Clearing unlocked", i);
706718
clearInterval(i);
707719
}
708-
for (let i of lockedDrawInterval){
720+
for (let i of s.ldi){
709721
//print("Clearing locked", i);
710722
clearInterval(i);
711723
}
712-
unlockedDrawInterval = [];
713-
lockedDrawInterval = [];
724+
s.udi = [];
725+
s.ldi = [];
714726

715727
if (!isLocked){
716728
if (forceRedraw || !redrawEvents || (redrawEvents.includes("unlock"))){
@@ -726,7 +738,7 @@ let firstDraw = true;
726738
initialDraw(watchfaceResources, watchface);
727739
},unlockedRedraw, (v)=>{
728740
//print("New matched unlocked interval", v);
729-
unlockedDrawInterval.push(v);
741+
s.udi.push(v);
730742
}, lastDrawTime);
731743
if (!events || events.includes("HRM")) Bangle.setHRMPower(1, "imageclock");
732744
if (!events || events.includes("pressure")) Bangle.setBarometerPower(1, 'imageclock');
@@ -744,43 +756,13 @@ let firstDraw = true;
744756
initialDraw(watchfaceResources, watchface);
745757
},lockedRedraw, (v)=>{
746758
//print("New matched locked interval", v);
747-
lockedDrawInterval.push(v);
759+
s.ldi.push(v);
748760
}, lastDrawTime);
749761
Bangle.setHRMPower(0, "imageclock");
750762
Bangle.setBarometerPower(0, 'imageclock');
751763
}
752764
};
753765

754-
755-
let showWidgetsChanged = false;
756-
757-
let restoreWidgetDraw = function(){
758-
require("widget_utils").show();
759-
Bangle.drawWidgets();
760-
};
761-
762-
let handleSwipe = function(lr, ud){
763-
if (!showWidgets && ud == 1){
764-
//print("Enable widgets");
765-
restoreWidgetDraw();
766-
showWidgetsChanged = true;
767-
}
768-
if (showWidgets && ud == -1){
769-
//print("Disable widgets");
770-
clearWidgetsDraw();
771-
firstDraw = true;
772-
showWidgetsChanged = true;
773-
}
774-
if (showWidgetsChanged){
775-
showWidgetsChanged = false;
776-
//print("Draw after widget change");
777-
showWidgets = ud == 1;
778-
initialDraw();
779-
}
780-
};
781-
782-
Bangle.on('swipe', handleSwipe);
783-
784766
if (!events || events.includes("pressure")){
785767
Bangle.on('pressure', handlePressure);
786768
try{
@@ -799,14 +781,6 @@ let firstDraw = true;
799781
if (!events || events.includes("charging")) {
800782
Bangle.on('charging', handleCharging);
801783
}
802-
803-
let originalWidgetDraw = {};
804-
let originalWidgetArea = {};
805-
806-
let clearWidgetsDraw = function(){
807-
//print("Clear widget draw calls");
808-
require("widget_utils").hide();
809-
}
810784

811785
handleLock(Bangle.isLocked(), true);
812786

@@ -819,7 +793,6 @@ let firstDraw = true;
819793
Bangle.setHRMPower(0, "imageclock");
820794
Bangle.setBarometerPower(0, 'imageclock');
821795

822-
Bangle.removeListener('swipe', handleSwipe);
823796
Bangle.removeListener('lock', handleLock);
824797
Bangle.removeListener('charging', handleCharging);
825798
Bangle.removeListener('HRM', handleHrm);
@@ -829,31 +802,22 @@ let firstDraw = true;
829802
if (initialDrawTimeoutUnlocked) clearTimeout(initialDrawTimeoutUnlocked);
830803
if (initialDrawTimeoutLocked) clearTimeout(initialDrawTimeoutLocked);
831804

832-
for (let i of global.unlockedDrawInterval){
805+
for (let i of global.s.udi){
833806
//print("Clearing unlocked", i);
834807
clearInterval(i);
835808
}
836-
delete global.unlockedDrawInterval;
837-
for (let i of global.lockedDrawInterval){
809+
for (let i of global.s.ldi){
838810
//print("Clearing locked", i);
839811
clearInterval(i);
840812
}
841-
delete global.lockedDrawInterval;
842-
delete global.showWidgets;
843-
delete global.firstDraw;
844813

845814
delete Bangle.printPerfLog;
846815
if (settings.perflog){
847816
delete Bangle.resetPerfLog;
848-
delete performanceLog;
849817
}
850-
851818
cleanupDelays();
852-
restoreWidgetDraw();
819+
require("widget_utils").show();
853820
}
854821
});
855822
}
856-
857-
Bangle.loadWidgets();
858-
clearWidgetsDraw();
859823
}

0 commit comments

Comments
 (0)