if 0 {
**General Notes**
[MiHa] 2015-02-24 -
A fuzzy clock shows approximate time only, that is, with a precision of a few minutes.
For example, for any time between 03:08 and 03:12 you would get a string like
"Ten minutes past three o'clock",
There are already some programs that do that, examples are:
* https://extensions.gnome.org/extension/202/fuzzy-clock/ - human-readable clock for the gnome-shell panel
* http://code.google.com/p/fuzzyclock/ - A fuzzy clock (à la KDE) for the Windows tray
* http://home.gna.org/fuzzyclock/ - A python class and commandline utility to generate a "fuzzy clock" output.
My fuzzy clock doesn't output a string,
it highlights fixed panels with a list of words on them,<
>
like turning on lamps inside panels which have a cover labeled with one of those words.
Some inspiration came from the following programs and pages here :
* Enter and Leave Event Bindings - http://wiki.tcl.tk/14573
* WorldtimeClock - http://wiki.tcl.tk/14375
* Refrigerator_Pinyin_Poetry - http://wiki.tcl.tk/16722
* after - http://wiki.tcl.tk/808
* every - http://wiki.tcl.tk/9299
Other programs that are doing something with time:
* A base-5 clock / Berlin-Uhr - http://wiki.tcl.tk/13222
* Binary Clock - http://wiki.tcl.tk/12282
* Word Clock - http://wiki.tcl.tk/26722
**Designers notes**
* I use 3*8 rectangles as "panels" on a canvas
* Each such area has a word (like "ten", "minutes", "before"), <
> and tags for adressing.
* The current time gets read with "clock format [clock seconds]",
* this "raw time" gets displayed at the top of the window (for testing),
* and then I use a table-lookup to figure out which panels to light up.
* This table has an entry for each minute of the hour, with a list of tags.
* (When implemening this in hardware, I would instead use 32bit-values, <
> where each bit represents one of the panels)
* The clock is a [http://en.wikipedia.org/wiki/12-hour_clock%|%12-hour design%|%], but instead of AM/PM, I use morning/evening,<
> where "morning" behaves like AM, but "evening" only starts at 18:00.
* With "It is"/"It gets"/"It was", my time is fuzzy/precise within two minutes,
* so I limited the update-frequency to once every 10 seconds..
* My choice of words went towards "five" and "ten", <
>which can in german both be lit to be nicely combined to get the equivalent of "fifteen". <
> For a proper english fuzzy clock, you might want "quarter" as a separate word.
* In hindsight, for designing and changing the layout, it is easier<
>to have an addressing scheme for the panels like for cells in a spreadsheet.
**Notes about working with tcl**
* "catch {console show}" and "puts" is very useful for development and test
* string/list/dict - not sure when to use what, and no easy guidelines for that
* Doku/Help - it is hard to find any topic, there are almost no useful examples included.
Example: looking for "create text" - the search shows lots of hits, but the page I want <
> turns out to be [http://www.tcl.tk/man/tcl/TkCmd/canvas.htm%|%Tk Built-In Commands - canvas manual%|%]. <
>That is far from obvious.<
>
And on that page, the thing I wanted is [http://www.tcl.tk/man/tcl/TkCmd/canvas.htm#M43%|%pathName create type ...%|%], <
> where ''type'' can be arc, bitmap, line, rect ... and, after scrolling almost all the way down, also ''text''. <
>That was not the most helpful way to present the information.<
>In fact, I can hardly imagine the noob that would make it so far.<
>I think this is a serious obstacle for newcomers.
For a reference-manual this might be ok, but when looking for help to get something done,
this is not enough.<
>
Helpful people on IRC are nice to have, but shouldn't be a substitute for good docs.<
>
And examples are also very much missing in that helpfile.
I would expect links to lots of short, self-contained, working snippets of code included in such a helpfile.
* Bug in clock with "%I" - from help-file for Tcl 8.6.1.0: "%I - On output, produces a two-digit number giving the hour of the day (12-11) on a 12-hour clock." But sometimes I get one-digit numbers.
* Date and Time Issues - http://wiki.tcl.tk/948
**Program**
----
}
======
# FuzzyClock43.tcl - Mike Hase - 2015-02-24
# http://wiki.tcl.tk/41162
package require Tk
set Prog(title) "FuzzyClock"
set Prog(version) "v0.9"
set Prog(date) "2015-03-03"
### Colortable: (ToDo)
set Co(bg) grey
#set bg white
set bg grey
set ol black
set hi1 cyan
set hi2 yellow
set tx1 blue
set tx2 white
set hiC $hi1
set txC $tx1
### Display:
proc makeText {w tag name rectCoords} {
set id1 [$w create rect $rectCoords -tag $tag -fill $::bg -outline $::ol]
foreach {x y} $rectCoords break
incr x
incr y
set id2 [$w create text $x $y -tag t$tag -anchor w -text $name]
$w addtag time withtag $tag
$w addtag txt withtag t$tag
# puts "$id1 $id2 : $x $y $tag $name" ;##
$w scale $id1 0 0 25 15
$w scale $id2 0 0 25 15
}
proc reset {tag} {
foreach id [ .c find withtag time] { .c itemconfigure $id -fill $::bg }
foreach id [ .c find withtag txt ] { .c itemconfigure $id -fill black }
}
proc hi {tag} {
foreach id [ .c find withtag $tag ] { .c itemconfigure $id -fill $::hiC }
foreach id [ .c find withtag t$tag ] { .c itemconfigure $id -fill $::txC }
}
### Update display:
proc upd {} {
global cs td hh ii mm am tH tM tA mTab
#wm title . "$td"
wm title . "$td / $ii:$mm $am"
#wm title . "$ii:$mm $am"
set tH "t_$ii"
set tA "t_$am"
#puts "$ii / $tH $tA" ;##
set tM "$mm"
#puts "$tM" ;##
set i 0
#puts "$tM : mTab($tM) -->"
foreach t $mTab($tM) {
#incr i; puts " $i. $t"; hi $t
if { $t=="hH" } { ;# show next hour
incr ii;
if { $ii>=13 } { set ii 1 } ;# max. 12 o'clock
#puts "++ii: $ii"
}
}
set tH "t_$ii"
#puts "++ $tH $tA" ;##
hi $tH
foreach t $mTab($mm) {
#incr i; puts " $i. $t" ;##
hi $t
}
hi t_C
hi $tA
}
proc u {} {
reset time
reset txt
upd
if { $::hiC==$::hi1 } { set ::hiC yellow } else { set ::hiC cyan } ;# change colors
}
### Test+Debug:
proc x {} {
set ::mm "10"
}
proc y {} {
set ::ii "12"
set ::mm "02"
}
proc z {} {
set ::mm "00"
}
proc h {} {
incr ::ii
}
proc m {} {
incr ::mm
}
proc e {} {exit}
### Time:
proc now {} {
global cs td hh ii mm am tH tM tA mTab
set cs [clock seconds]
set td [clock format $cs -format "%H:%M:%S - %l:%M %p" ]
set hh [clock format $cs -format "%H" ]
set ii [clock format $cs -format "%l" ] ;# %I %k %l
set mm [clock format $cs -format "%M" ]
set am [clock format $cs -format "%p" ]
if { $am=="PM" && $hh<"18"} { set am "_" } ;# no "PM" before 18:00
incr ii; incr ii -1 ;# !! workaround !!
if { $ii>=13 } { set ii 1 } ;# max. 12 o'clock
puts "$hh:$mm -> $ii:$mm $am" ;##
}
### Time/Repeat/Wait:
proc every {ms body} {
if 1 $body
after $ms [list after idle [info level 0]]
}
proc run {} {every 10000 {now; u} }
proc stop {} {foreach id [after info] {after cancel $id}; }
proc sync0 {} {
# wait for seconds to reach a multiple of 10
update
for {set i 1} {$i<=30} {incr i} {
set ::cs [clock seconds]
set s0 [expr $::cs % 10]
puts "$i $::cs $s0" ;##
if { $s0 == 0 } { break }
after 333
}
}
### Positions, spreadsheet-style:
set a1 { 1 1 4 3 }
set b1 { 4 1 7 3 }
set c1 { 7 1 10 3 }
set a2 { 1 3 4 5 }
set b2 { 4 3 7 5 }
set c2 { 7 3 10 5 }
set a3 { 1 5 4 7 }
set b3 { 4 5 7 7 }
set c3 { 7 5 10 7 }
set a4 { 1 7 4 9 }
set b4 { 4 7 7 9 }
set c4 { 7 7 10 9 }
set a5 { 1 9 4 11 }
set b5 { 4 9 7 11 }
set c5 { 7 9 10 11 }
set a6 { 1 11 4 13 }
set b6 { 4 11 7 13 }
set c6 { 7 11 10 13 }
set a7 { 1 13 4 15 }
set b7 { 4 13 7 15 }
set c7 { 7 13 10 15 }
set a8 { 1 15 4 17 }
set b8 { 4 15 7 17 }
set c8 { 7 15 10 17 }
### Fuzzyness starts here:
proc start01 {w} {
# setup for german fuzzyclock#1, 8x3 panels: "fünf Minuten vor halb vier Uhr"
destroy $w; pack [canvas $w -width 260 -height 260 -background grey]
makeText $w t_N "Es wird" { 1 1 4 3 }
makeText $w t_I "Es ist" { 4 1 7 3 }
makeText $w t_W "Es war" { 7 1 10 3 }
makeText $w t_v "fünf" { 1 3 4 5 }
makeText $w t_x "zehn" { 4 3 7 5 }
makeText $w t_M "Minuten" { 7 3 10 5 }
makeText $w t_B "vor" { 1 5 4 7 }
makeText $w t_P "nach" { 4 5 7 7 }
makeText $w t_h "halb" { 7 5 10 7 }
makeText $w t_1 "ein" { 1 7 4 9 }
makeText $w t_2 "zwei" { 4 7 7 9 }
makeText $w t_3 "drei" { 7 7 10 9 }
makeText $w t_4 "vier" { 1 9 4 11 }
makeText $w t_5 "fünf" { 4 9 7 11 }
makeText $w t_6 "sechs" { 7 9 10 11 }
makeText $w t_7 "sieben" { 1 11 4 13 }
makeText $w t_8 "acht" { 4 11 7 13 }
makeText $w t_9 "neun" { 7 11 10 13 }
makeText $w t_10 "zehn" { 1 13 4 15 }
makeText $w t_11 "elf" { 4 13 7 15 }
makeText $w t_12 "zwölf" { 7 13 10 15 }
makeText $w t_C "Uhr" { 1 15 4 17 }
makeText $w t_AM "morgens" { 4 15 7 17 }
makeText $w t_PM "abends" { 7 15 10 17 }
array set ::mTab {
00 { t_I }
01 { t_W }
02 { t_W }
03 { t_N t_P t_v t_M }
04 { t_N t_P t_v t_M }
05 { t_I t_P t_v t_M }
06 { t_W t_P t_v t_M }
07 { t_W t_P t_v t_M }
08 { t_N t_P t_x t_M }
09 { t_N t_P t_x t_M }
10 { t_I t_P t_x t_M }
11 { t_W t_P t_x t_M }
12 { t_W t_P t_x t_M }
13 { t_N t_P t_v t_x t_M }
14 { t_N t_P t_v t_x t_M }
15 { t_I t_P t_v t_x t_M }
16 { t_W t_P t_v t_x t_M }
17 { t_W t_P t_v t_x t_M }
18 { t_N t_B t_x t_h t_M hH }
19 { t_N t_B t_x t_h t_M hH }
20 { t_I t_B t_x t_h t_M hH }
21 { t_W t_B t_x t_h t_M hH }
22 { t_W t_B t_x t_h t_M hH }
23 { t_N t_B t_v t_h t_M hH }
24 { t_N t_B t_v t_h t_M hH }
25 { t_I t_B t_v t_h t_M hH }
26 { t_W t_B t_v t_h t_M hH }
27 { t_W t_B t_v t_h t_M hH }
28 { t_N t_h hH }
29 { t_N t_h hH }
30 { t_I t_h hH }
31 { t_W t_h hH }
32 { t_W t_h hH }
33 { t_N t_P t_v t_h t_M hH }
34 { t_N t_P t_v t_h t_M hH }
35 { t_I t_P t_v t_h t_M hH }
36 { t_W t_P t_v t_h t_M hH }
37 { t_W t_P t_v t_h t_M hH }
38 { t_N t_P t_x t_h t_M hH }
39 { t_N t_P t_x t_h t_M hH }
40 { t_I t_P t_x t_h t_M hH }
41 { t_W t_P t_x t_h t_M hH }
42 { t_W t_P t_x t_h t_M hH }
43 { t_N t_B t_v t_x t_M hH }
44 { t_N t_B t_v t_x t_M hH }
45 { t_I t_B t_v t_x t_M hH }
46 { t_W t_B t_v t_x t_M hH }
47 { t_W t_B t_v t_x t_M hH }
48 { t_N t_B t_x t_M hH }
49 { t_N t_B t_x t_M hH }
50 { t_I t_B t_x t_M hH }
51 { t_W t_B t_x t_M hH }
52 { t_W t_B t_x t_M hH }
53 { t_N t_B t_v t_M hH }
54 { t_N t_B t_v t_M hH }
55 { t_I t_B t_v t_M hH }
56 { t_W t_B t_v t_M hH }
57 { t_W t_B t_v t_M hH }
58 { t_N hH }
59 { t_N hH }
}
## puts $::mTab(05)
}
proc start02 {w} {
# setup for german fuzzyclock#2, 8x3 panels: "drei Uhr fünf und zwanzig Minuten"
destroy $w; pack [canvas $w -width 260 -height 260 -background grey]
makeText $w t_I "Es ist" { 1 1 4 3 }
makeText $w t_AM "morgens" { 4 1 7 3 }
makeText $w t_0 "null" { 7 1 10 3 }
makeText $w t_1 "ein" { 1 3 4 5 }
makeText $w t_2 "zwei" { 4 3 7 5 }
makeText $w t_3 "drei" { 7 3 10 5 }
makeText $w t_4 "vier" { 1 5 4 7 }
makeText $w t_5 "fünf" { 4 5 7 7 }
makeText $w t_6 "sechs" { 7 5 10 7 }
makeText $w t_7 "sieben" { 1 7 4 9 }
makeText $w t_8 "acht" { 4 7 7 9 }
makeText $w t_9 "neun" { 7 7 10 9 }
makeText $w t_10 "zehn" { 1 9 4 11 }
makeText $w t_11 "elf" { 4 9 7 11 }
makeText $w t_12 "zwölf" { 7 9 10 11 }
makeText $w t_C "Uhr" { 1 11 4 13 }
makeText $w t_v "fünf" { 4 11 7 13 }
makeText $w t_x "zehn" { 7 11 10 13 }
makeText $w t_+ "und" { 1 13 4 15 }
makeText $w t_xx "zwanzig" { 4 13 7 15 }
makeText $w t_30 "dreissig" { 7 13 10 15 }
makeText $w t_40 "vierzig" { 1 15 4 17 }
makeText $w t_50 "fünfzig" { 4 15 7 17 }
makeText $w t_M "Minuten" { 7 15 10 17 }
array set ::mTab {
00 { t_I }
01 { t_I }
02 { t_I }
03 { t_I t_v t_M }
04 { t_I t_v t_M }
05 { t_I t_v t_M }
06 { t_I t_v t_M }
07 { t_I t_v t_M }
08 { t_I t_x t_M }
09 { t_I t_x t_M }
10 { t_I t_x t_M }
11 { t_I t_x t_M }
12 { t_I t_x t_M }
13 { t_I t_v t_x t_M }
14 { t_I t_v t_x t_M }
15 { t_I t_v t_x t_M }
16 { t_I t_v t_x t_M }
17 { t_I t_v t_x t_M }
18 { t_I t_xx t_M }
19 { t_I t_xx t_M }
20 { t_I t_xx t_M }
21 { t_I t_xx t_M }
22 { t_I t_xx t_M }
23 { t_I t_v t_+ t_xx t_M }
24 { t_I t_v t_+ t_xx t_M }
25 { t_I t_v t_+ t_xx t_M }
26 { t_I t_v t_+ t_xx t_M }
27 { t_I t_v t_+ t_xx t_M }
28 { t_I t_+ t_30 t_M }
29 { t_I t_+ t_30 t_M }
30 { t_I t_+ t_30 t_M }
31 { t_I t_+ t_30 t_M }
32 { t_I t_+ t_30 t_M }
33 { t_I t_v t_+ t_30 t_M }
34 { t_I t_v t_+ t_30 t_M }
35 { t_I t_v t_+ t_30 t_M }
36 { t_I t_v t_+ t_30 t_M }
37 { t_I t_v t_+ t_30 t_M }
38 { t_I t_+ t_40 t_M }
39 { t_I t_+ t_40 t_M }
40 { t_I t_+ t_40 t_M }
41 { t_I t_+ t_40 t_M }
42 { t_I t_+ t_40 t_M }
43 { t_I t_v t_+ t_40 t_M }
44 { t_I t_v t_+ t_40 t_M }
45 { t_I t_v t_+ t_40 t_M }
46 { t_I t_v t_+ t_40 t_M }
47 { t_I t_v t_+ t_40 t_M }
48 { t_I t_+ t_50 t_M }
49 { t_I t_+ t_50 t_M }
50 { t_I t_+ t_50 t_M }
51 { t_I t_+ t_50 t_M }
52 { t_I t_+ t_50 t_M }
53 { t_I t_v t_+ t_50 t_M }
54 { t_I t_v t_+ t_50 t_M }
55 { t_I t_v t_+ t_50 t_M }
56 { t_I t_v t_+ t_50 t_M }
57 { t_I t_v t_+ t_50 t_M }
58 { t_I hH }
59 { t_I hH }
}
.c configure -background black
}
proc start03 {w} {
# setup for german fuzzyclock#3, 8x3 panels: "morgens viertel nach elf"
destroy $w; pack [canvas $w -width 260 -height 260 -background grey]
#makeText $w t_N "Es wird" { 1 1 4 3 }
makeText $w t_N "Es wird" $::a1
makeText $w t_I "Es ist" $::b1
makeText $w t_W "Es war" $::c1
makeText $w t_AM "morgens" $::a2
makeText $w t_PM "abends" $::b2
makeText $w t_v "fünf" $::c2
makeText $w t_x "zehn" $::a3
#makeText $w t_M "Minuten" $::b3
makeText $w t_q "viertel" $::b3
makeText $w t_B "vor" $::c3
makeText $w t_P "nach" $::a4
makeText $w t_h "halb" $::b4
makeText $w t_0 "null" $::c4
makeText $w t_1 "ein" $::a5
makeText $w t_2 "zwei" $::b5
makeText $w t_3 "drei" $::c5
makeText $w t_4 "vier" $::a6
makeText $w t_5 "fünf" $::b6
makeText $w t_6 "sechs" $::c6
makeText $w t_7 "sieben" $::a7
makeText $w t_8 "acht" $::b7
makeText $w t_9 "neun" $::c7
makeText $w t_10 "zehn" $::a8
makeText $w t_11 "elf" $::b8
makeText $w t_12 "zwölf" $::c8
#makeText $w t_C_ "Uhr" $::c9
array set ::mTab {
00 { t_I }
01 { t_W }
02 { t_W }
03 { t_N t_P t_v t_M }
04 { t_N t_P t_v t_M }
05 { t_I t_P t_v t_M }
06 { t_W t_P t_v t_M }
07 { t_W t_P t_v t_M }
08 { t_N t_P t_x t_M }
09 { t_N t_P t_x t_M }
10 { t_I t_P t_x t_M }
11 { t_W t_P t_x t_M }
12 { t_W t_P t_x t_M }
13 { t_N t_P t_q t_M }
14 { t_N t_P t_q t_M }
15 { t_I t_P t_q t_M }
16 { t_W t_P t_q t_M }
17 { t_W t_P t_q t_M }
18 { t_N t_B t_x t_h t_M hH }
19 { t_N t_B t_x t_h t_M hH }
20 { t_I t_B t_x t_h t_M hH }
21 { t_W t_B t_x t_h t_M hH }
22 { t_W t_B t_x t_h t_M hH }
23 { t_N t_B t_v t_h t_M hH }
24 { t_N t_B t_v t_h t_M hH }
25 { t_I t_B t_v t_h t_M hH }
26 { t_W t_B t_v t_h t_M hH }
27 { t_W t_B t_v t_h t_M hH }
28 { t_N t_h hH }
29 { t_N t_h hH }
30 { t_I t_h hH }
31 { t_W t_h hH }
32 { t_W t_h hH }
33 { t_N t_P t_v t_h t_M hH }
34 { t_N t_P t_v t_h t_M hH }
35 { t_I t_P t_v t_h t_M hH }
36 { t_W t_P t_v t_h t_M hH }
37 { t_W t_P t_v t_h t_M hH }
38 { t_N t_P t_x t_h t_M hH }
39 { t_N t_P t_x t_h t_M hH }
40 { t_I t_P t_x t_h t_M hH }
41 { t_W t_P t_x t_h t_M hH }
42 { t_W t_P t_x t_h t_M hH }
43 { t_N t_B t_q t_M hH }
44 { t_N t_B t_q t_M hH }
45 { t_I t_B t_q t_M hH }
46 { t_W t_B t_q t_M hH }
47 { t_W t_B t_q t_M hH }
48 { t_N t_B t_x t_M hH }
49 { t_N t_B t_x t_M hH }
50 { t_I t_B t_x t_M hH }
51 { t_W t_B t_x t_M hH }
52 { t_W t_B t_x t_M hH }
53 { t_N t_B t_v t_M hH }
54 { t_N t_B t_v t_M hH }
55 { t_I t_B t_v t_M hH }
56 { t_W t_B t_v t_M hH }
57 { t_W t_B t_v t_M hH }
58 { t_N hH }
59 { t_N hH }
}
.c configure -background maroon
}
proc start04 {w} {
# setup for german fuzzyclock#4, 8x3 panels: "morgens viertel nach elf Uhr"
destroy $w; pack [canvas $w -width 260 -height 260 -background grey]
#makeText $w t_N "Es wird" { 1 1 4 3 }
makeText $w t_N "Es wird" $::a1
makeText $w t_I "Es ist" $::b1
makeText $w t_W "Es war" $::c1
makeText $w t_AM "morgens" $::a2
#makeText $w t_PM "abends" $::b2
makeText $w t_v "fünf" $::b2
makeText $w t_x "zehn" $::c2
#makeText $w t_M "Minuten" $::c2
makeText $w t_q "viertel" $::a3
makeText $w t_B "vor" $::b3
makeText $w t_P "nach" $::c3
makeText $w t_h "halb" $::a4
makeText $w t_0 "null" $::b4
makeText $w t_1 "ein" $::c4
makeText $w t_2 "zwei" $::a5
makeText $w t_3 "drei" $::b5
makeText $w t_4 "vier" $::c5
makeText $w t_5 "fünf" $::a6
makeText $w t_6 "sechs" $::b6
makeText $w t_7 "sieben" $::c6
makeText $w t_8 "acht" $::a7
makeText $w t_9 "neun" $::b7
makeText $w t_10 "zehn" $::c7
makeText $w t_11 "elf" $::a8
makeText $w t_12 "zwölf" $::b8
makeText $w t_C "Uhr" $::c8
array set ::mTab {
00 { t_I }
01 { t_W }
02 { t_W }
03 { t_N t_P t_v t_M }
04 { t_N t_P t_v t_M }
05 { t_I t_P t_v t_M }
06 { t_W t_P t_v t_M }
07 { t_W t_P t_v t_M }
08 { t_N t_P t_x t_M }
09 { t_N t_P t_x t_M }
10 { t_I t_P t_x t_M }
11 { t_W t_P t_x t_M }
12 { t_W t_P t_x t_M }
13 { t_N t_P t_q t_M }
14 { t_N t_P t_q t_M }
15 { t_I t_P t_q t_M }
16 { t_W t_P t_q t_M }
17 { t_W t_P t_q t_M }
18 { t_N t_B t_x t_h t_M hH }
19 { t_N t_B t_x t_h t_M hH }
20 { t_I t_B t_x t_h t_M hH }
21 { t_W t_B t_x t_h t_M hH }
22 { t_W t_B t_x t_h t_M hH }
23 { t_N t_B t_v t_h t_M hH }
24 { t_N t_B t_v t_h t_M hH }
25 { t_I t_B t_v t_h t_M hH }
26 { t_W t_B t_v t_h t_M hH }
27 { t_W t_B t_v t_h t_M hH }
28 { t_N t_h hH }
29 { t_N t_h hH }
30 { t_I t_h hH }
31 { t_W t_h hH }
32 { t_W t_h hH }
33 { t_N t_P t_v t_h t_M hH }
34 { t_N t_P t_v t_h t_M hH }
35 { t_I t_P t_v t_h t_M hH }
36 { t_W t_P t_v t_h t_M hH }
37 { t_W t_P t_v t_h t_M hH }
38 { t_N t_P t_x t_h t_M hH }
39 { t_N t_P t_x t_h t_M hH }
40 { t_I t_P t_x t_h t_M hH }
41 { t_W t_P t_x t_h t_M hH }
42 { t_W t_P t_x t_h t_M hH }
43 { t_N t_B t_q t_M hH }
44 { t_N t_B t_q t_M hH }
45 { t_I t_B t_q t_M hH }
46 { t_W t_B t_q t_M hH }
47 { t_W t_B t_q t_M hH }
48 { t_N t_B t_x t_M hH }
49 { t_N t_B t_x t_M hH }
50 { t_I t_B t_x t_M hH }
51 { t_W t_B t_x t_M hH }
52 { t_W t_B t_x t_M hH }
53 { t_N t_B t_v t_M hH }
54 { t_N t_B t_v t_M hH }
55 { t_I t_B t_v t_M hH }
56 { t_W t_B t_v t_M hH }
57 { t_W t_B t_v t_M hH }
58 { t_N hH }
59 { t_N hH }
}
.c configure -background MediumVioletRed ;# MediumPurple MediumOrchid
}
proc start11 {w} {
# setup for international fuzzyclock#1, 8x3 panels: "three o'clock twenty five minutes"
destroy $w; pack [canvas $w -width 260 -height 260 -background grey]
#makeText $w t_I "It is" { 1 1 4 3 }
makeText $w t_I "It is" $::a1
makeText $w t_AM "AM" $::b1
makeText $w t_0 "zero" $::c1
makeText $w t_1 "one" $::a2
makeText $w t_2 "two" $::b2
makeText $w t_3 "three" $::c2
makeText $w t_4 "four" $::a3
makeText $w t_5 "five" $::b3
makeText $w t_6 "six" $::c3
makeText $w t_7 "seven" $::a4
makeText $w t_8 "eight" $::b4
makeText $w t_9 "nine" $::c4
makeText $w t_10 "ten" $::a5
makeText $w t_11 "eleven" $::b5
makeText $w t_12 "twelve" $::c5
makeText $w t_C "o'clock" $::a6
makeText $w t_x "ten" $::b6
makeText $w t_xv "fifteen" $::c6
makeText $w t_xx "twenty" $::a7
makeText $w t_30 "thirty" $::b7
makeText $w t_40 "fourty" $::c7
makeText $w t_50 "fifty" $::a8
makeText $w t_v "five" $::b8
makeText $w t_M "minutes" $::c8
array set ::mTab {
00 { t_I }
01 { t_I }
02 { t_I }
03 { t_I t_v t_M }
04 { t_I t_v t_M }
05 { t_I t_v t_M }
06 { t_I t_v t_M }
07 { t_I t_v t_M }
08 { t_I t_x t_M }
09 { t_I t_x t_M }
10 { t_I t_x t_M }
11 { t_I t_x t_M }
12 { t_I t_x t_M }
13 { t_I t_xv t_M }
14 { t_I t_xv t_M }
15 { t_I t_xv t_M }
16 { t_I t_xv t_M }
17 { t_I t_xv t_M }
18 { t_I t_xx t_M }
19 { t_I t_xx t_M }
20 { t_I t_xx t_M }
21 { t_I t_xx t_M }
22 { t_I t_xx t_M }
23 { t_I t_v t_+ t_xx t_M }
24 { t_I t_v t_+ t_xx t_M }
25 { t_I t_v t_+ t_xx t_M }
26 { t_I t_v t_+ t_xx t_M }
27 { t_I t_v t_+ t_xx t_M }
28 { t_I t_30 t_M }
29 { t_I t_30 t_M }
30 { t_I t_30 t_M }
31 { t_I t_30 t_M }
32 { t_I t_30 t_M }
33 { t_I t_v t_+ t_30 t_M }
34 { t_I t_v t_+ t_30 t_M }
35 { t_I t_v t_+ t_30 t_M }
36 { t_I t_v t_+ t_30 t_M }
37 { t_I t_v t_+ t_30 t_M }
38 { t_I t_40 t_M }
39 { t_I t_40 t_M }
40 { t_I t_40 t_M }
41 { t_I t_40 t_M }
42 { t_I t_40 t_M }
43 { t_I t_v t_+ t_40 t_M }
44 { t_I t_v t_+ t_40 t_M }
45 { t_I t_v t_+ t_40 t_M }
46 { t_I t_v t_+ t_40 t_M }
47 { t_I t_v t_+ t_40 t_M }
48 { t_I t_50 t_M }
49 { t_I t_50 t_M }
50 { t_I t_50 t_M }
51 { t_I t_50 t_M }
52 { t_I t_50 t_M }
53 { t_I t_v t_50 t_M }
54 { t_I t_v t_50 t_M }
55 { t_I t_v t_50 t_M }
56 { t_I t_v t_50 t_M }
57 { t_I t_v t_50 t_M }
58 { t_I hH }
59 { t_I hH }
}
.c configure -background blue
}
### Main:
#start01 .c ;#1 : german fuzzyclock: "fünf Minuten vor halb vier Uhr"
#start02 .c ;#2 : german fuzzyclock: "drei Uhr fünf und zwanzig Minuten"
#start03 .c ;#3 : german fuzzyclock: "viertel nach drei"
#start04 .c ;#4 : german fuzzyclock: "viertel nach drei Uhr"
#
start11 .c ;#11: international fuzzyclock: "three o'clock twenty five minutes"
focus -f .c
update
bind . { console show }
catch {console show} ;##
catch {console hide}
wm title . "$Prog(title) $Prog(version)"
puts "$Prog(title) $Prog(version)"
puts "tcl: $tcl_patchLevel"
puts "tk : $tk_patchLevel"
puts "now,h,m,x,y,z:change time, u:update, run, stop, e:exit"
now
after 250
u
sync0
run
### EOF ###
======
----
**Remarks**
if 0 {
[MiHa] 2015-02-24 - Some bugfixes for the minute-table, and improved wiki-formatting.
[MiHa] 2015-03-03 - I added two more versions for a german fuzzyclock "morgens viertel nach elf Uhr", meaning "quarter past eleven". <
>Rearranging the panels is much more easy to do now with the spreadsheet-addressing, then with the old list of coordinates.<
>To avoid adding another row of panels, the entries for "PM"/"evening" and "minutes" had to be dropped.
Some ideas for further programming:
* change font of text in lit panels to be '''bold'''
* ESC --> Quit
* click on panel "it is" --> update clock
* click on panels "one", "two" etc. --> change layout
* click on panels "before"/"after" --> change color
* catch resize-event, and resize panels and text
* Color-Table (needs some concept)
* F1 --> Help / Balloon-help when hovering over panels
To sum up the experience:
* Tcl by itself is quite simple.
* A demo-program that shows every feature should be possible in about one printed page
* Things to lookout:
** keeping quotes and braces balanced inside comments
** when to use / not use $ with variablenames ( set i 1; puts $i; incr i $i )
* Tk is much bigger, and needs going to the docs quite often
* The help-docs are not bad as such, but are very frustrating to use -->
** here is still much room for improvement
* IDE: [http://geany.org/%|%Geany%|%] - code completion for tcl needs work
[kpv] Also check out [Word Clock] for another textual clock.
[MiHa] Yes - it has already been on the list, right before "Designers notes".
***Old***
[MiHa] 2015-03-04 - Now finally with an international fuzzyclock "quarter before/past".
[MiHa] 2015-03-05 - I changed the coordinates and scale, to get finer grained text-positioning, <
>
as well as adjustable columnwidth for each of the layouts. <
>
Further, I gave each layout its very own position on the screen.
When starting, the program now looks at argv, and processes the commandline-arguments. <
>
That works both with tclsh and wish.
Currently implemented commandline-arguments to control layout, sound, and placement on the screen:
* -s0 -s1 -s2 : no sound / simple chime (beep) at the full hour / ship's bell every half hour. <
>The default is no sound.
* -p0 -p1 -p2 : no setting of screen-position / top left / top right. <
>The default is to give each layout a unique position on screen.
* Everything else is understood as a key to select the layout. <
>If not recognized, some default-layout is used. <
>Recognized are DE1,DE2,DE3,DE4 for the german clocks, <
>I1,I2 for the international clocks, and G,SB for the ship's bells.
With all that plumbing in place, it is now easy to show all the layouts at once, and compare them. <
>
(Re-using my test-setup as a showcase:)
To see this in action, use a batchfile (for Windows) such as the following <
>
to start one tcl-interpreter for each of the layouts:
----
======none
start wish FuzzyClock.tcl DE1
start wish FuzzyClock.tcl DE2
start wish FuzzyClock.tcl DE3
start wish FuzzyClock.tcl DE4
start wish FuzzyClock.tcl I1
start wish FuzzyClock.tcl I2
start wish FuzzyClock.tcl G
start wish FuzzyClock.tcl SB -s2
======
That means, all these clocks are running with no sound, except for the one with -s2, <
>
and all the layouts get distributed to different places across the screen.
----
***New***
[MiHa] 2015-03-13 - I have created layouts for ship's bell / "Glasenuhr" <
> http://en.wikipedia.org/wiki/Ship%27s_bell / http://de.wikipedia.org/wiki/Glasenuhr <
>
with both a german and an international version.
My international ship's bell uses the "simpler system" according to the wikipedia-page, <
>
that is, without the dogwatch split into two parts. <
>
Not being a sailor, that looks like the [http://en.wikipedia.org/wiki/Watch_system#Merchant_ships%|%Standard merchant watch system%|%] to me.
To sum up the concept for the ship's clock:
* In the days of sailing ships, they used hour-glasses for timing, one glass running 4 hours and one running 30 minutes.
* The turning of the glasses are signalled with the ship's bell.
* The day is divided into "watches" (working shifts) that last 4 hours. <
>The current watch is not announced with the bell - everyone on board has to know that it is day/night/afternoon etc.
* Each watch is divided into half-hour periods, so each watch lasts "8 bells", <
>i.e. it starts with "8 bells" ending the previous watch, gets to "1 bell" after half an hour, <
>"2 bells" after one hour, etc., and ends with "8 bells" after 4 hours.
To bring those shipclocks to the same "fuzzy precision" as the other clocks,
I added 5-minute "lights".
Finally, I changed the "every" and "sync"-mechanism to use a more gentle approach <
>
to bring the screen-updates to occur on multiples of 10 seconds. <
>
The old coding made the program unresponsive during the first few seconds.
Have fun !
}
<>Date and Time