BangleApps/apps/exactwords/app.js

226 lines
6.1 KiB
JavaScript
Raw Normal View History

2024-09-28 22:25:56 +00:00
// timeout used to update every minute
var drawTimeout;
// https://www.espruino.com/Bangle.js+Locale
// schedule a draw for the next minute
function queueDraw() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
}, 60000 - (Date.now() % 60000));
}
function wordsFromTime(h, m)
{
// Tests
/*
// Example 12:00 = Twelve
// h = 12;
// m = 0;
// Example 23:58 = Coming up to midnight
// h = 23;
// m = 58;
// Example 12:15 = Quarter past twelve
// h = 12;
// m = 15;
// Example 04:16 = Just gone quarter past four
// h = 16;
// m = 16;
// Example 01:00 = One at night
// h = 1;
// m = 0;
// Example 17:01 = Just gone five in the afternoon
// h = 17;
// m = 1;
// Example 05:25 = Twenty-five past five in the early hours
// h = 23;
// m = 33;
// Example 22:33 = coming up to eleven at night
// max
//words = "a little after twenty-five past four in the early hours";
// h = 04;
// m = 27;
*/
const HOUR_WORD_ARRAY = [
"midnight", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "one", "two", "three",
"four", "five", "six", "seven", "eight", "nine", "ten", "eleven",
"midnight"];
const PART_DAY_WORD_ARRAY = ["",
" at night",
" in the early hours",
" in the early hours",
" in the early hours",
" in the early hours",
" in the morning",
" in the morning",
" in the morning",
" in the morning",
" in the morning",
" in the morning",
"",
" in the afternoon",
" in the afternoon",
" in the afternoon",
" in the afternoon",
" in the afternoon",
" in the evening",
" in the evening",
" in the evening",
" in the evening",
" at night",
" at night",
""];
const MINUTES_ROUGH_ARRAY = ["",
"five past ",
"ten past ",
"quarter past ",
"twenty past ",
"twenty-five past ",
"half past ",
"twenty-five to ",
"twenty to ",
"quarter to ",
"ten to ",
"five to ",
""];
const MINUTES_ACCURATE_ARRAY = ["", "just gone ", "a little after ", "coming up to ", "almost "];
var hourAdjusted = h;
2024-09-30 21:00:16 +00:00
var words = " ", hourWord = " ", partDayWord = " ", minutesRough = " ", minutesAccurate = " ";
2024-09-28 22:25:56 +00:00
// At 33 past the hours we start referign to the next hour
if (m > 32) {
hourAdjusted = (h+ 1) % 24;
} else {
hourAdjusted = h;
}
hourWord = HOUR_WORD_ARRAY[hourAdjusted];
partDayWord = PART_DAY_WORD_ARRAY[Math.round(hourAdjusted)];
minutesRough = MINUTES_ROUGH_ARRAY[Math.round((m + 0 ) / 5)];
minutesAccurate = MINUTES_ACCURATE_ARRAY[m % 5];
words = minutesAccurate + minutesRough + hourWord + partDayWord;
words = words.charAt(0).toUpperCase() + words.slice(1);
return words;
}
function wordsFromDayMonth(day, date, month)
{
// Tests
// Example 12:00 = Twelve
// New Year's Day
// date = 1;
// month = 0;
// on the Ides of March
// date = 15;
// month = 2;
// , ERROR C Nonsense in BASIC
// date = 1;
// month = 3;
// - O'Canada
// date = 1;
// month = 6;
// - on Halloween
// date = 31;
// month = 9;
// - Christmas Eve
// date = 24;
// month = 11;
// - Christmas Day
// date = 25;
// month = 11;
// - Boxing day
// date = 26;
// month = 11;
// New Year's eve
// date = 31;
// month = 11;
// longest
// date = 29;
// month = 10;
const DAY_WORD_ARRAY = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
const DATE_WORD_ARRAY = ["zero", "first", "second", "third", "fourth", "fifth", "sixth", "seventh","eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth","sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth", "twenty-first", "twenty-second", "twenty-third","twenty-fourth", "twenty-fifth", "twenty-sixth", "twenty-seventh", "twenty-eighth", "twenty-ninth", "thirtieth", "thirty-first"];
const MONTH_WORD_ARRAY = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var words = " ";
words = DAY_WORD_ARRAY[day] + ", " + DATE_WORD_ARRAY[date] + " of " + MONTH_WORD_ARRAY[month];
if ((date == 1) && (month == 0)) {
words = "New Year's Day";
} else if ((date == 15) && (month == 2)) {
words = DAY_WORD_ARRAY[day] + " on the Ides of March";
} else if ((date == 1) && (month == 3)) {
words = DAY_WORD_ARRAY[day] + ", ERROR C Nonsense in BASIC";
} else if ((date == 1) && (month == 6)) {
words = DAY_WORD_ARRAY[day] + " - O'Canada";
} else if ((date == 31) && (month == 9)) {
words = DAY_WORD_ARRAY[day] + " - on Halloween";
} else if ((date == 24) && (month == 11)) {
words = "Christmas Eve";
} else if ((date == 25) && (month == 11)) {
words = "Christmas Day";
} else if ((date == 26) && (month == 11)) {
words = "Boxing Day";
} else if ((date == 31) && (month == 11)) {
words = "New Year's eve";
}
return words;
}
function draw() {
var x = g.getWidth()/2;
var y = g.getHeight()/2;
g.reset();
var d = new Date();
var h = d.getHours();
var m = d.getMinutes();
var day = d.getDay();
var date = d.getDate();
var month = d.getMonth();
var timeStr = wordsFromTime(h,m);
var dateStr = wordsFromDayMonth(day, date, month);
// draw time
g.setBgColor(g.theme.bg);
g.setColor(g.theme.fg);
2024-09-28 22:25:56 +00:00
g.clear();
g.setFontAlign(0,0).setFont("Vector",24);
g.drawString(g.wrapString(timeStr, g.getWidth()).join("\n"),x,y-24*0);
// draw date
g.setFontAlign(0,0).setFont("Vector",12);
g.drawString(g.wrapString(dateStr, g.getWidth()).join("\n"),x,y+12*6);
// queue draw in one minute
queueDraw();
}
// Clear the screen once/, at startup
g.clear();
// draw immediately at first, queue update
draw();
// Stop updates when LCD is off, restart when on
Bangle.on('lcdPower',on=>{
if (on) {
draw(); // draw immediately, queue redraw
} else { // stop draw timer
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
}
});
// Show launcher when middle button pressed
Bangle.setUI("clock");
// Load widgets
Bangle.loadWidgets();
Bangle.drawWidgets();