#!/usr/bin/perl
#!/usr/bin/perl -d:ptkdb

###############################################################################
#
# libmouse.pl -  3D Mouse Space Navigator
#
# Copyright (C) 2009  Rainer Walther  (rainerwalther-mail@web.de)
#
# Creative Commons Lizenz mit den Zusaetzen (by, nc, sa)
#
# Es ist Ihnen gestattet: 
#     * das Werk vervielfältigen, verbreiten und öffentlich zugänglich machen
#     * Abwandlungen bzw. Bearbeitungen des Inhaltes anfertigen
# 
# Zu den folgenden Bedingungen:
#     * Namensnennung.
#       Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
#     * Keine kommerzielle Nutzung.
#       Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden.
#     * Weitergabe unter gleichen Bedingungen.
#       Wenn Sie den lizenzierten Inhalt bearbeiten oder in anderer Weise umgestalten,
#       verändern oder als Grundlage für einen anderen Inhalt verwenden,
#       dürfen Sie den neu entstandenen Inhalt nur unter Verwendung von Lizenzbedingungen
#       weitergeben, die mit denen dieses Lizenzvertrages identisch oder vergleichbar sind.
# 
# Im Falle einer Verbreitung müssen Sie anderen die Lizenzbedingungen, unter welche dieses
# Werk fällt, mitteilen. Am Einfachsten ist es, einen Link auf diese Seite einzubinden.
# 
# Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie die Einwilligung
# des Rechteinhabers dazu erhalten.
# 
# Diese Lizenz lässt die Urheberpersönlichkeitsrechte unberührt.
# 
# Weitere Details zur Lizenzbestimmung gibt es hier:
#   Kurzform: http://creativecommons.org/licenses/by-nc-sa/3.0/de/
#   Komplett: http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
#
###############################################################################
#
# 2009-12-09 0.0.1 rw created
#
###############################################################################

$Version{'libmouse.pl'} = "0.0.1 - 2009-12-09";

# Packages
use threads;                # http://search.cpan.org/~jdhedden/threads-1.72/threads.pm
                            # http://perldoc.perl.org/threads.html
use threads::shared;        # http://search.cpan.org/~jdhedden/threads-shared-1.28/shared.pm

# Hashes exported to other threads and main-program
share (%Stick);

my $StickRange = 1024;           # global stick range
my $Bias = $StickRange/2;
my $ResMouse = 1000;             # +-500
my $MousePrg = "bin/3DMouse.exe";

sub Mouse3D()
    {
    if ( ! -f $MousePrg )
        {
        return;
        }

    $Stick{'StickRange'} = $StickRange;
    $Stick{'MouseRotX'}    = $Bias;
    $Stick{'MouseRotY'}    = $Bias;
    $Stick{'MouseRotZ'}    = $Bias;
    $Stick{'MouseTranX'}   = $Bias;
    $Stick{'MouseTranY'}   = $Bias;
    $Stick{'MouseTranZ'}   = $Bias;
    $Stick{'MouseButton'}  = 0;
    $Stick{'_MouseTimestamp'} = time;

    $Stick{'_MousePid'} = open (my $fh, "$MousePrg |");

    while (my $Line = <$fh> )
        {
        if ( $Line =~ /Device 0: DOF: T: (\S*)\s*(\S*)\s*(\S*) R: (\S*)\s*(\S*)\s*(\S*)/g )
            {
            $TranslateX= $1;
            $TranslateY= $2;
            $TranslateZ= $3;
            $RotateX= $4;
            $RotateY= $5;
            $RotateZ= $6;

            lock (%Stick);     # until end of block

            $Stick{'MouseRotX'}  = $Bias - int ($RotateY / $ResMouse * $StickRange);
            $Stick{'MouseRotY'}  = $Bias - int ($RotateX / $ResMouse * $StickRange);
            $Stick{'MouseRotZ'}  = $Bias + int ($RotateZ / $ResMouse * $StickRange);
            $Stick{'MouseTranX'} = $Bias + int ($TranslateX / $ResMouse * $StickRange);
            $Stick{'MouseTranY'} = $Bias - int ($TranslateY / $ResMouse * $StickRange);
            $Stick{'MouseTranZ'} = $Bias + int ($TranslateZ / $ResMouse * $StickRange);
            $Stick{'_MouseTimestamp'} = time;
            }
        elsif ( $Line =~ /Device 0: Button mask: (\S*)/g )
            {
            $Button = $1;

            lock (%Stick);     # until end of block
            $Stick{'MouseButton'}  = sprintf ("%d", $Button);
            $Stick{'_MouseTimestamp'} = time;
            }
        }
    }


# Kill Mouse3D Proceess
sub Mouse3DStop()
    {
    my $MousePid = $Stick{'_MousePid'};
    if ( $MousePid ne "" )
        {
        kill -9, $MousePid;
        }
    }


# check, if button "Num" pressed, Num = 0 .. n
sub MouseButton()
    {
    my ($Num) = @_;

    return (($Stick{'MouseButton'} >> $Num) & 1) == 1;
    }

1;

__END__
