!7 module TimerModule > DynBigNumber { bool active; long setAt, setTill; start { dm_onTopInput(voidfunc(fS s) { final new Matches m; if "* minutes|* minute" { switch to q(); int minutes = parseEnglishNumberOrInt($1); if (minutes <= 0) ret; setFields(active := true, setAt := now(), setTill := now()+fromMinutes(minutes)); infoBox("Timer set to " + n2(minutes, "minute")); } }); doEvery(1.0, r updateMe); } void update { long now = now(); if (setTill == 0 || !active) ret with setValue(""); if (setTill <= now) { setField(active := false); setValue("ALARM!"); infoBox_noHide("ALARM!"); vmBus_send('timerAlarm, module()); ret; } else { long seconds = iround(toSeconds(setTill-now)); setValue(seconds/60 + ":" + formatInt(mod(seconds, 60), 2)); } } // API void reset enter { setFields(active := false, setAt := 0L, setTill := 0L); update(); } }