*.deb extraction utility (also *.dsc by wrapping “dpkg-source -x”)
[shellsnippets/shellsnippets.git] / bash / clock
1 #!/bin/bash
2 #-
3 # Copyright © 2009, 2013
4 #       Dominik George <nik@naturalnet.de>
5 #       Felix Falk <felix@b9d.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21
22 # Config
23
24 CONFIG_DIGITAL=true
25
26 # Check dependencies
27 if [ ! -x $(which bc) ]; then
28         echo "bc not found, install bc!"
29
30         exit 1
31 fi
32
33 if [ ! -x $(which tput) ]; then
34
35         echo "tput not found, install ncurses!"
36         exit 1
37 fi
38
39 # Definitions
40 PI=$(echo "4*a(1)" | bc -l)
41
42 # Library
43 function deg2rad {
44         local x=$1
45         echo $(echo "${x}/180*${PI}" | bc -l)
46
47 }
48
49 function sine {
50         local x=$(deg2rad $1)
51
52         echo $(echo "s(${x})" | bc -l)
53 }
54
55 function cosine {
56         local x=$(deg2rad $1)
57
58         echo $(echo "c(${x})" | bc -l)
59 }
60
61 function round {
62         local x=$1
63         local pre=$(echo ${x} | cut -d. -f1)
64
65         local post=$(echo ${x} | cut -d. -f2)
66
67         local postone=${post:1:1}
68
69         if [ "${pre}" = "-" ]; then
70
71                 pre=$(echo ${pre} | sed "s/^-\$/0/")
72
73         fi
74
75         if [ -n ${postone} ]; then
76                 echo ${pre}
77
78         else
79                 echo $((pre + 1))
80         fi
81
82 }
83
84 function drawpoint {
85         local deg=$1
86         local percent=$2
87
88         local char=$3
89         local mirror=$4
90
91         radx=$(echo "${RADIUSX} * ${percent} / 100" | bc)
92
93         rady=$(echo "${RADIUSY} * ${percent} / 100" | bc)
94
95         xoff=$(round $(echo "$(sine ${deg}) * ${radx}" | bc -l))
96
97         yoff=$(round $(echo "$(cosine ${deg}) * ${rady}" | bc -l))
98
99         tput cup $((MIDDLEY + yoff)) $((MIDDLEX + xoff))
100
101         echo -n ${char}
102
103         if [ ${mirror} = true ]; then
104
105                 tput cup $((MIDDLEY - yoff)) $((MIDDLEX + xoff))
106
107                 echo -n ${char}
108                 tput cup $((MIDDLEY + yoff)) $((MIDDLEX - xoff))
109
110                 echo -n ${char}
111                 tput cup $((MIDDLEY - yoff)) $((MIDDLEX - xoff))
112
113                 echo -n ${char}
114         fi
115 }
116
117 # Clear terminal
118 clear
119
120 # Get terminal caps
121
122 COLS=$(tput cols)
123 LINES=$(tput lines)
124
125 echo ${COLS}
126
127 echo ${LINES}
128
129 # Determine clock size from terminal size
130 if [ ${COLS} -ge $((LINES * 2)) ]; then
131
132         HEIGHT=$((LINES - 2))
133         WIDTH=$((HEIGHT * 2))
134
135 else
136         echo abcdefghijklmnopqrstuvwxyz
137         WIDTH=$((COLS - 2))
138         HEIGHT=$((WIDTH / 2))
139
140 fi
141
142 # Determine clock position
143 TOP=$(((LINES - HEIGHT)/2))
144
145 LEFT=$(((COLS - WIDTH)/2))
146 MIDDLEX=$((COLS/2))
147
148 MIDDLEY=$((LINES/2))
149 RADIUSX=$((MIDDLEX - LEFT))
150
151 RADIUSY=$((MIDDLEY - TOP))
152
153 # Print digital clock if requested
154 if [ ${CONFIG_DIGITAL} = true ]; then
155
156         tput cup $((MIDDLEY + (HEIGHT / 4))) $((MIDDLEX - 4))
157
158         date "+%H:%M:%S"
159 fi
160
161 # Draw border
162 for deg in $(seq 0 1 90); do
163
164         if [ ${deg} -ge 0 -a ${deg} -le 5 -o ${deg} -ge 25 -a ${deg} -le 35 -o ${deg} -ge 55 -a ${deg} -le 65 -o ${deg} -ge 83 -a ${deg} -le 90 ]; then
165
166                 char=x
167         else
168                 char=.
169         fi
170
171         drawpoint ${deg} 100 ${char} true
172
173 done
174
175 # Get time
176 hour=$(date "+%H" | sed "s/^0//")
177
178 min=$(date "+%M" | sed "s/^0//")
179 sec=$(date "+%S" | sed "s/^0//")
180
181 # Hours
182 for percent in $(seq 0 1 60); do
183         deg=$((180 - (((hour * 60 + min) % 720) / 2)))
184
185         if [ ${deg} -lt 0 ]; then
186                 deg=$((360 + deg))
187
188         fi
189         drawpoint ${deg} ${percent} x false
190 done
191
192 # Minutes
193 for percent in $(seq 0 1 85); do
194
195         deg=$((180 - (min * 6)))
196         if [ ${deg} -lt 0 ]; then
197
198                 deg=$((360 + deg))
199         fi
200         drawpoint ${deg} ${percent} + false
201
202 done
203
204 # Seconds
205 for percent in $(seq 0 1 85); do
206
207         deg=$((180 - (sec * 6)))
208         if [ ${deg} -lt 0 ]; then
209
210                 deg=$((360 + deg))
211         fi
212         drawpoint ${deg} ${percent} . false
213
214 done
215
216 # Draw center
217 tput cup ${MIDDLEY} ${MIDDLEX}
218 echo X
219
220 # Set cursor to bottom left corner
221 tput cup ${LINES} 0
222
223 exit 0