Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
779 - 1
#!/usr/bin/perl
2
#!/usr/bin/perl -d:ptkdb
3
 
4
###############################################################################
5
#
6
# libmouse.pl -  3D Mouse Space Navigator
7
#
8
# Copyright (C) 2009  Rainer Walther  (rainerwalther-mail@web.de)
9
#
10
# Creative Commons Lizenz mit den Zusaetzen (by, nc, sa)
11
#
12
# Es ist Ihnen gestattet: 
13
#     * das Werk vervielfältigen, verbreiten und öffentlich zugänglich machen
14
#     * Abwandlungen bzw. Bearbeitungen des Inhaltes anfertigen
15
# 
16
# Zu den folgenden Bedingungen:
17
#     * Namensnennung.
18
#       Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
19
#     * Keine kommerzielle Nutzung.
20
#       Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden.
21
#     * Weitergabe unter gleichen Bedingungen.
22
#       Wenn Sie den lizenzierten Inhalt bearbeiten oder in anderer Weise umgestalten,
23
#       verändern oder als Grundlage für einen anderen Inhalt verwenden,
24
#       dürfen Sie den neu entstandenen Inhalt nur unter Verwendung von Lizenzbedingungen
25
#       weitergeben, die mit denen dieses Lizenzvertrages identisch oder vergleichbar sind.
26
# 
27
# Im Falle einer Verbreitung müssen Sie anderen die Lizenzbedingungen, unter welche dieses
28
# Werk fällt, mitteilen. Am Einfachsten ist es, einen Link auf diese Seite einzubinden.
29
# 
30
# Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie die Einwilligung
31
# des Rechteinhabers dazu erhalten.
32
# 
33
# Diese Lizenz lässt die Urheberpersönlichkeitsrechte unberührt.
34
# 
35
# Weitere Details zur Lizenzbestimmung gibt es hier:
36
#   Kurzform: http://creativecommons.org/licenses/by-nc-sa/3.0/de/
37
#   Komplett: http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
38
#
39
###############################################################################
40
#
41
# 2009-12-09 0.0.1 rw created
42
#
43
###############################################################################
44
 
45
$Version{'libmouse.pl'} = "0.0.1 - 2009-12-09";
46
 
47
# Packages
48
use threads;                # http://search.cpan.org/~jdhedden/threads-1.72/threads.pm
49
                            # http://perldoc.perl.org/threads.html
50
use threads::shared;        # http://search.cpan.org/~jdhedden/threads-shared-1.28/shared.pm
51
 
52
# Hashes exported to other threads and main-program
53
share (%Stick);
54
 
55
my $StickRange = 1024;           # global stick range
56
my $Bias = $StickRange/2;
57
my $ResMouse = 1000;             # +-500
58
my $MousePrg = "bin/3DMouse.exe";
59
 
60
sub Mouse3D()
61
    {
62
    if ( ! -f $MousePrg )
63
        {
64
        return;
65
        }
66
 
67
    $Stick{'StickRange'} = $StickRange;
68
    $Stick{'MouseRotX'}    = $Bias;
69
    $Stick{'MouseRotY'}    = $Bias;
70
    $Stick{'MouseRotZ'}    = $Bias;
71
    $Stick{'MouseTranX'}   = $Bias;
72
    $Stick{'MouseTranY'}   = $Bias;
73
    $Stick{'MouseTranZ'}   = $Bias;
74
    $Stick{'MouseButton'}  = 0;
75
    $Stick{'_MouseTimestamp'} = time;
76
 
77
    $Stick{'_MousePid'} = open (my $fh, "$MousePrg |");
78
 
79
    while (my $Line = <$fh> )
80
        {
81
        if ( $Line =~ /Device 0: DOF: T: (\S*)\s*(\S*)\s*(\S*) R: (\S*)\s*(\S*)\s*(\S*)/g )
82
            {
83
            $TranslateX= $1;
84
            $TranslateY= $2;
85
            $TranslateZ= $3;
86
            $RotateX= $4;
87
            $RotateY= $5;
88
            $RotateZ= $6;
89
 
90
            lock (%Stick);     # until end of block
91
 
92
            $Stick{'MouseRotX'}  = $Bias - int ($RotateY / $ResMouse * $StickRange);
93
            $Stick{'MouseRotY'}  = $Bias - int ($RotateX / $ResMouse * $StickRange);
94
            $Stick{'MouseRotZ'}  = $Bias + int ($RotateZ / $ResMouse * $StickRange);
95
            $Stick{'MouseTranX'} = $Bias + int ($TranslateX / $ResMouse * $StickRange);
96
            $Stick{'MouseTranY'} = $Bias - int ($TranslateY / $ResMouse * $StickRange);
97
            $Stick{'MouseTranZ'} = $Bias + int ($TranslateZ / $ResMouse * $StickRange);
98
            $Stick{'_MouseTimestamp'} = time;
99
            }
100
        elsif ( $Line =~ /Device 0: Button mask: (\S*)/g )
101
            {
102
            $Button = $1;
103
 
104
            lock (%Stick);     # until end of block
105
            $Stick{'MouseButton'}  = sprintf ("%d", $Button);
106
            $Stick{'_MouseTimestamp'} = time;
107
            }
108
        }
109
    }
110
 
111
 
112
# Kill Mouse3D Proceess
113
sub Mouse3DStop()
114
    {
115
    my $MousePid = $Stick{'_MousePid'};
116
    if ( $MousePid ne "" )
117
        {
118
        kill -9, $MousePid;
119
        }
120
    }
121
 
122
 
123
# check, if button "Num" pressed, Num = 0 .. n
124
sub MouseButton()
125
    {
126
    my ($Num) = @_;
127
 
128
    return (($Stick{'MouseButton'} >> $Num) & 1) == 1;
129
    }
130
 
131
1;
132
 
133
__END__