CoCreate Modeling alarm clock: Beep whenever a long-running command terminates

Sometimes, a CoCreate Modeling command will take a while until it finishes all its calculations, so you run the command, then turn your attention to a trade mag, start surfing, or call home to discuss your dinner plans. However, you don't really want to waste time, so you'd like to make sure that you'll know when the command actually terminates.

The code below implements such a feature: After commands which run at least for a user-definable number of seconds, it will play an arbitrary sound on the stereo which is hooked up to your office PC. Pump up da volume.

;; -*-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Description:  Triggers sounds when a long command terminates
;; Author:       Claus Brod
;; Created:      7/17/2003 16:40    
;; Language:     Lisp
;;
;; (C) Copyright 2003 Claus Brod, all rights reserved
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;

(in-package :clausbrod.de)
(use-package :oli)

;; Usage:
;; - Configure path of WAV file (variable 'soundfile')
;; - Configure delay (only commands taking longer
;;   than the configured delay will cause the sound
;;   to be triggered; variable 'delay')
;; - Load LISP file

;; Note: The current implementation only works on Windows platforms.
;; Modify play-sound for other platforms. Use at your own risk.

(defun play-sound ()
  (let ((soundfile "c:/temp/tada.wav"))
    (sd-sys-background-job 
      (format nil "start ~A" 
        (sd-convert-filename-to-platform soundfile)))))

(let ((lastbusytime nil)
      (delay 3))
  (defun busy-handler (&rest args)
    (declare (ignore args))
    (setq lastbusytime (get-universal-time)))

  (defun interactive-handler (&rest args)
    (declare (ignore args))
    (when lastbusytime
      (when (> (- (get-universal-time) lastbusytime) delay)
        (play-sound)))
    (setq lastbusytime nil)))

;; Register busy and interactive handlers
(sd-unsubscribe-event *SD-BUSY-EVENT* 'busy-handler)
(sd-subscribe-event *SD-BUSY-EVENT* 'busy-handler)
(sd-unsubscribe-event *SD-INTERACTIVE-EVENT* 'interactive-handler)
(sd-subscribe-event *SD-INTERACTIVE-EVENT* 'interactive-handler)

This code illustrates the following techniques:

  • How to subscribe a function for the *SD-BUSY-EVENT* and *SD-INTERACTIVE-EVENT* events
  • How to run an external command

Here's a rough description of how it works:

  • The functions busy-handler and interactive-handler are subscribed to *SD-BUSY-EVENT* and *SD-INTERACTIVE-EVENT*.
  • When the "busy" event is fired (i.e. when a command starts), busy-handler is called and takes a note of the current time in lastbusytime.
  • When the system becomes interactive again, the "interactive" event is fired and calls interactive-handler. This function compares the current time against lastbusytime. If the current time deviates from the time at the start of the last command by at least delay seconds, the function play-sound is called to, well, guess what .-)

-- ClausBrod


When asked for a TWiki account, use your own or the default TWikiGuest account.

to top

You are here: CoCreateModeling > OsdmMacros > MacroAlarmClock

r1.7 - 06 Dec 2013 - 15:47 - ClausBrod to top

CoCreateModeling
CoCreate ModelingRSS
FAQ
  Introduction
  Hardware
  Operating system
  Memory management
  File handling
  Installation
  Licensing
  Graphics
  App. knowhow
  Lisp
    Learning
    Programming
    Debugging
    DDE
    Compiler
    Customization
  Troubleshooting
  Links
Code examples
Viewbench
News
Changes
Index
Search
Impressum
Home

  • My links
  • Show me topics of interest

TWiki

Welcome


TWiki Web TWiki Web Home Changes Topics Index Search


TWiki Webs Atari Blog Main OneSpaceModeling? Sandbox TWiki TWiki Webs Atari Blog Main OneSpaceModeling? Sandbox TWiki

Jump:

Copyright © 1999-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback