[PD-cvs] SF.net SVN: pure-data: [10113] trunk/externals/io/hidio

eighthave at users.sourceforge.net eighthave at users.sourceforge.net
Thu Jun 26 22:57:29 CEST 2008


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 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.




More information about the Pd-cvs mailing list