Summary:ASTERISK-10989: [patch] New application to sleep until a given UNIX epoch
Reporter:Philip Prindeville (pprindeville)Labels:
Date Opened:2007-12-06 23:00:31.000-0600Date Closed:2007-12-19 14:14:03.000-0600
Versions:Frequency of
Environment:Attachments:( 0) app_waituntil.c
Description:This minor application is called with a single value, such as $[${EPOCH} + n] for whatever value of 'n' you want.

It will then sleep until exactly that time.  This is preferable to doing Wait(n) if you (a) need to do some work in the time between calculating ${EPOCH} and your future wakeup, or (b) you need to wake up at the exact second-tick, i.e. for a sychronized purpose (like announcing the time).

The syntax is:  WaitUntil(i)


[from an email on asterisk-users]

I wanted to write a "popcorn" app for myself, both to learn how to script in extensions.conf, but also because it was something handy.

Along the way, I found myself doing something like:

exten => s,1,Set(FUTURETIME=$[${EPOCH} + 10])
exten => s,n,While(${EPOCH} < ${FUTURETIME})
exten => s,n,Wait(0.01)
exten => s,n,EndWhile()
exten => s,n,Play(beep)
exten => s,n,Hangup()

and hating myself for it (my Asterisk runs on a 500MHz Geode LX).

So I decided it would be useful (in general, and educational for me in particular) to write a WaitUntil() application instead.

Well, I've done that.

I was going to file a bug and then post a "fix" to get their feature in, but the Bug guidelines seem to be pretty clear that this is not the way to go.

So, I'm posting here instead.

The example to paste into the documentation or extensions.conf is:

exten => s,1,Answer()
; the amount of delay is set for English; you may need to adjust this time
; for other languages is there's no pause before the synchronizing beep.
exten => s,n,Set(FUTURETIME=$[${EPOCH} + 11])
exten => s,n,SayUnixTime(${FUTURETIME},Zulu,HNS)
exten => s,n,SayPhonetic(z)
exten => s,n,SayUnixTime(${FUTURETIME},,HNS)
exten => s,n,Playback(local)
exten => s,n,WaitUntil(${FUTURETIME})
exten => s,n,Playback(beep)
exten => s,n,Return()

I invoke it as:

exten => 712,1,Gosub(popcorn,s,1)
exten => 712,n,Hangup()

And lastly, attached is the source for app_waituntil.c.

It's fairly straightforward, and not very big.

But hopefully useful.

Oh, before I forget:  it does require the recording of one additional phrase,
either "local" or "localtime".  I've used "local" in my example above.  And
I read out the time first as GMT/UT (because I travel a lot), and then in the
timezone of my PBX...
Comments:By: Tilghman Lesher (tilghman) 2007-12-07 10:01:58.000-0600

As a new feature, your application should correspond to the coding guidelines for trunk.

By: Digium Subversion (svnbot) 2007-12-19 14:03:32.000-0600

Repository: asterisk
Revision: 94052

A   trunk/apps/app_waituntil.c

r94052 | tilghman | 2007-12-19 14:03:32 -0600 (Wed, 19 Dec 2007) | 4 lines

Add contributed WaitUntil app.
Original code by pprindeville, updated for trunk by tilghman.
(Closes issue ASTERISK-10989)