diff --git a/apps/alarm/ChangeLog b/apps/alarm/ChangeLog index 7c266c0be..fcafc386f 100644 --- a/apps/alarm/ChangeLog +++ b/apps/alarm/ChangeLog @@ -17,3 +17,4 @@ 0.16: Adding alarm library 0.17: Moving alarm internals to 'sched' library 0.18: Cope with >1 identical alarm at once (#1667) +0.19: Ensure rescheduled alarms that already fired have 'last' reset diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 802a4744b..b9404358e 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -138,8 +138,7 @@ function editAlarm(alarmIndex, alarm) { }; menu[/*LANG*/"Save"] = function() { a.t = encodeTime(t); - if (a.t < getCurrentTime()) - a.day = (new Date()).getDate(); + a.last = (a.t < getCurrentTime()) ? (new Date()).getDate() : 0; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); @@ -191,6 +190,7 @@ function editTimer(alarmIndex, alarm) { menu[/*LANG*/"Save"] = function() { a.timer = encodeTime(t); a.t = getCurrentTime() + a.timer; + a.last = 0; if (newAlarm) alarms.push(a); else alarms[alarmIndex] = a; saveAndReload(); diff --git a/apps/alarm/metadata.json b/apps/alarm/metadata.json index 0d9567849..9636257ca 100644 --- a/apps/alarm/metadata.json +++ b/apps/alarm/metadata.json @@ -2,7 +2,7 @@ "id": "alarm", "name": "Alarm & Timer", "shortName": "Alarms", - "version": "0.18", + "version": "0.19", "description": "Set alarms and timers on your Bangle", "icon": "app.png", "tags": "tool,alarm,widget", diff --git a/apps/sched/ChangeLog b/apps/sched/ChangeLog index 5560f00bc..d8cd37a05 100644 --- a/apps/sched/ChangeLog +++ b/apps/sched/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Fix scheduling of other alarms if there is a pending alarm from the past (fix #1667) diff --git a/apps/sched/boot.js b/apps/sched/boot.js index c772a135e..dbdf02593 100644 --- a/apps/sched/boot.js +++ b/apps/sched/boot.js @@ -6,13 +6,19 @@ } var alarms = require('Storage').readJSON('sched.json',1)||[]; var time = new Date(); - var active = alarms.filter(a=>a.on && (a.dow>>time.getDay())&1 && (!a.date || a.date==time.toISOString().substr(0,10))); + var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + var d = time.getDate(); + var active = alarms.filter( + a=>a.on && // enabled + a.last!=d && // not already fired today + a.t+60000>currentTime && // is not in the past by >1 minute + (a.dow>>time.getDay())&1 && // is allowed on this day of the week + (!a.date || a.date==time.toISOString().substr(0,10)) // is allowed on this date + ); if (active.length) { - active = active.sort((a,b)=>(a.t-b.t)+(a.last-b.last)*86400000); - var currentTime = (time.getHours()*3600000)+(time.getMinutes()*60000)+(time.getSeconds()*1000); + active = active.sort((a,b)=>a.t-b.t); // sort by time var t = active[0].t-currentTime; - if (active[0].last == time.getDate() || t < -60000) t += 86400000; - if (t<1000) t=1000; // start alarm min 1 sec from now + if (t<1000) t=1000; // start alarm minimum 1 sec from now /* execute alarm at the correct time. We avoid execing immediately since this code will get called AGAIN when alarm.js is loaded. alarm.js will then clearInterval() to get rid of this call so it can proceed @@ -23,3 +29,16 @@ Bangle.SCHED = setTimeout('eval(require("Storage").read("sched.boot.js"))', 86400000 - (Date.now()%86400000)); } })(); +/* DEBUGGING +=============== + +// show the current timer for the next event +global["\xff"].timers[Bangle.SCHED] + +// time in hours of scheduled timer event +global["\xff"].timers[Bangle.SCHED].time / (1024*1024*60*60) + +// set time 1 hour in the past +setTime(getTime() - 60*60) + +*/ diff --git a/apps/sched/metadata.json b/apps/sched/metadata.json index 60aa71d41..defffb29b 100644 --- a/apps/sched/metadata.json +++ b/apps/sched/metadata.json @@ -1,7 +1,7 @@ { "id": "sched", "name": "Scheduler", - "version": "0.01", + "version": "0.02", "description": "Scheduling library for alarms and timers", "icon": "app.png", "type": "scheduler",