From 742e122ef16d2538803a3d40596ca9bd4b3f2112 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 15 Nov 2004 04:05:39 +0000 Subject: converted button codes to a numbered scheme; added [buttongate] svn path=/trunk/externals/hcs/hid/; revision=2275 --- hid_linux.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 116 insertions(+), 23 deletions(-) (limited to 'hid_linux.c') diff --git a/hid_linux.c b/hid_linux.c index 9b86fec..eb1613a 100644 --- a/hid_linux.c +++ b/hid_linux.c @@ -37,6 +37,66 @@ * which would be very annoying. */ + +/* ============================================================================== */ +/* LINUX-SPECIFIC SUPPORT FUNCTIONS */ +/* ============================================================================== */ + +void hid_list_devices(void) +{ + int i,fd; + char device_output_string[256] = "Unknown"; + char device_name[20] = "/dev/input/event0"; + + post(""); + for (i=0;i<128;++i) + { + sprintf(device_name,"/dev/input/event%d",i); + if (device_name) + { + /* open the device read-only, non-exclusive */ + fd = open (device_name, O_RDONLY | O_NONBLOCK); + /* test if device open */ + if (fd < 0 ) + { + fd = -1; + } + else + { + /* get name of device */ + ioctl(fd, EVIOCGNAME(sizeof(device_output_string)), device_output_string); + post("Device %d: '%s' on '%s'", i, device_output_string, device_name); + + close (fd); + } + } + } + post(""); +} + +void hid_convert_linux_buttons_to_numbers(__u16 linux_code, char *hid_code) +{ + if(linux_code >= 0x100) + { + if(linux_code < BTN_MOUSE) + sprintf(hid_code,"btn_%d",linux_code - BTN_MISC); /* numbered buttons */ + else if(linux_code < BTN_JOYSTICK) + sprintf(hid_code,"btn_%d",linux_code - BTN_MOUSE); /* mouse buttons */ + else if(linux_code < BTN_GAMEPAD) + sprintf(hid_code,"btn_%d",linux_code - BTN_JOYSTICK); /* joystick buttons */ + else if(linux_code < BTN_DIGI) + sprintf(hid_code,"btn_%d",linux_code - BTN_GAMEPAD); /* gamepad buttons */ + else if(linux_code < BTN_WHEEL) + sprintf(hid_code,"btn_%d",linux_code - BTN_DIGI); /* tablet buttons */ + else if(linux_code < KEY_OK) + sprintf(hid_code,"btn_%d",linux_code - BTN_WHEEL); /* wheel buttons */ + } +} + +/* ============================================================================== */ +/* Pd [hid] FUNCTIONS */ +/* ============================================================================== */ + t_int hid_get_events(t_hid *x) { DEBUG(post("hid_get_events");); @@ -60,7 +120,16 @@ t_int hid_get_events(t_hid *x) /* type */ SETSYMBOL(event_data, gensym(ev[hid_input_event.type])); /* code */ - SETSYMBOL(event_data + 1, gensym(event_names[hid_input_event.type][hid_input_event.code])); + if (hid_input_event.type == EV_KEY) + { + char hid_code[7]; + hid_convert_linux_buttons_to_numbers(hid_input_event.code,hid_code); + SETSYMBOL(event_data + 1, + gensym(hid_code)); + } + else + SETSYMBOL(event_data + 1, + gensym(event_names[hid_input_event.type][hid_input_event.code])); /* value */ SETFLOAT(event_data + 2, (t_float)hid_input_event.value); /* time */ @@ -81,29 +150,28 @@ t_int hid_open_device(t_hid *x, t_int device_number) { DEBUG(post("hid_open_device");); - char arg[20]; + char device_name[20]; struct input_event hid_input_event; unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; char devicename[256] = "Unknown"; t_int event_type, event_code; - char *event_typeName = ""; + char *event_type_name = ""; /* counts for various event types */ t_int synCount,keyCount,relCount,absCount,mscCount,ledCount,sndCount,repCount,ffCount,pwrCount,ff_statusCount; x->x_fd = -1; x->x_device_number = device_number; - sprintf(arg,"/dev/input/event%d",x->x_device_number); - x->x_devname = gensym(arg); + sprintf(device_name,"/dev/input/event%d",x->x_device_number); - if (x->x_devname) + if (device_name) { /* open the device read-only, non-exclusive */ - x->x_fd = open(x->x_devname->s_name, O_RDONLY | O_NONBLOCK); + x->x_fd = open(device_name, O_RDONLY | O_NONBLOCK); /* test if device open */ if (x->x_fd < 0 ) { - error("[hid] open %s failed",x->x_devname->s_name); + error("[hid] open %s failed",device_name); x->x_fd = -1; return 1; } @@ -117,7 +185,7 @@ t_int hid_open_device(t_hid *x, t_int device_number) /* get name of device */ ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); post ("\nConfiguring device %d as %s (%s)", - x->x_device_number,devicename,x->x_devname->s_name); + x->x_device_number,devicename,device_name); /* get bitmask representing supported events (axes, keys, etc.) */ memset(bitmask, 0, sizeof(bitmask)); @@ -136,23 +204,27 @@ t_int hid_open_device(t_hid *x, t_int device_number) /* make pretty names for event types */ switch(event_type) { - case EV_SYN: event_typeName = "Synchronization"; break; - case EV_KEY: event_typeName = "Keys/Buttons"; break; - case EV_REL: event_typeName = "Relative Axes"; break; - case EV_ABS: event_typeName = "Absolute Axes"; break; - case EV_MSC: event_typeName = "Miscellaneous"; break; - case EV_LED: event_typeName = "LEDs"; break; - case EV_SND: event_typeName = "System Sounds"; break; - case EV_REP: event_typeName = "Autorepeat Values"; break; - case EV_FF: event_typeName = "Force Feedback"; break; - case EV_PWR: event_typeName = "Power"; break; - case EV_FF_STATUS: event_typeName = "Force Feedback Status"; break; + case EV_SYN: event_type_name = "Synchronization"; break; + case EV_KEY: event_type_name = "Keys/Buttons"; break; + case EV_REL: event_type_name = "Relative Axis"; break; + case EV_ABS: event_type_name = "Absolute Axis"; break; + case EV_MSC: event_type_name = "Miscellaneous"; break; + case EV_LED: event_type_name = "LEDs"; break; + case EV_SND: event_type_name = "System Sounds"; break; + case EV_REP: event_type_name = "Autorepeat Values"; break; + case EV_FF: event_type_name = "Force Feedback"; break; + case EV_PWR: event_type_name = "Power"; break; + case EV_FF_STATUS: event_type_name = "Force Feedback Status"; break; } - post(" %s (%s/type %d) ", event_typeName, ev[event_type] ? ev[event_type] : "?", event_type); +// post(" %s (%s) ", event_type_name, ev[event_type] ? ev[event_type] : "?", event_type); /* get bitmask representing supported button types */ ioctl(x->x_fd, EVIOCGBIT(event_type, KEY_MAX), bitmask[event_type]); + post(""); + post(" TYPE\t\tCODE\tEVENT NAME"); + post("-----------------------------------------------------------"); + /* cycle through all possible event codes (axes, keys, etc.) * testing to see which are supported */ @@ -160,9 +232,22 @@ t_int hid_open_device(t_hid *x, t_int device_number) { if (test_bit(event_code, bitmask[event_type])) { - post(" %s (%d)", event_names[event_type] ? (event_names[event_type][event_code] ? event_names[event_type][event_code] : "?") : "?", event_code); + if ((event_type == EV_KEY) && (event_code >= BTN_MISC) && (event_code < KEY_OK) ) + { + char hid_code[7]; + hid_convert_linux_buttons_to_numbers(event_code,hid_code); + post(" %s\t\t%s\t%s", + ev[event_type] ? ev[event_type] : "?", + hid_code, + event_names[event_type] ? (event_names[event_type][event_code] ? event_names[event_type][event_code] : "?") : "?"); + } + else + post(" %s\t\t%s\t%s", + ev[event_type] ? ev[event_type] : "?", + event_names[event_type] ? (event_names[event_type][event_code] ? event_names[event_type][event_code] : "?") : "?", + event_type_name); /* post(" Event code %d (%s)", event_code, names[event_type] ? (names[event_type][event_code] ? names[event_type][event_code] : "?") : "?"); */ - + switch(event_type) { /* * the API changed at some point... EV_SYN seems to be the new name @@ -227,9 +312,17 @@ t_int hid_build_device_list(t_hid *x) * the device list. Once the device name can be other things in addition * the current t_float, then this will probably need to be changed. */ + + hid_list_devices(); + return (0); } +void hid_platform_specific_free(t_hid *x) +{ + /* nothing to be done here on GNU/Linux */ +} + #endif /* #ifdef __linux__ */ -- cgit v1.2.1