[PD-cvs] externals/hcs/hid hid-help.pd,1.5,1.6 hid.c,1.8,1.9 hid.h,1.5,1.6 hid_darwin.c,1.4,1.5

Hans-Christoph Steiner eighthave at users.sourceforge.net
Sat Nov 6 02:03:03 CET 2004


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

Modified Files:
	hid-help.pd hid.c hid.h hid_darwin.c 
Log Message:
mice and joysticks work under MacOS X now, but there is much work left to be done in terms of translating HID Manager to Linux Input events.

Index: hid_darwin.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_darwin.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** hid_darwin.c	4 Nov 2004 17:24:18 -0000	1.4
--- hid_darwin.c	6 Nov 2004 01:03:01 -0000	1.5
***************
*** 59,64 ****
  #include "hid.h"
  
! //#define DEBUG(x)
! #define DEBUG(x) x 
  
  /*==============================================================================
--- 59,64 ----
  #include "hid.h"
  
! #define DEBUG(x)
! //#define DEBUG(x) x 
  
  /*==============================================================================
***************
*** 82,87 ****
--- 82,100 ----
   *==============================================================================
   */
+ 
+ /* conversion functions */
  char *convertEventsFromDarwinToLinux(pRecElement element);
  
+ /* IOKit HID Utilities functions from SC_HID.cpp */
+ void releaseHIDDevices(void);
+ int prHIDBuildElementList(t_hid *x);
+ int prHIDBuildDeviceList(void);
+ int prHIDGetValue(void);
+ void PushQueueEvents_RawValue(void);
+ void PushQueueEvents_CalibratedValue(void);
+ int prHIDReleaseDeviceList(void);
+ //int prHIDRunEventLoop(void);
+ //int prHIDStopEventLoop(void);
+ 
  /*==============================================================================
   * EVENT TYPE/CODE CONVERSION FUNCTIONS
***************
*** 89,96 ****
   */
  
! char *convertDarwinToLinuxType(IOHIDElementType type)
  {
- 	char *returnType = "";
- 
  	switch (type)
  	{
--- 102,107 ----
   */
  
! void convertDarwinToLinuxType(IOHIDElementType type, char *returnType)
  {
  	switch (type)
  	{
***************
*** 120,129 ****
  			sprintf(returnType, "unknown");
  	}
  
! 	return(returnType);
  }
  
  
  /* ============================================================================== */
  /* Pd [hid] FUNCTIONS */
  /* ============================================================================== */
--- 131,224 ----
  			sprintf(returnType, "unknown");
  	}
+ }
  
! void convertAxis(pRecElement element, char *linux_type, char *linux_code, char axis) 
! {
! 	if (element->relative) 
! 	{ 
! 		sprintf(linux_type,"ev_rel"); 
! 		sprintf(linux_code,"rel_%c",axis); 
! 	}
! 	else 
! 	{ 
! 		sprintf(linux_type,"ev_abs"); 
! 		sprintf(linux_code,"abs_%c",axis); 
! 	}
! }
! 
! void convertDarwinElementToLinuxTypeCode(pRecElement element, char *linux_type, char *linux_code) 
! {
! 	t_int button_offset = 0;
! 
! 	switch(element->type)
! 	{
! 		case kIOHIDElementTypeInput_Button:
! 			sprintf(linux_type, "ev_key");
! 			break;
! 	}
! 
! 	switch (element->usagePage)
! 	{
! 		case kHIDPage_GenericDesktop:
! 			switch (element->usage)
! 			{
! 				case kHIDUsage_GD_X: convertAxis(element, linux_type, linux_code, 'x'); break;
! 				case kHIDUsage_GD_Y: convertAxis(element, linux_type, linux_code, 'y'); break;
! 				case kHIDUsage_GD_Z: convertAxis(element, linux_type, linux_code, 'z'); break;
! 				case kHIDUsage_GD_Rx: convertAxis(element, linux_type, linux_code, 'x'); break;
! 				case kHIDUsage_GD_Ry: convertAxis(element, linux_type, linux_code, 'y'); break;
! 				case kHIDUsage_GD_Rz: convertAxis(element, linux_type, linux_code, 'z'); break;
! 			}
! 			break;
! 		case kHIDPage_Button:
! 			sprintf(linux_type, "ev_key"); 
! 			sprintf(linux_code, "btn_%ld", element->usage); 
! 			break;
! 	}
  }
  
  
  /* ============================================================================== */
+ /* DARWIN-SPECIFIC SUPPORT FUNCTIONS */
+ /* ============================================================================== */
+ 
+ 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);	
+ }
+ 
+ /* ============================================================================== */
  /* Pd [hid] FUNCTIONS */
  /* ============================================================================== */
***************
*** 136,143 ****
  	pRecDevice  pCurrentHIDDevice;
  	pRecElement pCurrentHIDElement;
! //	char *type = "";
! //	char *code = "";
  	t_atom event_data[4];
  
  	// look for the right device: 
  	pCurrentHIDDevice = HIDGetFirstDevice ();
--- 231,243 ----
  	pRecDevice  pCurrentHIDDevice;
  	pRecElement pCurrentHIDElement;
! 	IOHIDEventStruct event;
! 	char type[256];
! 	char code[256];
! 	char event_output_string[256];
  	t_atom event_data[4];
  
+ 	int event_counter = 0;
+ 	Boolean result;
+ 
  	// look for the right device: 
  	pCurrentHIDDevice = HIDGetFirstDevice ();
***************
*** 146,186 ****
  	if(!pCurrentHIDDevice) return (1);
  
! 
! 	/* get the first element */
! 	pCurrentHIDElement =  HIDGetFirstDeviceElement (pCurrentHIDDevice, kHIDElementTypeIO);
! 	/* cycle thru all elements */
! 	while (pCurrentHIDElement)
  	{
! 		value = HIDGetElementValue (pCurrentHIDDevice, pCurrentHIDElement);
  		
! 		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 ); */
  
! 			/* type */
! //			HIDGetTypeName(pCurrentHIDElement->type,type);
! //			SETSYMBOL(event_data, gensym(type));
! 			/* code */
! //			HIDGetUsageName(pCurrentHIDElement->usagePage, pCurrentHIDElement->usage, code);
! //			SETSYMBOL(event_data + 1, gensym(code));
! 			/* value */
! //			SETFLOAT(event_data + 2, (t_float)value);
! 			/* time */
! 			// TODO temp space filler for testing, got to find where I get the event time
! //			SETFLOAT(event_data + 3, (t_float)value);
! //			SETFLOAT(event_data + 3, (t_float)(hid_input_event.time).tv_sec);
! //			outlet_anything(x->x_obj.te_outlet,atom_gensym(event_data),3,event_data+1); 
! 		}
! 		pCurrentHIDElement = HIDGetNextDeviceElement (pCurrentHIDElement, kHIDElementTypeIO);
  	}
  	return (0);	
  }
  
  
- 
  t_int hid_open_device(t_hid *x, t_int device_number)
  {
--- 246,325 ----
  	if(!pCurrentHIDDevice) return (1);
  
! //	result = HIDGetEvent(pCurrentHIDDevice, (void*) &event);
! //	if(result) 
! 	while( (HIDGetEvent(pCurrentHIDDevice, (void*) &event)) && (event_counter < 64) ) 
  	{
! 		value = event.value;
! 		//post("found event: %d",value);
! 		IOHIDElementCookie cookie = (IOHIDElementCookie) event.elementCookie;
! 
! 		// find the pRecElement using the cookie
! 		pCurrentHIDElement =  HIDGetFirstDeviceElement (pCurrentHIDDevice, kHIDElementTypeIO); 
! 		while (pCurrentHIDElement && (pCurrentHIDElement->cookie != cookie))
! 			pCurrentHIDElement = HIDGetNextDeviceElement (pCurrentHIDElement, kHIDElementTypeIO);
  		
! //		convertDarwinToLinuxType((IOHIDElementType) pCurrentHIDElement->type, event_output_string);
! 		HIDGetUsageName(pCurrentHIDElement->usagePage, pCurrentHIDElement->usage, event_output_string);
  
! 		HIDGetElementNameFromVendorProductCookie(
! 			pCurrentHIDDevice->vendorID, pCurrentHIDDevice->productID,
! 			(long) pCurrentHIDElement->cookie, event_output_string);
! 		
! 		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;
  	}
+ 	DEBUG(
+ 	if(event_counter)
+ 		post("output %d events",event_counter);
+ 	);
+ /* 	/\* get the first element *\/ */
+ /* 	pCurrentHIDElement =  HIDGetFirstDeviceElement (pCurrentHIDDevice, kHIDElementTypeIO); */
+ /* 	/\* cycle thru all elements *\/ */
+ /* 	while (pCurrentHIDElement) */
+ /* 	{ */
+ /* 		//value = HIDGetElementValue (pCurrentHIDDevice, pCurrentHIDElement); */
+ 		
+ /* 		if (pCurrentHIDElement) */
+ /* 		{ */
+ /* 			value = HIDGetElementValue (pCurrentHIDDevice, pCurrentHIDElement); */
+ /* 			post("current value: %d", value); */
+ /* 			// 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 ); *\/ */
+ 
+ /* 			/\* type *\/ */
+ /* 			//HIDGetTypeName(pCurrentHIDElement->type,type); */
+ /* 			convertDarwinToLinuxType((IOHIDElementType) pCurrentHIDElement->type, event_output_string); */
+ /* 			SETSYMBOL(event_data, gensym(event_output_string)); */
+ /* 			/\* code *\/ */
+ /* 			HIDGetUsageName(pCurrentHIDElement->usagePage, pCurrentHIDElement->usage, event_output_string); */
+ /* 			SETSYMBOL(event_data + 1, gensym(event_output_string)); */
+ /* 			/\* value *\/ */
+ /* 			SETFLOAT(event_data + 2, (t_float)value); */
+ /* 			/\* time *\/ */
+ /* 			// TODO temp space filler for testing, got to find where I get the event time */
+ /* 			SETFLOAT(event_data + 3, (t_float)value); */
+ /* //			SETFLOAT(event_data + 3, (t_float)(hid_input_event.time).tv_sec); */
+ /* 			outlet_anything(x->x_obj.te_outlet,atom_gensym(event_data),3,event_data+1);  */
+ /* 		} */
+ /* 		pCurrentHIDElement = HIDGetNextDeviceElement (pCurrentHIDElement, kHIDElementTypeIO); */
+ /* 	} */
  	return (0);	
  }
  
  
  t_int hid_open_device(t_hid *x, t_int device_number)
  {
***************
*** 216,225 ****
  
  	x->x_locID = currentDevice->locID;
- // TODO: buildElementList(), outputting text to console
- // TODO: queue all elements except absolute axes
  
  	post("[hid] opened device %d: %s %s",
  		  device_number, currentDevice->manufacturer, currentDevice->product);
  
  	return (0);
  }
--- 355,367 ----
  
  	x->x_locID = currentDevice->locID;
  
  	post("[hid] opened device %d: %s %s",
  		  device_number, currentDevice->manufacturer, currentDevice->product);
  
+ 	hid_build_element_list(x);
+ 
+ 	HIDQueueDevice(currentDevice);
+ // TODO: queue all elements except absolute axes
+ 
  	return (0);
  }
***************
*** 230,235 ****
  	DEBUG(post("hid_close_device"););
  
! 	post("close_device %d",x->x_device_number);
! 	releaseHIDDevices();
  
  	return (0);
--- 372,379 ----
  	DEBUG(post("hid_close_device"););
  
! 	post("[hid] close_device %d",x->x_device_number);
! 	HIDReleaseAllDeviceQueues();
! 	HIDReleaseDeviceList();
! 	gNumberOfHIDDevices = 0;
  
  	return (0);
***************
*** 241,245 ****
  
  	/* the device list should be refreshed here */
! 	if ( (prHIDBuildDeviceList()) && (prHIDBuildElementList()) )
  		return (0);
  	else
--- 385,389 ----
  
  	/* the device list should be refreshed here */
! 	if ( (prHIDBuildDeviceList()) && (prHIDBuildElementList(x)) )
  		return (0);
  	else
***************
*** 250,254 ****
  
  /*==============================================================================
!  *  HID UTILIES FUNCTIONS
   *==============================================================================
   */
--- 394,398 ----
  
  /*==============================================================================
!  *  HID UTILIES FUNCTIONS FROM SC_HID.cpp
   *==============================================================================
   */
***************
*** 268,277 ****
  }
  
! int prHIDBuildElementList(void)
  {
  	DEBUG(post("prHIDBuildElementList"););
  
  	int locID = NULL;
- 	int cookieNum = NULL;
  	UInt32 i;
  	pRecElement	devElement;
--- 412,420 ----
  }
  
! int prHIDBuildElementList(t_hid *x)
  {
  	DEBUG(post("prHIDBuildElementList"););
  
  	int locID = NULL;
  	UInt32 i;
  	pRecElement	devElement;
***************
*** 285,289 ****
  	// look for the right device using locID 
  	pCurrentHIDDevice = HIDGetFirstDevice ();
! 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID !=locID))
  		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
  	if(!pCurrentHIDDevice) return (1);
--- 428,432 ----
  	// look for the right device using locID 
  	pCurrentHIDDevice = HIDGetFirstDevice ();
! 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID != x->x_locID))
  		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
  	if(!pCurrentHIDDevice) return (1);
***************
*** 306,313 ****
  			//SetObject(devElementArray->slots+devElementArray->size++, devstring);
  			//g->gc->GCWrite(devElementArray, (PyrObject*) devstring);
- 		//cookie
- 		post("Cookie: %d %d %d",devElement->cookie,devElement->min,devElement->max);
  		
! 		devElement =  HIDGetNextDeviceElement (devElement, kHIDElementTypeInput);
  	}
  	return (0);	
--- 449,454 ----
  			//SetObject(devElementArray->slots+devElementArray->size++, devstring);
  			//g->gc->GCWrite(devElementArray, (PyrObject*) devstring);
  		
! 		devElement = HIDGetNextDeviceElement (devElement, kHIDElementTypeInput);
  	}
  	return (0);	
***************
*** 537,646 ****
  /* } */
  
- 
- int prHIDQueueDevice(void)
- {
- 	DEBUG(post("prHIDQueueDevice"););
- 
- 	int locID = NULL;
- 	int cookieNum = NULL;
- 	
- 	//PyrSlot *a = g->sp - 1; //class
- 	//PyrSlot *b = g->sp; //locID device
- 	//int err = slotIntVal(b, &locID);
- 	//if (err) return err;
- 	//look for the right device: 
- 	pRecDevice  pCurrentHIDDevice = HIDGetFirstDevice ();
- 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID !=locID))
- 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
- 	if(!pCurrentHIDDevice) return (1);
- 	HIDQueueDevice(pCurrentHIDDevice);
- 	return (0);	
- }
- 
- 
- int prHIDQueueElement(void)
- {
- 	DEBUG(post("prHIDQueueElement"););
- 
- 	int locID = NULL;
- 	int cookieNum = NULL;
- 	
- 	//PyrSlot *a = g->sp - 2; //class
- 	//PyrSlot *b = g->sp - 1; //locID device
- 	//PyrSlot *c = g->sp; //element cookie
- 	//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) return (1);
- 	HIDQueueElement(pCurrentHIDDevice, pCurrentHIDElement);
- 	return (0);	
- }
- 
- 
- int prHIDDequeueElement(void)
- {
- 	DEBUG(post("prHIDDequeueElement"););
- 
- 	int locID = NULL;
- 	int cookieNum = NULL;
- 	
- 	//PyrSlot *a = g->sp - 2; //class
- 	//PyrSlot *b = g->sp - 1; //locID device
- 	//PyrSlot *c = g->sp; //element cookie
- 	//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);
-     while (pCurrentHIDElement && (pCurrentHIDElement->cookie != cookie))
-         pCurrentHIDElement = HIDGetNextDeviceElement (pCurrentHIDElement, kHIDElementTypeIO);
- 	if(!pCurrentHIDElement) return (1);
- 	HIDDequeueElement(pCurrentHIDDevice, pCurrentHIDElement);
- 	return (0);	
- }
- 
- 
- int prHIDDequeueDevice(void)
- {
- 	DEBUG(post("prHIDDequeueDevice"););
- 
- 	int locID = NULL;
- 	int cookieNum = NULL;
- 	
- 	/*
- 	PyrSlot *a = g->sp - 1; //class
- 	PyrSlot *b = g->sp; //locID device
- 	int err = slotIntVal(b, &locID);
- 	if (err) return err;
- 	*/
- 	//look for the right device: 
- 	pRecDevice  pCurrentHIDDevice = HIDGetFirstDevice ();
- 	while (pCurrentHIDDevice && (pCurrentHIDDevice->locID !=locID))
- 		pCurrentHIDDevice = HIDGetNextDevice (pCurrentHIDDevice);
- 	if(!pCurrentHIDDevice) return (1);
- 	HIDDequeueDevice(pCurrentHIDDevice);
- 	return (0);	
- }
- 
- 
  /* int prHIDStopEventLoop(void) */
  /* { */
--- 678,681 ----
***************
*** 655,671 ****
  /* this is just a rough sketch */
  
- /* getEvents(t_hid *x) { */
- /* 	pRecDevice pCurrentHIDDevice = GetSetCurrentDevice (gWindow); */
- /* 	pRecElement pCurrentHIDElement = GetSetCurrenstElement (gWindow); */
- 
- /* 	// if we have a good device and element which is not a collecion */
- /* 	if (pCurrentHIDDevice && pCurrentHIDElement && (pCurrentHIDElement->type != kIOHIDElementTypeCollection)) */
- /* 	{ */
- /* 		SInt32 value = HIDGetElementValue (pCurrentHIDDevice, pCurrentHIDElement); */
- /* 		SInt32 valueCal = HIDCalibrateValue (value, pCurrentHIDElement); */
- /* 		SInt32 valueScale = HIDScaleValue (valueCal, pCurrentHIDElement); */
- /* 	 } */
- /* } */
- 
  
  //void HIDGetUsageName (const long valueUsagePage, const long valueUsage, char * cstrName)
--- 690,693 ----

Index: hid.h
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** hid.h	4 Nov 2004 17:24:18 -0000	1.5
--- hid.h	6 Nov 2004 01:03:00 -0000	1.6
***************
*** 30,36 ****
  		t_int               x_delay;
  		long                x_locID;
- /* these two are probably unnecessary */
- 		long                x_vendorID;
- 		long                x_productID;
  } t_hid;
  
--- 30,33 ----
***************
*** 40,44 ****
   */
  
! /* what are these for again? */
  char *deviceList[64];
  char *typeList[256];
--- 37,41 ----
   */
  
! /* TODO: what are these for again? */
  char *deviceList[64];
  char *typeList[256];
***************
*** 55,80 ****
  t_int hid_output_events(t_hid *x) ;
  
- 
- 
- 
- 
- #ifdef __APPLE__
- void releaseHIDDevices(void);
- int prHIDBuildElementList(void);
- int prHIDBuildDeviceList(void);
- int prHIDGetValue(void);
- void PushQueueEvents_RawValue(void);
- void PushQueueEvents_CalibratedValue(void);
- int prHIDReleaseDeviceList(void);
- //int prHIDRunEventLoop(void);
- int prHIDQueueDevice(void);
- int prHIDQueueElement(void);
- int prHIDDequeueElement(void);
- int prHIDDequeueDevice(void);
- //int prHIDStopEventLoop(void);
- #endif  /* #ifdef __APPLE__ */
- 
- 
- 
- 
  #endif  /* #ifndef _HID_H */
--- 52,54 ----

Index: hid-help.pd
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid-help.pd,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** hid-help.pd	4 Nov 2004 17:24:17 -0000	1.5
--- hid-help.pd	6 Nov 2004 01:03:00 -0000	1.6
***************
*** 1,4 ****
! #N canvas 124 73 912 605 10;
! #X msg 390 265 ev_key btn_left 0 1.09868e+09;
  #X obj 390 244 prepend set;
  #X obj 149 473 route rel_x rel_y;
--- 1,4 ----
! #N canvas 143 45 911 634 10;
! #X msg 390 265 ev_abs abs_x 117 1.13626e+09;
  #X obj 390 244 prepend set;
  #X obj 149 473 route rel_x rel_y;
***************
*** 7,29 ****
  #X msg 148 77 start;
  #X msg 174 96 stop;
! #X floatatom 494 384 12 0 0 1 time - -;
! #X obj 401 364 unpack s s f f;
! #X msg 241 29 open 0;
! #X msg 248 47 open 1;
! #X msg 255 65 open 2;
! #X msg 261 83 open 3;
! #X msg 267 101 open 4;
  #X floatatom 206 454 7 0 0 0 - - -;
  #X floatatom 264 454 7 0 0 0 - - -;
! #X obj 206 433 route abs_x abs_y;
! #X obj 86 81 tgl 35 0 empty empty empty 0 -6 0 8 -24198 -1 -1 0 1;
! #X floatatom 463 401 12 0 0 1 value - -;
! #X symbolatom 431 418 10 0 0 1 eventcode - -;
! #X symbolatom 401 437 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 61 219 bng 35 250 50 0 empty empty event_received 38 18 1 8
  -225280 -1 -1;
  #X obj 2 2 cnv 15 900 20 empty empty [hid] 2 11 1 18 -233017 -66577
--- 7,28 ----
  #X msg 148 77 start;
  #X msg 174 96 stop;
! #X floatatom 531 375 12 0 0 1 time - -;
! #X obj 438 355 unpack s s f f;
! #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 floatatom 206 454 7 0 0 0 - - -;
  #X floatatom 264 454 7 0 0 0 - - -;
! #X obj 86 81 tgl 35 0 empty empty empty 0 -6 0 8 -24198 -1 -1 1 1;
! #X floatatom 500 392 12 0 0 1 value - -;
! #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 71 241 bng 35 250 50 0 empty empty event_received 38 18 1 9
  -225280 -1 -1;
  #X obj 2 2 cnv 15 900 20 empty empty [hid] 2 11 1 18 -233017 -66577
***************
*** 52,104 ****
  #X obj 262 397 +;
  #X msg 262 377 1;
! #X msg 317 149 close;
! #X msg 374 178 delay 20;
! #X msg 312 177 delay 2;
! #X msg 441 178 delay 200;
  #X text 383 40 new possibilities:;
  #X msg 391 62 poll;
  #X msg 431 62 poll 20;
  #X msg 499 61 nopoll;
! #X text 361 149 probably not needed;
! #X msg 282 127 refresh;
! #X text 343 125 refresh device list;
! #X obj 248 209 hid 2;
  #X connect 1 0 0 0;
  #X connect 2 0 3 0;
  #X connect 2 1 4 0;
! #X connect 5 0 60 0;
! #X connect 6 0 60 0;
! #X connect 8 0 20 0;
! #X connect 8 1 19 0;
! #X connect 8 2 18 0;
  #X connect 8 3 7 0;
! #X connect 9 0 60 0;
! #X connect 10 0 60 0;
! #X connect 11 0 60 0;
! #X connect 12 0 60 0;
! #X connect 13 0 60 0;
! #X connect 16 0 14 0;
! #X connect 16 1 15 0;
! #X connect 17 0 60 0;
! #X connect 23 0 21 0;
! #X connect 23 1 22 0;
! #X connect 23 2 24 0;
! #X connect 43 0 42 0;
! #X connect 44 0 43 1;
! #X connect 45 0 23 0;
! #X connect 45 1 2 0;
! #X connect 45 2 16 0;
! #X connect 45 3 48 0;
! #X connect 46 0 47 1;
  #X connect 47 0 46 0;
! #X connect 48 0 47 0;
! #X connect 49 0 60 0;
! #X connect 50 0 60 0;
! #X connect 51 0 60 0;
! #X connect 52 0 60 0;
! #X connect 58 0 60 0;
! #X connect 60 0 43 0;
! #X connect 60 0 25 0;
! #X connect 60 0 45 0;
! #X connect 60 0 1 0;
! #X connect 60 0 8 0;
--- 51,120 ----
  #X obj 262 397 +;
  #X msg 262 377 1;
! #X msg 336 152 close;
! #X msg 398 180 delay 20;
! #X msg 336 180 delay 2;
! #X msg 465 180 delay 200;
  #X text 383 40 new possibilities:;
  #X msg 391 62 poll;
  #X msg 431 62 poll 20;
  #X msg 499 61 nopoll;
! #X text 380 152 probably not needed;
! #X msg 336 129 refresh;
! #X text 397 127 refresh device list;
! #X obj 248 225 hid 2;
! #X obj 590 143 loadbang;
! #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>
! ;
! #X text 266 602 released under the GNU GPL;
! #X text 472 589 $Revision$$Date$;
! #X text 473 602 $Author$;
! #X obj 206 433 route abs_x abs_y abs_z;
! #X floatatom 322 454 7 0 0 0 - - -;
  #X connect 1 0 0 0;
  #X connect 2 0 3 0;
  #X connect 2 1 4 0;
! #X connect 5 0 59 0;
! #X connect 6 0 59 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 59 0;
! #X connect 10 0 59 0;
! #X connect 11 0 59 0;
! #X connect 12 0 59 0;
! #X connect 13 0 59 0;
! #X connect 16 0 59 0;
! #X connect 22 0 20 0;
! #X connect 22 1 21 0;
! #X connect 22 2 23 0;
! #X connect 22 3 61 0;
! #X connect 42 0 41 0;
! #X connect 43 0 42 1;
! #X connect 44 0 22 0;
! #X connect 44 1 2 0;
! #X connect 44 2 69 0;
! #X connect 44 3 47 0;
! #X connect 45 0 46 1;
! #X connect 46 0 45 0;
  #X connect 47 0 46 0;
! #X connect 48 0 59 0;
! #X connect 49 0 59 0;
! #X connect 50 0 59 0;
! #X connect 51 0 59 0;
! #X connect 57 0 59 0;
! #X connect 59 0 42 0;
! #X connect 59 0 24 0;
! #X connect 59 0 44 0;
! #X connect 59 0 1 0;
! #X connect 59 0 8 0;
! #X connect 60 0 51 0;
! #X connect 61 1 62 0;
! #X connect 69 0 14 0;
! #X connect 69 1 15 0;
! #X connect 69 2 70 0;

Index: hid.c
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** hid.c	4 Nov 2004 17:24:17 -0000	1.8
--- hid.c	6 Nov 2004 01:03:00 -0000	1.9
***************
*** 36,39 ****
--- 36,51 ----
  
  /*------------------------------------------------------------------------------
+  * FUNCTION PROTOTYPES
+  */
+ 
+ void hid_start(t_hid *x);
+ void hid_stop(t_hid *x);
+ t_int hid_open(t_hid *x, t_float f);
+ t_int hid_close(t_hid *x);
+ t_int hid_read(t_hid *x,int fd);
+ void hid_delay(t_hid *x, t_float f);
+ static void hid_float(t_hid* x, t_floatarg f);
+ 
+ /*------------------------------------------------------------------------------
   * IMPLEMENTATION                    
   */
***************
*** 69,72 ****
--- 81,87 ----
  {
  	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);
***************
*** 83,90 ****
    {
  	  error("[hid] can not open device %d",x->x_device_number);
!   post("\\================================ [hid] ================================/\n");
  	  return (1);
    }
  
    post("\\================================ [hid] ================================/\n");
    return (0);
--- 98,110 ----
    {
  	  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);





More information about the Pd-cvs mailing list