Almost finished a first version
parent
3ae639f990
commit
f54cdd2025
|
|
@ -4,3 +4,4 @@
|
|||
0.04: Added awareness of allDay field
|
||||
0.05: Displaying calendar colour and name
|
||||
0.06: Added clkinfo for clocks.
|
||||
0.07: Clkinfo improvements.
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
dateStr += entry.durationInSeconds < 86400 ? "/ " + locale.time(date,1) : "";
|
||||
|
||||
agendaItems.items.push({
|
||||
name: "agendaEntry-" + i,
|
||||
name: null,
|
||||
get: () => ({ text: title + "\n" + dateStr, img: null}),
|
||||
show: function() { agendaItems.items[i].emit("redraw"); },
|
||||
hide: function () {}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "agenda",
|
||||
"name": "Agenda",
|
||||
"version": "0.06",
|
||||
"version": "0.07",
|
||||
"description": "Simple agenda",
|
||||
"icon": "agenda.png",
|
||||
"screenshots": [{"url":"screenshot_agenda_overview.png"}, {"url":"screenshot_agenda_event1.png"}, {"url":"screenshot_agenda_event2.png"}],
|
||||
|
|
|
|||
|
|
@ -2,3 +2,4 @@
|
|||
0.02: Includeas the ha.lib.js library that can be used by other apps or clocks.
|
||||
0.03: Added clkinfo for clocks.
|
||||
0.04: Feedback if clkinfo run is called.
|
||||
0.05: Clkinfo improvements.
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
triggers.forEach((trigger, i) => {
|
||||
haItems.items.push({
|
||||
name: "haTrigger-" + i,
|
||||
name: null,
|
||||
get: () => ({ text: trigger.display, img: trigger.getIcon()}),
|
||||
show: function() { haItems.items[i].emit("redraw"); },
|
||||
hide: function () {},
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"id": "ha",
|
||||
"name": "HomeAssistant",
|
||||
"version": "0.04",
|
||||
"version": "0.05",
|
||||
"description": "Integrates your BangleJS into HomeAssistant.",
|
||||
"icon": "ha.png",
|
||||
"type": "app",
|
||||
|
|
|
|||
|
|
@ -1,8 +1,26 @@
|
|||
|
||||
/************************************************
|
||||
* Includes
|
||||
*/
|
||||
const clock_info = require("clock_info");
|
||||
const storage = require('Storage');
|
||||
const locale = require('locale');
|
||||
const ts = 150;
|
||||
|
||||
|
||||
/************************************************
|
||||
* 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
|
||||
|
|
@ -20,6 +38,96 @@ const ts = 150;
|
|||
|
||||
|
||||
|
||||
/************************************************
|
||||
* 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
|
||||
*/
|
||||
|
|
@ -29,44 +137,59 @@ function draw() {
|
|||
g.clear();
|
||||
Bangle.drawWidgets();
|
||||
|
||||
g.setFontUbuntuMono();
|
||||
drawMainScreen();
|
||||
}
|
||||
|
||||
|
||||
function drawText(str, line, timeout){
|
||||
timeout = timeout ? timeout : 0;
|
||||
|
||||
setTimeout(()=>{
|
||||
function drawMainScreen(){
|
||||
g.setFontUbuntuMono();
|
||||
var x = 10;
|
||||
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);
|
||||
g.drawString(str, x, y);
|
||||
}, timeout);
|
||||
|
||||
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 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 drawCmd(){
|
||||
function drawCmd(cmd){
|
||||
var c = 0;
|
||||
var x = 10;
|
||||
var y = 28;
|
||||
|
|
@ -85,27 +208,13 @@ function drawCmd(){
|
|||
|
||||
g.setColor(g.theme.fg);
|
||||
g.drawString("$", x+c, y);
|
||||
c += g.stringWidth("$~");
|
||||
c += g.stringWidth("$ ");
|
||||
|
||||
g.drawString(cmd, x+c, y);
|
||||
}
|
||||
|
||||
|
||||
|
||||
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);
|
||||
function twoD(str){
|
||||
return ("0" + str).slice(-2)
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -137,10 +246,6 @@ Bangle.on('lcdPower',on=>{
|
|||
|
||||
|
||||
Bangle.on('lock', function(isLocked) {
|
||||
if(isLocked){
|
||||
return;
|
||||
}
|
||||
|
||||
if (drawTimeout) clearTimeout(drawTimeout);
|
||||
drawTimeout = undefined;
|
||||
|
||||
|
|
@ -155,6 +260,78 @@ Bangle.on('charging',function(charging) {
|
|||
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;
|
||||
}
|
||||
|
||||
Bangle.buzz(40, 0.6);
|
||||
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();
|
||||
});
|
||||
|
||||
E.on("kill", function(){
|
||||
try{
|
||||
storage.write(SETTINGS_FILE, settings);
|
||||
} catch(ex){
|
||||
// If this fails, we still kill the app...
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/************************************************
|
||||
* Startup Clock
|
||||
|
|
@ -163,9 +340,8 @@ Bangle.on('charging',function(charging) {
|
|||
// Show launcher when middle button pressed
|
||||
Bangle.setUI("clock");
|
||||
|
||||
// Load widgets and draw clock the first time
|
||||
// Load and draw widgets
|
||||
Bangle.loadWidgets();
|
||||
|
||||
|
||||
// Draw first time
|
||||
draw();
|
||||
|
|
|
|||
Loading…
Reference in New Issue