From 923e18b2face0b0b0f13e202a894be56242fe4e0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 28 Nov 2004 01:27:47 +0000 Subject: fixed a number of annoying bugs in MacOS X; cleaned up code; now multiple [hid]s work at the same time svn path=/trunk/externals/hcs/hid/; revision=2329 --- hid_linux.c | 241 +++++++++++++++++++++++++++++++----------------------------- 1 file changed, 125 insertions(+), 116 deletions(-) (limited to 'hid_linux.c') diff --git a/hid_linux.c b/hid_linux.c index 74b80cc..90fb6ad 100644 --- a/hid_linux.c +++ b/hid_linux.c @@ -42,7 +42,123 @@ /* LINUX-SPECIFIC SUPPORT FUNCTIONS */ /* ============================================================================== */ -void hid_list_devices(void) +void hid_print_element_list(t_hid *x) +{ + unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; + char devicename[256] = "Unknown"; + t_int event_type, event_code; + char *event_type_name = ""; + /* counts for various event types */ + t_int synCount,keyCount,relCount,absCount,mscCount,ledCount,sndCount,repCount,ffCount,pwrCount,ff_statusCount; + + /* get name of device */ + ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); + post ("\nConfiguring device %d as %s (%s)", + x->x_device_number,devicename,device_name); + + /* get bitmask representing supported events (axes, keys, etc.) */ + memset(bitmask, 0, sizeof(bitmask)); + ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); + post("\nSupported events:"); + +/* init all count vars */ + synCount = keyCount = relCount = absCount = mscCount = ledCount = 0; + sndCount = repCount = ffCount = pwrCount = ff_statusCount = 0; + + /* cycle through all possible event types */ + for (event_type = 0; event_type < EV_MAX; event_type++) + { + if (test_bit(event_type, bitmask[0])) + { + /* make pretty names for event types */ + switch(event_type) + { + 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) ", 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\tCODE\tEVENT NAME"); + post("-----------------------------------------------------------"); + + /* cycle through all possible event codes (axes, keys, etc.) + * testing to see which are supported + */ + for (event_code = 0; event_code < KEY_MAX; event_code++) + { + if (test_bit(event_code, bitmask[event_type])) + { + 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%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 + * from "Reset" events to "Syncronization" events + */ +#ifdef EV_RST + case EV_RST: synCount++; break; +#else + case EV_SYN: synCount++; break; +#endif + case EV_KEY: keyCount++; break; + case EV_REL: relCount++; break; + case EV_ABS: absCount++; break; + case EV_MSC: mscCount++; break; + case EV_LED: ledCount++; break; + case EV_SND: sndCount++; break; + case EV_REP: repCount++; break; + case EV_FF: ffCount++; break; + case EV_PWR: pwrCount++; break; + case EV_FF_STATUS: ff_statusCount++; break; + } + } + } + } + } + + post("\nDetected:"); + if (synCount > 0) post (" %d Sync types",synCount); + if (keyCount > 0) post (" %d Key/Button types",keyCount); + if (relCount > 0) post (" %d Relative Axis types",relCount); + if (absCount > 0) post (" %d Absolute Axis types",absCount); + if (mscCount > 0) post (" %d Misc types",mscCount); + if (ledCount > 0) post (" %d LED types",ledCount); + if (sndCount > 0) post (" %d System Sound types",sndCount); + if (repCount > 0) post (" %d Key Repeat types",repCount); + if (ffCount > 0) post (" %d Force Feedback types",ffCount); + if (pwrCount > 0) post (" %d Power types",pwrCount); + if (ff_statusCount > 0) post (" %d Force Feedback types",ff_statusCount); +} + + +void hid_print_device_list(void) { int i,fd; char device_output_string[256] = "Unknown"; @@ -138,26 +254,26 @@ t_int hid_get_events(t_hid *x) DEBUG(++event_counter;); } DEBUG( - if (event_counter > 0) - post("output %d events",event_counter); + //if (event_counter > 0) + //post("output %d events",event_counter); ); return (0); } +void hid_print(t_hid* x) +{ + hid_print_device_list(); +} + + t_int hid_open_device(t_hid *x, t_int device_number) { DEBUG(post("hid_open_device");); 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_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; @@ -181,111 +297,6 @@ t_int hid_open_device(t_hid *x, t_int device_number) * It seems that is just there to flush the input event queue */ while (read (x->x_fd, &(hid_input_event), sizeof(struct input_event)) > -1); - - /* get name of device */ - ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); - post ("\nConfiguring device %d as %s (%s)", - x->x_device_number,devicename,device_name); - - /* get bitmask representing supported events (axes, keys, etc.) */ - memset(bitmask, 0, sizeof(bitmask)); - ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); - post("\nSupported events:"); - -/* init all count vars */ - synCount = keyCount = relCount = absCount = mscCount = ledCount = 0; - sndCount = repCount = ffCount = pwrCount = ff_statusCount = 0; - - /* cycle through all possible event types */ - for (event_type = 0; event_type < EV_MAX; event_type++) - { - if (test_bit(event_type, bitmask[0])) - { - /* make pretty names for event types */ - switch(event_type) - { - 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) ", 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\tCODE\tEVENT NAME"); - post("-----------------------------------------------------------"); - - /* cycle through all possible event codes (axes, keys, etc.) - * testing to see which are supported - */ - for (event_code = 0; event_code < KEY_MAX; event_code++) - { - if (test_bit(event_code, bitmask[event_type])) - { - 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%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 - * from "Reset" events to "Syncronization" events - */ -#ifdef EV_RST - case EV_RST: synCount++; break; -#else - case EV_SYN: synCount++; break; -#endif - case EV_KEY: keyCount++; break; - case EV_REL: relCount++; break; - case EV_ABS: absCount++; break; - case EV_MSC: mscCount++; break; - case EV_LED: ledCount++; break; - case EV_SND: sndCount++; break; - case EV_REP: repCount++; break; - case EV_FF: ffCount++; break; - case EV_PWR: pwrCount++; break; - case EV_FF_STATUS: ff_statusCount++; break; - } - } - } - } - } - - post("\nDetected:"); - if (synCount > 0) post (" %d Sync types",synCount); - if (keyCount > 0) post (" %d Key/Button types",keyCount); - if (relCount > 0) post (" %d Relative Axis types",relCount); - if (absCount > 0) post (" %d Absolute Axis types",absCount); - if (mscCount > 0) post (" %d Misc types",mscCount); - if (ledCount > 0) post (" %d LED types",ledCount); - if (sndCount > 0) post (" %d System Sound types",sndCount); - if (repCount > 0) post (" %d Key Repeat types",repCount); - if (ffCount > 0) post (" %d Force Feedback types",ffCount); - if (pwrCount > 0) post (" %d Power types",pwrCount); - if (ff_statusCount > 0) post (" %d Force Feedback types",ff_statusCount); return (0); } @@ -313,8 +324,6 @@ t_int hid_build_device_list(t_hid *x) * the current t_float, then this will probably need to be changed. */ - hid_list_devices(); - return (0); } -- cgit v1.2.1