1
0
forked from Clones/Controlify

🐛 Fix rumble not working on joysticks + some driver refactoring

This commit is contained in:
isXander
2023-10-25 19:21:58 +01:00
parent c0242ca41b
commit 9037767040
9 changed files with 90 additions and 13 deletions

View File

@ -4,6 +4,8 @@ import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.bindings.ControllerBindings; import dev.isxander.controlify.bindings.ControllerBindings;
import dev.isxander.controlify.controller.AbstractController; import dev.isxander.controlify.controller.AbstractController;
import dev.isxander.controlify.controller.BatteryLevel; import dev.isxander.controlify.controller.BatteryLevel;
import dev.isxander.controlify.driver.gamepad.BasicGamepadInputDriver;
import dev.isxander.controlify.driver.gamepad.GamepadDrivers;
import dev.isxander.controlify.hid.ControllerHIDService; import dev.isxander.controlify.hid.ControllerHIDService;
import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.debug.DebugProperties;
import dev.isxander.controlify.driver.*; import dev.isxander.controlify.driver.*;

View File

@ -112,7 +112,7 @@ public class SingleJoystickController extends AbstractController<JoystickState,
// the duration doesn't matter because we are not updating the joystick state, // the duration doesn't matter because we are not updating the joystick state,
// so there is never any SDL check to stop the rumble after the desired time. // so there is never any SDL check to stop the rumble after the desired time.
if (SDL_JoystickRumbleTriggers(ptrJoystick, (short)(strongMagnitude * 65535.0F), (short)(weakMagnitude * 65535.0F), 1) != 0) { if (SDL_JoystickRumble(ptrJoystick, (short)(strongMagnitude * 65535.0F), (short)(weakMagnitude * 65535.0F), 1) != 0) {
Log.LOGGER.error("Could not rumble controller " + name() + ": " + SDL_GetError()); Log.LOGGER.error("Could not rumble controller " + name() + ": " + SDL_GetError());
return false; return false;
} }

View File

@ -1,6 +1,7 @@
package dev.isxander.controlify.driver; package dev.isxander.controlify.driver;
import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.gamepad.GamepadState;
import dev.isxander.controlify.driver.gamepad.BasicGamepadInputDriver;
import dev.isxander.controlify.hid.HIDDevice; import dev.isxander.controlify.hid.HIDDevice;
import dev.isxander.controlify.utils.Log; import dev.isxander.controlify.utils.Log;

View File

@ -1,6 +1,7 @@
package dev.isxander.controlify.driver; package dev.isxander.controlify.driver.gamepad;
import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.gamepad.GamepadState;
import dev.isxander.controlify.driver.Driver;
public interface BasicGamepadInputDriver extends Driver { public interface BasicGamepadInputDriver extends Driver {

View File

@ -1,6 +1,8 @@
package dev.isxander.controlify.driver; package dev.isxander.controlify.driver.gamepad;
import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.gamepad.GamepadState;
import dev.isxander.controlify.driver.GUIDProvider;
import dev.isxander.controlify.driver.NameProviderDriver;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import org.lwjgl.glfw.GLFWGamepadState; import org.lwjgl.glfw.GLFWGamepadState;

View File

@ -1,7 +1,8 @@
package dev.isxander.controlify.driver; package dev.isxander.controlify.driver.gamepad;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.debug.DebugProperties;
import dev.isxander.controlify.driver.*;
import dev.isxander.controlify.hid.HIDDevice; import dev.isxander.controlify.hid.HIDDevice;
import dev.isxander.controlify.utils.Log; import dev.isxander.controlify.utils.Log;

View File

@ -1,10 +1,10 @@
package dev.isxander.controlify.driver; package dev.isxander.controlify.driver.gamepad;
import com.sun.jna.Memory; import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import dev.isxander.controlify.controller.BatteryLevel; import dev.isxander.controlify.controller.BatteryLevel;
import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.gamepad.GamepadState;
import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.debug.DebugProperties;
import dev.isxander.controlify.driver.*;
import dev.isxander.controlify.utils.Log; import dev.isxander.controlify.utils.Log;
import io.github.libsdl4j.api.gamecontroller.SDL_GameController; import io.github.libsdl4j.api.gamecontroller.SDL_GameController;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;

View File

@ -164,7 +164,7 @@ public class ControllerHIDService {
Log.LOGGER.info("Using SDL to identify controller type."); Log.LOGGER.info("Using SDL to identify controller type.");
return Optional.of(new ControllerHIDInfo( return Optional.of(new ControllerHIDInfo(
ControllerType.getTypeForHID(new HIDIdentifier(vid, pid)), ControllerType.getTypeForHID(new HIDIdentifier(vid, pid)),
Optional.of(new HIDDevice.IDOnly(vid, pid, path)) Optional.of(new HIDDevice.SDLHidApi(vid, pid, path))
)); ));
} }
} }

View File

@ -1,6 +1,11 @@
package dev.isxander.controlify.hid; package dev.isxander.controlify.hid;
public sealed interface HIDDevice permits HIDDevice.Hid4Java, HIDDevice.IDOnly { import com.sun.jna.Memory;
import io.github.libsdl4j.api.hidapi.SDL_hid_device;
import io.github.libsdl4j.api.hidapi.SdlHidApi;
import io.github.libsdl4j.jna.size_t;
public sealed interface HIDDevice permits HIDDevice.Hid4Java, HIDDevice.IDOnly, HIDDevice.SDLHidApi {
int vendorID(); int vendorID();
int productID(); int productID();
@ -88,4 +93,69 @@ public sealed interface HIDDevice permits HIDDevice.Hid4Java, HIDDevice.IDOnly {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
} }
final class SDLHidApi implements HIDDevice {
private final int vendorId;
private final int productId;
private final String path;
private SDL_hid_device device;
public SDLHidApi(int vendorId, int productId, String path) {
this.vendorId = vendorId;
this.productId = productId;
this.path = path;
this.device = null;
}
@Override
public int vendorID() {
return vendorId;
}
@Override
public int productID() {
return productId;
}
@Override
public String path() {
return path;
}
@Override
public boolean supportsCommunication() {
return true;
}
@Override
public void open() {
device = SdlHidApi.SDL_hid_open_path(path, 0);
SdlHidApi.SDL_hid_set_nonblocking(device, 1);
}
@Override
public void close() {
SdlHidApi.SDL_hid_close(device);
device = null;
}
@Override
public int read(byte[] buffer) {
try (Memory memory = new Memory(buffer.length)) {
int ret = SdlHidApi.SDL_hid_read(device, memory, new size_t(buffer.length));
memory.read(0, buffer, 0, buffer.length);
return ret;
}
}
@Override
public int write(byte[] buffer, int packetLength, byte reportId) {
try (Memory memory = new Memory(buffer.length + 1)) {
memory.setByte(buffer.length, reportId);
memory.write(1, buffer, 0, buffer.length);
return SdlHidApi.SDL_hid_write(device, memory, new size_t(buffer.length));
}
}
}
} }