diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..b922ecb
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "purejavahidapi"]
+ path = purejavahidapi
+ url = https://github.com/nyholku/purejavahidapi
diff --git a/pom.xml b/pom.xml
index b470556..7fff789 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,13 +21,9 @@
jitpack.io
https://jitpack.io
+
-
- org.hid4java
- hid4java
- 0.4.0
-
org.projectlombok
lombok
@@ -39,5 +35,11 @@
jxinput
1eb4087
+
+
+ purejavahidapi
+ purejavahidapi
+ 0.0.1
+
\ No newline at end of file
diff --git a/src/net/ash/HIDToVPADNetworkClient/Main.java b/src/net/ash/HIDToVPADNetworkClient/Main.java
index d1b68ff..bdffeea 100644
--- a/src/net/ash/HIDToVPADNetworkClient/Main.java
+++ b/src/net/ash/HIDToVPADNetworkClient/Main.java
@@ -23,19 +23,17 @@ package net.ash.HIDToVPADNetworkClient;
import javax.swing.SwingUtilities;
-import org.hid4java.HidManager;
-
import net.ash.HIDToVPADNetworkClient.gui.GuiMain;
import net.ash.HIDToVPADNetworkClient.manager.ActiveControllerManager;
import net.ash.HIDToVPADNetworkClient.network.NetworkManager;
/* Ash's todo list
- * TODO finish Hid4JavaController
+ * TODO finish HidController
* TODO locale
*/
public class Main {
- public static void main(String[] args) {
+ public static void main(String[] args) {
System.out.println("Hello World!");
try {
new Thread(ActiveControllerManager.getInstance()).start();
@@ -43,15 +41,14 @@ public class Main {
} catch (Exception e) {
e.printStackTrace();
fatal();
- }
-
+ }
SwingUtilities.invokeLater(new Runnable() {
public void run() {
GuiMain.createGUI();
}
});
}
-
+
public static void fatal() {
System.err.println("HID To VPAD Network Client encountered an irrecoverable error.");
System.err.println("Exiting...");
@@ -59,7 +56,6 @@ public class Main {
}
public static void initiateShutdown() {
- HidManager.getHidServices().shutdown();
System.exit(0);
}
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/Controller.java b/src/net/ash/HIDToVPADNetworkClient/controller/Controller.java
index 44b0df7..3f007c4 100644
--- a/src/net/ash/HIDToVPADNetworkClient/controller/Controller.java
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/Controller.java
@@ -25,6 +25,7 @@ import lombok.Getter;
import lombok.Synchronized;
import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
import net.ash.HIDToVPADNetworkClient.manager.ControllerManager;
+import net.ash.HIDToVPADNetworkClient.util.Settings;
import net.ash.HIDToVPADNetworkClient.util.Utilities;
/**
@@ -43,6 +44,9 @@ public abstract class Controller implements Runnable{
boolean shutdownDone = false;
private Object dataLock = new Object();
private Object shutdownLock = new Object();
+
+ private Object rumbleLock = new Object();
+ private boolean rumble = false;
public Controller(ControllerType type, String identifier) throws ControllerInitializationFailedException{
this.type = type;
@@ -56,7 +60,7 @@ public abstract class Controller implements Runnable{
public void run() {
boolean shutdownState = shutdown;
while(!shutdownState){
- Utilities.sleep(1000);
+ Utilities.sleep(Settings.DETECT_CONTROLLER_INTERVAL);
while(isActive()) {
byte[] newData = pollLatestData();
if(newData != null){
@@ -74,7 +78,7 @@ public abstract class Controller implements Runnable{
}
protected void doSleepAfterPollingData() {
- Utilities.sleep(10);
+ Utilities.sleep(Settings.SLEEP_AFER_POLLING);
}
@Synchronized("dataLock")
@@ -189,7 +193,24 @@ public abstract class Controller implements Runnable{
return true;
}
- public enum ControllerType {
- HID4JAVA, LINUX, XINPUT13,XINPUT14
+ @Synchronized("rumbleLock")
+ public boolean isRumble() {
+ return rumble;
}
+
+ @Synchronized("rumbleLock")
+ public void startRumble() {
+ this.rumble = true;
+ }
+
+ @Synchronized("rumbleLock")
+ public void stopRumble() {
+ this.rumble = false;
+ }
+
+ public enum ControllerType {
+ PureJAVAHid, LINUX, XINPUT13,XINPUT14
+ }
+
+ public abstract String getInfoText();
}
\ No newline at end of file
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/Hid4JavaController.java b/src/net/ash/HIDToVPADNetworkClient/controller/Hid4JavaController.java
deleted file mode 100644
index 33ecdb3..0000000
--- a/src/net/ash/HIDToVPADNetworkClient/controller/Hid4JavaController.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2017 Ash (QuarkTheAwesome) & Maschell
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *******************************************************************************/
-package net.ash.HIDToVPADNetworkClient.controller;
-
-import java.util.Arrays;
-
-import org.hid4java.HidDevice;
-
-import lombok.AccessLevel;
-import lombok.Getter;
-import lombok.Setter;
-import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
-import net.ash.HIDToVPADNetworkClient.util.HID4JavaManager;
-import net.ash.HIDToVPADNetworkClient.util.Utilities;
-
-public class Hid4JavaController extends Controller {
- public Hid4JavaController(String identifier) throws ControllerInitializationFailedException {
- super(ControllerType.HID4JAVA, identifier);
- }
-
- private static final int PACKET_LENGTH = 128;
-
- @Getter @Setter(AccessLevel.PRIVATE)
- private HidDevice hidDevice;
-
- @Override
- public boolean initController(String identifier) {
- HidDevice device = HID4JavaManager.getDeviceByPath(identifier);
- //device.setNonBlocking(true); //TODO: What does this do? This is done no in a extra Thread so it shouldn't matter.
- device.open();
- Utilities.sleep(20); //What a bit until is opened.
- if (device == null | !device.isOpen()) return false;
- setHidDevice(device);
- //System.out.println("ctrl: " + device.isOpen() + " " + device.getLastErrorMessage());
- return true;
- }
-
- @Override
- public byte[] pollLatestData() {
- byte[] data = new byte[PACKET_LENGTH];
- int length = getHidDevice().read(data);
- if(length <= 0) return null;
- //if(length > data.length) System.out.println("WTF?");
- return Arrays.copyOf(data, length);
- }
-
- @Override
- public void destroyDriver() {
- getHidDevice().close();
- }
-
- @Override
- public short getVID() {
- return getHidDevice().getVendorId();
- }
-
- @Override
- public short getPID() {
- return getHidDevice().getProductId();
- }
-}
\ No newline at end of file
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/LinuxDevInputController.java b/src/net/ash/HIDToVPADNetworkClient/controller/LinuxDevInputController.java
index 82bde01..3092337 100644
--- a/src/net/ash/HIDToVPADNetworkClient/controller/LinuxDevInputController.java
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/LinuxDevInputController.java
@@ -144,4 +144,9 @@ public class LinuxDevInputController extends Controller implements Runnable{
return "[" + super.toString() + ";VID," + Integer.toHexString((int)getVID() & 0xFFFF) + ";PID," + Integer.toHexString((int)getPID() & 0xFFFF) + ";run," + isActive() + ((controller == null) ? ";uninitialised]" : ";initialised]");
}
+ @Override
+ public String getInfoText() {
+ return "Linux controller on " + getIdentifier();
+ }
+
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/PureJavaHidController.java b/src/net/ash/HIDToVPADNetworkClient/controller/PureJavaHidController.java
new file mode 100644
index 0000000..74a8caa
--- /dev/null
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/PureJavaHidController.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2017 Ash (QuarkTheAwesome) & Maschell
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *******************************************************************************/
+package net.ash.HIDToVPADNetworkClient.controller;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.Synchronized;
+import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
+import net.ash.HIDToVPADNetworkClient.util.PureJavaHidApiManager;
+import purejavahidapi.HidDevice;
+import purejavahidapi.InputReportListener;
+
+public class PureJavaHidController extends Controller implements InputReportListener {
+ public static Controller getInstance(String deviceIdentifier) throws IOException, ControllerInitializationFailedException {
+ HidDevice device = PureJavaHidApiManager.getDeviceByPath(deviceIdentifier);
+ //We use a special version to optimize the data for the switch pro controller
+ if(device.getHidDeviceInfo().getVendorId() == SwitchProController.SWITCH_PRO_CONTROLLER_VID &&
+ device.getHidDeviceInfo().getProductId() == SwitchProController.SWITCH_PRO_CONTROLLER_PID){
+ return new SwitchProController(deviceIdentifier);
+ }else{
+ return new PureJavaHidController(deviceIdentifier);
+ }
+ }
+
+ public PureJavaHidController(String identifier) throws ControllerInitializationFailedException {
+ super(ControllerType.PureJAVAHid, identifier);
+ }
+
+ private Object dataLock = new Object();
+ protected byte[] currentData = new byte[1];
+
+ protected int PACKET_LENGTH = 64;
+
+ @Getter @Setter(AccessLevel.PRIVATE)
+ private HidDevice hidDevice;
+
+ @Override
+ public boolean initController(String identifier) {
+ HidDevice device;
+ try {
+ device = PureJavaHidApiManager.getDeviceByPath(identifier);
+
+ device.setInputReportListener(this);
+ setHidDevice(device);
+ return true;
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ @Override
+ @Synchronized("dataLock")
+ public byte[] pollLatestData() {
+ return currentData.clone();
+ }
+
+ @Override
+ public void destroyDriver() {
+ getHidDevice().close();
+ }
+
+ @Override
+ public short getVID() {
+ return getHidDevice().getHidDeviceInfo().getVendorId();
+ }
+
+ @Override
+ public short getPID() {
+ return getHidDevice().getHidDeviceInfo().getProductId();
+ }
+
+ @Override
+ @Synchronized("dataLock")
+ public void onInputReport(HidDevice source, byte reportID, byte[] reportData, int reportLength) {
+ if(isActive()){
+ int length = PACKET_LENGTH;
+ if(reportLength < length){
+ length = reportLength;
+ }
+ currentData = Arrays.copyOfRange(reportData, 0, length);
+ }
+ }
+
+ @Override
+ public String getInfoText() {
+ //TODO:
+ if(getVID() == 0x57e){
+ if(getPID() == 0x2006){
+ return "Joy-Con (L) on " + getIdentifier();
+ }else if(getPID() == 0x2007){
+ return "Joy-Con (R) on " + getIdentifier();
+ }
+ }
+
+ return "USB HID on " + getIdentifier();
+ }
+}
\ No newline at end of file
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/SwitchProController.java b/src/net/ash/HIDToVPADNetworkClient/controller/SwitchProController.java
new file mode 100644
index 0000000..4281b5c
--- /dev/null
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/SwitchProController.java
@@ -0,0 +1,30 @@
+package net.ash.HIDToVPADNetworkClient.controller;
+
+import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
+
+public class SwitchProController extends PureJavaHidController {
+ public static final short SWITCH_PRO_CONTROLLER_VID = 0x57e;
+ public static final short SWITCH_PRO_CONTROLLER_PID = 0x2009;
+
+
+ public SwitchProController(String identifier) throws ControllerInitializationFailedException {
+ super(identifier);
+ //truncate package to 11;
+ this.PACKET_LENGTH = 11;
+ }
+
+ @Override
+ public byte[] pollLatestData() {
+ //remove unused data (because only changed data will be sent)
+ currentData[3] = 0;
+ currentData[5] = 0;
+ currentData[7] = 0;
+ currentData[9] = 0;
+ return currentData.clone();
+ }
+
+ @Override
+ public String getInfoText(){
+ return "Switch Pro Controller on " + getIdentifier();
+ }
+}
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/XInput13Controller.java b/src/net/ash/HIDToVPADNetworkClient/controller/XInput13Controller.java
index 037f85c..454740e 100644
--- a/src/net/ash/HIDToVPADNetworkClient/controller/XInput13Controller.java
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/XInput13Controller.java
@@ -27,4 +27,9 @@ public class XInput13Controller extends XInputController {
public XInput13Controller(String identifier) throws ControllerInitializationFailedException {
super(ControllerType.XINPUT13, identifier);
}
+
+ @Override
+ public String getInfoText(){
+ return "XInput 1.3 on " + getIdentifier();
+ }
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/XInput14Controller.java b/src/net/ash/HIDToVPADNetworkClient/controller/XInput14Controller.java
index cab0a9f..1fe49a8 100644
--- a/src/net/ash/HIDToVPADNetworkClient/controller/XInput14Controller.java
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/XInput14Controller.java
@@ -27,4 +27,9 @@ public class XInput14Controller extends XInputController {
public XInput14Controller(String identifier) throws ControllerInitializationFailedException {
super(ControllerType.XINPUT14, identifier);
}
+
+ @Override
+ public String getInfoText(){
+ return "XInput 1.4 on " + getIdentifier();
+ }
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/controller/XInputController.java b/src/net/ash/HIDToVPADNetworkClient/controller/XInputController.java
index 2558598..8b090fd 100644
--- a/src/net/ash/HIDToVPADNetworkClient/controller/XInputController.java
+++ b/src/net/ash/HIDToVPADNetworkClient/controller/XInputController.java
@@ -52,7 +52,7 @@ public class XInputController extends Controller {
try {
device = XInputDevice.getDeviceFor(pad);
} catch (XInputNotLoadedException e) {
- //Log?
+ //TODO: Log?
}
if(device == null) return false;
setDevice(device);
@@ -103,8 +103,8 @@ public class XInputController extends Controller {
axesDataShoulderButtons |= axes.rtRaw << 0;
buttonState |= axesDataShoulderButtons << 16;
- data.putInt(axesData).putInt(buttonState);
-
+ data.putInt(axesData).putInt(buttonState);
+
return(data.array());
}
return null;
@@ -125,4 +125,9 @@ public class XInputController extends Controller {
public short getPID() {
return 0x1337;
}
+
+ @Override
+ public String getInfoText(){
+ return "XInput on " + getIdentifier();
+ }
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/gui/GuiControllerListItem.java b/src/net/ash/HIDToVPADNetworkClient/gui/GuiControllerListItem.java
index 1fe0a43..7b254d0 100644
--- a/src/net/ash/HIDToVPADNetworkClient/gui/GuiControllerListItem.java
+++ b/src/net/ash/HIDToVPADNetworkClient/gui/GuiControllerListItem.java
@@ -65,18 +65,7 @@ public class GuiControllerListItem extends JPanel implements ActionListener {
}
private String getFlavorText() {
- switch (controller.getType()) { //TODO: String.format with value from Settings.
- case XINPUT13:
- return "XInput 1.3 on " + controller.getIdentifier();
- case XINPUT14:
- return "XInput 1.4 on " + controller.getIdentifier();
- case HID4JAVA:
- return "USB HID on " + controller.getIdentifier();
- case LINUX:
- return "Linux controller on " + controller.getIdentifier();
- default:
- return controller.toString();
- }
+ return controller.getInfoText();
}
@Override
diff --git a/src/net/ash/HIDToVPADNetworkClient/manager/ActiveControllerManager.java b/src/net/ash/HIDToVPADNetworkClient/manager/ActiveControllerManager.java
index bea48ed..65d3118 100644
--- a/src/net/ash/HIDToVPADNetworkClient/manager/ActiveControllerManager.java
+++ b/src/net/ash/HIDToVPADNetworkClient/manager/ActiveControllerManager.java
@@ -27,12 +27,14 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import lombok.extern.java.Log;
import net.ash.HIDToVPADNetworkClient.controller.Controller;
import net.ash.HIDToVPADNetworkClient.network.NetworkHIDDevice;
import net.ash.HIDToVPADNetworkClient.network.NetworkManager;
import net.ash.HIDToVPADNetworkClient.util.Settings;
import net.ash.HIDToVPADNetworkClient.util.Utilities;
+@Log
public class ActiveControllerManager implements Runnable{
private static ActiveControllerManager instance = new ActiveControllerManager();
@@ -66,8 +68,7 @@ public class ActiveControllerManager implements Runnable{
}
}).start();
}
-
-
+
private Map activeControllers = new HashMap<>();
public void updateControllerStates() {
List currentControllers = ControllerManager.getActiveControllers();
@@ -79,7 +80,7 @@ public class ActiveControllerManager implements Runnable{
for(Controller c: currentControllers){
if(!activeControllers.containsKey(c)){
- System.out.println("Added " + c); //TODO: real logging
+ log.info("Added " + c);
toAdd.add(c);
}
}
@@ -87,7 +88,7 @@ public class ActiveControllerManager implements Runnable{
//removing all old
for(Controller c : activeControllers.keySet()){
if(!currentControllers.contains(c)){
- System.out.println("Removed " + c); //TODO: real logging
+ log.info("Removed " + c);
toRemove.add(c);
}
}
@@ -138,4 +139,18 @@ public class ActiveControllerManager implements Runnable{
}
}
}
+
+ /**
+ *
+ * @param HIDhandle
+ * @return returns the controller for the given handle. returns null if the controller with the given handle is not found.
+ */
+ public Controller getControllerByHIDHandle(int HIDhandle) {
+ for(Entry entry: activeControllers.entrySet()){
+ if(entry.getValue().getHidHandle() == HIDhandle){
+ return entry.getKey();
+ }
+ }
+ return null;
+ }
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java b/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java
index 832cc51..931b529 100644
--- a/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java
+++ b/src/net/ash/HIDToVPADNetworkClient/manager/ControllerManager.java
@@ -23,15 +23,13 @@ package net.ash.HIDToVPADNetworkClient.manager;
import java.io.File;
import java.io.FilenameFilter;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import org.hid4java.HidDevice;
-import org.hid4java.HidManager;
-
import com.ivan.xinput.XInputDevice;
import com.ivan.xinput.XInputDevice14;
import com.ivan.xinput.exceptions.XInputNotLoadedException;
@@ -39,12 +37,14 @@ import com.ivan.xinput.exceptions.XInputNotLoadedException;
import lombok.Synchronized;
import net.ash.HIDToVPADNetworkClient.controller.Controller;
import net.ash.HIDToVPADNetworkClient.controller.Controller.ControllerType;
-import net.ash.HIDToVPADNetworkClient.controller.Hid4JavaController;
+import net.ash.HIDToVPADNetworkClient.controller.PureJavaHidController;
import net.ash.HIDToVPADNetworkClient.controller.LinuxDevInputController;
import net.ash.HIDToVPADNetworkClient.controller.XInput13Controller;
import net.ash.HIDToVPADNetworkClient.controller.XInput14Controller;
import net.ash.HIDToVPADNetworkClient.controller.XInputController;
import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
+import purejavahidapi.HidDeviceInfo;
+import purejavahidapi.PureJavaHidApi;
public class ControllerManager{
private static Map attachedControllers = new HashMap<>();
@@ -64,12 +64,8 @@ public class ControllerManager{
} else if (os.contains("Windows")) {
connectedDevices.putAll(detectWindowsControllers());
}
-
- /*TODO: Enable HID4Java again. Currently it's disabled because
- * We can either use the WiiU directly OR have XInput anyway.
- * Adding an option menu for enabling it?
- */
- //connectedDevices.putAll(detectHIDDevices());
+
+ connectedDevices.putAll(detectHIDDevices());
//Remove detached devices
List toRemove = new ArrayList<>();
@@ -89,11 +85,13 @@ public class ControllerManager{
if(!attachedControllers.containsKey(deviceIdentifier)){
Controller c = null;
switch(entry.getValue()){
- case HID4JAVA:
+ case PureJAVAHid:
try {
- c= new Hid4JavaController(deviceIdentifier);
+ c= PureJavaHidController.getInstance(deviceIdentifier);
} catch (ControllerInitializationFailedException e) {
//e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
}
break;
case LINUX:
@@ -142,11 +140,13 @@ public class ControllerManager{
private static Map detectHIDDevices() {
Map connectedDevices = new HashMap<>();
- for (HidDevice device : HidManager.getHidServices().getAttachedHidDevices()) {
- if(device.getUsage() == 0x05 || device.getUsage() == 0x04){
- connectedDevices.put(device.getPath(),ControllerType.HID4JAVA);
+
+ for (HidDeviceInfo info : PureJavaHidApi.enumerateDevices()) {
+ if(info.getUsagePage() == 0x05 || info.getUsagePage() == 0x04 || (info.getVendorId() == 0x57e)){
+ connectedDevices.put(info.getPath(),ControllerType.PureJAVAHid);
}
}
+
return connectedDevices;
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/network/NetworkHIDDevice.java b/src/net/ash/HIDToVPADNetworkClient/network/NetworkHIDDevice.java
index 0236ac8..c9a3af4 100644
--- a/src/net/ash/HIDToVPADNetworkClient/network/NetworkHIDDevice.java
+++ b/src/net/ash/HIDToVPADNetworkClient/network/NetworkHIDDevice.java
@@ -96,4 +96,26 @@ public class NetworkHIDDevice {
clearCommands();
return commands;
}
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + hidHandle;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ NetworkHIDDevice other = (NetworkHIDDevice) obj;
+ if (hidHandle != other.hidHandle)
+ return false;
+ return true;
+ }
}
diff --git a/src/net/ash/HIDToVPADNetworkClient/network/NetworkManager.java b/src/net/ash/HIDToVPADNetworkClient/network/NetworkManager.java
index 5152b9a..46c6ea6 100644
--- a/src/net/ash/HIDToVPADNetworkClient/network/NetworkManager.java
+++ b/src/net/ash/HIDToVPADNetworkClient/network/NetworkManager.java
@@ -25,17 +25,15 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import org.omg.Messaging.SyncScopeHelper;
-
import lombok.Getter;
import lombok.Synchronized;
import lombok.extern.java.Log;
-import net.ash.HIDToVPADNetworkClient.manager.ControllerManager;
import net.ash.HIDToVPADNetworkClient.network.commands.AttachCommand;
import net.ash.HIDToVPADNetworkClient.network.commands.DetachCommand;
import net.ash.HIDToVPADNetworkClient.network.commands.DeviceCommand;
import net.ash.HIDToVPADNetworkClient.network.commands.PingCommand;
import net.ash.HIDToVPADNetworkClient.network.commands.ReadCommand;
+import net.ash.HIDToVPADNetworkClient.util.Settings;
import net.ash.HIDToVPADNetworkClient.util.Utilities;
@Log
@@ -83,8 +81,8 @@ public class NetworkManager implements Runnable{
int i = 0;
while(true){
proccessCommands();
- Utilities.sleep(10);//TODO: move magic value to Settings
- if(i++ > 1000/10){//TODO: move magic value to Settings
+ Utilities.sleep(Settings.PROCESS_CMD_INTERVAL);
+ if(i++ > Settings.PING_INTERVAL/Settings.PROCESS_CMD_INTERVAL){
ping();
i = 0;
}
@@ -154,7 +152,7 @@ public class NetworkManager implements Runnable{
result = true;
}
}else{
- Utilities.sleep(500); //TODO: move magic value to Settings
+ Utilities.sleep(Settings.SENDING_CMD_SLEEP_IF_NOT_CONNECTED); //TODO: move magic value to Settings
}
//Add the command again on errors
diff --git a/src/net/ash/HIDToVPADNetworkClient/network/TCPClient.java b/src/net/ash/HIDToVPADNetworkClient/network/TCPClient.java
index 1e70239..d17a3f4 100644
--- a/src/net/ash/HIDToVPADNetworkClient/network/TCPClient.java
+++ b/src/net/ash/HIDToVPADNetworkClient/network/TCPClient.java
@@ -27,7 +27,6 @@ import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
-import java.util.concurrent.SynchronousQueue;
import lombok.AccessLevel;
import lombok.Getter;
diff --git a/src/net/ash/HIDToVPADNetworkClient/util/HID4JavaManager.java b/src/net/ash/HIDToVPADNetworkClient/util/PureJavaHidApiManager.java
similarity index 73%
rename from src/net/ash/HIDToVPADNetworkClient/util/HID4JavaManager.java
rename to src/net/ash/HIDToVPADNetworkClient/util/PureJavaHidApiManager.java
index 75cff97..ab60196 100644
--- a/src/net/ash/HIDToVPADNetworkClient/util/HID4JavaManager.java
+++ b/src/net/ash/HIDToVPADNetworkClient/util/PureJavaHidApiManager.java
@@ -21,31 +21,30 @@
*******************************************************************************/
package net.ash.HIDToVPADNetworkClient.util;
-import org.hid4java.HidDevice;
-import org.hid4java.HidManager;
-import org.hid4java.HidServices;
+import java.io.IOException;
+import java.util.List;
-public class HID4JavaManager {
+import purejavahidapi.HidDevice;
+import purejavahidapi.HidDeviceInfo;
+import purejavahidapi.PureJavaHidApi;
+
+public class PureJavaHidApiManager {
- private HID4JavaManager(){}
+ private PureJavaHidApiManager(){}
/**
* Searches the corresponding HIDDevice for the given path
* @param path Path of the HIDDevice
* @return It the device is found, it will be returned. Otherwise null is returned.
+ * @throws IOException
*/
- public static HidDevice getDeviceByPath(String path){
- HidDevice result = null;
-
- HidServices services = HidManager.getHidServices();
- if(services == null) return result;
-
- for (HidDevice device : services.getAttachedHidDevices()) {
- if (device.getPath().equals(path)) {
- result = device;
- break;
+ public static HidDevice getDeviceByPath(String path) throws IOException{
+ List devList = PureJavaHidApi.enumerateDevices();
+ for (HidDeviceInfo info : devList) {
+ if(info.getPath().equals(path)){
+ return PureJavaHidApi.openDevice(info);
}
}
- return result;
+ return null;
}
}
\ No newline at end of file
diff --git a/src/net/ash/HIDToVPADNetworkClient/util/Settings.java b/src/net/ash/HIDToVPADNetworkClient/util/Settings.java
index 41ce03c..919fc1c 100644
--- a/src/net/ash/HIDToVPADNetworkClient/util/Settings.java
+++ b/src/net/ash/HIDToVPADNetworkClient/util/Settings.java
@@ -25,6 +25,10 @@ public class Settings {
public static final int DETECT_CONTROLLER_INTERVAL = 1000;
public static final int HANDLE_INPUTS_INTERVAL = 15;
public static final int MAXIMUM_TRIES_FOR_RECONNECTING = 10;
+ public static final int SLEEP_AFER_POLLING = 10;
+ public static final int SENDING_CMD_SLEEP_IF_NOT_CONNECTED = 500;
+ public static final int PING_INTERVAL = 1000;
+ public static final int PROCESS_CMD_INTERVAL = 10;
private Settings(){}