123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #!/bin/bash -e
- #---------------------------------------------------------------------
- # Script to display a "binary clock" using unicode characters from the
- # braille block.
- #
- # Designed to work with the wonderful byobu(1) but can be run
- # stand-alone.
- #---------------------------------------------------------------------
- #
- # Copyright (C) 2011 Canonical Ltd.
- #
- # Author: James Hunt <james.hunt@canonical.com>
- #
- # 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, version 3 of the License.
- #
- # 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 details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
- #
- #---------------------------------------------------------------------
- script_name=${0##*/}
- # Selected Unicode Braille characters:
- #
- # 0x2800, 0x2880, 0x2820, 0x28a0, 0x2810, 0x2890, 0x2830, 0x28b0, 0x2808, 0x2888,
- # 0x2840, 0x28c0, 0x2860, 0x28e0, 0x2850, 0x28d0, 0x2870, 0x28f0, 0x2848, 0x28c8,
- # 0x2804, 0x2884, 0x2824, 0x28a4, 0x2814, 0x2894, 0x2834, 0x28b4, 0x280c, 0x288c,
- # 0x2844, 0x28c4, 0x2864, 0x28e4, 0x2854, 0x28d4, 0x287b, 0x28f4, 0x284c, 0x28cc,
- # 0x2802, 0x2882, 0x2822, 0x28a2, 0x2812, 0x2892, 0x2832, 0x28b2, 0x280a, 0x288a,
- # 0x2842, 0x28c2, 0x2862, 0x28e2, 0x2852, 0x28d2, 0x2872, 0x28f2, 0x284a, 0x28ca,
- # 0x2806, 0x2886
- #
- # Index of this array is 0-61 with character returned being
- # "two column" binary representation of a time segment.
- #
- binary=(⠀ ⢀ ⠠ ⢠ ⠐ ⢐ ⠰ ⢰ ⠈ ⢈ \
- ⡀ ⣀ ⡠ ⣠ ⡐ ⣐ ⡰ ⣰ ⡈ ⣈ \
- ⠄ ⢄ ⠤ ⢤ ⠔ ⢔ ⠴ ⢴ ⠌ ⢌ \
- ⡄ ⣄ ⡤ ⣤ ⡔ ⣔ ⡻ ⣴ ⡌ ⣌ \
- ⠂ ⢂ ⠢ ⢢ ⠒ ⢒ ⠲ ⢲ ⠊ ⢊ \
- ⡂ ⣂ ⡢ ⣢ ⡒ ⣒ ⡲ ⣲ ⡊ ⣊ ⠆ ⢆)
- usage()
- {
- cat <<EOT
- Description: A clock that displays the time in binary.
- Usage: $script_name [options]
- Options:
- -b : Display binary clock (default)
- -h : Show this help.
- -l : Display leading zeros (hex and octal modes only).
- -m : Show time in 24-hour military format
- (default: 12-hour format).
- -n : Suppress newline at end of time.
- -o : Display time in octal (base 8).
- -s <sep> : Specify separator between hours and minutes
- (and seconds if not disabled).
- -u : Display alphabetics in upper-case (hex mode only).
- -x : Disable time in hexadecimal (base 16).
- -z : Disable display of seconds.
- EOT
- }
- suppress_seconds=n
- clock_type=binary
- format=std
- ending=""
- uppercase=n
- leading_zeros=n
- while getopts "bhlmnos:uxz" opt
- do
- case "$opt" in
- b)
- clock_type=binary
- ;;
- h)
- usage
- exit 0
- ;;
- l)
- leading_zeros=y
- ;;
- m)
- format=mil
- ;;
- n)
- ending=
- ;;
- o)
- clock_type=oct
- ;;
- s)
- sep=$OPTARG
- ;;
- u)
- uppercase=y
- ;;
- x)
- clock_type=hex
- ;;
- z)
- suppress_seconds=y
- ;;
- esac
- done
- if [ -z "$clock_type" ]
- then
- printf "%s\n" "ERROR: must specify clock type"
- exit 1
- fi
- shift $[$OPTIND-1]
- # get current time, handling 12-hour or 24-hour
- if [ $format = std ]
- then
- hrs_format=%l
- else
- hrs_format=%k
- fi
- time=($(date "+${hrs_format} %M %S"))
- h=$(printf ${time[0]})
- m=$(printf ${time[1]})
- s=$(printf ${time[2]})
- if [ $clock_type = binary ]
- then
- [ $suppress_seconds = n ] && seconds="${sep}${binary[10#$s]}"
- display_time="${binary[10#$h]}${sep}${binary[10#$m]}${seconds}${ending}"
- else
- if [ $clock_type = hex ]
- then
- conversion=x
- [ $uppercase = y ] && conversion=X
- else
- conversion=o
- fi
- precision=
- [ $leading_zeros = y ] && precision=.2
- base_format=%2${precision}${conversion}
- hh=$(printf "$base_format" $h)
- hm=$(printf "$base_format" $m)
- [ "$suppress_seconds" = n ] && hs="${sep}$(printf "$base_format" $s)"
- display_time="${hh}${sep}${hm}${hs}${ending}"
- fi
- color k w
- printf "%s" "$display_time"
- color --
|