Update of /cvsroot/pure-data/externals/hcs/hid
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12677
Modified Files:
Makefile
Added Files:
hid_windows.c
Log Message:
got the basic sketch working, but now I have to figure out the hid.dll nameclash issue... arg
--- NEW FILE: hid_windows.c ---
#ifdef _WIN32
/*
* Microsoft Windows DDK HID support for Pd [hid] object
*
* Copyright (c) 2004 Hans-Christoph All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
*/
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <setupapi.h>
#ifdef _MSC_VER
#include <hidsdi.h>
#else
#include <ddk/hidsdi.h>
#endif /* _MSC_VER */
#include "hid.h"
//#define DEBUG(x)
#define DEBUG(x) x
/*==============================================================================
* GLOBAL VARS
*======================================================================== */
extern t_int hid_instance_count;
/*==============================================================================
* FUNCTION PROTOTYPES
*==============================================================================
*/
/*==============================================================================
* Event TYPE/CODE CONVERSION FUNCTIONS
*==============================================================================
*/
/* ============================================================================== */
/* WINDOWS DDK HID SPECIFIC SUPPORT FUNCTIONS */
/* ============================================================================== */
void hid_get_device_by_number(t_int device_number)
{
}
void hid_build_element_list(t_hid *x)
{
}
t_int hid_print_element_list(t_hid *x)
{
DEBUG(post("hid_print_element_list"););
return (0);
}
t_int hid_print_device_list(t_hid *x)
{
struct _GUID GUID;
SP_INTERFACE_DEVICE_DATA DeviceInterfaceData;
struct {DWORD cbSize; char DevicePath[256];} FunctionClassDeviceData;
HIDD_ATTRIBUTES HIDAttributes;
SECURITY_ATTRIBUTES SecurityAttributes;
int i;
HANDLE PnPHandle, HIDHandle;
ULONG BytesReturned;
int Success, ManufacturerName, ProductName;
char ManufacturerBuffer[256];
char ProductBuffer[256];
const char NotSupplied[] = "NULL";
DWORD lastError = 0;
#if 0
// Initialize the GUID array and setup the security attributes for Win2000
HidD_GetHidGuid(&GUID);
SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
SecurityAttributes.lpSecurityDescriptor = NULL;
SecurityAttributes.bInheritHandle = FALSE;
// Get a handle for the Plug and Play node and request currently active devices
PnPHandle = SetupDiGetClassDevs(&GUID, NULL, NULL,
DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);
if ((int)PnPHandle == -1)
{
error("[hid] ERROR: Could not attach to PnP node\n");
return (t_int) GetLastError();
}
// Lets look for a maximum of 32 Devices
for (i = 0; i < 32; i++) {
// Initialize our data
DeviceInterfaceData.cbSize = sizeof(DeviceInterfaceData);
// Is there a device at this table entry
Success = SetupDiEnumDeviceInterfaces(PnPHandle, NULL, &GUID, i,
&DeviceInterfaceData);
if (Success) {
// There is a device here, get it's name
FunctionClassDeviceData.cbSize = 5;
Success = SetupDiGetDeviceInterfaceDetail(PnPHandle,
&DeviceInterfaceData,
(PSP_INTERFACE_DEVICE_DETAIL_DATA)&FunctionClassDeviceData,
256, &BytesReturned, NULL);
if (!Success)
{
error("[hid] ERROR: Could not find the system name for device %d\n",i);
return GetLastError();
}
// Can now open this device
HIDHandle = CreateFile(FunctionClassDeviceData.DevicePath,
0,
FILE_SHARE_READ|FILE_SHARE_WRITE,
&SecurityAttributes, OPEN_EXISTING, 0, NULL);
lastError = GetLastError();
if (HIDHandle == INVALID_HANDLE_VALUE)
{
error("[hid] ERROR: Could not open HID #%d, Errorcode = %d\n", i, (int)lastError);
return lastError;
}
// Get the information about this HID
Success = HidD_GetAttributes(HIDHandle, &HIDAttributes);
if (!Success)
{
error("[hid] ERROR: Could not get HID attributes\n");
return GetLastError();
}
ManufacturerName = HidD_GetManufacturerString(HIDHandle, ManufacturerBuffer, 256);
ProductName = HidD_GetProductString(HIDHandle, ProductBuffer, 256);
// And display it!
post("[hid]: Device %d: %s %s\n",i,
ManufacturerName ? ManufacturerBuffer : NotSupplied,
ProductName ? ProductBuffer : NotSupplied);
post("\tVenderID = %4.4x, Name = ", HIDAttributes.VendorID);
post("%s\n", ManufacturerName ? ManufacturerBuffer : NotSupplied);
post("\tProductID = %4.4x, Name = ", HIDAttributes.ProductID);
post("%s\n", ProductName ? ProductBuffer : NotSupplied);
CloseHandle(HIDHandle);
} // if (SetupDiEnumDeviceInterfaces . .
} // for (i = 0; i < 32; i++)
SetupDiDestroyDeviceInfoList(PnPHandle);
#endif
return 0;
}
void hid_output_device_name(t_hid *x, char *manufacturer, char *product)
{
char *device_name;
t_symbol *device_name_symbol;
device_name = malloc( strlen(manufacturer) + 1 + strlen(product) + 1 );
// device_name = malloc( 7 + strlen(manufacturer) + 1 + strlen(product) + 1 );
// strcpy( device_name, "append " );
strcat( device_name, manufacturer );
strcat ( device_name, " ");
strcat( device_name, product );
// outlet_anything( x->x_device_name_outlet, gensym( device_name ),0,NULL );
outlet_symbol( x->x_device_name_outlet, gensym( device_name ) );
}
/* ------------------------------------------------------------------------------ */
/* FORCE FEEDBACK FUNCTIONS */
/* ------------------------------------------------------------------------------ */
/* cross-platform force feedback functions */
t_int hid_ff_autocenter( t_hid *x, t_float value )
{
return ( 0 );
}
t_int hid_ff_gain( t_hid *x, t_float value )
{
return ( 0 );
}
t_int hid_ff_motors( t_hid *x, t_float value )
{
return ( 0 );
}
t_int hid_ff_continue( t_hid *x )
{
return ( 0 );
}
t_int hid_ff_pause( t_hid *x )
{
return ( 0 );
}
t_int hid_ff_reset( t_hid *x )
{
return ( 0 );
}
t_int hid_ff_stopall( t_hid *x )
{
return ( 0 );
}
// these are just for testing...
t_int hid_ff_fftest ( t_hid *x, t_float value)
{
return ( 0 );
}
void hid_ff_print( t_hid *x )
{
}
/* ============================================================================== */
/* Pd [hid] FUNCTIONS */
/* ============================================================================== */
t_int hid_get_events(t_hid *x)
{
//DEBUG(post("hid_get_events"););
return (0);
}
t_int hid_open_device(t_hid *x, t_int device_number)
{
DEBUG(post("hid_open_device"););
t_int result = 0;
return(result);
}
t_int hid_close_device(t_hid *x)
{
DEBUG(post("hid_close_device"););
t_int result = 0;
return(result);
}
t_int hid_build_device_list(t_hid *x)
{
DEBUG(post("hid_build_device_list"););
/*
* The Windows DDK "hid.dll" has to be loaded manually because Windows gets
* confused by this object, which is also named "hid.dll". This is the first
* platform-specific function called in hid.c, so that's why this is happening
* here.
*/
TCHAR hidDllPath[MAX_PATH];
UINT hidDllPathLength;
HMODULE hModule = NULL;
hidDllPathLength = GetSystemDirectory(hidDllPath, MAX_PATH);
if( !hidDllPathLength )
{
error("[hid] ERROR: cannot get SystemRoot");
return 0;
}
strcat(hidDllPath,"\\hid.dll");
post("hidDllPath: %s",hidDllPath);
hModule = LoadLibrary(hidDllPath);
if ( !hModule )
{
error("[hid] ERROR: couldn't load %s: error %d",hidDllPath,GetLastError());
return 0;
}
return 1;
}
void hid_print(t_hid *x)
{
hid_print_device_list(x);
if(x->x_device_open)
{
hid_print_element_list(x);
hid_ff_print( x );
}
}
void hid_platform_specific_free(t_hid *x)
{
DEBUG(post("hid_platform_specific_free"););
/* only call this if the last instance is being freed */
if (hid_instance_count < 1)
{
DEBUG(post("RELEASE ALL hid_instance_count: %d", hid_instance_count););
}
}
#endif /* _WIN32 */
Index: Makefile
===================================================================
RCS file: /cvsroot/pure-data/externals/hcs/hid/Makefile,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** Makefile 11 Jun 2005 05:01:14 -0000 1.11
--- Makefile 19 Dec 2005 20:40:31 -0000 1.12
***************
*** 1,34 ****
! OS_NAME = $(shell uname -s)
! # ----------------------- GNU/LINUX i386 -----------------------
! ifeq ($(OS_NAME),Linux)
! LDFLAGS = -export_dynamic -shared
! .SUFFIXES: .pd_linux
- all: input_arrays pd_linux
- pd_linux: hid.pd_linux
endif
# ----------------------- DARWIN -----------------------
! ifeq ($(OS_NAME),Darwin)
! FRAMEWORKS = Carbon IOKit ForceFeedback
! LDFLAGS = -bundle -bundle_loader $(PDEXECUTABLE) \
! -L/sw/lib -L./HID\ Utilities\ Source/build \
! -lHIDUtilities \
! $(patsubst %,-framework %,$(FRAMEWORKS))
! .SUFFIXES: .pd_darwin
! all: input_arrays hid_utilities pd_darwin
! pd_darwin: hid.pd_darwin
! endif
# ----------------------- GENERAL ---------------------------------------------
- PDEXECUTABLE = ../../../pd/bin/pd
-
# generic optimization
OPT_FLAGS = -O3 -ffast-math
--- 1,75 ----
+ TARGET=hid
! default:
! make -C ../../ $(TARGET)
+ install:
+ make -C ../../ $(TARGET)_install
! clean:
! make -C ../../ $(TARGET)_clean
+
+ # this stuff below probably works, but its not maintained anymore since I use
+ # externals/Makefile
+
+ CWD := $(shell pwd)
+
+ # these are setup to be overridden by the packages/Makefile
+ cvs_root_dir = $(CWD)/../../..
+ DESTDIR = $(CWD)/build/
+ BUILDLAYOUT_DIR = $(cvs_root_dir)/packages
+
+ include $(BUILDLAYOUT_DIR)/Makefile.buildlayout
+
+ CFLAGS = $(OPT_FLAGS) -Wall -I./ -I../../../pd/src
+ LDFLAGS =
+ LIBS = -lm
+
+
+ #SRC = $(wildcard $(externals_src)/hcs/hid/hid*.c)
+ SRC = $(wildcard *.c)
+ SRC = input_arrays.c hid_$(OS_NAME).c
+ OBJ := $(SRC:.c=.o)
+
+ # ----------------------- GNU/LINUX i386 -----------------------
+ ifeq ($(OS_NAME),linux)
+ EXTENSION = pd_linux
+ LDFLAGS += -export_dynamic -shared
+ LIBS += -lc
+ STRIP = strip --strip-unneeded
+ hid.$(EXTENSION): input_arrays $(OBJ)
+ endif
+
+ # ----------------------- Windows MinGW -----------------------
+ ifeq ($(OS_NAME),win)
+ EXTENSION = dll
+ CFLAGS += -mms-bitfields
+ LDFLAGS += -shared
+ LIBS += -lhid -lsetupapi -L../../../pd/bin -lpd
+ STRIP = strip --strip-unneeded
+ hid.$(EXTENSION): input_arrays $(OBJ)
endif
# ----------------------- DARWIN -----------------------
! ifeq ($(OS_NAME),darwin)
! EXTENSION = pd_darwin
! CFLAGS += -I./HID\ Utilities\ Source
! PDEXECUTABLE = ../../../pd/bin/pd
! FRAMEWORKS = Carbon IOKit ForceFeedback
! LDFLAGS += -bundle -bundle_loader $(PDEXECUTABLE)
! LIBS += -lc -L/sw/lib -L./HID\ Utilities\ Source/build \
! -lHIDUtilities $(patsubst %,-framework %,$(FRAMEWORKS))
! STRIP = strip -x
! hid.$(EXTENSION): input_arrays hid_utilites $(OBJ)
! endif
! all: hid.$(EXTENSION)
! .SUFFIXES: .$(EXTENSION)
# ----------------------- GENERAL ---------------------------------------------
# generic optimization
OPT_FLAGS = -O3 -ffast-math
***************
*** 42,61 ****
#OPT_FLAGS = -ffast -mcpu=7450 -faltivec -ffast-math -fPIC
! CFLAGS = $(OPT_FLAGS) -Wall -W -Wno-shadow -Wstrict-prototypes -Wno-unused
! INCLUDE = -I./ -I../../../pd/src -I./HID\ Utilities\ Source
- .c.o:
- $(CC) $(CFLAGS) $(INCLUDE) -c *.c
! .o.pd_darwin:
! $(CC) $(LDFLAGS) -o $*.pd_darwin *.o
! .o.pd_linux:
! ld $(LDFLAGS) -o $*.pd_linux *.o -lc -lm
! strip --strip-unneeded $*.pd_linux
- input_arrays:
- test -f input_arrays.h || ./make-arrays-from-input.h.pl
hid_utilities:
--- 83,107 ----
#OPT_FLAGS = -ffast -mcpu=7450 -faltivec -ffast-math -fPIC
! %.o: %.c
! $(CC) $(CFLAGS) -o "$*.o" -c "$*.c"
! %.$(EXTENSION): %.o
! $(CC) $(LDFLAGS) -o "$*.$(EXTENSION)" "$*.o" $(OBJ) $(LIBS) \
! `test -f $*.libs && cat $*.libs` \
! `test -f $(dir $*)../$(OS_NAME)/$(notdir $*).libs && \
! cat $(dir $*)../$(OS_NAME)/$(notdir $*).libs`
! chmod a-x "$*.$(EXTENSION)"
! $(STRIP) $*.$(EXTENSION)
! rm -f -- $*.o
! input_arrays: input_arrays.c input_arrays.h
! input_arrays.c: linux/input.h
! ./make-arrays-from-input.h.pl
!
! input_arrays.h: linux/input.h
! ./make-arrays-from-input.h.pl
hid_utilities:
***************
*** 63,66 ****
( cd ./HID\ Utilities\ Source && pbxbuild )
- clean: ; rm -f *.pd_* *.o *~ input_arrays.? doc/ev*-list.pd
--- 109,146 ----
( cd ./HID\ Utilities\ Source && pbxbuild )
+ local_clean:
+ -rm -f -- *.$(EXTENSION) *~
+ -find . -name '*.o' | xargs rm -f --
+
+ distclean: local_clean
+ -rm -f -- input_arrays.? doc/ev*-list.pd
+
+ .PHONY: all input_arrays hid_utilities clean distclean
+
+
+ test_locations:
+ @echo "EXTENSION: $(EXTENSION)"
+ @echo "CFLAGS: $(CFLAGS)"
+ @echo "LDFLAGS: $(LDFLAGS)"
+ @echo "LIBS: $(LIBS)"
+ @echo "STRIP: $(STRIP)"
+ @echo " "
+ @echo "SRC: $(SRC)"
+ @echo "OBJ: $(OBJ)"
+ @echo " "
+ @echo "OS_NAME: $(OS_NAME)"
+ @echo "PD_VERSION: $(PD_VERSION)"
+ @echo "PACKAGE_VERSION: $(PACKAGE_VERSION)"
+ @echo "CWD $(CWD)"
+ @echo "DESTDIR $(DESTDIR)"
+ @echo "PREFIX $(prefix)"
+ @echo "BINDIR $(bindir)"
+ @echo "LIBDIR $(libdir)"
+ @echo "OBJECTSDIR $(objectsdir)"
+ @echo "PDDOCDIR $(pddocdir)"
+ @echo "LIBPDDIR $(libpddir)"
+ @echo "LIBPDBINDIR $(libpdbindir)"
+ @echo "HELPDIR $(helpdir)"
+ @echo "MANUALSDIR $(manualsdir)"
+ @echo "EXAMPLESDIR $(examplesdir)"