Merge pull request #3769 from tonykakuuu/master
commit
d20255a544
|
|
@ -0,0 +1 @@
|
|||
0.1: New App!
|
||||
|
|
@ -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=="))
|
||||
|
|
@ -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();
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
|
|
@ -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 |
|
|
@ -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()
|
||||
});
|
||||
})
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"showMascot": true,
|
||||
"showDJSeconds": true
|
||||
}
|
||||
Loading…
Reference in New Issue