From 68b812e2a83d5ea6a2b088d73ad12621a443c99a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 12 Oct 2003 16:26:39 +0000 Subject: X, Y, hatX, hatY, buttons all work twist and throttle are still silent. help patch uses toggles to represent buttons svn path=/trunk/externals/hcs/; revision=1086 --- rawhid/rawjoystick-help.pd | 151 ++++++++++++++++++++++++--------------------- rawhid/rawjoystick.c | 146 +++++++++++++++++++++++++++++-------------- 2 files changed, 181 insertions(+), 116 deletions(-) (limited to 'rawhid') diff --git a/rawhid/rawjoystick-help.pd b/rawhid/rawjoystick-help.pd index 001bb33..bc2586a 100644 --- a/rawhid/rawjoystick-help.pd +++ b/rawhid/rawjoystick-help.pd @@ -1,100 +1,113 @@ -#N canvas 26 222 886 505 10; +#N canvas 26 222 906 525 10; #X msg 192 64 start; #X msg 207 95 stop; #X floatatom 397 180 2 0 0 3 button# - -; #X floatatom 454 179 2 0 0 3 button_value - -; -#X floatatom 143 180 5 0 0 3 y-axis - -; -#X floatatom 95 180 5 0 0 3 x-axis - -; +#X floatatom 143 180 6 0 0 3 y-axis - -; +#X floatatom 95 180 6 0 0 3 x-axis - -; #X floatatom 242 181 3 0 0 3 hat-X - -; #X floatatom 288 181 3 0 0 3 hat-Y - -; -#X floatatom 192 181 5 0 0 3 twist - -; -#X floatatom 331 180 5 0 0 3 throttle - -; -#X obj 299 309 select 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -19 20 21; -#X obj 297 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 --1; -#X obj 313 355 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X floatatom 192 181 6 0 0 3 twist - -; +#X floatatom 331 180 6 0 0 3 throttle - -; +#X obj 299 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X obj 317 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 333 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 335 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 351 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 353 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 370 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 371 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 389 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 390 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 409 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 408 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 734 354 bng 30 250 50 0 empty empty not_recognized 0 -6 0 8 --261689 -1 -1; -#X obj 689 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 681 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 667 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 663 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 647 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 645 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 631 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 627 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 613 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 608 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 596 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 590 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 579 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 572 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 561 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 554 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 541 349 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 535 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 523 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 517 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 503 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 499 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 485 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 481 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 466 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 463 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 447 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 444 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; -#X obj 428 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 +#X obj 426 355 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 -1; #X obj 439 220 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 192 123 rawjoystick; #X msg 282 57 read; -#X connect 0 0 35 0; -#X connect 1 0 35 0; -#X connect 2 0 10 0; -#X connect 3 0 34 0; -#X connect 10 0 11 0; -#X connect 10 1 12 0; -#X connect 10 2 13 0; -#X connect 10 3 14 0; -#X connect 10 4 15 0; -#X connect 10 5 16 0; -#X connect 10 6 17 0; -#X connect 10 7 33 0; -#X connect 10 8 32 0; -#X connect 10 9 31 0; -#X connect 10 10 30 0; -#X connect 10 11 29 0; -#X connect 10 12 28 0; -#X connect 10 13 27 0; -#X connect 10 14 26 0; -#X connect 10 15 25 0; -#X connect 10 16 24 0; -#X connect 10 17 23 0; -#X connect 10 18 22 0; -#X connect 10 19 21 0; -#X connect 10 20 20 0; -#X connect 10 21 19 0; -#X connect 10 22 18 0; -#X connect 34 0 2 0; -#X connect 35 0 5 0; -#X connect 35 1 4 0; -#X connect 35 2 8 0; -#X connect 35 3 6 0; -#X connect 35 4 7 0; -#X connect 35 5 9 0; -#X connect 35 6 2 0; -#X connect 35 7 3 0; -#X connect 36 0 35 0; +#X msg 380 91 close; +#X msg 381 64 open; +#X text 470 20 [rawjoystick]'s timer defaults to 5 ms. You can change +it with the [delay( message:; +#X msg 529 76 delay 20; +#X msg 527 105 delay 1000; +#X obj 303 270 pack f f; +#X obj 299 309 route 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 +19 20 21; +#X obj 721 356 bng 35 250 50 0 empty empty empty 0 -6 0 8 -162590 -1 +-1; +#X connect 0 0 33 0; +#X connect 1 0 33 0; +#X connect 2 0 40 0; +#X connect 3 0 32 0; +#X connect 3 0 40 1; +#X connect 32 0 2 0; +#X connect 33 0 5 0; +#X connect 33 1 4 0; +#X connect 33 2 8 0; +#X connect 33 3 6 0; +#X connect 33 4 7 0; +#X connect 33 5 9 0; +#X connect 33 6 2 0; +#X connect 33 7 3 0; +#X connect 34 0 33 0; +#X connect 35 0 33 0; +#X connect 36 0 33 0; +#X connect 38 0 33 0; +#X connect 39 0 33 0; +#X connect 40 0 41 0; +#X connect 41 0 10 0; +#X connect 41 1 11 0; +#X connect 41 2 12 0; +#X connect 41 3 13 0; +#X connect 41 4 14 0; +#X connect 41 5 15 0; +#X connect 41 6 16 0; +#X connect 41 7 31 0; +#X connect 41 8 30 0; +#X connect 41 9 29 0; +#X connect 41 10 28 0; +#X connect 41 11 27 0; +#X connect 41 12 26 0; +#X connect 41 13 25 0; +#X connect 41 14 24 0; +#X connect 41 15 23 0; +#X connect 41 16 22 0; +#X connect 41 17 21 0; +#X connect 41 18 20 0; +#X connect 41 19 19 0; +#X connect 41 20 18 0; +#X connect 41 21 17 0; +#X connect 41 22 42 0; diff --git a/rawhid/rawjoystick.c b/rawhid/rawjoystick.c index 8497cc2..82a52c4 100644 --- a/rawhid/rawjoystick.c +++ b/rawhid/rawjoystick.c @@ -16,19 +16,31 @@ * */ /* - * $Id: rawjoystick.c,v 1.2 2003-08-20 16:20:43 eighthave Exp $ + * $Id: rawjoystick.c,v 1.3 2003-10-12 16:26:39 eighthave Exp $ + * + * TODO + * -make work with multiple joysticks (using SDL_JoyHatEvent.which) + * -figure out why it takes so long for [rawjoystick] to start + * -get throttle and twist working */ -static char *version = "$Revision: 1.2 $"; +static char *version = "$Revision: 1.3 $"; -#include "SDL.h" +#include +#include #include "m_imp.h" -//#define DEBUG(x) -#define DEBUG(x) x +#define DEBUG(x) +/* #define DEBUG(x) x */ +/* total number of axes and buttons supported by this object */ +/* each axis gets a fixed outlet */ #define RAWJOYSTICK_AXES 6 #define RAWJOYSTICK_BUTTONS 9 +/* this is the outlet number for the hat switch */ +#define RAWJOYSTICK_HATX 3 +#define RAWJOYSTICK_HATY 4 + /*------------------------------------------------------------------------------ * CLASS DEF @@ -90,81 +102,115 @@ static int rawjoystick_open(t_rawjoystick *x) { post (" device has %i axes, %i hats, and %i buttons.\n",x->x_axes,x->x_hats,x->x_buttons); post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); - post ("This object is under development! The interface could change at anytime!"); - post ("As I write cross-platform versions, the interface might have to change."); + post ("This object is under development! The interface will change!"); + post ("This means inlets, outlets, messages, etc. are not fixed!"); post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); return 1; } -static int rawjoystick_read(t_rawjoystick *x,int fd) { - SDL_Event event; - - DEBUG(post("rawjoystick_READ")); +/* read the joystick, called through clock */ +static void *rawjoystick_read(t_rawjoystick *x) { + SDL_Event event; + +/* DEBUG(post("rawjoystick_READ")); */ + + if ( ! SDL_JoystickOpened(x->x_devnum) ) { + post ("Joystick not open, you need to open it first."); + return 0; + } + +/* DEBUG(post("Joystick read: %s",SDL_JoystickName(x->x_devnum));) */ - if ( ! SDL_JoystickOpened(x->x_devnum) ) { - return 0; + if ( SDL_PollEvent(&event) ) { + DEBUG(post("SDL_Event.type: %i",event.type);) + DEBUG(post("SDL_JoyAxisEvent.value: %i",event.jaxis.value);) + DEBUG(post("SDL_JoyButtonEvent.value: %i",event.jbutton.state);) + switch (event.type) { + case SDL_JOYAXISMOTION: +/* + * It might be a good idea to make a for{;;} loop to output the values of + * all of the axes everytime in right-to-left order. + */ + outlet_float (x->x_axis_out[event.jaxis.axis], event.jaxis.value); + break; + case SDL_JOYHATMOTION: + /* this object only supports the first hat switch */ + if (event.jhat.hat == 0) { + /* X axis */ + if (event.jhat.value & SDL_HAT_LEFT) { + outlet_float (x->x_axis_out[RAWJOYSTICK_HATX], -1); + } else if (event.jhat.value & SDL_HAT_RIGHT) { + outlet_float (x->x_axis_out[RAWJOYSTICK_HATX], 1); + } else { + outlet_float (x->x_axis_out[RAWJOYSTICK_HATX], 0); + } + /* Y axis */ + if (event.jhat.value & SDL_HAT_UP) { + outlet_float (x->x_axis_out[RAWJOYSTICK_HATY], -1); + } else if (event.jhat.value & SDL_HAT_DOWN) { + outlet_float (x->x_axis_out[RAWJOYSTICK_HATY], 1); + } else { + outlet_float (x->x_axis_out[RAWJOYSTICK_HATY], 0); + } + } + break; + case SDL_JOYBUTTONDOWN: + outlet_float (x->x_button_val_out, 1); + outlet_float (x->x_button_num_out, (float)event.jbutton.button); + break; + case SDL_JOYBUTTONUP: + outlet_float (x->x_button_val_out, 0); + outlet_float (x->x_button_num_out, (float)event.jbutton.button); + break; + default: + DEBUG(post("Unhandled event.")); + } } - post("Joystick read: %s",SDL_JoystickName(x->x_devnum)); + if (x->started) + clock_delay(x->x_clock, x->x_delaytime); - if ( SDL_PollEvent(&event) ) { - post("SDL_Event.type: %i",event.type); - post("SDL_JoyAxisEvent.value: %i",event.jaxis.value); - post("SDL_JoyButtonEvent.value: %i",event.jbutton.state); - switch (event.type) { - case SDL_JOYAXISMOTION: - outlet_float (x->x_axis_out[event.jaxis.axis], event.jaxis.value); - break; - case SDL_JOYHATMOTION: - break; - case SDL_JOYBUTTONDOWN: - outlet_float (x->x_button_val_out, 1); - outlet_float (x->x_button_num_out, event.jaxis.axis); - break; - case SDL_JOYBUTTONUP: - outlet_float (x->x_button_val_out, 0); - outlet_float (x->x_button_num_out, event.jaxis.axis); - break; - default: - DEBUG(post("Unhandled event.")); - } - } - return 1; + return NULL; } /* Actions */ static void rawjoystick_bang(t_rawjoystick* x) { - DEBUG(post("rawjoystick_bang")); + DEBUG(post("rawjoystick_bang")); } static void rawjoystick_float(t_rawjoystick* x) { - DEBUG(post("rawjoystick_float")); + DEBUG(post("rawjoystick_float")); } -// DONE void rawjoystick_start(t_rawjoystick* x) { DEBUG(post("rawjoystick_START")); if ( ( SDL_JoystickOpened(x->x_devnum) ) && ( ! x->started ) ) { - sys_addpollfn(x->x_devnum, (t_fdpollfn)rawjoystick_read, x); x->started = 1; + clock_delay(x->x_clock, 0); } } -// DONE void rawjoystick_stop(t_rawjoystick* x) { DEBUG(post("rawjoystick_STOP");) - + if ( ( SDL_JoystickOpened(x->x_devnum) ) && ( x->started ) ) { - sys_rmpollfn(x->x_devnum); - x->started = 0; + x->started = 0; + clock_unset(x->x_clock); } } +void rawjoystick_delay(t_rawjoystick* x, t_float f) { + DEBUG(post("rawjoystick_DELAY %f",f);) + + x->x_delaytime = f; +} + + /* Misc setup functions */ @@ -177,6 +223,7 @@ static void rawjoystick_free(t_rawjoystick* x) { SDL_JoystickClose(x->x_joystick); SDL_Quit(); + clock_free(x->x_clock); } static void *rawjoystick_new(t_float argument) { @@ -191,6 +238,9 @@ static void *rawjoystick_new(t_float argument) { x->x_devnum = 0; x->read_ok = 1; x->started = 0; + x->x_delaytime = 5; + + x->x_clock = clock_new(x, (t_method)rawjoystick_read); /* INIT SDL using joystick layer */ /* Note: Video is required to start Event Loop !! */ @@ -222,7 +272,6 @@ static void *rawjoystick_new(t_float argument) { x->x_button_val_out = outlet_new(&x->x_obj, &s_float); /* Open the device and save settings */ - if ( ! rawjoystick_open(x) ) return x; return (x); @@ -244,9 +293,12 @@ void rawjoystick_setup(void) /* add inlet message methods */ class_addmethod(rawjoystick_class,(t_method) rawjoystick_open,gensym("open"),0); class_addmethod(rawjoystick_class,(t_method) rawjoystick_close,gensym("close"),0); + class_addmethod(rawjoystick_class,(t_method) rawjoystick_start,gensym("start"),0); class_addmethod(rawjoystick_class,(t_method) rawjoystick_stop,gensym("stop"),0); + class_addmethod(rawjoystick_class,(t_method) rawjoystick_read,gensym("read"),0); - + + class_addmethod(rawjoystick_class,(t_method) rawjoystick_delay,gensym("delay"),A_FLOAT,0); } -- cgit v1.2.1