mirror of https://github.com/espruino/BangleApps
Widget to set dst rules
parent
789e3a7ec5
commit
9d2867a443
|
@ -0,0 +1 @@
|
|||
0.01: Initial version
|
|
@ -0,0 +1,34 @@
|
|||
# Daylight savings time widget
|
||||
|
||||
This widget will set the daylight saving rules on your watch. Note you may need a firmware update before this can work.
|
||||
|
||||
## Settings
|
||||
|
||||
You need to set your timezone, and your daylight savings rules, in `Settings -> Apps -> Daylight Savings`. The settings are
|
||||
|
||||
**Enabled** enables or disables the widget
|
||||
|
||||
**Icon** enables or disables the showing of a small "DST" icon when daylight savings is in effect
|
||||
|
||||
**Base TZ** is your "base" timezone - i.e. the timezone you keep when daylight savings is not in effect. It is positive east.
|
||||
|
||||
**Change** is the size of the daylight savings change, which is +1 hour almost everywhere.
|
||||
|
||||
**DST Start, DST End** set the rules for the start and end of daylight savings.
|
||||
|
||||
## Setting the daylight savings rules
|
||||
|
||||
The page for setting **DST Start** and **DST End** ask you to describe the rules for daylight savings changes. For instance, in the UK, the rules are
|
||||
|
||||
**DST Start** `The [last] [Sun] of [Mar] minus [0 days] at [01:00]`
|
||||
|
||||
**DST End** `The [last] [Sun] of [Oct] minus [0 days] at [02:00]`
|
||||
|
||||
In most of the US, the rules are
|
||||
|
||||
**DST Start** `The [2nd] [Sun] of [Mar] minus [0 days] at [02:00]`
|
||||
|
||||
**DST End** `The [1st] [Sun] of [Nov] minus [0 days] at [02:00]`
|
||||
|
||||
|
||||
|
Binary file not shown.
After Width: | Height: | Size: 7.9 KiB |
|
@ -0,0 +1,15 @@
|
|||
{ "id": "widdst",
|
||||
"name": "Daylight Saving",
|
||||
"version":"0.01",
|
||||
"description": "Widget to set daylight saving rules. See the instructions below for more information.",
|
||||
"icon": "icon.png",
|
||||
"type": "widget",
|
||||
"tags": "widget,tool",
|
||||
"supports" : ["BANGLEJS2"],
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"widdst.wid.js","url":"widget.js"},
|
||||
{"name":"widdst.settings.js","url":"settings.js"}
|
||||
],
|
||||
"data": [{"name":"widdst.json"}]
|
||||
}
|
|
@ -0,0 +1,184 @@
|
|||
(function(back) {
|
||||
|
||||
var dows = require("date_utils").dows(0,1);
|
||||
var months = require("date_utils").months(1);
|
||||
|
||||
var settings = Object.assign({
|
||||
has_dst: false,
|
||||
show_icon: true,
|
||||
tz: 0,
|
||||
dst_size: 1,
|
||||
dst_start: {
|
||||
dow_number: 4, // "1st", "2nd", "3rd", "4th", "last"
|
||||
dow: 0, // "Sun", "Mon", ...
|
||||
month: 2,
|
||||
day_offset: 0,
|
||||
at: 1
|
||||
},
|
||||
dst_end: {
|
||||
dow_number: 4,
|
||||
dow: 0,
|
||||
month: 9,
|
||||
day_offset: 0,
|
||||
at: 2
|
||||
}
|
||||
}, require("Storage").readJSON("widdst.json", true) || {});
|
||||
|
||||
var dst_start_end = {
|
||||
is_start: true,
|
||||
day_offset: 0,
|
||||
dow_number: 0,
|
||||
dow: 0,
|
||||
month: 0,
|
||||
at: 0
|
||||
};
|
||||
|
||||
function writeSettings() {
|
||||
require('Storage').writeJSON("widdst.json", settings);
|
||||
}
|
||||
|
||||
function writeSubMenuSettings() {
|
||||
if (dst_start_end.is_start) {
|
||||
settings.dst_start.day_offset = dst_start_end.day_offset;
|
||||
settings.dst_start.dow_number = dst_start_end.dow_number;
|
||||
settings.dst_start.dow = dst_start_end.dow;
|
||||
settings.dst_start.month = dst_start_end.month;
|
||||
settings.dst_start.at = dst_start_end.at;
|
||||
} else {
|
||||
settings.dst_end.day_offset = dst_start_end.day_offset;
|
||||
settings.dst_end.dow_number = dst_start_end.dow_number;
|
||||
settings.dst_end.dow = dst_start_end.dow;
|
||||
settings.dst_end.month = dst_start_end.month;
|
||||
settings.dst_end.at = dst_start_end.at;
|
||||
}
|
||||
writeSettings();
|
||||
}
|
||||
|
||||
function hoursToString(h) {
|
||||
return (h|0) + ':' + (((6*h)%6)|0) + (((60*h)%10)|0);
|
||||
}
|
||||
|
||||
function getDSTStartEndMenu(start) {
|
||||
dst_start_end.is_start = start;
|
||||
if (start) {
|
||||
dst_start_end.day_offset = settings.dst_start.day_offset;
|
||||
dst_start_end.dow_number = settings.dst_start.dow_number;
|
||||
dst_start_end.dow = settings.dst_start.dow;
|
||||
dst_start_end.month = settings.dst_start.month;
|
||||
dst_start_end.at = settings.dst_start.at;
|
||||
} else {
|
||||
dst_start_end.day_offset = settings.dst_end.day_offset;
|
||||
dst_start_end.dow_number = settings.dst_end.dow_number;
|
||||
dst_start_end.dow = settings.dst_end.dow;
|
||||
dst_start_end.month = settings.dst_end.month;
|
||||
dst_start_end.at = settings.dst_end.at;
|
||||
}
|
||||
return {
|
||||
"": {
|
||||
"Title": start ? /*LANG*/"DST Start" : /*LANG*/"DST End"
|
||||
},
|
||||
"< Back": () => E.showMenu(dstMenu),
|
||||
/*LANG*/"The" : {
|
||||
value: dst_start_end.dow_number,
|
||||
format: v => [/*LANG*/"1st",/*LANG*/"2nd",/*LANG*/"3rd",/*LANG*/"4th",/*LANG*/"last"][v],
|
||||
min: 0,
|
||||
max: 4,
|
||||
onchange: v => {
|
||||
dst_start_end.dow_number = v;
|
||||
writeSubMenuSettings();
|
||||
}
|
||||
},
|
||||
" -" : {
|
||||
value: dst_start_end.dow,
|
||||
format: v => dows[v],
|
||||
min:0,
|
||||
max:6,
|
||||
onchange: v => {
|
||||
dst_start_end.dow = v;
|
||||
writeSubMenuSettings();
|
||||
}
|
||||
},
|
||||
/*LANG*/"of": {
|
||||
value: dst_start_end.month,
|
||||
format: v => months[v],
|
||||
min: 0,
|
||||
max: 11,
|
||||
onchange: v => {
|
||||
dst_start_end.month = v;
|
||||
writeSubMenuSettings();
|
||||
}
|
||||
},
|
||||
/*LANG*/"minus" : {
|
||||
value: dst_start_end.day_offset,
|
||||
format: v => v + ((v == 1) ? /*LANG*/" day" : /*LANG*/" days"),
|
||||
min: 0,
|
||||
max: 7,
|
||||
onchange: v => {
|
||||
dst_start_end.day_offset = v;
|
||||
writeSubMenuSettings();
|
||||
}
|
||||
},
|
||||
/*LANG*/"at": {
|
||||
value: dst_start_end.at,
|
||||
format: v => hoursToString(v),
|
||||
min: 0,
|
||||
max: 23,
|
||||
// step: 0.05, // every 3 minutes - FOR DEVELOPMENT PURPOSES
|
||||
onchange: v => {
|
||||
dst_start_end.at = v;
|
||||
writeSubMenuSettings();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var dstMenu = {
|
||||
"": {
|
||||
"Title": /*LANG*/"Daylight Saving"
|
||||
},
|
||||
"< Back": () => back(),
|
||||
/*LANG*/"Enabled": {
|
||||
value: settings.has_dst,
|
||||
format: v => v ? /*LANG*/"Yes" : /*LANG*/"No",
|
||||
onchange: v => {
|
||||
settings.has_dst = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
/*LANG*/"Icon": {
|
||||
value: settings.show_icon,
|
||||
format: v => v ? /*LANG*/"Yes" : /*LANG*/"No",
|
||||
onchange: v => {
|
||||
settings.show_icon = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
/*LANG*/"Base TZ": {
|
||||
value: settings.tz,
|
||||
format: v => (v >= 0 ? '+' + hoursToString(v) : '-' + hoursToString(-v)),
|
||||
onchange: v => {
|
||||
settings.tz = v;
|
||||
writeSettings();
|
||||
},
|
||||
min: -13,
|
||||
max: 13,
|
||||
step: 0.25
|
||||
},
|
||||
/*LANG*/"Change": {
|
||||
value: settings.dst_size,
|
||||
format: v => (v >= 0 ? '+' + hoursToString(v): '-' + hoursToString(-v)),
|
||||
min: -1,
|
||||
max: 1,
|
||||
step: 0.5,
|
||||
onchange: v=> {
|
||||
settings.dst_size = v;
|
||||
writeSettings();
|
||||
}
|
||||
},
|
||||
/*LANG*/"DST Start": () => E.showMenu(getDSTStartEndMenu(true)),
|
||||
/*LANG*/"DST End": () => E.showMenu(getDSTStartEndMenu(false))
|
||||
};
|
||||
|
||||
E.showMenu(dstMenu);
|
||||
|
||||
});
|
|
@ -0,0 +1,65 @@
|
|||
(() => {
|
||||
|
||||
// our setTimeout() return value for the function that periodically check the status of DST
|
||||
var check_timeout = undefined;
|
||||
|
||||
// Called by draw() when we are not in DST or when we are not displaying the icon
|
||||
function clear() {
|
||||
if (this.width) {
|
||||
this.width = 0;
|
||||
Bangle.drawWidgets();
|
||||
}
|
||||
}
|
||||
|
||||
// draw, or erase, our little "dst" icon in the widgets area
|
||||
function draw() {
|
||||
var dstSettings = require('Storage').readJSON('widdst.json',1)||{};
|
||||
if ((dstSettings.has_dst) && (dstSettings.show_icon)) {
|
||||
var now = new Date();
|
||||
if (now.getIsDST()) {
|
||||
if (this.width) {
|
||||
g.drawImage(
|
||||
{
|
||||
width : 24, height : 24, bpp : 1, palette: new Uint16Array([g.theme.bg, g.theme.fg]),
|
||||
buffer : atob("AAAAAAAAPAAAIgAAIQAAIQAAIQAAIQAAIngAPIQAAIAAAPAAAAwAAAQAAIX8AHggAAAgAAAgAAAgAAAgAAAgAAAgAAAAAAAA")
|
||||
}, this.x, this.y
|
||||
);
|
||||
} else {
|
||||
this.width = 24;
|
||||
Bangle.drawWidgets();
|
||||
}
|
||||
} else {
|
||||
clear();
|
||||
}
|
||||
if (check_timeout) clearTimeout(check_timeout);
|
||||
check_timeout = setTimeout( function() {
|
||||
check_timeout = undefined;
|
||||
draw();
|
||||
}, 3600000 - (now.getTime() % 3600000)); // Check every hour.
|
||||
} else {
|
||||
clear();
|
||||
}
|
||||
}
|
||||
|
||||
function setDst() {
|
||||
var dstSettings = require('Storage').readJSON('widdst.json',1)||{};
|
||||
if (dstSettings.has_dst) {
|
||||
E.setDST(60*dstSettings.dst_size, 60*dstSettings.tz, dstSettings.dst_start.dow_number, dstSettings.dst_start.dow,
|
||||
dstSettings.dst_start.month, dstSettings.dst_start.day_offset, 60*dstSettings.dst_start.at,
|
||||
dstSettings.dst_end.dow_number, dstSettings.dst_end.dow, dstSettings.dst_end.month, dstSettings.dst_end.day_offset,
|
||||
60*dstSettings.dst_end.at);
|
||||
} else {
|
||||
E.setDST(0,0,0,0,0,0,0,0,0,0,0,0);
|
||||
}
|
||||
}
|
||||
|
||||
setDst();
|
||||
|
||||
// Register ourselves
|
||||
WIDGETS["widdst"] = {
|
||||
area: "tl",
|
||||
width: 0,
|
||||
draw: draw
|
||||
};
|
||||
|
||||
})()
|
Loading…
Reference in New Issue