From 6da9121f24ec5655b84c92bb35c83e9f58ca83df Mon Sep 17 00:00:00 2001 From: Joseph Moroney Date: Tue, 4 Jan 2022 13:39:50 +1000 Subject: [PATCH 1/2] v1.00 - Added sonic clock app --- apps.json | 17 +++ apps/sonicclk/Changelog | 1 + apps/sonicclk/README.md | 13 ++ apps/sonicclk/app-icon.js | 1 + apps/sonicclk/app.js | 282 +++++++++++++++++++++++++++++++++++ apps/sonicclk/app.png | Bin 0 -> 372 bytes apps/sonicclk/screenshot.png | Bin 0 -> 6515 bytes 7 files changed, 314 insertions(+) create mode 100644 apps/sonicclk/Changelog create mode 100644 apps/sonicclk/README.md create mode 100644 apps/sonicclk/app-icon.js create mode 100644 apps/sonicclk/app.js create mode 100644 apps/sonicclk/app.png create mode 100644 apps/sonicclk/screenshot.png diff --git a/apps.json b/apps.json index e5e9f8f02..5856486c0 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "sonicclk", + "name": "Sonic Clock", + "version": "1.00", + "description": "A classic sonic clock featuring run, stop and wait animations.", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"sonicclk.app.js","url":"app.js"}, + {"name":"sonicclk.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/sonicclk/Changelog b/apps/sonicclk/Changelog new file mode 100644 index 000000000..396b6b3f4 --- /dev/null +++ b/apps/sonicclk/Changelog @@ -0,0 +1 @@ +1.00 Added sonic clock app \ No newline at end of file diff --git a/apps/sonicclk/README.md b/apps/sonicclk/README.md new file mode 100644 index 000000000..a381e0a07 --- /dev/null +++ b/apps/sonicclk/README.md @@ -0,0 +1,13 @@ +# Sonic Clock + +A classic sonic clock featuring run, stop and wait animations. + +![Sonic Clock screenshot](screenshot.png) + +## Usage + +- Sonic will run when the screen is unlocked +- Sonic will stop when the screen is locked +- Sonic will wait when looking at your watch face (when `Bangle.on("twist", fn)` is fired). + +### Made with love by [Joseph](https://github.com/Johoseph) 🤗 diff --git a/apps/sonicclk/app-icon.js b/apps/sonicclk/app-icon.js new file mode 100644 index 000000000..33e22971b --- /dev/null +++ b/apps/sonicclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AE0ZzIACBIgFFC7oTCylEzOIDYeZogX6LwWd7oYCAAOJC82UpoXFAAKnMC6x2CpIVFC/gSCxOYAYP///4C4X/DBIXWIIwWBDAWPAYIXedQJwG/8AgEP//wgAX2CwIADRoQXmSIoXtJAeEoi+C+lEoAcBogX7zOUondolEpvdAAQXgYIgXCAAwXlAAIYC6ENLx4XtAYMZDAvd6gWJC7IKJABgX/C74A/ADY")) diff --git a/apps/sonicclk/app.js b/apps/sonicclk/app.js new file mode 100644 index 000000000..7cd8ef448 --- /dev/null +++ b/apps/sonicclk/app.js @@ -0,0 +1,282 @@ +const vw = g.getWidth(); +const bgWidth = 384; + +const sonic = { + bpp: 4, + transparent: 1, +}; + +const defaultSonic = { + width: 36, + height: 62, + buffer: require("heatshrink").decompress(atob("iIADzIACA4gNECKYOComZxAVDogRXBQfdCQQABCLITCogRFCQIRYLAgAFCQwRQBoQCC///AYYRWGAoMBAAgRYCYf/gEAB4ICBCKrDDCL4UECMA3DolEB4IDBAAQRb7oMB7vdHIIRWCAYRCAAoRWCoozDCBQRRBQI3FERIRPPIbGBPIQiICKAQCdQRZDAYIRXCQIJB/4RDEhQRQGYP//7FEGpARQCAYREgEzERQRNAAIRCLIKkBCLg4CYoIABB5IRWAQQRcBoIODCRYRQB4INECLkRgH/ZAMACRgRSmbGBCIIFBmYWCCLAAC7oCBdgNEAgIRWBQY2B7oTBAwMzCYoRUBIIQBCQQGBHIYRUABwRRA=")), +}; + +const startingBuffers = [ + { + width: 49, + height: 63, + buffer: require("heatshrink").decompress(atob("iIAFzIAEyMRjICBABkZDAogCCxgRBxAACzOUpIzDFxmYC4WJzNEGYgyQzOd6lIDoJiNGQYwB7tEDoQxQI4NN7BPDGJ54BondQAgvPGCjDDGCQVCCAVESAOIx/4GJYuCSIQwBFwX/GJbyEAAmDn///AwJjLyDAAsz/4xBGBAvJGAfwhIwHF5QwDgAwHXwYADGB6+DAAY2EGBYzHGA8P+EAgLyKGBIBBgD3ObwVPGAMEoAwIe4+ZolEGAVEGBRfDAYOUpvd6gaBpvQF5IuBFoOJDANE7vdC4IEBF5h8DGAQABGQNBF5YuCGAgyDYZwxE6lDmcxR5gAFGINEmczF6IxCob1B+YxIF5AxCeoQxJzLNBAAQFBhOUoEDGAIxJjOQC4cJAoIvBgAwCGJIwWiEAgcwglEpOZGwgvCGBANBmcAaIJ2BC4cPC4QwIga3BmEIeoIwBDoJhDF4j5DBgIABgGIGAROBMIYvEilBGAgvDAARIBGQL0FA4IwFF4YABJQIyBoczF4lEGA0JCwWUEoPd7qBCzIwDgAwGF4YXBpvd6iyBzORGAVAgLEEF4YwCF4IwEMYMzGAjECC4YwBF4IwEycxic0GAsN7vRiMZDIQvDBwItBS4IqBGAgQBAgIXCzovCLwItBS4MwgAwCF4XTn/xGIiODF4QwCF40z/4xERwYvCGAQvF7vf+CUEEobvCAAJgEF4Xd/6UEXgTvDAANAMAwwFCwgwESBAwFC4owCF43f/vUoaSCABAvCMAv/aQKSDAA8UF4JgG7/0oIWJGAhgG/9EC5YwCSA5eKFQiQIC5sQF4QwD6hfMGpAvBL5g1IhovVGAQvUGAMEF6owBF6owB")), + }, + { + width: 42, + height: 62, + buffer: require("heatshrink").decompress(atob("iIADzIAEA4QNEAAwUSBwOIAAWZogXECjgWFzPdogECCj5pDondIggUeSAYUjCISRDCQX/CpIUTXQgAEmf/CoIUaCZIUDgAUZRoYADCkIXHCg4BBgAUZX4y+BogUCogUccwgTB7vdCwIEBFA4UTHQYACCgQACogoJCiYAFCoYTHCigTHCoQnICioaJCRwUUHYbhBHpwUTXoQTCmczCpgUTcwYUB/8zAIIUfgDeBCoQUC/4UeRYQPBCoITCHxQUXCYMAgAVBmboKCjCUCAAQPFToIUaMgOIAAIUGBoIUYCoS9DNYIVECYwUWmYVBcIYVBokRBQIUbBoLhB7pjFOYQTGCixpCAwidCCY4UVCoYGFCYIUeBwLaGCZYUVDQ4TRChA")), + }, + { + width: 34, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECCALBxAABAYIUDxAQVCQQNBogVFCDAAB7oRFCCwPCogQcNoQQCBoP/CI4QPS4gACmf/CIQQTBwwQEgGIfoQQPfIg1ECC6XFCA4ACCCYRFolECAVECCq5CbobeBAAPdCCgPECAYADoggHCCIRFB4YQQXYwSDOgwQPAAoQDBwMzmYRICB5SCGIYQZB4h0CEBoQKmf/oj/CCQQgHCB4PBAAJ1CxAWBEBAQRmYPBAgJCKCCIyCfoYQXCIKQBB4ndGoIQWiL4BgDaBS4IPBGw4QPBwQSCAgMzCoScECCg4FAAQQVB4IREABAQSAAQtGCCoRDOQYiMCBpxGCCoA==")), + }, + { + width: 44, + height: 62, + buffer: require("heatshrink").decompress(atob("iIAEzIADBAgPFCrIQBxAABAYIZDxAVfC4QSBogaFCsQAB7oWFCsAUCogVmSAQVCCQP/CxgVUYggACmf/CwQVdCYwVEgGIgAVbSoQADCsgYGCowACCroWFolECoVECr7wCAALyB7oXBAYJCJCqgUECoYADokzmYWFCrYWFNoIVceQwXDS4QUBCrYACRwQVDAoIXBCrznCMwRAFAAYpFCqf/mf/CgKZFohQGCrIACS4hFCCQ3dIgIVXIQIUDxAVIBAIVXCYJAFxGITIIVfCwMziOZAIIXEAAIVeAAQFBgBFEDITADCrUAAAoeDCwP/IAX/CrAPBog/CJQoWBHwJsFCrAWBCYpqCCgQNECqwUBCpJrCBooVUIBgABEQwVWokzChRPDCrA/NKIgxJCp4FEAB4VVA")), + }, + { + width: 38, + height: 62, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECSgNBxAABAYIWDxASZCgQPBogXFCTgAB7oTFCTQRCogSgPYQSCB4P/CZISRVIgACmf/CYQSXCAwSEgGIgASVdgbvDCToVGCQwACCS4TFolECQVECTLPCe4b4BAAPdCTARECQYADogkJCSYTFCIoSSaIwUDEYwSTAATKCCQa4GCSwRC/8zog3CehASYaIkAmYTGCSYTBCIISEBIITGCSStEZ4YSceo7PBQpASSBAQVFaBISRgChBAIIRCxAkKCSAPBeQI5CK4ITG7oJBCSgRCPoYSFCIISVTwaiEzIREEAISTABH/AAIDBG4YSce4IAB/43MCSQRD7q1CEhwSQRwS1CCTqzDWwgSTA==")), + }, + { + width: 40, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIAEA4QNEAAoTRBoOIAAWZogWECbQVFzPdogECCbpkDondIIgTcRIYThCASKDCIX/ChATSWIgAEmf/CgITYCRITDgATXQwYADCb4WHCY4BBgATXWwy1BogTCogTabYgSB7vdCoIDBEwwTSG4YACB4QACogmICaQAFCgYSGCaYSHCgQlHCagZIWIISNCaQ5DmYTB/8zCbq0DogThbYgTDExwTQWIszmazKCagWFbQNEgATcHwpoBomZgAULCaYUFgA8SCZlE7q5DHIITdBQPda4ITDRpQTXMQoUJCbLhCCgUzCgwTWCgIJFMxATVCgQABBYoACCa4IEBQwAICZwA=")), + }, + { + width: 36, + height: 60, + buffer: require("heatshrink").decompress(atob("iIANzIPOCI+ZABWICKwTDxGZogDBAAIRaHAfdCQoRXKQdECLhWCBIQRBAgP/CQwRQB4YAFmf/CQQRUK4YRIgGIgARUdIoReCQgRGAAQRVCQtEogRCogRXBoLqEdYIAB7oRWCAczmYRCAAdEEQ4RNOIR4CCQoQECKJxBogQCCIJcCPYPdCKo1CCIwIBG4QRUSYZ8BGgszUoQRSFIQSBdQbGDQQIVBCKIQCGILJCCAYRBRIKuCCKf/xARIiIRYK4ZYExBYDCKjDBxGICQdEAYQQCCKjcBBQKjFGgayDCKYAGT4gRSCQYRICAgRVCRYRYcIIRdCQSZCG44YFCKArCEiARQAAYTCChwRKA==")), + }, + { + width: 34, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECCALBxAABAYIUDxAQVCQQNBogVFCDAAB7oRFCCwPCogQcNoQQCBoP/CI4QPS4gACmf/CIQQTBwwQEgGIfoQQPfIg1ECC6XFCA4ACCCYRFolECAVECCq5C7oADCQLABCCgPBBwkACgogECBwJFCAoPDCCAPFJgJ5BKYJjECCBqBBwf/mYQBAoMzmYRCCCIpCBAIPCA4gQSB4RrBboY6CoggGCCC+DB4YQBOogQRXwYQGU4YQUSYRTEdQgQTWYQzDB4gQVKooABBwYQSRAIQECYgQCHoQQWHQIQDXYLdDCB4RELYQPDCCyOGXYIPKCCAPGCAIgOCBpBLCCKyDBxYQMA==")), + }, + { + width: 36, + height: 60, + buffer: require("heatshrink").decompress(atob("iIANzIPOCI+ZABWICKwTDxGZogDBAAIRaHAfdCQoRXKQdECLhWCBIQRBAgP/CQwRQB4YAFmf/CQQRUK4YRIgGIgARUdIoReCQgRGAAQRVCQtEogRCogRXBoLqEdYIAB7oRWCAczmYRCAAdEEQ4RNOIR4CCQoQECKJxBogQCCIJcCPYwRRGoQRGBAITCCKoACPgI0FUYQSGCJpNDdQbGDQQQRTJooQECIIMBCMMRCKhwDPIMALAoZBCLQADxAABCAQRXogOBUYgUBCLTIDAAQSB/4RYB4oAB/4QDWQYROYowADgDHCCLASGCIYJDCKI2MDQwRQCQgcGQwwRRBAIAGB44RPA==")), + }, + { + width: 34, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECCALBxAABAYIUDxAQVCQQNBogVFCDAAB7oRFCCwPCogQcNoQQCBoP/CI4QPS4gACmf/CIQQTBwwQEgGIfoQQPfIg1ECC6XFCA4ACCCYRFolECAVECCq5CbobeBAAPdCCgPDmczCAQADoggGCBkAA4RPBCIoPDCCAPDCAZXCOgoQQJYgQEBwJbBCIQQUBAIxFCCgPDboi7DEA4QPXwYPDCAJ1GCDQJCA4YQPB4hTEdQYQXgCXDB4YQVawQDBxAFBBwYQVAAYQBGAoABCCCqBBAcAAAIQGXYQQPCIcAYApACCCgPFAAX/XoQ5FCCwPBGQIPFCCIREmYOCB44QRTAabHCCAA==")), + }, +]; + +const stoppingBuffers = [ + { + width: 44, + height: 60, + buffer: require("heatshrink").decompress(atob("iIAEzIACA4gOFAAwVTCQVEzOIDIdECsAWC7oWCAAIVkogVFCwIVgNggAECsARCAQX//4VC/4WJCqg8FCgIWCAQIVdM43/gEACYICBCriVBAAQVmIg4VmIQdETAVEogZBogVhzNE7oTB7oACCoYbBCrCbECQgVFIoIVeCwcACg4VbN4xrGCrgCBBwMAC4QNBBwYVeM4IABIYYABBgIUGCqv/iK1CCQOINwdEAwIVDC4QVVmf/G4QNBCooFCCoRRBCqv//4WBCpJsECrb0DC4QVDYYgHBCq8zCohEDNAIGBCrgTBCob4DZAQGCCgYZBCqoICAAqUBdwQUCKYLaCCsACBCwP/IAP/IBQVVCgQECCgRrBmYVfAAhACe4QUOCqzwCCoKCLCrYWDCiIVWeQYVY")), + }, + { + width: 48, + height: 60, + buffer: require("heatshrink").decompress(atob("iIAEzIAFBIYQFAAwXXDAVEzOIxAaCogXlDAPdDAYZBC8wPBC4oYBC8h2FC84VBB4QCB///C4X/DBQXWIIwWBDAQCBC8AWGCQMAgAVBAQIXgOwR4DC9JLGC83/JIuIoimColEDYNEC7wYCHYIACondCoPdAAQXDDoIXYCoT7CC4gAFC4RLBC7IWHDAkACw4XZToY9CJI51EC7ZICAoIJBCAMADIQJCC8IADCAQXDbIJHBDgIWJC7AABCgOIPAdEAwIXDDJIXWCwQXFAoQXCcIIXnOwgXjDIQXDaogHBC8JKDOQIGBC8zaGAwQWDDYIXeDYkADAIPBUoX/IxAXeAQIYB/5GB/5GMC64WCAgQWCOoMzC8YAEIwVEapIXhDANEC4KONC7oYDCyYXYDAIABC7QA==")), + }, +]; + +const waitingBuffers = [ + { + width: 36, + height: 62, + offset: -1, + buffer: require("heatshrink").decompress(atob("iIADzIACA4gNECKYOComZxAVDogRXBQfdCQQABCLITCogRFCQIRYLAgAFCQwRQBoR7C/5aECKwwF/4ABBAQDBCK4TD/8AgH/HQYRUYYYRGzICCCKgUECIoDBCLA3DolEB4IDBAAQRb7oMB7vdHIIRWCAYRCAAoRWCoozDCBQRRBQI3FERIRPPIbGBPIQiICKAQCdQRZDAYIRXCQIJB/4RDEhQRQGYP//7FEGpARQCAYREgEzERQRNAAIRCLIKkBCLg4CYoIABB5IRWAQQRcBoIODCRYRQB4INECLkRgH/ZAMACRgRSmbGBCIIFBmYWCCLAAC7oCBdgNEAgIRWBQY2B7oTBAwMzCYoRUBIIQBCQQGBHIYRUABwRRA")), + }, + { + width: 38, + height: 62, + offset: 1, + buffer: require("heatshrink").decompress(atob("iIADzIACA4gNECSoPComZxAWDogSZBYfdCYQABCTYUCogSFCYISaLogAFCY4SRBwSCC/5fECTAzF/4ABBAQDBCTIUD/8AgH/HoYSWZwYSGzICCCSwVECQoDBCTQ6DolECAIDBAAQSd7oNB7vdHgISYCIYSCAAoSYCwo2DCJYSSBYI6FEhQSQQAbRBQAQkJCSIRCe4ReDAYISZCYIKB/4SDExYSRGwP//7QEHBISRCIYSEgEzEhYSOAAISCLwKtBCTw7CaAIABCBQSXAQQSeBwIPDCZgSRCAIOECT0RgH/aYMACYUzAgQSambRBBoIFBmdEgAAECSwAC7oCBfINECgIABCSwLDHIPdCgIRDEYgSWBYIRBCYSFBQwwSTABKpICR4A=")), + }, +]; + +const bg = { + width: 384, + height: 153, + bpp: 8, + transparent: 254, + buffer: require("heatshrink").decompress(atob("i4ASj0evF4pFIDKYA/AEp//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5/bx+PB5vX64RFC54v3P/4v/P/4v/P/4v/P/4v/P/4v7CY5/VHIKxZACYvvP/4v/P/4v/P4/GAAR/BAAJP/P/5P/P/5P/F8sjkYnBO4oAHP64vHGKJfdF7p//P/5//P/4dTP4dIpB//P/5//P/5//F+p/TIIpDXMIohLF95//P/5//P/4APj0eP/5//P/5//P/4vxB4Z/XAH4AfP/4A/P/4A/P/4A/P/4A/P/4A/AB5/JTIaXJWZobFDpovvP/5//P/5//P/5//P/5//P/5//AAIPFCpp/JEpoABIIZHBL7IvvR45//P/5//P/5//P/5//P/5//P/IbTP6IAbJIpLXF+Z//F/5//F/5//F/5//F/5//F/5/tAH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH4AP4wACP4IABI/5//I/5//I/5//I/5//I/5//I/6B7PoNIpBF/P/5F/P/5F/P/5F/P/5F/P/5F/AHMejx//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//AHfGAAR/BAAJH/P/5H/P/5H/P/5H/P/5H/P/5H/QPZ9BpFIIv5//Iv4Aj6XSP/4A/P/4A/P/4A96XSP/4A/ACcejx//P/5//AEplB6XSAYJ//AH5//AH5//AHJlB6XSAYJ//AH5//AH5//AGPSAARhBA4oABA4ILBA4p//AH5//AH5//AE/SAARhBA4oABA4ILBA4p//AH5//AH5//AE5dB6QACAofX64HFAoZ//AH5//AH5//AFJdB6QACAofX64HFAoZ//AH5//AH5//AFJdB6XS6/XAYIFLCYJ//AH5//AH5//AFJdB6XS6/XAYIFLCYJ//AH5//AH5//AFZfB6XS6/XhgAEA4ILBB4J//AH5//AH5//AFpfB6XS6/XhgAEA4ILBB4J//AH5//AH5//AE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")), +}; + +const topSpeed = 15; +const timeout = 200; +let currentSpeed = 0; +let currentSonic = -1; + +let drawTimeout, drawInterval; +let bgScroll = [0, null]; + +const start = () => { + if (drawTimeout) clearTimeout(drawTimeout); + if (drawInterval) clearInterval(drawInterval); + + drawInterval = setInterval(() => { + draw("start"); + bgScroll[0] += currentSpeed; + if (bgScroll[1]) bgScroll[1] += currentSpeed; + if (currentSpeed < topSpeed) currentSpeed++; + }, timeout); +}; + +const stop = () => { + if (drawTimeout) clearTimeout(drawTimeout); + if (drawInterval) clearInterval(drawInterval); + + drawInterval = setInterval(() => { + if (currentSpeed <= 0) { + clearInterval(drawInterval); + draw("reset"); + } else { + draw("stop"); + bgScroll[0] += currentSpeed; + if (bgScroll[1]) bgScroll[1] += currentSpeed; + currentSpeed--; + } + }, timeout); +}; + +const wait = () => { + currentSonic = -1; + currentSpeed = 0; + if (drawTimeout) clearTimeout(drawTimeout); + if (drawInterval) clearInterval(drawInterval); + Bangle.setLCDPower(1); + + drawInterval = setInterval(() => draw("wait"), timeout); + + setTimeout(() => { + clearInterval(drawInterval); + currentSonic = -1; + draw("reset"); + }, 7500); +}; + +const queueDraw = () => { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + draw("reset"); + }, 60000 - (Date.now() % 60000)); +}; + +const drawSonic = (action) => { + let target; + + if (action === "reset" || currentSonic === -1) { + target = defaultSonic; + } else if (action === "start") { + target = startingBuffers[currentSonic]; + } else if (action === "stop") { + if (currentSonic > 1) currentSonic = 0; + target = stoppingBuffers[currentSonic]; + } else { + target = waitingBuffers[currentSonic]; + } + + sonic.width = target.width; + sonic.height = target.height; + sonic.buffer = target.buffer; + sonic.offset = target.offset; + + g.drawImage( + sonic, + vw / 2 - 30 + (50 - sonic.width) + (sonic.offset || 0), + 86 + (65 - sonic.height) + ); + + if (action === "start") { + if (currentSonic === startingBuffers.length - 1) { + currentSonic = 6; + } else { + currentSonic++; + } + } else if (action === "stop") { + if (currentSpeed <= 2) { + currentSonic = -1; + } else if (currentSpeed <= 14) { + currentSonic = 1; + } else { + currentSonic = 0; + } + } else { + if (currentSonic === waitingBuffers.length - 1) { + currentSonic = 0; + } else { + currentSonic++; + } + } +}; + +const drawTime = () => { + const x = vw / 2; + const y = 24 + 25; + + const date = new Date(); + const timeStr = require("locale").time(date, 1); + const dateStr = require("locale").date(date).toUpperCase(); + + g.setColor("#000"); + g.setFontAlign(0, 0).setFont("6x8", 5); + g.drawString(timeStr, x + 3, y + 2); + + g.setFont("6x8", 1.5); + g.drawString(dateStr, x + 1, y + 29); + + g.setColor("#fff"); + g.setFontAlign(0, 0).setFont("6x8", 5); + g.drawString(timeStr, x, y); + + g.setFont("6x8", 1.5); + g.drawString(dateStr, x, y + 28); +}; + +const draw = (action) => { + if (bgWidth - bgScroll[0] < 0) { + bgScroll[0] = bgScroll[1]; + bgScroll[1] = null; + } + + g.drawImage(bg, -bgScroll[0], 24); + + if (bgWidth - bgScroll[0] < vw) { + bgScroll[1] = bgScroll[0] - bgWidth; + g.drawImage(bg, -bgScroll[1], 24); + } + + drawSonic(action); + drawTime(); + if (action === "reset") queueDraw(); +}; + +g.setTheme({ bg: "#0099ff", fg: "#fff", dark: true }).clear(); + +Bangle.on("lock", (locked) => { + if (locked) { + stop(); + } else { + start(); + } +}); + +Bangle.on("twist", () => wait()); + +Bangle.setOptions({ + lockTimeout: 10000, + backlightTimeout: 12000, +}); + +Bangle.setUI("clock"); + +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +draw("reset"); + +if (Bangle.isLocked()) { + stop(); +} else { + start(); +} diff --git a/apps/sonicclk/app.png b/apps/sonicclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..db359d1e58f497a51b621957bf476af89b6c846f GIT binary patch literal 372 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 Z;6HQd1dbxxA@~3Q002ovPDHLkV1fs|jBNk_ literal 0 HcmV?d00001 From 704ef337610a1ea142ec798bc9fef3713061df2f Mon Sep 17 00:00:00 2001 From: Joseph Moroney Date: Wed, 5 Jan 2022 01:01:49 +1000 Subject: [PATCH 2/2] patch - text alignment + twist acceleration --- apps.json | 2 +- apps/sonicclk/Changelog | 3 ++- apps/sonicclk/app.js | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 5856486c0..3807b8663 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "sonicclk", "name": "Sonic Clock", - "version": "1.00", + "version": "1.01", "description": "A classic sonic clock featuring run, stop and wait animations.", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/sonicclk/Changelog b/apps/sonicclk/Changelog index 396b6b3f4..7c83f6988 100644 --- a/apps/sonicclk/Changelog +++ b/apps/sonicclk/Changelog @@ -1 +1,2 @@ -1.00 Added sonic clock app \ No newline at end of file +1.00 Added sonic clock app +1.01 Fixed text alignment issue; Increased acceleration required to activate twist; \ No newline at end of file diff --git a/apps/sonicclk/app.js b/apps/sonicclk/app.js index 7cd8ef448..296677281 100644 --- a/apps/sonicclk/app.js +++ b/apps/sonicclk/app.js @@ -106,11 +106,12 @@ const timeout = 200; let currentSpeed = 0; let currentSonic = -1; -let drawTimeout, drawInterval; +let drawTimeout, drawInterval, waitTimeout; let bgScroll = [0, null]; const start = () => { if (drawTimeout) clearTimeout(drawTimeout); + if (waitTimeout) clearTimeout(waitTimeout); if (drawInterval) clearInterval(drawInterval); drawInterval = setInterval(() => { @@ -147,7 +148,7 @@ const wait = () => { drawInterval = setInterval(() => draw("wait"), timeout); - setTimeout(() => { + waitTimeout = setTimeout(() => { clearInterval(drawInterval); currentSonic = -1; draw("reset"); @@ -215,7 +216,7 @@ const drawTime = () => { const y = 24 + 25; const date = new Date(); - const timeStr = require("locale").time(date, 1); + const timeStr = require("locale").time(date, 1).trim(); const dateStr = require("locale").date(date).toUpperCase(); g.setColor("#000"); @@ -266,6 +267,7 @@ Bangle.on("twist", () => wait()); Bangle.setOptions({ lockTimeout: 10000, backlightTimeout: 12000, + twistThreshold: 1600, }); Bangle.setUI("clock");