mirror of
https://github.com/Maschell/HIDtoVPADNetworkClient.git
synced 2024-11-14 19:05:05 +01:00
First commit
This commit is contained in:
parent
70b5da2206
commit
a7575238e1
9
pom.xml
9
pom.xml
@ -137,15 +137,20 @@
|
|||||||
<artifactId>jxinput</artifactId>
|
<artifactId>jxinput</artifactId>
|
||||||
<version>1eb4087</version> <!-- JXInput 0.7 -->
|
<version>1eb4087</version> <!-- JXInput 0.7 -->
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<!-- <dependency>
|
||||||
<groupId>com.github.QuarkTheAwesome</groupId>
|
<groupId>com.github.QuarkTheAwesome</groupId>
|
||||||
<artifactId>purejavahidapi</artifactId>
|
<artifactId>purejavahidapi</artifactId>
|
||||||
<version>f877704</version>
|
<version>f877704</version>
|
||||||
</dependency>
|
</dependency> -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.hid4java</groupId>
|
<groupId>org.hid4java</groupId>
|
||||||
<artifactId>hid4java</artifactId>
|
<artifactId>hid4java</artifactId>
|
||||||
<version>0.4.0</version>
|
<version>0.4.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>purejavahidapi</groupId>
|
||||||
|
<artifactId>purejavahidapi</artifactId>
|
||||||
|
<version>0.0.1</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@ -2,8 +2,10 @@ package net.ash.HIDToVPADNetworkClient.controller;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
|
||||||
import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
|
import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
|
||||||
import net.ash.HIDToVPADNetworkClient.util.Settings;
|
import net.ash.HIDToVPADNetworkClient.util.Settings;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.util.Utilities;
|
||||||
|
|
||||||
public class DS4NewController extends HidController {
|
public class DS4NewController extends HidController {
|
||||||
public static final short DS4_NEW_CONTROLLER_VID = 0x54C;
|
public static final short DS4_NEW_CONTROLLER_VID = 0x54C;
|
||||||
@ -11,18 +13,13 @@ public class DS4NewController extends HidController {
|
|||||||
|
|
||||||
public DS4NewController(String identifier) throws ControllerInitializationFailedException {
|
public DS4NewController(String identifier) throws ControllerInitializationFailedException {
|
||||||
super(identifier);
|
super(identifier);
|
||||||
if (Settings.isMacOSX()) {
|
this.MAX_PACKET_LENGTH = 7;
|
||||||
this.MAX_PACKET_LENGTH = 7;
|
|
||||||
} else {
|
|
||||||
this.MAX_PACKET_LENGTH = 6;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] pollLatestData() {
|
public byte[] pollLatestData() {
|
||||||
byte[] currentData = super.pollLatestData();
|
byte[] currentData = super.pollLatestData();
|
||||||
if (Settings.isMacOSX() && currentData != null && currentData.length > 6) { // for some reason the controller has one extra byte at the beginning under
|
if(currentData.length >= 7){
|
||||||
// OSX
|
|
||||||
currentData = Arrays.copyOfRange(currentData, 1, 7);
|
currentData = Arrays.copyOfRange(currentData, 1, 7);
|
||||||
}
|
}
|
||||||
return currentData;
|
return currentData;
|
||||||
|
@ -33,7 +33,8 @@ import net.ash.HIDToVPADNetworkClient.hid.HidManager;
|
|||||||
|
|
||||||
@Log
|
@Log
|
||||||
public class HidController extends Controller {
|
public class HidController extends Controller {
|
||||||
@Getter @Setter(AccessLevel.PRIVATE) private HidDevice hidDevice;
|
@Getter @Setter(AccessLevel.PRIVATE)
|
||||||
|
protected HidDevice hidDevice;
|
||||||
|
|
||||||
public static Controller getInstance(String deviceIdentifier) throws IOException, ControllerInitializationFailedException {
|
public static Controller getInstance(String deviceIdentifier) throws IOException, ControllerInitializationFailedException {
|
||||||
|
|
||||||
@ -68,6 +69,8 @@ public class HidController extends Controller {
|
|||||||
if (device == null || !device.open()) {
|
if (device == null || !device.open()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log.info("HidDevice opened!");
|
log.info("HidDevice opened!");
|
||||||
|
|
||||||
setHidDevice(device);
|
setHidDevice(device);
|
||||||
|
@ -21,32 +21,209 @@
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package net.ash.HIDToVPADNetworkClient.controller;
|
package net.ash.HIDToVPADNetworkClient.controller;
|
||||||
|
|
||||||
import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import lombok.extern.java.Log;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.exeption.ControllerInitializationFailedException;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.manager.ActiveControllerManager;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.manager.ControllerManager;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.util.MessageBoxManager;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.util.Utilities;
|
||||||
|
import purejavahidapi.linux.UdevLibrary.hidraw_report_descriptor;
|
||||||
|
|
||||||
|
@Log
|
||||||
public class SwitchProController extends HidController {
|
public class SwitchProController extends HidController {
|
||||||
public static final short SWITCH_PRO_CONTROLLER_VID = 0x57e;
|
public static final short SWITCH_PRO_CONTROLLER_VID = 0x57e;
|
||||||
public static final short SWITCH_PRO_CONTROLLER_PID = 0x2009;
|
public static final short SWITCH_PRO_CONTROLLER_PID = 0x2009;
|
||||||
|
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_A = 0x08000000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_B = 0x04000000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_X = 0x02000000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_Y = 0x01000000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_PLUS = 0x00020000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_MINUS = 0x00010000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_HOME = 0x00100000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_SCREENSHOT = 0x00200000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_R = 0x40000000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_ZR = 0x80000000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_STICK_R = 0x00040000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_L = 0x00004000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_ZL = 0x00008000;
|
||||||
|
private static final int SWITCH_PRO_USB_BUTTON_STICK_L = 0x00080000;
|
||||||
|
|
||||||
|
private static final byte SWITCH_PRO_USB_BUTTON_LEFT_VALUE = 0x08;
|
||||||
|
private static final byte SWITCH_PRO_USB_BUTTON_RIGHT_VALUE = 0x04;
|
||||||
|
private static final byte SWITCH_PRO_USB_BUTTON_DOWN_VALUE = 0x01;
|
||||||
|
private static final byte SWITCH_PRO_USB_BUTTON_UP_VALUE = 0x02;
|
||||||
|
|
||||||
|
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_A = 0x02000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_B = 0x01000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_X = 0x08000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_Y = 0x04000000;
|
||||||
|
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_PLUS = 0x00020000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_MINUS = 0x00010000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_HOME = 0x00100000;
|
||||||
|
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_R = 0x20000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_ZR = 0x80000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_STICK_R = 0x00080000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_L = 0x10000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_ZL = 0x40000000;
|
||||||
|
private static final int SWITCH_PRO_BT_BUTTON_STICK_L = 0x00040000;
|
||||||
|
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_N_VALUE = 0x00;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_NE_VALUE = 0x01;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_E_VALUE = 0x02;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_SE_VALUE = 0x03;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_S_VALUE = 0x04;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_SW_VALUE = 0x05;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_W_VALUE = 0x06;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_NW_VALUE = 0x07;
|
||||||
|
private static final byte SWITCH_PRO_BT_BUTTON_DPAD_NEUTRAL_VALUE = 0x08;
|
||||||
|
|
||||||
|
private static boolean isUSB = false;
|
||||||
|
|
||||||
|
private final byte[] CMD_readInput = new byte[]{(byte) 0x92,0x00,0x01,0x00,0x00,0x00,0x00,0x1F};
|
||||||
|
private final byte[] CMD_getMAC = new byte[]{0x01};
|
||||||
|
private final byte[] CMD_DO_HANDSHAKE = new byte[]{0x02};
|
||||||
|
private final byte[] CMD_SWITCH_BAUDRATE = new byte[]{0x03};
|
||||||
|
private final byte[] CMD_HID_ONLY = new byte[]{0x04};
|
||||||
|
|
||||||
public SwitchProController(String identifier) throws ControllerInitializationFailedException {
|
public SwitchProController(String identifier) throws ControllerInitializationFailedException {
|
||||||
super(identifier);
|
super(identifier);
|
||||||
// truncate package to 11;
|
// truncate package to 11;
|
||||||
this.MAX_PACKET_LENGTH = 11;
|
this.MAX_PACKET_LENGTH = 11;
|
||||||
|
|
||||||
|
if((isUSB = doUSBHandshake())){
|
||||||
|
log.info("Switch Pro Controller USB Handshake successful!");
|
||||||
|
}else{
|
||||||
|
log.info("Switch Pro Controller USB Handshake failed! The controller is probably connected via Bluetooth");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] pollLatestData() {
|
public byte[] pollLatestData() {
|
||||||
|
if(isUSB){
|
||||||
|
sendReadCmd();
|
||||||
|
}
|
||||||
|
|
||||||
byte[] currentData = super.pollLatestData();
|
byte[] currentData = super.pollLatestData();
|
||||||
|
|
||||||
if (currentData == null || currentData.length < 10) {
|
if (currentData == null || currentData.length < 10) {
|
||||||
return new byte[0];
|
return new byte[0];
|
||||||
}
|
}
|
||||||
// remove unused data (because only changed data will be sent)
|
if(isUSB){
|
||||||
currentData[3] = 0;
|
if(currentData[0] == (byte)0x81 && currentData[1] == (byte)0x92){
|
||||||
currentData[5] = 0;
|
|
||||||
currentData[7] = 0;
|
currentData = Arrays.copyOfRange(currentData, 0x0D,0x20);
|
||||||
currentData[9] = 0;
|
int buttons = ByteBuffer.wrap(currentData).getInt() & 0xFFFFFF00;
|
||||||
|
|
||||||
|
byte LX = (byte) ((short) ((currentData[0x04] << 8 &0xFF00) | (((short)currentData[0x03])&0xFF)) >> 0x04);
|
||||||
|
byte LY = currentData[0x05];
|
||||||
|
byte RX = (byte) ((short) ((currentData[0x07] << 8 &0xFF00) | (((short)currentData[0x06])&0xFF)) >> 0x04);
|
||||||
|
byte RY = currentData[0x08];
|
||||||
|
byte[] btData = new byte[0x0B];
|
||||||
|
|
||||||
|
int newButtons = 0;
|
||||||
|
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_A) == SWITCH_PRO_USB_BUTTON_A) newButtons |= SWITCH_PRO_BT_BUTTON_A;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_B) == SWITCH_PRO_USB_BUTTON_B) newButtons |= SWITCH_PRO_BT_BUTTON_B;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_X) == SWITCH_PRO_USB_BUTTON_X) newButtons |= SWITCH_PRO_BT_BUTTON_X;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_Y) == SWITCH_PRO_USB_BUTTON_Y) newButtons |= SWITCH_PRO_BT_BUTTON_Y;
|
||||||
|
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_PLUS) == SWITCH_PRO_USB_BUTTON_PLUS) newButtons |= SWITCH_PRO_BT_BUTTON_PLUS;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_MINUS) == SWITCH_PRO_USB_BUTTON_MINUS) newButtons |= SWITCH_PRO_BT_BUTTON_MINUS;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_HOME) == SWITCH_PRO_USB_BUTTON_HOME) newButtons |= SWITCH_PRO_BT_BUTTON_HOME;
|
||||||
|
//if((buttons & SWITCH_PRO_USB_BUTTON_SCREENSHOT) == SWITCH_PRO_USB_BUTTON_SCREENSHOT) newButtons |= SWITCH_PRO_BT_BUTTON_SCREENSHOT;
|
||||||
|
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_R) == SWITCH_PRO_USB_BUTTON_R) newButtons |= SWITCH_PRO_BT_BUTTON_R;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_ZR) == SWITCH_PRO_USB_BUTTON_ZR) newButtons |= SWITCH_PRO_BT_BUTTON_ZR;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_STICK_R) == SWITCH_PRO_USB_BUTTON_STICK_R) newButtons |= SWITCH_PRO_BT_BUTTON_STICK_R;
|
||||||
|
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_L) == SWITCH_PRO_USB_BUTTON_L) newButtons |= SWITCH_PRO_BT_BUTTON_L;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_ZL) == SWITCH_PRO_USB_BUTTON_ZL) newButtons |= SWITCH_PRO_BT_BUTTON_ZL;
|
||||||
|
if((buttons & SWITCH_PRO_USB_BUTTON_STICK_L) == SWITCH_PRO_USB_BUTTON_STICK_L) newButtons |= SWITCH_PRO_BT_BUTTON_STICK_L;
|
||||||
|
|
||||||
|
byte dpad = currentData[2];
|
||||||
|
byte dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_NEUTRAL_VALUE;
|
||||||
|
|
||||||
|
if(((dpad & SWITCH_PRO_USB_BUTTON_UP_VALUE) == SWITCH_PRO_USB_BUTTON_UP_VALUE) &&
|
||||||
|
((dpad & SWITCH_PRO_USB_BUTTON_RIGHT_VALUE) == SWITCH_PRO_USB_BUTTON_RIGHT_VALUE)){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_NE_VALUE;
|
||||||
|
}else if(((dpad & SWITCH_PRO_USB_BUTTON_DOWN_VALUE) == SWITCH_PRO_USB_BUTTON_DOWN_VALUE) &&
|
||||||
|
((dpad & SWITCH_PRO_USB_BUTTON_RIGHT_VALUE) == SWITCH_PRO_USB_BUTTON_RIGHT_VALUE)){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_SE_VALUE;
|
||||||
|
}else if(((dpad & SWITCH_PRO_USB_BUTTON_DOWN_VALUE) == SWITCH_PRO_USB_BUTTON_DOWN_VALUE) &&
|
||||||
|
((dpad & SWITCH_PRO_USB_BUTTON_LEFT_VALUE) == SWITCH_PRO_USB_BUTTON_LEFT_VALUE)){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_SW_VALUE;
|
||||||
|
}else if(((dpad & SWITCH_PRO_USB_BUTTON_UP_VALUE) == SWITCH_PRO_USB_BUTTON_UP_VALUE) &&
|
||||||
|
((dpad & SWITCH_PRO_USB_BUTTON_LEFT_VALUE) == SWITCH_PRO_USB_BUTTON_LEFT_VALUE)){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_NW_VALUE;
|
||||||
|
}else if((dpad & SWITCH_PRO_USB_BUTTON_UP_VALUE) == SWITCH_PRO_USB_BUTTON_UP_VALUE){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_N_VALUE;
|
||||||
|
}else if((dpad & SWITCH_PRO_USB_BUTTON_RIGHT_VALUE) == SWITCH_PRO_USB_BUTTON_RIGHT_VALUE){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_E_VALUE;
|
||||||
|
}else if((dpad & SWITCH_PRO_USB_BUTTON_DOWN_VALUE) == SWITCH_PRO_USB_BUTTON_DOWN_VALUE){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_S_VALUE;
|
||||||
|
}else if((dpad & SWITCH_PRO_USB_BUTTON_LEFT_VALUE) == SWITCH_PRO_USB_BUTTON_LEFT_VALUE){
|
||||||
|
dpadResult = SWITCH_PRO_BT_BUTTON_DPAD_W_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
btData[0] = (byte) ((newButtons >> 24) & 0xFF);
|
||||||
|
btData[1] = (byte) ((newButtons >> 16) & 0xFF);
|
||||||
|
btData[2] |= dpadResult;
|
||||||
|
btData[4] = LX;
|
||||||
|
btData[6] = (byte) (LY * -1) ;
|
||||||
|
btData[8] = RX;
|
||||||
|
btData[10] = (byte) (RY * -1) ;
|
||||||
|
currentData = btData;
|
||||||
|
//System.out.println(Utilities.ByteArrayToString(currentData));
|
||||||
|
}else{
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
currentData = Arrays.copyOfRange(currentData, 0x01,12);
|
||||||
|
currentData[3] = 0;
|
||||||
|
currentData[5] = 0;
|
||||||
|
currentData[7] = 0;
|
||||||
|
currentData[9] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return currentData;
|
return currentData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean sendReadCmd() {
|
||||||
|
return (hidDevice.hid_write(CMD_readInput, CMD_readInput.length,(byte) 0x80) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean doUSBHandshake() {
|
||||||
|
byte[] read_buf = new byte[0x40];
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
if(res >= 0){
|
||||||
|
hidDevice.hid_read(read_buf,read_buf.length);
|
||||||
|
|
||||||
|
res = hidDevice.hid_write(CMD_DO_HANDSHAKE,CMD_DO_HANDSHAKE.length,(byte) 0x80);
|
||||||
|
if(res < 0) return false;
|
||||||
|
|
||||||
|
res = hidDevice.hid_write(CMD_HID_ONLY,CMD_HID_ONLY.length,(byte) 0x80);
|
||||||
|
if(res < 0) return false;
|
||||||
|
|
||||||
|
res = hidDevice.hid_read(read_buf,read_buf.length+1);
|
||||||
|
if(read_buf[0] != 0x00){
|
||||||
|
MessageBoxManager.addMessageBox("You need to reattach the Switch Pro Controller or restart the network client!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getInfoText() {
|
public String getInfoText() {
|
||||||
return "Switch Pro Controller on " + getIdentifier();
|
return "Switch Pro Controller on " + getIdentifier();
|
||||||
|
@ -83,4 +83,10 @@ public interface HidDevice {
|
|||||||
* @return product string (name)
|
* @return product string (name)
|
||||||
*/
|
*/
|
||||||
String getProductString();
|
String getProductString();
|
||||||
|
|
||||||
|
int hid_write(byte[] data, int length, byte reportID);
|
||||||
|
|
||||||
|
int hid_read(byte[] data);
|
||||||
|
|
||||||
|
int hid_read(byte[] data, int timeoutMillis);
|
||||||
}
|
}
|
||||||
|
@ -72,8 +72,8 @@ public class HidManager {
|
|||||||
public static boolean isGamepad(HidDevice info) {
|
public static boolean isGamepad(HidDevice info) {
|
||||||
if (info == null) return false;
|
if (info == null) return false;
|
||||||
short usage = info.getUsageID();
|
short usage = info.getUsageID();
|
||||||
return (info.getProductString().toLowerCase().contains("gamepad") || usage == 0x05 || usage == 0x04 || isNintendoController(info)
|
String productString = info.getProductString();
|
||||||
|| isPlaystationController(info));
|
return ((productString != null && productString.toLowerCase().contains("gamepad")) || usage == 0x05 || usage == 0x04 || isNintendoController(info) || isPlaystationController(info));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isKeyboard(HidDevice info) {
|
public static boolean isKeyboard(HidDevice info) {
|
||||||
@ -108,7 +108,7 @@ public class HidManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
if (Settings.isMacOSX()) {
|
if (Settings.isMacOSX()) { // PureJavaHid is not properly implemented for OSX!
|
||||||
backend = new Hid4JavaHidManagerBackend();
|
backend = new Hid4JavaHidManagerBackend();
|
||||||
} else if (Settings.isWindows()) {
|
} else if (Settings.isWindows()) {
|
||||||
backend = new PureJavaHidManagerBackend();
|
backend = new PureJavaHidManagerBackend();
|
||||||
|
@ -56,7 +56,7 @@ class Hid4JavaHidDevice implements HidDevice {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] getLatestData() {
|
public byte[] getLatestData() {
|
||||||
int length = myDevice.read(data);
|
int length = hid_read(data);
|
||||||
if (length <= 0) return new byte[0];
|
if (length <= 0) return new byte[0];
|
||||||
return Arrays.copyOf(data, length);
|
return Arrays.copyOf(data, length);
|
||||||
}
|
}
|
||||||
@ -86,4 +86,19 @@ class Hid4JavaHidDevice implements HidDevice {
|
|||||||
public short getUsagePage() {
|
public short getUsagePage() {
|
||||||
return (short) myDevice.getUsagePage();
|
return (short) myDevice.getUsagePage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hid_write(byte[] data, int length,byte reportId) {
|
||||||
|
return myDevice.write(data, length, reportId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hid_read(byte[] data) {
|
||||||
|
return myDevice.read(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hid_read(byte[] data,int timeoutMillis) {
|
||||||
|
return myDevice.read(data,timeoutMillis);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,27 +30,21 @@ import net.ash.HIDToVPADNetworkClient.hid.HidDevice;
|
|||||||
import net.ash.HIDToVPADNetworkClient.util.MessageBox;
|
import net.ash.HIDToVPADNetworkClient.util.MessageBox;
|
||||||
import net.ash.HIDToVPADNetworkClient.util.MessageBoxManager;
|
import net.ash.HIDToVPADNetworkClient.util.MessageBoxManager;
|
||||||
import net.ash.HIDToVPADNetworkClient.util.Settings;
|
import net.ash.HIDToVPADNetworkClient.util.Settings;
|
||||||
|
import net.ash.HIDToVPADNetworkClient.util.Utilities;
|
||||||
import purejavahidapi.HidDeviceInfo;
|
import purejavahidapi.HidDeviceInfo;
|
||||||
import purejavahidapi.InputReportListener;
|
import purejavahidapi.InputReportListener;
|
||||||
|
|
||||||
@Log
|
@Log
|
||||||
class PureJavaHidDevice implements HidDevice, InputReportListener {
|
class PureJavaHidDevice implements HidDevice {
|
||||||
private purejavahidapi.HidDevice myDevice = null;
|
private purejavahidapi.HidDevice myDevice = null;
|
||||||
private final purejavahidapi.HidDeviceInfo myDeviceInfo;
|
private final purejavahidapi.HidDeviceInfo myDeviceInfo;
|
||||||
|
|
||||||
private final Object dataLock = new Object();
|
|
||||||
protected byte[] currentData = new byte[0];
|
protected byte[] currentData = new byte[0];
|
||||||
|
|
||||||
public PureJavaHidDevice(HidDeviceInfo info) {
|
public PureJavaHidDevice(HidDeviceInfo info) {
|
||||||
this.myDeviceInfo = info;
|
this.myDeviceInfo = info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Synchronized("dataLock")
|
|
||||||
public void onInputReport(purejavahidapi.HidDevice source, byte reportID, byte[] reportData, int reportLength) {
|
|
||||||
currentData = Arrays.copyOfRange(reportData, 0, reportLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public short getVendorId() {
|
public short getVendorId() {
|
||||||
return myDeviceInfo.getVendorId();
|
return myDeviceInfo.getVendorId();
|
||||||
@ -68,7 +62,6 @@ class PureJavaHidDevice implements HidDevice, InputReportListener {
|
|||||||
boolean result = true;
|
boolean result = true;
|
||||||
try {
|
try {
|
||||||
myDevice = purejavahidapi.PureJavaHidApi.openDevice(myDeviceInfo);
|
myDevice = purejavahidapi.PureJavaHidApi.openDevice(myDeviceInfo);
|
||||||
myDevice.setInputReportListener(this);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
result = false;
|
result = false;
|
||||||
if (e.getMessage().contains("errno 13") && Settings.isLinux()) {
|
if (e.getMessage().contains("errno 13") && Settings.isLinux()) {
|
||||||
@ -83,6 +76,8 @@ class PureJavaHidDevice implements HidDevice, InputReportListener {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,10 +86,12 @@ class PureJavaHidDevice implements HidDevice, InputReportListener {
|
|||||||
myDevice.close();
|
myDevice.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private byte[] data = new byte[64];
|
||||||
@Override
|
@Override
|
||||||
@Synchronized("dataLock")
|
|
||||||
public byte[] getLatestData() {
|
public byte[] getLatestData() {
|
||||||
return currentData.clone();
|
int length = hid_read(data);
|
||||||
|
if (length <= 0) return new byte[0];
|
||||||
|
return Arrays.copyOf(data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -114,7 +111,9 @@ class PureJavaHidDevice implements HidDevice, InputReportListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getProductString() {
|
public String getProductString() {
|
||||||
return myDeviceInfo.getProductString().trim();
|
String result = myDeviceInfo.getProductString();
|
||||||
|
if(result != null) result = result.trim();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -122,4 +121,27 @@ class PureJavaHidDevice implements HidDevice, InputReportListener {
|
|||||||
return "PureJavaHidDevice [vid= " + String.format("%04X", getVendorId()) + ", pid= " + String.format("%04X", getProductId()) + ", path= "
|
return "PureJavaHidDevice [vid= " + String.format("%04X", getVendorId()) + ", pid= " + String.format("%04X", getProductId()) + ", path= "
|
||||||
+ getPath().trim() + ", usage= " + String.format("%04X:%04X", getUsagePage(), getUsageID()) + ", data=" + Arrays.toString(currentData) + "]";
|
+ getPath().trim() + ", usage= " + String.format("%04X:%04X", getUsagePage(), getUsageID()) + ", data=" + Arrays.toString(currentData) + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hid_write(byte[] data, int length, byte reportID){
|
||||||
|
try{
|
||||||
|
return myDevice.setOutputReport(reportID, data, length);
|
||||||
|
}catch(IllegalStateException e){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hid_read(byte[] data) {
|
||||||
|
return hid_read(data,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hid_read(byte[] data, int timeoutMillis) {
|
||||||
|
try{
|
||||||
|
return myDevice.getInputReport(data,timeoutMillis);
|
||||||
|
}catch(IllegalStateException e){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,5 +167,4 @@ public final class ActiveControllerManager implements Runnable {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user