delay.4th revision 281843
1\ Copyright (c) 2008-2015 Devin Teske <dteske@FreeBSD.org>
2\ All rights reserved.
3\ 
4\ Redistribution and use in source and binary forms, with or without
5\ modification, are permitted provided that the following conditions
6\ are met:
7\ 1. Redistributions of source code must retain the above copyright
8\    notice, this list of conditions and the following disclaimer.
9\ 2. Redistributions in binary form must reproduce the above copyright
10\    notice, this list of conditions and the following disclaimer in the
11\    documentation and/or other materials provided with the distribution.
12\ 
13\ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14\ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15\ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16\ ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17\ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18\ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19\ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20\ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21\ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22\ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23\ SUCH DAMAGE.
24\ 
25\ $FreeBSD: stable/10/sys/boot/forth/delay.4th 281843 2015-04-22 01:08:40Z dteske $
26
27marker task-delay.4th
28
29vocabulary delay-processing
30only forth also delay-processing definitions
31
322  constant delay_default \ Default delay (in seconds)
333  constant etx_key       \ End-of-Text character produced by Ctrl+C
3413 constant enter_key     \ Carriage-Return character produce by ENTER
3527 constant esc_key       \ Escape character produced by ESC or Ctrl+[
36
37variable delay_tstart     \ state variable used for delay timing
38variable delay_delay      \ determined configurable delay duration
39variable delay_cancelled  \ state variable for user cancellation
40variable delay_showdots   \ whether continually print dots while waiting
41
42only forth definitions also delay-processing
43
44: delay_execute ( -- )
45
46	\ make sure that we have a command to execute
47	s" delay_command" getenv dup -1 = if
48		drop exit 
49	then
50
51	\ read custom time-duration (if set)
52	s" loader_delay" getenv dup -1 = if
53		drop          \ no custom duration (remove dup'd bunk -1)
54		delay_default \ use default setting (replacing bunk -1)
55	else
56		\ make sure custom duration is a number
57		?number 0= if
58			delay_default \ use default if otherwise
59		then
60	then
61
62	\ initialize state variables
63	delay_delay !          \ stored value is on the stack from above
64	seconds delay_tstart ! \ store the time we started
65	0 delay_cancelled !    \ boolean flag indicating user-cancelled event
66
67	false delay_showdots ! \ reset to zero and read from environment
68	s" delay_showdots" getenv dup -1 <> if
69		2drop \ don't need the value, just existance
70		true delay_showdots !
71	else
72		drop
73	then
74
75	\ Loop until we have exceeded the desired time duration
76	begin
77		25 ms \ sleep for 25 milliseconds (40 iterations/sec)
78
79		\ throw some dots up on the screen if desired
80		delay_showdots @ if
81			." ." \ dots visually aid in the perception of time
82		then
83
84		\ was a key depressed?
85		key? if
86			key \ obtain ASCII value for keystroke
87			dup enter_key = if
88				-1 delay_delay ! \ break loop
89			then
90			dup etx_key = swap esc_key = OR if
91				-1 delay_delay !     \ break loop
92				-1 delay_cancelled ! \ set cancelled flag
93			then
94		then
95
96		\ if the time duration is set to zero, loop forever
97		\ waiting for either ENTER or Ctrl-C/Escape to be pressed
98		delay_delay @ 0> if
99			\ calculate elapsed time
100			seconds delay_tstart @ - delay_delay @ >
101		else
102			-1 \ break loop
103		then
104	until
105
106	\ if we were throwing up dots, throw up a line-break
107	delay_showdots @ if
108		cr
109	then
110
111	\ did the user press either Ctrl-C or Escape?
112	delay_cancelled @ if
113		2drop \ we don't need the command string anymore
114	else
115		evaluate \ evaluate/execute the command string
116 	then
117;
118
119only forth definitions
120