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