#!/usr/bin/env perl # # testjoystick.pl # # Copyright (C) 2005 David J. Goehrig # # ------------------------------------------------------------------------------ # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # ------------------------------------------------------------------------------ # # Please feel free to send questions, suggestions or improvements to: # # David J. Goehrig # dgoehrig@cpan.org # use strict; use SDL; use SDL::App; use SDL::Rect; use SDL::Event; sub WatchJoystick($){ (my $joystick) = @_; my $screenWidth = 640; my $screenHeight = 480; my $app = new SDL::App(-title => "Joystick Test", -width => $screenWidth, -height => $screenHeight, -depth=> 16 ); #Print information about the joystick we are watching my $name = SDL::JoystickName(SDL::JoystickIndex($joystick)); print "Watching joystick ".SDL::JoystickIndex($joystick). ": (".($name ? $name : "Unknown Joystick" ).")\n"; print "Joystick has ".SDL::JoystickNumAxes($joystick)." axes, ". SDL::JoystickNumHats($joystick)." hats, ". SDL::JoystickNumBalls($joystick)." balls, and ". SDL::JoystickNumButtons($joystick)." buttons\n"; my $event = new SDL::Event; my $done = 0; my $colorWhite = new SDL::Color(-r=>255, -g=>255, -b=>255); my $colorBlack = new SDL::Color(); my @axisRect = (); my $numAxes=SDL::JoystickNumAxes($joystick); while(!$done) { while($event->poll()) { if($event->type() eq SDL::JOYAXISMOTION()) { print "Joystick ".SDL::JoyAxisEventWhich($$event). " axis ".SDL::JoyAxisEventAxis($$event). " value: ".SDL::JoyAxisEventValue($$event)."\n"; } elsif($event->type() eq SDL::JOYHATMOTION()) { print "Joystick ".SDL::JoyHatEventWhich($$event). " hat ".SDL::JoyHatEventHat($$event); if(SDL::JoyHatEventValue($$event) == SDL::HAT_CENTERED() ) { print " centered"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_UP() ) { print " up"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_RIGHT() ) { print " right"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_DOWN() ) { print " down"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_LEFT()) { print " left"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_RIGHTUP() ) { print " right & up"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_RIGHTDOWN() ) { print " right & down"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_LEFTDOWN() ) { print " left & down"; } elsif(SDL::JoyHatEventValue($$event) == SDL::HAT_LEFTUP()) { print " left & up"; } print "\n"; } elsif($event->type() eq SDL::JOYBALLMOTION()){ print "Joystick ".SDL::JoyBallEventWhich($$event). " ball ".SDL::JoyBallEventBall($$event). " delta: (".SDL::JoyBallEventXrel($$event). ",".SDL::JoyBallEventYrel($$event)."\n"; } elsif($event->type() eq SDL::JOYBUTTONDOWN()){ print "Joystick ".SDL::JoyButtonEventWhich($$event). " button ".SDL::JoyButtonEventButton($$event)." down\n"; } elsif($event->type() eq SDL::JOYBUTTONUP()){ print "Joystick ".SDL::JoyButtonEventWhich($$event). " button ".SDL::JoyButtonEventButton($$event)." up\n"; } elsif($event->type() eq SDL_QUIT() or ($event->type() eq SDL_KEYDOWN() and $event->key_sym() == SDLK_ESCAPE)){ $done = 1; } #Update visual joystick state for(my $i =0; $i < SDL::JoystickNumButtons($joystick); $i++) { my $rect = new SDL::Rect( -width => 32, -height => 32, -x => $i*34, -y => $screenHeight-34); if(SDL::JoystickGetButton($joystick, $i) eq SDL::PRESSED()) { $app->fill($rect, $colorWhite); } else { $app->fill($rect, $colorBlack); } $app->update($rect); } for (my $i = 0; $i < $numAxes; $i+=1) { #Remove previous axis box if($axisRect[$i]){ $app->fill($axisRect[$i], $colorBlack); $app->update($axisRect[$i]); } # Draw the axis my $ox = SDL::JoystickGetAxis($joystick, $i); my $x= abs ($ox/256); if( $x < 0) { $x=0; } elsif ( $x > ($screenWidth-16) ){ $x = $screenWidth-16; } if ($ox < 0) { $axisRect[$i] = new SDL::Rect( -width=> $x, -height=> 32, -x => ($screenWidth/2) - $x, -y => $i*34 ); } else { $axisRect[$i] = new SDL::Rect( -width=> $x, -height=> 32, -x => $screenWidth/2 , -y => $i*34 ); } $app->fill($axisRect[$i], $colorWhite); $app->update($axisRect[$i]); } } } } die "Could not initialize SDL: ", SDL::GetError() if( 0 > SDL::Init(SDL_INIT_JOYSTICK())); printf "There are %d joysticks attched\n", SDL::NumJoysticks(); for(my $i = 0; $i < SDL::NumJoysticks(); $i++){ my $name = SDL::JoystickName($i); print "Joystick ".$i.": ".($name ? $name : "Unknown Joystick")."\n"; } if ( $ARGV[0] ne undef){ my $joystick = SDL::JoystickOpen($ARGV[0]); if(!$joystick){ print "Couldn't open joystick ".$ARGV[0].": ".SDL::GetError()."\n"; } else { WatchJoystick($joystick); SDL::JoystickClose($joystick); } SDL::QuitSubSystem(SDL_INIT_JOYSTICK()); } exit; sub draw_axis_method_2() { } __DATA__ sub draw_axis_method_1() { for (my $i = 0; $i < ($numAxes/2); $i+=2) { #Remove previous axis box if($axisRect[$i]){ $app->fill($axisRect[$i], $colorBlack); $app->update($axisRect[$i]); } # Draw the X/Y axis my $x = SDL::JoystickGetAxis($joystick, $i)+32768; $x *= $screenWidth; $x /= 65535; if( $x < 0) { $x=0; } elsif ( $x > ($screenWidth-16) ){ $x = $screenWidth-16; } my $y = SDL::JoystickGetAxis($joystick, $i+1)+32768; $y *= $screenHeight; $y /= 65535; if( $y < 0) { $y=0; } elsif ( $y > ($screenHeight-16) ){ $y = $screenHeight-16; } $axisRect[$i] = new SDL::Rect( -width=> 16, -height=> 16, -x => $x, -y => $y); $app->fill($axisRect[$i], $colorWhite); $app->update($axisRect[$i]); } } }