#!/usr/bin/perl -w

# RobotControl is a program for controlling Robot Maxamilian's servos.
# Copyright (C) 1999  Patrick M. Rael
#
# 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; either version 2
# of the License, or (at your option) any later version.
#
# 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

#
# Use the Tk package
#
use Tk;


#
# Create the Main window, with a Menu of a few basic options, and a frame
#
my $mw = new MainWindow(-width  => '400',
                        -height => '400');
my $f = $mw->Frame(-relief => 'raised',
                   -background => 'tan3',
                   -borderwidth => 2);
$f->pack(-side => 'top',
         -anchor => 'n',
         -expand => 1,
         -fill => 'x');
my $fileMenu = $f->Menubutton(-text => "File",
                              -tearoff => 0,
                              -background => 'tan3',
                              -menuitems => [
                                      ['command' => "Quit",
                                       -command  => sub { exit } ]
                                   ])->pack( -side => 'left');

#
# Load several pictures of RMax
#
my $canvas = $mw->Canvas(-height => 100,
                         -width  => 410,
                         -background => 'firebrick4');
place_image($canvas, "Mini-SSC-II.gif",                45,50);
place_image($canvas, "InsideRobotHead.gif",           130,50);
place_image($canvas, "RMax2.gif",                     210,50);
place_image($canvas, "Schematic.gif",                 300,50);
place_image($canvas, "ChromeLook1-Thumbnail.gif",     375,50);
$canvas->pack();

my $f2 = $mw->Frame(-relief => 'raised',
                    -borderwidth => 1)->pack();


#
# Create the Scale bars
#
$rightEye    = createScalebar($f2, "Right Eye",      0,  0,254,  0,0);
$leftEye     = createScalebar($f2, "Left Eye",       1,  0,254,  0,1);
$upDown      = createScalebar($f2, "Eyes Up/Dn",     2,  0,254,  1,0);
$spinHead    = createScalebar($f2, "Spin Head",      3,  0,254,  1,1);
$rightEyeLid = createScalebar($f2, "Right Eye-Lid",  4,  254,0,  2,0);
$leftEyeLid  = createScalebar($f2, "Left Eye-Lid",   5,  0,254,  2,1);

$bothEyesLR  = createScalebar($f2, "Both Eyes L/R", -1,  0,254,  3,0);
$bothEyeLids = createScalebar($f2, "Both Eye-Lids", -1,  0,254,  3,1);

$bothEyesLR->configure(-command =>  [\&vscale_cb, $rightEye, $leftEye]); 
$bothEyeLids->configure(-command => [\&vscale_cb,$rightEyeLid,$leftEyeLid]); 



#
# Enter the main graphics event loop
#
MainLoop;



#
# Subroutine scale_cb() - Callback for a Scale bar change.
#
#     $sid [ServoID] is an integer I define from 0-7+ which is actually
#           a port number of the Mini-SSC-II.
#     $value is the value 0-254 of the Scale bar.  It seems to be passed in
#           Magically by Perl/Tk because I don't specify it.  What luck!
#
sub scale_cb {
    my ($sid, $value) = @_;

    #
    # Create a Packet of bytes: #255, Servo, Position
    #
    my $ch_sop = chr(255);     # char, start-of-packet, sop
    my $ch_sid = chr($sid);    # char, Servo-ID, sid
    my $ch_val = chr($value);  # char, Servo Position 0-254, val
    my $packet = "$ch_sop$ch_sid$ch_val";
    print "$packet";
}


#
# Subroutine vscale_cb() - Callback for driving two other servos.
#
sub vscale_cb {
    my ($slave1,$slave2,$value) = @_;

    $slave1->set($value);
    $slave2->set($value);
}


#
# Subroutine createScalebar() - Creates a Scale bar.
#
sub createScalebar {
    my ($container, $label,$servoID,$from,$to,$row,$col) = @_;

    my $sb = $container->Scale(-from => $from,
                               -to   => $to,
                               -label => "$label",
                               -length => '200',
                               -showvalue => '1',
                               -tickinterval => '50',
                               -orient  => 'horizontal',
                               -background => 'tan1',
                               -trough => 'tan4',
                               -command => [ \&scale_cb, $servoID] );
    $sb->grid(-row    => "$row",
              -column => "$col");

    return $sb;

}


#
# Subroutine place_image() - Loads "Photo's"
#
sub place_image {
    my ($container,$file,$x,$y) = @_;

    my $photo = $container->Photo(-file => $file);
    my $image = $container->createImage($x,$y, -image => $photo);
}

