Update of /cvsroot/pure-data/externals/hcs/hid In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7552
Modified Files: Makefile TODO hid.c hid.h hid_darwin.c hid_linux.c hid_windows.c mouse.pd Log Message: seemed to fix the mac crasher bug caused by HIDReleaseBuildList wierdness; cleaned up things a bit and made it possible to open devices by type
Index: hid.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.c,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** hid.c 25 Jan 2006 08:40:35 -0000 1.21 --- hid.c 27 May 2006 00:57:15 -0000 1.22 *************** *** 24,27 **** --- 24,33 ---- /* --------------------------------------------------------------------------*/
+ #include <unistd.h> + #include <stdarg.h> + #include <stdlib.h> + #include <string.h> + #include <ctype.h> + #include "hid.h"
*************** *** 33,36 **** --- 39,44 ---- //#define DEBUG(x) x
+ unsigned short global_debug_level = 0; + static t_class *hid_class;
*************** *** 39,47 **** */
! void hid_start(t_hid *x, t_float f); ! 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); static void hid_float(t_hid* x, t_floatarg f);
--- 47,54 ---- */
! static void hid_poll(t_hid *x, t_float f); ! static t_int hid_open(t_hid *x, t_symbol *s, t_int argc, t_atom *argv); ! static t_int hid_close(t_hid *x); ! static t_int hid_read(t_hid *x,int fd); static void hid_float(t_hid* x, t_floatarg f);
*************** *** 51,54 **** --- 58,101 ---- */
+ void debug_print(t_int message_debug_level, const char *fmt, ...) + { + if(message_debug_level <= global_debug_level) + { + char buf[MAXPDSTRING]; + va_list ap; + //t_int arg[8]; + va_start(ap, fmt); + vsnprintf(buf, MAXPDSTRING-1, fmt, ap); + post(buf); + va_end(ap); + } + } + + void debug_error(t_hid *x, t_int message_debug_level, const char *fmt, ...) + { + if(message_debug_level <= global_debug_level) + { + char buf[MAXPDSTRING]; + va_list ap; + //t_int arg[8]; + va_start(ap, fmt); + vsnprintf(buf, MAXPDSTRING-1, fmt, ap); + pd_error(x, buf); + va_end(ap); + } + } + + static unsigned int name_to_usage(char *usage_name) + { // output usagepage << 16 + usage + if(strcmp(usage_name,"pointer") == 0) return(0x00010001); + if(strcmp(usage_name,"mouse") == 0) return(0x00010002); + if(strcmp(usage_name,"joystick") == 0) return(0x00010004); + if(strcmp(usage_name,"gamepad") == 0) return(0x00010005); + if(strcmp(usage_name,"keyboard") == 0) return(0x00010006); + if(strcmp(usage_name,"keypad") == 0) return(0x00010007); + if(strcmp(usage_name,"multiaxiscontroller") == 0) return(0x00010008); + return(0); + } + void hid_output_event(t_hid *x, char *type, char *code, t_float value) { *************** *** 62,65 **** --- 109,125 ---- }
+ /* stop polling the device */ + void stop_poll(t_hid* x) + { + debug_print(LOG_DEBUG,"stop_poll"); + + if (x->x_started) + { + clock_unset(x->x_clock); + debug_print(LOG_INFO,"[hid] polling stopped"); + x->x_started = 0; + } + } + void hid_set_from_float(t_hid *x, t_floatarg f) { *************** *** 69,113 **** { 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 */
- /* stop polling the device */ - void hid_stop(t_hid* x) - { - DEBUG(post("hid_stop");); - - if (x->x_started) - { - clock_unset(x->x_clock); - DEBUG(post("[hid] polling stopped");); - x->x_started = 0; - } - }
/* close the device */ t_int hid_close(t_hid *x) { ! DEBUG(post("hid_close"););
/* just to be safe, stop it first */ ! hid_stop(x);
if(! hid_close_device(x)) { ! post("[hid] closed device %d",x->x_device_number); x->x_device_open = 0; return (0); --- 129,161 ---- { x->x_delay = (t_int)f; ! hid_poll(x,f); } else if (f == 1) { if (! x->x_started) ! hid_poll(x,f); } else if (f == 0) { ! stop_poll(x); } }
/*------------------------------------------------------------------------------ ! * METHODS FOR [hid]'s MESSAGES */
/* close the device */ t_int hid_close(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_close");
/* just to be safe, stop it first */ ! stop_poll(x);
if(! hid_close_device(x)) { ! debug_print(LOG_INFO,"[hid] closed device %d",x->x_device_number); x->x_device_open = 0; return (0); *************** *** 127,143 **** */
! 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;
/* only close the device if its different than the current and open */ ! if ( (f != x->x_device_number) && (x->x_device_open) ) hid_close(x);
! if (f > 0) ! x->x_device_number = f; else x->x_device_number = 0; --- 175,225 ---- */
! t_int hid_open(t_hid *x, t_symbol *s, t_int argc, t_atom *argv) { ! debug_print(LOG_DEBUG,"hid_open"); ! unsigned short i; ! unsigned short device_number = 0; ! unsigned short usage_number; ! unsigned int usage; ! char usage_string[MAXPDSTRING] = "";
+ if(argc == 1) + { + if(atom_getsymbolarg(0,argc,argv) == &s_) + { // single float arg means device + debug_print(LOG_DEBUG,"[hid] setting device# to %d",device_number); + device_number = (unsigned short) atom_getfloatarg(0,argc,argv); + } + else + { // single symbol arg means usagepage/usage + debug_print(LOG_DEBUG,"[hid] setting device via usagepage/usage"); + atom_string(argv, usage_string, MAXPDSTRING-1); + i = strlen(usage_string); + do { + --i; + } while(isdigit(usage_string[i])); + usage_number = strtol(usage_string + i + 1,NULL,10); + usage_string[i+1] = '\0'; + debug_print(LOG_DEBUG,"[hid] looking for %s #%d",usage_string,usage_number); + usage = name_to_usage(usage_string); + debug_print(LOG_DEBUG,"[hid] usage 0x%08x 0x%04x 0x%04x",usage, usage >> 16, usage & 0xffff); + device_number = get_device_number_from_usage_list(usage_number, + usage >> 16, usage & 0xffff); + } + } + else if( (argc == 2) && (atom_getsymbolarg(0,argc,argv) != NULL) + && (atom_getsymbolarg(1,argc,argv) != NULL) ) + { /* two symbols means idVendor and idProduct in hex */ + } + /* store running state to be restored after the device has been opened */ t_int started = x->x_started;
/* only close the device if its different than the current and open */ ! if( (device_number != x->x_device_number) && (x->x_device_open) ) hid_close(x);
! if(device_number > 0) ! x->x_device_number = device_number; else x->x_device_number = 0; *************** *** 146,152 **** * therefore ignore the redundant open request. To reopen the same device, * send a [close( msg, then an [open( msg. */ ! 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); --- 228,234 ---- * therefore ignore the redundant open request. To reopen the same device, * send a [close( msg, then an [open( msg. */ ! 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); *************** *** 165,168 **** --- 247,252 ---- hid_set_from_float(x,x->x_delay);
+ debug_print(LOG_DEBUG,"[hid] done device# to %d",device_number); + return (0); } *************** *** 171,175 **** t_int hid_read(t_hid *x,int fd) { ! // DEBUG(post("hid_read"););
hid_get_events(x); --- 255,259 ---- t_int hid_read(t_hid *x,int fd) { ! // debug_print(LOG_DEBUG,"hid_read");
hid_get_events(x); *************** *** 184,217 **** }
! void hid_start(t_hid* x, t_float f) { ! DEBUG(post("hid_start"););
/* if the user sets the delay less than one, ignore */ ! if( f >= 1 ) x->x_delay = (t_int)f;
if(!x->x_device_open) ! hid_open(x,x->x_device_number); ! if(!x->x_started) { clock_delay(x->x_clock, x->x_delay); ! DEBUG(post("[hid] polling started");); x->x_started = 1; } }
static void hid_float(t_hid* x, t_floatarg f) { ! DEBUG(post("hid_float"););
hid_set_from_float(x,f); }
! /* setup functions */ static void hid_free(t_hid* x) { ! DEBUG(post("hid_free");); hid_close(x); --- 268,327 ---- }
! void hid_poll(t_hid* x, t_float f) { ! debug_print(LOG_DEBUG,"hid_poll");
/* if the user sets the delay less than one, ignore */ ! if( f > 0 ) x->x_delay = (t_int)f;
if(!x->x_device_open) ! hid_open(x,gensym("open"),0,NULL); ! if(!x->x_started) { clock_delay(x->x_clock, x->x_delay); ! debug_print(LOG_DEBUG,"[hid] polling started"); x->x_started = 1; } }
+ static void hid_anything(t_hid *x, t_symbol *s, t_int argc, t_atom *argv) + { + int i; + t_symbol *my_symbol; + char device_name[MAXPDSTRING]; + + startpost("ANYTHING! selector: %s data:"); + for(i=0; i<argc; ++i) + { + my_symbol = atom_getsymbolarg(i,argc,argv); + if(my_symbol != NULL) + post(" %s",my_symbol->s_name); + else + post(" %f",atom_getfloatarg(i,argc,argv)); + } + } + + static void hid_float(t_hid* x, t_floatarg f) { ! debug_print(LOG_DEBUG,"hid_float");
hid_set_from_float(x,f); }
! static void hid_debug(t_hid *x, t_float f) ! { ! global_debug_level = f; ! } ! ! ! /*------------------------------------------------------------------------------ ! * system functions ! */ static void hid_free(t_hid* x) { ! debug_print(LOG_DEBUG,"hid_free"); hid_close(x); *************** *** 226,236 **** { t_hid *x = (t_hid *)pd_new(hid_class); ! ! DEBUG(post("hid_new");); ! /* only display the version when the first instance is loaded */ if(!hid_instance_count) post("[hid] %d.%d, written by Hans-Christoph Steiner hans@eds.org", HID_MAJOR_VERSION, HID_MINOR_VERSION);
#if !defined(__linux__) && !defined(__APPLE__) --- 336,349 ---- { t_hid *x = (t_hid *)pd_new(hid_class); ! ! debug_print(LOG_DEBUG,"hid_new"); ! /* only display the version when the first instance is loaded */ if(!hid_instance_count) + { post("[hid] %d.%d, written by Hans-Christoph Steiner hans@eds.org", HID_MAJOR_VERSION, HID_MINOR_VERSION); + post("\tcompiled on "__DATE__" at "__TIME__ " "); + }
#if !defined(__linux__) && !defined(__APPLE__) *************** *** 241,244 **** --- 354,358 ----
/* init vars */ + global_debug_level = 9; /* high numbers here means see more messages */ x->x_has_ff = 0; x->x_device_open = 0; *************** *** 251,264 **** x->x_data_outlet = outlet_new(&x->x_obj, 0); x->x_device_name_outlet = outlet_new(&x->x_obj, 0); - - /* 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 - * anyway, so that the inlets and outlets are created, thus not breaking the - * patch. */ - if (hid_open(x,f)) - error("[hid] device %d did not open",(t_int)f);
hid_instance_count++;
--- 365,376 ---- x->x_data_outlet = outlet_new(&x->x_obj, 0); x->x_device_name_outlet = outlet_new(&x->x_obj, 0);
+ x->x_device_number = 0; + + if(f > 0) + x->x_device_number = f; + else + x->x_device_number = 0; + hid_instance_count++;
*************** *** 268,272 **** void hid_setup(void) { ! DEBUG(post("hid_setup");); hid_class = class_new(gensym("hid"), (t_newmethod)hid_new, --- 380,384 ---- void hid_setup(void) { ! debug_print(LOG_DEBUG,"hid_setup"); hid_class = class_new(gensym("hid"), (t_newmethod)hid_new, *************** *** 279,292 **** class_addfloat(hid_class,(t_method) hid_float); class_addbang(hid_class,(t_method) hid_read); /* add inlet message methods */ class_addmethod(hid_class,(t_method) hid_build_device_list,gensym("refresh"),0); class_addmethod(hid_class,(t_method) hid_print,gensym("print"),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); ! class_addmethod(hid_class,(t_method) hid_start,gensym("start"),A_DEFFLOAT,0); ! class_addmethod(hid_class,(t_method) hid_start,gensym("poll"),A_DEFFLOAT,0); ! class_addmethod(hid_class,(t_method) hid_stop,gensym("stop"),0); ! class_addmethod(hid_class,(t_method) hid_stop,gensym("nopoll"),0); /* force feedback messages */ class_addmethod(hid_class,(t_method) hid_ff_autocenter, --- 391,403 ---- class_addfloat(hid_class,(t_method) hid_float); class_addbang(hid_class,(t_method) hid_read); + class_addanything(hid_class,(t_method) hid_anything); /* add inlet message methods */ + class_addmethod(hid_class,(t_method) hid_debug,gensym("debug"),A_DEFFLOAT,0); class_addmethod(hid_class,(t_method) hid_build_device_list,gensym("refresh"),0); class_addmethod(hid_class,(t_method) hid_print,gensym("print"),0); ! class_addmethod(hid_class,(t_method) hid_open,gensym("open"),A_GIMME,0); class_addmethod(hid_class,(t_method) hid_close,gensym("close"),0); ! class_addmethod(hid_class,(t_method) hid_poll,gensym("poll"),A_DEFFLOAT,0); /* force feedback messages */ class_addmethod(hid_class,(t_method) hid_ff_autocenter,
Index: hid_windows.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_windows.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** hid_windows.c 19 Dec 2005 20:40:31 -0000 1.1 --- hid_windows.c 27 May 2006 00:57:15 -0000 1.2 *************** *** 73,77 **** t_int hid_print_element_list(t_hid *x) { ! DEBUG(post("hid_print_element_list"););
--- 73,77 ---- t_int hid_print_element_list(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_print_element_list");
*************** *** 249,253 **** t_int hid_get_events(t_hid *x) { ! //DEBUG(post("hid_get_events"););
return (0); --- 249,253 ---- t_int hid_get_events(t_hid *x) { ! //debug_print(LOG_DEBUG,"hid_get_events");
return (0); *************** *** 257,261 **** t_int hid_open_device(t_hid *x, t_int device_number) { ! DEBUG(post("hid_open_device");); t_int result = 0; --- 257,261 ---- t_int hid_open_device(t_hid *x, t_int device_number) { ! debug_print(LOG_DEBUG,"hid_open_device"); t_int result = 0; *************** *** 267,271 **** t_int hid_close_device(t_hid *x) { ! DEBUG(post("hid_close_device"););
t_int result = 0; --- 267,271 ---- t_int hid_close_device(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_close_device");
t_int result = 0; *************** *** 277,281 **** t_int hid_build_device_list(t_hid *x) { ! DEBUG(post("hid_build_device_list");); /* --- 277,281 ---- t_int hid_build_device_list(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_build_device_list"); /* *************** *** 322,326 **** 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) --- 322,326 ---- void hid_platform_specific_free(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_platform_specific_free"); /* only call this if the last instance is being freed */ if (hid_instance_count < 1)
Index: Makefile =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/Makefile,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** Makefile 26 May 2006 14:31:28 -0000 1.14 --- Makefile 27 May 2006 00:57:15 -0000 1.15 *************** *** 1,4 **** ! TARGET := `pwd|sed 's|.*/(.*)$|\1|'` ! EXTERNALS_ROOT := `pwd | sed 's|^(/.*externals).*|\1|'`
default: --- 1,4 ---- ! TARGET := $(shell pwd | sed 's|.*/(.*)$$|\1|') ! EXTERNALS_ROOT := $(shell pwd | sed 's|^(/.*externals).*|\1|')
default: *************** *** 11,157 **** make -C $(EXTERNALS_ROOT) $(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 - - ifeq (x$(OS_NAME),x) - default: - @echo no OS_NAME specified - endif - - - #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),windows) - 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) - .SUFFIXES: .pd_darwin - endif - - all: hid.$(EXTENSION) - - .SUFFIXES: .$(EXTENSION) - - # ----------------------- GENERAL --------------------------------------------- - # generic optimization - OPT_FLAGS = -O3 -ffast-math - # G4 optimization on Mac OS X - #OPT_FLAGS = -O3 -mcpu=7400 -maltivec -ffast-math -fPIC - # faster G4 7450 optimization (gives errors) on GNU/Linux - #OPT_FLAGS = -O3 -mcpu=7450 -maltivec -ffast-math -fPIC - # G4 optimization on Mac OS X - #OPT_FLAGS = -O3 -mcpu=7400 -faltivec -ffast-math -fPIC - # faster G4 7450 optimization (gives errors) on Mac OS X - #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: - test -f ./HID\ Utilities\ Source/build/libHIDUtilities.a || \ - ( 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)" --- 11,15 ---- make -C $(EXTERNALS_ROOT) $(TARGET)_clean
test_locations: ! make -C $(EXTERNALS_ROOT) test_locations !
Index: hid.h =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** hid.h 25 Jan 2006 08:40:35 -0000 1.19 --- hid.h 27 May 2006 00:57:15 -0000 1.20 *************** *** 3,6 **** --- 3,7 ----
#include <stdio.h> + #include <sys/syslog.h>
#include <m_pd.h> *************** *** 13,17 ****
#define HID_MAJOR_VERSION 0 ! #define HID_MINOR_VERSION 6
/* static char *version = "$Revision$"; */ --- 14,18 ----
#define HID_MAJOR_VERSION 0 ! #define HID_MINOR_VERSION 7
/* static char *version = "$Revision$"; */ *************** *** 22,36 **** typedef struct _hid { ! t_object x_obj; ! t_int x_fd; ! t_int x_device_number; ! 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_device_name_outlet; } t_hid;
--- 23,40 ---- typedef struct _hid { ! t_object x_obj; ! t_int x_fd; ! // unsigned short x_device_number; ! t_float 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_device_name_outlet; } t_hid;
*************** *** 53,56 **** --- 57,61 ---- t_int hid_instance_count;
+ extern unsigned short global_debug_level;
/*------------------------------------------------------------------------------ *************** *** 59,86 ****
/* support functions */ ! void hid_output_event( t_hid *x, char *type, char *code, t_float value );
/* generic, cross-platform functions implemented in a separate file for each * platform */ ! 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_print( t_hid* x ); ! void hid_platform_specific_free( t_hid *x );
/* cross-platform force feedback functions */ ! t_int hid_ff_autocenter( t_hid *x, t_float value ); ! t_int hid_ff_gain( t_hid *x, t_float value ); ! t_int hid_ff_motors( t_hid *x, t_float value ); ! t_int hid_ff_continue( t_hid *x ); ! t_int hid_ff_pause( t_hid *x ); ! t_int hid_ff_reset( t_hid *x ); ! t_int hid_ff_stopall( t_hid *x );
// these are just for testing... ! t_int hid_ff_fftest ( t_hid *x, t_float value); ! void hid_ff_print( t_hid *x );
--- 64,97 ----
/* support functions */ ! void debug_print(t_int debug_level, const char *fmt, ...); ! void debug_error(t_hid *x, t_int debug_level, const char *fmt, ...); ! void hid_output_event(t_hid *x, char *type, char *code, t_float value);
/* generic, cross-platform functions implemented in a separate file for each * platform */ ! t_int hid_open_device(t_hid *x, t_int device_number); ! t_int hid_close_device(t_hid *x); ! void hid_build_device_list(void); ! t_int hid_get_events(t_hid *x); ! void hid_print(t_hid* x); ! void hid_platform_specific_free(t_hid *x); ! t_int get_device_number_by_ids(unsigned short vendor_id, unsigned short product_id); ! t_int get_device_number_from_usage_list(t_int device_number, ! unsigned short usage_page, unsigned short usage); !
/* cross-platform force feedback functions */ ! t_int hid_ff_autocenter(t_hid *x, t_float value); ! t_int hid_ff_gain(t_hid *x, t_float value); ! t_int hid_ff_motors(t_hid *x, t_float value); ! t_int hid_ff_continue(t_hid *x); ! t_int hid_ff_pause(t_hid *x); ! t_int hid_ff_reset(t_hid *x); ! t_int hid_ff_stopall(t_hid *x);
// these are just for testing... ! t_int hid_ff_fftest (t_hid *x, t_float value); ! void hid_ff_print(t_hid *x);
Index: mouse.pd =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/mouse.pd,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** mouse.pd 10 Jun 2005 20:16:45 -0000 1.6 --- mouse.pd 27 May 2006 00:57:15 -0000 1.7 *************** *** 1,3 **** ! #N canvas 212 125 775 600 10; #X obj 130 18 inlet; #X obj 25 521 outlet; --- 1,3 ---- ! #N canvas 212 125 783 608 10; #X obj 130 18 inlet; #X obj 25 521 outlet; *************** *** 38,42 **** #X text 41 489 zero when no motion; #X obj 43 48 loadbang; - #X msg 43 71 25; #X obj 213 401 delay; #X obj 207 444 metro; --- 38,41 ---- *************** *** 51,54 **** --- 50,54 ---- #X obj 108 378 * 2; #X obj 258 378 * 2; + #X msg 43 71 5; #X connect 0 0 28 0; #X connect 6 0 5 0; *************** *** 58,62 **** #X connect 14 0 13 0; #X connect 15 0 1 0; ! #X connect 15 0 43 0; #X connect 16 0 2 0; #X connect 16 0 33 0; --- 58,62 ---- #X connect 14 0 13 0; #X connect 15 0 1 0; ! #X connect 15 0 42 0; #X connect 16 0 2 0; #X connect 16 0 33 0; *************** *** 71,94 **** #X connect 28 1 20 0; #X connect 29 0 20 0; ! #X connect 31 0 49 0; #X connect 32 0 29 0; ! #X connect 33 0 38 0; ! #X connect 33 0 41 0; #X connect 34 0 1 0; ! #X connect 36 0 37 0; ! #X connect 37 0 30 0; ! #X connect 38 0 40 0; ! #X connect 39 0 27 0; ! #X connect 40 0 39 0; ! #X connect 41 0 39 0; ! #X connect 42 0 48 0; ! #X connect 43 0 44 0; ! #X connect 43 0 47 0; ! #X connect 44 0 46 0; ! #X connect 45 0 34 0; ! #X connect 46 0 45 0; ! #X connect 47 0 45 0; ! #X connect 48 0 44 1; ! #X connect 48 0 45 1; ! #X connect 49 0 38 1; ! #X connect 49 0 39 1; --- 71,94 ---- #X connect 28 1 20 0; #X connect 29 0 20 0; ! #X connect 31 0 48 0; #X connect 32 0 29 0; ! #X connect 33 0 37 0; ! #X connect 33 0 40 0; #X connect 34 0 1 0; ! #X connect 36 0 49 0; ! #X connect 37 0 39 0; ! #X connect 38 0 27 0; ! #X connect 39 0 38 0; ! #X connect 40 0 38 0; ! #X connect 41 0 47 0; ! #X connect 42 0 43 0; ! #X connect 42 0 46 0; ! #X connect 43 0 45 0; ! #X connect 44 0 34 0; ! #X connect 45 0 44 0; ! #X connect 46 0 44 0; ! #X connect 47 0 43 1; ! #X connect 47 0 44 1; ! #X connect 48 0 37 1; ! #X connect 48 0 38 1; ! #X connect 49 0 30 0;
Index: hid_darwin.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_darwin.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** hid_darwin.c 10 Jun 2005 20:17:42 -0000 1.18 --- hid_darwin.c 27 May 2006 00:57:15 -0000 1.19 *************** *** 64,68 ****
/*============================================================================== ! * FUNCTION PROTOTYPES *============================================================================== */ --- 64,68 ----
/*============================================================================== ! h * FUNCTION PROTOTYPES *============================================================================== */ *************** *** 97,101 **** void convertDarwinElementToLinuxTypeCode(pRecElement element, char *linux_type, char *linux_code) { ! t_int button_offset = 0;
switch(element->type) --- 97,101 ---- void convertDarwinElementToLinuxTypeCode(pRecElement element, char *linux_type, char *linux_code) { ! // t_int button_offset = 0;
switch(element->type) *************** *** 203,206 **** --- 203,261 ---- }
+ t_int get_device_number_by_ids(unsigned short vendor_id, unsigned short product_id) + { + return(1); + } + + t_int get_device_number_from_usage_list(t_int device_number, + unsigned short usage_page, unsigned short usage) + { + debug_print(LOG_DEBUG,"get_device_number_from_usage_list"); + + pRecDevice pCurrentHIDDevice; + t_int i; + t_int device_count; + t_int total_devices = 0; + char cstrDeviceName[MAXPDSTRING]; + + if( !HIDHaveDeviceList() ) hid_build_device_list(); + + pCurrentHIDDevice = HIDGetFirstDevice(); + while(pCurrentHIDDevice != NULL) + { + if( (pCurrentHIDDevice->usagePage == usage_page) && + (pCurrentHIDDevice->usage == usage) ) + { + ++total_devices; + } + pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice); + } + i = total_devices; + device_count = HIDCountDevices(); + debug_print(LOG_DEBUG,"[hid] %d is less than %d",i,device_number); + pCurrentHIDDevice = HIDGetFirstDevice(); + while( (pCurrentHIDDevice != NULL) && (i > device_number) ) + { + debug_print(LOG_DEBUG,"[hid] %d: %d == %d %d == %d",i, + pCurrentHIDDevice->usagePage, + usage_page, + pCurrentHIDDevice->usage, + usage); + device_count--; + if( (pCurrentHIDDevice->usagePage == usage_page) && + (pCurrentHIDDevice->usage == usage) ) + { + i--; + HIDGetUsageName(pCurrentHIDDevice->usagePage, + pCurrentHIDDevice->usage, + cstrDeviceName); + debug_print(LOG_DEBUG,"[hid]: found a %s at %d: %s %s",cstrDeviceName,i, + pCurrentHIDDevice->manufacturer,pCurrentHIDDevice->product); + } + pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice); + } + return(device_count); + } +
void hid_build_element_list(t_hid *x) *************** *** 211,215 **** t_int hid_print_element_list(t_hid *x) { ! DEBUG(post("hid_print_element_list"););
UInt32 i; --- 266,270 ---- t_int hid_print_element_list(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_print_element_list");
UInt32 i; *************** *** 265,269 **** void hid_ff_print( t_hid *x ) { ! DEBUG(post("hid_ff_print");); HRESULT result; UInt32 value; --- 320,324 ---- void hid_ff_print( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_print"); HRESULT result; UInt32 value; *************** *** 292,296 **** char cstrDeviceName [256]; t_int i,numdevs; ! UInt32 usagePage, usage; pRecDevice pCurrentHIDDevice = NULL;
--- 347,351 ---- char cstrDeviceName [256]; t_int i,numdevs; ! // UInt32 usagePage, usage; pRecDevice pCurrentHIDDevice = NULL;
*************** *** 304,317 **** { 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); ! DEBUG(post(" vendorID: %d productID: %d locID: %d", pCurrentHIDDevice->vendorID, pCurrentHIDDevice->productID, ! pCurrentHIDDevice->locID);); } post(""); --- 359,379 ---- { pCurrentHIDDevice = hid_get_device_by_number(i); ! debug_print(LOG_INFO,"Device %d: '%s' '%s' version %d", ! i, ! pCurrentHIDDevice->manufacturer, ! pCurrentHIDDevice->product, ! pCurrentHIDDevice->version); //usage ! HIDGetUsageName(pCurrentHIDDevice->usagePage, pCurrentHIDDevice->usage, cstrDeviceName); ! debug_print(LOG_INFO,"\t\tcstrDeviceName: %s",cstrDeviceName); ! debug_print(LOG_INFO,"\t\tusage page: 0x%04x\tusage: 0x%04x", ! pCurrentHIDDevice->usagePage, ! pCurrentHIDDevice->usage); ! debug_print(LOG_INFO,"\t\tvendorID: 0x%04x\tproductID: 0x%04x\tlocID: 0x%08x", pCurrentHIDDevice->vendorID, pCurrentHIDDevice->productID, ! pCurrentHIDDevice->locID); } post(""); *************** *** 322,326 **** { char *device_name; ! t_symbol *device_name_symbol;
device_name = malloc( strlen(manufacturer) + 1 + strlen(product) + 1 ); --- 384,388 ---- { char *device_name; ! // t_symbol *device_name_symbol;
device_name = malloc( strlen(manufacturer) + 1 + strlen(product) + 1 ); *************** *** 345,349 **** t_int hid_ff_autocenter(t_hid *x, t_float value) { ! DEBUG(post("hid_ff_autocenter");); HRESULT result; UInt32 autocenter_value; --- 407,411 ---- t_int hid_ff_autocenter(t_hid *x, t_float value) { ! debug_print(LOG_DEBUG,"hid_ff_autocenter"); HRESULT result; UInt32 autocenter_value; *************** *** 369,373 **** t_int hid_ff_gain(t_hid *x, t_float value) { ! DEBUG(post("hid_ff_gain");); HRESULT result; UInt32 ffgain_value; --- 431,435 ---- t_int hid_ff_gain(t_hid *x, t_float value) { ! debug_print(LOG_DEBUG,"hid_ff_gain"); HRESULT result; UInt32 ffgain_value; *************** *** 409,413 **** t_int hid_ff_continue( t_hid *x ) { ! DEBUG(post("hid_ff_continue");); return( hid_ff_send_ff_command( x, FFSFFC_CONTINUE ) ); } --- 471,475 ---- t_int hid_ff_continue( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_continue"); return( hid_ff_send_ff_command( x, FFSFFC_CONTINUE ) ); } *************** *** 415,419 **** t_int hid_ff_pause( t_hid *x ) { ! DEBUG(post("hid_ff_pause");); return( hid_ff_send_ff_command( x, FFSFFC_PAUSE ) ); } --- 477,481 ---- t_int hid_ff_pause( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_pause"); return( hid_ff_send_ff_command( x, FFSFFC_PAUSE ) ); } *************** *** 421,425 **** t_int hid_ff_reset( t_hid *x ) { ! DEBUG(post("hid_ff_reset");); return( hid_ff_send_ff_command( x, FFSFFC_RESET ) ); } --- 483,487 ---- t_int hid_ff_reset( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_reset"); return( hid_ff_send_ff_command( x, FFSFFC_RESET ) ); } *************** *** 427,431 **** t_int hid_ff_setactuatorsoff( t_hid *x ) { ! DEBUG(post("hid_ff_setactuatorsoff");); return( hid_ff_send_ff_command( x, FFSFFC_SETACTUATORSOFF ) ); } --- 489,493 ---- t_int hid_ff_setactuatorsoff( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_setactuatorsoff"); return( hid_ff_send_ff_command( x, FFSFFC_SETACTUATORSOFF ) ); } *************** *** 433,437 **** t_int hid_ff_setactuatorson( t_hid *x ) { ! DEBUG(post("hid_ff_setactuatorson");); return( hid_ff_send_ff_command( x, FFSFFC_SETACTUATORSON ) ); } --- 495,499 ---- t_int hid_ff_setactuatorson( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_setactuatorson"); return( hid_ff_send_ff_command( x, FFSFFC_SETACTUATORSON ) ); } *************** *** 439,443 **** t_int hid_ff_stopall( t_hid *x ) { ! DEBUG(post("hid_ff_stopall");); return( hid_ff_send_ff_command( x, FFSFFC_STOPALL ) ); } --- 501,505 ---- t_int hid_ff_stopall( t_hid *x ) { ! debug_print(LOG_DEBUG,"hid_ff_stopall"); return( hid_ff_send_ff_command( x, FFSFFC_STOPALL ) ); } *************** *** 462,466 **** t_int hid_ff_fftest ( t_hid *x, t_float value) { ! DEBUG(post("hid_get_events");); return( 0 ); --- 524,528 ---- t_int hid_ff_fftest ( t_hid *x, t_float value) { ! debug_print(LOG_DEBUG,"hid_get_events"); return( 0 ); *************** *** 473,477 **** t_int hid_get_events(t_hid *x) { ! //DEBUG(post("hid_get_events"););
SInt32 value; --- 535,539 ---- t_int hid_get_events(t_hid *x) { ! //debug_print(LOG_DEBUG,"hid_get_events");
SInt32 value; *************** *** 482,489 **** char code[256]; char event_output_string[256]; ! t_atom event_data[4];
int event_counter = 0; ! Boolean result;
pCurrentHIDDevice = hid_get_device_by_number(x->x_device_number); --- 544,551 ---- char code[256]; char event_output_string[256]; ! // t_atom event_data[4];
int event_counter = 0; ! // Boolean result;
pCurrentHIDDevice = hid_get_device_by_number(x->x_device_number); *************** *** 624,649 **** t_int hid_open_device(t_hid *x, t_int device_number) { ! DEBUG(post("hid_open_device"););
t_int result = 0; pRecDevice pCurrentHIDDevice = NULL;
! io_service_t hidDevice = NULL; FFDeviceObjectReference ffDeviceReference = NULL;
/* rebuild device list to make sure the list is current */ ! if ( ! HIDHaveDeviceList() ) ! { ! result = (t_int) HIDBuildDeviceList (NULL, NULL); ! // returns false if no device found ! if(result) ! { ! error("[hid]: no HID devices found\n"); ! return(result); ! } ! } pCurrentHIDDevice = hid_get_device_by_number(device_number); ! if ( ! HIDIsValidDevice(pCurrentHIDDevice) ) { error("[hid]: device %d is not a valid device\n",device_number); --- 686,702 ---- t_int hid_open_device(t_hid *x, t_int device_number) { ! debug_print(LOG_DEBUG,"hid_open_device");
t_int result = 0; pRecDevice pCurrentHIDDevice = NULL;
! io_service_t hidDevice = 0; FFDeviceObjectReference ffDeviceReference = NULL;
/* rebuild device list to make sure the list is current */ ! if( !HIDHaveDeviceList() ) hid_build_device_list(); pCurrentHIDDevice = hid_get_device_by_number(device_number); ! if( ! HIDIsValidDevice(pCurrentHIDDevice) ) { error("[hid]: device %d is not a valid device\n",device_number); *************** *** 659,666 ****
hidDevice = AllocateHIDObjectFromRecDevice( pCurrentHIDDevice ); ! if ( FFIsForceFeedback(hidDevice) == FF_OK ) { post("\tdevice has Force Feedback support"); ! if ( FFCreateDevice(hidDevice,&ffDeviceReference) == FF_OK ) { x->x_has_ff = 1; --- 712,719 ----
hidDevice = AllocateHIDObjectFromRecDevice( pCurrentHIDDevice ); ! if( FFIsForceFeedback(hidDevice) == FF_OK ) { post("\tdevice has Force Feedback support"); ! if( FFCreateDevice(hidDevice,&ffDeviceReference) == FF_OK ) { x->x_has_ff = 1; *************** *** 685,689 **** t_int hid_close_device(t_hid *x) { ! DEBUG(post("hid_close_device"););
t_int result = 0; --- 738,742 ---- t_int hid_close_device(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_close_device");
t_int result = 0; *************** *** 691,695 ****
HIDDequeueDevice(pCurrentHIDDevice); ! // this doesn't seem to be needed at all // result = HIDCloseReleaseInterface(pCurrentHIDDevice); --- 744,748 ----
HIDDequeueDevice(pCurrentHIDDevice); ! // this doesn't seem to be needed at all, but why not use it? // result = HIDCloseReleaseInterface(pCurrentHIDDevice); *************** *** 698,724 ****
! t_int hid_build_device_list(t_hid *x) { ! DEBUG(post("hid_build_device_list");); ! ! pRecDevice pCurrentHIDDevice; ! t_atom device_name_atoms[2]; ! ! // returns false if no device found ! if(HIDBuildDeviceList (NULL, NULL)) ! error("[hid]: no HID devices found\n"); ! ! /* send the [options( msg to set the [hid_menu] to blank */ ! outlet_anything( x->x_device_name_outlet, gensym( "options" ),0,NULL );
! pCurrentHIDDevice = HIDGetFirstDevice(); ! while ( pCurrentHIDDevice != NULL ) ! { ! hid_output_device_name( x, pCurrentHIDDevice->manufacturer, ! pCurrentHIDDevice->product ); ! pCurrentHIDDevice = HIDGetNextDevice(pCurrentHIDDevice); ! } ! ! return (0); }
--- 751,762 ----
! void hid_build_device_list(void) { ! debug_print(LOG_DEBUG,"hid_build_device_list");
! debug_print(LOG_WARNING,"[hid] Building device list..."); ! if(HIDBuildDeviceList (0, 0)) ! post("[hid]: no HID devices found\n"); ! debug_print(LOG_WARNING,"[hid] completed device list."); }
*************** *** 738,742 **** 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) --- 776,780 ---- void hid_platform_specific_free(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_platform_specific_free"); /* only call this if the last instance is being freed */ if (hid_instance_count < 1)
Index: hid_linux.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/hid_linux.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** hid_linux.c 6 Apr 2006 16:50:42 -0000 1.14 --- hid_linux.c 27 May 2006 00:57:15 -0000 1.15 *************** *** 133,137 **** void hid_print_element_list(t_hid *x) { ! DEBUG(post("hid_print_element_list");); unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; // char event_type_string[256]; --- 133,137 ---- void hid_print_element_list(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_print_element_list"); unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; // char event_type_string[256]; *************** *** 253,257 **** void hid_print_device_list(void) { ! DEBUG(post("hid_print_device_list");); int i,fd; char device_output_string[256] = "Unknown"; --- 253,257 ---- void hid_print_device_list(void) { ! debug_print(LOG_DEBUG,"hid_print_device_list"); int i,fd; char device_output_string[256] = "Unknown"; *************** *** 351,355 **** 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 */ --- 351,355 ---- t_int hid_get_events(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_get_events");
/* for debugging, counts how many events are processed each time hid_read() is called */ *************** *** 412,416 **** t_int hid_open_device(t_hid *x, t_int device_number) { ! DEBUG(post("hid_open_device"););
char device_name[256] = "Unknown"; --- 412,416 ---- t_int hid_open_device(t_hid *x, t_int device_number) { ! debug_print(LOG_DEBUG,"hid_open_device");
char device_name[256] = "Unknown"; *************** *** 454,458 **** t_int hid_close_device(t_hid *x) { ! DEBUG(post("hid_close_device");); if (x->x_fd <0) return 0; --- 454,458 ---- t_int hid_close_device(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_close_device"); if (x->x_fd <0) return 0; *************** *** 463,467 **** t_int hid_build_device_list(t_hid *x) { ! DEBUG(post("hid_build_device_list");); /* the device list should be refreshed here */ /* --- 463,467 ---- t_int hid_build_device_list(t_hid *x) { ! debug_print(LOG_DEBUG,"hid_build_device_list"); /* the device list should be refreshed here */ /*
Index: TODO =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/hid/TODO,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** TODO 27 Jun 2005 00:27:53 -0000 1.20 --- TODO 27 May 2006 00:57:15 -0000 1.21 *************** *** 1,2 **** --- 1,13 ---- + + + + TODO: make open functions: + + device number + vendor_id product_id + Product String + + + ============================================================================== = test verbose names *************** *** 24,38 ****
============================================================================== ! = make fake names in input_arrays.c
! Instead of having "NULL" names, make up names using the event type, and the ! code number, i.e. abs_41, rel_15
============================================================================== ! = check out GDAM HID implementation
- - GDAM has a HID Manager implementation and probably a Linux one too
--- 35,59 ----
============================================================================== ! = hid/serial
! - open/close status outlet ! ! - [send ( to send data
+ - [tgl] 1/0 for open/close
============================================================================== ! = linux input synch events (EV_SYN) ! ! - these seem to be generated by the Linux kernel, so they probably don't fit ! in with the [hid] scheme. Probably the best thing is to ditch them, or ! figure out whether they should be used in controlling the flow of event ! data, as they are intended. ! ! ! ============================================================================== ! = open/close status outlet
*************** *** 40,45 **** = profile [hid] object and usage
! - find out how much more CPU the names (btn_?, abs, rel, etc) use over using ! just floats.
--- 61,66 ---- = profile [hid] object and usage
! - find out if [autoscale] takes a lot of CPU power, or where in [hid] is using ! CPU where it doesn't have to be
*************** *** 57,60 **** --- 78,87 ----
+ ============================================================================== + = device 0 gets events for all available devices + + - it might be useful to have device #0 open all available devices and output + the events. +
============================================================================== *************** *** 87,97 **** - most functions probably do not need return values
- - return (1) seems to be the default on many functions -
============================================================================== = control input messages
! - are [poll(, [start(, and [stop( needed? is 0/1/del# enough?
--- 114,122 ---- - most functions probably do not need return values
============================================================================== = control input messages
! - are [poll(, [start(, and [stop( needed? is 0/1/delay# enough?
*************** *** 105,109 **** = event name changes
! - make key/button Type btn rather than key (undecided on this one)
--- 130,134 ---- = event name changes
! - make key/button Type "button" rather than "key" (undecided on this one)
*************** *** 120,130 ****
============================================================================== - = device 0 gets events for all available devices - - - it might be useful to have device #0 open all available devices and output - the events. - - - ============================================================================== = figure out whole degree issue
--- 145,148 ---- *************** *** 161,164 **** --- 179,187 ---- http://www.2dcurves.com
+ ============================================================================== + = check out using USB timestamp + + - use the USB timestamp to correctly space the output data +
/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\ *************** *** 169,172 **** --- 192,202 ----
______________________________________________________________________________ + - BUG: figure out how to prevent segfaults on mismapped devices/elements + + - it should gracefully ignore things where it currently segfaults + + - looks like its in build_device_list + + ______________________________________________________________________________ - BUG: multiple instances pointing to the same device don't have seperate close/free
*************** *** 185,188 **** --- 215,220 ---- access. It must since its used with games.
+ - turn off/unlink mousepointer for that device? +
______________________________________________________________________________