aboutsummaryrefslogtreecommitdiff
path: root/hid_linux.c
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2004-11-15 04:05:39 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2004-11-15 04:05:39 +0000
commit742e122ef16d2538803a3d40596ca9bd4b3f2112 (patch)
tree83c42d6f1ccf1025ad59e2649fc4633a51d27722 /hid_linux.c
parentcb245d85d24a739ae72eebae78c3959ec42b3695 (diff)
converted button codes to a numbered scheme; added [buttongate]
svn path=/trunk/externals/hcs/hid/; revision=2275
Diffstat (limited to 'hid_linux.c')
-rw-r--r--hid_linux.c139
1 files changed, 116 insertions, 23 deletions
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__ */