diff --git a/README.md b/README.md index 20ff537..2816a88 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,5 @@ Configuration files for HID to VPAD can be found [here](https://github.com/Masch ## Used Libraries Lombok - https://projectlombok.org/index.html purejavahidapi - https://github.com/nyholku/purejavahidapi +hid4java - https://github.com/gary-rowe/hid4java JXInput - https://github.com/StrikerX3/JXInput diff --git a/src/net/ash/HIDToVPADNetworkClient/gui/GuiInputControls.java b/src/net/ash/HIDToVPADNetworkClient/gui/GuiInputControls.java index dccbfdc..0f2608f 100644 --- a/src/net/ash/HIDToVPADNetworkClient/gui/GuiInputControls.java +++ b/src/net/ash/HIDToVPADNetworkClient/gui/GuiInputControls.java @@ -41,6 +41,8 @@ import lombok.Getter; import net.ash.HIDToVPADNetworkClient.manager.ControllerManager; import net.ash.HIDToVPADNetworkClient.network.NetworkManager; import net.ash.HIDToVPADNetworkClient.util.Settings; +import java.awt.BorderLayout; +import java.awt.CardLayout; public final class GuiInputControls extends JPanel { private static final long serialVersionUID = 1L; @@ -55,7 +57,7 @@ public final class GuiInputControls extends JPanel { super(); setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); - setPreferredSize(new Dimension(220, 150)); + setPreferredSize(new Dimension(220, 200)); final JButton connectButton = new JButton(CONNECT); connectButton.setAlignmentX(Component.CENTER_ALIGNMENT); @@ -87,8 +89,9 @@ public final class GuiInputControls extends JPanel { }); JPanel scanWrap = new JPanel(); - scanWrap.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); - scanWrap.add(new JLabel("Auto Scan for Controllers: ")); + scanWrap.setLayout(new BoxLayout(scanWrap, BoxLayout.X_AXIS)); + JLabel label = new JLabel("Auto Scan for Controllers: "); + scanWrap.add(label); scanWrap.add(cbautoScanForController); ipTextBox = new JTextField(); @@ -111,10 +114,10 @@ public final class GuiInputControls extends JPanel { } }); - JPanel autoActivateWrap = new JPanel(new FlowLayout()); + JPanel autoActivateWrap = new JPanel(); + autoActivateWrap.setLayout(new BoxLayout(autoActivateWrap, BoxLayout.X_AXIS)); autoActivateWrap.add(new JLabel("Auto Activate Controller: ")); autoActivateWrap.add(cbautoActivateController); - autoActivateWrap.setMaximumSize(new Dimension(1000, 20)); add(Box.createVerticalGlue()); @@ -124,9 +127,12 @@ public final class GuiInputControls extends JPanel { add(connectButton); add(Box.createRigidArea(new Dimension(1, 4))); add(scanButton); + add(Box.createRigidArea(new Dimension(1, 4))); add(scanWrap); - add(Box.createVerticalGlue()); + add(Box.createRigidArea(new Dimension(1, 4))); add(autoActivateWrap); + add(Box.createVerticalGlue()); + add(Box.createVerticalGlue()); diff --git a/src/net/ash/HIDToVPADNetworkClient/hid/HidDevice.java b/src/net/ash/HIDToVPADNetworkClient/hid/HidDevice.java index 15391de..722000d 100644 --- a/src/net/ash/HIDToVPADNetworkClient/hid/HidDevice.java +++ b/src/net/ash/HIDToVPADNetworkClient/hid/HidDevice.java @@ -21,20 +21,47 @@ *******************************************************************************/ package net.ash.HIDToVPADNetworkClient.hid; +//TODO: Documentation... public interface HidDevice { - + /** + * Opens the HidDevice for usage. + * @return true on success, false when it failed. + */ + boolean open(); + + /** + * Closes the HidDevice + */ + void close(); + + /** + * Returns the VendorID of the HidDevice + * @return vendorID + */ short getVendorId(); + /** + * Returns the ProductID of the HidDevice + * @return productID + */ short getProductId(); - void close(); + /** + * Returns the latest data. + * @return An byte array containing the latest data. If no data is present, it'll return a empty byte array + */ byte[] getLatestData(); + /** + * Retuns the Usage of this HID-Device + * @return usage + */ short getUsage(); + /** + * Returns the path of this HidDevice + * @return path + */ String getPath(); - - boolean open(); - } diff --git a/src/net/ash/HIDToVPADNetworkClient/hid/HidManager.java b/src/net/ash/HIDToVPADNetworkClient/hid/HidManager.java index 92adccc..b613351 100644 --- a/src/net/ash/HIDToVPADNetworkClient/hid/HidManager.java +++ b/src/net/ash/HIDToVPADNetworkClient/hid/HidManager.java @@ -22,22 +22,57 @@ package net.ash.HIDToVPADNetworkClient.hid; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import lombok.extern.java.Log; import net.ash.HIDToVPADNetworkClient.hid.hid4java.Hid4JavaHidManagerBackend; import net.ash.HIDToVPADNetworkClient.hid.purejavahid.PureJavaHidManagerBackend; import net.ash.HIDToVPADNetworkClient.util.Settings; +@Log public class HidManager { private final static HidManagerBackend backend; - public static List getAttachedController() { - return backend.getAttachedController(); - } - public static HidDevice getDeviceByPath(String path) throws IOException { return backend.getDeviceByPath(path); } + + public static List getAttachedControllers() { + List connectedGamepads = new ArrayList(); + + for (HidDevice info : backend.enumerateDevices()) { + if (isGamepad(info)) { + // Skip Xbox controller under windows. We should use XInput instead. + if (isXboxController(info) && Settings.isWindows()) { + continue; + } + connectedGamepads.add(info); + } + } + return connectedGamepads; + } + + public static boolean isGamepad(HidDevice info) { + if (info == null) return false; + short usage = info.getUsage(); + return (usage == 0x05 || usage == 0x04 || isNintendoController(info) || isPlaystationController(info)); + } + + private static boolean isPlaystationController(HidDevice info) { + if (info == null) return false; + return (info.getVendorId() == 0x054c); + } + + private static boolean isNintendoController(HidDevice info) { + if (info == null) return false; + return (info.getVendorId() == 0x57e); + } + + private static boolean isXboxController(HidDevice info) { + if (info == null) return false; + return (info.getVendorId() == 0x045e) && ((info.getProductId() == 0x02ff) || (info.getProductId() == 0x02a1)); + } static { if (Settings.isMacOSX()) { @@ -46,7 +81,14 @@ public class HidManager { backend = new PureJavaHidManagerBackend(); } else if (Settings.isLinux()) { backend = new Hid4JavaHidManagerBackend(); - } else + } else{ backend = null; + } + log.info("Plattform: " + System.getProperty("os.name")); + if(backend != null){ + log.info("Backend: " + backend.getClass().getSimpleName()); + }else{ + log.info("No Backend loaded =("); + } } } diff --git a/src/net/ash/HIDToVPADNetworkClient/hid/HidManagerBackend.java b/src/net/ash/HIDToVPADNetworkClient/hid/HidManagerBackend.java index e1cef57..c2f214d 100644 --- a/src/net/ash/HIDToVPADNetworkClient/hid/HidManagerBackend.java +++ b/src/net/ash/HIDToVPADNetworkClient/hid/HidManagerBackend.java @@ -22,12 +22,9 @@ package net.ash.HIDToVPADNetworkClient.hid; import java.io.IOException; -import java.util.ArrayList; import java.util.List; -import net.ash.HIDToVPADNetworkClient.util.Settings; - -public abstract class HidManagerBackend { +public interface HidManagerBackend { /** * Searches the corresponding HIDDevice for the given path * @@ -38,41 +35,5 @@ public abstract class HidManagerBackend { */ public abstract HidDevice getDeviceByPath(String path) throws IOException; - public List getAttachedController() { - List connectedGamepads = new ArrayList(); - - for (HidDevice info : enumerateDevices()) { - if (isGamepad(info)) { - // Skip Xbox controller under windows. We should use XInput instead. - if (isXboxController(info) && Settings.isWindows()) { - continue; - } - connectedGamepads.add(info); - } - } - return connectedGamepads; - } - - public static boolean isGamepad(HidDevice info) { - if (info == null) return false; - short usage = info.getUsage(); - return (usage == 0x05 || usage == 0x04 || isNintendoController(info) || isPlaystationController(info)); - } - - private static boolean isPlaystationController(HidDevice info) { - if (info == null) return false; - return (info.getVendorId() == 0x054c); - } - - private static boolean isNintendoController(HidDevice info) { - if (info == null) return false; - return (info.getVendorId() == 0x57e); - } - - private static boolean isXboxController(HidDevice info) { - if (info == null) return false; - return (info.getVendorId() == 0x045e) && ((info.getProductId() == 0x02ff) || (info.getProductId() == 0x02a1)); - } - public abstract List enumerateDevices(); } diff --git a/src/net/ash/HIDToVPADNetworkClient/hid/hid4java/Hid4JavaHidManagerBackend.java b/src/net/ash/HIDToVPADNetworkClient/hid/hid4java/Hid4JavaHidManagerBackend.java index d1dd1fe..23a28c6 100644 --- a/src/net/ash/HIDToVPADNetworkClient/hid/hid4java/Hid4JavaHidManagerBackend.java +++ b/src/net/ash/HIDToVPADNetworkClient/hid/hid4java/Hid4JavaHidManagerBackend.java @@ -31,7 +31,7 @@ import org.hid4java.HidServices; import net.ash.HIDToVPADNetworkClient.hid.HidDevice; import net.ash.HIDToVPADNetworkClient.hid.HidManagerBackend; -public class Hid4JavaHidManagerBackend extends HidManagerBackend { +public class Hid4JavaHidManagerBackend implements HidManagerBackend { @Override public HidDevice getDeviceByPath(String path) throws IOException { diff --git a/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidDevice.java b/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidDevice.java index c7b28a6..2dff246 100644 --- a/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidDevice.java +++ b/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidDevice.java @@ -34,7 +34,7 @@ class PureJavaHidDevice implements HidDevice, InputReportListener { private final purejavahidapi.HidDeviceInfo myDeviceInfo; private final Object dataLock = new Object(); - protected byte[] currentData = new byte[1]; + protected byte[] currentData = new byte[0]; public PureJavaHidDevice(HidDeviceInfo info) { this.myDeviceInfo = info; diff --git a/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidManagerBackend.java b/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidManagerBackend.java index 32e4989..ae381d2 100644 --- a/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidManagerBackend.java +++ b/src/net/ash/HIDToVPADNetworkClient/hid/purejavahid/PureJavaHidManagerBackend.java @@ -29,8 +29,7 @@ import net.ash.HIDToVPADNetworkClient.hid.HidDevice; import net.ash.HIDToVPADNetworkClient.hid.HidManagerBackend; import purejavahidapi.PureJavaHidApi; -public class PureJavaHidManagerBackend extends HidManagerBackend { - +public class PureJavaHidManagerBackend implements HidManagerBackend { @Override public List enumerateDevices() { List result = new ArrayList(); diff --git a/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java b/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java index 246f963..8fad57a 100644 --- a/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java +++ b/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java @@ -157,7 +157,7 @@ public final class ControllerManager { private static Map detectHIDDevices() { Map connectedDevices = new HashMap(); - for (HidDevice info : HidManager.getAttachedController()) { + for (HidDevice info : HidManager.getAttachedControllers()) { String path = info.getPath(); connectedDevices.put(path, ControllerType.HIDController); }