2022-02-09 10:54:08 +00:00
|
|
|
var center = {
|
2022-02-05 16:55:09 +00:00
|
|
|
x: g.getWidth()/2,
|
|
|
|
y: g.getHeight()/2,
|
|
|
|
};
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var MIN = 940;
|
|
|
|
var MAX = 1090;
|
|
|
|
var NUMBER_OF_VALUES = MAX - MIN;
|
|
|
|
var SCALE_TICK_STEP = 5;
|
|
|
|
var SCALE_VALUES_STEP = 25;
|
|
|
|
var NUMBER_OF_LABELS = NUMBER_OF_VALUES / SCALE_VALUES_STEP;
|
|
|
|
var NUMBER_OF_TICKS = NUMBER_OF_VALUES / SCALE_TICK_STEP;
|
|
|
|
var ZERO_OFFSET = (Math.PI / 4) * 3;
|
|
|
|
var SCALE_SPAN = (Math.PI / 2) * 3;
|
|
|
|
var TICK_LENGTH = 10;
|
|
|
|
var HAND_LENGTH = 45;
|
|
|
|
var HAND_WIDTH = 5;
|
2022-02-05 16:55:09 +00:00
|
|
|
|
|
|
|
function generatePoly(radius, width, angle){
|
2022-02-09 10:54:08 +00:00
|
|
|
var x = center.x + Math.cos(angle) * radius;
|
|
|
|
var y = center.y + Math.sin(angle) * radius;
|
|
|
|
var d = {
|
2022-02-05 16:55:09 +00:00
|
|
|
x: width/2 * Math.cos(angle + Math.PI/2),
|
|
|
|
y: width/2 * Math.sin(angle + Math.PI/2),
|
|
|
|
};
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var poly = [center.x - d.x, center.y - d.y, center.x + d.x, center.y + d.y, x + d.x, y + d.y, x - d.x, y - d.y];
|
2022-02-05 16:55:09 +00:00
|
|
|
|
|
|
|
return poly;
|
|
|
|
}
|
|
|
|
|
|
|
|
function drawHand(value){
|
2022-02-09 10:54:08 +00:00
|
|
|
g.setColor(g.theme.fg2);
|
2022-02-05 16:55:09 +00:00
|
|
|
|
|
|
|
g.setFontAlign(0,0);
|
|
|
|
g.setFont("Vector",15);
|
|
|
|
g.drawString(value, center.x, center.y * 2 - 15, true);
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var angle = SCALE_SPAN / NUMBER_OF_VALUES * (value - MIN) + ZERO_OFFSET;
|
2022-02-05 16:55:09 +00:00
|
|
|
g.fillPoly(generatePoly(HAND_LENGTH, HAND_WIDTH, angle), true);
|
|
|
|
g.fillCircle(center.x ,center.y, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function drawTicks(){
|
2022-02-09 10:54:08 +00:00
|
|
|
g.setColor(g.theme.fg);
|
2022-02-05 16:55:09 +00:00
|
|
|
for(let i= 0; i <= NUMBER_OF_TICKS; i++){
|
2022-02-09 10:54:08 +00:00
|
|
|
var angle = (i * (SCALE_SPAN/NUMBER_OF_TICKS)) + ZERO_OFFSET;
|
2022-02-05 16:55:09 +00:00
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var tickWidth = i%5==0 ? 5 : 2;
|
2022-02-05 16:55:09 +00:00
|
|
|
g.fillPoly(generatePoly(center.x, tickWidth, angle), true);
|
|
|
|
}
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
g.setColor(g.theme.bg);
|
2022-02-05 16:55:09 +00:00
|
|
|
g.fillCircle(center.x,center.y,center.x - TICK_LENGTH);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function drawScaleLabels(){
|
2022-02-09 10:54:08 +00:00
|
|
|
g.setColor(g.theme.fg);
|
2022-02-05 16:55:09 +00:00
|
|
|
g.setFont("Vector",12);
|
2022-10-27 19:09:43 +00:00
|
|
|
g.setFontAlign(-1,-1);
|
2022-02-05 16:55:09 +00:00
|
|
|
|
|
|
|
let label = MIN;
|
|
|
|
for (let i=0;i <= NUMBER_OF_LABELS; i++){
|
2022-02-09 10:54:08 +00:00
|
|
|
var angle = (i * (SCALE_SPAN/NUMBER_OF_LABELS)) + ZERO_OFFSET;
|
|
|
|
var labelDimensions = g.stringMetrics(label);
|
2022-02-05 16:55:09 +00:00
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var LABEL_PADDING = 5;
|
|
|
|
var radius = center.x - TICK_LENGTH - LABEL_PADDING;
|
|
|
|
var x = center.x + Math.cos(angle) * radius;
|
|
|
|
var y = center.y + Math.sin(angle) * radius;
|
2022-02-05 16:55:09 +00:00
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var visualX = x > center.x ? x - labelDimensions.width : x + labelDimensions.width > center.x ? x - (labelDimensions.width / 2) : x;
|
|
|
|
var visualY = y >= center.y - labelDimensions.height / 2 ? y - labelDimensions.height / 2 : y;
|
2022-02-05 16:55:09 +00:00
|
|
|
|
|
|
|
g.drawString(label, visualX, visualY);
|
|
|
|
|
|
|
|
label += SCALE_VALUES_STEP;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function drawIcons() {
|
2022-02-09 10:54:08 +00:00
|
|
|
var sunIcon = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
2022-02-05 16:55:09 +00:00
|
|
|
transparent : 0,
|
2022-02-09 10:54:08 +00:00
|
|
|
buffer : require("heatshrink").decompress(atob("gEYAQ0IgEQjkAnEMv0wgH/gEB4eAgcA4EHgHgg0AsHmgFnAQQICBwQUCDQQgCEwQsCGQQ+IA"))
|
2022-02-05 16:55:09 +00:00
|
|
|
};
|
|
|
|
g.drawImage(sunIcon, center.x + 15, center.y - 12);
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var sunRainIcon = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
2022-02-05 16:55:09 +00:00
|
|
|
transparent : 0,
|
2022-02-09 10:54:08 +00:00
|
|
|
buffer : require("heatshrink").decompress(atob("AAeAAQmEgEQhEAhIIBg1ggEEj8AhEw4HokFAglAnEGoEGgHAgcRgEBkQCBgQCBgcAgUBwARBv/4HAcgiAFDCoIAC"))
|
2022-02-05 16:55:09 +00:00
|
|
|
};
|
|
|
|
g.drawImage(sunRainIcon, center.x - 12, 30);
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
var rainIcon = {
|
|
|
|
width : 24, height : 24, bpp : 1,
|
2022-02-05 16:55:09 +00:00
|
|
|
transparent : 0,
|
2022-02-09 10:54:08 +00:00
|
|
|
buffer : require("heatshrink").decompress(atob("AA0gAQPMgEBgUAgQCCgPwAgMYj0AhkQgEECwICGBYMIj//+ArFgURwAqBB4NEgEQghAJ"))
|
2022-02-05 16:55:09 +00:00
|
|
|
};
|
|
|
|
g.drawImage(rainIcon, center.x - 44, center.y - 12);
|
|
|
|
}
|
|
|
|
|
2022-02-09 10:54:08 +00:00
|
|
|
g.setBgColor(g.theme.bg);
|
2022-02-05 16:55:09 +00:00
|
|
|
|
|
|
|
try {
|
2022-02-14 09:53:04 +00:00
|
|
|
function baroHandler(data) {
|
2022-10-27 19:09:43 +00:00
|
|
|
g.clear();
|
|
|
|
|
|
|
|
drawTicks();
|
|
|
|
drawScaleLabels();
|
|
|
|
drawIcons();
|
|
|
|
if (data!==undefined) {
|
2022-02-14 09:53:04 +00:00
|
|
|
drawHand(Math.round(data.pressure));
|
2022-10-27 19:09:43 +00:00
|
|
|
}
|
2022-02-14 09:53:04 +00:00
|
|
|
}
|
|
|
|
Bangle.getPressure().then(baroHandler);
|
2022-10-27 19:09:43 +00:00
|
|
|
setInterval(() => Bangle.getPressure().then(baroHandler), 1000);
|
2022-02-05 16:55:09 +00:00
|
|
|
} catch(e) {
|
2022-10-27 19:09:43 +00:00
|
|
|
if (e !== undefined) {
|
|
|
|
print(e.message);
|
|
|
|
}
|
|
|
|
print("barometer not supported, show a demo value");
|
2022-02-05 16:55:09 +00:00
|
|
|
drawHand(MIN);
|
|
|
|
}
|
2022-10-27 19:09:43 +00:00
|
|
|
|
|
|
|
Bangle.setUI({
|
|
|
|
mode : "custom",
|
|
|
|
back : function() {load();}
|
|
|
|
});
|