Almost finished a first version

pull/2153/head
David Peer 2022-09-29 21:05:19 +02:00
parent 3ae639f990
commit f54cdd2025
7 changed files with 322 additions and 144 deletions

View File

@ -4,3 +4,4 @@
0.04: Added awareness of allDay field 0.04: Added awareness of allDay field
0.05: Displaying calendar colour and name 0.05: Displaying calendar colour and name
0.06: Added clkinfo for clocks. 0.06: Added clkinfo for clocks.
0.07: Clkinfo improvements.

View File

@ -18,7 +18,7 @@
dateStr += entry.durationInSeconds < 86400 ? "/ " + locale.time(date,1) : ""; dateStr += entry.durationInSeconds < 86400 ? "/ " + locale.time(date,1) : "";
agendaItems.items.push({ agendaItems.items.push({
name: "agendaEntry-" + i, name: null,
get: () => ({ text: title + "\n" + dateStr, img: null}), get: () => ({ text: title + "\n" + dateStr, img: null}),
show: function() { agendaItems.items[i].emit("redraw"); }, show: function() { agendaItems.items[i].emit("redraw"); },
hide: function () {} hide: function () {}

View File

@ -1,7 +1,7 @@
{ {
"id": "agenda", "id": "agenda",
"name": "Agenda", "name": "Agenda",
"version": "0.06", "version": "0.07",
"description": "Simple agenda", "description": "Simple agenda",
"icon": "agenda.png", "icon": "agenda.png",
"screenshots": [{"url":"screenshot_agenda_overview.png"}, {"url":"screenshot_agenda_event1.png"}, {"url":"screenshot_agenda_event2.png"}], "screenshots": [{"url":"screenshot_agenda_overview.png"}, {"url":"screenshot_agenda_event1.png"}, {"url":"screenshot_agenda_event2.png"}],

View File

@ -2,3 +2,4 @@
0.02: Includeas the ha.lib.js library that can be used by other apps or clocks. 0.02: Includeas the ha.lib.js library that can be used by other apps or clocks.
0.03: Added clkinfo for clocks. 0.03: Added clkinfo for clocks.
0.04: Feedback if clkinfo run is called. 0.04: Feedback if clkinfo run is called.
0.05: Clkinfo improvements.

View File

@ -10,7 +10,7 @@
triggers.forEach((trigger, i) => { triggers.forEach((trigger, i) => {
haItems.items.push({ haItems.items.push({
name: "haTrigger-" + i, name: null,
get: () => ({ text: trigger.display, img: trigger.getIcon()}), get: () => ({ text: trigger.display, img: trigger.getIcon()}),
show: function() { haItems.items[i].emit("redraw"); }, show: function() { haItems.items[i].emit("redraw"); },
hide: function () {}, hide: function () {},

View File

@ -1,7 +1,7 @@
{ {
"id": "ha", "id": "ha",
"name": "HomeAssistant", "name": "HomeAssistant",
"version": "0.04", "version": "0.05",
"description": "Integrates your BangleJS into HomeAssistant.", "description": "Integrates your BangleJS into HomeAssistant.",
"icon": "ha.png", "icon": "ha.png",
"type": "app", "type": "app",

View File

@ -1,10 +1,28 @@
/************************************************ /************************************************
* Includes * Includes
*/ */
const locale = require('locale'); const clock_info = require("clock_info");
const ts = 150; const storage = require('Storage');
const locale = require('locale');
/************************************************
/************************************************
* Settings
*/
const SETTINGS_FILE = "bwclk.setting.json";
let settings = {
menuPosX: 0,
menuPosY: 0,
};
let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings;
for (const key in saved_settings) {
settings[key] = saved_settings[key]
}
/************************************************
* Assets * Assets
*/ */
Graphics.prototype.setFontUbuntuMono = function(scale) { Graphics.prototype.setFontUbuntuMono = function(scale) {
@ -16,57 +34,162 @@ const ts = 150;
28+(scale<<8)+(1<<16) 28+(scale<<8)+(1<<16)
); );
return this; return this;
}
/************************************************
* Menu
*/
var dateMenu = {
name: "date",
img: null,
items: [
{ name: "time",
get: () => ({ text: getTime(), img: null}),
show: function() { dateMenu.items[0].emit("redraw"); },
hide: function () {}
},
{ name: "date",
get: () => ({ text: getDate(), img: null}),
show: function() { dateMenu.items[1].emit("redraw"); },
hide: function () {}
},
{ name: "steps",
get: () => ({ text: Bangle.getHealthStatus("day").steps, img: null}),
show: function() { dateMenu.items[2].emit("redraw"); },
hide: function () {}
},
{ name: "battery",
get: () => ({ text: E.getBattery() + (Bangle.isCharging() ? "%++" : "%"), img: null}),
show: function() { dateMenu.items[3].emit("redraw"); },
hide: function () {}
},
]
};
var menu = clock_info.load();
menu = menu.concat(dateMenu);
// Set draw functions for each item
var line = 0;
menu.forEach((menuItm, x) => {
menuItm.items.forEach((item, y) => {
function drawItem() {
item.hide();
var info = item.get();
drawText(item.name, info.text, (y%4)+1);
}
item.on('redraw', drawItem);
})
});
// Ensure that our settings are still in range (e.g. app uninstall). Otherwise reset the position it.
if(settings.menuPosX >= menu.length || settings.menuPosY > menu[settings.menuPosX].items.length ){
settings.menuPosX = 0;
settings.menuPosY = 0;
}
function canRunMenuItem(){
var menuEntry = menu[settings.menuPosX];
var item = menuEntry.items[settings.menuPosY];
return item.run !== undefined;
} }
function runMenuItem(){
var menuEntry = menu[settings.menuPosX];
var item = menuEntry.items[settings.menuPosY];
try{
var ret = item.run();
if(ret){
Bangle.buzz(300, 0.6);
}
} catch (ex) {
// Simply ignore it...
}
}
/************************************************ /************************************************
* Helper
*/
function getTime(){
var date = new Date();
return twoD(date.getHours())+ ":" + twoD(date.getMinutes());
}
function getDate(){
var date = new Date();
return twoD(date.getDate()) + "." + twoD(date.getMonth());
}
/************************************************
* Draw * Draw
*/ */
function draw() { function draw() {
queueDraw(); queueDraw();
g.clear(); g.clear();
Bangle.drawWidgets(); Bangle.drawWidgets();
g.setFontUbuntuMono();
drawMainScreen(); drawMainScreen();
}
function drawText(str, line, timeout){
timeout = timeout ? timeout : 0;
setTimeout(()=>{
g.setFontUbuntuMono();
var x = 10;
var y = line * 27 + 28;
g.setColor(g.theme.fg);
g.drawString(str, x, y);
}, timeout);
}
function drawLetters(str, line, offset){
offset= offset ? offset : 0;
var x = 10 + offset;
var y = line * 27 + 28;
var pos = 0;
for(var i=0; i < str.length; i++){
var c = str.charAt(i);
pos += g.stringWidth(c);
setTimeout((c, pos)=>{
g.setFontUbuntuMono();
g.setColor(g.theme.fg);
g.drawString(c, x+pos, y);
}, ts*(1+i), c, pos);
} }
function drawMainScreen(){
g.setFontUbuntuMono();
g.setFontAlign(-1, -1);
// Get menu item based on x
var menuItem = menu[settings.menuPosX];
var cmd = menuItem.name.slice(0,5).toLowerCase();
drawCmd(cmd);
// Draw menu items depending on our y value
drawMenuItems(menuItem);
}
function drawMenuItems(menuItem) {
var start = parseInt(settings.menuPosY / 4) * 4;
for (var i = start; i < start + 4; i++) {
if (i >= menuItem.items.length) {
continue;
}
lock_input++;
menuItem.items[i].show();
}
if(!Bangle.isLocked()){
g.drawString(">", -2, ((settings.menuPosY % 4) + 1) * 27 + 28);
}
} }
function drawText(key, value, line){
g.setFontUbuntuMono();
var x = 15;
var y = line * 27 + 28;
g.setColor(g.theme.fg);
function drawCmd(){ if(key){
key = (key.toLowerCase() + " ").slice(0, 4) + "|";
} else {
key = ""
}
value = String(value).replace("\n", " ");
g.drawString(key + value, x, y);
lock_input -= 1;
}
function drawCmd(cmd){
var c = 0; var c = 0;
var x = 10; var x = 10;
var y = 28; var y = 28;
@ -85,87 +208,140 @@ function drawCmd(){
g.setColor(g.theme.fg); g.setColor(g.theme.fg);
g.drawString("$", x+c, y); g.drawString("$", x+c, y);
c += g.stringWidth("$~"); c += g.stringWidth("$ ");
}
g.drawString(cmd, x+c, y);
}
function twoD(str){
return ("0" + str).slice(-2)
}
/************************************************
function drawMainScreen(){
var date = new Date();
// Draw time
g.setFontAlign(-1, -1);
var timeStr = ("0" + date.getHours()).slice(-2) + ":" + ("0" + date.getMinutes()).slice(-2);
var dateStr = locale.month(date, 1) + ("0" + date.getDate()).slice(-2);
drawCmd();
var cmd = "time";
var cmdT = ts * cmd.length + 50;
drawLetters("time", 0, 80);
drawText(" [t] " + timeStr, 1, cmdT);
drawText(" [d] " + dateStr, 2, cmdT);
drawText(" [" + (Bangle.isCharging() ? "c" : "b") + "] " + E.getBattery() + "%", 3, cmdT);
drawText(" [s] " + Bangle.getHealthStatus("day").steps, 4, cmdT);
}
/************************************************
* Listener * Listener
*/ */
// timeout used to update every minute // timeout used to update every minute
var drawTimeout; var drawTimeout;
// schedule a draw for the next minute // schedule a draw for the next minute
function queueDraw() { function queueDraw() {
if (drawTimeout) clearTimeout(drawTimeout); if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() { drawTimeout = setTimeout(function() {
drawTimeout = undefined; drawTimeout = undefined;
draw(); draw();
}, 60000 - (Date.now() % 60000)); }, 60000 - (Date.now() % 60000));
} }
// Stop updates when LCD is off, restart when on // Stop updates when LCD is off, restart when on
Bangle.on('lcdPower',on=>{ Bangle.on('lcdPower',on=>{
if (on) { if (on) {
draw(); // draw immediately, queue redraw draw(); // draw immediately, queue redraw
} else { // stop draw timer } else { // stop draw timer
if (drawTimeout) clearTimeout(drawTimeout); if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined; drawTimeout = undefined;
} }
}); });
Bangle.on('lock', function(isLocked) { Bangle.on('lock', function(isLocked) {
if(isLocked){ if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
draw();
});
Bangle.on('charging',function(charging) {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
draw();
});
var lock_input = 0;
Bangle.on('touch', function(btn, e){
if(lock_input > 0){
return;
}
lock_input = 0;
var left = parseInt(g.getWidth() * 0.22);
var right = g.getWidth() - left;
var upper = parseInt(g.getHeight() * 0.22) + 20;
var lower = g.getHeight() - upper;
var is_upper = e.y < upper;
var is_lower = e.y > lower;
var is_left = e.x < left && !is_upper && !is_lower;
var is_right = e.x > right && !is_upper && !is_lower;
var is_center = !is_upper && !is_lower && !is_left && !is_right;
if(is_lower){
if(settings.menuPosY >= menu[settings.menuPosX].items.length-1){
return; return;
} }
if (drawTimeout) clearTimeout(drawTimeout); Bangle.buzz(40, 0.6);
drawTimeout = undefined; settings.menuPosY++;
}
if(is_upper){
if(e.y < 20){ // Reserved for widget clicks
return;
}
if(settings.menuPosY <= 0){
return;
}
Bangle.buzz(40, 0.6);
settings.menuPosY--;
settings.menuPosY = settings.menuPosY < 0 ? 0 : settings.menuPosY;
}
if(is_right){
Bangle.buzz(40, 0.6);
settings.menuPosX = (settings.menuPosX+1) % menu.length;
settings.menuPosY = 0;
}
if(is_left){
Bangle.buzz(40, 0.6);
settings.menuPosY = 0;
settings.menuPosX = settings.menuPosX-1;
settings.menuPosX = settings.menuPosX < 0 ? menu.length-1 : settings.menuPosX;
}
if(is_center){
if(!canRunMenuItem()){
return;
}
runMenuItem();
}
draw(); draw();
}); });
E.on("kill", function(){
try{
storage.write(SETTINGS_FILE, settings);
} catch(ex){
// If this fails, we still kill the app...
}
});
Bangle.on('charging',function(charging) { /************************************************
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
draw();
});
/************************************************
* Startup Clock * Startup Clock
*/ */
// Show launcher when middle button pressed // Show launcher when middle button pressed
Bangle.setUI("clock"); Bangle.setUI("clock");
// Load widgets and draw clock the first time // Load and draw widgets
Bangle.loadWidgets(); Bangle.loadWidgets();
// Draw first time
// Draw first time draw();
draw();