mirror of
https://github.com/shadowfacts/jinput-arm64.git
synced 2025-12-06 08:01:59 +01:00
Issue number: 35
Read the axis and button maps from the joystick nodes.
This commit is contained in:
parent
940c48b558
commit
8699a0c8b1
|
|
@ -312,8 +312,10 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen
|
||||||
|
|
||||||
private final static Controller createJoystickFromJoystickDevice(LinuxJoystickDevice device) {
|
private final static Controller createJoystickFromJoystickDevice(LinuxJoystickDevice device) {
|
||||||
List components = new ArrayList();
|
List components = new ArrayList();
|
||||||
|
byte[] axisMap = device.getAxisMap();
|
||||||
|
char[] buttonMap = device.getButtonMap();
|
||||||
for (int i = 0; i < device.getNumButtons(); i++) {
|
for (int i = 0; i < device.getNumButtons(); i++) {
|
||||||
Component.Identifier.Button button_id = getButtonIdentifier(i);
|
Component.Identifier.Button button_id = (Component.Identifier.Button)LinuxNativeTypesMap.getButtonID(buttonMap[i]);
|
||||||
if (button_id != null) {
|
if (button_id != null) {
|
||||||
LinuxJoystickButton button = new LinuxJoystickButton(button_id);
|
LinuxJoystickButton button = new LinuxJoystickButton(button_id);
|
||||||
device.registerButton(i, button);
|
device.registerButton(i, button);
|
||||||
|
|
@ -322,14 +324,12 @@ public final class LinuxEnvironmentPlugin extends ControllerEnvironment implemen
|
||||||
}
|
}
|
||||||
for (int i = 0; i < device.getNumAxes(); i++) {
|
for (int i = 0; i < device.getNumAxes(); i++) {
|
||||||
Component.Identifier.Axis axis_id;
|
Component.Identifier.Axis axis_id;
|
||||||
if ((i % 2) == 0)
|
axis_id = (Component.Identifier.Axis) LinuxNativeTypesMap.getAbsAxisID(axisMap[i]);
|
||||||
axis_id = Component.Identifier.Axis.X;
|
|
||||||
else
|
|
||||||
axis_id = Component.Identifier.Axis.Y;
|
|
||||||
LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id);
|
LinuxJoystickAxis axis = new LinuxJoystickAxis(axis_id);
|
||||||
device.registerAxis(i, axis);
|
device.registerAxis(i, axis);
|
||||||
components.add(axis);
|
components.add(axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LinuxJoystickAbstractController(device, (Component[])components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{});
|
return new LinuxJoystickAbstractController(device, (Component[])components.toArray(new Component[]{}), new Controller[]{}, new Rumbler[]{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,8 @@ final class LinuxJoystickDevice implements LinuxDevice {
|
||||||
private final Event event = new Event();
|
private final Event event = new Event();
|
||||||
private final LinuxJoystickButton[] buttons;
|
private final LinuxJoystickButton[] buttons;
|
||||||
private final LinuxJoystickAxis[] axes;
|
private final LinuxJoystickAxis[] axes;
|
||||||
|
private final byte[] axisMap;
|
||||||
|
private final char[] buttonMap;
|
||||||
|
|
||||||
private EventQueue event_queue;
|
private EventQueue event_queue;
|
||||||
|
|
||||||
|
|
@ -63,6 +65,8 @@ final class LinuxJoystickDevice implements LinuxDevice {
|
||||||
setBufferSize(AbstractController.EVENT_QUEUE_DEPTH);
|
setBufferSize(AbstractController.EVENT_QUEUE_DEPTH);
|
||||||
buttons = new LinuxJoystickButton[getNumDeviceButtons()];
|
buttons = new LinuxJoystickButton[getNumDeviceButtons()];
|
||||||
axes = new LinuxJoystickAxis[getNumDeviceAxes()];
|
axes = new LinuxJoystickAxis[getNumDeviceAxes()];
|
||||||
|
axisMap = getDeviceAxisMap();
|
||||||
|
buttonMap = getDeviceButtonMap();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
close();
|
close();
|
||||||
throw e;
|
throw e;
|
||||||
|
|
@ -142,6 +146,14 @@ final class LinuxJoystickDevice implements LinuxDevice {
|
||||||
return buttons.length;
|
return buttons.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final byte[] getAxisMap() {
|
||||||
|
return axisMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final char[] getButtonMap() {
|
||||||
|
return buttonMap;
|
||||||
|
}
|
||||||
|
|
||||||
private final int getNumDeviceButtons() throws IOException {
|
private final int getNumDeviceButtons() throws IOException {
|
||||||
return nGetNumButtons(fd);
|
return nGetNumButtons(fd);
|
||||||
}
|
}
|
||||||
|
|
@ -152,6 +164,16 @@ final class LinuxJoystickDevice implements LinuxDevice {
|
||||||
}
|
}
|
||||||
private final static native int nGetNumAxes(long fd) throws IOException;
|
private final static native int nGetNumAxes(long fd) throws IOException;
|
||||||
|
|
||||||
|
private final byte[] getDeviceAxisMap() throws IOException {
|
||||||
|
return nGetAxisMap(fd);
|
||||||
|
}
|
||||||
|
private final static native byte[] nGetAxisMap(long fd) throws IOException;
|
||||||
|
|
||||||
|
private final char[] getDeviceButtonMap() throws IOException {
|
||||||
|
return nGetButtonMap(fd);
|
||||||
|
}
|
||||||
|
private final static native char[] nGetButtonMap(long fd) throws IOException;
|
||||||
|
|
||||||
private final int getVersion() throws IOException {
|
private final int getVersion() throws IOException {
|
||||||
return nGetVersion(fd);
|
return nGetVersion(fd);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,41 @@ JNIEXPORT jint JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNumAxes
|
||||||
return num_axes;
|
return num_axes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jbyteArray JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetAxisMap(JNIEnv *env, jclass unused, jlong fd_address) {
|
||||||
|
int fd = (int)fd_address;
|
||||||
|
__u8 axis_map[ABS_MAX + 1];
|
||||||
|
if (ioctl(fd, JSIOCGAXMAP, axis_map) == -1) {
|
||||||
|
throwIOException(env, "Failed to get axis map (%d)\n", errno);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
jbyteArray axis_map_array = (*env)->NewByteArray(env, (ABS_MAX + 1));
|
||||||
|
if (axis_map_array == NULL)
|
||||||
|
return NULL;
|
||||||
|
(*env)->SetByteArrayRegion(env, axis_map_array, 0, (ABS_MAX + 1), (jbyte *)axis_map);
|
||||||
|
return axis_map_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jcharArray JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetButtonMap(JNIEnv *env, jclass unused, jlong fd_address) {
|
||||||
|
int fd = (int)fd_address;
|
||||||
|
int i=0;
|
||||||
|
__u16 button_map[KEY_MAX - BTN_MISC + 1];
|
||||||
|
if (ioctl(fd, JSIOCGBTNMAP, button_map) == -1) {
|
||||||
|
throwIOException(env, "Failed to get button map (%d)\n", errno);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i=0;i<10;i++) {
|
||||||
|
printf("Button %d maps to %d\n", i, button_map[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
jcharArray button_map_array = (*env)->NewCharArray(env, (KEY_MAX - BTN_MISC + 1));
|
||||||
|
if (button_map_array == NULL)
|
||||||
|
return NULL;
|
||||||
|
(*env)->SetCharArrayRegion(env, button_map_array, 0, (KEY_MAX - BTN_MISC + 1), (jbyte *)button_map);
|
||||||
|
return button_map_array;
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNextEvent(JNIEnv *env, jclass unused, jlong fd_address, jobject event_return) {
|
JNIEXPORT jboolean JNICALL Java_net_java_games_input_LinuxJoystickDevice_nGetNextEvent(JNIEnv *env, jclass unused, jlong fd_address, jobject event_return) {
|
||||||
int fd = (int)fd_address;
|
int fd = (int)fd_address;
|
||||||
jclass event_class = (*env)->GetObjectClass(env, event_return);
|
jclass event_class = (*env)->GetObjectClass(env, event_return);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue