Revision: 10113 http://pure-data.svn.sourceforge.net/pure-data/?rev=10113&view=rev Author: eighthave Date: 2008-06-26 13:57:26 -0700 (Thu, 26 Jun 2008)
Log Message: ----------- ported some of the recent bugfixes from [hid]:
- in hidio_get_events(), test code before type since code is more likely to fail, therefore saving comparing the one that succeeds a lot
- removed [print( message and replaced it with [devices( and [elements(
- fixed min/max getting bug (I forgot to include the &my_id struct)
- implemented get_device_number_by_id()
- removed extra copies of write functions
Modified Paths: -------------- trunk/externals/io/hidio/hidio-help.pd trunk/externals/io/hidio/hidio_linux.c
Modified: trunk/externals/io/hidio/hidio-help.pd =================================================================== --- trunk/externals/io/hidio/hidio-help.pd 2008-06-26 20:27:43 UTC (rev 10112) +++ trunk/externals/io/hidio/hidio-help.pd 2008-06-26 20:57:26 UTC (rev 10113) @@ -1,4 +1,4 @@ -#N canvas 207 22 843 580 10; +#N canvas 213 77 843 580 10; #X floatatom 27 445 5 0 0 0 - - -; #X floatatom 83 445 5 0 0 0 - - -; #X obj 191 164 tgl 35 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 25 @@ -16,7 +16,7 @@ #X text 266 557 released under the GNU GPL; #X text 472 544 $Revision: 1.6 $$Date: 2007-07-26 07:31:38 $; #X text 473 557 $Author: eighthave $; -#X text 425 33 !!! This software is very much alpha , so any aspect +#X text 425 34 !!! This software is very much alpha , so any aspect of it could change without notice !!!; #X obj 9 510 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 1 ; @@ -174,7 +174,7 @@ #X connect 16 0 5 0; #X connect 17 0 5 0; #X restore 203 59 pd open by device type; -#N canvas 88 102 470 320 open 0; +#N canvas 94 154 470 320 open 0; #X text 217 82 Gravis/Destroyer Tiltpad; #X msg 76 81 open 0x047D 0x4008; #X msg 73 53 open 0x046d 0xc01d; @@ -184,9 +184,12 @@ IDs (it is not case sensitive):; #X text 221 111 Overtone CUI v1.0; #X msg 80 110 open 0x1043 0x0015; +#X msg 84 139 open 0x06a3 0xff12; +#X text 222 137 Saitek Cyborgforce; #X connect 1 0 4 0; #X connect 2 0 4 0; #X connect 7 0 4 0; +#X connect 8 0 4 0; #X restore 174 37 pd open by vendor/product ID; #X msg 285 329 key e 0 0; #X text 49 543 (C) Copyright 2004 Hans-Christoph Steiner hans@at.or.at
Modified: trunk/externals/io/hidio/hidio_linux.c =================================================================== --- trunk/externals/io/hidio/hidio_linux.c 2008-06-26 20:27:43 UTC (rev 10112) +++ trunk/externals/io/hidio/hidio_linux.c 2008-06-26 20:57:26 UTC (rev 10113) @@ -139,10 +139,9 @@
- -void hidio_print_element_list(t_hidio *x) +void hidio_elements(t_hidio *x) { - debug_post(LOG_DEBUG,"hidio_print_element_list"); + debug_post(LOG_DEBUG,"hidio_elements"); unsigned long element_bitmask[EV_MAX][NBITS(KEY_MAX)]; // char event_type_string[256]; // char event_code_string[256]; @@ -263,9 +262,9 @@ }
-void hidio_print_device_list(void) +void hidio_devices(t_hidio *x) { - debug_post(LOG_DEBUG,"hidio_print_device_list"); + debug_post(LOG_DEBUG,"hidio_devices"); int i,fd; char device_output_string[MAXPDSTRING] = "Unknown"; char dev_handle_name[MAXPDSTRING] = "/dev/input/event0"; @@ -307,77 +306,79 @@ t_hid_element *new_element = NULL; t_int i, j;
+ if( x->x_fd < 0 ) + return; + element_count[x->x_device_number] = 0; - if( x->x_fd ) - { - /* get bitmask representing supported elements (axes, keys, etc.) */ - memset(element_bitmask, 0, sizeof(element_bitmask)); - if( ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), element_bitmask[0]) < 0 ) - perror("[hidio] error: evdev ioctl: element_bitmask"); - memset(abs_bitmask, 0, sizeof(abs_bitmask)); - if( ioctl(x->x_fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask) < 0 ) - perror("[hidio] error: evdev ioctl: abs_bitmask"); - for( i = 1; i < EV_MAX; i++ ) - { - if(test_bit(i, element_bitmask[0])) - { - /* get bitmask representing supported button types */ - ioctl(x->x_fd, EVIOCGBIT(i, KEY_MAX), element_bitmask[i]); - /* cycle through all possible event codes (axes, keys, etc.) - * testing to see which are supported. - * i = i j = j - */ - for(j = 0; j < KEY_MAX; j++) - { - new_element = getbytes(sizeof(t_hid_element)); - if( (i == EV_ABS) && (test_bit(j, abs_bitmask)) ) - { - /* this means that the bit is set in the axes list */ - if(ioctl(x->x_fd, EVIOCGABS(j), &abs_features)) - perror("evdev EVIOCGABS ioctl"); - new_element->min = abs_features.minimum; - new_element->max = abs_features.maximum; - } - else - { - new_element->min = 0; - new_element->max = 0; - } - if(test_bit(j, element_bitmask[i])) - { - new_element->linux_type = i; /* the int from linux/input.h */ - new_element->type = gensym(ev[i] ? ev[i] : "?"); /* the symbol */ - new_element->linux_code = j; - if((i == EV_KEY) && (j >= BTN_MISC) && (j < KEY_OK) ) - { - new_element->name = hidio_convert_linux_buttons_to_numbers(j); - } - else - { - new_element->name = gensym(event_names[i][j] ? event_names[i][j] : "?"); - } - if( i == EV_REL ) - new_element->relative = 1; - else - new_element->relative = 0; - SETSYMBOL(new_element->output_message, new_element->name); - SETFLOAT(new_element->output_message + 1, new_element->instance); - // fill in the t_hid_element struct here - post("x->x_device_number: %d element_count[]: %d", - x->x_device_number, element_count[x->x_device_number]); - post("linux_type/linux_code: %d/%d type/name: %s/%s max: %d min: %d ", - new_element->linux_type, new_element->linux_code, - new_element->type->s_name, new_element->name->s_name, - new_element->max, new_element->min); - post("\tpolled: %d relative: %d", - new_element->polled, new_element->relative); - element[x->x_device_number][element_count[x->x_device_number]] = new_element; - ++element_count[x->x_device_number]; - } - } - } - } - } + + /* get bitmask representing supported elements (axes, keys, etc.) */ + memset(element_bitmask, 0, sizeof(element_bitmask)); + if( ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), element_bitmask[0]) < 0 ) + perror("[hidio] error: evdev ioctl: element_bitmask"); + memset(abs_bitmask, 0, sizeof(abs_bitmask)); + if( ioctl(x->x_fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask) < 0 ) + perror("[hidio] error: evdev ioctl: abs_bitmask"); + for( i = 1; i < EV_MAX; i++ ) + { + if(test_bit(i, element_bitmask[0])) + { + /* get bitmask representing supported elements */ + ioctl(x->x_fd, EVIOCGBIT(i, KEY_MAX), element_bitmask[i]); + /* cycle through all possible event codes (axes, keys, etc.) + * testing to see which are supported. + */ + for(j = 0; j < KEY_MAX; j++) + { + if(test_bit(j, element_bitmask[i])) + { + new_element = getbytes(sizeof(t_hid_element)); + if( (i == EV_ABS) && (j < ABS_MAX) && (test_bit(j, abs_bitmask)) ) + { + if(ioctl(x->x_fd, EVIOCGABS(j), &abs_features) < 0) + { + post("[hidio]: EVIOCGABS ioctl error for element: 0x%03x", j, j); + perror("[hidio]: EVIOCGABS ioctl error:"); + } + new_element->min = abs_features.minimum; + new_element->max = abs_features.maximum; + } + else + { + new_element->min = 0; + new_element->max = 0; + } + new_element->linux_type = i; /* the int from linux/input.h */ + new_element->type = gensym(ev[i] ? ev[i] : "?"); /* the symbol */ + new_element->linux_code = j; + if((i == EV_KEY) && (j >= BTN_MISC) && (j < KEY_OK) ) + { + new_element->name = hidio_convert_linux_buttons_to_numbers(j); + } + else + { + new_element->name = gensym(event_names[i][j] ? event_names[i][j] : "?"); + } + if( i == EV_REL ) + new_element->relative = 1; + else + new_element->relative = 0; + SETSYMBOL(new_element->output_message, new_element->name); + SETFLOAT(new_element->output_message + 1, new_element->instance); + // fill in the t_hid_element struct here + post("x->x_device_number: %d element_count[]: %d", + x->x_device_number, element_count[x->x_device_number]); + post("linux_type/linux_code: %d/%d type/name: %s/%s max: %d min: %d ", + new_element->linux_type, new_element->linux_code, + new_element->type->s_name, new_element->name->s_name, + new_element->max, new_element->min); + post("\tpolled: %d relative: %d", + new_element->polled, new_element->relative); + element[x->x_device_number][element_count[x->x_device_number]] = new_element; + ++element_count[x->x_device_number]; + } + } + } + } }
/* ------------------------------------------------------------------------------ */ @@ -407,8 +408,8 @@ for( i=0; i < element_count[x->x_device_number]; ++i ) { output_element = element[x->x_device_number][i]; - if( (hidio_input_event.type == output_element->linux_type) && \ - (hidio_input_event.code == output_element->linux_code) ) + if( (hidio_input_event.code == output_element->linux_code) && \ + (hidio_input_event.type == output_element->linux_type) ) { output_element->value = hidio_input_event.value; debug_post(9,"i: %d linux_type: %d linux_code: %d", i, @@ -431,12 +432,6 @@ }
-void hidio_print(t_hidio* x) -{ - hidio_print_device_list(); - hidio_print_element_list(x); -} - void hidio_write_packet(void) { debug_post(LOG_DEBUG,"hidio_write_packet"); @@ -582,7 +577,7 @@ char productid_string[7]; t_atom *output_atom = getbytes(sizeof(t_atom));
- ioctl(x->x_fd, EVIOCGID); + ioctl(x->x_fd, EVIOCGID, &my_id); snprintf(vendorid_string,7,"0x%04x", my_id.vendor); SETSYMBOL(output_atom, gensym(vendorid_string)); outlet_anything( x->x_status_outlet, gensym("vendorID"), @@ -601,6 +596,23 @@
short get_device_number_by_id(unsigned short vendor_id, unsigned short product_id) { + int i, fd; + char dev_handle_name[FILENAME_MAX]; + struct input_id my_id; + + for(i=0;i<MAX_DEVICES;++i) + { + snprintf(dev_handle_name, FILENAME_MAX, "/dev/input/event%d", i); + /* open the device read-only, non-exclusive */ + fd = open (dev_handle_name, O_RDONLY | O_NONBLOCK); + /* test if device open */ + if(fd > -1 ) + { + ioctl(fd, EVIOCGID, &my_id); + if( (vendor_id == my_id.vendor) && (product_id == my_id.product) ) + return i; + } + }
return -1; } @@ -613,23 +625,6 @@ return -1; }
-void hidio_write_event_symbol_int(t_hidio *x, t_symbol *type, t_int code, - t_int instance, t_int value) -{ - debug_post(LOG_DEBUG,"hidio_write_event_symbol_int"); -} -void hidio_write_event_symbols(t_hidio *x, t_symbol *type, t_symbol *code, - t_int instance, t_int value) -{ - debug_post(LOG_DEBUG,"hidio_write_event_symbols"); -} - -void hidio_write_event_ints(t_hidio *x, t_int type, t_int code, - t_int instance, t_int value) -{ - debug_post(LOG_DEBUG,"hidio_write_event_ints"); -} - void hidio_write_event_JMZ(t_hidio *x, t_symbol *type, t_symbol *code, t_float instance, t_float value) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.