Update of /cvsroot/pure-data/externals/hcs/hid In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29303
Modified Files: TODO hid.c hid.h hid_darwin.c Log Message: added a bunch more status info in the Pd domain: device count, range for each element, etc
Index: TODO =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/TODO,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** TODO 2 Jun 2006 20:06:50 -0000 1.25 --- TODO 2 Jun 2006 21:32:53 -0000 1.26 *************** *** 1,2 **** --- 1,9 ---- + ______________________________________________________________________________ + - deal with hatswitches!! + + Because of the currnently implementation of the conversion of the MacOS X + style event to the Linux style event, an event with a value of zero is output + on the unchanged axis when the hatswitch is moved in along the X or Y axis (as + opposed to diagonally). but this might be fixed...
- fix up hatswitch logic... hmmm *************** *** 5,15 **** then output again (yes, its a hack).
! - add device type to [info( ! HIDGetUsageName(pCurrentHIDDevice->usagePage, pCurrentHIDDevice->usage, cstrDeviceName); ! ! i.e. cstrDeviceName
______________________________________________________________________________ --- 12,23 ---- then output again (yes, its a hack).
! - what do standard hatswitches output on the various platforms? they should ! probably always output like axes, but then the CUI will be screwed
+ ______________________________________________________________________________ + = fix key names on Mac OS X
+ I think they are unimplemented... :-(
______________________________________________________________________________ *************** *** 58,71 **** http://lists.apple.com/archives/mac-games-dev/2005/Oct/msg00060.html
- - for absolute axes, just output latest value. if they are not in the queue, - I can check them manually - - - buttons, output everything - - - is this at all necessary? How often do multiple events happen in one poll - period? ANSWER: on Mac OS X, most hid_get_events() calls fetch multiple - events for each mouse axis, so yes, its probably necessary - - ______________________________________________________________________________ = [poll 1( message set to exact delay based on block size --- 66,69 ---- *************** *** 83,88 ****
______________________________________________________________________________ ! = make second inlet for poll # (for [human->pd])
______________________________________________________________________________ --- 81,91 ----
______________________________________________________________________________ ! = make second inlet for specific status requests [human->pd])
+ - [vendor(, [product( + - [range( + - [poll( + - [name( + - [type(
______________________________________________________________________________ *************** *** 193,206 ****
______________________________________________________________________________ - = function return values - - - most functions probably do not need return values - - - ______________________________________________________________________________ = check out using USB timestamp
! - use the USB timestamp to correctly space the output data (meh, probably ! unnecessary)
--- 196,204 ----
______________________________________________________________________________ = check out using USB timestamp
! - use the USB timestamp to correctly space the output data ! ! (meh, probably not useful)
*************** *** 217,221 ****
______________________________________________________________________________ ! - BUG: on Mac OS X, polling starts without hid_build_device_list()
- when polling starts, hid_build_device_list() should be called before starting --- 215,219 ----
______________________________________________________________________________ ! - BUG: on Mac OS X, polling starts without hid_build_device_list() or hid_open()
- when polling starts, hid_build_device_list() should be called before starting *************** *** 251,262 ****
- ______________________________________________________________________________ - - BUG: hatswitches on MacOS X output an event without a change in value - - Because of the currnently implementation of the conversion of the MacOS X - style event to the Linux style event, an event with a value of zero is output - on the unchanged axis when the hatswitch is moved in along the X or Y axis (as - opposed to diagonally). -
______________________________________________________________________________ --- 249,252 ----
Index: hid_darwin.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_darwin.c,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** hid_darwin.c 2 Jun 2006 20:06:50 -0000 1.24 --- hid_darwin.c 2 Jun 2006 21:32:53 -0000 1.25 *************** *** 61,65 **** *======================================================================== */
! extern t_int hid_instance_count;
/* store device pointers so I don't have to query them all the time */ --- 61,65 ---- *======================================================================== */
! extern t_int hid_instance_count; // in hid.h
/* store device pointers so I don't have to query them all the time */ *************** *** 433,453 **** //case kHIDUsage_GD_Hatswitch: // hatswitches are more like buttons, so queue them debug_print(LOG_INFO,"[hid] storing absolute axis to poll %s, %s (0x%04x 0x%04x)", ! type_name, usage_name, pCurrentHIDElement->usagePage, pCurrentHIDElement->usage); if(HIDDequeueElement(pCurrentHIDDevice,pCurrentHIDElement) != kIOReturnSuccess) debug_print(LOG_ERR,"[hid] could not dequeue element"); new_element->polled = 1; break; - default: - debug_print(LOG_CRIT,"[hid] SKIPPED %s, %s (0x%04x 0x%04x)x", type_name, usage_name, - pCurrentHIDElement->usagePage, pCurrentHIDElement->usage); } } else { ! debug_print(LOG_INFO,"[hid] queuing element %s, %s (0x%04x 0x%04x)",type_name, usage_name, pCurrentHIDElement->usagePage, pCurrentHIDElement->usage); } ! post("\tlogical min %d max %d",pCurrentHIDElement->minReport,pCurrentHIDElement->maxReport); ! element[x->x_device_number][element_count[x->x_device_number]] = new_element; ++element_count[x->x_device_number]; --- 433,454 ---- //case kHIDUsage_GD_Hatswitch: // hatswitches are more like buttons, so queue them debug_print(LOG_INFO,"[hid] storing absolute axis to poll %s, %s (0x%04x 0x%04x)", ! type_name, usage_name, ! pCurrentHIDElement->usagePage, pCurrentHIDElement->usage); if(HIDDequeueElement(pCurrentHIDDevice,pCurrentHIDElement) != kIOReturnSuccess) debug_print(LOG_ERR,"[hid] could not dequeue element"); new_element->polled = 1; break; } } else { ! debug_print(LOG_INFO,"[hid] queuing element %s, %s (0x%04x 0x%04x)", ! type_name, usage_name, pCurrentHIDElement->usagePage, pCurrentHIDElement->usage); } ! new_element->min = pCurrentHIDElement->min; ! new_element->max = pCurrentHIDElement->max; ! debug_print(LOG_DEBUG,"\tlogical min %d max %d", ! pCurrentHIDElement->min,pCurrentHIDElement->max); element[x->x_device_number][element_count[x->x_device_number]] = new_element; ++element_count[x->x_device_number]; *************** *** 520,523 **** --- 521,525 ---- char device_type_buffer[256]; t_int i, numdevs; + unsigned int j; pRecDevice pCurrentHIDDevice = NULL;
*************** *** 537,540 **** --- 539,544 ---- HIDGetUsageName(pCurrentHIDDevice->usagePage, pCurrentHIDDevice->usage, device_type_buffer); + for(j=0; j< strlen(device_type_buffer); ++j) + device_type_buffer[j] = tolower(device_type_buffer[j]); post("\tdevice type: %s\tusage page: 0x%04x\tusage: 0x%04x", device_type_buffer, pCurrentHIDDevice->usagePage, *************** *** 552,558 **** --- 556,564 ---- void hid_platform_specific_info(t_hid *x) { + unsigned int i; pRecDevice pCurrentHIDDevice = NULL; char vendor_id_string[7]; char product_id_string[7]; + char device_type_buffer[256]; t_symbol *output_symbol; t_atom *output_atom = getbytes(sizeof(t_atom)); *************** *** 572,576 **** outlet_anything( x->x_status_outlet, gensym("manufacturer"), 1, output_atom); ! /* serial */ if(pCurrentHIDDevice->serial != NULL) { --- 578,582 ---- outlet_anything( x->x_status_outlet, gensym("manufacturer"), 1, output_atom); ! /* serial number */ if(pCurrentHIDDevice->serial != NULL) { *************** *** 599,602 **** --- 605,617 ---- outlet_anything( x->x_status_outlet, gensym("productID"), 1, output_atom); + /* type */ + HIDGetUsageName(pCurrentHIDDevice->usagePage, + pCurrentHIDDevice->usage, + device_type_buffer); + for(i=0; i< strlen(device_type_buffer); ++i) + device_type_buffer[i] = tolower(device_type_buffer[i]); + SETSYMBOL(output_atom, gensym(device_type_buffer)); + outlet_anything( x->x_status_outlet, gensym("type"), + 1, output_atom); } } *************** *** 743,747 **** pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice); } ! debug_print(LOG_WARNING,"[hid] completed device list."); } --- 758,762 ---- pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice); } ! device_count = (unsigned int) HIDCountDevices(); // set the global variable debug_print(LOG_WARNING,"[hid] completed device list."); }
Index: hid.h =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.h,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** hid.h 2 Jun 2006 20:06:50 -0000 1.24 --- hid.h 2 Jun 2006 21:32:53 -0000 1.25 *************** *** 41,53 **** t_object x_obj; t_int x_fd; short x_device_number; - // unsigned short vendor_id; // USB idVendor for current device - // unsigned short product_id; // USB idProduct for current device t_int x_has_ff; - void *x_ff_device; - t_clock *x_clock; - t_int x_delay; t_int x_started; t_int x_device_open; t_outlet *x_data_outlet; t_outlet *x_status_outlet; --- 41,51 ---- t_object x_obj; t_int x_fd; + void *x_ff_device; short x_device_number; t_int x_has_ff; t_int x_started; t_int x_device_open; + t_int x_delay; + t_clock *x_clock; t_outlet *x_data_outlet; t_outlet *x_status_outlet; *************** *** 56,66 ****
- /*------------------------------------------------------------------------------ * GLOBAL VARIABLES */
! /* ! * count the number of instances of this object so that certain free() * functions can be called only after the final instance is detroyed. */ --- 54,62 ----
/*------------------------------------------------------------------------------ * GLOBAL VARIABLES */
! /* count the number of instances of this object so that certain free() * functions can be called only after the final instance is detroyed. */ *************** *** 69,76 **** extern unsigned short global_debug_level;
! /* next I need to make a data structure to hold the data to be output for this ! * poll. This should probably be an array for efficiency */ ! ! typedef struct _hid_element { --- 65,69 ---- extern unsigned short global_debug_level;
! /* built up when the elements of an open device are enumerated */ typedef struct _hid_element { *************** *** 84,87 **** --- 77,82 ---- unsigned char polled; // is it polled or queued? (maybe only on Mac OS X?) unsigned char relative; // relative data gets output everytime + t_int min; // from device report + t_int max; // from device report t_float instance; // usage page/usage instance # ([absolute throttle 2 163( t_int value; // output the sum of events in a poll for relative axes *************** *** 89,92 **** --- 84,90 ---- } t_hid_element;
+ /* mostly for status querying */ + unsigned short device_count; + /* store element structs to eliminate symbol table lookups, etc. */ t_hid_element *element[MAX_DEVICES][MAX_ELEMENTS];
Index: hid.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.c,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** hid.c 2 Jun 2006 20:06:50 -0000 1.25 --- hid.c 2 Jun 2006 21:32:53 -0000 1.26 *************** *** 110,113 **** --- 110,137 ---- }
+ static void output_device_count(t_hid *x) + { + output_status(x, gensym("total"), device_count); + } + + static void output_element_ranges(t_hid *x) + { + if( (x->x_device_number > -1) && (x->x_device_open) ) + { + unsigned int i; + t_atom output_data[4]; + + for(i=0;i<element_count[x->x_device_number];++i) + { + SETSYMBOL(output_data, element[x->x_device_number][i]->type); + SETSYMBOL(output_data + 1, element[x->x_device_number][i]->name); + SETFLOAT(output_data + 2, element[x->x_device_number][i]->min); + SETFLOAT(output_data + 3, element[x->x_device_number][i]->max); + outlet_anything(x->x_status_outlet, gensym("range"), 4, output_data); + } + } + } + + static unsigned int name_to_usage(char *usage_name) { // output usagepage << 16 + usage *************** *** 138,142 **** first_argument = atom_getsymbolarg(0,argc,argv); if(first_argument == &s_) ! { // single float arg means device device_number = (short) atom_getfloatarg(0,argc,argv); if(device_number < 0) device_number = -1; --- 162,166 ---- first_argument = atom_getsymbolarg(0,argc,argv); if(first_argument == &s_) ! { // single float arg means device # device_number = (short) atom_getfloatarg(0,argc,argv); if(device_number < 0) device_number = -1; *************** *** 351,355 **** --- 375,381 ---- output_open_status(x); output_device_number(x); + output_device_count(x); output_poll_time(x); + output_element_ranges(x); hid_platform_specific_info(x); }