# # Usage: # ruby joy2.rb [n] # n: if given, use n'th joystick # if not given, show all connected joystick # require 'sdl' White = [255,255,255] def ary_max; 50.0; end def print_joystick_info for i in 0..SDL::Joystick.num-1 print i,":",SDL::Joystick.indexName(0),"\n" end end def display_button_state ( screen, joy ) for i in 0..joy.numButtons-1 if joy.button(i) then screen.fillRect( i*30+30, 50, 10, 10, [0,0,128] ) else screen.fillRect( i*30+30, 50, 10, 10, White ) end end end def display_hat_state ( screen, joy ) # display the state of only first hat if joy.numHats > 0 then x = y = 0 x = 1 if ( joy.hat(0) & SDL::Joystick::HAT_RIGHT ) != 0 x = -1 if ( joy.hat(0) & SDL::Joystick::HAT_LEFT ) != 0 y = 1 if ( joy.hat(0) & SDL::Joystick::HAT_DOWN ) != 0 y = -1 if ( joy.hat(0) & SDL::Joystick::HAT_UP ) != 0 screen.fillRect( 450 + x*40, 200 + y*40, 10, 10, White ) end end def display_axis_state ( screen, joy, font, x1, y1, x2, y2, x3, y3, x4, y4, num ) level = 5 color = [15*(num*num/ary_max/ary_max + num), 140*(num*num/ary_max/ary_max), 255*(num*num/ary_max/ary_max)] screen.drawAABezier(x1, y1, x2, y2, x3, y3, x4, y4,level,color) return x1, y1, x2, y2, x3, y3, x4, y4 end SDL.init( SDL::INIT_VIDEO|SDL::INIT_JOYSTICK ) screen = SDL::setVideoMode(640, 480, 16, SDL::SWSURFACE) if SDL::Joystick.num == 0 then print "No joystick available\n" exit end if ARGV.size == 0 then print_joystick_info exit end joynum = ARGV[0].to_i if SDL::Joystick.num < joynum then print "Joystick No.#{joynum} is not available\n" exit end joy=SDL::Joystick.open(joynum) ary_x1 = Array.new() ary_y1 = Array.new() ary_x2 = Array.new() ary_y2 = Array.new() ary_x3 = Array.new() ary_y3 = Array.new() ary_x4 = Array.new() ary_y4 = Array.new() while true while event = SDL::Event2.poll case event when SDL::Event2::KeyDown, SDL::Event2::Quit exit end end SDL::Joystick.updateAll # screen.fillRect(0,0,640,480,0) # display_button_state screen, joy # display_hat_state screen, joy x1 = joy.axis(0)*320/32768 + 320 y1 = joy.axis(1)*240/32768 + 240 x2 = joy.axis(0)*320/32768 + 320 y2 = -joy.axis(1)*240/32768 + 240 x3 = joy.axis(2)*320/32768 + 320 y3 = joy.axis(3)*240/32768 + 240 x4 = joy.axis(2)*320/32768 + 320 y4 = joy.axis(3)*240/32768 + 240 ary_x1 << x1 ary_y1 << y1 ary_x2 << x2 ary_y2 << y2 ary_x3 << x3 ary_y3 << y3 ary_x4 << x4 ary_y4 << y4 =begin (1...4).each do |num| eval("ary_x#{num} << x#{num}") eval("ary_y#{num} << y#{num}") end =end (0...ary_x1.size - 1).each do |num| display_axis_state(screen, joy, nil, ary_x1[num], ary_y1[num], ary_x2[num], ary_y2[num], ary_x3[num], ary_y3[num], ary_x4[num], ary_y4[num], num) end if ary_x1.size == ary_max then ary_x1.delete_at(0) ary_y1.delete_at(0) ary_x2.delete_at(0) ary_y2.delete_at(0) ary_x3.delete_at(0) ary_y3.delete_at(0) ary_x4.delete_at(0) ary_y4.delete_at(0) end screen.updateRect(0, 0, 0, 0) end