2017-04-05 11:44:21 +02:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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.hid.purejavahid ;
2017-04-05 18:14:58 +02:00
import java.io.IOException ;
2017-04-05 11:44:21 +02:00
import java.util.Arrays ;
import lombok.Synchronized ;
2017-04-13 05:47:56 +02:00
import lombok.extern.java.Log ;
2017-04-05 11:44:21 +02:00
import net.ash.HIDToVPADNetworkClient.hid.HidDevice ;
2017-04-13 05:47:56 +02:00
import net.ash.HIDToVPADNetworkClient.util.MessageBox ;
import net.ash.HIDToVPADNetworkClient.util.MessageBoxManager ;
import net.ash.HIDToVPADNetworkClient.util.Settings ;
2017-04-05 18:14:58 +02:00
import purejavahidapi.HidDeviceInfo ;
2017-04-05 11:44:21 +02:00
import purejavahidapi.InputReportListener ;
2017-04-13 05:47:56 +02:00
@Log
2017-04-05 11:44:21 +02:00
class PureJavaHidDevice implements HidDevice , InputReportListener {
2017-04-05 18:14:58 +02:00
private purejavahidapi . HidDevice myDevice = null ;
private final purejavahidapi . HidDeviceInfo myDeviceInfo ;
2017-04-05 11:44:21 +02:00
private final Object dataLock = new Object ( ) ;
2017-04-05 20:38:03 +02:00
protected byte [ ] currentData = new byte [ 0 ] ;
2017-04-05 11:44:21 +02:00
2017-04-05 18:14:58 +02:00
public PureJavaHidDevice ( HidDeviceInfo info ) {
this . myDeviceInfo = info ;
2017-04-05 11:44:21 +02:00
}
@Override
@Synchronized ( " dataLock " )
public void onInputReport ( purejavahidapi . HidDevice source , byte reportID , byte [ ] reportData , int reportLength ) {
currentData = Arrays . copyOfRange ( reportData , 0 , reportLength ) ;
}
@Override
public short getVendorId ( ) {
2017-04-05 18:14:58 +02:00
return myDeviceInfo . getVendorId ( ) ;
2017-04-05 11:44:21 +02:00
}
@Override
public short getProductId ( ) {
2017-04-05 18:14:58 +02:00
return myDeviceInfo . getProductId ( ) ;
}
2017-04-13 05:47:56 +02:00
private static boolean hasShownUdevErrorMessage = false ;
2017-04-13 15:32:55 +02:00
2017-04-05 18:14:58 +02:00
@Override
public boolean open ( ) {
boolean result = true ;
try {
myDevice = purejavahidapi . PureJavaHidApi . openDevice ( myDeviceInfo ) ;
myDevice . setInputReportListener ( this ) ;
} catch ( IOException e ) {
result = false ;
2017-04-13 05:47:56 +02:00
if ( e . getMessage ( ) . contains ( " errno 13 " ) & & Settings . isLinux ( ) ) {
if ( ! hasShownUdevErrorMessage ) {
hasShownUdevErrorMessage = true ;
String msg = " Could not access HID devices. \ nTo fix this, please add the following udev rule: \ n \ nKERNEL== \" hidraw* \" , SUBSYSTEM== \" hidraw \" , MODE= \" 0664 \" , GROUP= \" plugdev \" \ n \ nThis will allow everyone to read from HIDs, and users in the group \" plugdev \" to read and write. \ nIt's reccomended to add yourself to this group. \ n \ nHID To VPAD Network Client will be unable to use HIDs until this issue is resolved. " ;
MessageBoxManager . addMessageBox ( new MessageBox ( msg , MessageBox . MESSAGE_ERROR ) ) ;
log . severe ( msg ) ;
e . printStackTrace ( ) ;
}
} else {
e . printStackTrace ( ) ;
}
2017-04-05 18:14:58 +02:00
}
return result ;
2017-04-05 11:44:21 +02:00
}
@Override
public void close ( ) {
myDevice . close ( ) ;
}
@Override
@Synchronized ( " dataLock " )
public byte [ ] getLatestData ( ) {
return currentData . clone ( ) ;
}
2017-04-05 18:14:58 +02:00
@Override
2017-04-12 13:32:17 +02:00
public short getUsagePage ( ) {
2017-04-05 18:14:58 +02:00
return myDeviceInfo . getUsagePage ( ) ;
}
2017-04-13 15:32:55 +02:00
2017-04-12 13:32:17 +02:00
@Override
public short getUsageID ( ) {
return myDeviceInfo . getUsageID ( ) ;
}
2017-04-05 18:14:58 +02:00
@Override
public String getPath ( ) {
return myDeviceInfo . getPath ( ) ;
}
2017-04-10 15:43:54 +02:00
2017-04-12 13:50:32 +02:00
@Override
public String getProductString ( ) {
2017-04-13 11:23:02 +02:00
return myDeviceInfo . getProductString ( ) . trim ( ) ;
2017-04-12 13:50:32 +02:00
}
2017-04-13 15:32:55 +02:00
2017-04-10 15:43:54 +02:00
@Override
public String toString ( ) {
2017-04-13 15:32:55 +02:00
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 ) + " ] " ;
2017-04-10 15:43:54 +02:00
}
2017-04-05 11:44:21 +02:00
}