aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2003-10-12 16:26:39 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2003-10-12 16:26:39 +0000
commit68b812e2a83d5ea6a2b088d73ad12621a443c99a (patch)
treede275a203009d709599a5db1914d82f8afe89a26
parent1a9e705f95fc5b3e6506f660fd4cd8ea224e8343 (diff)
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
-rw-r--r--rawhid/rawjoystick-help.pd151
-rw-r--r--rawhid/rawjoystick.c146
2 files changed, 181 insertions, 116 deletions
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 <SDL/SDL.h>
+#include <m_pd.h>
#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);
}