2022-04-03 11:47:33 +00:00
|
|
|
/*
|
|
|
|
* Includes
|
|
|
|
*/
|
2022-03-25 16:22:39 +00:00
|
|
|
const locale = require('locale');
|
2022-03-27 09:26:22 +00:00
|
|
|
const storage = require('Storage');
|
|
|
|
|
2022-04-03 11:47:33 +00:00
|
|
|
/*
|
|
|
|
* Statics
|
|
|
|
*/
|
|
|
|
const SETTINGS_FILE = "bwclk.setting.json";
|
|
|
|
const TIMER_IDX = "bwclk";
|
|
|
|
const W = g.getWidth();
|
|
|
|
const H = g.getHeight();
|
2022-03-27 09:26:22 +00:00
|
|
|
|
|
|
|
/*
|
2022-04-03 11:47:33 +00:00
|
|
|
* Settings
|
2022-03-27 09:26:22 +00:00
|
|
|
*/
|
|
|
|
let settings = {
|
2022-03-27 09:29:37 +00:00
|
|
|
fullscreen: false,
|
2022-03-27 09:26:22 +00:00
|
|
|
showLock: true,
|
2022-05-20 05:47:35 +00:00
|
|
|
hideColon: false,
|
2022-04-02 14:54:16 +00:00
|
|
|
showInfo: 0,
|
2022-03-27 09:26:22 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings;
|
|
|
|
for (const key in saved_settings) {
|
|
|
|
settings[key] = saved_settings[key]
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Assets
|
|
|
|
*/
|
2022-03-25 16:22:39 +00:00
|
|
|
|
2022-03-25 16:57:19 +00:00
|
|
|
// Manrope font
|
|
|
|
Graphics.prototype.setLargeFont = function(scale) {
|
2022-05-19 18:21:24 +00:00
|
|
|
// Actual height 48 (49 - 2)
|
|
|
|
this.setFontCustom(
|
|
|
|
E.toString(require('heatshrink').decompress(atob('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'))),
|
|
|
|
46,
|
|
|
|
atob("EhooGyUkJiUnISYnFQ=="),
|
|
|
|
63+(scale<<8)+(1<<16)
|
|
|
|
);
|
2022-04-02 14:19:47 +00:00
|
|
|
return this;
|
|
|
|
};
|
|
|
|
|
2022-05-20 11:13:54 +00:00
|
|
|
Graphics.prototype.setXLargeFont = function(scale) {
|
|
|
|
// Actual height 53 (55 - 3)
|
|
|
|
this.setFontCustom(
|
|
|
|
E.toString(require('heatshrink').decompress(atob('AHM/8AIG/+AA4sD/wQGh/4EWQA/AC8YA40HNA0BRY8/RY0P/6LFgf//4iFA4IiFj4HBEQkHCAQiDHIIZGv4HCFQY5BDAo5CAAIpDDAfACA3wLYv//hsFKYxcCMgoiBOooiBQwwiBS40AHIgA/ACS/DLYjYCBAjQEBAYQDBAgHDUAbyDZQi3CegoHEVQQZFagUfW4Y0DaAgECaIJSEFYMPbIYNDv5ACGAIrBCgJ1EFYILCAAQWCj4zDGgILCegcDEQRNDHIIiCHgZ2BEQShFIqUDFYidCh5ODg4NCn40DAgd/AYR5BDILZEAAIMDAAYVCh7aHdYhKDbQg4Dv7rGBAihFCAwIDCAgA/AB3/eoa7GAAk/dgbVGDJrvCDK67DDIjaGdYpbCdYonCcQjjDEVUBEQ4A/AEMcAYV/NAUHcYUDawd/cYUPRYSmBBgaLBToP8BgYiBSgIiCj4iCg//EQSuDW4IMDVwYiCBgIiBBgrRDCATeBaIYqCv70DCgT4CEQMfIgQZBBoRnDv/3EQIvBDIffEQMHFwReBRYUfOgX/+IiDKIeHEQRRECwUHKwIuB8AiDIoJEBCwZFCv/4HIZaBIgPAEQS2CUYQiCD4SABEQcfOwIZBEQaHBO4RcEAAI/BEQQgBSIQiDTIRZBEQZuBVYQiDHoKWCEQQICFQIiDBAQeCEQQA/AANwA40BLIJ5BO4JWCBAUPAYR5En7RBUIQECN4SYCQQIiEh6CCEQk/BoQiBgYeCBoTrCAgT0CCgIfCFYQiBg4IBGgIiDj6rBg4rCBYLRDFYIiBbYIfBLgQiBIQYiD4JCCLgf/bQIWDBYV/EQV/BYXz/5FBgIiD5//IowZBD4M/NAX/BIPgDIJoC//5GgKUDn//4f/8KLE/wTBAAI8BEQPwj4HBVwYmBDgIZDN4QZCGYKJCHQP/JoSgCBATrCh5dBKITVDG4gICAAbvDAH5SCL4QADK4J5CCAiTCCAp1BCAqCDCAgiGCAIiFCAQiFeoIiFg6/FCAgiECAXnEQgQB/kfEQYQC4F/EQYQCgIiDfoIQBg4iDCAUAEQZUCcgIiDDIIQBEQhuBBoIiENoYiFDwQiECAQiFwEBPQQNCAQKDDEYMDDoMfRh4iGUwqvEESBiBaQ5oEbgr0FNAo+EEIwA+oAHGgJoFRAMHe4L0CAALNBBAT0BfwScDCAXweAL0DWgUPQYQiDwF/QYQiC/zTB+C0FBAL0CEQYIBGgMPCgIxBg4rCJIKsCh5IBBwTPCj4WBgYLBZ4V/MAIiBBQQrBEQYtCBYQiCO4QLFCwgiDIQIiGIoMHEQpFBn5FFD4JoENwRoGDgSUCAoKfBw//DgIiCT4auCFwN/T4RRET4TaCEQKoCDIQiCGgK/DAAQICdYQACHoIqCBAoQFEwIhFAH4AFQIROEj4IGXwIIGNwIACbgIhEBAiRCVwoqDTogHEW4QZFXgIZB/z9Cv49CF4MPBwI0Ca4LlB8ATCJoP4AoINDfQPAg7PBg4cBBwUfD4MfFYILCCwgOCf4QLEwEPCwILCgJaBn4WBBYQxCIQQiD+EDCYI5CBYRQBIo4fBMQIuBC4N/NAv8AoIcBSgU/FYIIBZIYrCW4hOCXIQZCgYUBv7jEh4uBZAscewZ8CgEgUYT0EEoQIBA4gICFQQIEHYQA+KQzdDAArdCAArpCEScHaIQiEvwiGe4QiFUwQiEbgIiFYIL0DEQTkBEQrJEEQc/cYYiCg4HBDIQiCfoRoEHQLaDEQQHBbQYiBCAT8Dn/BCAoXBJYP/OgZKC/6OEEARLCEQZLEEQZLEEQjKFEQI6EEQZLDEQbsGEQLjGYYYA/JIxzEg/AfgJSDAoPgfgiDC8COFAoPnaQj6CAAR+CW4TCFA4i6CDIqhCDIfwHoYHCYIN/GgKuBJ4JDBFYUf/C5CBYIZBv/Ag4ZBg4rBBYQTBAQIcBg4FBn5UBAQUfFwIfCEQeAgYfBAQUBFAKbCAQQiCGwIiE+A2BwBFNwE/AoM/EQJoIWwKCCh4cBFYKUERYV/W46uHFYIZGaJA0B/glBGYT0JIITiEMIJvCFQQAEHYQA/ABBlEOIhdGQAIRFSgQIBgQICn4IB8EAjiBCUYglCbQYeBEoQZCTwM/CYIZD/gEBUwIzBJ4UHYAU/EwIrBh4rCAoIXCn4rBCgUDAQN/FYMfBYIXBCYJnCBYXggf8HgQLCwEPEQQuBgJOECwILDCwgiLHIUHBYJFGD4IxBgYWCn4rBBwJoFDIYNBCgPADgKHBRYfDBQN/GAIrBToTLDVwYACDILiCWAb8DAAYzBYAjTCAAI9BAARNCBAoqCBAgQDFgbYCAH4AufgQACf4T8CAAT/CfgQACBwITCAAYOBCYQioh4iEAHQA=='))),
|
|
|
|
46,
|
|
|
|
atob("FR4uHyopKyksJSssGA=="),
|
|
|
|
70+(scale<<8)+(1<<16)
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2022-04-02 14:19:47 +00:00
|
|
|
Graphics.prototype.setMediumFont = function(scale) {
|
2022-03-25 16:57:19 +00:00
|
|
|
// Actual height 41 (42 - 2)
|
|
|
|
this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAB/AAAAAAAP/AAAAAAD//AAAAAA///AAAAAP///AAAAB///8AAAAf///AAAAH///wAAAB///+AAAAH///gAAAAH//4AAAAAH/+AAAAAAH/wAAAAAAH8AAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAH////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gAAH+AAD+AAAD/AAH8AAAB/AAH4AAAA/gAH4AAAAfgAH4AAAAfgAPwAAAAfgAPwAAAAfgAPwAAAAfgAHwAAAAfgAH4AAAAfgAH4AAAA/gAH8AAAA/AAD+AAAD/AAD/gAAH/AAB/////+AAB/////8AAA/////4AAAf////wAAAH////gAAAB///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAfwAAAAAAA/gAAAAAAA/AAAAAAAB/AAAAAAAD+AAAAAAAD8AAAAAAAH8AAAAAAAH//////AAH//////AAH//////AAH//////AAH//////AAH//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAA/AAAP4AAB/AAAf4AAD/AAA/4AAD/AAB/4AAH/AAD/4AAP/AAH/AAAf/AAH8AAA//AAH4AAB//AAP4AAD//AAPwAAH+/AAPwAAP8/AAPwAAf4/AAPwAA/4/AAPwAA/w/AAPwAB/g/AAPwAD/A/AAP4AH+A/AAH8AP8A/AAH/A/4A/AAD///wA/AAD///gA/AAB///AA/AAA//+AA/AAAP/8AA/AAAD/wAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAH4AAAHwAAH4AAAH4AAH4AAAH8AAH4AAAP+AAH4AAAH+AAH4A4AB/AAH4A+AA/AAH4B/AA/gAH4D/AAfgAH4H+AAfgAH4P+AAfgAH4f+AAfgAH4/+AAfgAH5/+AAfgAH5//AAfgAH7+/AA/gAH/8/gB/AAH/4f4H/AAH/wf//+AAH/gP//8AAH/AH//8AAH+AD//wAAH8AB//gAAD4AAf+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAD/AAAAAAAP/AAAAAAB//AAAAAAH//AAAAAAf//AAAAAB///AAAAAH///AAAAAf/8/AAAAB//w/AAAAH/+A/AAAA//4A/AAAD//gA/AAAH/+AA/AAAH/4AA/AAAH/gAA/AAAH+AAA/AAAHwAAA/AAAHAAf///AAEAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAf///AAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAP/AHgAAH///AP4AAH///gP8AAH///gP8AAH///gP+AAH///gD/AAH/A/AB/AAH4A/AA/gAH4A+AAfgAH4B+AAfgAH4B+AAfgAH4B8AAfgAH4B8AAfgAH4B+AAfgAH4B+AAfgAH4B+AA/gAH4B/AA/AAH4A/gD/AAH4A/4H+AAH4Af//+AAH4AP//8AAH4AP//4AAHwAD//wAAAAAB//AAAAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAAAD////AAAAP////wAAAf////4AAA/////8AAB/////+AAD/gP4H+AAD/AfgD/AAH8A/AB/AAH8A/AA/gAH4B+AAfgAH4B+AAfgAPwB8AAfgAPwB8AAfgAPwB+AAfgAPwB+AAfgAH4B+AAfgAH4B/AA/gAH8B/AB/AAH+A/wD/AAD+A/8P+AAB8Af//+AAB4AP//8AAAwAH//4AAAAAD//gAAAAAA//AAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAAAAPwAAAAHAAPwAAAA/AAPwAAAD/AAPwAAAf/AAPwAAB//AAPwAAP//AAPwAA//8AAPwAH//wAAPwAf/+AAAPwB//4AAAPwP//AAAAPw//8AAAAP3//gAAAAP//+AAAAAP//wAAAAAP//AAAAAAP/4AAAAAAP/gAAAAAAP+AAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAAH+A//gAAAf/h//4AAA//z//8AAB/////+AAD/////+AAD///+H/AAH+H/4B/AAH8B/wA/gAH4A/gAfgAH4A/gAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAPwA/AAfgAH4A/gAfgAH4A/gAfgAH8B/wA/gAH/H/4B/AAD///+H/AAD/////+AAB/////+AAA//z//8AAAf/h//4AAAH+A//gAAAAAAH+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD/8AAAAAAP/+AAAAAAf//AAcAAA///gA8AAB///wB+AAD/x/4B/AAD+AP4B/AAH8AH8A/gAH4AH8A/gAH4AD8AfgAP4AD8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAPwAB8AfgAH4AD8AfgAH4AD4A/gAH8AH4B/AAD+APwD/AAD/g/wP+AAB/////+AAA/////8AAAf////4AAAP////wAAAH////AAAAA///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAD8APwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DxcjFyAfISAiHCAiEg=="), 54+(scale<<8)+(1<<16));
|
|
|
|
return this;
|
|
|
|
};
|
|
|
|
|
|
|
|
Graphics.prototype.setSmallFont = function(scale) {
|
|
|
|
// Actual height 28 (27 - 0)
|
2022-06-27 15:41:43 +00:00
|
|
|
this.setFontCustom(
|
|
|
|
E.toString(require('heatshrink').decompress(atob('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
|
|
|
|
32,
|
|
|
|
atob("BgkMGhEZEgYMDAwQCAwICxILEBAREBEOEREJCREVEQ8ZEhEUExAOFBQHDREPGBMUERQSEhEUERsREBIMCwwTEg4QERAREQoREQcHDgcYEREREQoPDBEPFg8PDwwIDBMcCgoAAAAAAAAAAAAAACERESEAAAAAAAAAAAAAAAAhIQAGCRAQEhAIDw8XCQ8RABIODRELCw4REwcLCQoPHBscDxISEhISEhoUEBAQEAcHBwcTExQUFBQUDhQUFBQUEBEREBAQEBAQGhARERERBwcHBxAREREREREPEREREREPEQ8="),
|
|
|
|
28+(scale<<8)+(1<<16)
|
|
|
|
);
|
2022-03-25 16:57:19 +00:00
|
|
|
return this;
|
|
|
|
};
|
|
|
|
|
2022-03-27 09:26:22 +00:00
|
|
|
var imgLock = {
|
|
|
|
width : 16, height : 16, bpp : 1,
|
|
|
|
transparent : 0,
|
|
|
|
buffer : E.toArrayBuffer(atob("A8AH4A5wDDAYGBgYP/w//D/8Pnw+fD58Pnw//D/8P/w="))
|
|
|
|
};
|
|
|
|
|
2022-04-03 11:47:33 +00:00
|
|
|
var imgSteps = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/H///wv4CBn4CD8ACCj4IBj8f+Eeh/wjgCBngCCg/4nEH//4h/+jEP/gRBAQX+jkf/wgB//8GwP4FoICDHgICCBwIA=="))
|
|
|
|
};
|
|
|
|
|
|
|
|
var imgBattery = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/4AN4EAg4TBgd///9oEAAQv8ARQRDDQQgCEwQ4OA"))
|
|
|
|
};
|
|
|
|
|
|
|
|
var imgBpm = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/4AOn4CD/wCCjgCCv/8jF/wGYgOA5MB//BC4PDAQnjAQPnAQgANA"))
|
|
|
|
};
|
|
|
|
|
|
|
|
var imgTemperature = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("//D///wICBjACBngCNkgCP/0kv/+s1//nDn/8wICEBAIOC/08v//IYJECA=="))
|
|
|
|
};
|
|
|
|
|
|
|
|
var imgWind = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/0f//8h///Pn//zAQXzwf/88B//mvGAh18gEevn/DIICB/PwgEBAQMHBAIADFwM/wEAGAP/54CD84CE+eP//wIQU/A=="))
|
|
|
|
};
|
|
|
|
|
|
|
|
var imgTimer = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/+B/4CD84CEBAPygFP+F+h/x/+P+fz5/n+HnAQNn5/wuYCBmYCC5kAAQfOgFz80As/ngHn+fD54mC/F+j/+gF/HAQA=="))
|
|
|
|
};
|
2022-03-25 16:22:39 +00:00
|
|
|
|
2022-04-03 13:33:54 +00:00
|
|
|
var imgCharging = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("//+v///k///4AQPwBANgBoMxBoMb/P+h/w/kH8H4gfB+EBwfggHH4EAt4CBn4CBj4CBh4FCCIO/8EB//Agf/wEH/8Gh//x////fAQIA="))
|
|
|
|
};
|
|
|
|
|
2022-04-16 16:47:57 +00:00
|
|
|
var imgWatch = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
|
|
|
transparent : 1,
|
|
|
|
buffer : require("heatshrink").decompress(atob("/8B//+ARANB/l4//5/1/+f/n/n5+fAQnf9/P44CC8/n7/n+YOB/+fDQQgCEwQsCHBBEC"))
|
|
|
|
};
|
2022-04-03 13:33:54 +00:00
|
|
|
|
2022-04-03 11:47:33 +00:00
|
|
|
|
|
|
|
/*
|
2022-04-17 07:43:44 +00:00
|
|
|
* INFO ENTRIES
|
2022-06-27 15:41:43 +00:00
|
|
|
* List of [Data, Icon, left/right, HomeAssistant Trigger]
|
2022-04-03 11:47:33 +00:00
|
|
|
*/
|
2022-04-17 07:43:44 +00:00
|
|
|
var infoArray = [
|
2022-06-27 15:41:43 +00:00
|
|
|
function(){ return [ null, null, "left", null ] },
|
|
|
|
function(){ return [ "Bangle", imgWatch, "right", null ] },
|
|
|
|
function(){ return [ E.getBattery() + "%", imgBattery, "left", null ] },
|
|
|
|
function(){ return [ getSteps(), imgSteps, "left", null ] },
|
|
|
|
function(){ return [ Math.round(Bangle.getHealthStatus("last").bpm) + " bpm", imgBpm, "left", null] },
|
|
|
|
function(){ return [ getWeather().temp, imgTemperature, "left", null ] },
|
|
|
|
function(){ return [ getWeather().wind, imgWind, "left", null ] },
|
2022-04-17 07:43:44 +00:00
|
|
|
];
|
2022-06-27 15:41:43 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* We append the HomeAssistant integrations if HomeAssistant is available
|
|
|
|
*/
|
|
|
|
try{
|
|
|
|
var triggers = require("ha.lib.js").getTriggers();
|
|
|
|
triggers.forEach(trigger => {
|
|
|
|
infoArray.push(function(){
|
|
|
|
return [trigger.display, trigger.getIcon(), "left", trigger.trigger]
|
|
|
|
});
|
|
|
|
})
|
|
|
|
} catch(ex){
|
|
|
|
// Nothing to do if HomeAssistant is not available...
|
|
|
|
}
|
2022-04-17 07:43:44 +00:00
|
|
|
const NUM_INFO=infoArray.length;
|
|
|
|
|
|
|
|
|
|
|
|
function getInfoEntry(){
|
|
|
|
if(isAlarmEnabled()){
|
2022-06-27 15:41:43 +00:00
|
|
|
return [getAlarmMinutes() + " min.", imgTimer, "left", null]
|
2022-04-17 07:43:44 +00:00
|
|
|
} else if(Bangle.isCharging()){
|
2022-06-27 15:41:43 +00:00
|
|
|
return [E.getBattery() + "%", imgCharging, "left", null]
|
2022-04-17 07:43:44 +00:00
|
|
|
} else{
|
2022-06-27 15:41:43 +00:00
|
|
|
// In case the user removes HomeAssistant entries, showInfo
|
|
|
|
// could be larger than infoArray.length...
|
|
|
|
settings.showInfo = settings.showInfo % infoArray.length;
|
2022-04-17 07:43:44 +00:00
|
|
|
return infoArray[settings.showInfo]();
|
|
|
|
}
|
2022-03-25 16:22:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-03-27 09:53:27 +00:00
|
|
|
/*
|
2022-04-03 11:47:33 +00:00
|
|
|
* Helper
|
2022-03-27 09:53:27 +00:00
|
|
|
*/
|
2022-03-25 16:22:39 +00:00
|
|
|
function getSteps() {
|
2022-04-17 07:43:44 +00:00
|
|
|
var steps = 0;
|
2022-03-25 16:22:39 +00:00
|
|
|
try{
|
|
|
|
if (WIDGETS.wpedom !== undefined) {
|
2022-04-17 07:43:44 +00:00
|
|
|
steps = WIDGETS.wpedom.getSteps();
|
2022-03-25 16:22:39 +00:00
|
|
|
} else if (WIDGETS.activepedom !== undefined) {
|
2022-04-17 07:43:44 +00:00
|
|
|
steps = WIDGETS.activepedom.getSteps();
|
2022-03-26 07:28:25 +00:00
|
|
|
} else {
|
2022-04-17 07:43:44 +00:00
|
|
|
steps = Bangle.getHealthStatus("day").steps;
|
2022-03-25 16:22:39 +00:00
|
|
|
}
|
|
|
|
} catch(ex) {
|
|
|
|
// In case we failed, we can only show 0 steps.
|
|
|
|
}
|
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
steps = Math.round(steps/100) / 10; // This ensures that we do not show e.g. 15.0k and 15k instead
|
|
|
|
return steps + "k";
|
2022-03-25 16:22:39 +00:00
|
|
|
}
|
|
|
|
|
2022-04-02 14:54:16 +00:00
|
|
|
|
|
|
|
function getWeather(){
|
|
|
|
var weatherJson;
|
|
|
|
|
|
|
|
try {
|
|
|
|
weatherJson = storage.readJSON('weather.json');
|
|
|
|
var weather = weatherJson.weather;
|
|
|
|
|
|
|
|
// Temperature
|
|
|
|
weather.temp = locale.temp(weather.temp-273.15);
|
|
|
|
|
|
|
|
// Humidity
|
|
|
|
weather.hum = weather.hum + "%";
|
|
|
|
|
|
|
|
// Wind
|
|
|
|
const wind = locale.speed(weather.wind).match(/^(\D*\d*)(.*)$/);
|
|
|
|
weather.wind = Math.round(wind[1]) + " km/h";
|
|
|
|
|
|
|
|
return weather
|
|
|
|
|
|
|
|
} catch(ex) {
|
|
|
|
// Return default
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
2022-04-03 12:59:14 +00:00
|
|
|
temp: "? °C",
|
2022-04-02 14:54:16 +00:00
|
|
|
hum: "-",
|
|
|
|
txt: "-",
|
2022-04-03 12:59:14 +00:00
|
|
|
wind: "? km/h",
|
2022-04-02 14:54:16 +00:00
|
|
|
wdir: "-",
|
|
|
|
wrose: "-"
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2022-03-27 09:53:27 +00:00
|
|
|
function isAlarmEnabled(){
|
|
|
|
try{
|
2022-04-04 16:32:30 +00:00
|
|
|
var alarm = require('sched');
|
2022-04-02 10:22:16 +00:00
|
|
|
var alarmObj = alarm.getAlarm(TIMER_IDX);
|
|
|
|
if(alarmObj===undefined || !alarmObj.on){
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
2022-03-27 09:53:27 +00:00
|
|
|
} catch(ex){ }
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getAlarmMinutes(){
|
2022-04-02 10:22:16 +00:00
|
|
|
if(!isAlarmEnabled()){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2022-04-04 16:32:30 +00:00
|
|
|
var alarm = require('sched');
|
2022-04-02 10:22:16 +00:00
|
|
|
var alarmObj = alarm.getAlarm(TIMER_IDX);
|
|
|
|
return Math.round(alarm.getTimeToAlarm(alarmObj)/(60*1000));
|
2022-03-27 09:53:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function increaseAlarm(){
|
|
|
|
try{
|
2022-04-02 10:22:16 +00:00
|
|
|
var minutes = isAlarmEnabled() ? getAlarmMinutes() : 0;
|
2022-04-04 16:32:30 +00:00
|
|
|
var alarm = require('sched')
|
2022-04-02 10:22:16 +00:00
|
|
|
alarm.setAlarm(TIMER_IDX, {
|
|
|
|
timer : (minutes+5)*60*1000,
|
|
|
|
});
|
|
|
|
alarm.reload();
|
2022-03-27 09:53:27 +00:00
|
|
|
} catch(ex){ }
|
|
|
|
}
|
|
|
|
|
|
|
|
function decreaseAlarm(){
|
|
|
|
try{
|
2022-04-02 10:22:16 +00:00
|
|
|
var minutes = getAlarmMinutes();
|
|
|
|
minutes -= 5;
|
|
|
|
|
2022-04-04 16:32:30 +00:00
|
|
|
var alarm = require('sched')
|
2022-04-02 10:22:16 +00:00
|
|
|
alarm.setAlarm(TIMER_IDX, undefined);
|
|
|
|
|
|
|
|
if(minutes > 0){
|
|
|
|
alarm.setAlarm(TIMER_IDX, {
|
|
|
|
timer : minutes*60*1000,
|
|
|
|
});
|
2022-03-27 09:53:27 +00:00
|
|
|
}
|
2022-04-02 10:22:16 +00:00
|
|
|
|
|
|
|
alarm.reload();
|
2022-03-27 09:53:27 +00:00
|
|
|
} catch(ex){ }
|
|
|
|
}
|
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* DRAW functions
|
|
|
|
*/
|
|
|
|
|
|
|
|
function draw() {
|
|
|
|
// Queue draw again
|
|
|
|
queueDraw();
|
|
|
|
|
|
|
|
// Draw clock
|
|
|
|
drawDate();
|
|
|
|
drawTime();
|
|
|
|
drawLock();
|
|
|
|
drawWidgets();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
function drawDate(){
|
|
|
|
// Draw background
|
2022-05-15 19:45:56 +00:00
|
|
|
var y = H/5*2;
|
2022-04-15 13:50:16 +00:00
|
|
|
g.reset().clearRect(0,0,W,W);
|
|
|
|
|
|
|
|
// Draw date
|
2022-05-15 19:45:56 +00:00
|
|
|
y = parseInt(y/2);
|
2022-05-19 18:09:26 +00:00
|
|
|
y += settings.fullscreen ? 2 : 15;
|
2022-04-15 13:50:16 +00:00
|
|
|
var date = new Date();
|
|
|
|
var dateStr = date.getDate();
|
|
|
|
dateStr = ("0" + dateStr).substr(-2);
|
|
|
|
g.setMediumFont(); // Needed to compute the width correctly
|
|
|
|
var dateW = g.stringWidth(dateStr);
|
2022-03-27 09:53:27 +00:00
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
g.setSmallFont();
|
|
|
|
var dayStr = locale.dow(date, true);
|
|
|
|
var monthStr = locale.month(date, 1);
|
|
|
|
var dayW = Math.max(g.stringWidth(dayStr), g.stringWidth(monthStr));
|
|
|
|
var fullDateW = dateW + 10 + dayW;
|
2022-03-25 16:22:39 +00:00
|
|
|
|
2022-05-15 19:45:56 +00:00
|
|
|
g.setFontAlign(-1,0);
|
2022-04-15 13:50:16 +00:00
|
|
|
g.setMediumFont();
|
|
|
|
g.setColor(g.theme.fg);
|
2022-05-19 18:09:26 +00:00
|
|
|
g.drawString(dateStr, W/2 - fullDateW / 2, y+1);
|
2022-04-03 13:33:54 +00:00
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
g.setSmallFont();
|
2022-05-20 05:40:15 +00:00
|
|
|
g.drawString(dayStr, W/2 - fullDateW/2 + 10 + dateW, y-12);
|
2022-05-19 18:09:26 +00:00
|
|
|
g.drawString(monthStr, W/2 - fullDateW/2 + 10 + dateW, y+11);
|
2022-04-15 13:50:16 +00:00
|
|
|
}
|
2022-04-03 13:33:54 +00:00
|
|
|
|
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
function drawTime(){
|
2022-03-25 16:57:19 +00:00
|
|
|
// Draw background
|
2022-04-15 13:50:16 +00:00
|
|
|
var y = H/5*2 + (settings.fullscreen ? 0 : 8);
|
2022-04-02 13:59:44 +00:00
|
|
|
g.setColor(g.theme.fg);
|
2022-03-27 09:26:22 +00:00
|
|
|
g.fillRect(0,y,W,H);
|
|
|
|
var date = new Date();
|
2022-04-11 18:05:48 +00:00
|
|
|
|
2022-03-27 09:26:22 +00:00
|
|
|
// Draw time
|
2022-04-02 13:59:44 +00:00
|
|
|
g.setColor(g.theme.bg);
|
2022-05-15 19:45:56 +00:00
|
|
|
g.setFontAlign(0,0);
|
2022-05-20 05:47:35 +00:00
|
|
|
|
2022-05-20 11:13:54 +00:00
|
|
|
var hours = String(date.getHours());
|
|
|
|
var minutes = date.getMinutes();
|
|
|
|
minutes = minutes < 10 ? String("0") + minutes : minutes;
|
|
|
|
var colon = settings.hideColon ? "" : ":";
|
|
|
|
var timeStr = hours + colon + minutes;
|
2022-05-20 05:47:35 +00:00
|
|
|
|
2022-05-20 11:13:54 +00:00
|
|
|
// Set y coordinates correctly
|
2022-05-15 19:45:56 +00:00
|
|
|
y += parseInt((H - y)/2) + 5;
|
2022-04-02 14:19:47 +00:00
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
var infoEntry = getInfoEntry();
|
|
|
|
var infoStr = infoEntry[0];
|
|
|
|
var infoImg = infoEntry[1];
|
|
|
|
var printImgLeft = infoEntry[2] == "left";
|
|
|
|
|
|
|
|
// Show large or small time depending on info entry
|
|
|
|
if(infoStr == null){
|
2022-05-20 11:13:54 +00:00
|
|
|
if(settings.hideColon){
|
|
|
|
g.setXLargeFont();
|
|
|
|
} else {
|
|
|
|
g.setLargeFont();
|
|
|
|
}
|
2022-04-02 14:19:47 +00:00
|
|
|
} else {
|
2022-05-15 19:45:56 +00:00
|
|
|
y -= 15;
|
2022-04-02 14:19:47 +00:00
|
|
|
g.setMediumFont();
|
|
|
|
}
|
2022-04-01 06:17:59 +00:00
|
|
|
g.drawString(timeStr, W/2, y);
|
2022-03-27 09:26:22 +00:00
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
// Draw info if set
|
|
|
|
if(infoStr == null){
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2022-05-15 19:45:56 +00:00
|
|
|
y += 35;
|
2022-03-27 09:26:22 +00:00
|
|
|
g.setFontAlign(0,0);
|
2022-04-17 07:43:44 +00:00
|
|
|
g.setSmallFont();
|
|
|
|
var imgWidth = 0;
|
|
|
|
if(infoImg !== undefined){
|
2022-06-27 15:41:43 +00:00
|
|
|
imgWidth = 26.0;
|
2022-04-17 07:43:44 +00:00
|
|
|
var strWidth = g.stringWidth(infoStr);
|
2022-06-27 15:41:43 +00:00
|
|
|
var scale = imgWidth / infoImg.width;
|
2022-04-17 07:43:44 +00:00
|
|
|
g.drawImage(
|
|
|
|
infoImg,
|
2022-06-27 15:41:43 +00:00
|
|
|
W/2 + (printImgLeft ? -strWidth/2-2 : strWidth/2+2) - parseInt(imgWidth/2),
|
|
|
|
y - parseInt(imgWidth/2),
|
|
|
|
{ scale: scale }
|
2022-04-17 07:43:44 +00:00
|
|
|
);
|
2022-04-02 14:19:47 +00:00
|
|
|
}
|
2022-04-17 07:43:44 +00:00
|
|
|
g.drawString(infoStr, printImgLeft ? W/2 + imgWidth/2 + 2 : W/2 - imgWidth/2 - 2, y+3);
|
2022-04-15 13:50:16 +00:00
|
|
|
}
|
2022-03-27 09:26:22 +00:00
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
|
|
|
|
function drawLock(){
|
2022-03-27 09:26:22 +00:00
|
|
|
if(settings.showLock && Bangle.isLocked()){
|
2022-04-02 14:19:47 +00:00
|
|
|
g.setColor(g.theme.fg);
|
2022-04-02 14:59:58 +00:00
|
|
|
g.drawImage(imgLock, W-16, 2);
|
2022-03-27 09:26:22 +00:00
|
|
|
}
|
2022-04-15 13:50:16 +00:00
|
|
|
}
|
|
|
|
|
2022-03-27 09:26:22 +00:00
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
function drawWidgets(){
|
2022-03-27 09:26:22 +00:00
|
|
|
if(settings.fullscreen){
|
|
|
|
for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";}
|
|
|
|
} else {
|
|
|
|
Bangle.drawWidgets();
|
|
|
|
}
|
2022-03-25 16:22:39 +00:00
|
|
|
}
|
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
|
2022-04-15 13:50:16 +00:00
|
|
|
/*
|
2022-04-17 07:43:44 +00:00
|
|
|
* Draw timeout
|
2022-04-15 13:50:16 +00:00
|
|
|
*/
|
2022-04-17 07:43:44 +00:00
|
|
|
// timeout used to update every minute
|
|
|
|
var drawTimeout;
|
2022-04-15 13:50:16 +00:00
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
// schedule a draw for the next minute
|
|
|
|
function queueDraw() {
|
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
|
|
drawTimeout = setTimeout(function() {
|
|
|
|
drawTimeout = undefined;
|
|
|
|
draw();
|
|
|
|
}, 60000 - (Date.now() % 60000));
|
2022-04-15 13:50:16 +00:00
|
|
|
}
|
|
|
|
|
2022-04-17 07:43:44 +00:00
|
|
|
|
2022-03-25 16:22:39 +00:00
|
|
|
// Stop updates when LCD is off, restart when on
|
|
|
|
Bangle.on('lcdPower',on=>{
|
|
|
|
if (on) {
|
|
|
|
draw(); // draw immediately, queue redraw
|
|
|
|
} else { // stop draw timer
|
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
|
|
drawTimeout = undefined;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
Bangle.on('lock', function(isLocked) {
|
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
2022-04-03 13:59:20 +00:00
|
|
|
drawTimeout = undefined;
|
|
|
|
draw();
|
|
|
|
});
|
|
|
|
|
|
|
|
Bangle.on('charging',function(charging) {
|
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
2022-03-25 16:22:39 +00:00
|
|
|
drawTimeout = undefined;
|
|
|
|
draw();
|
|
|
|
});
|
|
|
|
|
2022-03-27 09:53:27 +00:00
|
|
|
Bangle.on('touch', function(btn, e){
|
2022-04-03 11:57:05 +00:00
|
|
|
var left = parseInt(g.getWidth() * 0.2);
|
|
|
|
var right = g.getWidth() - left;
|
2022-03-27 09:53:27 +00:00
|
|
|
var upper = parseInt(g.getHeight() * 0.2);
|
|
|
|
var lower = g.getHeight() - upper;
|
|
|
|
|
2022-04-03 11:57:05 +00:00
|
|
|
var is_left = e.x < left;
|
|
|
|
var is_right = e.x > right;
|
2022-03-27 09:53:27 +00:00
|
|
|
var is_upper = e.y < upper;
|
|
|
|
var is_lower = e.y > lower;
|
2022-06-27 15:41:43 +00:00
|
|
|
var is_center = !is_upper && !is_lower && !is_left && !is_right;
|
2022-03-27 09:53:27 +00:00
|
|
|
|
|
|
|
if(is_upper){
|
|
|
|
Bangle.buzz(40, 0.6);
|
|
|
|
increaseAlarm();
|
2022-04-15 13:50:16 +00:00
|
|
|
drawTime();
|
2022-03-27 09:53:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(is_lower){
|
|
|
|
Bangle.buzz(40, 0.6);
|
|
|
|
decreaseAlarm();
|
2022-04-15 13:50:16 +00:00
|
|
|
drawTime();
|
2022-03-27 09:53:27 +00:00
|
|
|
}
|
2022-04-02 14:54:16 +00:00
|
|
|
|
2022-04-03 11:57:05 +00:00
|
|
|
if(is_right){
|
2022-04-02 14:54:16 +00:00
|
|
|
Bangle.buzz(40, 0.6);
|
2022-04-16 16:47:57 +00:00
|
|
|
settings.showInfo = (settings.showInfo+1) % NUM_INFO;
|
2022-04-15 13:50:16 +00:00
|
|
|
drawTime();
|
2022-04-03 11:57:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(is_left){
|
|
|
|
Bangle.buzz(40, 0.6);
|
|
|
|
settings.showInfo = settings.showInfo-1;
|
2022-04-16 16:47:57 +00:00
|
|
|
settings.showInfo = settings.showInfo < 0 ? NUM_INFO-1 : settings.showInfo;
|
2022-04-15 13:50:16 +00:00
|
|
|
drawTime();
|
2022-04-02 14:54:16 +00:00
|
|
|
}
|
2022-06-27 15:41:43 +00:00
|
|
|
|
|
|
|
if(is_center){
|
|
|
|
var infoEntry = getInfoEntry();
|
|
|
|
var trigger = infoEntry[3];
|
|
|
|
if(trigger != null){
|
|
|
|
try{
|
|
|
|
require("ha.lib.js").sendTrigger("TRIGGER_BW");
|
|
|
|
Bangle.buzz(80, 0.6).then(()=>{
|
|
|
|
require("ha.lib.js").sendTrigger(trigger);
|
|
|
|
setTimeout(()=>{
|
|
|
|
Bangle.buzz(80, 0.6);
|
|
|
|
}, 250);
|
|
|
|
});
|
|
|
|
}catch(ex){
|
|
|
|
print(ex);
|
|
|
|
// Without ha -> nop.
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-03-27 09:53:27 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2022-04-15 13:26:57 +00:00
|
|
|
E.on("kill", function(){
|
2022-06-27 15:45:42 +00:00
|
|
|
try{
|
|
|
|
storage.write(SETTINGS_FILE, settings);
|
|
|
|
} catch(ex){
|
|
|
|
// If this fails, we still kill the app...
|
|
|
|
}
|
2022-04-15 13:26:57 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
2022-05-19 18:09:26 +00:00
|
|
|
/*
|
|
|
|
* Draw clock the first time
|
|
|
|
*/
|
|
|
|
// The upper part is inverse i.e. light if dark and dark if light theme
|
|
|
|
// is enabled. In order to draw the widgets correctly, we invert the
|
|
|
|
// dark/light theme as well as the colors.
|
|
|
|
g.setTheme({bg:g.theme.fg,fg:g.theme.bg, dark:!g.theme.dark}).clear();
|
|
|
|
|
|
|
|
// Load widgets and draw clock the first time
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
draw();
|
|
|
|
|
2022-03-25 16:22:39 +00:00
|
|
|
// Show launcher when middle button pressed
|
|
|
|
Bangle.setUI("clock");
|