;;; d-meal-timer.el --- A meal timer count-down system that improves over appt.el ;; Copyright (C) 2006-2011 Davin Pearson ;; Author/Maintainer: Davin Max Pearson <http://davin.50webs.com> ;; Keywords: Meal time ;; Version: 1.0 ;;; Commentary: ;; This file is not part of GNU Emacs. ;; Have you ever sat programming on your computer only to realise that ;; the cooking on your stove top has been burnt for want of lack of ;; care of your cooking. For those of you who are out there, this ;; system is for you. You simply execute M-x meal-timer and the ;; minibuffer prompts you for a time to elapse before a sound sample ;; is played. While the timer is counting down, the number of hours, ;; minutes and seconds remaining is continuously updated on the mode ;; line. This is a superior replacement to the built-in appt.el ;; system. ;;; Limitation of Warranty ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or (at ;; your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more detail. ;; ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs, see the file COPYING. If not, see: ;; ;; <http://www.gnu.org/licenses/gpl-3.0.txt>. ;;; Install Instructions: ;; See the following URL for the latest info and a tarball: ;; ;; <http://davin.50webs.com/research/2010/mopa2e2.html#d-meal-timer> ;; ;; Then untar the tarball to a folder pointed to by the Emacs variable ;; load-path and add the following line to your ~/.emacs file. ;; ;; (require 'd-meal-timer) ;;; Known Bugs: ;; none! ;;; Code: (require 'd-time) (setq meal-timer-on nil) (setq meal-timer--stopped-time nil) ;;(defvar meal-timer--file "c:/music/already-burnt-8GB/B52s--Love-Shack.wma") ;;(defvar meal-timer--file "c:/music/mc-hammer--keep.wma") ;;(defvar meal-timer--file "c:/music/midi-150MB/Midi-Popular/B52s/Love-Shack.mid") ;;(defvar meal-timer--file "~/c++-projects/2007/R4/music/Africa.mid") ;; (seconds-to-readable-string 123 nil t) ;; (seconds-to-readable-string 12.3 nil t) (defun meal-timer (minutes) (interactive "nEnter Meal Timer (minutes): ") (let ((seconds nil)) (if meal-timer-on (cancel-function-timers 'meal-timer-function)) ;;(cancel-timer meal-timer)) (if (< minutes 0) (error "You cannot enter a negative time")) ;;(message "minutes=%s" minutes) (setq meal-timer--on t) (setq meal-timer--beep-time (current-time)) (setq seconds (* 60.0 minutes)) (setq meal-timer--duration (seconds-to-readable-string seconds nil t)) ;;(setq seconds (meal-timer--minutes-to-seconds minutes 'meal-timer--beep-time)) (setq meal-timer--total-time-in-seconds seconds) ;;(setq foo (current-time)) ;;(meal-timer--minutes-to-seconds 1 'foo) (setq meal-timer (run-with-timer seconds nil 'meal-timer-function)) )) ;;(defun meal-timer--minutes-to-seconds (minutes var) ;; (let (hi lo seconds) ;; (setq var (eval var)) ;; (setq hi (car var)) ;; (setq lo (cadr var)) ;; (setq seconds (* 60.0 minutes)) ;; (setq lo (+ lo seconds)) ;; (while (>= lo 65536) ;; (setq lo (- lo 65535)) ;; (setq hi (+ hi 1))) ;; (assert (< lo 65536)) ;; (assert (< hi 65536)) ;; (setcar var hi) ;; (setcar (cdr var) lo) ;; seconds ;; )) (defun meal-timer-stop () (interactive) (if (not meal-timer--on) (d-beeps "Cannot stop meal timer as meal timer is off") (setq meal-timer--on nil) (setq meal-timer--secs (- meal-timer--total-time-in-seconds (abs (seconds-of-time-difference meal-timer--beep-time (current-time))))) (cancel-function-timers 'meal-timer-function) (setq meal-timer--stopped-time (current-time)) )) (defun meal-timer-start () (interactive) (if meal-timer--on (d-beeps "Cannot start meal timer as meal timer is on") (setq meal-timer--on t) (setq meal-timer--total-time-in-seconds meal-timer--secs) (setq meal-timer--beep-time (current-time)) (setq meal-timer--duration (seconds-to-readable-string meal-timer--secs nil t)) (setq meal-timer (run-with-timer meal-timer--secs nil 'meal-timer-function)))) (defun meal-timer-function () ;;(d-nbeeps 5 "Time is up!") ;; NOTE: Better replacement for sit-for (setq meal-timer--on nil) (setq meal-timer--stopped-time nil) (if (fboundp 'd-fonts) (d-fonts)) (sit-for 1) (let (f) (setq f "completed-meal-timer.wav") (if (file-exists-p f) (play-sound (list 'sound :file f :volume .99))) (setq f "c:/sound-samples/emacs/completed-meal-timer.wav") (if (file-exists-p f) (play-sound (list 'sound :file f :volume .99))) (setq f "/media/www/C1TB/sound-samples/emacs/completed-meal-timer.wav") (if (file-exists-p f) (play-sound (list 'sound :file f :volume 1.0))) ) (d-beeps "Meal timer expired at %s elasped=%s" (d-time--get-stamp) meal-timer--duration) (if (fboundp 'd-fonts) (d-fonts)) (redraw-display) ) ;;(setq minor-mode-alist (cons '(meal-timer--on " MEAL-TIMER") minor-mode-alist)) ;;(setq minor-mode-alist (cons '(meal-timer--on (:eval (meal-timer-get-string))) minor-mode-alist)) (setq minor-mode-alist (cons '(:eval (meal-timer-get-string)) minor-mode-alist)) ;; (setq s "123 ") ;; (substring s 0 -1) (setq meal-timer--on nil) (defun meal-timer-get-string () (if meal-timer--on (let* ((count (- meal-timer--total-time-in-seconds (abs (seconds-of-time-difference meal-timer--beep-time (current-time))))) (count (floor count)) (str (seconds-to-readable-string count nil t))) (format " Timer=(%s/%s)" str meal-timer--duration)) (if meal-timer--stopped-time (let* ((count (- meal-timer--total-time-in-seconds (abs (seconds-of-time-difference meal-timer--beep-time meal-timer--stopped-time)))) (count (floor count)) (str (seconds-to-readable-string count nil t))) (format " Timer=(%s)" str))))) (run-with-timer 1 1 'force-mode-line-update) ;;(run-with-idle-timer 10 nil 'd-foo) (provide 'd-meal-timer)
Back |