From 8f2797737481537d6432485d25f1911a1cc538da Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Sat, 25 Oct 2014 17:07:18 +0200 Subject: [PATCH] Warn on non-evdev devices --- jni/nv_io/nv_io_jni.c | 5 +++-- src/com/limelight/input/EvdevAbsolute.java | 8 +------- src/com/limelight/input/EvdevConstants.java | 3 +++ src/com/limelight/input/EvdevHandler.java | 2 +- src/com/limelight/input/EvdevReader.java | 9 +++++++++ src/com/limelight/input/IO.java | 7 +++++++ 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/jni/nv_io/nv_io_jni.c b/jni/nv_io/nv_io_jni.c index c587a37..059d00d 100644 --- a/jni/nv_io/nv_io_jni.c +++ b/jni/nv_io/nv_io_jni.c @@ -11,12 +11,13 @@ Java_com_limelight_input_IO_ioctl( jboolean retval; int fd; + int ret; if ((fd = open(jni_filename, O_RDONLY)) < 0) { retval = 0; } else { - ioctl(fd, request, jni_buffer); + ret = ioctl(fd, request, jni_buffer); close(fd); - retval = 1; + retval = ret > 0; } (*env)->ReleaseByteArrayElements(env, buffer, jni_buffer, 0); diff --git a/src/com/limelight/input/EvdevAbsolute.java b/src/com/limelight/input/EvdevAbsolute.java index 8b22188..b49c8f6 100644 --- a/src/com/limelight/input/EvdevAbsolute.java +++ b/src/com/limelight/input/EvdevAbsolute.java @@ -12,8 +12,6 @@ public class EvdevAbsolute { public final static int UP = 1, DOWN = -1, NONE = 0; private final static int ABS_OFFSET = 0x40; - private final static int READ_ONLY = 2; - private final static char EVDEV_TYPE = 'E'; private int avg; private int range; @@ -25,7 +23,7 @@ public class EvdevAbsolute { ByteBuffer buffer = ByteBuffer.allocate(6*4); buffer.order(ByteOrder.nativeOrder()); byte[] data = buffer.array(); - int request = getRequest(READ_ONLY, EVDEV_TYPE, ABS_OFFSET+axis, 6*4); + int request = IO.getRequest(IO.READ_ONLY, EvdevConstants.EVDEV_TYPE, ABS_OFFSET+axis, 6*4); IO.ioctl(filename, data, request); buffer.getInt(); //Skip current value @@ -39,10 +37,6 @@ public class EvdevAbsolute { this.reverse = reverse; } - private int getRequest(int dir, int type, int nr, int size) { - return (dir << 30) | (size << 16) | (type << 8) | nr; - } - /** * Convert input value to short range * @param value received input diff --git a/src/com/limelight/input/EvdevConstants.java b/src/com/limelight/input/EvdevConstants.java index dead9ea..0035d73 100644 --- a/src/com/limelight/input/EvdevConstants.java +++ b/src/com/limelight/input/EvdevConstants.java @@ -183,4 +183,7 @@ public class EvdevConstants { /* Events */ public static final int KEY_RELEASED = 0; public static final int KEY_PRESSED = 1; + + /* ioctl */ + public final static char EVDEV_TYPE = 'E'; } diff --git a/src/com/limelight/input/EvdevHandler.java b/src/com/limelight/input/EvdevHandler.java index f24aac2..ffeb051 100644 --- a/src/com/limelight/input/EvdevHandler.java +++ b/src/com/limelight/input/EvdevHandler.java @@ -18,7 +18,7 @@ public class EvdevHandler extends EvdevReader { /* GFE's prefix for every key code */ public static final short KEY_PREFIX = (short) 0x80; - + /* Gamepad state */ private short buttonFlags; private byte leftTrigger, rightTrigger; diff --git a/src/com/limelight/input/EvdevReader.java b/src/com/limelight/input/EvdevReader.java index 33cdc84..d03ae89 100644 --- a/src/com/limelight/input/EvdevReader.java +++ b/src/com/limelight/input/EvdevReader.java @@ -11,6 +11,8 @@ import java.nio.channels.FileChannel; public abstract class EvdevReader implements Runnable { + private final static int EVIOCGNAME = 0x06; + private FileChannel deviceInput; private ByteBuffer inputBuffer; @@ -20,6 +22,13 @@ public abstract class EvdevReader implements Runnable { throw new FileNotFoundException("File " + device + " not found"); if (!file.canRead()) throw new IOException("Can't read from " + device); + + byte[] data = new byte[255]; + int request = IO.getRequest(IO.READ_ONLY, EvdevConstants.EVDEV_TYPE, EVIOCGNAME, data.length-1); + if (!IO.ioctl(device, data, request)) + throw new IOException("Path " + device + " is not a evdev device"); + + LimeLog.info("Using " + new String(data)); FileInputStream in = new FileInputStream(file); deviceInput = in.getChannel(); diff --git a/src/com/limelight/input/IO.java b/src/com/limelight/input/IO.java index c919f77..a194ebf 100644 --- a/src/com/limelight/input/IO.java +++ b/src/com/limelight/input/IO.java @@ -5,10 +5,17 @@ package com.limelight.input; * @author Iwan Timmer */ public class IO { + + public final static int READ_ONLY = 2; + static { System.loadLibrary("nv_io"); } public static native boolean ioctl(String filename, byte[] buffer, int request); + public static int getRequest(int dir, int type, int nr, int size) { + return (dir << 30) | (size << 16) | (type << 8) | nr; + } + }