From fa8b43c65e65e2e84c2c1f6b1f0a92190fec4b3d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 28 Sep 2022 21:12:18 +0200 Subject: [PATCH] Added linux clock --- apps/linuxclock/ChangeLog | 1 + apps/linuxclock/README.md | 1 + apps/linuxclock/app-icon.js | 1 + apps/linuxclock/app.js | 116 +++++++++++++++++++++++++++++++++ apps/linuxclock/app.png | Bin 0 -> 2529 bytes apps/linuxclock/metadata.json | 18 +++++ apps/linuxclock/screenshot.png | Bin 0 -> 3655 bytes apps/linuxclock/settings.js | 50 ++++++++++++++ 8 files changed, 187 insertions(+) create mode 100644 apps/linuxclock/ChangeLog create mode 100644 apps/linuxclock/README.md create mode 100644 apps/linuxclock/app-icon.js create mode 100644 apps/linuxclock/app.js create mode 100644 apps/linuxclock/app.png create mode 100644 apps/linuxclock/metadata.json create mode 100644 apps/linuxclock/screenshot.png create mode 100644 apps/linuxclock/settings.js diff --git a/apps/linuxclock/ChangeLog b/apps/linuxclock/ChangeLog new file mode 100644 index 000000000..3bc4ef732 --- /dev/null +++ b/apps/linuxclock/ChangeLog @@ -0,0 +1 @@ +0.01: New App. \ No newline at end of file diff --git a/apps/linuxclock/README.md b/apps/linuxclock/README.md new file mode 100644 index 000000000..a850b12a3 --- /dev/null +++ b/apps/linuxclock/README.md @@ -0,0 +1 @@ +# A Linux inspired clock diff --git a/apps/linuxclock/app-icon.js b/apps/linuxclock/app-icon.js new file mode 100644 index 000000000..1df0fa6a5 --- /dev/null +++ b/apps/linuxclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIcah0EgEB/H8iFsAoOY4kMBYMDhmGgXkAoUGiWkAoQQBoAFCjgnCAoM4hgFDuEI+wpC8EKyg1C/0eAoMAsEAiQvBAAeAApQAB/4Ao+P4v/wn0P8Pgn/wnkH4Pjv/j/nn9PH//n/nj/IFF4F88AXBAoM88EcAoPHj//jlDAoOf/+Y+YFHjnnjAjBEIIjD+BHDO9IALA==")) diff --git a/apps/linuxclock/app.js b/apps/linuxclock/app.js new file mode 100644 index 000000000..e03034931 --- /dev/null +++ b/apps/linuxclock/app.js @@ -0,0 +1,116 @@ +/************************************************ + * Includes + */ +const locale = require('locale'); + + +/************************************************ + * Assets + */ + Graphics.prototype.setFontUbuntuMono = function(scale) { + // Actual height 24 (27 - 4) + this.setFontCustom( + atob('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+A4AP/ngA/+eAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAA/gAAD+AAAAAAAAAAAAD+AAAP4AAA8AAAAAAAAAAAAAAAAAAAAAAAMGAAAwfgAD/+AB//gAP/YAA/BgAAMH4AA3/gAP/8AD/+AAPwYAADBgAAAAAAAAAAAAAEAAfA4AD+DgAf4GABxwYA+HB8D4OHwBg4YAGDzgAcH8AAgPwAAAcAAAAAAA8AAAH8BgA9wOADBjwAOccAA/3gAA94AAAPeAAD3+AAcc4AHhhgA4H+ADAfwAAAeAAAAAAAAPgADx/AAf/eAD/wYAMHBgAw+GADneYAP4/AAfB8AAA/4AADzgAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAB//AAP//AD4A+AeAA8DwAB4OAADwQAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAYOAABw8AAeB4ADwD4A+AD//wAH/8AAD/AAAAAAAAAAAAAAAAAAAAAAAAAA4AAABiAAAHcAAAPwAAP8AAA/wAAAPwAAB3AAAGIAAAYAAAAAAAAAAAAAAAAAABgAAAGAAAAYAAABgAAAGAAAP/wAA//AAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAABOAAAewAAB/AAAH4AAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAYAAABgAAAGAAAAYAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAB4AAAHgAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAB8AAA/wAAf4AAP8AAH+AAD/AAB/gAAPwAAA4AAAAAAAAAAAAAAAAAAB/AAA//gAH//AA8AeADhg4AMPBgAw8GADhg4APAHgAf/8AA//gAAfwAAAAAAAAAAAAAAAAGAAAAYAYADgBgAcAGAB//4AP//gA//+AAAAYAAABgAAAGAAAAIAAAAAAAAAAAAAAAGADgA4A+ADgH4AMA9gAwHGADA4YAOHBgA/4GAB/AYAD4BgAAAGAAAAAAAAAAAAAAABgA4AOADgA4AGADBgYAMGBgAw4GADjw4AP/ngAfv8AA8fgAAAYAAAAAAAAAAAAA4AAAPgAAD+AAAeYAADhgAA8GAAHgYAA8BgAD//4AP//gAABgAAAGAAAAAAAAAAAAAAAAAADgA/4OAD/gYAP+BgAw4GADDgYAMGDgAweeADA/wAMB+AAABgAAAAAAAAAAAAPAAAH/gAB//AAP4eABzA4AGMBgA4wGADjgYAMOHgAwf8ADA/gAAB4AAAAAAAAAAAAAAAAwAAADAAAAMADgAwB+ADA/4AMP8AAz8AADfAAAPwAAA8AAADgAAAAAAAAAAAAAAHAAD5/AAf38AD344AMHBgAwYGADBwYAOHBgA9+OAB/fwAD5/AAABwAAAAAAAAAAAHgAAA/gYAH+BgA4cGADAw4AMDDgAwMcADgzwAPD+AAf/wAA/+AAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADweAAPB4AA8HgADweAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAADgA8HMADwfwAPB+AA8HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAA8AAADwAAAPgAAB+AAAGYAAA5wAADDAAAcOAABw4AAGBgAAYGAAAAAAAAAAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAMYAAAxgAADGAAAAAAAAAAAAGBgAAYHAABwYAAHDgAAMMAAA5wAABmAAAH4AAAfgAAA8AAADwAAAGAAAAAAAAAAAAAAAAAAAAAOAAAAwAMADAZ4AMHngAw8eADngAAP8AAAfgAAAYAAAAAAAAAAAAAAAAAAP+AAH/+AA//+AHgB8A4PhwDD/jgMP/GAxwcYDmAxgPYDGAf/8YA//wAAAAAAAAGAAAD4AAD/gAB/wAA/+AAP4YAA8BgADwGAAP8YAAP/gAAH/gAAD/gAAA+AAAAYAAAAAA//+AD//4AP//gAwYGADBgYAMGBgAwYGADjw4AP/DgAfv8AA8fgAAA8AAAAAAAAAAAAfwAAH/wAA//gAHgPAA8AOADgA4AMABgAwAGADAAYAOABgA4AOABAAwAAAAAAAAAAD//4AP//gA//+ADAAYAMABgAwAGADgA4AOADgAcAcAA//gAB/8AAB/AAAAAAAAAAAAAAAAD//4AP//gA//+ADBgYAMGBgAwYGADBgYAMGBgAwYGADBgYAIABgAAAAAAAAAAAAAAA//+AD//4AP//gAwYAADBgAAMGAAAwYAADBgAAMGAAAwYAADAAAAAAAAAAAAAAH8AAB/8AAP/4AB4DwAPADgA4AOADAAYAMABgAwAGADgf4AOD/gAQP+AAAAAAAAAAA//+AD//4AP//gAAYAAABgAAAGAAAAYAAABgAAAGAAA//+AD//4AP//gAAAAAAAAAAAAAAAwAGADAAYAMABgAwAGAD//4AP//gAwAGADAAYAMABgAwAGAAAAAAAAAAAAAAAAAAQAAADAAwAOADAAYAMABgAwAGADAAYAMADgA//8AD//wAP/8AAAAAAAAAAAAAAAAAAAAD//4AP//gAAcAAADwAAAfgAAHvAAA8eAAHg+AA8A8ADgB4AIADgAAACAAAAAAAAAAA//+AD//4AP//gAAAGAAAAYAAABgAAAGAAAAYAAABgAAAGAAAAYAAAAAAAAAAAP/4AP//gA/+AAD+AAAB/AAAA+AAAD4AAB/AAA/gAAD/4AAP//gAH/+AAAAAAAAAAA//+AD//4AP//gAfAAAA+AAAA+AAAA/AAAA/AAAA/AA//+AD//4AP//gAAAAAAAAAAB/8AAP/4AB+PwAOADgA4AOADAAYAMABgA4AOADgA4AH4/AAP/4AAf/AAAAAAAAAAAAAAAAP//gA//+AD//4AMBgAAwGAADAYAAODgAA4OAAB/wAAD+AAAHwAAAAAAAAAAAAD/wAA//wAH4fgA4APADgAcAMAA8AwAD4DgAfgPAD3Afh+MA//wwA/8CAAAAAAAAAAP//gA//+AD//4AMDAAAwMAADAwAAMDgAA4fgAD/vgAH+PgAPwOAAAAYAAAAAAAAAAAAAQAD4DAAfwOAD/AYAOOBgAwYGADBwYAMDDgA4OOADgfwAEB/AAABwAAAAAAAAAAAwAAADAAAAMAAAAwAAADAAAAP//gA//+ADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAP/8AA//4AD//wAAADgAAAGAAAAYAAABgAAAGAAAA4AP//AA//4AD//AAAAAAAwAAAD4AAAP8AAAP/AAAD/gAAB/gAAAeAAAB4AAA/gAA/4AA/8AAP+AAA+AAADAAAAAAAAA//wAD//4AAf/gAAD+AAB/AAAPgAAA+AAAB/AAAA/gAB/+AD//4AP/4AAAAAAAAAAAIABgA4AeAD4H4AH5+AAH/gAAH4AAAfgAAH/gAB+fgAPgfgA4AeACAAYAAAAAAgAAADgAAAPgAAAfgAAAfgAAAfgAAAf+AAB/4AAfgAAH4AAB+AAAPgAAA4AAACAAAAAAAAAAAGADAB4AMAfgAwD+ADA+YAMHhgAx8GADPAYAP4BgA+AGADwAYAMABgAAAAAAAAAAAAAAAAAAAAAAAA////D///8MAAAwwAADDAAAMMAAAwwAADAAAAAAAAAAAAAAAAAAAAAAAA4AAAD8AAAH+AAAH/AAAD/gAAB/wAAAf4AAAP8AAAHwAAADAAAAAAAAAAAAAAAAAAAAAAAAwAADDAAAMMAAAwwAADDAAAMP///w////AAAAAAAAAAAAAAAAAAAAAAAAAGAAAA4AAAPgAAD4AAA+AAADwAAAPAAAA+AAAA+AAAA+AAAA4AAABgAAAAAAAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAADAAAAMAAAAwAAAAAAAAAAAAAAAAAAAAAAAOAAAA8AAAB4AAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAD8AAMPwAAxzgADGGAAMYYAAxhgADmGAAPYYAAf/gAA/+AAAAAAAAAAAAAAAAAAAA///gD//+AP//4AA4BgADAGAAMAYAA4DgADgeAAH/wAAP+AAAfwAAAAAAAAAAAAPgAAD/gAAf/AABwcAAOA4AA4DgADAGAAMAYAAwBgADAGAAOA4AAABgAAAAAAAAAAAH8AAA/4AAH/wAA4HgADgOAAMAYAAwBgADgGAH//4A///gD//+AAAAAAAAAAAAAAAAA/AAAP+AAB/8AAOZ4AA5jgADGGAAMYYAAxhgADmGAAH44AAfjgAAeAAAAAAAAAAAAAAAAAMAAAAwAAAf/+AH//4A///gDjAAAMMAAAwwAADDAAAMMAAA4AAABAAAAAAAAAAH8AAA/4cAH/xwA8DjADgOMAMAYwAwBjADAOcAP//wA//+AD//wAAAAAAAAAAAAAAAAAAA///gD//+AP//4AAwAAADAAAAMAAAA4AAAD4AAAH/4AAP/gAAAAAAAAAAAAAAADAAAAMAAAAwAADjAAAPP/gA8//ABj/+AAAA4AAABgAAAGAAAA4AAABAAAAAAAAAAAAAAAAAAAcAMABwAwADADAAMAMAAw8wAHDz//8PP//gY//8AAAAAAAAAAAAAAAAAAAAAAAA///gD//+AP//4AADwAAAfgAADvAAAeeAADw8AAOB4AAwDgACAGAAAAAAAAAADAAAAMAAAAwAAADAAAAP//gA///AD//+AAAA4AAABgAAAGAAAA4AAABAAAAAAAAAAAA//gAD/+AAOAAAAwAAADgAAAP8AAA/wAADAAAAMAAAA4AAAD/+AAH/4AAAAAAAAAAAAAAAA//gAD/+AAP/4AAwAAADAAAAMAAAA4AAAD4AAAH/4AAP/gAAAAAAAAAAAAAAAAfwAAD/gAAf/AADweAAOA4AAwBgADAGAAOA4AA8HgAB/8AAD/gAAH8AAAAAAAAAAAAAAAAD//8AP//wA///ADAOAAMAYAAwBgADgOAAPB4AAf/AAA/4AAB/AAAAAAAAAAAAB/AAAP+AAB/8AAPB4AA4DgADAGAAMAYAAwDgAD//8AP//wA///AAAAAAAAAAAAAAAAAAAAAAAAAf/gAD/+AAP/4AAwAAADAAAAMAAAAwAAADAAAAMAAAAAAAAAAAAAAAAAAAAAAA4OAAHw4AA/hgADOGAAMcYAAxxgADDGAAMO4AA4fAABB8AAAAAAAAAAAAAAAAAAAAAwAAADAAAD//AAP//AA//+AAMA4AAwBgADAGAAMAYAAwDgADAEAAAAAAAAAAAAAAAAP/gAA//AAAA+AAAA4AAABgAAAGAAAAYAA//gAD/+AAP/4AAAAAAAAAAAAAAAA4AAAD8AAAP8AAAH+AAAD+AAAB4AAAHgAAD8AAB/AAA/wAAD8AAAOAAAAAAAADAAAAP+AAA//gAAH+AAAD4AAB+AAAfAAAB8AAAD+AAAB+AAAP4AA//gAD/AAAMAAAAAAAACAGAAMA4AA8HgAB54AAD/AAAH4AAAPgAAD/AAAeeAADw+AAMA4AAgBgAAAAAAAAAAAgADAD4AMAP4AwAf8DAAH8cAAD/gAAD8AAB/AAB/wAA/4AAD8AAAMAAAAAAAAAAAAAAAAAAwDgADAeAAMH4AAw9gADPmAAN4YAA/BgAD4GAAPAYAAwBgAAAAAAAAAAAAAAAAAAAAAYAAABgAAAPAAD///Af/f+D/wf8MAAAwwAADDAAAMMAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///w////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAADDAAAMMAAAwwAADD/w/8H/3/gP//8AAPAAAAYAAABgAAAAAAAAAAAAAAAAADAAAA8AAADgAAAMAAAA4AAADgAAAHAAAAcAAAAwAAAHAAAA8AAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='), + 32, + atob("Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4c"), + 28+(scale<<8)+(1<<16) + ); + return this; +} + + + +/************************************************ + * Draw + */ +function draw() { + queueDraw(); + + g.clear(); + Bangle.drawWidgets(); + g.setFontUbuntuMono(); + + drawMainScreen(); +} + + +function drawCmdLine(str, line, isCmd){ + var c = 0; + var x = 10; + var y = line * 27 + 28; + if(isCmd){ + g.setColor("#0f0"); + g.drawString("bjs", x+c, y); + c += g.stringWidth("bjs"); + + g.setColor(g.theme.fg); + g.drawString(":", x+c, y); + c += g.stringWidth(":"); + + g.setColor("#0ff"); + g.drawString("~", x+c, y); + c += g.stringWidth("~"); + + g.setColor(g.theme.fg); + g.drawString("$", x+c, y); + c += g.stringWidth("$~"); + } + + g.setColor(g.theme.fg); + g.drawString(str, x+c, y); +} + +function drawMainScreen(){ + var date = new Date(); + // Draw time + + g.setFontAlign(-1, -1); + var timeStr = ("0" + date.getHours()).slice(-2) + ":" + ("0" + date.getMinutes()).slice(-2); + var dateStr = locale.month(date, 1) + ("0" + date.getDate()).slice(-2); + drawCmdLine("time", 0, true); + drawCmdLine(" [t] " + timeStr, 1); + drawCmdLine(" [d] " + dateStr, 2); + drawCmdLine(" [b] " + E.getBattery() + "%", 3); + drawCmdLine(" [s] " + Bangle.getHealthStatus("day").steps, 4); +} + + +/************************************************ + * Listener + */ +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +/************************************************ + * Startup Clock + */ + +// Show launcher when middle button pressed +Bangle.setUI("clock"); + +// Load widgets and draw clock the first time +Bangle.loadWidgets(); + + +// Draw first time +draw(); diff --git a/apps/linuxclock/app.png b/apps/linuxclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3a09cd575931498167cc76353991d772f5f20086 GIT binary patch literal 2529 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 Z@DH^w`=%+ca)|%{002ovPDHLkV1o8?(TxBA literal 0 HcmV?d00001 diff --git a/apps/linuxclock/settings.js b/apps/linuxclock/settings.js new file mode 100644 index 000000000..116253fda --- /dev/null +++ b/apps/linuxclock/settings.js @@ -0,0 +1,50 @@ +(function(back) { + const SETTINGS_FILE = "bwclk.setting.json"; + + // initialize with default settings... + const storage = require('Storage') + let settings = { + screen: "Normal", + showLock: true, + hideColon: false, + }; + let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; + for (const key in saved_settings) { + settings[key] = saved_settings[key] + } + + function save() { + storage.write(SETTINGS_FILE, settings) + } + + var screenOptions = ["Normal", "Dynamic", "Full"]; + E.showMenu({ + '': { 'title': 'BW Clock' }, + '< Back': back, + 'Screen': { + value: 0 | screenOptions.indexOf(settings.screen), + min: 0, max: 2, + format: v => screenOptions[v], + onchange: v => { + settings.screen = screenOptions[v]; + save(); + }, + }, + 'Show Lock': { + value: settings.showLock, + format: () => (settings.showLock ? 'Yes' : 'No'), + onchange: () => { + settings.showLock = !settings.showLock; + save(); + }, + }, + 'Hide Colon': { + value: settings.hideColon, + format: () => (settings.hideColon ? 'Yes' : 'No'), + onchange: () => { + settings.hideColon = !settings.hideColon; + save(); + }, + } + }); + })