Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

226 lines (204 sloc) 6.066 kb
#!/usr/bin/env perl
#
#
# testjoystick.pl
#
# adapted from SDL-1.2.x/test/testjoystick.c
use strict;
#use warnings;
use SDL;
use SDLx::App;
use SDL::Rect;
use SDL::Event;
sub WatchJoystick($) {
( my $joystick ) = @_;
my $screenWidth = 640;
my $screenHeight = 480;
my $app = SDLx::App->new(
-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 = SDL::Event->new;
my $done = 0;
my $colorWhite = SDL::Color->new( -r => 255, -g => 255, -b => 255 );
my $colorBlack = SDL::Color->new();
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 = SDL::Rect->new(
-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] = SDL::Rect->new(
-width => $x,
-height => 32,
-x => ( $screenWidth / 2 ) - $x,
-y => $i * 34
);
} else {
$axisRect[$i] = SDL::Rect->new(
-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] = SDL::Rect->new( -width=> 16,
-height=> 16,
-x => $x,
-y => $y);
$app->fill($axisRect[$i], $colorWhite);
$app->update($axisRect[$i]);
}
}
}
Jump to Line
Something went wrong with that request. Please try again.