Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
834 | - | 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__ |