Giter VIP home page Giter VIP logo

purejavahidapi's Introduction

"I'm inspired,intrigued, amazed and annoyed by how difficult, complex, rare and long time coming simple cross platform USB IO is!"

Pure Java HID-API

Release

Summary

PureJavaHidApi is a crossplatform Application Programming Interface (API) for accessing USB HID devices from Java, so it is a library aimed at programmers, not end users.

PureJavaHidApi is written 100% in Java so it is easy for Java programmers to develop and debug and it requires no native libraries when deployed.

Native access to the underlaying operating system's USB device interface is provided by the wonderful JNA library which takes away all the pain of compiling and deploying native code.

Project Status

In someways this is early days but the code is actual daily production use in the EazyCNC Project so there is some credibility.

The basic input/output report functionality has been tested on all supported platforms and works but some of the less common features (like feature reports) have not been tested because of lack of suitable test hardware.

At this stage some API breakage as the library matures towards simplicity maybe expected.

Supported Platforms

  • Windows
  • Mac OS X
  • Linux

Basic Functionality

PureJavaHidApi provides the capability to enumerate (find) and open attached USB HID devices and send and receive reports i.e. chucks of bytes.

Planned Functionality

  • Ability to read and parse the report descriptors (1)

  • Persintent and sensical device path names for all platforms would be great!

(1) there is a semi-decent parser in purejavahidapi.hidparser but the ability to read raw descriptor still eludes me.

Documentation

The definitive PureJavaHidApi reference is the JavaDoc .

Why HID?

Why would you like to use PureJavaHidApi to access HID devices?

The answer is that you usually don't!

Most HID devices (like Mouse, Keyboard etc) have specific APIs provided by the operating system and you should use those to access them.

However some device which are not really Human Interface Devices in the original intent of the USB HID standard nevertheless represent themselves as HID devices. Devices like ThinkGeek USB Rocket Launcher or Oregon Scientific WMR100 weather stations to name two.

It is specifically for accessing these types of devices that PureJavaHidApi is aimed for.

Now why do they represent represent themselves as HID devices?

For one overwhelming advantage over other class of USB devices: all major operating systems have built in HID drivers which means that no driver installation is required. Hard as it for a programmer to understand driver installation is a major hurdle and can make the difference between making the sale or not.

If you are considering developing a USB device, then incarnating it as a HID device is an option worth considering.

So what is the catch?

HID devices are limited to transferring one 64 byte packet once each 1 msec or 64000 bytes/sec each way. If you need more than that you have take an other route, I suggest you head over to libusb project .

Why yet another HID library?

PureJavaHidApi is by no means the only game in town, for example there is hid4java which incidentally uses JNA just like PureJavaHidApi with the difference that it builds on the C-library HIDAPI , fortunately it handles the native library distribution and deployment for you, which is great as it can be a chore.

Code Example

To list all available HID devices use code like:

import purejavahidapi.*;
...
List<HidDeviceInfo> devList = PureJavaHidApi.enumerateDevices();
for (HidDeviceInfo info : devList) {
	System.out.printf("VID = 0x%04X PID = 0x%04X Manufacturer = %s Product = %s Path = %s\n", //
		info.getVendorId(), //
		info.getProductId(), //
		info.getManufacturerString(), //
		info.getProductString(), //
		info.getPath());
		}

To find a generic USB Gamepad:

import purejavahidapi.*;

List<HidDeviceInfo> devList = PureJavaHidApi.enumerateDevices();
HidDeviceInfo devInfo = null;
for (HidDeviceInfo info : devList) {
	if (info.getVendorId() == (short)0x0810 && info.getProductId() == (short)0x0005) {
		devInfo = info;
		break;
		}
	}

... and then open and attach an input report listener to it:

HidDevice dev=PureJavaHidApi.openDevice(devInfo);
dev.setInputReportListener(new InputReportListener() {
	@Override
	public void onInputReport(HidDevice source, byte Id, byte[] data, int len) {
		System.out.printf("onInputReport: id %d len %d data ", Id, len);
		for (int i = 0; i < len; i++)
			System.out.printf("%02X ", data[i]);
		System.out.println();
		}
	});

Getting Started

Using the examples

Check out the whole project from github and execute this:

./gradlew runExample1

Or for the second example (requires specific hardware):

./gradlew runExample2

Using in your own project

  1. Add the JitPack repository to your build:
repositories {
	jcenter()
	maven { url "https://jitpack.io" }
}
  1. Add this project as a dependency:
dependencies {
 	compile 'com.github.xcuipir:purejavahidapi:0.0.11'
}
  1. For distribution purposes, make sure that JNA can load its native library.

License

PureJavaHidApi is BSD licensed but please note it depends on JNA which is LGPL/ASL dual licensed.

Acknowledgment

While PureJavaHidApi is totally independent developement from the great HIDAPI by SIGNAL11 a lot of the technical and intricate knowledge needed to access HID devices were cherry picked ripe from that project which I gratefully acknowledge.

purejavahidapi's People

Contributors

nyholku avatar mrmurnst avatar openconcerto avatar vogt31337 avatar luciano-schirmer avatar

Stargazers

emetemunoy avatar  avatar

Watchers

Michael Schantl avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.