1
0
Fork 0
BangleApps/apps/meridian/app.js

136 lines
4.2 KiB
JavaScript
Raw Normal View History

2024-04-09 08:03:16 +00:00
2024-04-09 11:04:59 +00:00
function getArcXY(centerX,centerY,radius,angle){
var s,r = [];
s = 2 * Math.PI * angle / 360;
2024-04-09 08:03:16 +00:00
r.push(centerX + Math.round(Math.cos(s) * radius));
r.push(centerY + Math.round(Math.sin(s) * radius));
return r;
}
2024-04-09 11:04:59 +00:00
function getArc(centerX,centerY,radius,startAngle,endAngle){
var r = [], actAngle = startAngle;
var stepAngle = (radius + radius) * Math.PI / 60;
2024-04-09 08:03:16 +00:00
stepAngle = 6;
2024-04-09 11:04:59 +00:00
while(actAngle < endAngle){
r = r.concat(getArcXY(centerX,centerY,radius,actAngle));
2024-04-09 08:03:16 +00:00
actAngle += stepAngle;
2024-04-09 11:04:59 +00:00
actAngle = Math.min(actAngle,endAngle);
2024-04-09 08:03:16 +00:00
}
2024-04-09 11:04:59 +00:00
return r.concat(getArcXY(centerX,centerY,radius,endAngle));
2024-04-09 08:03:16 +00:00
}
2024-04-09 11:04:59 +00:00
let clockInfoItems = require("clock_info").load();
clockInfoItems[0].items.unshift({
name : "BatteryRing",
hasRange : true,
get : () => {
var s = 30;
var mid=s/2;
var v = E.getBattery();
var img;
var g = Graphics.createArrayBuffer(s,s,4);
const outerarc = getArc(mid,mid,14,-90,Math.max(v*3.6, 10)-90);
const innerarc = getArc(mid,mid,11,-92,Math.max(v*3.6, 10)-88);
g.reset();
g.setColor('#00FF00').fillPoly([mid, mid].concat(outerarc));
g.setColor('#000').fillPoly([mid, mid].concat(innerarc));
g.setFont("6x8").setColor('#FFF').setFontAlign(0, 0).drawString(v, mid, mid);
img = g.asImage("object");
return { v : v, min:0, max:100, img : img };
},
show : function() { },
hide : function() { },
});
function drawInfoClock(itm,info,options){
g.reset().clearRect(options.x-1, options.y-1, options.x+options.w+1, options.y+options.h+1);
if (options.focus) g.drawRect(options.x-1, options.y-1, options.x+options.w+1, options.y+options.h+1);
if (info.img) g.drawImage(info.img, options.x+options.w/2-(info.img.width||options.w)*options.scale/2,options.y, {scale:options.scale});
if(info.text) g.setFont("6x8").setFontAlign(0,1).drawString(info.text, options.x+options.w/2,options.y+options.h);
2024-04-09 08:03:16 +00:00
}
2024-04-09 11:04:59 +00:00
const topleft = require("clock_info").addInteractive(clockInfoItems, {
x : g.getWidth()*(1/4)-15, y: g.getHeight()*(1/4)-15, w: 30, h:30, scale:1,
draw : drawInfoClock
});
2024-04-09 08:03:16 +00:00
2024-04-09 11:04:59 +00:00
const topright = require("clock_info").addInteractive(clockInfoItems, {
x : g.getWidth()*(3/4)-15, y: g.getHeight()*(1/4)-15, w: 30, h:30, scale:1,
draw : drawInfoClock
});
2024-04-09 08:03:16 +00:00
2024-04-09 11:04:59 +00:00
var timeout;
function fillLine(x1,y1,x2,y2,thickness){
const angle = Math.atan2(y2 - y1, x2 - x1);
const offset_x = thickness * Math.sin(angle) / 2;
const offset_y = thickness * Math.cos(angle) / 2;
g.fillPoly([
x1 + offset_x,
y1 - offset_y,
x1 - offset_x,
y1 + offset_y,
x2 - offset_x,
y2 + offset_y,
x2 + offset_x,
y2 - offset_y
],true);
}
function draw(){
g.setTheme({fg:0xFFFF, bg:0});
if(timeout){
2024-04-09 08:03:16 +00:00
clearTimeout(timeout);
timeout = undefined;
}
g.reset().clear();
2024-04-09 11:04:59 +00:00
const mid=g.getWidth()/2;
g.drawImage(require("heatshrink").decompress(atob("2GwgIGDhwMEgPAAwk4Dg8HCpdwCqnwCo8DwAVK8AVIB4gVFgIVIB4wFKD5IPFG4pLJCosHMYiNJCozNJvAVJh4VJkAKJgT/PAH4A/AH4A/AH4A/AH4A/ADWACqngCicD/AVTh9+Cqc/n4VTv0P4AURgP4gZuSCYQrTVwNACqT/6AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4Ah//ACaMD/4VrQP4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/ADlACSMBAQPACqMDwED8AVS8EPFaUB/E/Nad+vwVTn/4CqcPNiSEDd/4A/AH4A/AH4A/AH4A/AH8gAgcB4AFDgwVJvAVJh4VJuAVJg4VJ8AVJgeACg8BCqoPEApYfECpY3EGpIlGCpEHCpfwCo6jFCoylEA=")));
topleft.redraw();
topright.redraw();
2024-04-09 08:03:16 +00:00
const now = new Date();
2024-04-09 11:04:59 +00:00
g.setFont("Vector",14);
g.setColor('#FFF');
g.setFontAlign(0,0);
2024-04-09 08:03:16 +00:00
// Date (ex. MON 8)
2024-04-09 11:04:59 +00:00
g.drawString(require("locale").dow(now, 1).toUpperCase() + " " + now.getDate(), g.getWidth()/2, g.getHeight()*(3/4));
2024-04-09 08:03:16 +00:00
2024-04-09 11:04:59 +00:00
let rhour = (now.getHours()*Math.PI/6)+(now.getMinutes()*Math.PI/30/12)-Math.PI/2;
let rmin = now.getMinutes()*Math.PI/30-Math.PI/2;
2024-04-09 08:03:16 +00:00
// Middle circle
2024-04-09 11:04:59 +00:00
g.fillCircle(mid,mid,4);
2024-04-09 08:03:16 +00:00
// Hours hand
2024-04-09 11:04:59 +00:00
fillLine(mid, mid, mid+Math.cos(rhour)*10, mid+Math.sin(rhour)*10,3);
fillLine(mid+Math.cos(rhour)*10, mid+Math.sin(rhour)*10, mid+Math.cos(rhour)*50, mid+Math.sin(rhour)*50,7);
2024-04-09 08:03:16 +00:00
// Minutes hand
2024-04-09 11:04:59 +00:00
fillLine(mid, mid, mid+Math.cos(rmin)*10, mid+Math.sin(rmin)*10,3);
fillLine(mid+Math.cos(rmin)*10, mid+Math.sin(rmin)*10, mid+Math.cos(rmin)*76, mid+Math.sin(rmin)*76,7);
if(now.getMinutes()==0){
2024-04-09 08:03:16 +00:00
Bangle.buzz();
}
2024-04-09 11:04:59 +00:00
timeout = setTimeout(()=>{
2024-04-09 08:03:16 +00:00
timeout = undefined;
draw();
}, 60000 - (Date.now() % 60000));
}
draw();
Bangle.setUI("clock");