diff --git a/apps/dejivaisu/ChangeLog b/apps/dejivaisu/ChangeLog new file mode 100644 index 000000000..62e2d0c20 --- /dev/null +++ b/apps/dejivaisu/ChangeLog @@ -0,0 +1 @@ +0.1: New App! \ No newline at end of file diff --git a/apps/dejivaisu/app-icon.js b/apps/dejivaisu/app-icon.js new file mode 100644 index 000000000..aa3f5f2b1 --- /dev/null +++ b/apps/dejivaisu/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4cBnnH///BIO6q2+++GoUwwmYmUkyVJAWspBhcSAgVKqOggEBA4VAwEAgnb9IRDqeQk3bvtAPAWbtv0gEP0QRCzmAFgQRDGoQEBugEB0nkUJkOxMk1IYCAAJWD7ASECIsDpILDyVgAgUB6MlhMkyEAjQxFpgEDnUoFoOQg2QgcAm3AhkAhMwCQdCNoU0kmbeYMYgKPBkwRDiQ1ByOhCIQABhuA4EELgsEwMJjmSnxrBuEGSQcgCQcNpHjxsl2XZkm44EAHAJDBtgRBtEBjlrsuS5dly4uBaoMEydtCwNog8Drcs21Zlmy8Eg3//0zdB2j0Bg3aOAQCCrgRDzFtl//pEAi1W7dt23btXIug1BmvAtf+y/9QQIRGnwyB0mSr+l/VdgPWCItIm/SQYMArt+y/r0GyCIvZg3brh6Brt1/QRIrIRBoARGywRF5IRJEYwRBI4IRCI4eSGo7FDNYdw2wRGgrFDhaPCgPSR40oYocNWYNLwCzG5TFDwEB+jOBYo/KYokAm//OIMCdItR3zFDNoMD9ADBrNlyXLsuywO1YoYACtACBhcs23LluUhuk6/8CAcAjomBgMk2Vbkmgts2ydgCIkNCIIIBI4MAjdN027CIQCCgeggFJ2AGBm3TpO17YGBg7+CgF0gUJPYNt03atOu7AMB/UpLgUOydp2matt07VtuyMBgPRkmuEgU6pk06VtmnbpM2BQMGxMkyoXBAAPpky0CyXtJoU+CIOS3YRCgbLBpMl7dsBAMB2i7CqdgggOBEYgMBRIP0CIVSpp0BNAIRC3dt2kbtsiCIVKcwoCFpAKJAVoA==")) \ No newline at end of file diff --git a/apps/dejivaisu/app.js b/apps/dejivaisu/app.js new file mode 100644 index 000000000..d67f45aee --- /dev/null +++ b/apps/dejivaisu/app.js @@ -0,0 +1,192 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-undef */ + +const storage = require('Storage'); ++require("Font8x16").add(Graphics); + +let appsettings = storage.readJSON('setting.json'); + +//MASCOT +if (appsettings.showMascot) { + var L1 = { + width : 16, height : 16, bpp : 1, + transparent : 0, + palette : new Uint16Array([65535,0]), + buffer : atob("AAAH4AgQcMiAaIDohgh4CEAQP4gpLylFGM40YlPVfn8=") + }; + var L2 = { + width : 16, height : 16, bpp : 1, + transparent : 0, + palette : new Uint16Array([65535,0]), + buffer : atob("B+AIEHDIgGiA6IYIeAhA0D8QGMgpGDnHDF0zxlKqfv4=") + }; + var R1 = { + width : 16, height : 16, bpp : 1, + transparent : 0, + palette : new Uint16Array([65535,0]), + buffer : atob("B+AIEBMOFgEXARBhEB4LAgj8ExgYlOOcujBjzFVKf34=") + }; + var R2 = { + width : 16, height : 16, bpp : 1, + transparent : 0, + palette : new Uint16Array([65535,0]), + buffer : atob("AAAH4AgQEw4WARcBEGEQHggCEfz0lKKUcxhGLKvK/n4=") + }; + + // Initial position and direction + var x = 40; + var y = 25; + var direction = 1; // 1 for right, -1 for left + var currentFrame = 0; // 0 for L1/R1, 1 for L2/R2 + var prevX = x; // Track the previous position of the sprite + + function drawSprite() { + g.clearRect(prevX, y, prevX + 32, y + 32); + if (direction === 1) { + g.drawImage(currentFrame === 0 ? R1 : R2, x, y, {scale:2}); + } else { + g.drawImage(currentFrame === 0 ? L1 : L2, x, y, {scale:2}); + } + prevX = x; + } + + function updatePosition() { + if (Math.random() < 0.3) { + direction = Math.random() < 0.5 ? -1 : 1; + } + + x += direction * 2; + + if (x > g.getWidth() - 70) { + x = g.getWidth() - 70; + direction = -1; + } else if (x < 0) { + x = 0; + direction = 1; + } + } + + function alternateFrame() { + currentFrame = 1 - currentFrame; + } +} + +//BARS + +if (appsettings.showDJSeconds) { + let barCount = 0; + let increasing = true; + + function drawBars() { + const barWidth = 5; + const barSpacing = 3; + const barHeight = 15; + const startX = (g.getWidth() - (5 * barWidth + 4 * barSpacing)) / 2 -60; + const startY = g.getHeight() / 2 + 30; + + for (let i = 0; i < barCount; i++) { + g.fillRect( + startX + i * (barWidth + barSpacing), + startY - barHeight / 2, + startX + i * (barWidth + barSpacing) + barWidth, + startY + barHeight / 2 + ); + } + } + + function updateBars() { + if (increasing) { + barCount++; + if (barCount >= 5) { + increasing = false; + } + } else { + barCount--; + if (barCount <= 0) { + increasing = true; + } + } + } +} + + +//ACTUAL WATCH + +{ +let drawTimeout; +let queueMillis = 1000; +let queueDraw = function() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + drawWatchface(); + }, queueMillis - (Date.now() % queueMillis)); +}; +let updateState = function() { + if (Bangle.isLCDOn()) { + if (Bangle.isLocked()){ + queueMillis = 60000; + } else { + queueMillis = 1000; + } + drawWatchface(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}; + +function drawWatchface() { + var date = new Date(); + var day = date.getDate(); + var month = date.getMonth() + 1; // Months are 0-indexed + var year = date.getFullYear(); + var seconds = date.getSeconds(); + + g.reset().clearRect(Bangle.appRect); + g.setFontAlign(0, 0); + g.setFontVector(60); + var timeString = require("locale").time(date, 1); + var AMPM = require("locale").meridian(new Date()).toUpperCase(); + var timeWidth = g.stringWidth(timeString)/2; + var jpclX = (g.getWidth() - timeWidth ); + var jpclY = g.getHeight() / 2; + g.drawString(timeString, jpclX, jpclY); + if (!Bangle.isLocked()) { + if (appsettings.showMascot) { + updatePosition(); + alternateFrame(); + drawSprite(); + } + if (appsettings.showDJSeconds) { + g.setFontVector(20); + g.drawString(seconds.toString().padStart(2, '0'), jpclX + timeWidth / 2+25, jpclY + 33); + updateBars(); + drawBars(); + } + g.drawString(AMPM, jpclX+60, jpclY-38); + } + queueDraw(); +} + +// Clear the screen once, at startup +g.clear(); +// Set dynamic state and perform initial drawing +updateState(); +// Register hooks for LCD on/off event and screen lock on/off event +Bangle.on('lcdPower', updateState); +Bangle.on('lock', updateState); +Bangle.setUI({ + mode: "clock", + remove: function() { + // Called to unload all of the clock app + Bangle.removeListener('lcdPower', updateState); + Bangle.removeListener('lock', updateState); + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); +} \ No newline at end of file diff --git a/apps/dejivaisu/app.png b/apps/dejivaisu/app.png new file mode 100644 index 000000000..c9bc5cbc2 Binary files /dev/null and b/apps/dejivaisu/app.png differ diff --git a/apps/dejivaisu/metadata.json b/apps/dejivaisu/metadata.json new file mode 100644 index 000000000..84f4f9c77 --- /dev/null +++ b/apps/dejivaisu/metadata.json @@ -0,0 +1,27 @@ +{ + "id": "dejivaisu", + "name": "Dejivaisu", + "version": "0.1", + "description": "A clock losely inspired by a certain digital device. Includes an (optional) animated mascot and a seconds animation.", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + { + "name": "dejivaisu.app.js", + "url": "app.js" + }, + { + "name": "dejivaisu.img", + "url": "app-icon.js", + "evaluate": true + }, + { "name":"dejivaisu.settings.js", + "url":"settings.js" + } + ], + "data": [{"name":"dejivaisu.json"}] +} diff --git a/apps/dejivaisu/screenshot.png b/apps/dejivaisu/screenshot.png new file mode 100644 index 000000000..7f465fa6e Binary files /dev/null and b/apps/dejivaisu/screenshot.png differ diff --git a/apps/dejivaisu/settings.js b/apps/dejivaisu/settings.js new file mode 100644 index 000000000..b808e47bd --- /dev/null +++ b/apps/dejivaisu/settings.js @@ -0,0 +1,28 @@ +(function back() { + const storage = require('Storage'); + // Load existing settings or initialize defaults + let settings = storage.readJSON('setting.json') || {}; + + function saveSettings() { + storage.write('setting.json', settings); + } + + E.showMenu({ + '': { 'title': 'Dejivaisu Settings' }, + 'Show Mascot': { + value: settings.showMascot, + onchange: v => { + settings.showMascot = v; + saveSettings(); + } + }, + 'Show Seconds': { + value: settings.showDJSeconds, + onchange: v => { + settings.showDJSeconds = v; + saveSettings(); + } + }, + '< Back': () => load() + }); +}) \ No newline at end of file diff --git a/apps/dejivaisu/settings.json b/apps/dejivaisu/settings.json new file mode 100644 index 000000000..09c433461 --- /dev/null +++ b/apps/dejivaisu/settings.json @@ -0,0 +1,4 @@ +{ + "showMascot": true, + "showDJSeconds": true +}