[PD-cvs] externals/hcs/hid TODO,1.2,1.3 hid-help.pd,1.7,1.8 hid.c,1.11,1.12 hid.h,1.8,1.9 hid_darwin.c,1.6,1.7 hid_linux.c,1.3,1.4 mouse-help.pd,1.2,1.3

Hans-Christoph Steiner eighthave at users.sourceforge.net
Sun Nov 7 17:28:28 CET 2004


Update of /cvsroot/pure-data/externals/hcs/hid
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28595

Modified Files:
	TODO hid-help.pd hid.c hid.h hid_darwin.c hid_linux.c 
	mouse-help.pd 
Log Message:
cleaned up the code a fair amount, but there are still lots of bugs bugs bugs...

Index: hid-help.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid-help.pd,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** hid-help.pd	6 Nov 2004 21:15:04 -0000	1.7
--- hid-help.pd	7 Nov 2004 16:28:25 -0000	1.8
***************
*** 1,4 ****
! #N canvas 143 45 927 650 10;
! #X msg 390 265 ev_rel rel_x 0 4.08559e+09;
  #X obj 390 244 prepend set;
  #X obj 149 473 route rel_x rel_y;
--- 1,4 ----
! #N canvas 156 27 943 666 10;
! #X msg 390 265 ev_rel rel_x 2 3.57445e+09;
  #X obj 390 244 prepend set;
  #X obj 149 473 route rel_x rel_y;
***************
*** 21,28 ****
  #X symbolatom 468 409 10 0 0 1 eventcode - -;
  #X symbolatom 438 428 15 0 0 1 eventtype - -;
- #X floatatom 93 536 5 0 0 0 - - -;
- #X floatatom 168 537 5 0 0 0 - - -;
- #X obj 93 514 route key_f key_leftctrl btn_left;
- #X floatatom 243 537 5 0 0 0 - - -;
  #X obj 177 296 bng 35 250 50 0 empty empty event_received 38 18 1 9
  -225280 -1 -1;
--- 21,24 ----
***************
*** 56,64 ****
  #X text 397 111 refresh device list;
  #X obj 248 225 hid 2;
! #X obj 337 514 unpack s f f;
! #X obj 376 532 tgl 25 0 empty empty any_button 27 13 1 9 -195568 -1
  -1 0 1;
! #X obj 740 511 all_about_hid;
! #X text 631 512 For more info:;
  #X text 49 588 (C) Copyright 2004 Hans-Christoph Steiner <hans at at.or.at>
  ;
--- 52,60 ----
  #X text 397 111 refresh device list;
  #X obj 248 225 hid 2;
! #X obj 94 524 unpack s f f;
! #X obj 133 542 tgl 25 0 empty empty any_button 27 13 1 9 -195568 -1
  -1 0 1;
! #X obj 746 556 all_about_hid;
! #X text 637 557 For more info:;
  #X text 49 588 (C) Copyright 2004 Hans-Christoph Steiner <hans at at.or.at>
  ;
***************
*** 75,118 ****
  #X text 371 56 !!! This software is very much alpha \, so any aspect
  of it could change without notice !!!;
  #X connect 1 0 0 0;
  #X connect 2 0 3 0;
  #X connect 2 1 4 0;
! #X connect 5 0 51 0;
! #X connect 6 0 51 0;
  #X connect 8 0 19 0;
  #X connect 8 1 18 0;
  #X connect 8 2 17 0;
  #X connect 8 3 7 0;
! #X connect 9 0 51 0;
! #X connect 10 0 51 0;
! #X connect 11 0 51 0;
! #X connect 12 0 51 0;
! #X connect 13 0 51 0;
! #X connect 16 0 51 0;
! #X connect 22 0 20 0;
! #X connect 22 1 21 0;
! #X connect 22 2 23 0;
! #X connect 22 3 52 0;
  #X connect 41 0 40 0;
! #X connect 41 0 24 0;
! #X connect 42 0 41 1;
! #X connect 43 0 22 0;
! #X connect 43 1 2 0;
! #X connect 43 2 60 0;
! #X connect 43 3 46 0;
! #X connect 44 0 45 1;
! #X connect 45 0 44 0;
! #X connect 46 0 45 0;
! #X connect 47 0 51 0;
! #X connect 49 0 51 0;
! #X connect 51 0 41 0;
! #X connect 51 0 43 0;
! #X connect 51 0 1 0;
! #X connect 51 0 8 0;
! #X connect 52 1 53 0;
! #X connect 60 0 14 0;
! #X connect 60 1 15 0;
! #X connect 60 2 61 0;
! #X connect 62 0 51 0;
! #X connect 63 0 51 0;
! #X connect 66 0 51 0;
--- 71,161 ----
  #X text 371 56 !!! This software is very much alpha \, so any aspect
  of it could change without notice !!!;
+ #X text 650 400 REFRESH RATES;
+ #X text 660 415 ADB = 15.5 ms;
+ #X text 660 430 USB mice on Windows = 8-10 ms;
+ #X text 660 445 USB mice on GNU/Linux = 1-10 ms;
+ #X text 660 460 USB wireless mice = 12-20 ms;
+ #X text 660 475 PS/2 mouse = 5-25 ms;
+ #X text 660 490 P5 Glove = 22 ms;
+ #N canvas 0 22 454 304 JustFOrTestng 0;
+ #X msg 390 265 ev_rel rel_x 0 2.56485e+09;
+ #X obj 390 244 prepend set;
+ #X msg 148 77 start;
+ #X msg 174 96 stop;
+ #X msg 239 57 open 0;
+ #X msg 246 75 open 1;
+ #X msg 253 93 open 2;
+ #X msg 259 111 open 3;
+ #X msg 265 129 open 4;
+ #X obj 86 81 tgl 35 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 25
+ ;
+ #X obj 223 266 spigot;
+ #X obj 269 266 tgl 17 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+ 1;
+ #X msg 336 136 close;
+ #X text 380 136 probably not needed;
+ #X msg 336 113 refresh;
+ #X text 397 111 refresh device list;
+ #X msg 398 180 poll 20;
+ #X msg 336 180 poll 2;
+ #X text 332 159 start polling and set the poll delay in ms;
+ #X msg 465 180 poll 2000;
+ #X text 371 56 !!! This software is very much alpha \, so any aspect
+ of it could change without notice !!!;
+ #X obj 248 225 hid 1;
+ #X connect 1 0 0 0;
+ #X connect 2 0 21 0;
+ #X connect 3 0 21 0;
+ #X connect 4 0 21 0;
+ #X connect 5 0 21 0;
+ #X connect 6 0 21 0;
+ #X connect 7 0 21 0;
+ #X connect 8 0 21 0;
+ #X connect 9 0 21 0;
+ #X connect 11 0 10 1;
+ #X connect 12 0 21 0;
+ #X connect 14 0 21 0;
+ #X connect 16 0 21 0;
+ #X connect 17 0 21 0;
+ #X connect 19 0 21 0;
+ #X connect 21 0 10 0;
+ #X connect 21 0 1 0;
+ #X restore 446 483 pd JustFOrTestng;
  #X connect 1 0 0 0;
  #X connect 2 0 3 0;
  #X connect 2 1 4 0;
! #X connect 5 0 47 0;
! #X connect 6 0 47 0;
  #X connect 8 0 19 0;
  #X connect 8 1 18 0;
  #X connect 8 2 17 0;
  #X connect 8 3 7 0;
! #X connect 9 0 47 0;
! #X connect 10 0 47 0;
! #X connect 11 0 47 0;
! #X connect 12 0 47 0;
! #X connect 13 0 47 0;
! #X connect 16 0 47 0;
! #X connect 37 0 36 0;
! #X connect 37 0 20 0;
! #X connect 38 0 37 1;
! #X connect 39 0 48 0;
! #X connect 39 1 2 0;
! #X connect 39 2 56 0;
! #X connect 39 3 42 0;
! #X connect 40 0 41 1;
  #X connect 41 0 40 0;
! #X connect 42 0 41 0;
! #X connect 43 0 47 0;
! #X connect 45 0 47 0;
! #X connect 47 0 37 0;
! #X connect 47 0 39 0;
! #X connect 47 0 1 0;
! #X connect 47 0 8 0;
! #X connect 48 1 49 0;
! #X connect 56 0 14 0;
! #X connect 56 1 15 0;
! #X connect 56 2 57 0;
! #X connect 58 0 47 0;
! #X connect 59 0 47 0;
! #X connect 62 0 47 0;

Index: hid_linux.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_linux.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** hid_linux.c	25 Oct 2004 06:01:45 -0000	1.3
--- hid_linux.c	7 Nov 2004 16:28:25 -0000	1.4
***************
*** 38,44 ****
   */
  
! t_int hid_output_events(t_hid *x)
  {
! 	DEBUG(post("hid_output_events"););
  
  /*	for debugging, counts how many events are processed each time hid_read() is called */
--- 38,44 ----
   */
  
! t_int hid_get_events(t_hid *x)
  {
! 	DEBUG(post("hid_get_events"););
  
  /*	for debugging, counts how many events are processed each time hid_read() is called */
***************
*** 218,224 ****
  }
  
! t_int hid_devicelist_refresh(t_hid *x)
  {
! 	DEBUG(post("hid_devicelist_refresh"););
  	/* the device list should be refreshed here */
  /*
--- 218,224 ----
  }
  
! t_int hid_build_device_list(t_hid *x)
  {
! 	DEBUG(post("hid_build_device_list"););
  	/* the device list should be refreshed here */
  /*

Index: hid.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** hid.c	6 Nov 2004 21:21:06 -0000	1.11
--- hid.c	7 Nov 2004 16:28:25 -0000	1.12
***************
*** 33,36 ****
--- 33,46 ----
  #define DEBUG(x) x 
  
+ /* 
+  * Various Max Refresh Rates: 
+       ADB = 15.5 ms
+ 		USB mice on Windows = 8-10 ms
+ 		USB mice on GNU/Linux = 1-10 ms
+ 		USB wireless mice = 12-20 ms
+ 		PS/2 mouse = 5-25 ms
+ 		P5 Globe = 22 ms
+  */
+ 
  #define DEFAULT_DELAY 5
  
***************
*** 46,49 ****
--- 56,97 ----
  static void hid_float(t_hid* x, t_floatarg f);
  
+ 
+ /*------------------------------------------------------------------------------
+  * SUPPORT FUNCTIONS
+  */
+ 
+ void hid_output_event(t_hid *x, 
+ 							  char *type, char *code, t_float value, t_float timestamp)
+ {
+ 	t_atom event_data[4];
+ 	
+ 	SETSYMBOL(event_data, gensym(type));	   /* type */
+ 	SETSYMBOL(event_data + 1, gensym(code));	/* code */
+ 	SETFLOAT(event_data + 2, value);	         /* value */
+ 	SETFLOAT(event_data + 3, timestamp); 	   /* timestamp */
+ 
+ 	outlet_anything(x->x_obj.te_outlet,atom_gensym(event_data),3,event_data+1);
+ }
+ 
+ void hid_set_from_float(t_hid *x, t_floatarg f)
+ {
+ /* values greater than 1 set the polling delay time */
+ /* 1 and 0 for start/stop so you can use a [tgl] */
+ 	if (f > 1)
+ 	{
+ 		x->x_delay = (t_int)f;
+ 		hid_start(x,f);
+ 	}
+ 	else if (f == 1) 
+ 	{
+ 		if (! x->x_started)
+ 		hid_start(x,f);
+ 	}
+ 	else if (f == 0) 		
+ 	{
+ 		hid_stop(x);
+ 	}
+ }
+ 
  /*------------------------------------------------------------------------------
   * IMPLEMENTATION                    
***************
*** 74,77 ****
--- 122,126 ----
  	{
  		post("[hid] closed device number %d",x->x_device_number);
+ 		x->x_device_open = 0;
  		return (0);
  	}
***************
*** 81,115 ****
  
  
  t_int hid_open(t_hid *x, t_float f) 
  {
  	DEBUG(post("hid_open"););
  
! /* store running state so that it can be restored after the device has been opened */
! 	t_int started = x->x_started;
! 	
! 	hid_close(x);
  
!   /* set obj device name to parameter 
!    * otherwise set to default
!    */  
!   if (f > 0)
! 	  x->x_device_number = f;
!   else
! 	  x->x_device_number = 0;
  
!   if (hid_open_device(x,x->x_device_number)) 
!   {
! 	  error("[hid] can not open device %d",x->x_device_number);
! 	  post("\\=========================== [hid] ===========================/\n");
! 	  return (1);
!   }
  
  /* restore the polling state so that when I [tgl] is used to start/stop [hid],
!  * the [tgl]'s state will continue to accurately reflect [hid]'s state 
!  */
!   hid_float(x,started);
  
!   post("\\=========================== [hid] ===========================/\n");
!   return (0);
  }
  
--- 130,172 ----
  
  
+ /* closed same device          open */
+ /* open same device            no action */
+ /* closed different device     open */
+ /* open different device       close open */
+ 
  t_int hid_open(t_hid *x, t_float f) 
  {
  	DEBUG(post("hid_open"););
  
! /* store running state to be restored after the device has been opened */
! 		t_int started = x->x_started;
  
! 		if ( (f != x->x_device_number) && (x->x_device_open) ) hid_close(x);
  
! 		/* set obj device name to parameter otherwise set to default   */  
! 		if (f > 0)
! 			x->x_device_number = f;
! 		else
! 			x->x_device_number = 0;
! 		
! 		if (! x->x_device_open) 
! 			if (hid_open_device(x,x->x_device_number))
! 			{
! 				error("[hid] can not open device %d",x->x_device_number);
! 				post("\\=========================== [hid] ===========================/\n");
! 				return (1);
! 			}
! 			else
! 			{
! 				x->x_device_open = 1;
! 			}
  
  /* restore the polling state so that when I [tgl] is used to start/stop [hid],
!  * the [tgl]'s state will continue to accurately reflect [hid]'s state  */
! 		hid_set_from_float(x,started);
  
! 		
! 	post("\\=========================== [hid] ===========================/\n");
! 	return (0);
  }
  
***************
*** 117,121 ****
  t_int hid_read(t_hid *x,int fd) 
  {
! 	hid_output_events(x);
  	
  	if (x->x_started) 
--- 174,180 ----
  t_int hid_read(t_hid *x,int fd) 
  {
! //	DEBUG(post("hid_read"););
! 
! 	hid_get_events(x);
  	
  	if (x->x_started) 
***************
*** 148,167 ****
  	DEBUG(post("hid_float"););
  
! /* values greater than 1 set the polling delay time */
! /* 1 and 0 for start/stop so you can use a [tgl] */
! 	if(f > 1)
! 	{
! 		x->x_delay = (t_int)f;
! 		hid_start(x,f);
! 	}
! 	else if(f == 1) 
! 	{
! 		if (! x->x_started)
! 		hid_start(x,f);
! 	}
! 	else if(f == 0) 		
! 	{
! 		hid_stop(x);
! 	}
  }
  
--- 207,211 ----
  	DEBUG(post("hid_float"););
  
! 	hid_set_from_float(x,f);
  }
  
***************
*** 195,198 ****
--- 239,243 ----
  
    /* init vars */
+   x->x_device_open = 0;
    x->x_started = 0;
    x->x_delay = DEFAULT_DELAY;
***************
*** 204,208 ****
  
    /* find and report the list of devices */
!   hid_devicelist_refresh(x);
    
    /* Open the device and save settings.  If there is an error, return the object
--- 249,253 ----
  
    /* find and report the list of devices */
!   hid_build_device_list(x);
    
    /* Open the device and save settings.  If there is an error, return the object
***************
*** 230,234 ****
  	
  	/* add inlet message methods */
! 	class_addmethod(hid_class,(t_method) hid_devicelist_refresh,gensym("refresh"),0);
  	class_addmethod(hid_class,(t_method) hid_open,gensym("open"),A_DEFFLOAT,0);
  	class_addmethod(hid_class,(t_method) hid_close,gensym("close"),0);
--- 275,279 ----
  	
  	/* add inlet message methods */
! 	class_addmethod(hid_class,(t_method) hid_build_device_list,gensym("refresh"),0);
  	class_addmethod(hid_class,(t_method) hid_open,gensym("open"),A_DEFFLOAT,0);
  	class_addmethod(hid_class,(t_method) hid_close,gensym("close"),0);

Index: TODO
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/TODO,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** TODO	6 Nov 2004 21:15:04 -0000	1.2
--- TODO	7 Nov 2004 16:28:25 -0000	1.3
***************
*** 1,13 ****
  ==============================================================================
! = define generic event struct (probably Pd-ized input_event )
!   something like:
!   
! struct input_event {
! 	struct timeval time;
! 	t_int type;
! 	t_int code;
! 	t_int value;
! };
! 
  
  The question is whether the timeval is needed at all.  Linux and Darwin
--- 1,4 ----
  ==============================================================================
! = define generic event timestamp struct (probably Pd-ized input_event )
  
  The question is whether the timeval is needed at all.  Linux and Darwin
***************
*** 23,30 ****
  
  
- Misc Input/Generic Desktop X  == ev_rel/rel_x
- Button Input/Button #1 == ev_key/btn_left
- 
- 
  LED UsagePage => ev_led
  LED Usages == Linux ev_led codes
--- 14,17 ----
***************
*** 62,77 ****
  
  ==============================================================================
- = raw values vs. calibrated
- 
- - relative axes should probably be raw data, since its pixel data, but then
-   this causes problems with sensitivity across different mice.  The mouse
-   sensitivity would probably best translate as resolution, ie calibrated data,
-   rather than sensitivity, ie raw data.
- 
- - absolute axes should be calibrated, so that the same positions on different
-   devices map to the same value
- 
- 
- ==============================================================================
  = pollfn for mouse-like devices
  
--- 49,52 ----
***************
*** 84,88 ****
  
  
- 
  ==============================================================================
  = function return values
--- 59,62 ----

Index: mouse-help.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/mouse-help.pd,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** mouse-help.pd	6 Nov 2004 21:15:04 -0000	1.2
--- mouse-help.pd	7 Nov 2004 16:28:25 -0000	1.3
***************
*** 1,3 ****
! #N canvas 138 201 676 441 10;
  #X symbolatom 233 198 0 0 0 0 - - -;
  #X obj 200 36 tgl 25 0 empty empty empty 0 -6 0 8 -225271 -1 -1 0 1
--- 1,3 ----
! #N canvas 225 161 684 449 10;
  #X symbolatom 233 198 0 0 0 0 - - -;
  #X obj 200 36 tgl 25 0 empty empty empty 0 -6 0 8 -225271 -1 -1 0 1
***************
*** 31,34 ****
--- 31,62 ----
  #X msg 255 61 open 2;
  #X obj 200 91 mouse 1;
+ #N canvas 462 248 604 514 mouse-noise 0;
+ #X obj 90 55 inlet;
+ #X obj 113 173 mouse \$1;
+ #X obj 180 294 noise~;
+ #X obj 125 293 osc~;
+ #X obj 125 266 * 4000;
+ #X obj 113 367 *~;
+ #X msg 162 103 \; pd dsp 1;
+ #X obj 103 418 dac~;
+ #X obj 91 78 t f a b;
+ #X connect 0 0 8 0;
+ #X connect 1 0 5 0;
+ #X connect 1 1 4 0;
+ #X connect 2 0 5 1;
+ #X connect 3 0 5 1;
+ #X connect 4 0 3 0;
+ #X connect 5 0 7 0;
+ #X connect 5 0 7 1;
+ #X connect 8 0 5 0;
+ #X connect 8 1 1 0;
+ #X connect 8 2 6 0;
+ #X restore 464 163 pd mouse-noise 1;
+ #X msg 505 95 open 0;
+ #X msg 510 114 open 1;
+ #X msg 515 133 open 2;
+ #X obj 464 96 tgl 25 0 empty empty empty 0 -6 0 8 -225271 -1 -1 0 1
+ ;
+ #X text 347 72 turn this on to make some noise with the mouse;
  #X connect 1 0 20 0;
  #X connect 9 0 6 0;
***************
*** 49,50 ****
--- 77,82 ----
  #X connect 20 3 0 0;
  #X connect 20 4 2 0;
+ #X connect 22 0 21 0;
+ #X connect 23 0 21 0;
+ #X connect 24 0 21 0;
+ #X connect 25 0 21 0;

Index: hid.h
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** hid.h	6 Nov 2004 21:21:06 -0000	1.8
--- hid.h	7 Nov 2004 16:28:25 -0000	1.9
***************
*** 28,36 ****
  		t_symbol            *x_devname;
  		t_int               x_device_number;
- 		long                x_locID;
  		t_clock             *x_clock;
  		t_int               x_delay;
  		t_int               x_started;
  		t_int               x_device_open;
  } t_hid;
  
--- 28,36 ----
  		t_symbol            *x_devname;
  		t_int               x_device_number;
  		t_clock             *x_clock;
  		t_int               x_delay;
  		t_int               x_started;
  		t_int               x_device_open;
+ 		t_int               x_instance_count;
  } t_hid;
  
***************
*** 49,57 ****
   */
  
  /* generic, cross-platform functions */
  t_int hid_open_device(t_hid *x, t_int device_number);
  t_int hid_close_device(t_hid *x);
! t_int hid_devicelist_refresh(t_hid* x);
! t_int hid_output_events(t_hid *x) ;
  void hid_platform_specific_free(t_hid *x);
  
--- 49,61 ----
   */
  
+ /* support functions */
+ void hid_output_event(t_hid *x,
+ 							  char *type, char *code, t_float value, t_float timestamp);
+ 
  /* generic, cross-platform functions */
  t_int hid_open_device(t_hid *x, t_int device_number);
  t_int hid_close_device(t_hid *x);
! t_int hid_build_device_list(t_hid* x);
! t_int hid_get_events(t_hid *x) ;
  void hid_platform_specific_free(t_hid *x);
  

Index: hid_darwin.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_darwin.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** hid_darwin.c	6 Nov 2004 21:15:04 -0000	1.6
--- hid_darwin.c	7 Nov 2004 16:28:25 -0000	1.7
***************
*** 44,55 ****
  
  #include "HID_Utilities_External.h"
- #include "HID_Error_Handler.h"
  
- /*
- #include <IOKit/IOKitLib.h>
- #include <IOKit/IOCFPlugIn.h>
- #include <IOKit/hid/IOHIDLib.h>
- #include <IOKit/hid/IOHIDKeys.h>
- */
  #include <IOKit/hid/IOHIDUsageTables.h>
  
--- 44,48 ----
***************
*** 59,64 ****
  #include "hid.h"
  
! #define DEBUG(x)
! //#define DEBUG(x) x 
  
  /*==============================================================================
--- 52,57 ----
  #include "hid.h"
  
! //#define DEBUG(x)
! #define DEBUG(x) x 
  
  /*==============================================================================
***************
*** 66,69 ****
--- 59,63 ----
   *======================================================================== */
  
+ 
  /*==============================================================================
   * FUNCTION PROTOTYPES
***************
*** 74,82 ****
  char *convertEventsFromDarwinToLinux(pRecElement element);
  
- /* IOKit HID Utilities functions from SC_HID.cpp */
- int prHIDBuildElementList(t_hid *x);
- int prHIDBuildDeviceList(void);
- int prHIDGetValue(void);
- 
  /*==============================================================================
   * EVENT TYPE/CODE CONVERSION FUNCTIONS
--- 68,71 ----
***************
*** 84,118 ****
   */
  
- void convertDarwinToLinuxType(IOHIDElementType type, char *returnType)
- {
- 	switch (type)
- 	{
- 		case kIOHIDElementTypeInput_Misc:
- 			sprintf(returnType, "ev_msc");
- 			break;
- 		case kIOHIDElementTypeInput_Button:
- 			sprintf(returnType, "ev_key");
- 			break;
- 		case kIOHIDElementTypeInput_Axis:
- 			sprintf(returnType, "ev_abs");
- 			break;
- 		case kIOHIDElementTypeInput_ScanCodes:
- 			sprintf(returnType, "undefined");
- 			break;
- 		case kIOHIDElementTypeOutput:
- 			sprintf(returnType, "undefined");
- 			break;
- 		case kIOHIDElementTypeFeature:
- 			sprintf(returnType, "undefined");
- 			break;
- 		case kIOHIDElementTypeCollection:
- 			sprintf(returnType, "undefined");
- 			break;
- 		default:
- 			HIDReportErrorNum("Unknown element type : ", type);
- 			sprintf(returnType, "unknown");
- 	}
- }
- 
  void convertAxis(pRecElement element, char *linux_type, char *linux_code, char axis) 
  {
--- 73,76 ----
***************
*** 129,132 ****
--- 87,91 ----
  }
  
+ 
  void convertDarwinElementToLinuxTypeCode(pRecElement element, char *linux_type, char *linux_code) 
  {
***************
*** 151,154 ****
--- 110,115 ----
  				case kHIDUsage_GD_Ry: convertAxis(element, linux_type, linux_code, 'y'); break;
  				case kHIDUsage_GD_Rz: convertAxis(element, linux_type, linux_code, 'z'); break;
+ 				case kHIDUsage_GD_Wheel: 
+ 					sprintf(linux_type,"ev_rel");sprintf(linux_code,"rel_wheel");break;
  			}
  			break;
***************
*** 165,205 ****
  /* ============================================================================== */
  
- t_int hid_build_element_list(t_hid *x)
- {
- 	DEBUG(post("hid_build_element_list"););
- 
- 	UInt32 i;
- 	pRecElement	devElement;
- 	pRecDevice pCurrentHIDDevice;
- 	UInt32 numElements;
- 	char cstrElementName[256];
- 
- 	// look for the right device using locID 
- 	pCurrentHIDDevice = HIDGetFirstDevice ();
- 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID != x->x_locID))
- 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
- 	if(!pCurrentHIDDevice) return (1);
- 	
- 	devElement = HIDGetFirstDeviceElement(pCurrentHIDDevice, kHIDElementTypeInput);
- 	numElements = HIDCountDeviceElements(pCurrentHIDDevice, kHIDElementTypeInput);
- 	
- 	post("[hid] found %d elements:",numElements);
- 	
- 	for(i=0; i<numElements; i++)
- 	{
- 		//type
- 		HIDGetTypeName((IOHIDElementType) devElement->type, cstrElementName);
- 		post("  Type: %s  %d  0x%x",cstrElementName,devElement->type,devElement->type);
- 		convertDarwinToLinuxType((IOHIDElementType) devElement->type, cstrElementName);
- 		post("  Type: %s  %d  0x%x",cstrElementName,devElement->type,devElement->type);
- 		//usage
- 		HIDGetUsageName (devElement->usagePage, devElement->usage, cstrElementName);
- 		post("    Usage/Code: %s  %d  0x%x",cstrElementName,devElement->usage,devElement->usage);
- 		
- 		devElement = HIDGetNextDeviceElement (devElement, kHIDElementTypeInput);
- 	}
- 	return (0);	
- }
- 
  pRecDevice hid_get_device_by_number(t_int device_number)
  {
--- 126,129 ----
***************
*** 228,238 ****
  }
  
  /* ============================================================================== */
  /* Pd [hid] FUNCTIONS */
  /* ============================================================================== */
  
! t_int hid_output_events(t_hid *x)
  {
! 	DEBUG(post("hid_output_events"););
  
  	SInt32 value;
--- 152,195 ----
  }
  
+ t_int hid_build_element_list(t_hid *x)
+ {
+ 	DEBUG(post("hid_build_element_list"););
+ 
+ 	UInt32 i;
+ 	pRecElement	pCurrentHIDElement;
+ 	pRecDevice pCurrentHIDDevice;
+ 	UInt32 numElements;
+ 	char type[256];
+ 	char code[256];
+ 	char type_name[256];
+ 	char usage_name[256];
+ 
+ 	pCurrentHIDDevice = hid_get_device_by_number(x->x_device_number);
+ 	if(!pCurrentHIDDevice) return (1);
+ 	
+ 	pCurrentHIDElement = HIDGetFirstDeviceElement(pCurrentHIDDevice, kHIDElementTypeInput);
+ 	numElements = HIDCountDeviceElements(pCurrentHIDDevice, kHIDElementTypeInput);
+ 	
+ 	DEBUG(post("[hid] found %d elements:",numElements););
+ 	
+ 	for(i=0; i<numElements; i++)
+ 	{
+ 		convertDarwinElementToLinuxTypeCode(pCurrentHIDElement,type,code);
+ 		HIDGetTypeName((IOHIDElementType) pCurrentHIDElement->type, type_name);
+ 		HIDGetUsageName(pCurrentHIDElement->usagePage, pCurrentHIDElement->usage, usage_name);
+ 		post("\tType: %s \t code: %s \t event name: \t %s, %s",type,code,type_name,usage_name);
+ 
+ 		pCurrentHIDElement = HIDGetNextDeviceElement (pCurrentHIDElement, kHIDElementTypeInput);
+ 	}
+ 	return (0);	
+ }
+ 
  /* ============================================================================== */
  /* Pd [hid] FUNCTIONS */
  /* ============================================================================== */
  
! t_int hid_get_events(t_hid *x)
  {
! 	//DEBUG(post("hid_get_events"););
  
  	SInt32 value;
***************
*** 248,259 ****
  	Boolean result;
  
! 	// look for the right device: 
! 	pCurrentHIDDevice = HIDGetFirstDevice ();
! 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID !=x->x_locID))
! 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
! 	if(!pCurrentHIDDevice) return (1);
  
- //	result = HIDGetEvent(pCurrentHIDDevice, (void*) &event);
- //	if(result) 
  	while( (HIDGetEvent(pCurrentHIDDevice, (void*) &event)) && (event_counter < 64) ) 
  	{
--- 205,216 ----
  	Boolean result;
  
! 	pCurrentHIDDevice = hid_get_device_by_number(x->x_device_number);
! 
! 	if(!pCurrentHIDDevice) 
! 	{
! 		post("[hid] can't find current device %d.  Was it unplugged?",x->x_device_number);
! 		return (1);
! 	}
  
  	while( (HIDGetEvent(pCurrentHIDDevice, (void*) &event)) && (event_counter < 64) ) 
  	{
***************
*** 268,274 ****
  
  		DEBUG(
- //		convertDarwinToLinuxType((IOHIDElementType) pCurrentHIDElement->type, event_output_string);
- 		HIDGetUsageName(pCurrentHIDElement->usagePage, pCurrentHIDElement->usage, event_output_string);
- 
  		HIDGetElementNameFromVendorProductCookie(
  			pCurrentHIDDevice->vendorID, pCurrentHIDDevice->productID,
--- 225,228 ----
***************
*** 278,291 ****
  		convertDarwinElementToLinuxTypeCode(pCurrentHIDElement,type,code);
  		DEBUG(post("type: %s    code: %s   event name: %s",type,code,event_output_string););
- 		SETSYMBOL(event_data, gensym(type));
- 		/* code */
- 		SETSYMBOL(event_data + 1, gensym(code));
- 		/* value */
- 		SETFLOAT(event_data + 2, (t_float)value);
- 		/* time */
- 		// TODO: convert this to a common time format, i.e. Linux struct timeval
- 		SETFLOAT(event_data + 3, (t_float)(event.timestamp).lo); 
  
! 		outlet_anything(x->x_obj.te_outlet,atom_gensym(event_data),3,event_data+1);
  		
  		++event_counter;
--- 232,238 ----
  		convertDarwinElementToLinuxTypeCode(pCurrentHIDElement,type,code);
  		DEBUG(post("type: %s    code: %s   event name: %s",type,code,event_output_string););
  
! 	// TODO: convert this to a common time format, i.e. Linux struct timeval
! 		hid_output_event(x,type,code,(t_float)value,(t_float)(event.timestamp).lo);
  		
  		++event_counter;
***************
*** 345,350 ****
  	currentDevice = hid_get_device_by_number(device_number);
  
- 	x->x_locID = currentDevice->locID;
- 
  	post("[hid] opened device %d: %s %s",
  		  device_number, currentDevice->manufacturer, currentDevice->product);
--- 292,295 ----
***************
*** 353,357 ****
  
  	HIDQueueDevice(currentDevice);
! // TODO: queue all elements except absolute axes
  
  	return (0);
--- 298,302 ----
  
  	HIDQueueDevice(currentDevice);
! // TODO: queue all elements except absolute axes, those can just be polled
  
  	return (0);
***************
*** 367,452 ****
  }
  
- t_int hid_devicelist_refresh(t_hid *x)
- {
- 	DEBUG(post("hid_devicelist_refresh"););
- 
- 	/* the device list should be refreshed here */
- 	if ( (prHIDBuildDeviceList()) && (prHIDBuildElementList(x)) )
- 		return (0);
- 	else
- 		return (1);
- }
- 
- void hid_platform_specific_free(t_hid *x)
- {
- 	HIDReleaseAllDeviceQueues();
- 	HIDReleaseDeviceList();
- }
  
! /*==============================================================================
!  *  HID UTILIES FUNCTIONS FROM SC_HID.cpp
!  *==============================================================================
!  */
! 
! int prHIDBuildElementList(t_hid *x)
! {
! 	DEBUG(post("prHIDBuildElementList"););
! 
! 	int locID = NULL;
! 	UInt32 i;
! 	pRecElement	devElement;
! 	pRecDevice pCurrentHIDDevice;
! 	UInt32 numElements;
! 	char cstrElementName [256];
! 
! // Apple Trackpad locID for testing
! 	locID = 50397184;
! 
! 	// look for the right device using locID 
! 	pCurrentHIDDevice = HIDGetFirstDevice ();
! 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID != x->x_locID))
! 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
! 	if(!pCurrentHIDDevice) return (1);
! 	
! 	devElement = HIDGetFirstDeviceElement(pCurrentHIDDevice, kHIDElementTypeInput);
! 	numElements = HIDCountDeviceElements(pCurrentHIDDevice, kHIDElementTypeInput);
! 	
! 	post("[hid] found %d elements",numElements);
! 	
! 	for(i=0; i<numElements; i++)
! 	{
! 		//type
! 		HIDGetTypeName((IOHIDElementType) devElement->type, cstrElementName);
! 		post("Type: %s  %d  0x%x",cstrElementName,devElement->type,devElement->type);
! 		//usage
! 		HIDGetUsageName (devElement->usagePage, devElement->usage, cstrElementName);
! 		post("Usage: %s  %d  0x%x",cstrElementName,devElement->usage,devElement->usage);
! 		
! 			//devstring = newPyrString(g->gc, cstrElementName, 0, true);
! 			//SetObject(devElementArray->slots+devElementArray->size++, devstring);
! 			//g->gc->GCWrite(devElementArray, (PyrObject*) devstring);
! 		
! 		devElement = HIDGetNextDeviceElement (devElement, kHIDElementTypeInput);
! 	}
! 	return (0);	
! }
! 
! int prHIDBuildDeviceList(void)
  {
! 	DEBUG(post("prHIDBuildDeviceList"););
  
  	int i,err;
  	UInt32 usagePage, usage;
- 	pRecElement devElement;
  	pRecDevice pCurrentHIDDevice;
  
- 	//pass in usage & usagepage
- 	//kHIDUsage_GD_Joystick kHIDUsage_GD_GamePad
- 	//usagePage = kHIDPage_GenericDesktop;
- 	//usage = NULL;
- 
  	Boolean result = HIDBuildDeviceList (NULL, NULL); 
  	// returns false if no device found
- 
  	if(result) error("[hid]: no HID devices found\n");
  	
--- 312,326 ----
  }
  
  
! t_int hid_build_device_list(t_hid *x)
  {
! 	DEBUG(post("hid_build_device_list"););
  
  	int i,err;
  	UInt32 usagePage, usage;
  	pRecDevice pCurrentHIDDevice;
  
  	Boolean result = HIDBuildDeviceList (NULL, NULL); 
  	// returns false if no device found
  	if(result) error("[hid]: no HID devices found\n");
  	
***************
*** 455,524 ****
  	if(!numdevs) return (0);
  
- 	post("number of devices: %d", numdevs);
  	char cstrDeviceName [256];
  	
! 	pCurrentHIDDevice = HIDGetFirstDevice();
! 	for(i=numdevs - 1; i >= 0; --i)
  	{
! 		post("Device %d: '%s' '%s' version %d",i,
! 			  pCurrentHIDDevice->manufacturer,pCurrentHIDDevice->product,pCurrentHIDDevice->version);
  		//usage
! 		HIDGetUsageName (pCurrentHIDDevice->usagePage, pCurrentHIDDevice->usage, cstrDeviceName);
  		post("       vendorID: %d   productID: %d   locID: %d",
! 			  pCurrentHIDDevice->vendorID,pCurrentHIDDevice->productID,pCurrentHIDDevice->locID);
! 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
! 	}
! 
! 	UInt32 outnum = HIDCountDeviceElements (pCurrentHIDDevice, kHIDElementTypeOutput);
! 	post("number of outputs: %d \n", outnum);
  
! 	return (0);	
  }
  
! 
! int prHIDGetValue(void)
  {
! 	DEBUG(post("hid_output_events"););
! 
! 	int locID = NULL; 
! 	int cookieNum = NULL;
! 	SInt32 value;
! 	/*
! 	PyrSlot *a = g->sp - 2; //class
! 	PyrSlot *b = g->sp - 1; //locID device
! 	PyrSlot *c = g->sp; //element cookie
! 	int locID, cookieNum;
! 	int err = slotIntVal(b, &locID);
! 	if (err) return err;
! 	err = slotIntVal(c, &cookieNum);
! 	if (err) return err;
! 	*/
! 	IOHIDElementCookie cookie = (IOHIDElementCookie) cookieNum;
! 	// look for the right device: 
! 	pRecDevice  pCurrentHIDDevice = HIDGetFirstDevice ();
! 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID !=locID))
! 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
! 	if(!pCurrentHIDDevice) return (1);
! 
! 
! 	// look for the right element:
! 	pRecElement pCurrentHIDElement =  HIDGetFirstDeviceElement (pCurrentHIDDevice, kHIDElementTypeIO);
! 	// use gElementCookie to find current element
! 	while (pCurrentHIDElement && (pCurrentHIDElement->cookie != cookie))
! 		pCurrentHIDElement = HIDGetNextDeviceElement (pCurrentHIDElement, kHIDElementTypeIO);
! 
! 	
! 	if (pCurrentHIDElement)
! 	{
! 		value = HIDGetElementValue (pCurrentHIDDevice, pCurrentHIDElement);
! 		// if it's not a button and it's not a hatswitch then calibrate
! 		if(( pCurrentHIDElement->type != kIOHIDElementTypeInput_Button ) &&
! 			( pCurrentHIDElement->usagePage == 0x01 && pCurrentHIDElement->usage != kHIDUsage_GD_Hatswitch)) 
! 			value = HIDCalibrateValue ( value, pCurrentHIDElement );
! 		//SetInt(a, value);
! 	}
! 	//else SetNil(a);
! 	return (0);	
! 	
  }
  
--- 329,359 ----
  	if(!numdevs) return (0);
  
  	char cstrDeviceName [256];
  	
!    /* display device list in console */
! 	for(i=0; i < numdevs; i++)
  	{
! 		pCurrentHIDDevice = hid_get_device_by_number(i);
! 		post("Device %d: '%s' '%s' version %d",i,pCurrentHIDDevice->manufacturer,
! 			  pCurrentHIDDevice->product,pCurrentHIDDevice->version);
  		//usage
! 		HIDGetUsageName (pCurrentHIDDevice->usagePage, 
! 							  pCurrentHIDDevice->usage, 
! 							  cstrDeviceName);
  		post("       vendorID: %d   productID: %d   locID: %d",
! 			  pCurrentHIDDevice->vendorID,
! 			  pCurrentHIDDevice->productID,
! 			  pCurrentHIDDevice->locID);
  
! 		// TODO: display all of the element types/codes for each device
! 	}
! 	
! 	return (0);
  }
  
! void hid_platform_specific_free(t_hid *x)
  {
! 	HIDReleaseAllDeviceQueues();
! 	HIDReleaseDeviceList();
  }
  





More information about the Pd-cvs mailing list