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)"