forked from FOSS/BangleApps
Merge remote-tracking branch 'official/master' into official
commit
9e88c40f4a
|
@ -0,0 +1,3 @@
|
|||
0.01: Begin rewrite from old code.
|
||||
0.02: Changed visuals: uA > mA, info order, battery state indication
|
||||
0.03: Update app icon
|
|
@ -0,0 +1 @@
|
|||
require("heatshrink").decompress(atob("mEwwcBkmSpIC/AS0nwEHCh5yBggROgP4jgROh1ICKWT4Hkz0AC4NPgFypPgAQIRDyBLBCIMAiVAgECpAGBCInwn4RBg4dBoH/yV4j+ACI0Dz05kARB8gRJgARFgYRBgEB5IRKBwICCI4/8CIdJ/kCGoP+CIMPUIIRBkgRIYop9DgJHCPowDBTwUAyAREiSkBCITCOAX4CuwE5kmT4D1BBYSMByShBhwRCgEkWYQRDUIIRCUIWfEALXBCIsDCIMf+QICvEECIILBBAV5CIUcBAYRFpEEBYIRKnARIgFyHwfk+PAGogREgQIBPQMk+EACI9J/hrCyUHCIMHCJEnwAIByEBCIJrFCI/wWYIROwP5CIShECI7FBgjFDPoTFBgTXGBYICCCI6PDAX4C/ARoA="))
|
|
@ -0,0 +1,157 @@
|
|||
// FONTS
|
||||
|
||||
/*
|
||||
Share Tech Mono: https://fonts.google.com/specimen/Share+Tech+Mono
|
||||
Converted with: https://www.espruino.com/Font+Converter
|
||||
*/
|
||||
|
||||
Graphics.prototype.setFontShareTechMonoBig = function(scale) {
|
||||
// Actual height 56 (55 - 0)
|
||||
this.setFontCustom(
|
||||
atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAHwAAAAAAAA/wAAAAAAAD/wAAAAAAAf/wAAAAAAB//gAAAAAAP/8AAAAAAA//wAAAAAAH/+AAAAAAA//4AAAAAAD//AAAAAAAf/8AAAAAAB//gAAAAAAP/8AAAAAAB//wAAAAAAH/+AAAAAAA//4AAAAAAD//AAAAAAAf/4AAAAAAB//gAAAAAAP/8AAAAAAA//wAAAAAAA/+AAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///4AAAAD/////AAAAP/////wAAAf/////4AAA//////8AAA//////8AAB/AAB/j+AAB+AAH/B+AAB8AAP8A+AAB8AA/4A+AAB8AB/gA+AAB8AH/AA+AAB8AP8AA+AAB8A/4AA+AAB8B/gAA+AAB+D/AAB+AAA//+AAP8AAA//////8AAAf/////4AAAP/////wAAAH/////gAAAB////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAeAAAfgAAAA+AAAfAAAAA+AAA/AAAAA+AAA+AAAAA+AAA+AAAAA+AAB+AAAAA+AAB8AAAAA+AAB//////+AAB//////+AAB//////+AAB//////+AAB//////+AAB//////+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAB8AAAAD+AAB8AAAAP+AAB8AAAAf+AAB8AAAB/+AAB8AAAD/+AAB8AAAH/+AAB8AAAf8+AAB8AAA/4+AAB8AAD/w+AAB8AAH/A+AAB+AAf+A+AAB+AA/4A+AAA////wA+AAA////gA+AAAf//+AA+AAAP//8AA+AAAH//wAA+AAAB/+AAA+AAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAA+AAB8AAAAA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AD8AA+AAB+AH+AB+AAA////gD+AAA//////8AAAf/////8AAAP//P//4AAAH/+H//wAAAA/4D//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAP/wAAAAAAD//wAAAAAB///wAAAAAf///wAAAAH////wAAAB///+HwAAAB///gHwAAAB//wAHwAAAB/4AAHwAAAB+AAAHwAAABAAAAHwAAAAAAP///+AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///+AAAAAf///+AAAAAAAHwAAAAAAAAHwAAAAAAAAHwAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///wAA+AAB///wAA+AAB///wAA+AAB///wAA+AAB///wAA+AAB///wAA+AAB8AHwAA+AAB8AHwAA+AAB8AHwAA+AAB8AD4AA+AAB8AD4AA+AAB8AD4AB+AAB8AD+AD+AAB8AD///8AAB8AB///8AAB8AA///4AAB8AAf//wAAB4AAP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAP/////gAAAf/////4AAAf/////4AAA//////8AAA/APgAD+AAB+APgAB+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8APgAA+AAB8AHwAA+AAB8AHwAB+AAB8AH+AP8AAB8AH///8AAB8AD///4AAAAAB///wAAAAAA///gAAAAAAP/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAB8AAAAAAAAB8AAAAAAAAB8AAAAAAAAB8AAAAAOAAB8AAAAD+AAB8AAAAf+AAB8AAAD/+AAB8AAA//+AAB8AAH//+AAB8AB///gAAB8AP//8AAAB8D///AAAAB8f//4AAAAB////AAAAAB///wAAAAAB//+AAAAAAB//gAAAAAAB/8AAAAAAAB/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//AAAAD/8H//wAAAP//P//4AAAf/////8AAA//////8AAA//////+AAB/AP+AB+AAB8AD8AA+AAB8AD8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AB8AA+AAB8AD8AA+AAB+AH+AA+AAA////AD+AAA//////8AAAf/////8AAAP//P//4AAAH/+H//wAAAA/4D//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4AAAAAAP//+AAAAAAf///AAAAAAf///AA+AAA////gA+AAB/AAfgA+AAB+AAPgA+AAB8AAPwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwA+AAB8AAHwB+AAB+AAHwB+AAA//////8AAA//////8AAAf/////4AAAP/////wAAAH/////gAAAB////+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAB+AAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
|
||||
46,
|
||||
32,
|
||||
60+(scale<<8)+(1<<16)
|
||||
);
|
||||
return this;
|
||||
};
|
||||
|
||||
Graphics.prototype.setFontShareTechMono = function(scale) {
|
||||
// Actual height 38 (37 - 0)
|
||||
this.setFontCustom(
|
||||
atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAeAAAAAB4AAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAfAAAAAP8AAAAD/gAAAB/4AAAAf+AAAAP/AAAAH/gAAAB/4AAAA/8AAAAP/AAAAH/gAAAD/wAAAA/8AAAAP+AAAAA/gAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//4AAA///8AAP///8AA////wAHwAfvgAeAH4eABwA/A4AHAHwDgAcB+AOAB4PgB4AHj8AHgAf///+AA////wAB///+AAD///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAOAA8AAA4ADwAADgAeAAAOAB4AAA4AH////gAf///+AB////4AH////gAAAAAOAAAAAA4AAAAADgAAAAAOAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AHAAAfgAcAAD+ABwAA/4AHAAH/gAcAA/OABwAP44AHgB+DgAfAfwOAA//8A4AD//gDgAH/4AOAAH+AA4AAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAOABwBwA4AHAHADgAcAcAOABwBwA4AHAHADgAeA+AOAB8H4B4AD////gAP///8AAf+f/gAAPgf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAP+AAAAP/4AAAf//gAAf//OAAB//A4AAH+ADgAAcAAOAAAAH//4AAA///gAAD//+AAAP//4AAAAHgAAAAAOAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+ADgAf/4AOAB//gA4AH/+ADgAcA4AOABwDgA4AHAPADgAcA8AeABwD//4AHAH//AAcAP/4AAAAf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///8AAH///4AA////wAH////gAeB4AeABwHgA4AHAeADgAcB4AOABwHgA4AHAeAHgAcA//+ABwD//wAAAH/+AAAAP/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAABwAAAAAHAAAAgAcAAAeABwAAf4AHAAP/gAcAH/+ABwH/+AAHD//AAAf//AAAB//gAAAH/gAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAP+f/gAD////AAP///+AB//8B4AHgPgDgAcAcAOABwBwA4AHAHADgAcAcAOAB4D4B4AH////gAP///8AAf/f/wAAfw/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAH/+AAAA//8A4AH4HwDgAeAHgOABwAeA4AHAB4DgAcAHgOABwAeB4AHgB4HgAf///+AA////wAB///+AAB///gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AHgAAHgAeAAAeAB4AAB4AHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='),
|
||||
46,
|
||||
22,
|
||||
40+(scale<<8)+(1<<16)
|
||||
);
|
||||
return this;
|
||||
};
|
||||
|
||||
Graphics.prototype.setFontShareTechMonoSmall = function(scale) {
|
||||
// Actual height 23 (22 - 0)
|
||||
this.setFontCustom(
|
||||
atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zgP/zgP/zgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAPwAAPwAAAAAAPwAAPwAAPAAAAAAAAAAAAAAAAAAAAAAAAwYAP//gP//gP//gAwYAP//gP//gP//gAwYAAAAAAAAAAAAAAAAAB4AAD+BgH/Bg+HB8+DB8+DB8GD/gGB/AAAcAAAAAAAAAABAAH7AAP7AAMLAAMbAAP7AAHzfAAG/gAGxgAGxgAG/gAGfAAGAAAAAAAAAADz/AH//gP+DgMOBgMMBgMMBgMP/gAP/gAMAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAPwAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wP//8/AA+4AAGgAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAC4AAG/AB+P//8D//wAAAAAAAAAAAAAAAAAAAAAAAADAAADuAAB+AAP4AAfwAAP8AAB+AADsAADAAAAAAAAAAAAAAAAAAAADgAADgAADgAAf8AAf8AAf8AADgAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAD+AAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAADgAADgAADgAADgAADgAADgAADgAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAADgAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAeAAD8AAfwAB+AAP4AA/AAH8AAfgAA8AAAwAAAAAAAAAAAAAAAD/+AH//APB/gMDxgMHBgMeBgP//gH//AD/+AAAAAAAAAAAAAAAAAGAAgGABgOABgOABgP//gP//gAABgAABgAABgAAAAAAAAAAAAAAAAAABgMAHgMAPgMA9gMB5gOHxgH/BgD+BgAABgAAAAAAAAAAAAAAAAAAAAMCBgMGBgMGBgMHBgP/DgH//gD5/AAAAAAAAAAAAAAAAAAAAAAD4AA/4AP/4APwYAMAYAAP/gAP/gAAcAAAYAAAAAAAAAAAAAAAAAAAAAP+BgP+BgMGBgMGBgMHDgMH/gMD/AAAAAAAAAAAAAAAAAAAAAD/+AH//AP//gMMBgMMBgMOBgMP/gMH/AAD+AAAAAAAAAAAAAAAAAMAAAMAAAMADgMAfgMH/AM/4AP/AAPwAAGAAAAAAAAAAAAAAAAAAAD5/AH//gP/DgMHBgMGBgMHBgP/jgH//gD5/AAAAAAAAAAAAAAAAAD+AAH/AgP/hgMBhgMBhgMBhgP//gH//AD/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcDgAcDgAcDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAcD+AcD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAHgAAPwAAMwAAc4AAY4AA4cAA4cABwMAAAAAAAAAAAAAAAAAAMYAAMYAAMYAAMYAAMYAAMYAAMYAAMYAAMYAAAAAAAAAAAAAAAAABwMAA4cAA4cAAY4AAc4AAMwAAPwAAHgAAHgAAAAAAAAAAAAAAAAAAAAAMAAAMABgMDzgMHzgOeAAH8AAD4AAAAAAAAAAAAAAB/8AH//AP//gMHhgMf5gM/9gMwNgM/5gM/8gMAMAP/8AH/8AA/wAAAAAAADgAA/gAP/gD/4AP8YAPAYAP8YAD/4AAP/gAA/gAADgAAAAAAAAAAAAP//gP//gMGBgMGBgMGBgMGBgP/DgH//gD5/AAAAAAAAAAAAAAAAAB/8AH//AP//gOABgMABgMABgMABgMABgMABgAAAAAAAAAAAAAAAAP//gP//gMABgMABgMABgMABgOADgH//gH//AAAAAAAAAAAAAAAAAP//gP//gP//gMGBgMGBgMGBgMGBgMGBgMABgAAAAAAAAAAAAAAAAP//gP//gP//gMHAAMHAAMHAAMHAAMHAAMAAAAAAAAAAAAAAAAAAAD/+AH//AP//gMABgMDBgMDBgMD/gMD/gAD/gAAAAAAAAAAAAAAAAP//gP//gAHAAAHAAAHAAAHAAAHAAP//gP//gAAAAAAAAAAAAAAAAAAAAMABgMABgP//gP//gP//gMABgMABgAAAAAAAAAAAAAAAAAAAAAAAAAABgMABgMABgMABgMAHgP//AP/+AAAAAAAAAAAAAAAAAAAAAP//gP//gAPAAAfgAB/4ADw+APAfgOAHgIABgAAAAAAAAAAAAAAAAAAAAP//gP//gAABgAABgAABgAABgAABgAAAAAAAAAAAAAAAAP//gP//gPgAAP+AAB/gAAHwAB/gAP8AAPgAAP//gP//gAAAAAAAAAAAAP//gP//gPwAAP/AAA/8AAD/gAAPgP//gP//gAAAAAAAAAAAAA/8AH//AH//gOADgMABgMABgMABgOADgH//gH//AA/4AAAAAAAAAAAAAP//gP//gMDgAMDgAMDgAMDgAP/AAH/AAD+AAAAAAAAAAAAAAA/8AH//AH//gOADgMABgMABgMABgOADgH//gH//wA/4wAAAAAAAAH//gP//gP//gMDAAMDAAMDgAOD8AP//AH+PgB4DgAAAgAAAAAAAAAAAAD4AAH+BgP+BgOGBgMHBgMHBgMH/gMD/AAA+AAAAAAAAAAAAAMAAAMAAAMAAAMAAAP//gP//gP//gMAAAMAAAMAAAMAAAAAAAAAAAAAAAP//AP//gAADgAABgAABgAABgAADgP//gP//AAAAAAAAAAAAAMAAAP4AAP/wAA//AAB/gAAHgAD/gB/+AP/AAPwAAIAAAAAAAAAAAP/gAP//gAP/gAAfgAH+AAHwAAD/gAAfgAf/gP//gP8AAAAAAAAAAAAAgOADgPgPgH4+AB/4AAfwAB/4AH4/APgPgOADgAAAgAAAAAAAAMAAAPAAAPwAAD8AAA//gAP/gAf/gD8AAPwAAPAAAIAAAAAAAAAAAAAAAMADgMAPgMA/gMD5gMPhgM+BgP4BgPgBgOABgAAAAAAAAAAAAAAAAAAAAAAAA///+///+wAAGwAAGwAAGAAAAAAAAAAAAAAAAAAAAwAAA+AAAfgAAH8AAA/AAAP4AAB+AAAPwAAD8AAAeAAAGAAAAAAAAAAAAAAAAAAAAwAAGwAAGwAAG///+///+AAAAAAAAAAAAAAAAAAAAAAAAA4AAD4AAPwAAeAAAYAAAeAAAPwAAD4AAAYAAAAAAAAAAAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAGAAAAAAAAAAAAAAAAIAAAMAAAOAAAGAAACAAAAAAAAAAAAAAAAAAAAAAAAAOAAY/gAY/gAZxgAZxgAZxgAZxgAf/gAP/gAABgAAAgAAAAAAAAAAAAP//gP//gAcBgAYBgAYBgAYBgAcDgAf/gAP/AAAAAAAAAAAAAAAAAAAAAAP/AAf/gAYBgAYBgAYBgAYBgAYBgAAAAAAAAAAAAAAAAAAAAAP/AAf/gAcDgAYBgAYBgAYBgAYDgP//gP//gAAAAAAAAAAAAAAAAAP+AAf/gAf/gAYxgAYxgAYxgAfxgAPxgAHwAAAAAAAAAAAAAAAAAAYBgAYBgD//gP//gP//gMYBgMYBgMYBgMQAAAAAAAAAAAAAAAAAAAPwGAf/GAYfGAYfGAYfGAYfGAY7mAf7+Afx8AAAAAAAAAAAAAAAAP//gP//gAcAAAYAAAYAAAYAAAcAAAf/gAP/gAAAAAAAAAAAAAAAAAYAAAYAAAYAAMf/gOf/gMf/gAABgAABgAABgAAAAAAAAAAAAAAAAAAAAAAAGAYAGAYAGAYAGMf/+Of/+Mf/8AAAAAAAAAAAAAAAAAAAAP//gP//gP//gADwAAH8AAefAAcHgAYDgAQAgAAAAAAAAAAAAEAAAMAAAMAAAMAAAP//AP//gAADgAABgAABgAABgAAAgAAAAAAAAAf/gAf/gAYAAAYAAAf/gAf/gAf/gAYAAAYAAAf/gAP/gAAAAAAAAAAAAAf/gAf/gAcAAAYAAAYAAAYAAAcAAAf/gAP/gAAAAAAAAAAAAAAAAAP/AAf/gAcDgAYBgAYBgAYBgAcDgAf/gAP/AAAAAAAAAAAAAAAAAAf/+Af/+AcBgAYBgAYBgAYBgAcDgAf/gAP/AAAAAAAAAAAAAAAAAAP/AAf/gAcDgAYBgAYBgAYBgAYDgAf/+Af/+AAAAAAAAAAAAAAAAAYBgAYBgAf/gAf/gAcBgAYBgAYBgAYAAAYAAAAAAAAAAAAAAAAAAAAAAAPhgAfxgAZxgAYxgAYxgAY/gAYfAAAAAAAAAAAAAAAAAAAAAAYAAAYAAAYAAD//AD//gAYBgAYBgAYBgAYBgAAAAAAAAAAAAAAAAAf+AAf/gAf/gAABgAABgAABgAf/gAf/gAf/gAAAAAAAAAAAAAQAAAeAAAf4AAH/AAAfgAADgAAfgAH/AAf4AAeAAAQAAAAAAAAAAAfAAAf/AAD/gAAPgAD/gAH4AAH/gAAPgAD/gAf+AAfAAAAAAAAAAAAAAAYBgAcHgAfPAAH+AAD4AAH+AAfPgAcDgAQBgAAAAAAAAAAAAAQAAAeAAAfwGAH+GAA/uAAD+AAf8AH/AAf4AAeAAAQAAAAAAAAAAAAAAAABgAYHgAYPgAY/gAZ5gAfxgAfBgAeBgAYAAAAAAAAAAAAAAAAAAAAAAADgAADgAf//8/+/+4AAGwAAGwAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//+///+f//+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAGwAAG4AAG/+/+f//8ADgAADgAAAAAAAAAAAAAAAAAAAAAADgAADAAADAAADAAADAAADgAABgAADgAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'),
|
||||
32,
|
||||
atob("DQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0H"),
|
||||
24+(scale<<8)+(1<<16)
|
||||
);
|
||||
return this;
|
||||
};
|
||||
|
||||
{
|
||||
|
||||
// VARS
|
||||
|
||||
let FONT_NAME = "ShareTechMono";
|
||||
let BIG_FONT_HEIGHT = 60;
|
||||
//let NORMAL_FONT_HEIGHT = 40;
|
||||
let SMALL_FONT_HEIGHT = 24;
|
||||
|
||||
let timeDrawTimeout;
|
||||
let infoDrawTimeout;
|
||||
let lockState = Bangle.isLocked();
|
||||
let pressure;
|
||||
|
||||
|
||||
|
||||
// LISTENERS
|
||||
|
||||
Bangle.on('lock', function(isLocked) {
|
||||
lockState = isLocked;
|
||||
timeDraw();
|
||||
infoDraw();
|
||||
});
|
||||
|
||||
|
||||
|
||||
// DRAW FUNCTIONS
|
||||
|
||||
let timeDraw = function() {
|
||||
g.reset();
|
||||
g.clearRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y + BIG_FONT_HEIGHT);
|
||||
|
||||
var date = new Date();
|
||||
var timeArray = [date.getHours().toString().padStart(2, "0"),
|
||||
date.getMinutes().toString().padStart(2, "0")];
|
||||
if (!lockState) timeArray.push(date.getSeconds().toString().padStart(2, "0"));
|
||||
var timeString = timeArray.join(":");
|
||||
g.setFontAlign(0, 0).setColor(g.theme.fg).setFont(FONT_NAME + (lockState ? "Big" : ""));
|
||||
g.drawString(timeString, Bangle.appRect.x2/2, Bangle.appRect.y + BIG_FONT_HEIGHT/2);
|
||||
|
||||
if (timeDrawTimeout) clearTimeout(timeDrawTimeout);
|
||||
timeDrawTimeout = setTimeout(function() {
|
||||
timeDrawTimeout = undefined;
|
||||
timeDraw();
|
||||
}, (lockState ? 10000 - (Date.now() % 10000) : 1000 - (Date.now() % 1000))); // if locked, every clock's 10s, otherwise every 1s
|
||||
};
|
||||
|
||||
let infoDraw = function() {
|
||||
g.reset();
|
||||
|
||||
var date = new Date();
|
||||
var dateString = [date.getFullYear().toString().padStart(4,"0"),
|
||||
(date.getMonth()+1).toString().padStart(2,"0"),
|
||||
date.getDate().toString().padStart(2,"0")].join("-");
|
||||
|
||||
var tzOffset = -(date.getTimezoneOffset())/60;
|
||||
var tzOffsetString = (tzOffset >= 0 ? "+" + tzOffset : tzOffset);
|
||||
|
||||
var batteryString = (Bangle.isCharging() ? "+" : "") + E.getBattery() + "%";
|
||||
|
||||
var pressureString = (pressure ? pressure + "hPa" : "(hPa)");
|
||||
|
||||
var powerString = (E.getPowerUsage().total / 1000) + "mA";
|
||||
|
||||
var stepsString = Bangle.getHealthStatus("day").steps + "ST";
|
||||
|
||||
var bluetoothStatus = NRF.getSecurityStatus();
|
||||
var bluetoothString = (bluetoothStatus.connected ? bluetoothStatus.connected_addr.split(" ")[0].substr(-5) : "N/C");
|
||||
|
||||
var infoMatrix = [
|
||||
[dateString + tzOffsetString ],
|
||||
[batteryString, pressureString],
|
||||
[powerString ],
|
||||
[stepsString, bluetoothString ]
|
||||
];
|
||||
|
||||
g.clearRect(Bangle.appRect.x, Bangle.appRect.y + BIG_FONT_HEIGHT, Bangle.appRect.x2, Bangle.appRect.y2);
|
||||
g.setFontAlign(0, -1).setColor(g.theme.fg2).setFont(FONT_NAME+"Small");
|
||||
|
||||
infoMatrix.forEach((lineArray, lineNumber) => {
|
||||
g.drawString(lineArray.join(" "), Bangle.appRect.x2/2, Bangle.appRect.y + BIG_FONT_HEIGHT + SMALL_FONT_HEIGHT*lineNumber);
|
||||
});
|
||||
|
||||
Bangle.getPressure().then(baroValue => { pressure=Math.round(baroValue.pressure); });
|
||||
|
||||
if (infoDrawTimeout) clearTimeout(infoDrawTimeout);
|
||||
infoDrawTimeout = setTimeout(function() {
|
||||
infoDrawTimeout = undefined;
|
||||
infoDraw();
|
||||
}, (lockState ? 60000 : 10000)); // if locked, a minute from now, otherwise in 10s
|
||||
};
|
||||
|
||||
|
||||
|
||||
// DRAW CALLS
|
||||
|
||||
g.clear();
|
||||
|
||||
Bangle.setUI({
|
||||
mode: "clock",
|
||||
remove: function() {
|
||||
if (timeDrawTimeout) clearTimeout(timeDrawTimeout);
|
||||
timeDrawTimeout = undefined;
|
||||
if (infoDrawTimeout) clearTimeout(infoDrawTimeout);
|
||||
infoDrawTimeout = undefined;
|
||||
|
||||
delete Graphics.prototype.setFontShareTechMono;
|
||||
delete Graphics.prototype.setFontShareTechMonoBig;
|
||||
delete Graphics.prototype.setFontShareTechMonoSmall;
|
||||
}});
|
||||
|
||||
Bangle.loadWidgets();
|
||||
Bangle.drawWidgets();
|
||||
|
||||
timeDraw();
|
||||
infoDraw();
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 4.1 KiB |
|
@ -0,0 +1,18 @@
|
|||
{ "id": "denseclock",
|
||||
"name": "Dense Clock",
|
||||
"shortName":"Dense Clock",
|
||||
"version":"0.03",
|
||||
"description": "A clockface dense with text-only information. Switches between showing seconds and minutes when unlocked/locked, in the interest of saving power.",
|
||||
"icon": "app.png",
|
||||
"type": "clock",
|
||||
"tags": "clock",
|
||||
"supports" : ["BANGLEJS2"],
|
||||
"storage": [
|
||||
{"name":"denseclock.app.js","url":"app.js"},
|
||||
{"name":"denseclock.img","url":"app-icon.js","evaluate":true}
|
||||
],
|
||||
"screenshots": [
|
||||
{"url":"screenshot_locked.png"},
|
||||
{"url":"screenshot_unlocked.png"}
|
||||
]
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
|
@ -79,12 +79,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/podadrem/app.js": {
|
||||
"hash": "f7392e74974f69553aade2dcc07527b5d3b71a9b84e6dc5e0dd995e78dff8007",
|
||||
"rules": [
|
||||
"no-unused-vars"
|
||||
]
|
||||
},
|
||||
"apps/openstmap/imagefilter.js": {
|
||||
"hash": "8a71e9a0ecfa94150379c41a5a915cfdac39f8b2e485e5cc1ce4629e85293acd",
|
||||
"rules": [
|
||||
|
@ -148,13 +142,6 @@ module.exports = {
|
|||
"no-unused-vars"
|
||||
]
|
||||
},
|
||||
"apps/waypoints/waypoints.app.js": {
|
||||
"hash": "ff02639eb8f81784c942093d57d254295e2c78918adb4bcffdf0d0284ebfac55",
|
||||
"rules": [
|
||||
"no-unused-vars",
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/timerclk/timer.js": {
|
||||
"hash": "3b70606f1742b34bf4769f6e8703144ff0c3ba401a3a21f97ddcab5432c94db5",
|
||||
"rules": [
|
||||
|
@ -195,12 +182,6 @@ module.exports = {
|
|||
"no-unused-vars"
|
||||
]
|
||||
},
|
||||
"apps/poweroff/settings.js": {
|
||||
"hash": "c197afe72c612a4b3825a3a12a628d0f4ed83823da3f28885bbf473037a02506",
|
||||
"rules": [
|
||||
"no-unused-vars"
|
||||
]
|
||||
},
|
||||
"apps/oxofocus/app.js": {
|
||||
"hash": "cd29309373974ef038725e26d8a2ff2634a437c89cdffc3b12defd65a948db75",
|
||||
"rules": [
|
||||
|
@ -208,13 +189,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/orloj/app.js": {
|
||||
"hash": "fa43f035d759ba94f564392f410c0c6c485bb41a33c062f03d666738d517ccf3",
|
||||
"rules": [
|
||||
"no-unused-vars",
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/nixie/m_vatch.js": {
|
||||
"hash": "36a7fa956f99d5815cd6bac570d2b86833d1d37474d7eef0bb21892bdf6723a8",
|
||||
"rules": [
|
||||
|
@ -490,13 +464,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/doztime/app-bangle1.js": {
|
||||
"hash": "1e9598c201175180ae77d1c3bc47e8138b339b72eb58782b5057fb7aefdc88a1",
|
||||
"rules": [
|
||||
"no-unused-vars",
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/carcrazy/app.js": {
|
||||
"hash": "fd9f98f4f9e24c63a8fa02918dceab4503edf88e06537922caf86e85884408f3",
|
||||
"rules": [
|
||||
|
@ -587,12 +554,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/swp2clk/settings.js": {
|
||||
"hash": "2d9de7ffdf171f6e7b058741046c8a326cf9d5dba651f52fcdb523214b08d626",
|
||||
"rules": [
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/sunclock/app.js": {
|
||||
"hash": "54f49294816e06907003a71289a8b79641b1cd082044fb22bb4c4b80f6845459",
|
||||
"rules": [
|
||||
|
@ -617,12 +578,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/spotrem/app.js": {
|
||||
"hash": "35f3ee5371acde28427fd01e191ff58108d3d9e4db1a221dca081b7a7b9c3c77",
|
||||
"rules": [
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/speedalt/app.js": {
|
||||
"hash": "2c8a2c0d7f60a8c25ee86e943f59df8fb5816ceac00e9e077220227d8885b133",
|
||||
"rules": [
|
||||
|
@ -761,12 +716,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/owmweather/boot.js": {
|
||||
"hash": "10fe98e871a7df3338fc764d62ac4db65c20c44774aad112f5faf26c7497f78e",
|
||||
"rules": [
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/openwind/app.js": {
|
||||
"hash": "91bfda771bd5cc3127ede3b52f5f088b733ac9e7fc2d8dff4f1d732e66a8af47",
|
||||
"rules": [
|
||||
|
@ -917,12 +866,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/infoclk/settings.js": {
|
||||
"hash": "56adc3eff3cbc04dd08238ed7e559416ebbc7736c872070c757d70bf5f31b440",
|
||||
"rules": [
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/infoclk/app.js": {
|
||||
"hash": "27cc368eb1be14658db7fd482e78c4bc7673e2a1c68bc3a1a5f7c7e29915ca88",
|
||||
"rules": [
|
||||
|
@ -971,12 +914,6 @@ module.exports = {
|
|||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/gpssetup/gpssetup.js": {
|
||||
"hash": "a63f670f4adf04895e6837270fcf19bd56f0a6d049cfb8e3ad8928c283d1bfd3",
|
||||
"rules": [
|
||||
"no-undef"
|
||||
]
|
||||
},
|
||||
"apps/glbasic/glbasic.app.js": {
|
||||
"hash": "7d12a030d6f0ef69a0e5a9783229fd49c0a6a06bf751e3ac562145d2ce8350e9",
|
||||
"rules": [
|
||||
|
|
|
@ -52,6 +52,23 @@ As long as widgets are loaded, you can:
|
|||
* Call `WIDGETS["recorder"].setRecording(true, {force:"new"/"append"/"overwrite")` to start recording (it returns a promise, and will not show a menu)
|
||||
* Call `WIDGETS["recorder"].setRecording(false)` to stop recording
|
||||
|
||||
### Recording new items
|
||||
|
||||
You can add new data items to record by creating a JS file on the Bangle named ending in `.recorder.js` that adds a new item
|
||||
to the supplied `recorders` array. For example `foobar.recorder.js` could contain:
|
||||
|
||||
```
|
||||
(function(recorders) {
|
||||
recorders.foobar = {
|
||||
name : "Foobar", // Name to appear in UIs
|
||||
fields : ["foobar"], // Column headings to appear as header in recorded CSV data
|
||||
getValues : () => [123], // Columns of data (length should match 'fields')
|
||||
start : () => {}, // Called when recording starts - turn on any hardware/intervals you need
|
||||
stop : () => {}, // Called when recording stops - turn off any hardware/intervals
|
||||
draw (x,y) => {} // draw 12x12px status image at x,y on g
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
|
||||
## Tips
|
||||
|
|
|
@ -145,15 +145,17 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* eg. foobar.recorder.js
|
||||
/* You can add new data items to record by creating a JS file on the Bangle named ending in `.recorder.js` that adds a new item
|
||||
to the supplied `recorders` array. For example `foobar.recorder.js` could contain:
|
||||
|
||||
(function(recorders) {
|
||||
recorders.foobar = {
|
||||
name : "Foobar",
|
||||
fields : ["foobar"],
|
||||
getValues : () => [123],
|
||||
start : () => {},
|
||||
stop : () => {},
|
||||
draw (x,y) => {} // draw 12x12px status image
|
||||
name : "Foobar", // Name to appear in UIs
|
||||
fields : ["foobar"], // Column headings to appear as header in recorded CSV data
|
||||
getValues : () => [123], // Columns of data (length should match 'fields')
|
||||
start : () => {}, // Called when recording starts - turn on any hardware/intervals you need
|
||||
stop : () => {}, // Called when recording stops - turn off any hardware/intervals
|
||||
draw (x,y) => {} // draw 12x12px status image at x,y on g
|
||||
}
|
||||
})
|
||||
*/
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
0.01: attempt to import
|
||||
0.10: major updates, display satellites, display per-system satellite info
|
||||
|
|
|
@ -4,5 +4,17 @@ Compare GPS with Baido and Glonass
|
|||
|
||||
This turns GNSS receiver into mode with all three systems enabled, and
|
||||
displays debug info from all of them. Click into top left corner to
|
||||
switch navigation systems.
|
||||
switch navigation systems. Clicks in bottom half of screen switch info
|
||||
pages.
|
||||
|
||||
GNSS acquisition has few phases, and this software is assuming you are
|
||||
not doing a cold start. GNSS fix needs 4 or 5 satellites with
|
||||
reasonable signal strength, and then holding the same place for 40 or
|
||||
so seconds.
|
||||
|
||||
Uxx -- satellites are known but not being received
|
||||
|
||||
S1..S4 -- not enough satellites being decoded (5 needed)
|
||||
|
||||
XXdB -- this is strength of 5th strongest satellite
|
||||
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
require("heatshrink").decompress(atob("mEwgIQNgQFEj/gAof+jgECgeAAIIFBgwCBuACBhgCEjAOEAoQ6CmAhCDwItDoEB4AFCsEBFgUEkEDG4XEJYcL8gFCgUP+gxCAoP8DIIFBhfsiEIAoMJAogCBAoYlBiBMBAoUwrA0B////ALECI0QAocgAolgApVADolAHYnAAomAAoqdBAoKVBMoRvCOIQDCRIIFBYwKVBAoKqC4AFBVQVggTRDn0CYgQcBN4LpDV4T7IAooAJA="))
|
||||
require("heatshrink").decompress(atob("mEwhHXAH4A/AH4A/AGMAF34v/F34EBAAIvrFwQxnEoIsFGEyNHF9ZgNGrheMF4guJHDAvLEhCdbLyLLdL5ImFfRo6SLpjGOCgw5TdZRhKHwhEPFxjOJCwwOGF6zOJBxpjFAB4TKR6aEJDpgwKd5rzUYBrkVMxwtVF7CYHeBxGRF5LwMR9YvdPiJfjBhYv/F/4v/F/4v/F/4v/F/4v/F/4vfAH4Ad"))
|
||||
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 1.9 KiB |
|
@ -1,6 +1,6 @@
|
|||
{ "id": "spacer",
|
||||
"name": "Space Race",
|
||||
"version": "0.01",
|
||||
"version": "0.10",
|
||||
"description": "Compare GPS with Baido and Glonass",
|
||||
"icon": "app.png",
|
||||
"readme": "README.md",
|
||||
|
|
|
@ -1,20 +1,6 @@
|
|||
/* Space race */
|
||||
|
||||
/*
|
||||
|
||||
Performance Assessment of GNSS Signals in
|
||||
terms of Time to First Fix for
|
||||
Cold, Warm and Hot Start
|
||||
Matteo Paonni, Marco Anghileri, Stefan Wallner, José-Ángel Ávila-Rodríguez, Bernd Eissfeller
|
||||
Institute of Geodesy and Navigation, University FAF Munich, Germany
|
||||
|
||||
=> 22 to 26 dB -- long time / no fix / ...
|
||||
=> 26db + -- basically strength no longer matters
|
||||
|
||||
apps/assistedgps/custom.html
|
||||
|
||||
https://github.com/espruino/EspruinoDocs/blob/master/info/Bangle.js2%20Technical.md#gps
|
||||
|
||||
gsa mi rika 2d/3d fix, a taky pdop/vdop/hdop
|
||||
|
||||
CFG-NAVX z CASIC_en -- umoznuje nastavit chodec / auto / letadlo
|
||||
|
@ -122,15 +108,147 @@ let ui = {
|
|||
},
|
||||
};
|
||||
|
||||
/* sky library v0.2.3
|
||||
needs ui */
|
||||
|
||||
let fix = {}; /* Global for sky library */
|
||||
|
||||
/* sky library v0.1.0 */
|
||||
let sky = {
|
||||
let skys = {
|
||||
sats: [],
|
||||
snum: 0,
|
||||
sats_used: 0,
|
||||
sky_start: -1,
|
||||
|
||||
reset: function() {
|
||||
this.snum = 0;
|
||||
this.sats = [];
|
||||
this.sats_used = 0;
|
||||
},
|
||||
parseSats: function(s) {
|
||||
let view = 1 * s[3];
|
||||
let k = Math.min(4, view - this.snum);
|
||||
for (let i = 4, j = 0; j < k; j++) {
|
||||
let sat = { id: s[i++], ele: 1 * s[i++], azi: 1 * s[i++], snr: s[i++] };
|
||||
if (sat.snr === "")
|
||||
sat.snr = 0;
|
||||
if (sat.snr >= this.snrLim) {
|
||||
this.sats_used++;
|
||||
print(sat.id, sat.snr);
|
||||
}
|
||||
this.sats[this.snum++] = sat;
|
||||
}
|
||||
},
|
||||
|
||||
snrSort: function() {
|
||||
return this.sats.slice(0, this.snum).sort((a, b) => b.snr - a.snr);
|
||||
},
|
||||
getSatSNR: function(n) { /* Get n-th strongest sat */
|
||||
if (n <= 0 || n > this.sats.length)
|
||||
return -1;
|
||||
|
||||
// Sort the satellites by snr in descending order
|
||||
let sortedSats = this.snrSort();
|
||||
|
||||
// Return the SNR of the n-th strongest satellite
|
||||
return sortedSats[n - 1].snr;
|
||||
},
|
||||
qualest: function() {
|
||||
// Sort the satellites by snr in descending order
|
||||
let sortedSats = this.snrSort();
|
||||
if (sortedSats[4] && sortedSats[4].snr) {
|
||||
return "" + sortedSats[4].snr + "dB";
|
||||
}
|
||||
for (let i=4; i>=0; i--) {
|
||||
if (sortedSats[i] && sortedSats[i].snr)
|
||||
return "S" + (i+1);
|
||||
}
|
||||
return "U" + this.snum;
|
||||
},
|
||||
satVisibility: [],
|
||||
trackSatelliteVisibility: function() {
|
||||
const threshold = this.snrLim; // SNR threshold
|
||||
const now = getTime();
|
||||
let newVisibility = [];
|
||||
//this.satVisibility = [];
|
||||
for (let i = 0; i < this.snum; i++) {
|
||||
let sat = this.sats[i];
|
||||
let existingSat = this.satVisibility[sat.id];
|
||||
if (sat.snr >= threshold) {
|
||||
if (!existingSat) {
|
||||
// New satellite starts visibility
|
||||
newVisibility[sat.id] = { start: now, visible: true };
|
||||
} else
|
||||
newVisibility[sat.id] = this.satVisibility[sat.id];
|
||||
}
|
||||
}
|
||||
this.satVisibility = newVisibility;
|
||||
},
|
||||
getnthLowestStartTimeSat: function(n) {
|
||||
// Collect all satellites from visibility
|
||||
let satellites = Object.values(this.satVisibility);
|
||||
|
||||
// Ensure we have at least 5 satellites
|
||||
if (satellites.length < n)
|
||||
return -1;
|
||||
|
||||
// Sort satellites by start time in ascending order
|
||||
satellites.sort((a, b) => a.start - b.start);
|
||||
|
||||
// Return the satellite with the 5th lowest start time
|
||||
return satellites[n-1]; // 0-based index, so 5th is index 4
|
||||
},
|
||||
goodest: function () {
|
||||
let s = this.getnthLowestStartTimeSat(5);
|
||||
if (s==-1)
|
||||
return "";
|
||||
let t = getTime() - s.start;
|
||||
return "" + t + "s";
|
||||
},
|
||||
summary: function () {
|
||||
let s = this.goodest();
|
||||
if (s != "")
|
||||
return s;
|
||||
return this.qualest();
|
||||
},
|
||||
onEnd: function () {
|
||||
this.trackSatelliteVisibility();
|
||||
if (this.sats_used < 5)
|
||||
this.sky_start = getTime();
|
||||
this.reset();
|
||||
},
|
||||
};
|
||||
|
||||
function deepCopy(obj) {
|
||||
if (obj === null || typeof obj !== "object") {
|
||||
return obj; // Return primitive values as-is
|
||||
}
|
||||
|
||||
if (Array.isArray(obj)) {
|
||||
return obj.map(deepCopy); // Handle arrays recursively
|
||||
}
|
||||
|
||||
const copy = {};
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
copy[key] = deepCopy(obj[key]); // Recursively copy properties
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
let sky = {
|
||||
this_usable: 0,
|
||||
debug: 0,
|
||||
all: skys, /* Sattelites from all systems */
|
||||
split: 1,
|
||||
|
||||
init: function () {
|
||||
if (this.split) {
|
||||
this.s_gp = deepCopy(skys);
|
||||
this.s_gl = deepCopy(skys);
|
||||
this.s_bd = deepCopy(skys);
|
||||
}
|
||||
},
|
||||
|
||||
drawGrid: function() {
|
||||
g.setColor(0,0,0);
|
||||
|
@ -140,7 +258,8 @@ let sky = {
|
|||
ui.radCircle(1.0);
|
||||
},
|
||||
|
||||
snrLim: 28,
|
||||
/* 18.. don't get reliable fix in 40s */
|
||||
snrLim: 22,
|
||||
drawSat: function(s) {
|
||||
let a = s.azi / 360;
|
||||
let e = ((90 - s.ele) / 90);
|
||||
|
@ -160,8 +279,6 @@ let sky = {
|
|||
// https://in-the-sky.org//satmap_radar.php?year=2023&month=10&day=24&skin=1
|
||||
decorate: function() {},
|
||||
drawSats: function(sats) {
|
||||
if (ui.display != 0)
|
||||
return;
|
||||
g.reset()
|
||||
.setColor(1, 1, 1)
|
||||
.fillRect(0, ui.wi, ui.w, ui.y2)
|
||||
|
@ -172,45 +289,36 @@ let sky = {
|
|||
|
||||
if (fix && fix.fix && fix.lat) {
|
||||
g.setColor(0, 0, 0)
|
||||
.setFontAlign(-1, 1);
|
||||
.setFontAlign(-1, 1);
|
||||
g.drawString(fix.satellites + "/" + fix.hdop, 5, ui.y2);
|
||||
}
|
||||
this.decorate();
|
||||
},
|
||||
|
||||
parseSats: function(s) {
|
||||
let view = 1 * s[3];
|
||||
let k = Math.min(4, view - this.snum);
|
||||
for (let i = 4, j = 0; j < k; j++) {
|
||||
let sat = { id: s[i++], ele: 1 * s[i++], azi: 1 * s[i++], snr: s[i++] };
|
||||
if (sat.snr === "")
|
||||
sat.snr = 0;
|
||||
if (sat.snr >= this.snrLim) {
|
||||
this.sats_used++;
|
||||
print(sat.id, sat.snr);
|
||||
}
|
||||
this.sats[this.snum++] = sat;
|
||||
}
|
||||
},
|
||||
|
||||
old_msg: {},
|
||||
msg: {},
|
||||
tof: function(v) { let i = (1*v); return i.toFixed(0); },
|
||||
fmtSys: function(sys) {
|
||||
if (sys && sys.sent !== undefined && sys.d23 !== undefined)
|
||||
return sys.sent + "." + sys.d23 + "D "+ this.tof(sys.pdop) + " " + this.tof(sys.vdop) + "\n";
|
||||
else
|
||||
return "(no data)\n";
|
||||
tof: function(v, n) { let i = (1*v); return i.toFixed(n); },
|
||||
tof0: function(v) { return this.tof(v, 0); },
|
||||
tof1: function(v) { return this.tof(v, 1); },
|
||||
fmtSys: function(sys, sats) {
|
||||
if (!sys.sent)
|
||||
return " off\n";
|
||||
let r = sys.sent + " ";
|
||||
// r+= sys.d23 + "D ";
|
||||
if (sats)
|
||||
// r += sats.sats_used + "/" + sats.snum;
|
||||
r += sats.summary();
|
||||
return r + "\n";
|
||||
},
|
||||
display: function() {
|
||||
if (ui.display != 1)
|
||||
return;
|
||||
drawRace: function() {
|
||||
let m = this.old_msg;
|
||||
let msg = "" + this.tof(m.time) + "\n" +
|
||||
"q" + m.quality + " " + m.in_view + " " + m.hdop + "\n" +
|
||||
"gp"+ this.fmtSys(m.gp) +
|
||||
"bd" + this.fmtSys(m.bd) +
|
||||
"gl" + this.fmtSys(m.gl);
|
||||
let msg = "gmt" + this.tof0(m.time) + "\n" +
|
||||
"q" + m.quality + " S" + m.in_view + " h" + this.tof0(m.hdop) + "m\n" +
|
||||
/* "v" + this.tof0(m.vdop) + "m " + "p" + this.tof0(m.pdop) + "m\n" + */
|
||||
this.all.summary() + "\n" +
|
||||
"gp"+ this.fmtSys(m.gp, this.s_gp) +
|
||||
"bd" + this.fmtSys(m.bd, this.s_bd) +
|
||||
"gl" + this.fmtSys(m.gl, this.s_gl);
|
||||
if (this.msg.finished != 1)
|
||||
msg += "!";
|
||||
g.reset().clear().setFont("Vector", 30)
|
||||
|
@ -218,37 +326,68 @@ let sky = {
|
|||
.setFontAlign(-1, -1)
|
||||
.drawString(msg, 0, 0);
|
||||
},
|
||||
drawEstimates: function() {
|
||||
/*
|
||||
Performance Assessment of GNSS Signals in terms of Time to
|
||||
First Fix for Cold, Warm and Hot Start Matteo Paonni, Marco Anghileri,
|
||||
Stefan Wallner, José-Ángel Ávila-Rodríguez, Bernd Eissfeller Institute
|
||||
of Geodesy and Navigation, University FAF Munich, Germany
|
||||
|
||||
=> 22 to 26 dB -- long time / no fix / ...
|
||||
=> 26db + -- basically strength no longer matters
|
||||
*/
|
||||
let r = this.all.qualest();
|
||||
let r1 = this.all.goodest();
|
||||
print(r, r1, this.old_msg.hdop, this.old_msg.quality);
|
||||
ui.drawMsg(r + "\n" + r1 + "\n" + this.old_msg.hdop + "-" + this.old_msg.quality + "d\n" + (getTime() - this.all.sky_start));
|
||||
},
|
||||
onMessageEnd: function() {},
|
||||
messageEnd: function() {
|
||||
this.old_msg = this.msg;
|
||||
this.msg = {};
|
||||
this.msg.gp = {};
|
||||
this.msg.bd = {};
|
||||
this.msg.gl = {};
|
||||
this.onMessageEnd();
|
||||
//print(this.sats);
|
||||
this.all.onEnd();
|
||||
if (this.split) {
|
||||
this.s_gp.onEnd();
|
||||
this.s_gl.onEnd();
|
||||
this.s_bd.onEnd();
|
||||
}
|
||||
},
|
||||
parseRaw: function(msg, lost) {
|
||||
//print(msg);
|
||||
if (lost) print("## data lost");
|
||||
let s = msg.split(",");
|
||||
// print(getTime(), s[0]);
|
||||
//return;
|
||||
let cmd = s[0].slice(3);
|
||||
//print("cmd", cmd);
|
||||
if (cmd === "RMC") {
|
||||
/* Repeat of position/speed/course */
|
||||
this.messageEnd();
|
||||
return;
|
||||
}
|
||||
if (cmd === "GGA") {
|
||||
this.old_msg = this.msg;
|
||||
this.msg = {};
|
||||
this.msg.time = s[1];
|
||||
this.msg.quality = s[6];
|
||||
this.msg.in_view = s[7];
|
||||
this.msg.hdop = s[8];
|
||||
this.msg.gp = {};
|
||||
this.msg.bd = {};
|
||||
this.msg.gl = {};
|
||||
print("-----------------------------------------------");
|
||||
print("GGA Time", s[1], "fix quality", s[4], "sats in view ", s[5]);
|
||||
this.drawSats(this.sats);
|
||||
if (this.sats_used < 5)
|
||||
this.sky_start = getTime();
|
||||
this.snum = 0;
|
||||
this.sats = [];
|
||||
this.sats_used = 0;
|
||||
|
||||
if (this.debug > 0) {
|
||||
print("-----------------------------------------------");
|
||||
print("GGA Time", s[1], "fix quality", s[4], "sats in view ", s[5]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (cmd === "GLL") return; /* Position lat/lon */
|
||||
if (cmd === "GSA") {
|
||||
/*
|
||||
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,4*04
|
||||
$GNGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5,4*04
|
||||
0 1 2 15 16 17 18
|
||||
*/
|
||||
*/
|
||||
/* Satelites used, fix type! INTERESTING */
|
||||
let sys = s[18];
|
||||
let add = {};
|
||||
|
@ -256,41 +395,48 @@ let sky = {
|
|||
add.pdop = s[15];
|
||||
add.hdop = s[16];
|
||||
add.vdop = s[17];
|
||||
sys = sys[0];
|
||||
/* FIXME -- should really add to the sentence */
|
||||
if (sys == 1) { this.msg.gp = add; }
|
||||
else if (sys == 2) { this.msg.gl = add; }
|
||||
else if (sys == 4) { this.msg.bd = add; }
|
||||
else print("GSA Unknown system\n");
|
||||
|
||||
print(msg);
|
||||
else {
|
||||
print("GSA Unknown system -- ", sys, "\n");
|
||||
print(msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (s[0] === "$GPGSV") {
|
||||
print("Have gps sentences", s[1], "/", s[2]);
|
||||
this.parseSats(s);
|
||||
if (this.debug > 0)
|
||||
print("Have gps sentences", s[1], "/", s[2]);
|
||||
this.all.parseSats(s);
|
||||
if (this.split)
|
||||
this.s_gp.parseSats(s);
|
||||
this.msg.gp.sent = ""+s[2];
|
||||
return;
|
||||
}
|
||||
if (s[0] === "$BDGSV") {
|
||||
print("Have baidu sentences", s[1], "/", s[2]);
|
||||
this.parseSats(s);
|
||||
if (this.debug > 0)
|
||||
print("Have baidu sentences", s[1], "/", s[2]);
|
||||
this.all.parseSats(s);
|
||||
if (this.split)
|
||||
this.s_bd.parseSats(s);
|
||||
this.msg.bd.sent = ""+s[2];
|
||||
return;
|
||||
}
|
||||
if (s[0] === "$GLGSV") {
|
||||
print("Have glonass sentences", s[1], "/", s[2]);
|
||||
this.parseSats(s);
|
||||
if (this.debug > 0)
|
||||
print("Have glonass sentences", s[1], "/", s[2]);
|
||||
this.all.parseSats(s);
|
||||
if (this.split)
|
||||
this.s_gl.parseSats(s);
|
||||
this.msg.gl.sent = ""+s[2];
|
||||
return;
|
||||
}
|
||||
if (cmd === "RMC") return; /* Repeat of position/speed/course */
|
||||
|
||||
if (cmd === "VTG") return; /* Speeds in knots/kph */
|
||||
if (cmd === "ZDA") return; /* Time + timezone */
|
||||
if (cmd === "TXT") {
|
||||
this.msg.finished = 1;
|
||||
return; /* Misc text? antena open */
|
||||
}
|
||||
|
||||
if (cmd === "TXT") return; /* Misc text? antena open */
|
||||
print(msg);
|
||||
},
|
||||
casic_cmd: function (cmd) {
|
||||
|
@ -314,20 +460,32 @@ let sky = {
|
|||
|
||||
function start() {
|
||||
Bangle.setGPSPower(1);
|
||||
Bangle.on('GPS-raw', function(a, b) { sky.parseRaw(a, b); });
|
||||
Bangle.on('GPS-raw', (a, b) => sky.parseRaw(a, b));
|
||||
setTimeout(function() {
|
||||
Bangle.removeAllListeners('GPS-raw');
|
||||
}, 1000000);
|
||||
setInterval(function() { sky.display(); }, 1000);
|
||||
}
|
||||
|
||||
function onMessage() {
|
||||
/* quality.updateGps(); /* FIXME -- for skyspy
|
||||
if (ui.display == 4)
|
||||
sky.drawEstimates();
|
||||
*/
|
||||
if (ui.display == 0)
|
||||
sky.drawSats(sky.all.sats);
|
||||
if (ui.display == 1)
|
||||
sky.drawRace();
|
||||
}
|
||||
|
||||
// CASIC_CMD("$PCAS06,0"); /* Query product information */
|
||||
setTimeout(() => sky.casic_cmd("$PCAS04,7"), 1000); /* Enable gps + beidou + glonass */
|
||||
setTimeout(() => sky.casic_cmd("$PCAS03,1,1,1,1,1,1,1,1"), 1000); /* Enable gps + beidou + glonass */
|
||||
setTimeout(() => sky.casic_cmd("$PCAS03,1,1,1,1,1,1,1,1"), 1500); /* Enable all messages */
|
||||
|
||||
//setTimeout(() => sky.casic_cmd("$PCAS10,2"), 1200); /* 2: cold start, 1 warm start, 0: hot start */
|
||||
|
||||
ui.init();
|
||||
ui.topLeft = () => sky.selectSpace();
|
||||
Bangle.on("drag", (b) => ui.touchHandler(b));
|
||||
sky.onMessageEnd = onMessage;
|
||||
sky.init();
|
||||
start();
|
||||
|
|
|
@ -11,3 +11,4 @@ when fastloading.
|
|||
0.10: Some refactoring to shorten the code.
|
||||
0.11: Further refactoring to shorten the code. Fixed search and play that was broken in v0.10.
|
||||
0.12: Fix some warnings from the linter.
|
||||
0.13: Move ui-handlers inside setUI-call.
|
||||
|
|
|
@ -14,7 +14,6 @@ let gfx = function() {
|
|||
widgetUtils.hide();
|
||||
R = Bangle.appRect;
|
||||
const MARIGIN = 8;
|
||||
// g.drawString(str, x, y, solid)
|
||||
g.clearRect(R);
|
||||
g.reset();
|
||||
|
||||
|
@ -100,23 +99,17 @@ let swipeHandler = function(LR, _) {
|
|||
|
||||
// Navigation input on the main layout
|
||||
let setUI = function() {
|
||||
// Bangle.setUI code from rigrig's smessages app for volume control: https://git.tubul.net/rigrig/BangleApps/src/branch/personal/apps/smessages/app.js
|
||||
Bangle.setUI(
|
||||
{mode : "updown",
|
||||
remove : ()=>{
|
||||
Bangle.removeListener("touch", touchHandler);
|
||||
Bangle.removeListener("swipe", swipeHandler);
|
||||
clearWatch(buttonHandler);
|
||||
widgetUtils.show();
|
||||
}
|
||||
touch: touchHandler,
|
||||
swipe: swipeHandler,
|
||||
btn: ()=>load(),
|
||||
remove : ()=>widgetUtils.show(),
|
||||
},
|
||||
ud => {
|
||||
if (ud) Bangle.musicControl(ud>0 ? "volumedown" : "volumeup");
|
||||
}
|
||||
);
|
||||
Bangle.on("touch", touchHandler);
|
||||
Bangle.on("swipe", swipeHandler);
|
||||
let buttonHandler = setWatch(()=>{load();}, BTN, {edge:'falling'});
|
||||
};
|
||||
|
||||
// Get back to the main layout
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "spotrem",
|
||||
"name": "Remote for Spotify",
|
||||
"version": "0.12",
|
||||
"version": "0.13",
|
||||
"description": "Control spotify on your android device.",
|
||||
"readme": "README.md",
|
||||
"type": "app",
|
||||
|
|
Loading…
Reference in New Issue