1
0
Fork 0

Merge remote-tracking branch 'official/master' into official

master
David Volovskiy 2025-02-02 09:33:07 -05:00
commit 9e88c40f4a
19 changed files with 498 additions and 198 deletions

View File

@ -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

View File

@ -0,0 +1 @@
require("heatshrink").decompress(atob("mEwwcBkmSpIC/AS0nwEHCh5yBggROgP4jgROh1ICKWT4Hkz0AC4NPgFypPgAQIRDyBLBCIMAiVAgECpAGBCInwn4RBg4dBoH/yV4j+ACI0Dz05kARB8gRJgARFgYRBgEB5IRKBwICCI4/8CIdJ/kCGoP+CIMPUIIRBkgRIYop9DgJHCPowDBTwUAyAREiSkBCITCOAX4CuwE5kmT4D1BBYSMByShBhwRCgEkWYQRDUIIRCUIWfEALXBCIsDCIMf+QICvEECIILBBAV5CIUcBAYRFpEEBYIRKnARIgFyHwfk+PAGogREgQIBPQMk+EACI9J/hrCyUHCIMHCJEnwAIByEBCIJrFCI/wWYIROwP5CIShECI7FBgjFDPoTFBgTXGBYICCCI6PDAX4C/ARoA="))

157
apps/denseclock/app.js Normal file
View File

@ -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();
}

BIN
apps/denseclock/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -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

View File

@ -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": [

View File

@ -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

View File

@ -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
}
})
*/

View File

@ -1 +1,2 @@
0.01: attempt to import
0.10: major updates, display satellites, display per-system satellite info

View File

@ -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

View File

@ -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

View File

@ -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",

View File

@ -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();

View File

@ -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.

View File

@ -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

View File

@ -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",