[PD-cvs] SF.net SVN: pure-data: [10112] branches/pd-extended/v0-40/externals/hcs/hid
eighthave at users.sourceforge.net
eighthave at users.sourceforge.net
Thu Jun 26 22:27:46 CEST 2008
Revision: 10112
http://pure-data.svn.sourceforge.net/pure-data/?rev=10112&view=rev
Author: eighthave
Date: 2008-06-26 13:27:43 -0700 (Thu, 26 Jun 2008)
Log Message:
-----------
- fixed "evdev EVIOCGABS ioctl: Invalid argument" error by only trying the
ioctl(EVIOCGABS) on existing elements. This means it is a pretty
substantial change in how the code works, but it was necessary to fix the
bug. Plus it should make it use a lot less memory and CPU. I just hope it
doesn't break anything.
Modified Paths:
--------------
branches/pd-extended/v0-40/externals/hcs/hid/doc/hid-help.pd
branches/pd-extended/v0-40/externals/hcs/hid/hid_linux.c
Modified: branches/pd-extended/v0-40/externals/hcs/hid/doc/hid-help.pd
===================================================================
--- branches/pd-extended/v0-40/externals/hcs/hid/doc/hid-help.pd 2008-06-26 20:23:24 UTC (rev 10111)
+++ branches/pd-extended/v0-40/externals/hcs/hid/doc/hid-help.pd 2008-06-26 20:27:43 UTC (rev 10112)
@@ -1,4 +1,4 @@
-#N canvas 202 51 715 555 10;
+#N canvas 366 51 715 555 10;
#X floatatom 27 439 5 0 0 0 - - -;
#X floatatom 83 439 5 0 0 0 - - -;
#X floatatom 63 395 6 0 0 0 - - -;
Modified: branches/pd-extended/v0-40/externals/hcs/hid/hid_linux.c
===================================================================
--- branches/pd-extended/v0-40/externals/hcs/hid/hid_linux.c 2008-06-26 20:23:24 UTC (rev 10111)
+++ branches/pd-extended/v0-40/externals/hcs/hid/hid_linux.c 2008-06-26 20:27:43 UTC (rev 10112)
@@ -30,8 +30,8 @@
#define NBITS(x) (((x)/BITS_PER_LONG)+1)
#define LONG(x) ((x)/BITS_PER_LONG)
#define test_bit(bit, array) ((array[LONG(bit)] >> (bit%BITS_PER_LONG)) & 1)
+#define ISBITSET(x,i) ((x[i>>3] & (1<<(i&7)))!=0)
-
/*
* from an email from Vojtech:
*
@@ -297,34 +297,39 @@
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("[hid] 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("[hid] error: evdev ioctl: abs_bitmask");
+ for( i = 1; i < EV_MAX; i++ )
{
- /* 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("[hid] 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("[hid] error: evdev ioctl: abs_bitmask");
- for( i = 1; i < EV_MAX; i++ )
+ if(test_bit(i, element_bitmask[0]))
{
- 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++)
{
- /* 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++)
+ if(test_bit(j, element_bitmask[i]))
{
- new_element = getbytes(sizeof(t_hid_element));
- if( (i == EV_ABS) && (test_bit(j, abs_bitmask)) )
+ new_element = getbytes(sizeof(t_hid_element));
+ if( (i == EV_ABS) && (j < ABS_MAX) && (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");
+ if(ioctl(x->x_fd, EVIOCGABS(j), &abs_features) < 0)
+ {
+ post("[hid]: EVIOCGABS ioctl error for element: 0x%03x", j, j);
+ perror("[hid]: EVIOCGABS ioctl error:");
+ }
new_element->min = abs_features.minimum;
new_element->max = abs_features.maximum;
}
@@ -333,29 +338,26 @@
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->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 = hid_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;
- element[x->x_device_number][element_count[x->x_device_number]] = new_element;
- ++element_count[x->x_device_number];
+ new_element->name = hid_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;
+ element[x->x_device_number][element_count[x->x_device_number]] = new_element;
+ ++element_count[x->x_device_number];
}
- }
- }
+ }
+ }
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Pd-cvs
mailing list