Merge pull request #3769 from tonykakuuu/master

master
Rob Pilling 2025-03-12 12:09:06 +00:00
commit d20255a544
8 changed files with 253 additions and 0 deletions

1
apps/dejivaisu/ChangeLog Normal file
View File

@ -0,0 +1 @@
0.1: New App!

View File

@ -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=="))

192
apps/dejivaisu/app.js Normal file
View File

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

BIN
apps/dejivaisu/app.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,27 @@
{
"id": "dejivaisu",
"name": "Dejivaisu",
"version": "0.1",
"description": "A clock loosely 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"}]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

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

View File

@ -0,0 +1,4 @@
{
"showMascot": true,
"showDJSeconds": true
}