Update of /cvsroot/pure-data/externals/io/hidio In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10466
Modified Files: hidio-help.pd hidio.c hidio.h hidio_linux.c Log Message: first functional output test on GNU/Linux: I can control the keyboard LEDs. Others should be possible, but Linux doesn't recognize the output types of any of my other devices :(
Index: hidio-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/io/hidio/hidio-help.pd,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** hidio-help.pd 1 Jan 2007 01:06:11 -0000 1.5 --- hidio-help.pd 26 Jul 2007 07:31:38 -0000 1.6 *************** *** 1,7 **** ! #N canvas 157 38 886 611 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 25 ! 25; #X floatatom 765 335 5 0 0 1 value - -; #X symbolatom 631 360 15 0 0 1 event_code - -; --- 1,7 ---- ! #N canvas 637 32 886 611 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 ! ; #X floatatom 765 335 5 0 0 1 value - -; #X symbolatom 631 360 15 0 0 1 event_code - -; *************** *** 17,27 **** #X text 472 544 $Revision$$Date$; #X text 473 557 $Author$; - #X msg 436 201 poll 20; - #X msg 374 201 poll 2; - #X text 370 186 start polling and set the poll delay in ms; #X text 425 33 !!! This software is very much alpha , so any aspect of it could change without notice !!!; ! #X obj 9 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 ! 66455; #N canvas 278 328 631 544 Event_Codes 0; #X text 28 48 (For a complete listing of Linux Input Events , see --- 17,24 ---- #X text 472 544 $Revision$$Date$; #X text 473 557 $Author$; #X text 425 33 !!! This software is very much alpha , so any aspect of it could change without notice !!!; ! #X obj 9 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455 ! ; #N canvas 278 328 631 544 Event_Codes 0; #X text 28 48 (For a complete listing of Linux Input Events , see *************** *** 241,273 **** #X floatatom 313 401 6 0 0 0 - - -; #X floatatom 363 401 6 0 0 0 - - -; ! #X obj 39 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 ! 133004; ! #X obj 69 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 ! 133004; ! #X obj 99 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 ! 66455; ! #X obj 129 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; ! #X obj 159 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; ! #X obj 189 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 133004; ! #X obj 219 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 133004; ! #X obj 249 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; ! #X obj 279 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 133004; ! #X obj 309 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 133004; ! #X obj 339 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; ! #X obj 369 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; ! #X obj 399 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 133004 133004; ! #X obj 429 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; ! #X obj 459 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 66455 66455; #X msg 25 155 debug 9; --- 238,270 ---- #X floatatom 313 401 6 0 0 0 - - -; #X floatatom 363 401 6 0 0 0 - - -; ! #X obj 39 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004 ! ; ! #X obj 69 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004 ! ; ! #X obj 99 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455 ! ; ! #X obj 129 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; ! #X obj 159 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; ! #X obj 189 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004; ! #X obj 219 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004; ! #X obj 249 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; ! #X obj 279 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004; ! #X obj 309 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004; ! #X obj 339 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; ! #X obj 369 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; ! #X obj 399 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 133004; ! #X obj 429 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; ! #X obj 459 508 tgl 25 0 empty empty empty 0 -6 0 8 -195568 -1 -1 0 66455; #X msg 25 155 debug 9; *************** *** 394,398 **** #X connect 7 0 4 0; #X restore 174 37 pd open by vendor/product ID; - #X msg 504 201 poll 200; #X msg 225 309 key key_255 0 133004; #X text 49 543 (C) Copyright 2004 Hans-Christoph Steiner hans@at.or.at --- 391,394 ---- *************** *** 426,435 **** #X coords 0 -1 1 1 165 17 1 60 60; #X restore 25 134 pd serin; - #X msg 262 114 open 0; #N canvas 162 133 570 420 serin 0; ! #X obj 209 61 cnv 15 15 15 empty $0-open-canvas 0 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 0; #X obj 60 13 inlet; #X msg 200 202 label $1; --- 422,430 ---- #X coords 0 -1 1 1 165 17 1 60 60; #X restore 25 134 pd serin; #N canvas 162 133 570 420 serin 0; ! #X obj 286 61 cnv 15 30 15 empty $0-open-canvas 2 4 8 0 14 -233017 -1 0; + #X obj 60 61 hradio 15 1 1 15 empty empty empty 0 -6 0 8 -225271 -1 + -1 2; #X obj 60 13 inlet; #X msg 200 202 label $1; *************** *** 453,457 **** #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 646 486 pddp/open all_about_hid; --- 448,452 ---- #X connect 9 0 7 0; #X connect 10 0 8 0; ! #X coords 0 -1 1 1 257 17 1 60 60; #X restore 262 93 pd serin; #X obj 646 486 pddp/open all_about_hid; *************** *** 491,495 **** 1; #X obj 292 122 spigot; ! #X obj 333 99 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 ; #X obj 354 45 inlet; --- 486,490 ---- 1; #X obj 292 122 spigot; ! #X obj 333 99 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1 ; #X obj 354 45 inlet; *************** *** 508,567 **** #X restore 408 294 pd raw; #X floatatom 63 401 6 0 0 0 - - -; ! #X obj 455 295 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; ! #X connect 2 0 65 0; ! #X connect 8 0 65 0; ! #X connect 9 0 65 0; ! #X connect 15 0 65 0; ! #X connect 16 0 65 0; ! #X connect 24 0 65 0; ! #X connect 53 0 65 0; ! #X connect 54 0 65 0; ! #X connect 56 0 65 0; ! #X connect 57 0 65 0; ! #X connect 58 0 65 0; ! #X connect 61 0 53 0; ! #X connect 62 0 65 0; ! #X connect 63 0 62 0; ! #X connect 65 0 75 0; ! #X connect 65 0 67 0; ! #X connect 65 0 66 0; ! #X connect 65 0 73 0; ! #X connect 65 1 55 0; ! #X connect 66 0 59 0; ! #X connect 67 0 5 0; ! #X connect 67 1 4 0; ! #X connect 67 2 68 0; ! #X connect 67 3 3 0; ! #X connect 69 0 76 0; ! #X connect 69 1 32 0; ! #X connect 69 2 33 0; ! #X connect 69 3 34 0; ! #X connect 69 4 35 0; ! #X connect 69 5 36 0; ! #X connect 69 6 37 0; ! #X connect 70 0 0 0; ! #X connect 70 1 1 0; ! #X connect 70 2 23 0; ! #X connect 70 3 31 0; ! #X connect 71 0 74 0; ! #X connect 71 1 70 0; ! #X connect 71 2 69 0; ! #X connect 73 0 71 0; ! #X connect 74 0 19 0; ! #X connect 74 1 38 0; ! #X connect 74 2 39 0; ! #X connect 74 3 40 0; ! #X connect 74 4 41 0; ! #X connect 74 5 42 0; ! #X connect 74 6 43 0; ! #X connect 74 7 44 0; ! #X connect 74 8 45 0; ! #X connect 74 9 46 0; ! #X connect 74 10 47 0; ! #X connect 74 11 48 0; ! #X connect 74 12 49 0; ! #X connect 74 13 50 0; ! #X connect 74 14 51 0; ! #X connect 74 15 52 0; ! #X connect 77 0 75 1; --- 503,592 ---- #X restore 408 294 pd raw; #X floatatom 63 401 6 0 0 0 - - -; ! #X obj 455 295 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; ! #X msg 262 114 open 2; ! #N canvas 0 0 450 300 output 1; ! #X obj 170 265 outlet; ! #X msg 228 233 write 0x11 0x01 0 $1; ! #X obj 228 212 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 ! 1; ! #X obj 213 171 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 ! 1; ! #X msg 213 192 write 0x11 0x00 0 $1; ! #X text 344 190 numlock; ! #X text 359 231 capslock; ! #X msg 163 134 write 0x15 $1 0 $2; ! #X obj 161 97 pack symbol float; ! #X symbolatom 171 65 10 0 0 0 - - -; ! #X obj 151 40 makefilename 0x%d; ! #X obj 154 13 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 10 -262144 ! -1 -1 1000 1; ! #X obj 260 68 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 10 -262144 ! -1 -1 1200 1; ! #X floatatom 277 89 5 0 0 0 - - -; ! #X connect 1 0 0 0; ! #X connect 2 0 1 0; ! #X connect 3 0 4 0; ! #X connect 4 0 0 0; ! #X connect 7 0 0 0; ! #X connect 8 0 7 0; ! #X connect 10 0 9 0; ! #X connect 10 0 8 0; ! #X connect 11 0 10 0; ! #X connect 12 0 8 1; ! #X connect 12 0 13 0; ! #X restore 372 210 pd output support; ! #X connect 2 0 60 0; ! #X connect 8 0 60 0; ! #X connect 9 0 60 0; ! #X connect 21 0 60 0; ! #X connect 50 0 60 0; ! #X connect 51 0 60 0; ! #X connect 53 0 60 0; ! #X connect 54 0 60 0; ! #X connect 57 0 50 0; ! #X connect 58 0 73 0; ! #X connect 60 0 70 0; ! #X connect 60 0 62 0; ! #X connect 60 0 61 0; ! #X connect 60 0 68 0; ! #X connect 60 1 52 0; ! #X connect 61 0 55 0; ! #X connect 62 0 5 0; ! #X connect 62 1 4 0; ! #X connect 62 2 63 0; ! #X connect 62 3 3 0; ! #X connect 64 0 71 0; ! #X connect 64 1 29 0; ! #X connect 64 2 30 0; ! #X connect 64 3 31 0; ! #X connect 64 4 32 0; ! #X connect 64 5 33 0; ! #X connect 64 6 34 0; ! #X connect 65 0 0 0; ! #X connect 65 1 1 0; ! #X connect 65 2 20 0; ! #X connect 65 3 28 0; ! #X connect 66 0 69 0; ! #X connect 66 1 65 0; ! #X connect 66 2 64 0; ! #X connect 68 0 66 0; ! #X connect 69 0 16 0; ! #X connect 69 1 35 0; ! #X connect 69 2 36 0; ! #X connect 69 3 37 0; ! #X connect 69 4 38 0; ! #X connect 69 5 39 0; ! #X connect 69 6 40 0; ! #X connect 69 7 41 0; ! #X connect 69 8 42 0; ! #X connect 69 9 43 0; ! #X connect 69 10 44 0; ! #X connect 69 11 45 0; ! #X connect 69 12 46 0; ! #X connect 69 13 47 0; ! #X connect 69 14 48 0; ! #X connect 69 15 49 0; ! #X connect 72 0 70 1; ! #X connect 73 0 60 0; ! #X connect 74 0 60 0;
Index: hidio.c =================================================================== RCS file: /cvsroot/pure-data/externals/io/hidio/hidio.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** hidio.c 3 Jan 2007 06:33:25 -0000 1.19 --- hidio.c 26 Jul 2007 07:31:38 -0000 1.20 *************** *** 549,553 **** /* init vars */ global_debug_level = 9; /* high numbers here means see more messages */ - x->x_has_ff = 0; x->x_device_open = 0; x->x_started = 0; --- 549,552 ---- *************** *** 589,604 **** class_addmethod(hidio_class,(t_method) hidio_close,gensym("close"),0); class_addmethod(hidio_class,(t_method) hidio_poll,gensym("poll"),A_DEFFLOAT,0); ! /* force feedback messages */ ! class_addmethod(hidio_class,(t_method) hidio_ff_autocenter, ! gensym("ff_autocenter"),A_DEFFLOAT,0); ! class_addmethod(hidio_class,(t_method) hidio_ff_gain,gensym("ff_gain"),A_DEFFLOAT,0); ! class_addmethod(hidio_class,(t_method) hidio_ff_motors,gensym("ff_motors"),A_DEFFLOAT,0); ! class_addmethod(hidio_class,(t_method) hidio_ff_continue,gensym("ff_continue"),0); ! class_addmethod(hidio_class,(t_method) hidio_ff_pause,gensym("ff_pause"),0); ! class_addmethod(hidio_class,(t_method) hidio_ff_reset,gensym("ff_reset"),0); ! class_addmethod(hidio_class,(t_method) hidio_ff_stopall,gensym("ff_stopall"),0); ! /* ff tests */ ! class_addmethod(hidio_class,(t_method) hidio_ff_fftest,gensym("fftest"),A_DEFFLOAT,0); ! class_addmethod(hidio_class,(t_method) hidio_ff_print,gensym("ff_print"),0);
post("[hidio] %d.%d, written by Hans-Christoph Steiner hans@eds.org", --- 588,596 ---- class_addmethod(hidio_class,(t_method) hidio_close,gensym("close"),0); class_addmethod(hidio_class,(t_method) hidio_poll,gensym("poll"),A_DEFFLOAT,0); ! ! /* test function for output support */ ! class_addmethod(hidio_class,(t_method) hidio_write_event, gensym("write"), ! A_DEFSYMBOL, A_DEFSYMBOL, A_FLOAT, A_FLOAT ,0); !
post("[hidio] %d.%d, written by Hans-Christoph Steiner hans@eds.org", *************** *** 681,695 **** class_addmethod(c, (method)hidio_close, "close",0); class_addmethod(c, (method)hidio_poll, "poll",A_DEFFLOAT,0); - /* force feedback messages */ - class_addmethod(c, (method)hidio_ff_autocenter, "ff_autocenter",A_DEFFLOAT,0); - class_addmethod(c, (method)hidio_ff_gain, "ff_gain",A_DEFFLOAT,0); - class_addmethod(c, (method)hidio_ff_motors, "ff_motors",A_DEFFLOAT,0); - class_addmethod(c, (method)hidio_ff_continue, "ff_continue",0); - class_addmethod(c, (method)hidio_ff_pause, "ff_pause",0); - class_addmethod(c, (method)hidio_ff_reset, "ff_reset",0); - class_addmethod(c, (method)hidio_ff_stopall, "ff_stopall",0); - /* ff tests */ - class_addmethod(c, (method)hidio_ff_fftest, "fftest",A_DEFFLOAT,0); - class_addmethod(c, (method)hidio_ff_print, "ff_print",0); /* perfomrance / system stuff */
--- 673,676 ----
Index: hidio.h =================================================================== RCS file: /cvsroot/pure-data/externals/io/hidio/hidio.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** hidio.h 3 Jan 2007 06:33:25 -0000 1.19 --- hidio.h 26 Jul 2007 07:31:38 -0000 1.20 *************** *** 187,193 **** extern void hidio_build_device_list(void); extern void hidio_get_events(t_hidio *x); extern void hidio_print(t_hidio* x); /* print info to the console */ ! extern void hidio_platform_specific_info(t_hidio* x); /* device info on the status outlet */ ! extern void hidio_platform_specific_free(t_hidio *x); extern void *hidio_platform_specific_new(t_hidio *x); extern short get_device_number_by_id(unsigned short vendor_id, unsigned short product_id); --- 187,195 ---- extern void hidio_build_device_list(void); extern void hidio_get_events(t_hidio *x); + extern void hidio_write_event(t_hidio *x, t_symbol *type, t_symbol *code, + t_float instance, t_float value); extern void hidio_print(t_hidio* x); /* print info to the console */ ! extern void hidio_platform_specific_info(t_hidio *x); /* device info on the status outlet */ ! extern void hidio_platform_specific_free(t_hidio *x); extern void *hidio_platform_specific_new(t_hidio *x); extern short get_device_number_by_id(unsigned short vendor_id, unsigned short product_id); *************** *** 197,213 **** unsigned short usage);
- /* cross-platform force feedback functions */ - extern void hidio_ff_autocenter(t_hidio *x, t_float value); - extern void hidio_ff_gain(t_hidio *x, t_float value); - extern void hidio_ff_motors(t_hidio *x, t_float value); - extern void hidio_ff_continue(t_hidio *x); - extern void hidio_ff_pause(t_hidio *x); - extern void hidio_ff_reset(t_hidio *x); - extern void hidio_ff_stopall(t_hidio *x); - - /* these are just for testing... */ - extern void hidio_ff_fftest (t_hidio *x, t_float value); - extern void hidio_ff_print(t_hidio *x); - /*============================================================================== * event symbols array sizes --- 199,202 ----
Index: hidio_linux.c =================================================================== RCS file: /cvsroot/pure-data/externals/io/hidio/hidio_linux.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** hidio_linux.c 3 Jan 2007 06:33:25 -0000 1.7 --- hidio_linux.c 26 Jul 2007 07:31:38 -0000 1.8 *************** *** 13,16 **** --- 13,17 ---- #include <unistd.h> #include <stdint.h> + #include <stdlib.h>
#include "hidio.h" *************** *** 57,75 **** char hidio_code[MAXPDSTRING]; if(linux_code >= 0x100) ! { ! if(linux_code < BTN_MOUSE) /* numbered buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_MISC); ! else if(linux_code < BTN_JOYSTICK) /* mouse buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_MOUSE); ! else if(linux_code < BTN_GAMEPAD) /* joystick buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_JOYSTICK); ! else if(linux_code < BTN_DIGI) /* gamepad buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_GAMEPAD); ! else if(linux_code < BTN_WHEEL) /* tablet buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_DIGI); ! else if(linux_code < KEY_OK) /* wheel buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_WHEEL); ! else return 0; ! } return gensym(hidio_code ? hidio_code : "?"); } --- 58,76 ---- char hidio_code[MAXPDSTRING]; if(linux_code >= 0x100) ! { ! if(linux_code < BTN_MOUSE) /* numbered buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_MISC); ! else if(linux_code < BTN_JOYSTICK) /* mouse buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_MOUSE); ! else if(linux_code < BTN_GAMEPAD) /* joystick buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_JOYSTICK); ! else if(linux_code < BTN_DIGI) /* gamepad buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_GAMEPAD); ! else if(linux_code < BTN_WHEEL) /* tablet buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_DIGI); ! else if(linux_code < KEY_OK) /* wheel buttons */ ! snprintf(hidio_code, MAXPDSTRING,"btn_%d",linux_code - BTN_WHEEL); ! else return 0; ! } return gensym(hidio_code ? hidio_code : "?"); } *************** *** 83,137 **** { if(linux_code > 226) ! return 0;
static char key_names[227][32] = ! { ! "key_reserved", "key_esc", "key_1", "key_2", "key_3", "key_4", ! "key_5", "key_6", "key_7", "key_8", "key_9", "key_0", "key_minus", ! "key_equal", "key_backspace", "key_tab", "key_q", "key_w", ! "key_e", "key_r", "key_t", "key_y", "key_u", "key_i", "key_o", ! "key_p","key_leftbrace", "key_rightbrace", "key_enter", ! "key_leftctrl", "key_a","key_s", "key_d", "key_f", "key_g", ! "key_h", "key_j", "key_k", "key_l", "key_semicolon", ! "key_apostrophe", "key_grave", "key_leftshift", "key_backslash", ! "key_z","key_x", "key_c", "key_v", "key_b", "key_n", "key_m", ! "key_comma", "key_dot", "key_slash","key_rightshift", ! "key_kpasterisk", "key_leftalt", "key_space", "key_capslock", ! "key_f1", "key_f2", "key_f3", "key_f4", "key_f5", "key_f6", ! "key_f7", "key_f8", "key_f9", "key_f10","key_numlock", ! "key_scrolllock", "key_kp7", "key_kp8", "key_kp9", "key_kpminus", ! "key_kp4", "key_kp5", "key_kp6", "key_kpplus", "key_kp1", "key_kp2", ! "key_kp3", "key_kp3", "key_kpdot","key_103rd", "key_f13", ! "key_102nd", "key_f11", "key_f12", "key_f14", "key_f15", "key_f16", ! "key_f17", "key_f18", "key_f19", "key_f20", "key_kpenter", ! "key_rightctrl", "key_kpslash","key_sysrq", "key_rightalt", ! "key_linefeed", "key_home", "key_up", "key_pageup", "key_left", ! "key_right", "key_end", "key_down", "key_pagedown", "key_insert", ! "key_delete", "key_macro","key_mute", "key_volumedown", ! "key_volumeup", "key_power", "key_kpequal", "key_kpplusminus", ! "key_pause", "key_f21", "key_f22", "key_f23", "key_f24", ! "key_kpcomma", "key_leftmeta","key_rightmeta", "key_compose", ! "key_stop", "key_again", "key_props", "key_undo", "key_front", ! "key_copy", "key_open","key_paste", "key_find","key_cut","key_help", ! "key_menu", "key_calc", "key_setup", "key_sleep", "key_wakeup", ! "key_file", "key_sendfile", "key_deletefile","key_xfer","key_prog1", ! "key_prog2", "key_www","key_msdos", "key_coffee", "key_direction", ! "key_cyclewindows", "key_mail", "key_bookmarks","key_computer", ! "key_back", "key_forward", "key_colsecd", "key_ejectcd", ! "key_ejectclosecd","key_nextsong","key_playpause","key_previoussong", ! "key_stopcd", "key_record","key_rewind", "key_phone", "key_iso", ! "key_config", "key_homepage", "key_refresh", "key_exit","key_move", ! "key_edit", "key_scrollup", "key_scrolldown", "key_kpleftparen", ! "key_kprightparen","key_intl1", "key_intl2", "key_intl3","key_intl4", ! "key_intl5", "key_intl6", "key_intl7","key_intl8", "key_intl9", ! "key_lang1", "key_lang2", "key_lang3", "key_lang4", "key_lang5", ! "key_lang6", "key_lang7", "key_lang8", "key_lang9", "key_playcd", ! "key_pausecd", "key_prog3","key_prog4", "key_suspend", "key_close", ! "key_play", "key_fastforward", "key_bassboost","key_print", "key_hp", ! "key_camera", "key_sound", "key_question", "key_email", "key_chat", ! "key_search", "key_connect", "key_finance", "key_sport", "key_shop", ! "key_alterase","key_cancel", "key_brightnessdown", "key_brightnessup", ! "key_media" ! }; return gensym(key_names[linux_code]); // TODO: this should just return the char * } --- 84,138 ---- { if(linux_code > 226) ! return 0;
static char key_names[227][32] = ! { ! "key_reserved", "key_esc", "key_1", "key_2", "key_3", "key_4", ! "key_5", "key_6", "key_7", "key_8", "key_9", "key_0", "key_minus", ! "key_equal", "key_backspace", "key_tab", "key_q", "key_w", ! "key_e", "key_r", "key_t", "key_y", "key_u", "key_i", "key_o", ! "key_p","key_leftbrace", "key_rightbrace", "key_enter", ! "key_leftctrl", "key_a","key_s", "key_d", "key_f", "key_g", ! "key_h", "key_j", "key_k", "key_l", "key_semicolon", ! "key_apostrophe", "key_grave", "key_leftshift", "key_backslash", ! "key_z","key_x", "key_c", "key_v", "key_b", "key_n", "key_m", ! "key_comma", "key_dot", "key_slash","key_rightshift", ! "key_kpasterisk", "key_leftalt", "key_space", "key_capslock", ! "key_f1", "key_f2", "key_f3", "key_f4", "key_f5", "key_f6", ! "key_f7", "key_f8", "key_f9", "key_f10","key_numlock", ! "key_scrolllock", "key_kp7", "key_kp8", "key_kp9", "key_kpminus", ! "key_kp4", "key_kp5", "key_kp6", "key_kpplus", "key_kp1", "key_kp2", ! "key_kp3", "key_kp3", "key_kpdot","key_103rd", "key_f13", ! "key_102nd", "key_f11", "key_f12", "key_f14", "key_f15", "key_f16", ! "key_f17", "key_f18", "key_f19", "key_f20", "key_kpenter", ! "key_rightctrl", "key_kpslash","key_sysrq", "key_rightalt", ! "key_linefeed", "key_home", "key_up", "key_pageup", "key_left", ! "key_right", "key_end", "key_down", "key_pagedown", "key_insert", ! "key_delete", "key_macro","key_mute", "key_volumedown", ! "key_volumeup", "key_power", "key_kpequal", "key_kpplusminus", ! "key_pause", "key_f21", "key_f22", "key_f23", "key_f24", ! "key_kpcomma", "key_leftmeta","key_rightmeta", "key_compose", ! "key_stop", "key_again", "key_props", "key_undo", "key_front", ! "key_copy", "key_open","key_paste", "key_find","key_cut","key_help", ! "key_menu", "key_calc", "key_setup", "key_sleep", "key_wakeup", ! "key_file", "key_sendfile", "key_deletefile","key_xfer","key_prog1", ! "key_prog2", "key_www","key_msdos", "key_coffee", "key_direction", ! "key_cyclewindows", "key_mail", "key_bookmarks","key_computer", ! "key_back", "key_forward", "key_colsecd", "key_ejectcd", ! "key_ejectclosecd","key_nextsong","key_playpause","key_previoussong", ! "key_stopcd", "key_record","key_rewind", "key_phone", "key_iso", ! "key_config", "key_homepage", "key_refresh", "key_exit","key_move", ! "key_edit", "key_scrollup", "key_scrolldown", "key_kpleftparen", ! "key_kprightparen","key_intl1", "key_intl2", "key_intl3","key_intl4", ! "key_intl5", "key_intl6", "key_intl7","key_intl8", "key_intl9", ! "key_lang1", "key_lang2", "key_lang3", "key_lang4", "key_lang5", ! "key_lang6", "key_lang7", "key_lang8", "key_lang9", "key_playcd", ! "key_pausecd", "key_prog3","key_prog4", "key_suspend", "key_close", ! "key_play", "key_fastforward", "key_bassboost","key_print", "key_hp", ! "key_camera", "key_sound", "key_question", "key_email", "key_chat", ! "key_search", "key_connect", "key_finance", "key_sport", "key_shop", ! "key_alterase","key_cancel", "key_brightnessdown", "key_brightnessup", ! "key_media" ! }; return gensym(key_names[linux_code]); // TODO: this should just return the char * } *************** *** 144,154 **** debug_post(LOG_DEBUG,"hidio_print_element_list"); unsigned long element_bitmask[EV_MAX][NBITS(KEY_MAX)]; ! // char event_type_string[256]; ! // char event_code_string[256]; char *event_type_name = ""; t_int i, j; /* counts for various event types */ t_int syn_count,key_count,rel_count,abs_count,msc_count,led_count, ! snd_count,rep_count,ff_count,pwr_count,ff_status_count;
/* get bitmask representing supported element (axes, keys, etc.) */ --- 145,155 ---- debug_post(LOG_DEBUG,"hidio_print_element_list"); unsigned long element_bitmask[EV_MAX][NBITS(KEY_MAX)]; ! // char event_type_string[256]; ! // char event_code_string[256]; char *event_type_name = ""; t_int i, j; /* counts for various event types */ t_int syn_count,key_count,rel_count,abs_count,msc_count,led_count, ! snd_count,rep_count,ff_count,pwr_count,ff_status_count;
/* get bitmask representing supported element (axes, keys, etc.) */ *************** *** 157,161 **** post("\nSupported events:");
! /* init all count vars */ syn_count = key_count = rel_count = abs_count = msc_count = led_count = 0; snd_count = rep_count = ff_count = pwr_count = ff_status_count = 0; --- 158,162 ---- post("\nSupported events:");
! /* init all count vars */ syn_count = key_count = rel_count = abs_count = msc_count = led_count = 0; snd_count = rep_count = ff_count = pwr_count = ff_status_count = 0; *************** *** 165,253 **** */ for(i = 1; i < EV_MAX; i++) ! { ! if(test_bit(i, element_bitmask[0])) ! { ! /* make pretty names for event types */ ! switch(i) ! { // case EV_SYN: event_type_name = "Synchronization"; break; ! case EV_KEY: event_type_name = "Keys/Buttons"; break; ! case EV_REL: event_type_name = "Relative Axis"; break; ! case EV_ABS: event_type_name = "Absolute Axis"; break; ! case EV_MSC: event_type_name = "Miscellaneous"; break; ! case EV_LED: event_type_name = "LEDs"; break; ! case EV_SND: event_type_name = "System Sounds"; break; ! case EV_REP: event_type_name = "Autorepeat Values"; break; ! case EV_FF: event_type_name = "Force Feedback"; break; ! case EV_PWR: event_type_name = "Power"; break; ! case EV_FF_STATUS: event_type_name = "Force Feedback Status"; break; ! default: event_type_name = "UNSUPPORTED"; ! } ! /* get bitmask representing supported button types */ ! ioctl(x->x_fd, EVIOCGBIT(i, KEY_MAX), element_bitmask[i]); ! post(""); ! post(" TYPE\tCODE\tEVENT NAME"); ! post("-----------------------------------------------------------");
! /* 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])) ! { ! if((i == EV_KEY) && (j >= BTN_MISC) && (j < KEY_OK) ) ! { ! t_symbol * hidio_codesym = hidio_convert_linux_buttons_to_numbers(j); ! if(hidio_codesym) ! { ! post(" %s\t%s\t%s (%s)", ! ev[i] ? ev[i] : "?", ! hidio_codesym->s_name, ! event_type_name, ! event_names[i] ? (event_names[i][j] ? event_names[i][j] : "?") : "?"); ! } ! } ! else if(i != EV_SYN) ! { ! post(" %s\t%s\t%s", ! ev[i] ? ev[i] : "?", ! event_names[i][j] ? event_names[i][j] : "?", ! event_type_name);
! /* post(" Event code %d (%s)", j, names[i] ? (names[i][j] ? names[i][j] : "?") : "?"); */ ! } ! switch(i) { ! /* ! * the API changed at some point... EV_SYN seems to be the new name ! * from "Reset" events to "Syncronization" events ! */ ! /* #ifdef EV_RST */ ! /* case EV_RST: syn_count++; break; */ ! /* #else */ ! /* case EV_SYN: syn_count++; break; */ ! /* #endif */ ! case EV_KEY: key_count++; break; ! case EV_REL: rel_count++; break; ! case EV_ABS: abs_count++; break; ! case EV_MSC: msc_count++; break; ! case EV_LED: led_count++; break; ! case EV_SND: snd_count++; break; ! case EV_REP: rep_count++; break; ! case EV_FF: ff_count++; break; ! case EV_PWR: pwr_count++; break; ! case EV_FF_STATUS: ff_status_count++; break; ! } ! } ! } ! } ! }
post("\nDetected:"); ! // if(syn_count > 0) post (" %d Synchronization types",syn_count); if(key_count > 0) post (" %d Key/Button types",key_count); if(rel_count > 0) post (" %d Relative Axis types",rel_count); --- 166,254 ---- */ for(i = 1; i < EV_MAX; i++) ! { ! if(test_bit(i, element_bitmask[0])) ! { ! /* make pretty names for event types */ ! switch(i) ! { // case EV_SYN: event_type_name = "Synchronization"; break; ! case EV_KEY: event_type_name = "Keys/Buttons"; break; ! case EV_REL: event_type_name = "Relative Axis"; break; ! case EV_ABS: event_type_name = "Absolute Axis"; break; ! case EV_MSC: event_type_name = "Miscellaneous"; break; ! case EV_LED: event_type_name = "LEDs"; break; ! case EV_SND: event_type_name = "System Sounds"; break; ! case EV_REP: event_type_name = "Autorepeat Values"; break; ! case EV_FF: event_type_name = "Force Feedback"; break; ! case EV_PWR: event_type_name = "Power"; break; ! case EV_FF_STATUS: event_type_name = "Force Feedback Status"; break; ! default: event_type_name = "UNSUPPORTED"; ! } ! /* get bitmask representing supported button types */ ! ioctl(x->x_fd, EVIOCGBIT(i, KEY_MAX), element_bitmask[i]); ! post(""); ! post(" TYPE\tCODE\tEVENT NAME"); ! post("-----------------------------------------------------------");
! /* 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])) ! { ! if((i == EV_KEY) && (j >= BTN_MISC) && (j < KEY_OK) ) ! { ! t_symbol * hidio_codesym = hidio_convert_linux_buttons_to_numbers(j); ! if(hidio_codesym) ! { ! post(" %s\t%s\t%s (%s)", ! ev[i] ? ev[i] : "?", ! hidio_codesym->s_name, ! event_type_name, ! event_names[i] ? (event_names[i][j] ? event_names[i][j] : "?") : "?"); ! } ! } ! else if(i != EV_SYN) ! { ! post(" %s\t%s\t%s", ! ev[i] ? ev[i] : "?", ! event_names[i][j] ? event_names[i][j] : "?", ! event_type_name);
! /* post(" Event code %d (%s)", j, names[i] ? (names[i][j] ? names[i][j] : "?") : "?"); */ ! } ! switch(i) { ! /* ! * the API changed at some point... EV_SYN seems to be the new name ! * from "Reset" events to "Syncronization" events ! */ ! /* #ifdef EV_RST */ ! /* case EV_RST: syn_count++; break; */ ! /* #else */ ! /* case EV_SYN: syn_count++; break; */ ! /* #endif */ ! case EV_KEY: key_count++; break; ! case EV_REL: rel_count++; break; ! case EV_ABS: abs_count++; break; ! case EV_MSC: msc_count++; break; ! case EV_LED: led_count++; break; ! case EV_SND: snd_count++; break; ! case EV_REP: rep_count++; break; ! case EV_FF: ff_count++; break; ! case EV_PWR: pwr_count++; break; ! case EV_FF_STATUS: ff_status_count++; break; ! } ! } ! } ! } ! }
post("\nDetected:"); ! // if(syn_count > 0) post (" %d Synchronization types",syn_count); if(key_count > 0) post (" %d Key/Button types",key_count); if(rel_count > 0) post (" %d Relative Axis types",rel_count); *************** *** 272,296 **** post(""); for(i=0;i<128;++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); ! close (fd); ! } ! } ! } post(""); } --- 273,297 ---- post(""); for(i=0;i<128;++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); ! close (fd); ! } ! } ! } post(""); } *************** *** 309,381 **** 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]; ! } ! } ! } ! } ! } }
--- 310,382 ---- 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]; ! } ! } ! } ! } ! } }
*************** *** 388,399 **** debug_post(9,"hidio_get_events");
! /* for debugging, counts how many events are processed each time hidio_read() is called */ DEBUG(t_int event_counter = 0;); unsigned short i; t_hid_element *output_element = NULL;
! /* this will go into the generic read function declared in hidio.h and ! * implemented in hidio_linux.c ! */ struct input_event hidio_input_event;
--- 389,400 ---- debug_post(9,"hidio_get_events");
! /* for debugging, counts how many events are processed each time hidio_read() is called */ DEBUG(t_int event_counter = 0;); unsigned short i; t_hid_element *output_element = NULL;
! /* this will go into the generic read function declared in hidio.h and ! * implemented in hidio_linux.c ! */ struct input_event hidio_input_event;
*************** *** 401,428 ****
while( read (x->x_fd, &(hidio_input_event), sizeof(struct input_event)) > -1 ) ! { ! if( hidio_input_event.type != EV_SYN ) ! { ! 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) ) ! { ! output_element->value = hidio_input_event.value; ! debug_post(9,"i: %d linux_type: %d linux_code: %d", i, ! output_element->linux_type, output_element->linux_code); ! debug_post(9,"value to output: %d",output_element->value); ! break; ! } ! } ! if( output_element != NULL ) ! hidio_output_event(x, output_element); ! } ! DEBUG(++event_counter;); ! } DEBUG( ! if(event_counter > 0) ! debug_post(8,"output %d events",event_counter); ); --- 402,429 ----
while( read (x->x_fd, &(hidio_input_event), sizeof(struct input_event)) > -1 ) ! { ! if( hidio_input_event.type != EV_SYN ) ! { ! 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) ) ! { ! output_element->value = hidio_input_event.value; ! debug_post(9,"i: %d linux_type: %d linux_code: %d", i, ! output_element->linux_type, output_element->linux_code); ! debug_post(9,"value to output: %d",output_element->value); ! break; ! } ! } ! if( output_element != NULL ) ! hidio_output_event(x, output_element); ! } ! DEBUG(++event_counter;); ! } DEBUG( ! if(event_counter > 0) ! debug_post(8,"output %d events",event_counter); ); *************** *** 452,466 ****
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("[hidio] open %s failed",block_device); ! x->x_fd = -1; ! return EXIT_FAILURE; ! } ! }
/* read input_events from the HID_DEVICE stream --- 453,468 ----
if(block_device) ! { ! /* open the device read-only, non-exclusive */ ! // x->x_fd = open(block_device, O_RDONLY | O_NONBLOCK); ! x->x_fd = open(block_device, O_RDWR | O_NONBLOCK); ! /* test if device open */ ! if(x->x_fd < 0 ) ! { ! error("[hidio] open %s failed",block_device); ! x->x_fd = -1; ! return EXIT_FAILURE; ! } ! }
/* read input_events from the HID_DEVICE stream *************** *** 472,476 **** ioctl(x->x_fd, EVIOCGNAME(sizeof(device_name)), device_name); post ("[hidio] opened device %d (%s): %s", ! x->x_device_number,block_device,device_name);
post("pre hidio_build_element_list"); --- 474,478 ---- ioctl(x->x_fd, EVIOCGNAME(sizeof(device_name)), device_name); post ("[hidio] opened device %d (%s): %s", ! x->x_device_number,block_device,device_name);
post("pre hidio_build_element_list"); *************** *** 486,492 **** debug_post(LOG_DEBUG,"hidio_close_device"); if(x->x_fd > -1) ! return (close(x->x_fd)); else ! return EXIT_SUCCESS; }
--- 488,494 ---- debug_post(LOG_DEBUG,"hidio_close_device"); if(x->x_fd > -1) ! return (close(x->x_fd)); else ! return EXIT_SUCCESS; }
*************** *** 494,503 **** void hidio_build_device_list(void) { ! /* ! * since in GNU/Linux the device list is the input event devices ! * (/dev/input/event?), nothing needs to be done as of yet to refresh ! * the device list. Once the device name can be other things in addition ! * the current t_float, then this will probably need to be changed. ! */ int fd; unsigned int i; --- 496,505 ---- void hidio_build_device_list(void) { ! /* ! * since in GNU/Linux the device list is the input event devices ! * (/dev/input/event?), nothing needs to be done as of yet to refresh ! * the device list. Once the device name can be other things in addition ! * the current t_float, then this will probably need to be changed. ! */ int fd; unsigned int i; *************** *** 512,537 ****
for(i=0; i<MAX_DEVICES; ++i) ! { ! snprintf(block_device, MAXPDSTRING, "%s%d", LINUX_BLOCK_DEVICE, i); ! /* open the device read-only, non-exclusive */ ! fd = open (block_device, O_RDONLY | O_NONBLOCK); ! /* test if device open */ ! if(fd < 0 ) { ! /* post("Nothing on %s.", &block_device); */ ! fd = -1; ! } else { ! /* read input_events from the LINUX_BLOCK_DEVICE stream ! * It seems that is just there to flush the event input buffer? */ ! while( read(fd, &(x_input_event),sizeof(struct input_event)) > -1 ); ! /* get name of device */ ! ioctl(fd, EVIOCGNAME(sizeof(device_name)), device_name); ! post("Found '%s' on '%s'",device_name, &block_device);
! close (fd); ! } ! last_active_device = i;
! } device_count = last_active_device ; // set the global variable debug_post(LOG_WARNING,"[hidio] completed device list."); --- 514,539 ----
for(i=0; i<MAX_DEVICES; ++i) ! { ! snprintf(block_device, MAXPDSTRING, "%s%d", LINUX_BLOCK_DEVICE, i); ! /* open the device read-only, non-exclusive */ ! fd = open (block_device, O_RDONLY | O_NONBLOCK); ! /* test if device open */ ! if(fd < 0 ) { ! /* post("Nothing on %s.", &block_device); */ ! fd = -1; ! } else { ! /* read input_events from the LINUX_BLOCK_DEVICE stream ! * It seems that is just there to flush the event input buffer? */ ! while( read(fd, &(x_input_event),sizeof(struct input_event)) > -1 ); ! /* get name of device */ ! ioctl(fd, EVIOCGNAME(sizeof(device_name)), device_name); ! post("Found '%s' on '%s'",device_name, &block_device);
! close (fd); ! } ! last_active_device = i;
! } device_count = last_active_device ; // set the global variable debug_post(LOG_WARNING,"[hidio] completed device list."); *************** *** 552,573 **** { struct input_id my_id; ! char device_name[MAXPDSTRING] = "Unknown"; ! char vendor_id_string[7]; ! char product_id_string[7]; t_atom *output_atom = getbytes(sizeof(t_atom)); ! ioctl(x->x_fd, EVIOCGID); ! 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"), ! 1, output_atom); ! snprintf(product_id_string,7,"0x%04x", my_id.product); ! SETSYMBOL(output_atom, gensym(product_id_string)); outlet_anything( x->x_status_outlet, gensym("productID"), ! 1, output_atom); ! ioctl(x->x_fd, EVIOCGNAME(sizeof(device_name)), device_name); ! SETSYMBOL(output_atom, gensym(device_name)); ! outlet_anything( x->x_status_outlet, gensym("name"), ! 1, output_atom); freebytes(output_atom,sizeof(t_atom)); } --- 554,575 ---- { struct input_id my_id; ! char product_string[MAXPDSTRING] = "Unknown"; ! char vendorid_string[7]; ! char productid_string[7]; t_atom *output_atom = getbytes(sizeof(t_atom)); ! ioctl(x->x_fd, EVIOCGID); ! snprintf(vendorid_string,7,"0x%04x", my_id.vendor); ! SETSYMBOL(output_atom, gensym(vendorid_string)); outlet_anything( x->x_status_outlet, gensym("vendorID"), ! 1, output_atom); ! snprintf(productid_string,7,"0x%04x", my_id.product); ! SETSYMBOL(output_atom, gensym(productid_string)); outlet_anything( x->x_status_outlet, gensym("productID"), ! 1, output_atom); ! ioctl(x->x_fd, EVIOCGNAME(sizeof(product_string)), product_string); ! SETSYMBOL(output_atom, gensym(product_string)); ! outlet_anything( x->x_status_outlet, gensym("product"), ! 1, output_atom); freebytes(output_atom,sizeof(t_atom)); } *************** *** 581,586 ****
short get_device_number_from_usage(short device_number, ! unsigned short usage_page, ! unsigned short usage) {
--- 583,588 ----
short get_device_number_from_usage(short device_number, ! unsigned short usage_page, ! unsigned short usage) {
*************** *** 589,652 ****
! ! /* ------------------------------------------------------------------------------ */ ! /* FORCE FEEDBACK FUNCTIONS */ ! /* ------------------------------------------------------------------------------ */ ! ! /* cross-platform force feedback functions */ ! void hidio_ff_autocenter( t_hidio *x, t_float value ) ! { ! ! } ! ! ! void hidio_ff_gain( t_hidio *x, t_float value ) ! { ! ! } ! ! ! void hidio_ff_motors( t_hidio *x, t_float value ) ! { ! ! } ! ! ! void hidio_ff_continue( t_hidio *x ) ! { ! ! } ! ! ! void hidio_ff_pause( t_hidio *x ) ! { ! ! } ! ! ! void hidio_ff_reset( t_hidio *x ) ! { ! ! } ! ! ! void hidio_ff_stopall( t_hidio *x ) ! { ! ! } ! ! ! ! // these are just for testing... ! void hidio_ff_fftest ( t_hidio *x, t_float value) { ! }
- void hidio_ff_print( t_hidio *x ) - { - } -
#endif /* #ifdef __linux__ */ --- 591,608 ----
! void hidio_write_event(t_hidio *x, t_symbol *type, t_symbol *code, ! t_float instance, t_float value) { ! struct input_event write_event; ! ! post("%s %s %d", type->s_name, code->s_name, value); ! write_event.type = strtol(type->s_name, NULL, 16); ! write_event.code = strtol(code->s_name, NULL, 16); ! write_event.value = (int) value; ! ! write(x->x_fd, (const void*) &write_event, sizeof(write_event)); }
#endif /* #ifdef __linux__ */