#!/usr/bin/env perl
use warnings;
use strict;
use Tk;
my $mw = MainWindow->new(
-title => "binary-clock 10111",
-background => "black",
);
$mw->geometry('150x120');
$mw->resizable(0, 0);
my $secFrame = $mw->Frame(
-width => 50,
-height => 100,
-borderwidth => 10,
-background => "black"
);
my $minFrame = $mw->Frame(
-width => 50,
-height => 100,
-borderwidth => 10,
-background => "black"
);
my $hourFrame = $mw->Frame(
-width => 50,
-height => 100,
-borderwidth => 10,
-background => "black"
);
my %LED = setupLEDS($secFrame, $minFrame, $hourFrame);
my $decTime;
$mw->repeat(1000, [\&myMainLoop, \$decTime, \%LED]);
myMainLoop(\$decTime, \%LED);
$mw->Label(
-textvariable => \$decTime,
-background => "black",
-foreground => "grey"
)->grid();
Tk::grid($hourFrame, $minFrame, $secFrame);
MainLoop();
sub myMainLoop {
my ($timeVarRef, $LED) = @_;
updateTime($timeVarRef);
my ($hours, $min, $sec) = $$timeVarRef =~ /^(\d{2}):(\d{2}):(\d{2})$/;
updateLEDS($hours, $min, $sec, $LED);
return;
}
sub updateTime {
my ($timeVarRef) = @_;
my ($sec, $min, $hours) = localtime;
$$timeVarRef = sprintf "%02d:%02d:%02d", ($hours, $min, $sec);
return;
}
sub separateTenOne {
my ($decimal) = @_;
my ($ten, $one) = (0, 0);
$ten = int $decimal / 10;
$one = $decimal - $ten * 10;
return ($ten, $one);
}
sub updateLEDS {
my ($hour, $min, $sec, $LED) = @_;
my ($secTen, $secOne) = separateTenOne($sec);
my ($minTen, $minOne) = separateTenOne($min);
my ($hourTen, $hourOne) = separateTenOne($hour);
# seconds:
for my $i (1, 2, 4) {
my $color = ($i & $secTen) ? "blue" : "black";
$$LED{"sec10_$i"}->configure(-background => $color);
}
for my $i (1, 2, 4, 8) {
my $color = ($i & $secOne) ? "blue" : "black";
$$LED{"sec1_$i"}->configure(-background => $color);
}
# minutes:
for my $i (1, 2, 4) {
my $color = ($i & $minTen) ? "green" : "black";
$$LED{"min10_$i"}->configure(-background => $color);
}
for my $i (1, 2, 4, 8) {
my $color = ($i & $minOne) ? "green" : "black";
$$LED{"min1_$i"}->configure(-background => $color);
}
# and finally hours:
for my $i (1, 2) {
my $color = ($i & $hourTen) ? "red" : "black";
$$LED{"hour10_$i"}->configure(-background => $color);
}
for my $i (1, 2, 4, 8) {
my $color = ($i & $hourOne) ? "red" : "black";
$$LED{"hour1_$i"}->configure(-background => $color);
}
}
sub setupLEDS {
# now i'll put the "LED"s (label widgets) into a hash and grid them.
my ($secFrame, $minFrame, $hourFrame) = @_;
my %LED;
# seconds first:
for my $i (1, 2, 4, 8) {
$LED{"sec1_$i"} = $secFrame->Label(
-text => ' ',
-background => "blue",
-relief => "groove"
);
}
for my $i (1, 2, 4) {
$LED{"sec10_$i"} = $secFrame->Label(
-text => ' ',
-background => "blue",
-relief => "groove"
);
}
Tk::grid("x", $LED{"sec1_8"});
Tk::grid($LED{"sec10_4"}, $LED{"sec1_4"});
Tk::grid($LED{"sec10_2"}, $LED{"sec1_2"});
Tk::grid($LED{"sec10_1"}, $LED{"sec1_1"});
# now minutes:
for my $i (1, 2, 4, 8) {
$LED{"min1_$i"} = $minFrame->Label(
-text => ' ',
-background => "green",
-relief => "groove"
);
}
for my $i (1, 2, 4) {
$LED{"min10_$i"} = $minFrame->Label(
-text => ' ',
-background => "green",
-relief => "groove"
);
}
Tk::grid("x", $LED{"min1_8"});
Tk::grid($LED{"min10_4"}, $LED{"min1_4"});
Tk::grid($LED{"min10_2"}, $LED{"min1_2"});
Tk::grid($LED{"min10_1"}, $LED{"min1_1"});
# and hours:
for my $i (1, 2, 4, 8) {
$LED{"hour1_$i"} = $hourFrame->Label(
-text => ' ',
-background => "red",
-relief => "groove"
);
}
for my $i (1, 2) {
$LED{"hour10_$i"} = $hourFrame->Label(
-text => ' ',
-background => "red",
-relief => "groove"
);
}
Tk::grid("x", $LED{"hour1_8"});
Tk::grid("x", $LED{"hour1_4"});
Tk::grid($LED{"hour10_2"}, $LED{"hour1_2"});
Tk::grid($LED{"hour10_1"}, $LED{"hour1_1"});
return %LED;
}