Revision: 10109 http://pure-data.svn.sourceforge.net/pure-data/?rev=10109&view=rev Author: eighthave Date: 2008-06-26 09:22:29 -0700 (Thu, 26 Jun 2008)
Log Message: ----------- - fixed GNU/Linux implementation of get_device_number_by_id() and it works
- removed some debug messages
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 15:51:50 UTC (rev 10108) +++ branches/pd-extended/v0-40/externals/hcs/hid/doc/hid-help.pd 2008-06-26 16:22:29 UTC (rev 10109) @@ -1,10 +1,9 @@ -#N canvas 369 41 715 555 10; -#X declare -lib hid; +#N canvas 272 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 - - -; -#X obj 191 164 tgl 35 0 empty empty empty 0 -6 0 8 -24198 -1 -1 25 -25; +#X obj 191 164 tgl 35 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 25 +; #X floatatom 571 340 12 0 0 1 value - -; #X symbolatom 531 356 15 0 0 1 event_code - -; #X symbolatom 492 372 15 0 0 1 event_type - -; @@ -296,7 +295,7 @@ 1; #X msg 25 155 debug 0; #X msg 298 145 info; -#N canvas 743 25 411 235 see 0; +#N canvas 752 103 411 235 see 0; #N canvas 108 318 543 264 route 0; #X obj 27 14 inlet; #X obj 72 226 outlet; @@ -360,7 +359,7 @@ #X connect 2 0 0 0; #X connect 2 0 3 0; #X restore 420 271 pd see device info; -#N canvas 0 22 380 450 open 0; +#N canvas 553 77 380 450 open 0; #X obj 77 61 hradio 15 1 0 8 empty empty empty 0 -6 0 8 -262144 -1 -1 0; #X msg 78 81 open mouse $1; @@ -403,7 +402,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 796 51 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; @@ -413,9 +412,12 @@ IDs (it is not case sensitive):; #X text 221 111 Overtone CUI v1.0; #X msg 80 110 open 0x1043 0x0015; +#X msg 83 136 open 0x06a3 0xff12; +#X text 221 134 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; #N canvas 114 93 467 346 test 0; #X obj 144 45 inlet; @@ -474,12 +476,13 @@ #X connect 10 0 8 0; #X coords 0 -1 1 1 165 17 1 60 60; #X restore 25 134 pd serin; -#X msg 262 114 open 6; +#X msg 262 114 open 10; +#X obj 249 300 pddp/print; #N canvas 162 133 570 420 serin 0; -#X obj 209 61 cnv 15 15 15 empty $0-open-canvas 6 4 8 0 14 -233017 +#X obj 286 61 cnv 15 30 15 empty $0-open-canvas 10 4 8 0 14 -233017 -1 0; -#X obj 60 61 hradio 15 1 1 10 empty empty empty 0 -6 0 8 -225271 -1 --1 6; +#X obj 60 61 hradio 15 1 1 15 empty empty empty 0 -6 0 8 -225271 -1 +-1 10; #X obj 60 13 inlet; #X msg 200 202 label $1; #X obj 200 180 makefilename %d; @@ -501,9 +504,8 @@ #X connect 8 1 9 0; #X connect 9 0 7 0; #X connect 10 0 8 0; -#X coords 0 -1 1 1 165 17 1 60 60; -#X restore 262 93 pd serin; -#X obj 249 300 pddp/print; +#X coords 0 -1 1 1 257 17 1 60 60; +#X restore 262 92 pd serin; #X connect 3 0 29 0; #X connect 9 0 10 1; #X connect 10 0 9 0; @@ -525,7 +527,7 @@ #X connect 29 0 20 0; #X connect 29 0 38 0; #X connect 29 0 75 0; -#X connect 29 0 81 0; +#X connect 29 0 80 0; #X connect 29 1 72 0; #X connect 36 0 0 0; #X connect 36 1 1 0; @@ -568,4 +570,4 @@ #X connect 76 0 29 0; #X connect 78 0 70 0; #X connect 79 0 29 0; -#X connect 80 0 79 0; +#X connect 81 0 79 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 15:51:50 UTC (rev 10108) +++ branches/pd-extended/v0-40/externals/hcs/hid/hid_linux.c 2008-06-26 16:22:29 UTC (rev 10109) @@ -65,7 +65,7 @@ snprintf(hid_code, MAXPDSTRING,"btn_%d",linux_code - BTN_WHEEL); else return 0; } - return gensym(hid_code ? hid_code : "?"); + return gensym(hid_code); }
/* Georg Holzmann: implementation of the keys */ @@ -261,30 +261,27 @@ debug_print(LOG_DEBUG,"hid_print_device_list"); int i,fd; char device_output_string[MAXPDSTRING] = "Unknown"; - char dev_handle_name[MAXPDSTRING] = "/dev/input/event0"; + char dev_handle_name[FILENAME_MAX] = "/dev/input/event0";
post(""); - for(i=0;i<128;++i) + for(i=0;i<MAX_DEVICES;++i) { - snprintf(dev_handle_name, MAXPDSTRING, "/dev/input/event%d", i); - if(dev_handle_name) - { - /* open the device read-only, non-exclusive */ - fd = open (dev_handle_name, O_RDONLY | O_NONBLOCK); - /* test if device open */ - if(fd < 0 ) - { - fd = -1; - } - else - { - /* get name of device */ - ioctl(fd, EVIOCGNAME(sizeof(device_output_string)), device_output_string); - post("Device %d: '%s' on '%s'", i, device_output_string, dev_handle_name); + 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 < 0 ) + { + fd = -1; + } + else + { + /* get name of device */ + ioctl(fd, EVIOCGNAME(sizeof(device_output_string)), device_output_string); + post("Device %d: '%s' on '%s'", i, device_output_string, dev_handle_name); - close (fd); - } - } + close (fd); + } } post(""); } @@ -353,15 +350,6 @@ new_element->relative = 1; else new_element->relative = 0; - // 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]; } @@ -377,8 +365,6 @@
void hid_get_events(t_hid *x) { - debug_print(9,"hid_get_events"); - /* for debugging, counts how many events are processed each time hid_read() is called */ DEBUG(t_int event_counter = 0;); unsigned short i; @@ -434,27 +420,24 @@ debug_print(LOG_DEBUG,"hid_open_device");
char device_name[MAXPDSTRING] = "Unknown"; - char block_device[MAXPDSTRING] = "/dev/input/event0"; + char block_device[FILENAME_MAX] = "/dev/input/event0"; struct input_event hid_input_event;
x->x_fd = -1;
x->x_device_number = device_number; - snprintf(block_device,MAXPDSTRING,"/dev/input/event%d",x->x_device_number); + snprintf(block_device,FILENAME_MAX,"/dev/input/event%d",x->x_device_number);
- if(block_device) - { - /* open the device read-only, non-exclusive */ - x->x_fd = open(block_device, O_RDONLY | O_NONBLOCK); - /* test if device open */ - if(x->x_fd < 0 ) - { - error("[hid] open %s failed",block_device); - x->x_fd = -1; - return 1; - } - } - + /* open the device read-only, non-exclusive */ + x->x_fd = open(block_device, O_RDONLY | O_NONBLOCK); + /* test if device open */ + if(x->x_fd < 0 ) + { + error("[hid] open %s failed",block_device); + x->x_fd = -1; + return 1; + } + /* read input_events from the HID_DEVICE stream * It seems that is just there to flush the input event queue */ @@ -495,7 +478,7 @@ unsigned int i; unsigned int last_active_device = 0; char device_name[MAXPDSTRING] = "Unknown"; - char block_device[MAXPDSTRING] = "/dev/input/event0"; + char block_device[FILENAME_MAX] = "/dev/input/event0"; struct input_event x_input_event;
debug_print(LOG_DEBUG,"hid_build_device_list"); @@ -550,7 +533,7 @@ char product_id_string[7]; t_atom *output_atom = getbytes(sizeof(t_atom));
- ioctl(x->x_fd, EVIOCGID); + ioctl(x->x_fd, EVIOCGID, &my_id); snprintf(vendor_id_string,7,"0x%04x", my_id.vendor); SETSYMBOL(output_atom, gensym(vendor_id_string)); outlet_anything( x->x_status_outlet, gensym("vendorID"), @@ -569,6 +552,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; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.