mirror of https://github.com/espruino/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"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/podadrem/app.js": {
|
|
||||||
"hash": "f7392e74974f69553aade2dcc07527b5d3b71a9b84e6dc5e0dd995e78dff8007",
|
|
||||||
"rules": [
|
|
||||||
"no-unused-vars"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/openstmap/imagefilter.js": {
|
"apps/openstmap/imagefilter.js": {
|
||||||
"hash": "8a71e9a0ecfa94150379c41a5a915cfdac39f8b2e485e5cc1ce4629e85293acd",
|
"hash": "8a71e9a0ecfa94150379c41a5a915cfdac39f8b2e485e5cc1ce4629e85293acd",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -148,13 +142,6 @@ module.exports = {
|
||||||
"no-unused-vars"
|
"no-unused-vars"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/waypoints/waypoints.app.js": {
|
|
||||||
"hash": "ff02639eb8f81784c942093d57d254295e2c78918adb4bcffdf0d0284ebfac55",
|
|
||||||
"rules": [
|
|
||||||
"no-unused-vars",
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/timerclk/timer.js": {
|
"apps/timerclk/timer.js": {
|
||||||
"hash": "3b70606f1742b34bf4769f6e8703144ff0c3ba401a3a21f97ddcab5432c94db5",
|
"hash": "3b70606f1742b34bf4769f6e8703144ff0c3ba401a3a21f97ddcab5432c94db5",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -195,12 +182,6 @@ module.exports = {
|
||||||
"no-unused-vars"
|
"no-unused-vars"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/poweroff/settings.js": {
|
|
||||||
"hash": "c197afe72c612a4b3825a3a12a628d0f4ed83823da3f28885bbf473037a02506",
|
|
||||||
"rules": [
|
|
||||||
"no-unused-vars"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/oxofocus/app.js": {
|
"apps/oxofocus/app.js": {
|
||||||
"hash": "cd29309373974ef038725e26d8a2ff2634a437c89cdffc3b12defd65a948db75",
|
"hash": "cd29309373974ef038725e26d8a2ff2634a437c89cdffc3b12defd65a948db75",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -208,13 +189,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/orloj/app.js": {
|
|
||||||
"hash": "fa43f035d759ba94f564392f410c0c6c485bb41a33c062f03d666738d517ccf3",
|
|
||||||
"rules": [
|
|
||||||
"no-unused-vars",
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/nixie/m_vatch.js": {
|
"apps/nixie/m_vatch.js": {
|
||||||
"hash": "36a7fa956f99d5815cd6bac570d2b86833d1d37474d7eef0bb21892bdf6723a8",
|
"hash": "36a7fa956f99d5815cd6bac570d2b86833d1d37474d7eef0bb21892bdf6723a8",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -490,13 +464,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/doztime/app-bangle1.js": {
|
|
||||||
"hash": "1e9598c201175180ae77d1c3bc47e8138b339b72eb58782b5057fb7aefdc88a1",
|
|
||||||
"rules": [
|
|
||||||
"no-unused-vars",
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/carcrazy/app.js": {
|
"apps/carcrazy/app.js": {
|
||||||
"hash": "fd9f98f4f9e24c63a8fa02918dceab4503edf88e06537922caf86e85884408f3",
|
"hash": "fd9f98f4f9e24c63a8fa02918dceab4503edf88e06537922caf86e85884408f3",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -587,12 +554,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/swp2clk/settings.js": {
|
|
||||||
"hash": "2d9de7ffdf171f6e7b058741046c8a326cf9d5dba651f52fcdb523214b08d626",
|
|
||||||
"rules": [
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/sunclock/app.js": {
|
"apps/sunclock/app.js": {
|
||||||
"hash": "54f49294816e06907003a71289a8b79641b1cd082044fb22bb4c4b80f6845459",
|
"hash": "54f49294816e06907003a71289a8b79641b1cd082044fb22bb4c4b80f6845459",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -617,12 +578,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/spotrem/app.js": {
|
|
||||||
"hash": "35f3ee5371acde28427fd01e191ff58108d3d9e4db1a221dca081b7a7b9c3c77",
|
|
||||||
"rules": [
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/speedalt/app.js": {
|
"apps/speedalt/app.js": {
|
||||||
"hash": "2c8a2c0d7f60a8c25ee86e943f59df8fb5816ceac00e9e077220227d8885b133",
|
"hash": "2c8a2c0d7f60a8c25ee86e943f59df8fb5816ceac00e9e077220227d8885b133",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -761,12 +716,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/owmweather/boot.js": {
|
|
||||||
"hash": "10fe98e871a7df3338fc764d62ac4db65c20c44774aad112f5faf26c7497f78e",
|
|
||||||
"rules": [
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/openwind/app.js": {
|
"apps/openwind/app.js": {
|
||||||
"hash": "91bfda771bd5cc3127ede3b52f5f088b733ac9e7fc2d8dff4f1d732e66a8af47",
|
"hash": "91bfda771bd5cc3127ede3b52f5f088b733ac9e7fc2d8dff4f1d732e66a8af47",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -917,12 +866,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/infoclk/settings.js": {
|
|
||||||
"hash": "56adc3eff3cbc04dd08238ed7e559416ebbc7736c872070c757d70bf5f31b440",
|
|
||||||
"rules": [
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/infoclk/app.js": {
|
"apps/infoclk/app.js": {
|
||||||
"hash": "27cc368eb1be14658db7fd482e78c4bc7673e2a1c68bc3a1a5f7c7e29915ca88",
|
"hash": "27cc368eb1be14658db7fd482e78c4bc7673e2a1c68bc3a1a5f7c7e29915ca88",
|
||||||
"rules": [
|
"rules": [
|
||||||
|
@ -971,12 +914,6 @@ module.exports = {
|
||||||
"no-undef"
|
"no-undef"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"apps/gpssetup/gpssetup.js": {
|
|
||||||
"hash": "a63f670f4adf04895e6837270fcf19bd56f0a6d049cfb8e3ad8928c283d1bfd3",
|
|
||||||
"rules": [
|
|
||||||
"no-undef"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"apps/glbasic/glbasic.app.js": {
|
"apps/glbasic/glbasic.app.js": {
|
||||||
"hash": "7d12a030d6f0ef69a0e5a9783229fd49c0a6a06bf751e3ac562145d2ce8350e9",
|
"hash": "7d12a030d6f0ef69a0e5a9783229fd49c0a6a06bf751e3ac562145d2ce8350e9",
|
||||||
"rules": [
|
"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(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
|
* 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
|
## 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) {
|
(function(recorders) {
|
||||||
recorders.foobar = {
|
recorders.foobar = {
|
||||||
name : "Foobar",
|
name : "Foobar", // Name to appear in UIs
|
||||||
fields : ["foobar"],
|
fields : ["foobar"], // Column headings to appear as header in recorded CSV data
|
||||||
getValues : () => [123],
|
getValues : () => [123], // Columns of data (length should match 'fields')
|
||||||
start : () => {},
|
start : () => {}, // Called when recording starts - turn on any hardware/intervals you need
|
||||||
stop : () => {},
|
stop : () => {}, // Called when recording stops - turn off any hardware/intervals
|
||||||
draw (x,y) => {} // draw 12x12px status image
|
draw (x,y) => {} // draw 12x12px status image at x,y on g
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
0.01: attempt to import
|
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
|
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
|
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",
|
{ "id": "spacer",
|
||||||
"name": "Space Race",
|
"name": "Space Race",
|
||||||
"version": "0.01",
|
"version": "0.10",
|
||||||
"description": "Compare GPS with Baido and Glonass",
|
"description": "Compare GPS with Baido and Glonass",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
|
|
|
@ -1,20 +1,6 @@
|
||||||
/* Space race */
|
/* 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
|
gsa mi rika 2d/3d fix, a taky pdop/vdop/hdop
|
||||||
|
|
||||||
CFG-NAVX z CASIC_en -- umoznuje nastavit chodec / auto / letadlo
|
CFG-NAVX z CASIC_en -- umoznuje nastavit chodec / auto / letadlo
|
||||||
|
@ -68,12 +54,12 @@ let ui = {
|
||||||
touchHandler: function(d) {
|
touchHandler: function(d) {
|
||||||
let x = Math.floor(d.x);
|
let x = Math.floor(d.x);
|
||||||
let y = Math.floor(d.y);
|
let y = Math.floor(d.y);
|
||||||
|
|
||||||
if (d.b != 1 || this.last_b != 0) {
|
if (d.b != 1 || this.last_b != 0) {
|
||||||
this.last_b = d.b;
|
this.last_b = d.b;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
print("touch", x, y, this.h, this.w);
|
print("touch", x, y, this.h, this.w);
|
||||||
|
|
||||||
if ((x<this.w/2) && (y<this.y2/2))
|
if ((x<this.w/2) && (y<this.y2/2))
|
||||||
|
@ -122,62 +108,22 @@ let ui = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* sky library v0.2.3
|
||||||
|
needs ui */
|
||||||
|
|
||||||
let fix = {}; /* Global for sky library */
|
let fix = {}; /* Global for sky library */
|
||||||
|
|
||||||
/* sky library v0.1.0 */
|
let skys = {
|
||||||
let sky = {
|
|
||||||
sats: [],
|
sats: [],
|
||||||
snum: 0,
|
snum: 0,
|
||||||
sats_used: 0,
|
sats_used: 0,
|
||||||
sky_start: -1,
|
sky_start: -1,
|
||||||
this_usable: 0,
|
|
||||||
|
|
||||||
drawGrid: function() {
|
reset: function() {
|
||||||
g.setColor(0,0,0);
|
this.snum = 0;
|
||||||
ui.radLine(0, 1, 0.5, 1);
|
this.sats = [];
|
||||||
ui.radLine(0.25, 1, 0.75, 1);
|
this.sats_used = 0;
|
||||||
ui.radCircle(0.5);
|
|
||||||
ui.radCircle(1.0);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
snrLim: 28,
|
|
||||||
drawSat: function(s) {
|
|
||||||
let a = s.azi / 360;
|
|
||||||
let e = ((90 - s.ele) / 90);
|
|
||||||
let x = ui.radX(a, e);
|
|
||||||
let y = ui.radY(a, e);
|
|
||||||
|
|
||||||
if (s.snr == 0)
|
|
||||||
g.setColor(1, 0.25, 0.25);
|
|
||||||
else if (s.snr < this.snrLim)
|
|
||||||
g.setColor(0.25, 0.5, 0.25);
|
|
||||||
else
|
|
||||||
g.setColor(0, 0, 0);
|
|
||||||
g.drawString(s.id, x, y);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Should correspond to view from below.
|
|
||||||
// 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)
|
|
||||||
.setFont("Vector", 20)
|
|
||||||
.setFontAlign(0, 0);
|
|
||||||
this.drawGrid();
|
|
||||||
sats.forEach(s => this.drawSat(s));
|
|
||||||
|
|
||||||
if (fix && fix.fix && fix.lat) {
|
|
||||||
g.setColor(0, 0, 0)
|
|
||||||
.setFontAlign(-1, 1);
|
|
||||||
g.drawString(fix.satellites + "/" + fix.hdop, 5, ui.y2);
|
|
||||||
}
|
|
||||||
this.decorate();
|
|
||||||
},
|
|
||||||
|
|
||||||
parseSats: function(s) {
|
parseSats: function(s) {
|
||||||
let view = 1 * s[3];
|
let view = 1 * s[3];
|
||||||
let k = Math.min(4, view - this.snum);
|
let k = Math.min(4, view - this.snum);
|
||||||
|
@ -193,24 +139,186 @@ let sky = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
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);
|
||||||
|
ui.radLine(0, 1, 0.5, 1);
|
||||||
|
ui.radLine(0.25, 1, 0.75, 1);
|
||||||
|
ui.radCircle(0.5);
|
||||||
|
ui.radCircle(1.0);
|
||||||
|
},
|
||||||
|
|
||||||
|
/* 18.. don't get reliable fix in 40s */
|
||||||
|
snrLim: 22,
|
||||||
|
drawSat: function(s) {
|
||||||
|
let a = s.azi / 360;
|
||||||
|
let e = ((90 - s.ele) / 90);
|
||||||
|
let x = ui.radX(a, e);
|
||||||
|
let y = ui.radY(a, e);
|
||||||
|
|
||||||
|
if (s.snr == 0)
|
||||||
|
g.setColor(1, 0.25, 0.25);
|
||||||
|
else if (s.snr < this.snrLim)
|
||||||
|
g.setColor(0.25, 0.5, 0.25);
|
||||||
|
else
|
||||||
|
g.setColor(0, 0, 0);
|
||||||
|
g.drawString(s.id, x, y);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Should correspond to view from below.
|
||||||
|
// https://in-the-sky.org//satmap_radar.php?year=2023&month=10&day=24&skin=1
|
||||||
|
decorate: function() {},
|
||||||
|
drawSats: function(sats) {
|
||||||
|
g.reset()
|
||||||
|
.setColor(1, 1, 1)
|
||||||
|
.fillRect(0, ui.wi, ui.w, ui.y2)
|
||||||
|
.setFont("Vector", 20)
|
||||||
|
.setFontAlign(0, 0);
|
||||||
|
this.drawGrid();
|
||||||
|
sats.forEach(s => this.drawSat(s));
|
||||||
|
|
||||||
|
if (fix && fix.fix && fix.lat) {
|
||||||
|
g.setColor(0, 0, 0)
|
||||||
|
.setFontAlign(-1, 1);
|
||||||
|
g.drawString(fix.satellites + "/" + fix.hdop, 5, ui.y2);
|
||||||
|
}
|
||||||
|
this.decorate();
|
||||||
|
},
|
||||||
|
|
||||||
old_msg: {},
|
old_msg: {},
|
||||||
msg: {},
|
msg: {},
|
||||||
tof: function(v) { let i = (1*v); return i.toFixed(0); },
|
tof: function(v, n) { let i = (1*v); return i.toFixed(n); },
|
||||||
fmtSys: function(sys) {
|
tof0: function(v) { return this.tof(v, 0); },
|
||||||
if (sys && sys.sent !== undefined && sys.d23 !== undefined)
|
tof1: function(v) { return this.tof(v, 1); },
|
||||||
return sys.sent + "." + sys.d23 + "D "+ this.tof(sys.pdop) + " " + this.tof(sys.vdop) + "\n";
|
fmtSys: function(sys, sats) {
|
||||||
else
|
if (!sys.sent)
|
||||||
return "(no data)\n";
|
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() {
|
drawRace: function() {
|
||||||
if (ui.display != 1)
|
|
||||||
return;
|
|
||||||
let m = this.old_msg;
|
let m = this.old_msg;
|
||||||
let msg = "" + this.tof(m.time) + "\n" +
|
let msg = "gmt" + this.tof0(m.time) + "\n" +
|
||||||
"q" + m.quality + " " + m.in_view + " " + m.hdop + "\n" +
|
"q" + m.quality + " S" + m.in_view + " h" + this.tof0(m.hdop) + "m\n" +
|
||||||
"gp"+ this.fmtSys(m.gp) +
|
/* "v" + this.tof0(m.vdop) + "m " + "p" + this.tof0(m.pdop) + "m\n" + */
|
||||||
"bd" + this.fmtSys(m.bd) +
|
this.all.summary() + "\n" +
|
||||||
"gl" + this.fmtSys(m.gl);
|
"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)
|
if (this.msg.finished != 1)
|
||||||
msg += "!";
|
msg += "!";
|
||||||
g.reset().clear().setFont("Vector", 30)
|
g.reset().clear().setFont("Vector", 30)
|
||||||
|
@ -218,37 +326,68 @@ let sky = {
|
||||||
.setFontAlign(-1, -1)
|
.setFontAlign(-1, -1)
|
||||||
.drawString(msg, 0, 0);
|
.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) {
|
parseRaw: function(msg, lost) {
|
||||||
|
//print(msg);
|
||||||
if (lost) print("## data lost");
|
if (lost) print("## data lost");
|
||||||
let s = msg.split(",");
|
let s = msg.split(",");
|
||||||
|
// print(getTime(), s[0]);
|
||||||
|
//return;
|
||||||
let cmd = s[0].slice(3);
|
let cmd = s[0].slice(3);
|
||||||
//print("cmd", cmd);
|
//print("cmd", cmd);
|
||||||
|
if (cmd === "RMC") {
|
||||||
|
/* Repeat of position/speed/course */
|
||||||
|
this.messageEnd();
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (cmd === "GGA") {
|
if (cmd === "GGA") {
|
||||||
this.old_msg = this.msg;
|
|
||||||
this.msg = {};
|
|
||||||
this.msg.time = s[1];
|
this.msg.time = s[1];
|
||||||
this.msg.quality = s[6];
|
this.msg.quality = s[6];
|
||||||
this.msg.in_view = s[7];
|
this.msg.in_view = s[7];
|
||||||
this.msg.hdop = s[8];
|
this.msg.hdop = s[8];
|
||||||
this.msg.gp = {};
|
|
||||||
this.msg.bd = {};
|
if (this.debug > 0) {
|
||||||
this.msg.gl = {};
|
print("-----------------------------------------------");
|
||||||
print("-----------------------------------------------");
|
print("GGA Time", s[1], "fix quality", s[4], "sats in view ", s[5]);
|
||||||
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;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (cmd === "GLL") return; /* Position lat/lon */
|
if (cmd === "GLL") return; /* Position lat/lon */
|
||||||
if (cmd === "GSA") {
|
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
|
0 1 2 15 16 17 18
|
||||||
*/
|
*/
|
||||||
/* Satelites used, fix type! INTERESTING */
|
/* Satelites used, fix type! INTERESTING */
|
||||||
let sys = s[18];
|
let sys = s[18];
|
||||||
let add = {};
|
let add = {};
|
||||||
|
@ -256,41 +395,48 @@ let sky = {
|
||||||
add.pdop = s[15];
|
add.pdop = s[15];
|
||||||
add.hdop = s[16];
|
add.hdop = s[16];
|
||||||
add.vdop = s[17];
|
add.vdop = s[17];
|
||||||
|
sys = sys[0];
|
||||||
/* FIXME -- should really add to the sentence */
|
/* FIXME -- should really add to the sentence */
|
||||||
if (sys == 1) { this.msg.gp = add; }
|
if (sys == 1) { this.msg.gp = add; }
|
||||||
else if (sys == 2) { this.msg.gl = add; }
|
else if (sys == 2) { this.msg.gl = add; }
|
||||||
else if (sys == 4) { this.msg.bd = add; }
|
else if (sys == 4) { this.msg.bd = add; }
|
||||||
else print("GSA Unknown system\n");
|
else {
|
||||||
|
print("GSA Unknown system -- ", sys, "\n");
|
||||||
print(msg);
|
print(msg);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (s[0] === "$GPGSV") {
|
if (s[0] === "$GPGSV") {
|
||||||
print("Have gps sentences", s[1], "/", s[2]);
|
if (this.debug > 0)
|
||||||
this.parseSats(s);
|
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];
|
this.msg.gp.sent = ""+s[2];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (s[0] === "$BDGSV") {
|
if (s[0] === "$BDGSV") {
|
||||||
print("Have baidu sentences", s[1], "/", s[2]);
|
if (this.debug > 0)
|
||||||
this.parseSats(s);
|
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];
|
this.msg.bd.sent = ""+s[2];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (s[0] === "$GLGSV") {
|
if (s[0] === "$GLGSV") {
|
||||||
print("Have glonass sentences", s[1], "/", s[2]);
|
if (this.debug > 0)
|
||||||
this.parseSats(s);
|
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];
|
this.msg.gl.sent = ""+s[2];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (cmd === "RMC") return; /* Repeat of position/speed/course */
|
|
||||||
if (cmd === "VTG") return; /* Speeds in knots/kph */
|
if (cmd === "VTG") return; /* Speeds in knots/kph */
|
||||||
if (cmd === "ZDA") return; /* Time + timezone */
|
if (cmd === "ZDA") return; /* Time + timezone */
|
||||||
if (cmd === "TXT") {
|
if (cmd === "TXT") return; /* Misc text? antena open */
|
||||||
this.msg.finished = 1;
|
|
||||||
return; /* Misc text? antena open */
|
|
||||||
}
|
|
||||||
|
|
||||||
print(msg);
|
print(msg);
|
||||||
},
|
},
|
||||||
casic_cmd: function (cmd) {
|
casic_cmd: function (cmd) {
|
||||||
|
@ -314,20 +460,32 @@ let sky = {
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
Bangle.setGPSPower(1);
|
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() {
|
setTimeout(function() {
|
||||||
Bangle.removeAllListeners('GPS-raw');
|
Bangle.removeAllListeners('GPS-raw');
|
||||||
}, 1000000);
|
}, 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 */
|
// CASIC_CMD("$PCAS06,0"); /* Query product information */
|
||||||
setTimeout(() => sky.casic_cmd("$PCAS04,7"), 1000); /* Enable gps + beidou + glonass */
|
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 */
|
//setTimeout(() => sky.casic_cmd("$PCAS10,2"), 1200); /* 2: cold start, 1 warm start, 0: hot start */
|
||||||
|
|
||||||
ui.init();
|
ui.init();
|
||||||
ui.topLeft = () => sky.selectSpace();
|
ui.topLeft = () => sky.selectSpace();
|
||||||
Bangle.on("drag", (b) => ui.touchHandler(b));
|
Bangle.on("drag", (b) => ui.touchHandler(b));
|
||||||
|
sky.onMessageEnd = onMessage;
|
||||||
|
sky.init();
|
||||||
start();
|
start();
|
||||||
|
|
|
@ -11,3 +11,4 @@ when fastloading.
|
||||||
0.10: Some refactoring to shorten the code.
|
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.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.12: Fix some warnings from the linter.
|
||||||
|
0.13: Move ui-handlers inside setUI-call.
|
||||||
|
|
|
@ -14,7 +14,6 @@ let gfx = function() {
|
||||||
widgetUtils.hide();
|
widgetUtils.hide();
|
||||||
R = Bangle.appRect;
|
R = Bangle.appRect;
|
||||||
const MARIGIN = 8;
|
const MARIGIN = 8;
|
||||||
// g.drawString(str, x, y, solid)
|
|
||||||
g.clearRect(R);
|
g.clearRect(R);
|
||||||
g.reset();
|
g.reset();
|
||||||
|
|
||||||
|
@ -100,23 +99,17 @@ let swipeHandler = function(LR, _) {
|
||||||
|
|
||||||
// Navigation input on the main layout
|
// Navigation input on the main layout
|
||||||
let setUI = function() {
|
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(
|
Bangle.setUI(
|
||||||
{mode : "updown",
|
{mode : "updown",
|
||||||
remove : ()=>{
|
touch: touchHandler,
|
||||||
Bangle.removeListener("touch", touchHandler);
|
swipe: swipeHandler,
|
||||||
Bangle.removeListener("swipe", swipeHandler);
|
btn: ()=>load(),
|
||||||
clearWatch(buttonHandler);
|
remove : ()=>widgetUtils.show(),
|
||||||
widgetUtils.show();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
ud => {
|
ud => {
|
||||||
if (ud) Bangle.musicControl(ud>0 ? "volumedown" : "volumeup");
|
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
|
// Get back to the main layout
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "spotrem",
|
"id": "spotrem",
|
||||||
"name": "Remote for Spotify",
|
"name": "Remote for Spotify",
|
||||||
"version": "0.12",
|
"version": "0.13",
|
||||||
"description": "Control spotify on your android device.",
|
"description": "Control spotify on your android device.",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"type": "app",
|
"type": "app",
|
||||||
|
|
Loading…
Reference in New Issue