Skip to content

Commit

Permalink
Fixes
Browse files Browse the repository at this point in the history
- Better detection of number of buttons and axes (thanks @Techwolf)
- Fixed detection of relative axes
- Added a test program to validate basic functionality
  • Loading branch information
janoc committed Oct 11, 2015
1 parent 1054dbc commit 8abce37
Show file tree
Hide file tree
Showing 5 changed files with 142 additions and 56 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
*.o
*.a
ndofdev_test
9 changes: 7 additions & 2 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2015-10-11 Jan Ciger <jan.ciger (at) gmail.com>
* 0.8
- improved detection of number of axes & buttons (thanks @techwolf)
- added a simple test program to verify basic functionality

2015-10-09 Jan Ciger <jan.ciger (at) gmail.com>
* 0.7
- fixed dependency on libexplain that sneaked in in the last version (thanks @techwolf)
Expand All @@ -23,11 +28,11 @@
driver was changed to send EV_ABS events instead of EV_REL. Thanks to Thomax G. thomax23 (at) googlemail.com

2008-08-25 Jan Ciger <jan.ciger (at) gmail.com>
* 0.2
- fixed button support (Do'h!)
- turn the LED on when the SpaceNavigator is opened and off when it is closed

2008-08-20 Jan Ciger <jan.ciger (at) gmail.com>

* 0.1 Initial release
* 0.1 Initial release
9 changes: 7 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
CFLAGS=-pipe -Wall -Wunused-result
CFLAGS=-pipe -Wall -Wunused-result
LDFLAGS=-lSDL

all: libndofdev.a ndofdev_test

libndofdev.a: ndofdev.o
$(AR) -r $@ $<

ndofdev_test: ndofdev_test.o libndofdev.a

clean:
-rm -f *.a *.o
-rm -f *.a *.o ndofdev_test

103 changes: 51 additions & 52 deletions ndofdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
* Evdev could be used for joysticks as well, but higher level logic would have to be
* re-implemented (calibration, filtering, etc.) - SDL includes it already.
*
* Release 0.6
* Release 0.8
*/

#include <linux/input.h>
Expand Down Expand Up @@ -126,7 +126,7 @@ int ndof_init_first(NDOF_Device *in_out_dev, void *param)
)
))
{
printf("Using device: %s\n", fname);
printf("Using evdev device: %s\n", fname);
break;
} else {
close(fd);
Expand All @@ -140,69 +140,68 @@ int ndof_init_first(NDOF_Device *in_out_dev, void *param)
// We have SpaceNavigator, use it
spacenav_fd = fd;

unsigned int axes_count = 6; // default to sane values for these devices
// default to sane values for these devices
unsigned int axes_count = 6;
unsigned int button_count = 32;

// Get the actual number of axes for this device.
int detected_axes_count = 0;

// first absolute axes
unsigned long absbit[NBITS(ABS_MAX)] = { 0 };
if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbit)), absbit) >= 0)
{
printf("getting axis count...\n");
axes_count = 0;

for (i = 0; i < ABS_MISC; ++i) {
/* Skip hats */
if (i == ABS_HAT0X) {
i = ABS_HAT3Y;
continue;
}
if (test_bit(i, absbit)) {
struct input_absinfo absinfo;

if (ioctl(fd, EVIOCGABS(i), &absinfo) < 0) {
continue;
}
printf("Joystick has absolute axis: %x\n", i);
printf("Values = { %d, %d, %d, %d, %d }\n",
absinfo.value, absinfo.minimum, absinfo.maximum,
absinfo.fuzz, absinfo.flat);
axes_count++;
}
}
if (axes_count != 0) {
printf("...found %d axis.\n", axes_count );
} else {
printf("None found, falling back to 6 axes.\n");
axes_count = 6;
}
for (i = 0; i < ABS_MISC; ++i)
{
/* Skip hats */
if (i == ABS_HAT0X)
{
i = ABS_HAT3Y;
continue;
}

if (test_bit(i, absbit))
detected_axes_count++;
}
} else {
perror("Failed to obtain the number of axes for device:\n");
perror("Failed to obtain the number of absolute axes for device:\n");
}

// now relative axes
unsigned long relbit[NBITS(REL_MAX)] = { 0 };
if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(relbit)), relbit) >= 0)
{
for (i = 0; i < REL_MISC; ++i)
{
if (test_bit(i, relbit))
detected_axes_count++;
}
} else {
perror("Failed to obtain the number of relative axes for device:\n");
}

if (detected_axes_count != 0)
axes_count = detected_axes_count;

// Get the actual number of buttons for this device.
int detected_button_count = 0;
unsigned long keybit[NBITS(KEY_MAX)] = { 0 };
if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), keybit) >= 0)
{
button_count = 0;
for (i = BTN_JOYSTICK; i < KEY_MAX; ++i) {
if (test_bit(i, keybit)) {
printf("Joystick has button: 0x%x\n", i);
button_count++;
for (i = BTN_JOYSTICK; i < KEY_MAX; ++i)
{
if (test_bit(i, keybit))
detected_button_count++;
}

for (i = BTN_MISC; i < BTN_JOYSTICK; ++i)
{
if (test_bit(i, keybit))
detected_button_count++;
}
}

for (i = BTN_MISC; i < BTN_JOYSTICK; ++i) {
if (test_bit(i, keybit)) {
printf("Joystick has button: 0x%x\n", i);
button_count++;
}
}
if (button_count != 0) {
printf("...found %d buttons.\n", button_count );
} else {
printf("None found, falling back to 32 buttons.\n");
button_count = 32;
}

if (detected_button_count != 0)
button_count = detected_button_count;
} else {
perror("Failed to obtain the number of buttons for device:\n");
}
Expand Down
74 changes: 74 additions & 0 deletions ndofdev_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
*
* Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * The name of its contributors may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Jan Ciger ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL Jan Ciger BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*
* Basic sanity test that the library works and can actually read device data.
*/

#include <stdio.h>
#include <unistd.h>

#include "ndofdev_external.h"

int main(int argc, char** argv)
{
int i;
NDOF_Device *dev = NULL;

ndof_libinit(NULL, NULL, NULL);

dev = ndof_create();
if(ndof_init_first(dev, NULL) < 0)
{
perror("Unable to open any NDOF devices!");
return(-1);
}

puts("Detected:");
printf("\tDevice: %s\n", dev->product);
printf("\tNum. axes: %d\n", dev->axes_count);
printf("\tNum. buttons: %d\n", dev->btn_count);

puts("\nPress RETURN to start polling ...");
getchar();

// try to poll the device and get data
while(1)
{
ndof_update(dev);

printf("\nAxes: ");
for(i = 0; i < dev->axes_count; ++i)
printf("%ld ", dev->axes[i]);

printf("\nButtons: ");
for(i = 0; i < dev->btn_count; ++i)
printf("%ld ", dev->buttons[i]);

usleep(100000);
}
}

0 comments on commit 8abce37

Please sign in to comment.