From c8f404ac38e8b8d4f8ab44b3af4eec6a0fe94efd Mon Sep 17 00:00:00 2001 From: Rik Veenboer Date: Sun, 30 Nov 2014 09:13:30 +0000 Subject: [PATCH] Move required java source files to appropriate directory --- LibusbJava/.cdtproject | 58 - LibusbJava/.cproject | 67 - LibusbJava/.project | 90 - .../.settings/org.eclipse.cdt.core.prefs | 4 - LibusbJava/LibusbJava.cpp | 852 ------- LibusbJava/LibusbJava.h | 205 -- LibusbJava/LibusbTest.cpp | 466 ---- LibusbJava/build.xml | 98 - LibusbJava/common.rc | 35 - LibusbJava/error.h | 23 - LibusbJava/libusb.a | Bin 27984 -> 0 bytes LibusbJava/project.properties | 54 - LibusbJava/resource.rc | 7 - LibusbJava/usb.h | 394 ---- LibusbJava/version.properties | 5 - java/.classpath | 8 - java/.project | 30 - java/.settings/org.eclipse.jdt.ui.prefs | 3 - java/LGPL.txt | 504 ---- java/META-INF/MANIFEST.MF | 9 - java/README.txt | 27 - java/build.properties | 4 - java/build.xml | 66 - java/deployment.properties | 8 - java/deployment.xml | 60 - java/project.properties | 10 - java/src/.configure | 6 - .../ntb/usb/testApp/AbstractDeviceInfo.java | 211 -- java/src/ch/ntb/usb/testApp/TestApp.java | 709 ------ java/src/ch/ntb/usb/testApp/TestDevice.java | 191 -- java/src/ch/ntb/usb/testApp/package.html | 16 - java/test/ch/ntb/usb/demo/LogBus.java | 40 - java/test/ch/ntb/usb/demo/ReadWrite.java | 60 - java/test/ch/ntb/usb/test/DeviceTest.java | 625 ----- java/test/ch/ntb/usb/test/MemoryLeakTest.java | 199 -- java/test/ch/ntb/usb/test/TestLibUsbJava.java | 240 -- .../ch/ntb/usb/test/devices/AT90USB1287.java | 34 - .../ch/ntb/usb/test/devices/CY7C68013A.java | 31 - java/test/ch/ntb/usb/test/devices/MX500.java | 32 - .../ch/ntb/usb/test/devices/MousePlus.java | 34 - java/testdevice.properties | 13 - java/uml/StarUML.url | 3 - java/uml/ch.ntb.usb.jpg | Bin 80492 -> 0 bytes java/uml/ch.ntb.usb.uml | 2023 ----------------- java/version.properties | 4 - .../main/java/ch/ntb/usb.r273}/Device.java | 1632 ++++++------- .../java/ch/ntb/usb.r273}/LibusbJava.java | 754 +++--- .../main/java/ch/ntb/usb.r273}/USB.java | 636 +++--- .../java/ch/ntb/usb.r273}/USBException.java | 46 +- .../ch/ntb/usb.r273}/USBTimeoutException.java | 42 +- .../main/java/ch/ntb/usb.r273}/Usb_Bus.java | 170 +- .../ntb/usb.r273}/Usb_Config_Descriptor.java | 276 +-- .../java/ch/ntb/usb.r273}/Usb_Descriptor.java | 118 +- .../java/ch/ntb/usb.r273}/Usb_Device.java | 248 +- .../ntb/usb.r273}/Usb_Device_Descriptor.java | 378 +-- .../usb.r273}/Usb_Endpoint_Descriptor.java | 316 +-- .../java/ch/ntb/usb.r273}/Usb_Interface.java | 100 +- .../usb.r273}/Usb_Interface_Descriptor.java | 290 +-- .../main/java/ch/ntb/usb.r273}/Utils.java | 120 +- .../java/ch/ntb/usb.r273}/logger/LogUtil.java | 270 +-- .../java/ch/ntb/usb.r273}/logger/package.html | 32 +- .../main/java/ch/ntb/usb.r273}/package.html | 52 +- .../ntb/usb.r273}/usbView/UsbTreeModel.java | 990 ++++---- .../ch/ntb/usb.r273}/usbView/UsbView.java | 806 +++---- .../ch/ntb/usb.r273}/usbView/package.html | 34 +- 65 files changed, 3655 insertions(+), 11213 deletions(-) delete mode 100644 LibusbJava/.cdtproject delete mode 100644 LibusbJava/.cproject delete mode 100644 LibusbJava/.project delete mode 100644 LibusbJava/.settings/org.eclipse.cdt.core.prefs delete mode 100644 LibusbJava/LibusbJava.cpp delete mode 100644 LibusbJava/LibusbJava.h delete mode 100644 LibusbJava/LibusbTest.cpp delete mode 100644 LibusbJava/build.xml delete mode 100644 LibusbJava/common.rc delete mode 100644 LibusbJava/error.h delete mode 100644 LibusbJava/libusb.a delete mode 100644 LibusbJava/project.properties delete mode 100644 LibusbJava/resource.rc delete mode 100644 LibusbJava/usb.h delete mode 100644 LibusbJava/version.properties delete mode 100644 java/.classpath delete mode 100644 java/.project delete mode 100644 java/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 java/LGPL.txt delete mode 100644 java/META-INF/MANIFEST.MF delete mode 100644 java/README.txt delete mode 100644 java/build.properties delete mode 100644 java/build.xml delete mode 100644 java/deployment.properties delete mode 100644 java/deployment.xml delete mode 100644 java/project.properties delete mode 100644 java/src/.configure delete mode 100644 java/src/ch/ntb/usb/testApp/AbstractDeviceInfo.java delete mode 100644 java/src/ch/ntb/usb/testApp/TestApp.java delete mode 100644 java/src/ch/ntb/usb/testApp/TestDevice.java delete mode 100644 java/src/ch/ntb/usb/testApp/package.html delete mode 100644 java/test/ch/ntb/usb/demo/LogBus.java delete mode 100644 java/test/ch/ntb/usb/demo/ReadWrite.java delete mode 100644 java/test/ch/ntb/usb/test/DeviceTest.java delete mode 100644 java/test/ch/ntb/usb/test/MemoryLeakTest.java delete mode 100644 java/test/ch/ntb/usb/test/TestLibUsbJava.java delete mode 100644 java/test/ch/ntb/usb/test/devices/AT90USB1287.java delete mode 100644 java/test/ch/ntb/usb/test/devices/CY7C68013A.java delete mode 100644 java/test/ch/ntb/usb/test/devices/MX500.java delete mode 100644 java/test/ch/ntb/usb/test/devices/MousePlus.java delete mode 100644 java/testdevice.properties delete mode 100644 java/uml/StarUML.url delete mode 100644 java/uml/ch.ntb.usb.jpg delete mode 100644 java/uml/ch.ntb.usb.uml delete mode 100644 java/version.properties rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Device.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/LibusbJava.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/USB.java (97%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/USBException.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/USBTimeoutException.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Bus.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Config_Descriptor.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Descriptor.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Device.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Device_Descriptor.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Endpoint_Descriptor.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Interface.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Usb_Interface_Descriptor.java (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/Utils.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/logger/LogUtil.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/logger/package.html (94%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/package.html (95%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/usbView/UsbTreeModel.java (97%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/usbView/UsbView.java (96%) rename {java/src/ch/ntb/usb => src/main/java/ch/ntb/usb.r273}/usbView/package.html (95%) diff --git a/LibusbJava/.cdtproject b/LibusbJava/.cdtproject deleted file mode 100644 index b95c82a..0000000 --- a/LibusbJava/.cdtproject +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LibusbJava/.cproject b/LibusbJava/.cproject deleted file mode 100644 index 26a6217..0000000 --- a/LibusbJava/.cproject +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LibusbJava/.project b/LibusbJava/.project deleted file mode 100644 index 0032176..0000000 --- a/LibusbJava/.project +++ /dev/null @@ -1,90 +0,0 @@ - - - LibusbJava - - - - - - org.eclipse.cdt.make.core.makeBuilder - - - - org.eclipse.cdt.core.errorOutputParser - org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser; - - - org.eclipse.cdt.make.core.append_environment - true - - - org.eclipse.cdt.make.core.build.arguments - - - - org.eclipse.cdt.make.core.build.command - make - - - org.eclipse.cdt.make.core.build.location - - - - org.eclipse.cdt.make.core.build.target.auto - all - - - org.eclipse.cdt.make.core.build.target.clean - clean - - - org.eclipse.cdt.make.core.build.target.full - clean all - - - org.eclipse.cdt.make.core.build.target.inc - all - - - org.eclipse.cdt.make.core.enableAutoBuild - false - - - org.eclipse.cdt.make.core.enableCleanBuild - false - - - org.eclipse.cdt.make.core.enableFullBuild - false - - - org.eclipse.cdt.make.core.enabledIncrementalBuild - false - - - org.eclipse.cdt.make.core.environment - - - - org.eclipse.cdt.make.core.stopOnError - false - - - org.eclipse.cdt.make.core.useDefaultBuildCmd - true - - - - - org.eclipse.cdt.make.core.ScannerConfigBuilder - - - - - - org.eclipse.cdt.core.cnature - org.eclipse.cdt.make.core.makeNature - org.eclipse.cdt.make.core.ScannerConfigNature - org.eclipse.cdt.core.ccnature - - diff --git a/LibusbJava/.settings/org.eclipse.cdt.core.prefs b/LibusbJava/.settings/org.eclipse.cdt.core.prefs deleted file mode 100644 index ae32dbf..0000000 --- a/LibusbJava/.settings/org.eclipse.cdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -#Sat Aug 11 13:28:28 CEST 2007 -eclipse.preferences.version=1 -indexer/indexerId=org.eclipse.cdt.core.domsourceindexer -indexerId=org.eclipse.cdt.core.domsourceindexer diff --git a/LibusbJava/LibusbJava.cpp b/LibusbJava/LibusbJava.cpp deleted file mode 100644 index 4a72b65..0000000 --- a/LibusbJava/LibusbJava.cpp +++ /dev/null @@ -1,852 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ - -#include -#include -#include -#include -#include -#include -#include "LibusbJava.h" - -// Windows specific stuff -#ifdef WIN32 -#include -#endif - -//#define DEBUGON - -// global bus (updated when usb_get_busses() is called) -struct usb_bus *busses; - -// global flag for loading all class, method and field ID references -int java_references_loaded = 0; - -// if > 0 an LibusbJava specific error string is set -char *libusbJavaError = NULL; - -// macros to set and clear LibusbJava specific errors -#define setLibusbJavaError(error) libusbJavaError = error -#define clearLibusbJavaError() libusbJavaError = NULL - -// class references -jclass usb_busClazz, usb_devClazz, usb_devDescClazz, usb_confDescClazz, \ - usb_intClazz, usb_intDescClazz, usb_epDescClazz; - -// method ID references -jmethodID usb_busMid, usb_devMid, usb_devDescMid, usb_confDescMid, \ - usb_intMid, usb_intDescMid, usb_epDescMid; - -// field ID references -// usb_bus -jfieldID usb_busFID_next, usb_busFID_prev, usb_busFID_dirname, \ - usb_busFID_devices, usb_busFID_location, usb_busFID_root_dev; -// usb_device -jfieldID usb_devFID_next, usb_devFID_prev, usb_devFID_filename, \ - usb_devFID_bus, usb_devFID_descriptor, usb_devFID_config, \ - usb_devFID_devnum, usb_devFID_num_children, usb_devFID_children, \ - usb_devFID_devStructAddr; -// usb_deviceDescriptor -jfieldID usb_devDescFID_bLength, usb_devDescFID_bDescriptorType, \ - usb_devDescFID_bcdUSB, usb_devDescFID_bDeviceClass, \ - usb_devDescFID_bDeviceSubClass, usb_devDescFID_bDeviceProtocol, \ - usb_devDescFID_bMaxPacketSize0, usb_devDescFID_idVendor, \ - usb_devDescFID_idProduct, usb_devDescFID_bcdDevice, \ - usb_devDescFID_iManufacturer, usb_devDescFID_iProduct, \ - usb_devDescFID_iSerialNumber, usb_devDescFID_bNumConfigurations; -// usb_configurationDescriptor -jfieldID usb_confDescFID_bLength, usb_confDescFID_bDescriptorType, usb_confDescFID_wTotalLength, \ - usb_confDescFID_bNumInterfaces, usb_confDescFID_bConfigurationValue, \ - usb_confDescFID_iConfiguration, usb_confDescFID_bmAttributes, usb_confDescFID_MaxPower, \ - usb_confDescFID_interface_, usb_confDescFID_extra, usb_confDescFID_extralen; -// usb_interface -jfieldID usb_intFID_altsetting, usb_intFID_num_altsetting; -// usb_intDesc -jfieldID usb_intDescFID_bLength, usb_intDescFID_bDescriptorType, \ - usb_intDescFID_bInterfaceNumber, usb_intDescFID_bAlternateSetting, \ - usb_intDescFID_bNumEndpoints, usb_intDescFID_bInterfaceClass, \ - usb_intDescFID_bInterfaceSubClass, usb_intDescFID_bInterfaceProtocol, \ - usb_intDescFID_iInterface, usb_intDescFID_endpoint, usb_intDescFID_extra, \ - usb_intDescFID_extralen; -// usb_endpointDescriptor -jfieldID usb_epDescFID_bLength, usb_epDescFID_bDescriptorType, \ - usb_epDescFID_bEndpointAddress, usb_epDescFID_bmAttributes, \ - usb_epDescFID_wMaxPacketSize, usb_epDescFID_bInterval, \ - usb_epDescFID_bRefresh, usb_epDescFID_bSynchAddress, usb_epDescFID_extra, \ - usb_epDescFID_extralen; - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_set_debug - * Signature: (B)V - */ -JNIEXPORT void JNICALL Java_ch_ntb_usb_LibusbJava_usb_1set_1debug - (JNIEnv *env, jclass obj, jint level) - { - clearLibusbJavaError(); - usb_set_debug(level); - } -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_ch_ntb_usb_LibusbJava_usb_1init - (JNIEnv *env, jclass obj) - { - clearLibusbJavaError(); - usb_init(); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_find_busses - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1find_1busses - (JNIEnv *env, jclass obj) - { - clearLibusbJavaError(); - return usb_find_busses(); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_find_devices - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1find_1devices - (JNIEnv *env, jclass obj) - { - clearLibusbJavaError(); - return usb_find_devices(); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_busses - * Signature: ()Lch/ntb/usb/Usb_Bus; - */ -JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1busses - (JNIEnv *env, jclass obj) - { - - clearLibusbJavaError(); - - // only load class, method and field ID references once - if (!java_references_loaded) { - // find classes and field ids - // usb_bus - usb_busClazz = env->FindClass("ch/ntb/usb/Usb_Bus"); - if (usb_busClazz == NULL) { return NULL; /* exception thrown */ } - usb_busMid = env->GetMethodID(usb_busClazz, "","()V"); - if (usb_busMid == NULL) { return NULL; } - - usb_busFID_next = env->GetFieldID(usb_busClazz, "next", "Lch/ntb/usb/Usb_Bus;"); - usb_busFID_prev = env->GetFieldID(usb_busClazz, "prev", "Lch/ntb/usb/Usb_Bus;"); - usb_busFID_dirname = env->GetFieldID(usb_busClazz, "dirname", "Ljava/lang/String;"); - usb_busFID_devices = env->GetFieldID(usb_busClazz, "devices", "Lch/ntb/usb/Usb_Device;"); - usb_busFID_location = env->GetFieldID(usb_busClazz, "location", "J"); - usb_busFID_root_dev = env->GetFieldID(usb_busClazz, "root_dev", "Lch/ntb/usb/Usb_Device;"); - - // usb_device - usb_devClazz = env->FindClass("ch/ntb/usb/Usb_Device"); - if (usb_devClazz == NULL) { return NULL; /* exception thrown */ } - usb_devMid = env->GetMethodID(usb_devClazz, "","()V"); - if (usb_devMid == NULL) { return NULL; } - - usb_devFID_next = env->GetFieldID(usb_devClazz, "next", "Lch/ntb/usb/Usb_Device;"); - usb_devFID_prev = env->GetFieldID(usb_devClazz, "prev", "Lch/ntb/usb/Usb_Device;"); - usb_devFID_filename = env->GetFieldID(usb_devClazz, "filename", "Ljava/lang/String;"); - usb_devFID_bus = env->GetFieldID(usb_devClazz, "bus", "Lch/ntb/usb/Usb_Bus;"); - usb_devFID_descriptor = env->GetFieldID(usb_devClazz, "descriptor", "Lch/ntb/usb/Usb_Device_Descriptor;"); - usb_devFID_config = env->GetFieldID(usb_devClazz, "config", "[Lch/ntb/usb/Usb_Config_Descriptor;"); - usb_devFID_devnum = env->GetFieldID(usb_devClazz, "devnum", "B"); - usb_devFID_num_children = env->GetFieldID(usb_devClazz, "num_children", "B"); - usb_devFID_children = env->GetFieldID(usb_devClazz, "children", "Lch/ntb/usb/Usb_Device;"); - usb_devFID_devStructAddr = env->GetFieldID(usb_devClazz, "devStructAddr", "J"); - - - // usb_device_descriptor - usb_devDescClazz = env->FindClass("ch/ntb/usb/Usb_Device_Descriptor"); - if (usb_devDescClazz == NULL) { return NULL; /* exception thrown */ } - usb_devDescMid = env->GetMethodID(usb_devDescClazz, "","()V"); - if (usb_devDescMid == NULL) { return NULL; } - - usb_devDescFID_bLength = env->GetFieldID(usb_devDescClazz, "bLength", "B"); - usb_devDescFID_bDescriptorType = env->GetFieldID(usb_devDescClazz, "bDescriptorType", "B"); - usb_devDescFID_bcdUSB = env->GetFieldID(usb_devDescClazz, "bcdUSB", "S"); - usb_devDescFID_bDeviceClass = env->GetFieldID(usb_devDescClazz, "bDeviceClass", "B"); - usb_devDescFID_bDeviceSubClass = env->GetFieldID(usb_devDescClazz, "bDeviceSubClass", "B"); - usb_devDescFID_bDeviceProtocol = env->GetFieldID(usb_devDescClazz, "bDeviceProtocol", "B"); - usb_devDescFID_bMaxPacketSize0 = env->GetFieldID(usb_devDescClazz, "bMaxPacketSize0", "B"); - usb_devDescFID_idVendor = env->GetFieldID(usb_devDescClazz, "idVendor", "S"); - usb_devDescFID_idProduct = env->GetFieldID(usb_devDescClazz, "idProduct", "S"); - usb_devDescFID_bcdDevice = env->GetFieldID(usb_devDescClazz, "bcdDevice", "S"); - usb_devDescFID_iManufacturer = env->GetFieldID(usb_devDescClazz, "iManufacturer", "B"); - usb_devDescFID_iProduct = env->GetFieldID(usb_devDescClazz, "iProduct", "B"); - usb_devDescFID_iSerialNumber = env->GetFieldID(usb_devDescClazz, "iSerialNumber", "B"); - usb_devDescFID_bNumConfigurations = env->GetFieldID(usb_devDescClazz, "bNumConfigurations", "B"); - - // usb_configuration_descriptor - usb_confDescClazz = env->FindClass("ch/ntb/usb/Usb_Config_Descriptor"); - if (usb_confDescClazz == NULL) { return NULL; /* exception thrown */ } - usb_confDescMid = env->GetMethodID(usb_confDescClazz, "","()V"); - if (usb_confDescMid == NULL) { return NULL; } - - usb_confDescFID_bLength = env->GetFieldID(usb_confDescClazz, "bLength", "B"); - usb_confDescFID_bDescriptorType = env->GetFieldID(usb_confDescClazz, "bDescriptorType", "B"); - usb_confDescFID_wTotalLength = env->GetFieldID(usb_confDescClazz, "wTotalLength", "S"); - usb_confDescFID_bNumInterfaces = env->GetFieldID(usb_confDescClazz, "bNumInterfaces", "B"); - usb_confDescFID_bConfigurationValue = env->GetFieldID(usb_confDescClazz, "bConfigurationValue", "B"); - usb_confDescFID_iConfiguration = env->GetFieldID(usb_confDescClazz, "iConfiguration", "B"); - usb_confDescFID_bmAttributes = env->GetFieldID(usb_confDescClazz, "bmAttributes", "B"); - usb_confDescFID_MaxPower = env->GetFieldID(usb_confDescClazz, "MaxPower", "B"); - usb_confDescFID_interface_ = env->GetFieldID(usb_confDescClazz, "interface_", "[Lch/ntb/usb/Usb_Interface;"); - usb_confDescFID_extra = env->GetFieldID(usb_confDescClazz, "extra", "[B"); - usb_confDescFID_extralen = env->GetFieldID(usb_confDescClazz, "extralen", "I"); - - // usb_interface - usb_intClazz = env->FindClass("ch/ntb/usb/Usb_Interface"); - if (usb_intClazz == NULL) { return NULL; /* exception thrown */ } - usb_intMid = env->GetMethodID(usb_intClazz, "","()V"); - if (usb_intMid == NULL) { return NULL; } - - usb_intFID_altsetting = env->GetFieldID(usb_intClazz, "altsetting", "[Lch/ntb/usb/Usb_Interface_Descriptor;"); - usb_intFID_num_altsetting = env->GetFieldID(usb_intClazz, "num_altsetting", "I"); - - // usb_interface_descriptor - usb_intDescClazz = env->FindClass("ch/ntb/usb/Usb_Interface_Descriptor"); - if (usb_intDescClazz == NULL) { return NULL; /* exception thrown */ } - usb_intDescMid = env->GetMethodID(usb_intDescClazz, "","()V"); - if (usb_intDescMid == NULL) { return NULL; } - - usb_intDescFID_bLength = env->GetFieldID(usb_intDescClazz, "bLength", "B"); - usb_intDescFID_bDescriptorType = env->GetFieldID(usb_intDescClazz, "bDescriptorType", "B"); - usb_intDescFID_bInterfaceNumber = env->GetFieldID(usb_intDescClazz, "bInterfaceNumber", "B"); - usb_intDescFID_bAlternateSetting = env->GetFieldID(usb_intDescClazz, "bAlternateSetting", "B"); - usb_intDescFID_bNumEndpoints = env->GetFieldID(usb_intDescClazz, "bNumEndpoints", "B"); - usb_intDescFID_bInterfaceClass = env->GetFieldID(usb_intDescClazz, "bInterfaceClass", "B"); - usb_intDescFID_bInterfaceSubClass = env->GetFieldID(usb_intDescClazz, "bInterfaceSubClass", "B"); - usb_intDescFID_bInterfaceProtocol = env->GetFieldID(usb_intDescClazz, "bInterfaceProtocol", "B"); - usb_intDescFID_iInterface = env->GetFieldID(usb_intDescClazz, "iInterface", "B"); - usb_intDescFID_endpoint = env->GetFieldID(usb_intDescClazz, "endpoint", "[Lch/ntb/usb/Usb_Endpoint_Descriptor;"); - usb_intDescFID_extra = env->GetFieldID(usb_intDescClazz, "extra", "[B"); - usb_intDescFID_extralen = env->GetFieldID(usb_intDescClazz, "extralen", "I"); - - // usb_endpoint_descriptor - usb_epDescClazz = env->FindClass("ch/ntb/usb/Usb_Endpoint_Descriptor"); - if (usb_epDescClazz == NULL) { return NULL; /* exception thrown */ } - usb_epDescMid = env->GetMethodID(usb_epDescClazz, "","()V"); - if (usb_epDescMid == NULL) { return NULL; } - - usb_epDescFID_bLength = env->GetFieldID(usb_epDescClazz, "bLength", "B"); - usb_epDescFID_bDescriptorType = env->GetFieldID(usb_epDescClazz, "bDescriptorType", "B"); - usb_epDescFID_bEndpointAddress = env->GetFieldID(usb_epDescClazz, "bEndpointAddress", "B"); - usb_epDescFID_bmAttributes = env->GetFieldID(usb_epDescClazz, "bmAttributes", "B"); - usb_epDescFID_wMaxPacketSize = env->GetFieldID(usb_epDescClazz, "wMaxPacketSize", "S"); - usb_epDescFID_bInterval = env->GetFieldID(usb_epDescClazz, "bInterval", "B"); - usb_epDescFID_bRefresh = env->GetFieldID(usb_epDescClazz, "bRefresh", "B"); - usb_epDescFID_bSynchAddress = env->GetFieldID(usb_epDescClazz, "bSynchAddress", "B"); - usb_epDescFID_extra = env->GetFieldID(usb_epDescClazz, "extra", "[B"); - usb_epDescFID_extralen = env->GetFieldID(usb_epDescClazz, "extralen", "I"); -#ifdef DEBUGON - printf("usb_get_busses: Field initialization done (1)\n"); -#endif - } - - //************************************************************************// - - struct usb_device *dev; - struct usb_bus *bus; - - busses = usb_get_busses(); - bus = busses; - if (!bus){ - return NULL; - } - - // objects - jobject main_usb_busObj, usb_busObj, usb_busObj_next, usb_busObj_prev, \ - main_usb_devObj, usb_devObj, usb_devObj_next, usb_devObj_prev, \ - usb_devDescObj, usb_confDescObj, usb_intObj, usb_intDescObj, \ - usb_epDescObj; - - jobjectArray usb_confDescObjArray, usb_intObjArray, usb_intDescObjArray, usb_epDescObjArray; - - usb_busObj = NULL; - usb_busObj_prev = NULL; - main_usb_busObj = NULL; - -#ifdef DEBUGON - printf("usb_get_busses: usb_get_busses done (2)\n"); -#endif - - while (bus){ -#ifdef DEBUGON - printf("\tusb_get_busses: bus %x (3)\n", bus); -#endif - - // create a new object for every bus - if (!usb_busObj) { - usb_busObj = env->NewObject(usb_busClazz, usb_busMid); - if (!usb_busObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_busObj)"); - return NULL; - } - main_usb_busObj = usb_busObj; - } - - // fill the fields of the object - usb_busObj_next = NULL; - if (bus->next){ - usb_busObj_next = env->NewObject(usb_busClazz, usb_busMid); - if (!usb_busObj_next) { - setLibusbJavaError("shared library error: Error NewObject (usb_busObj_next)"); - return NULL; - } - } - env->SetObjectField(usb_busObj, usb_busFID_next, usb_busObj_next); - env->SetObjectField(usb_busObj, usb_busFID_prev, usb_busObj_prev); - env->SetObjectField(usb_busObj, usb_busFID_dirname, env->NewStringUTF(bus->dirname)); - env->SetLongField(usb_busObj, usb_busFID_location, bus->location); - - dev = bus->devices; - usb_devObj = NULL; - usb_devObj_prev = NULL; - main_usb_devObj = NULL; - - while (dev){ -#ifdef DEBUGON - printf("\tusb_get_busses: dev %x (4)\n", dev); -#endif - // create a new object for every device - if (!usb_devObj){ - usb_devObj = env->NewObject(usb_devClazz, usb_devMid); - if (!usb_devObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_devObj)"); - return NULL; - } - main_usb_devObj = usb_devObj; - } - // fill the fields of the object - usb_devObj_next = NULL; - if (dev->next){ - usb_devObj_next = env->NewObject(usb_devClazz, usb_devMid); - if (!usb_devObj_next) { - setLibusbJavaError("shared library error: Error NewObject (usb_devObj_next)"); - return NULL; - } - } - env->SetObjectField(usb_devObj, usb_devFID_next, usb_devObj_next); - env->SetObjectField(usb_devObj, usb_devFID_prev, usb_devObj_prev); - env->SetObjectField(usb_devObj, usb_devFID_bus, usb_busObj); - env->SetObjectField(usb_devObj, usb_devFID_filename, env->NewStringUTF(dev->filename)); - env->SetByteField(usb_devObj, usb_devFID_devnum, dev->devnum); - env->SetByteField(usb_devObj, usb_devFID_num_children, dev->num_children); - env->SetLongField(usb_devObj, usb_devFID_devStructAddr, (jlong) dev); - - // device descriptor - usb_devDescObj = env->NewObject(usb_devDescClazz, usb_devDescMid); - if (!usb_devDescObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_devDescObj)"); - return NULL; - } - env->SetByteField(usb_devDescObj, usb_devDescFID_bLength, dev->descriptor.bLength); - env->SetByteField(usb_devDescObj, usb_devDescFID_bDescriptorType, dev->descriptor.bDescriptorType); - env->SetShortField(usb_devDescObj, usb_devDescFID_bcdUSB, dev->descriptor.bcdUSB); - env->SetByteField(usb_devDescObj, usb_devDescFID_bDeviceClass, dev->descriptor.bDeviceClass); - env->SetByteField(usb_devDescObj, usb_devDescFID_bDeviceSubClass, dev->descriptor.bDeviceSubClass); - env->SetByteField(usb_devDescObj, usb_devDescFID_bDeviceProtocol, dev->descriptor.bDeviceProtocol); - env->SetByteField(usb_devDescObj, usb_devDescFID_bMaxPacketSize0, dev->descriptor.bMaxPacketSize0); - env->SetShortField(usb_devDescObj, usb_devDescFID_idVendor, dev->descriptor.idVendor); - env->SetShortField(usb_devDescObj, usb_devDescFID_idProduct, dev->descriptor.idProduct); - env->SetShortField(usb_devDescObj, usb_devDescFID_bcdDevice, dev->descriptor.bcdDevice); - env->SetByteField(usb_devDescObj, usb_devDescFID_iManufacturer, dev->descriptor.iManufacturer); - env->SetByteField(usb_devDescObj, usb_devDescFID_iProduct, dev->descriptor.iProduct); - env->SetByteField(usb_devDescObj, usb_devDescFID_iSerialNumber, dev->descriptor.iSerialNumber); - env->SetByteField(usb_devDescObj, usb_devDescFID_bNumConfigurations, dev->descriptor.bNumConfigurations); - - env->SetObjectField(usb_devObj, usb_devFID_descriptor, usb_devDescObj); - // configuration descriptor - // Loop through all of the configurations - usb_confDescObjArray = (jobjectArray) env->NewObjectArray(dev->descriptor.bNumConfigurations, usb_confDescClazz, NULL); - if (!usb_confDescObjArray) { - setLibusbJavaError("shared library error: Error NewObject 6"); - return NULL; - } - for (int c = 0; c < dev->descriptor.bNumConfigurations; c++){ -#ifdef DEBUGON - printf("\t\tusb_get_busses: configuration %x (5)\n", c); -#endif - if (dev->config == NULL) { - // this shouldn't happen, but it did occasionally (maybe this is (or probably was) a libusb bug) - setLibusbJavaError("shared library error: dev->config == NULL"); - return main_usb_busObj; - } - - usb_confDescObj = env->NewObject(usb_confDescClazz, usb_confDescMid); - if (!usb_confDescObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_confDescObj)"); - return NULL; - } - env->SetObjectArrayElement(usb_confDescObjArray, c, usb_confDescObj); - env->SetByteField(usb_confDescObj, usb_confDescFID_bLength, dev->config[c].bLength); - env->SetByteField(usb_confDescObj, usb_confDescFID_bDescriptorType, dev->config[c].bDescriptorType); - env->SetShortField(usb_confDescObj, usb_confDescFID_wTotalLength, dev->config[c].wTotalLength); - env->SetByteField(usb_confDescObj, usb_confDescFID_bNumInterfaces, dev->config[c].bNumInterfaces); - env->SetByteField(usb_confDescObj, usb_confDescFID_bConfigurationValue, dev->config[c].bConfigurationValue); - env->SetByteField(usb_confDescObj, usb_confDescFID_iConfiguration, dev->config[c].iConfiguration); - env->SetByteField(usb_confDescObj, usb_confDescFID_bmAttributes, dev->config[c].bmAttributes); - env->SetByteField(usb_confDescObj, usb_confDescFID_MaxPower, dev->config[c].MaxPower); - env->SetIntField(usb_confDescObj, usb_confDescFID_extralen, dev->config[c].extralen); - if (dev->config[c].extra){ - jbyteArray jbExtraDesc = env->NewByteArray(dev->config[c].extralen); - env->SetByteArrayRegion(jbExtraDesc, 0, dev->config[c].extralen, (jbyte *) dev->config[c].extra); - env->SetObjectField(usb_confDescObj, usb_confDescFID_extra, jbExtraDesc); - } else { - env->SetObjectField(usb_confDescObj, usb_confDescFID_extra, NULL); - } - // interface - usb_intObjArray = (jobjectArray) env->NewObjectArray(dev->config[c].bNumInterfaces, usb_intClazz, NULL); - if (!usb_intObjArray) { - setLibusbJavaError("shared library error: Error NewObject (usb_intObjArray)"); - return NULL; - } - for (int i = 0; i < dev->config[c].bNumInterfaces; i++){ -#ifdef DEBUGON - printf("\t\t\tusb_get_busses: interface %x (6)\n", i); -#endif - if (dev->config[c].interface == NULL) { - // this shouldn't happen - printf("dev->config[c].interface == NULL"); - return main_usb_busObj; - } - - usb_intObj = env->NewObject(usb_intClazz, usb_intMid); - if (!usb_intObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_intObj)"); - return NULL; - } - env->SetObjectArrayElement(usb_intObjArray, i, usb_intObj); - env->SetIntField(usb_intObj, usb_intFID_num_altsetting, dev->config[c].interface[i].num_altsetting); - // interface descriptor - usb_intDescObjArray = (jobjectArray) env->NewObjectArray(dev->config[c].interface[i].num_altsetting, usb_intDescClazz, NULL); - if (!usb_intDescObjArray) { - setLibusbJavaError("shared library error: Error NewObject (usb_intDescObjArray)"); - return NULL; - } - for (int a = 0; a < dev->config[c].interface[i].num_altsetting; a++){ -#ifdef DEBUGON - printf("\t\t\t\tusb_get_busses: interface descriptor %x (7)\n", a); -#endif - if (dev->config[c].interface[i].altsetting == NULL) { - // this shouldn't happen - printf("LibusbJava: usb_get_busses: dev->config[c].interface[i].altsetting == NULL\n"); - return main_usb_busObj; - } - - usb_intDescObj = env->NewObject(usb_intDescClazz, usb_intDescMid); - if (!usb_intDescObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_intDescObj)"); - return NULL; - } - env->SetObjectArrayElement(usb_intDescObjArray, a, usb_intDescObj); - env->SetByteField(usb_intDescObj, usb_intDescFID_bLength, dev->config[c].interface[i].altsetting[a].bLength); - env->SetByteField(usb_intDescObj, usb_intDescFID_bDescriptorType, dev->config[c].interface[i].altsetting[a].bDescriptorType); - env->SetByteField(usb_intDescObj, usb_intDescFID_bInterfaceNumber, dev->config[c].interface[i].altsetting[a].bInterfaceNumber); - env->SetByteField(usb_intDescObj, usb_intDescFID_bAlternateSetting, dev->config[c].interface[i].altsetting[a].bAlternateSetting); - env->SetByteField(usb_intDescObj, usb_intDescFID_bNumEndpoints, dev->config[c].interface[i].altsetting[a].bNumEndpoints); - env->SetByteField(usb_intDescObj, usb_intDescFID_bInterfaceClass, dev->config[c].interface[i].altsetting[a].bInterfaceClass); - env->SetByteField(usb_intDescObj, usb_intDescFID_bInterfaceSubClass, dev->config[c].interface[i].altsetting[a].bInterfaceSubClass); - env->SetByteField(usb_intDescObj, usb_intDescFID_bInterfaceProtocol, dev->config[c].interface[i].altsetting[a].bInterfaceProtocol); - env->SetByteField(usb_intDescObj, usb_intDescFID_iInterface, dev->config[c].interface[i].altsetting[a].iInterface); - env->SetIntField(usb_intDescObj, usb_intDescFID_extralen, dev->config[c].interface[i].altsetting[a].extralen); - if (dev->config[c].interface[i].altsetting[a].extra){ - jbyteArray jbExtraDesc = env->NewByteArray(dev->config[c].interface[i].altsetting[a].extralen); - env->SetByteArrayRegion(jbExtraDesc, 0, dev->config[c].interface[i].altsetting[a].extralen, (jbyte *) dev->config[c].interface[i].altsetting[a].extra); - env->SetObjectField(usb_intDescObj, usb_intDescFID_extra, jbExtraDesc); - } else { - env->SetObjectField(usb_intDescObj, usb_intDescFID_extra, NULL); - } - // endpoint descriptor - usb_epDescObjArray = (jobjectArray) env->NewObjectArray(dev->config[c].interface[i].altsetting[a].bNumEndpoints, usb_epDescClazz, NULL); - if (!usb_epDescObjArray) { - setLibusbJavaError("shared library error: Error NewObject (usb_epDescObjArray)"); - return NULL; - } - for (int e = 0; e < dev->config[c].interface[i].altsetting[a].bNumEndpoints; e++){ -#ifdef DEBUGON - printf("\t\t\t\t\tusb_get_busses: endpoint descriptor %x (8)\n", e); -#endif - if (dev->config[c].interface[i].altsetting[a].endpoint == NULL) { - printf("LibusbJava: usb_get_busses: dev->config[c].interface[i].altsetting[a].endpoint == NULL\n"); - return main_usb_busObj; - } - - usb_epDescObj = env->NewObject(usb_epDescClazz, usb_epDescMid); - if (!usb_epDescObj) { - setLibusbJavaError("shared library error: Error NewObject (usb_epDescObj)"); - return NULL; - } - env->SetObjectArrayElement(usb_epDescObjArray, e, usb_epDescObj); - env->SetByteField(usb_epDescObj, usb_epDescFID_bLength, dev->config[c].interface[i].altsetting[a].endpoint[e].bLength); - env->SetByteField(usb_epDescObj, usb_epDescFID_bDescriptorType, dev->config[c].interface[i].altsetting[a].endpoint[e].bDescriptorType); - env->SetByteField(usb_epDescObj, usb_epDescFID_bEndpointAddress, dev->config[c].interface[i].altsetting[a].endpoint[e].bEndpointAddress); - env->SetByteField(usb_epDescObj, usb_epDescFID_bmAttributes, dev->config[c].interface[i].altsetting[a].endpoint[e].bmAttributes); - env->SetShortField(usb_epDescObj, usb_epDescFID_wMaxPacketSize, dev->config[c].interface[i].altsetting[a].endpoint[e].wMaxPacketSize); - env->SetByteField(usb_epDescObj, usb_epDescFID_bInterval, dev->config[c].interface[i].altsetting[a].endpoint[e].bInterval); - env->SetByteField(usb_epDescObj, usb_epDescFID_bRefresh, dev->config[c].interface[i].altsetting[a].endpoint[e].bRefresh); - env->SetByteField(usb_epDescObj, usb_epDescFID_bSynchAddress, dev->config[c].interface[i].altsetting[a].endpoint[e].bSynchAddress); - env->SetIntField(usb_epDescObj, usb_epDescFID_extralen, dev->config[c].interface[i].altsetting[a].endpoint[e].extralen); - if (dev->config[c].interface[i].altsetting[a].endpoint[e].extra){ - jbyteArray jbExtraDesc = env->NewByteArray(dev->config[c].interface[i].altsetting[a].endpoint[e].extralen); - env->SetByteArrayRegion(jbExtraDesc, 0, dev->config[c].interface[i].altsetting[a].endpoint[e].extralen, (jbyte *) dev->config[c].interface[i].altsetting[a].endpoint[e].extra); - env->SetObjectField(usb_epDescObj, usb_epDescFID_extra, jbExtraDesc); - } else { - env->SetObjectField(usb_epDescObj, usb_epDescFID_extra, NULL); - } - } - env->SetObjectField(usb_intDescObj, usb_intDescFID_endpoint, usb_epDescObjArray); - } - env->SetObjectField(usb_intObj, usb_intFID_altsetting, usb_intDescObjArray); - } - env->SetObjectField(usb_confDescObj, usb_confDescFID_interface_, usb_intObjArray); - } - - - env->SetObjectField(usb_devObj, usb_devFID_config, usb_confDescObjArray); - - usb_devObj_prev = usb_devObj; - usb_devObj = usb_devObj_next; - dev = dev->next; - } - env->SetObjectField(usb_busObj, usb_busFID_devices, main_usb_devObj); - env->SetObjectField(usb_busObj, usb_busFID_root_dev, main_usb_devObj); - - usb_busObj_prev = usb_busObj; - usb_busObj = usb_busObj_next; - bus = bus->next; - } - -#ifdef DEBUGON - printf("usb_get_busses: done\n"); -#endif - return main_usb_busObj; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_open - * Signature: (Lch/ntb/usb/Usb_Device;)I - */ -JNIEXPORT jlong JNICALL Java_ch_ntb_usb_LibusbJava_usb_1open - (JNIEnv *env, jclass obj, jobject dev) - { - clearLibusbJavaError(); - if (busses == NULL) { - setLibusbJavaError("shared library error: busses is null"); - return 0; - } - - unsigned char devnum = env->GetByteField(dev, usb_devFID_devnum); - struct usb_device *usb_device_cmp; - jlong usb_device_cmp_addr = env->GetLongField(dev, usb_devFID_devStructAddr); - struct usb_bus *tmpBus; - - for (tmpBus = busses; tmpBus; tmpBus = tmpBus->next) { - struct usb_device *device; - for (device = tmpBus->devices; device; device = device->next) { - if ((jlong) device == usb_device_cmp_addr){ - return (jlong) usb_open(device); - } - } - } - setLibusbJavaError("shared library error: no device with dev.devnum found on busses"); - return 0; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_close - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1close - (JNIEnv *env, jclass obj, jlong dev_handle) - { - clearLibusbJavaError(); - return (jint) usb_close((usb_dev_handle *) dev_handle); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_set_configuration - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1set_1configuration - (JNIEnv *env, jclass obj, jlong dev_handle, jint configuration) - { - clearLibusbJavaError(); - return usb_set_configuration((usb_dev_handle *) dev_handle, configuration); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_set_altinterface - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1set_1altinterface - (JNIEnv *env, jclass obj, jlong dev_handle, jint alternate) - { - clearLibusbJavaError(); - return usb_set_altinterface((usb_dev_handle *) dev_handle, alternate); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_clear_halt - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1clear_1halt - (JNIEnv *env, jclass obj, jlong dev_handle, jint ep) - { - clearLibusbJavaError(); - return usb_clear_halt((usb_dev_handle *) dev_handle, (unsigned) ep); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_reset - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1reset - (JNIEnv *env, jclass obj, jlong dev_handle) - { - clearLibusbJavaError(); - return usb_reset((usb_dev_handle *) dev_handle); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_claim_interface - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1claim_1interface - (JNIEnv *env, jclass obj, jlong dev_handle, jint interface) - { - clearLibusbJavaError(); - return usb_claim_interface((usb_dev_handle *) dev_handle, interface); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_release_interface - * Signature: (II)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1release_1interface - (JNIEnv *env, jclass obj, jlong dev_handle, jint interface) - { - clearLibusbJavaError(); - return usb_release_interface((usb_dev_handle *) dev_handle, interface); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_control_msg - * Signature: (IIIII[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1control_1msg - (JNIEnv *env, jclass obj, jlong dev_handle, jint requesttype, jint request, jint value, jint index, jbyteArray jbytes, jint size, jint timeout) - { - clearLibusbJavaError(); - jbyte *bytes = env->GetByteArrayElements(jbytes, NULL); - int num_bytes = usb_control_msg((usb_dev_handle *) dev_handle, requesttype, request, value, index, (char *) bytes, size, timeout); - env->SetByteArrayRegion(jbytes, 0, size, bytes); - env->ReleaseByteArrayElements(jbytes, bytes, 0); - return num_bytes; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_string - * Signature: (III)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1string - (JNIEnv *env, jclass obj, jlong dev_handle, jint index, jint langid) - { - clearLibusbJavaError(); - char string[256]; - int retVal = usb_get_string((usb_dev_handle *) dev_handle, index, langid, string, 256); - if (retVal > 0) - return env->NewStringUTF(string); - return 0; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_string_simple - * Signature: (II)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1string_1simple - (JNIEnv *env, jclass obj, jlong dev_handle, jint index) - { - clearLibusbJavaError(); - char string[256]; - int retVal = usb_get_string_simple((usb_dev_handle *) dev_handle, index, string, 256); - if (retVal > 0) - return env->NewStringUTF(string); - return 0; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_descriptor - * Signature: (IBBI)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1descriptor - (JNIEnv *env, jclass obj, jlong dev_handle, jbyte type, jbyte index, jint size) - { - clearLibusbJavaError(); - char *string = (char *) malloc(size * sizeof(char)); - int retVal = usb_get_descriptor((usb_dev_handle *) dev_handle, (unsigned) type, - (unsigned) index, string, size); - if (retVal > 0) - return env->NewStringUTF(string); - return 0; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_descriptor_by_endpoint - * Signature: (IIBBI)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1descriptor_1by_1endpoint - (JNIEnv *env, jclass obj, jlong dev_handle, jint ep, jbyte type, jbyte index, jint size) - { - clearLibusbJavaError(); - char *string = (char *) malloc(size * sizeof(char)); - int retVal = usb_get_descriptor_by_endpoint((usb_dev_handle *) dev_handle, ep, (unsigned) type, - (unsigned) index, string, size); - if (retVal > 0) - return env->NewStringUTF(string); - return 0; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_bulk_write - * Signature: (II[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1bulk_1write - (JNIEnv *env, jclass obj, jlong dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout) - { - clearLibusbJavaError(); - jbyte *bytes = env->GetByteArrayElements(jbytes, NULL); - int num_bytes = usb_bulk_write((usb_dev_handle *) dev_handle, ep, (char *) bytes, size, timeout); - env->ReleaseByteArrayElements(jbytes, bytes, 0); - return num_bytes; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_bulk_read - * Signature: (II[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1bulk_1read - (JNIEnv *env, jclass obj, jlong dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout) - { - clearLibusbJavaError(); - char *bytes = (char *) malloc(size * sizeof(char)); - int num_bytes = usb_bulk_read((usb_dev_handle *) dev_handle, ep, bytes, size, timeout); - if (!bytes) { return num_bytes; } - env->SetByteArrayRegion(jbytes, 0, size, (jbyte *) bytes); - free(bytes); - return num_bytes; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_interrupt_write - * Signature: (II[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1interrupt_1write - (JNIEnv *env, jclass obj, jlong dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout) - { - clearLibusbJavaError(); - jbyte *bytes = env->GetByteArrayElements(jbytes, NULL); - int num_bytes = usb_interrupt_write((usb_dev_handle *) dev_handle, ep, (char *) bytes, size, timeout); - env->ReleaseByteArrayElements(jbytes, bytes, 0); - return num_bytes; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_interrupt_read - * Signature: (II[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1interrupt_1read - (JNIEnv *env, jclass obj, jlong dev_handle, jint ep, jbyteArray jbytes, jint size, jint timeout) - { - clearLibusbJavaError(); - char *bytes = (char *) malloc(size * sizeof(char)); - int num_bytes = usb_interrupt_read((usb_dev_handle *) dev_handle, ep, bytes, size, timeout); - if (!bytes) { return num_bytes; } - env->SetByteArrayRegion(jbytes, 0, size, (jbyte *) bytes); - free(bytes); - return num_bytes; - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_strerror - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1strerror - (JNIEnv *env, jclass obj){ - - char *str; - // check for LibusbJava specific errors first - if (libusbJavaError != NULL) { - str = libusbJavaError; - clearLibusbJavaError(); - } else { - str = usb_strerror(); - } - - return env->NewStringUTF(str); - } - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_error_no - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1error_1no - (JNIEnv *env, jclass obj, jint java_error_no){ - - switch (java_error_no) { - case 0: - return 0; - case 1: - return EBADF; - case 2: - return ENXIO; - case 3: - return EBUSY; - case 4: - return EINVAL; - case 5: - return ETIMEDOUT; - case 6: - return EIO; - case 7: - return ENOMEM; - default: - return 100000; - } -} diff --git a/LibusbJava/LibusbJava.h b/LibusbJava/LibusbJava.h deleted file mode 100644 index b1982cf..0000000 --- a/LibusbJava/LibusbJava.h +++ /dev/null @@ -1,205 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class ch_ntb_usb_LibusbJava */ - -#ifndef _Included_ch_ntb_usb_LibusbJava -#define _Included_ch_ntb_usb_LibusbJava -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_set_debug - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_ch_ntb_usb_LibusbJava_usb_1set_1debug - (JNIEnv *, jclass, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_ch_ntb_usb_LibusbJava_usb_1init - (JNIEnv *, jclass); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_find_busses - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1find_1busses - (JNIEnv *, jclass); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_find_devices - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1find_1devices - (JNIEnv *, jclass); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_busses - * Signature: ()Lch/ntb/usb/Usb_Bus; - */ -JNIEXPORT jobject JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1busses - (JNIEnv *, jclass); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_open - * Signature: (Lch/ntb/usb/Usb_Device;)J - */ -JNIEXPORT jlong JNICALL Java_ch_ntb_usb_LibusbJava_usb_1open - (JNIEnv *, jclass, jobject); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_close - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1close - (JNIEnv *, jclass, jlong); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_set_configuration - * Signature: (JI)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1set_1configuration - (JNIEnv *, jclass, jlong, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_set_altinterface - * Signature: (JI)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1set_1altinterface - (JNIEnv *, jclass, jlong, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_clear_halt - * Signature: (JI)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1clear_1halt - (JNIEnv *, jclass, jlong, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_reset - * Signature: (J)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1reset - (JNIEnv *, jclass, jlong); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_claim_interface - * Signature: (JI)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1claim_1interface - (JNIEnv *, jclass, jlong, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_release_interface - * Signature: (JI)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1release_1interface - (JNIEnv *, jclass, jlong, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_control_msg - * Signature: (JIIII[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1control_1msg - (JNIEnv *, jclass, jlong, jint, jint, jint, jint, jbyteArray, jint, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_string - * Signature: (JII)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1string - (JNIEnv *, jclass, jlong, jint, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_string_simple - * Signature: (JI)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1string_1simple - (JNIEnv *, jclass, jlong, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_descriptor - * Signature: (JBBI)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1descriptor - (JNIEnv *, jclass, jlong, jbyte, jbyte, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_get_descriptor_by_endpoint - * Signature: (JIBBI)Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1get_1descriptor_1by_1endpoint - (JNIEnv *, jclass, jlong, jint, jbyte, jbyte, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_bulk_write - * Signature: (JI[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1bulk_1write - (JNIEnv *, jclass, jlong, jint, jbyteArray, jint, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_bulk_read - * Signature: (JI[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1bulk_1read - (JNIEnv *, jclass, jlong, jint, jbyteArray, jint, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_interrupt_write - * Signature: (JI[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1interrupt_1write - (JNIEnv *, jclass, jlong, jint, jbyteArray, jint, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_interrupt_read - * Signature: (JI[BII)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1interrupt_1read - (JNIEnv *, jclass, jlong, jint, jbyteArray, jint, jint); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_strerror - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_ch_ntb_usb_LibusbJava_usb_1strerror - (JNIEnv *, jclass); - -/* - * Class: ch_ntb_usb_LibusbJava - * Method: usb_error_no - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_ch_ntb_usb_LibusbJava_usb_1error_1no - (JNIEnv *, jclass, jint); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/LibusbJava/LibusbTest.cpp b/LibusbJava/LibusbTest.cpp deleted file mode 100644 index d4c14fd..0000000 --- a/LibusbJava/LibusbTest.cpp +++ /dev/null @@ -1,466 +0,0 @@ -/* - * testlibusb.c - * - * Test suite program - */ - -#include -#include -#include "usb.h" - -#define snprintf printf - -#define ID_PRODUCT 0x0200 -#define ID_VENDOR 0x8235 - -#define CONFIGURATION 1 -#define INTERFACE_ 0 -#define ALTINTERFACE 0 -#define TIMEOUT 5000 - -#define OUT_ENDPOINT 0x01 -#define IN_ENDPOINT 0x82 - -// #define SET_ALTINTERFACE_ONCE - -int verbose = 0; -unsigned char first = true; - -void print_endpoint(struct usb_endpoint_descriptor *endpoint) -{ - printf(" bEndpointAddress: %02xh\n", endpoint->bEndpointAddress); - printf(" bmAttributes: %02xh\n", endpoint->bmAttributes); - printf(" wMaxPacketSize: %d\n", endpoint->wMaxPacketSize); - printf(" bInterval: %d\n", endpoint->bInterval); - printf(" bRefresh: %d\n", endpoint->bRefresh); - printf(" bSynchAddress: %d\n", endpoint->bSynchAddress); -} - -void print_altsetting(struct usb_interface_descriptor *interface) -{ - int i; - - printf(" bInterfaceNumber: %d\n", interface->bInterfaceNumber); - printf(" bAlternateSetting: %d\n", interface->bAlternateSetting); - printf(" bNumEndpoints: %d\n", interface->bNumEndpoints); - printf(" bInterfaceClass: %d\n", interface->bInterfaceClass); - printf(" bInterfaceSubClass: %d\n", interface->bInterfaceSubClass); - printf(" bInterfaceProtocol: %d\n", interface->bInterfaceProtocol); - printf(" iInterface: %d\n", interface->iInterface); - - for (i = 0; i < interface->bNumEndpoints; i++) - print_endpoint(&interface->endpoint[i]); -} - -void print_interface(struct usb_interface *interface) -{ - int i; - - for (i = 0; i < interface->num_altsetting; i++) - print_altsetting(&interface->altsetting[i]); -} - -void print_configuration(struct usb_config_descriptor *config) -{ - int i; - - printf(" wTotalLength: %d\n", config->wTotalLength); - printf(" bNumInterfaces: %d\n", config->bNumInterfaces); - printf(" bConfigurationValue: %d\n", config->bConfigurationValue); - printf(" iConfiguration: %d\n", config->iConfiguration); - printf(" bmAttributes: %02xh\n", config->bmAttributes); - printf(" MaxPower: %d\n", config->MaxPower); - - for (i = 0; i < config->bNumInterfaces; i++) - print_interface(&config->interface[i]); -} - -int print_device(struct usb_device *dev, int level) -{ - usb_dev_handle *udev; - char description[256]; - char string[256]; - int ret, i; - - udev = usb_open(dev); - if (udev) { - if (dev->descriptor.iManufacturer) { - ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer, string, sizeof(string)); - if (ret > 0) - snprintf(description, sizeof(description), "%s - ", string); - else - snprintf(description, sizeof(description), "%04X - ", - dev->descriptor.idVendor); - } else - snprintf(description, sizeof(description), "%04X - ", - dev->descriptor.idVendor); - - if (dev->descriptor.iProduct) { - ret = usb_get_string_simple(udev, dev->descriptor.iProduct, string, sizeof(string)); - if (ret > 0) - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%s", string); - else - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%04X", dev->descriptor.idProduct); - } else - snprintf(description + strlen(description), sizeof(description) - - strlen(description), "%04X", dev->descriptor.idProduct); - - } else - snprintf(description, sizeof(description), "%04X - %04X", - dev->descriptor.idVendor, dev->descriptor.idProduct); - - printf("%.*sDev #%d: %s\n", level * 2, " ", dev->devnum, - description); - - if (udev && verbose) { - if (dev->descriptor.iSerialNumber) { - ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); - if (ret > 0) - printf("%.*s - Serial Number: %s\n", level * 2, - " ", string); - } - } - - if (udev) - usb_close(udev); - - if (verbose) { - if (!dev->config) { - printf(" Couldn't retrieve descriptors\n"); - return 0; - } - - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) - print_configuration(&dev->config[i]); - } else { - for (i = 0; i < dev->num_children; i++) - print_device(dev->children[i], level + 1); - } - - return 0; -} - -int read(struct usb_dev_handle *handle) -{ - if (usb_claim_interface(handle, INTERFACE_) < 0) { - printf("error on usb_claim_interface: %s\n", usb_strerror()); - return -1; - } - printf("usb_claim_interface successful\n"); -#ifdef SET_ALTINTERFACE_ONCE - if (first) { - first = false; -#endif - if (usb_set_altinterface(handle, ALTINTERFACE) < 0){ - printf("usb_set_altinterface failed: %s\n", usb_strerror()); - } -#ifdef SET_ALTINTERFACE_ONCE - } -#endif - - int size = 512, res; - char *data = (char *) malloc(size*sizeof(char)); - res = usb_bulk_read(handle, IN_ENDPOINT, data, size, TIMEOUT); - if (res < 0){ - printf("usb_bulk_read failed: %s\n", usb_strerror()); - } - printf("usb_bulk_read: %d bytes read: ", res); - for (int i = 0; i < res; ++i) { - printf("%3x ", data[i]); - } - printf("\n"); - - usb_release_interface(handle, INTERFACE_); - free(data); -} - -int write(struct usb_dev_handle *handle) -{ - int size = 12; - char *data = (char *) malloc(size*sizeof(char)); - data[0] = 0x33; - data[1] = 0x5B; - data[2] = 0x02; - data[3] = 0x01; - data[4] = 0x00; - data[5] = 0x05; - data[6] = 0x01; - data[7] = 0x03; - data[8] = 0x07; - data[9] = 0x0F; - data[10] = 0x7F; - data[11] = 0x1F; - // data = {0x33, 0x5B, 0x02, 0x01, 0x00, 0x05, 0x01, 0x03, 0x07, 0x0F, 0x7F, 0x1F}; - - if (usb_claim_interface(handle, INTERFACE_) < 0) { - printf("error on usb_claim_interface: %s\n", usb_strerror()); - return -1; - } - printf("usb_claim_interface successful\n"); -#ifdef SET_ALTINTERFACE_ONCE - if (first) { - first = false; -#endif - if (usb_set_altinterface(handle, ALTINTERFACE) < 0){ - printf("usb_set_altinterface failed: %s\n", usb_strerror()); - } -#ifdef SET_ALTINTERFACE_ONCE - } -#endif - - printf("usb_bulk_write: writing %d bytes: ", size); - for (int i = 0; i < size; ++i) { - printf("%3x ", data[i]); - } - printf("\n"); - - int res = usb_bulk_write(handle, OUT_ENDPOINT, data, size, TIMEOUT); - if (res < 0){ - printf("usb_bulk_write failed: %s\n", usb_strerror()); - return -1; - } - - printf("usb_bulk_write: %d bytes written\n", res); - - usb_release_interface(handle, INTERFACE_); - free(data); -} - -int readWrite(struct usb_dev_handle *handle) -{ - - int size = 512; - char *data = (char *) malloc(size*sizeof(char)); - - printf("type a string...\n"); - scanf("%s", data); // Get a string - - if (usb_claim_interface(handle, INTERFACE_) < 0) { - printf("error on usb_claim_interface: %s\n", usb_strerror()); - system("PAUSE"); - return -1; - } - printf("usb_claim_interface successful\n"); -#ifdef SET_ALTINTERFACE_ONCE - if (first) { - first = false; -#endif - if (usb_set_altinterface(handle, ALTINTERFACE) < 0){ - printf("usb_set_altinterface failed: %s\n", usb_strerror()); - } -#ifdef SET_ALTINTERFACE_ONCE - } -#endif - - if (usb_bulk_write(handle, OUT_ENDPOINT, data, strlen(data), 3000) < 0){ - printf("usb_bulk_write failed: %s\n", usb_strerror()); - system("PAUSE"); - return -1; - } - - strcpy(data, "12345678901234567890"); - printf("%s\n", "read data"); - if (usb_bulk_read(handle, IN_ENDPOINT, data, size, 3000) < 0){ - printf("usb_bulk_read failed: %s\n", usb_strerror()); - } - printf("output %d, %s\n", size, data); -// for (int i = 0; i < size; ++i) { -// printf("%4x ", data[i]); -// } - - usb_release_interface(handle, INTERFACE_); - free(data); -} - -int readWriteLoop(struct usb_dev_handle *handle) -{ - int NOF_LOOPS = 20; - int size = 12; - char *data = (char *) malloc(size*sizeof(char)); - data[0] = 0x33; - data[1] = 0x5B; - data[2] = 0x02; - data[3] = 0x01; - data[4] = 0x00; - data[5] = 0x05; - data[6] = 0x01; - data[7] = 0x03; - data[8] = 0x07; - data[9] = 0x0F; - data[10] = 0x7F; - data[11] = 0x1F; - // data = {0x33, 0x5B, 0x02, 0x01, 0x00, 0x05, 0x01, 0x03, 0x07, 0x0F, 0x7F, 0x1F}; - - if (usb_claim_interface(handle, INTERFACE_) < 0) { - printf("error on usb_claim_interface: %s\n", usb_strerror()); - return -1; - } - printf("usb_claim_interface successful\n"); -#ifdef SET_ALTINTERFACE_ONCE - if (first) { - first = false; -#endif - if (usb_set_altinterface(handle, ALTINTERFACE) < 0){ - printf("usb_set_altinterface failed: %s\n", usb_strerror()); - } -#ifdef SET_ALTINTERFACE_ONCE - } -#endif - - printf("usb_bulk_write: writing %d bytes: ", size); - for (int i = 0; i < size; ++i) { - printf("%3x ", data[i]); - } - printf("\n------------------------\n"); - - for (int var = 0; var < NOF_LOOPS; ++var) { - - int res = usb_bulk_write(handle, OUT_ENDPOINT, data, size, TIMEOUT); - if (res < 0){ - printf("usb_bulk_write failed: %s\n", usb_strerror()); - return -1; - } - - printf("usb_bulk_write: %d bytes written\n", res); - - int size = 64; - char *data = (char *) malloc(size*sizeof(char)); - res = usb_bulk_read(handle, IN_ENDPOINT, data, size, TIMEOUT); - if (res < 0){ - printf("usb_bulk_read failed: %s\n", usb_strerror()); - } - printf("usb_bulk_read: %d bytes read: ", res); - for (int i = 0; i < res; ++i) { - printf("%3x ", data[i]); - } - printf("\n"); - } - - usb_release_interface(handle, INTERFACE_); - free(data); -} - -void logDevices() -{ - struct usb_bus *bus; - - printf("log devices...\n"); - for (bus = usb_get_busses(); bus; bus = bus->next) { - if (bus->root_dev && !verbose) - print_device(bus->root_dev, 0); - else { - struct usb_device *dev; - - for (dev = bus->devices; dev; dev = dev->next) - print_device(dev, 0); - } - } -} - -int main(int argc, char *argv[]) -{ - struct usb_bus *bus; - struct usb_device *dev; - struct usb_dev_handle *handle; - - bool run = true; - - if (argc > 1 && !strcmp(argv[1], "-v")) - verbose = 1; - - usb_set_debug(255); - - printf("initialize libraray, find busses and devices\n"); - usb_init(); - - usb_find_busses(); - usb_find_devices(); - - if (verbose) - logDevices(); - - int size = 512; - char *data = (char *) malloc(size*sizeof(char)); - - printf("Search for device with idVendor 0x%x and idProduct 0x%x\n", ID_VENDOR, ID_PRODUCT); - for (bus = usb_get_busses(); bus; bus = bus->next) { - if (verbose) - printf("Found bus %s\n", bus->dirname); - for (dev = bus->devices; dev; dev = dev->next) { - if (verbose) - printf("Found device with idVendor 0x%x and idProduct 0x%x\n", dev->descriptor.idVendor, dev->descriptor.idProduct); - if ((dev->descriptor.idProduct == ID_PRODUCT) && (dev->descriptor.idVendor == ID_VENDOR)){ - printf("Device found -> open\n"); - handle = usb_open(dev); - if (!handle) { - printf("invalid handle: %s\n", usb_strerror()); - system("PAUSE"); - return -1; - } - printf("Set configuration\n"); - if (usb_set_configuration(handle, CONFIGURATION) < 0) { - printf("error on usb_set_configuration: %s\n", usb_strerror()); - system("PAUSE"); - return -1; - } - - printf("Set altinterface (must failed)\n"); -#ifdef SET_ALTINTERFACE_ONCE - if (first) { - first = false; -#endif - if (usb_set_altinterface(handle, ALTINTERFACE) < 0){ - printf("usb_set_altinterface failed: %s\n", usb_strerror()); - } -#ifdef SET_ALTINTERFACE_ONCE - } -#endif - - printf("w=write, r=read, x=exit, t=write+read, u=write+read(2), l=r/w loop, z=reset and open\n"); - - while (run) { - scanf("%s", data); - - switch (data[0]) { - case 'w': // write - write(handle); - break; - case 'r': // read - read(handle); - break; - case 'x': // exit - run = false; - break; - case 't': // write + read - if (write(handle)) { - read(handle); - } - break; - case 'u': // write + read - readWrite(handle); - break; - case 'l': // loop - readWriteLoop(handle); - break; - case 's': // reset first flag (set_altinterface()) - first = true; - break; - case 'z': // reset and open - usb_reset(handle); - handle = usb_open(dev); - break; - default: - break; - } - } - printf("\ndone\n"); - } - } - } - free(data); - system("PAUSE"); - - return 1; -} diff --git a/LibusbJava/build.xml b/LibusbJava/build.xml deleted file mode 100644 index eba4149..0000000 --- a/LibusbJava/build.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - Build file for LibusbJava Shared Library - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/LibusbJava/common.rc b/LibusbJava/common.rc deleted file mode 100644 index b15e284..0000000 --- a/LibusbJava/common.rc +++ /dev/null @@ -1,35 +0,0 @@ -#include - -#define RT_MANIFEST 24 -#define ID_MANIFEST 1 - -VS_VERSION_INFO VERSIONINFO -FILEVERSION RC_VERSION -PRODUCTVERSION RC_VERSION -FILEFLAGSMASK 0x3FL -FILEFLAGS 0x0L -FILEOS VOS_NT_WINDOWS32 -FILETYPE RC_FILE_TYPE -FILESUBTYPE RC_FILE_SUB_TYPE -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "http://libusbjava.sourceforge.net" - VALUE "FileDescription", RC_PRODUCT_STR - VALUE "FileVersion", RC_VERSION_STR - VALUE "InternalName", RC_FILE_NAME_STR - VALUE "LegalCopyright", "2008 spandi@users.sourceforge.net" - VALUE "OriginalFilename",RC_FILE_NAME_STR - VALUE "ProductName", RC_PRODUCT_STR - VALUE "ProductVersion", RC_VERSION_STR - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - diff --git a/LibusbJava/error.h b/LibusbJava/error.h deleted file mode 100644 index a9b600c..0000000 --- a/LibusbJava/error.h +++ /dev/null @@ -1,23 +0,0 @@ -// copied from libusb-win32.sourceforge.net -#ifndef __ERROR_H__ -#define __ERROR_H__ - -/* Connection timed out */ -#define ETIMEDOUT 116 - -typedef enum { - USB_ERROR_TYPE_NONE = 0, - USB_ERROR_TYPE_STRING, - USB_ERROR_TYPE_ERRNO, -} usb_error_type_t; - - -void usb_error(char *format, ...); -void usb_message(char *format, ...); -const char *usb_win_error_to_string(void); -int usb_win_error_to_errno(void); - - - -#endif /* _ERROR_H_ */ - diff --git a/LibusbJava/libusb.a b/LibusbJava/libusb.a deleted file mode 100644 index 7a0cc469d4f56bd2ec94752e699fd39b3816caee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27984 zcmeI4&5s;M6~Ld{pIH{i-*z0w8L!tH$Fi2$`S9+7F+mVQKKMq25QX;aOs}`e?98fX z#$bs9e*lLZI3koo4xIP{azGYBIq?S|#L)*195`}7g7>PrzPhSrs&9?kB~|y#tJfb@ z_3Kx!Uw7BFyS=QxcW>zn4Kr$G<@w}i0F+N(;`!`D0Lth8$n(X215m!a#`BdQ0Z_jBJDwX)04QHS#q*600OePH z$@8m!0ib+4;(2`)fO7L!Jh%P~K)H*@r@Z+Sp0_^*pnUfP&-Zo#D8Gifl)tvj^XuyX zl;6NI%5VOG=eM5#Q2zE?Jb(As0F=M~C!T+Zb)x)ki|6-#20;1!-|+kao-^h6Up()u z0Z<;G4&~iXc;5RP0Ob!Gl;dH#Gn?!*T^agqX#HbR_M(JoW?V;Wz z$sVTtBpw~a*=⪼x_62LA+Sax1U8j;Ab!$&-#0Kmb>w8I`kaguS3VSO7#Of3Td0k zY-c~6#=Xg-QD0X#Vn?9Ijy=gig6?F@R zVw>J@nvSMPw%hAdC&~_);O@;b+9FF(o*d|kQY6c*Qr-_)GE91t1bf19I7cDhU+;jo zVLTf5d!v40P?IH&Vskt5WQ00DqwzsvG!y?%+ozLpe=i%4#JDuexq3_JA!nUV6 zX0wB7{PQfG8V$>;uNRs6zN5(<8VcsN*c=1n6y-*|glh*}jdLzp_dd*{7LUMNTkLd{ zB!dZ&H0@vLMa4<&3id*@##IaPl ze@k^twEmN1Qq&Yu+UIVTB)0X_rA#Xw4bZgFxM1vU*N{t1aR6nen4%Dq9^aXMWxDiaQxm^z*HaqgV?e6l+obkZ=jx?S#) zHSRCHbLcR-WdI*zK0-g>=%Mv=(3|#F(TC!RDhQc#U{%_`e7)qFi@@a^Gl)wOz9r+;;6Y z_ir0o+kJ-nK8hJzP_!NTbUdBI6}8>(^Z)$ZK(vX`b|2?D+DhmdeesE=kpFxvYAcG0 z|EZ;p1GPMr90zokf!g!9Xis*=3tE_+h26rm740AWbhhM+2yWpIm-A`6sGQ(-a4&QX zf_dBD#nV7n9TWD#H2KAp{pJgj{~hx=I#o=xY5?5N>5^np+dRR1Rnx=2q8E(b`Ue)= zbn6+t^-t7mx%KW~5lgGML^r>f9{=|Si9Rwes#`!NVV?8OdxLu97~A7S8S zzOG{ZC=q|0uY2r2UqtXd{Nd$G_ZeJZxolZZ)J8Z_9ewQOL~UWOEh6fa*0YT{L|xYO zu(DpFR^56QQR{9!Nfe$-Fi|%dQPy3#h&iwxqh70;)mp)GqNJ$$1{bhp1n=RRQRS_g zcK1F<#|qQrbcK5--Ii^yn%IMj=sKbGa$^o%XEZ&mw3n_cZas^xHMgFm3&U~2biLxH ztFlzRh;^f+sM_KJwv6CyT)U~#4V8tH-%7Q&!>v?v+Zy+7V_z-e=!n*zjX4~h)by~L zUXCug^(>B7+pn>j9?qroElLTofswa(Xv^B7TeC$g_c!Li+ol^QLZpj4Bn(P@&9cjl$#Too)MGzAmHJHAazm z!d%^m&}oYvinWRq0R=kQ=q0M6L8C-IR>C9Joh{ohrWnj3zxY4-sgl3jnBx~8%N^o; zCH!40Vy(xKaF;^Q@{2ujBzfu4lY~&exS?37td)5l>qALdnFjmM7ZJ4ahvG!P180=X zx$7!qZQHx4%TtT1IY;7kBK308qsrQz zmvT#^Y|mZ8_IyX#9=lq`c;zbg@l+zJ+_e3ixfTRXv#9xcE}>Nf@8Xi#7+=-2@yf5_vp(UGSC8J6_{c#FGF?h61{ywN!ca& zS}#f?cpaAoo{BGNt4~Vu5+6a~QRi;QCa5l6)5V;i;%6-46|$;Yrt5?eCPmUWxqvMr zcpuj}NxrHX*2%Br<10K;-EG;PQ(Z>A3m(3p!d8mj>7}ID`XU#wWdz^CwTCVJ?q7VJ zrM?CA$Fy4|V%jx+-}Ssfll9?TW&QD$oF7G$=Y3bfj8!#IEK7+fca2A=Q<58Vj)tnn0D?y-HIqcxoD^RBQzFt`<0t&j7dWB|x~dEX zKjBvl>F$jo^;w@1vFxt>{I)J%;h&V$sOedZNnR>Uk$3}E-QT}O(B~eS)~kj#R;4 z&YSbyDQi=Z`^YH~ZLV<)=s87>9Hy%3;{?Zmj0q46;4B)ankAyk+xA^pUA{s*!MMq% zk*x3-MYBjyQg>V{T)>tQ&}Vw=j!Vplsc?}JkA-PIi!y6XNk5&>A&xUr^w~tKdlwaK zVf5-~E{!SnaT6Y8uJgC6$2d1^j@hb?NWtH(=2PV=<01q;MxI5GLu|{@oDn(AFm6;; zR)X)b^;wg3U}Pn|^J_LsM38IzmBx{r8gs_!>XH-um4-EmwvLZkTR%f3;=?t*<37w8 z(kCddtmO&5<2L72*Wl5s=_lt|TsUORiWoWC)bvlon59)mbB7J7&(kRp7jD_JE7au+ zo0+ -#include - -/* - * 'interface' is defined somewhere in the Windows header files. This macro - * is deleted here to avoid conflicts and compile errors. - */ - -#ifdef interface -#undef interface -#endif - -/* - * PATH_MAX from limits.h can't be used on Windows if the dll and - * import libraries are build/used by different compilers - */ - -#define LIBUSB_PATH_MAX 512 - - -/* - * USB spec information - * - * This is all stuff grabbed from various USB specs and is pretty much - * not subject to change - */ - -/* - * Device and/or Interface Class codes - */ -#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ -#define USB_CLASS_AUDIO 1 -#define USB_CLASS_COMM 2 -#define USB_CLASS_HID 3 -#define USB_CLASS_PRINTER 7 -#define USB_CLASS_MASS_STORAGE 8 -#define USB_CLASS_HUB 9 -#define USB_CLASS_DATA 10 -#define USB_CLASS_VENDOR_SPEC 0xff - -/* - * Descriptor types - */ -#define USB_DT_DEVICE 0x01 -#define USB_DT_CONFIG 0x02 -#define USB_DT_STRING 0x03 -#define USB_DT_INTERFACE 0x04 -#define USB_DT_ENDPOINT 0x05 - -#define USB_DT_HID 0x21 -#define USB_DT_REPORT 0x22 -#define USB_DT_PHYSICAL 0x23 -#define USB_DT_HUB 0x29 - -/* - * Descriptor sizes per descriptor type - */ -#define USB_DT_DEVICE_SIZE 18 -#define USB_DT_CONFIG_SIZE 9 -#define USB_DT_INTERFACE_SIZE 9 -#define USB_DT_ENDPOINT_SIZE 7 -#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ -#define USB_DT_HUB_NONVAR_SIZE 7 - - -/* ensure byte-packed structures */ -#include - - -/* All standard descriptors have these 2 fields in common */ -struct usb_descriptor_header { - unsigned char bLength; - unsigned char bDescriptorType; -}; - -/* String descriptor */ -struct usb_string_descriptor { - unsigned char bLength; - unsigned char bDescriptorType; - unsigned short wData[1]; -}; - -/* HID descriptor */ -struct usb_hid_descriptor { - unsigned char bLength; - unsigned char bDescriptorType; - unsigned short bcdHID; - unsigned char bCountryCode; - unsigned char bNumDescriptors; -}; - -/* Endpoint descriptor */ -#define USB_MAXENDPOINTS 32 -struct usb_endpoint_descriptor { - unsigned char bLength; - unsigned char bDescriptorType; - unsigned char bEndpointAddress; - unsigned char bmAttributes; - unsigned short wMaxPacketSize; - unsigned char bInterval; - unsigned char bRefresh; - unsigned char bSynchAddress; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -#define USB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ -#define USB_ENDPOINT_DIR_MASK 0x80 - -#define USB_ENDPOINT_TYPE_MASK 0x03 /* in bmAttributes */ -#define USB_ENDPOINT_TYPE_CONTROL 0 -#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1 -#define USB_ENDPOINT_TYPE_BULK 2 -#define USB_ENDPOINT_TYPE_INTERRUPT 3 - -/* Interface descriptor */ -#define USB_MAXINTERFACES 32 -struct usb_interface_descriptor { - unsigned char bLength; - unsigned char bDescriptorType; - unsigned char bInterfaceNumber; - unsigned char bAlternateSetting; - unsigned char bNumEndpoints; - unsigned char bInterfaceClass; - unsigned char bInterfaceSubClass; - unsigned char bInterfaceProtocol; - unsigned char iInterface; - - struct usb_endpoint_descriptor *endpoint; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -#define USB_MAXALTSETTING 128 /* Hard limit */ - -struct usb_interface { - struct usb_interface_descriptor *altsetting; - - int num_altsetting; -}; - -/* Configuration descriptor information.. */ -#define USB_MAXCONFIG 8 -struct usb_config_descriptor { - unsigned char bLength; - unsigned char bDescriptorType; - unsigned short wTotalLength; - unsigned char bNumInterfaces; - unsigned char bConfigurationValue; - unsigned char iConfiguration; - unsigned char bmAttributes; - unsigned char MaxPower; - - struct usb_interface *interface; - - unsigned char *extra; /* Extra descriptors */ - int extralen; -}; - -/* Device descriptor */ -struct usb_device_descriptor { - unsigned char bLength; - unsigned char bDescriptorType; - unsigned short bcdUSB; - unsigned char bDeviceClass; - unsigned char bDeviceSubClass; - unsigned char bDeviceProtocol; - unsigned char bMaxPacketSize0; - unsigned short idVendor; - unsigned short idProduct; - unsigned short bcdDevice; - unsigned char iManufacturer; - unsigned char iProduct; - unsigned char iSerialNumber; - unsigned char bNumConfigurations; -}; - -struct usb_ctrl_setup { - unsigned char bRequestType; - unsigned char bRequest; - unsigned short wValue; - unsigned short wIndex; - unsigned short wLength; -}; - -/* - * Standard requests - */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -/* 0x02 is reserved */ -#define USB_REQ_SET_FEATURE 0x03 -/* 0x04 is reserved */ -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -#define USB_TYPE_STANDARD (0x00 << 5) -#define USB_TYPE_CLASS (0x01 << 5) -#define USB_TYPE_VENDOR (0x02 << 5) -#define USB_TYPE_RESERVED (0x03 << 5) - -#define USB_RECIP_DEVICE 0x00 -#define USB_RECIP_INTERFACE 0x01 -#define USB_RECIP_ENDPOINT 0x02 -#define USB_RECIP_OTHER 0x03 - -/* - * Various libusb API related stuff - */ - -#define USB_ENDPOINT_IN 0x80 -#define USB_ENDPOINT_OUT 0x00 - -/* Error codes */ -#define USB_ERROR_BEGIN 500000 - -/* - * This is supposed to look weird. This file is generated from autoconf - * and I didn't want to make this too complicated. - */ -#define USB_LE16_TO_CPU(x) - -/* Data types */ -/* struct usb_device; */ -/* struct usb_bus; */ - -struct usb_device { - struct usb_device *next, *prev; - - char filename[LIBUSB_PATH_MAX]; - - struct usb_bus *bus; - - struct usb_device_descriptor descriptor; - struct usb_config_descriptor *config; - - void *dev; /* Darwin support */ - - unsigned char devnum; - - unsigned char num_children; - struct usb_device **children; -}; - -struct usb_bus { - struct usb_bus *next, *prev; - - char dirname[LIBUSB_PATH_MAX]; - - struct usb_device *devices; - unsigned long location; - - struct usb_device *root_dev; -}; - -/* Version information, Windows specific */ -struct usb_version { - struct { - int major; - int minor; - int micro; - int nano; - } dll; - struct { - int major; - int minor; - int micro; - int nano; - } driver; -}; - - -struct usb_dev_handle; -typedef struct usb_dev_handle usb_dev_handle; - -/* Variables */ -#ifndef __USB_C__ -#define usb_busses usb_get_busses() -#endif - - - -#include - - -#ifdef __cplusplus -extern "C" { -#endif - - /* Function prototypes */ - - /* usb.c */ - usb_dev_handle *usb_open(struct usb_device *dev); - int usb_close(usb_dev_handle *dev); - int usb_get_string(usb_dev_handle *dev, int index, int langid, char *buf, - size_t buflen); - int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, - size_t buflen); - - /* descriptors.c */ - int usb_get_descriptor_by_endpoint(usb_dev_handle *udev, int ep, - unsigned char type, unsigned char index, - void *buf, int size); - int usb_get_descriptor(usb_dev_handle *udev, unsigned char type, - unsigned char index, void *buf, int size); - - /* .c */ - int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); - int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); - int usb_interrupt_write(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); - int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, - int timeout); - int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, - int value, int index, char *bytes, int size, - int timeout); - int usb_set_configuration(usb_dev_handle *dev, int configuration); - int usb_claim_interface(usb_dev_handle *dev, int interface); - int usb_release_interface(usb_dev_handle *dev, int interface); - int usb_set_altinterface(usb_dev_handle *dev, int alternate); - int usb_resetep(usb_dev_handle *dev, unsigned int ep); - int usb_clear_halt(usb_dev_handle *dev, unsigned int ep); - int usb_reset(usb_dev_handle *dev); - - char *usb_strerror(void); - - void usb_init(void); - void usb_set_debug(int level); - int usb_find_busses(void); - int usb_find_devices(void); - struct usb_device *usb_device(usb_dev_handle *dev); - struct usb_bus *usb_get_busses(void); - - - /* Windows specific functions */ - - #define LIBUSB_HAS_INSTALL_SERVICE_NP 1 - int usb_install_service_np(void); - void CALLBACK usb_install_service_np_rundll(HWND wnd, HINSTANCE instance, - LPSTR cmd_line, int cmd_show); - - #define LIBUSB_HAS_UNINSTALL_SERVICE_NP 1 - int usb_uninstall_service_np(void); - void CALLBACK usb_uninstall_service_np_rundll(HWND wnd, HINSTANCE instance, - LPSTR cmd_line, int cmd_show); - - #define LIBUSB_HAS_INSTALL_DRIVER_NP 1 - int usb_install_driver_np(const char *inf_file); - void CALLBACK usb_install_driver_np_rundll(HWND wnd, HINSTANCE instance, - LPSTR cmd_line, int cmd_show); - - #define LIBUSB_HAS_TOUCH_INF_FILE_NP 1 - int usb_touch_inf_file_np(const char *inf_file); - void CALLBACK usb_touch_inf_file_np_rundll(HWND wnd, HINSTANCE instance, - LPSTR cmd_line, int cmd_show); - - #define LIBUSB_HAS_INSTALL_NEEDS_RESTART_NP 1 - int usb_install_needs_restart_np(void); - - const struct usb_version *usb_get_version(void); - - int usb_isochronous_setup_async(usb_dev_handle *dev, void **context, - unsigned char ep, int pktsize); - int usb_bulk_setup_async(usb_dev_handle *dev, void **context, - unsigned char ep); - int usb_interrupt_setup_async(usb_dev_handle *dev, void **context, - unsigned char ep); - - int usb_submit_async(void *context, char *bytes, int size); - int usb_reap_async(void *context, int timeout); - int usb_reap_async_nocancel(void *context, int timeout); - int usb_cancel_async(void *context); - int usb_free_async(void **context); - - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_H__ */ - diff --git a/LibusbJava/version.properties b/LibusbJava/version.properties deleted file mode 100644 index 52e5578..0000000 --- a/LibusbJava/version.properties +++ /dev/null @@ -1,5 +0,0 @@ -# NOTE: if the version is changed -> change the define in resource.rc -version.major=0 -version.minor=2 -version.micro=4 -version.nano=0 \ No newline at end of file diff --git a/java/.classpath b/java/.classpath deleted file mode 100644 index 4eb8e08..0000000 --- a/java/.classpath +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/java/.project b/java/.project deleted file mode 100644 index 88c62bc..0000000 --- a/java/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - ch.ntb.usb - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.jdt.core.javanature - org.eclipse.jem.beaninfo.BeanInfoNature - org.eclipse.pde.PluginNature - - diff --git a/java/.settings/org.eclipse.jdt.ui.prefs b/java/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 1b61afb..0000000 --- a/java/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,3 +0,0 @@ -#Thu Oct 06 09:12:32 CEST 2005 -eclipse.preferences.version=1 -internal.default.compliance=default diff --git a/java/LGPL.txt b/java/LGPL.txt deleted file mode 100644 index 5faba9d..0000000 --- a/java/LGPL.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/java/META-INF/MANIFEST.MF b/java/META-INF/MANIFEST.MF deleted file mode 100644 index c3b6940..0000000 --- a/java/META-INF/MANIFEST.MF +++ /dev/null @@ -1,9 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Java libusb wrapper -Bundle-SymbolicName: ch.ntb.usb -Bundle-Version: 1.0.2 -Bundle-Vendor: libusbjava.sourceforge.net -Require-Bundle: org.junit4 -Export-Package: ch.ntb.usb -Bundle-RequiredExecutionEnvironment: J2SE-1.5 diff --git a/java/README.txt b/java/README.txt deleted file mode 100644 index c5dc21f..0000000 --- a/java/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -Project description -------------------- -Java libusb wrapper is a Java wrapper for the libsub and libusb-win32 USB library. -* libusb aim is to create a library for use by user level applications to access USB devices regardless of OS. -* libusb-win32 is a port of the libusb library to the Windows operating systems. The library allows user space applications to access any USB device on Windows in a generic way without writing any line of kernel driver code. - -For more information about libusb visit: - http://libusb.sourceforge.net/ - -For more information about LibUsb-Win32 visit: - http://libusb-win32.sourceforge.net - http://sourceforge.net/projects/libusb-win32 - -For more information about Java LibUsb-Win32 wrapper visit: - http://libusbjava.sourceforge.net - http://sourceforge.net/projects/libusbjava - -License -------- -The Java libusb wrapper library is released under the LGPL. See LGPL.txt -for more information. -For licensing information about libusb see http://sourceforge.net/projects/libusb/. -For licensing information about LibUsb-Win32 see http://libusb-win32.sourceforge.net/#license. - -Authors -------- -Andreas Schläpfer diff --git a/java/build.properties b/java/build.properties deleted file mode 100644 index c7069a0..0000000 --- a/java/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -source.. = src/,\ - test/ -bin.includes = META-INF/,\ - . diff --git a/java/build.xml b/java/build.xml deleted file mode 100644 index 20fe9d7..0000000 --- a/java/build.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - Ant tasks for ch.ntb.usb - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Building Version ${version.major}.${version.minor}.${version.release} - - - - - - - - - - -
- - - -
-
-
- - -
- - - - - - -
diff --git a/java/deployment.properties b/java/deployment.properties deleted file mode 100644 index 148931a..0000000 --- a/java/deployment.properties +++ /dev/null @@ -1,8 +0,0 @@ -java2html.dir.lib=D:/MyDocuments/Download/Programming/java2html -java2html.dir.src=test/ch/ntb/usb/demo/ - -project.server.name=shell.sourceforge.net -project.server.dir=/home/groups/l/li/libusbjava/htdocs/wp/res -project.server.dir.doc=${project.server.dir}/doc -project.server.dir.bin=${project.server.dir}/bin -project.server.dir.demos=${project.server.dir}/demos diff --git a/java/deployment.xml b/java/deployment.xml deleted file mode 100644 index 07ead7d..0000000 --- a/java/deployment.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Ant deployment tasks for ch.ntb.usb - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/project.properties b/java/project.properties deleted file mode 100644 index 561a532..0000000 --- a/java/project.properties +++ /dev/null @@ -1,10 +0,0 @@ -#Thu Aug 24 14:28:28 CEST 2006 -project.name=ch.ntb.usb -project.vendor=inf.ntb.ch -project.dir.src=src -project.dir.bin=bin -project.dir.lib=lib -project.dir.doc=doc -project.dir.demos=demos -project.jarfile=${project.name} -project.manifest.mainclass=ch.ntb.usb.usbView.UsbView diff --git a/java/src/.configure b/java/src/.configure deleted file mode 100644 index 3974ee4..0000000 --- a/java/src/.configure +++ /dev/null @@ -1,6 +0,0 @@ -# enable or disable logging -ch.ntb.usb/debug = true -# set and configure individual loggers here -# the format is: projectName/debug/ = / -ch.ntb.usb/debug/logger0 = ch.ntb.usb/OFF -ch.ntb.usb/debug/logger1 = ch.ntb.usb.test/INFO diff --git a/java/src/ch/ntb/usb/testApp/AbstractDeviceInfo.java b/java/src/ch/ntb/usb/testApp/AbstractDeviceInfo.java deleted file mode 100644 index 871a397..0000000 --- a/java/src/ch/ntb/usb/testApp/AbstractDeviceInfo.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.testApp; - -public abstract class AbstractDeviceInfo { - - private short idVendor; - - private short idProduct; - - private String filename = null; - - private String busName = null; - - private int timeout; - - private int configuration; - - private int interface_; - - private int altinterface; - - private int outEPBulk = -1; - - private int inEPBulk = -1; - - private int outEPInt = -1; - - private int inEPInt = -1; - - private int sleepTimeout; - - private int maxDataSize; - - private TransferMode mode; - - private boolean compareData = true; - - private String manufacturer = null; - - private String product = null; - - private String serialVersion = null; - - public static enum TransferMode { - Bulk, Interrupt - } - - public AbstractDeviceInfo() { - initValues(); - } - - abstract public void initValues(); - - public int getAltinterface() { - return altinterface; - } - - public int getConfiguration() { - return configuration; - } - - public short getIdProduct() { - return idProduct; - } - - public short getIdVendor() { - return idVendor; - } - - public int getInEPBulk() { - return inEPBulk; - } - - public int getInEPInt() { - return inEPInt; - } - - public int getInterface() { - return interface_; - } - - public int getMaxDataSize() { - return maxDataSize; - } - - public int getOutEPBulk() { - return outEPBulk; - } - - public int getOutEPInt() { - return outEPInt; - } - - public int getSleepTimeout() { - return sleepTimeout; - } - - public int getTimeout() { - return timeout; - } - - public void setAltinterface(int altinterface) { - this.altinterface = altinterface; - } - - public void setConfiguration(int configuration) { - this.configuration = configuration; - } - - public void setIdProduct(short idProduct) { - this.idProduct = idProduct; - } - - public void setIdVendor(short idVendor) { - this.idVendor = idVendor; - } - - public void setInEPBulk(int in_ep_bulk) { - this.inEPBulk = in_ep_bulk; - } - - public void setInEPInt(int in_ep_int) { - this.inEPInt = in_ep_int; - } - - public void setInterface(int interface_) { - this.interface_ = interface_; - } - - public void setMaxDataSize(int maxDataSize) { - this.maxDataSize = maxDataSize; - } - - public void setOutEPBulk(int out_ep_bulk) { - this.outEPBulk = out_ep_bulk; - } - - public void setOutEPInt(int out_ep_int) { - this.outEPInt = out_ep_int; - } - - public void setSleepTimeout(int sleepTimeout) { - this.sleepTimeout = sleepTimeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - public TransferMode getMode() { - return mode; - } - - public void setMode(TransferMode mode) { - this.mode = mode; - } - - public boolean doCompareData() { - return compareData; - } - - public void setDoCompareData(boolean compareData) { - this.compareData = compareData; - } - - public String getManufacturer() { - return manufacturer; - } - - public void setManufacturer(String manufacturer) { - this.manufacturer = manufacturer; - } - - public String getProduct() { - return product; - } - - public void setProduct(String product) { - this.product = product; - } - - public String getSerialVersion() { - return serialVersion; - } - - public void setSerialVersion(String serialVersion) { - this.serialVersion = serialVersion; - } - - public String getFilename() { - return filename; - } - - public void setFilename(String filename) { - this.filename = filename; - } - - public String getBusName() { - return busName; - } - - public void setBusName(String busName) { - this.busName = busName; - } -} diff --git a/java/src/ch/ntb/usb/testApp/TestApp.java b/java/src/ch/ntb/usb/testApp/TestApp.java deleted file mode 100644 index c521666..0000000 --- a/java/src/ch/ntb/usb/testApp/TestApp.java +++ /dev/null @@ -1,709 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.testApp; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.event.ItemEvent; - -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.UIManager; -import javax.swing.border.TitledBorder; - -public class TestApp extends JFrame { - - private static final long serialVersionUID = 994508729204158681L; - TestDevice dev; - private JPanel rootPanel = null; - private JPanel sendReceivePanel = null; - private JPanel settingsPanel = null; - private JButton openDeviceButton = null; - private JButton closeDevice = null; - private JButton resetButton = null; - private JPanel settingsPanelTop = null; - private JPanel settingsPanelBottom = null; - JTextField vendorIDText = null; - JTextField productIDText = null; - private JPanel vendorIDPanel = null; - private JPanel productIDPanel = null; - private JPanel configurationPanel = null; - JTextField configurationText = null; - private JPanel interfacePanel = null; - JTextField interfaceText = null; - private JPanel altInterfacePanel = null; - JTextField altInterfaceText = null; - private JPanel settingsPanelTop2Left = null; - private JPanel settingsPanelTop2Right = null; - private JPanel outEpPanel = null; - JTextField outEpText = null; - private JPanel inEpPanel = null; - JTextField inEpText = null; - private JPanel timeoutPanel = null; - private JTextField timeoutText = null; - private JPanel sendDataPanel = null; - private JPanel sendRecButtonsPanel = null; - private JButton sendButton = null; - private JButton recButton = null; - JTextField sendDataText = null; - JComboBox sendTypeComboBox = null; - private JComboBox recTypeComboBox = null; - private JPanel sendRecButtonsPanelTop = null; - private JPanel sendRecButtonsPanelBottom = null; - - public TestApp(TestDevice devInfo) { - super(); - this.dev = devInfo; - initialize(); - } - - private void initialize() { - - this.setTitle("USB Test Application"); - - this.setContentPane(getRootPanel()); - - // read default values - this.vendorIDText.setText(toHexString(dev.getIdVendor() & 0xffff)); - this.productIDText.setText(toHexString(dev.getIdProduct() & 0xffff)); - this.configurationText.setText(new Integer(dev.getConfiguration()) - .toString()); - this.interfaceText.setText(new Integer(dev.getInterface()).toString()); - this.altInterfaceText.setText(new Integer(dev.getAltinterface()) - .toString()); - this.timeoutText.setText(new Integer(dev.getTimeout()).toString()); - this.sendDataText.setText(dev.getSendData()); - setOutEpAddr(); - setInEpAddr(); - - this.pack(); - this.setVisible(true); - } - - void setOutEpAddr() { - switch (dev.getOutMode()) { - case Bulk: - this.outEpText.setText(toHexString(dev.getOutEPBulk())); - break; - case Interrupt: - this.outEpText.setText(toHexString(dev.getOutEPInt())); - break; - default: - break; - } - } - - void setInEpAddr() { - switch (dev.getInMode()) { - case Bulk: - this.inEpText.setText(toHexString(dev.getInEPBulk())); - break; - case Interrupt: - this.inEpText.setText(toHexString(dev.getInEPInt())); - break; - default: - break; - } - } - - private JPanel getRootPanel() { - if (rootPanel == null) { - rootPanel = new JPanel(); - rootPanel - .setLayout(new BoxLayout(getRootPanel(), BoxLayout.Y_AXIS)); - rootPanel.add(getSettingsPanel(), null); - rootPanel.add(getSendReceivePanel(), null); - } - return rootPanel; - } - - private JPanel getSendReceivePanel() { - if (sendReceivePanel == null) { - BorderLayout borderLayout2 = new BorderLayout(); - borderLayout2.setHgap(5); - sendReceivePanel = new JPanel(); - sendReceivePanel.setLayout(borderLayout2); - sendReceivePanel.setBorder(BorderFactory.createTitledBorder(null, - "Send and Receive Data", - TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - sendReceivePanel.add(getSendRecButtonsPanel(), BorderLayout.NORTH); - sendReceivePanel.add(getSendDataPanel(), BorderLayout.SOUTH); - } - return sendReceivePanel; - } - - private JPanel getSettingsPanel() { - if (settingsPanel == null) { - settingsPanel = new JPanel(); - settingsPanel.setLayout(new BoxLayout(getSettingsPanel(), - BoxLayout.Y_AXIS)); - settingsPanel.setBorder(BorderFactory.createTitledBorder(null, - "Device Settings", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - settingsPanel.add(getSettingsPanelTop(), null); - settingsPanel.add(getSettingsPanelBottom(), null); - } - return settingsPanel; - } - - private JButton getOpenDeviceButton() { - if (openDeviceButton == null) { - openDeviceButton = new JButton(); - openDeviceButton.setText("Open Device"); - openDeviceButton - .addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - // update values for the device - dev.setIdVendor((short) parseInt(vendorIDText - .getText().trim())); - dev.setIdProduct((short) parseInt(productIDText - .getText().trim())); - dev.setConfiguration(parseInt(configurationText - .getText().trim())); - dev.setInterface(parseInt(interfaceText.getText() - .trim())); - dev.setAltinterface(parseInt(altInterfaceText - .getText().trim())); - // opent the device - dev.openUsbDevice(); - } - }); - } - return openDeviceButton; - } - - private JButton getCloseDevice() { - if (closeDevice == null) { - closeDevice = new JButton(); - closeDevice.setText("Close Device"); - closeDevice.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - dev.closeUsbDevice(); - } - }); - } - return closeDevice; - } - - private JButton getResetButton() { - if (resetButton == null) { - resetButton = new JButton(); - resetButton.setText("Reset Device"); - resetButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - dev.resetUsbDevice(); - } - }); - } - return resetButton; - } - - private JPanel getSettingsPanelTop() { - if (settingsPanelTop == null) { - FlowLayout flowLayout = new FlowLayout(); - flowLayout.setVgap(1); - flowLayout.setAlignment(FlowLayout.LEFT); - settingsPanelTop = new JPanel(); - settingsPanelTop.setLayout(flowLayout); - settingsPanelTop.add(getVendorIDPanel(), null); - settingsPanelTop.add(getProductIDPanel(), null); - settingsPanelTop.add(getConfigurationPanel(), null); - settingsPanelTop.add(getInterfacePanel(), null); - settingsPanelTop.add(getAltInterfacePanel(), null); - } - return settingsPanelTop; - } - - private JPanel getSettingsPanelBottom() { - if (settingsPanelBottom == null) { - FlowLayout flowLayout1 = new FlowLayout(); - flowLayout1.setVgap(1); - flowLayout1.setHgap(0); - flowLayout1.setAlignment(FlowLayout.LEFT); - GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); - gridBagConstraints1.gridx = -1; - gridBagConstraints1.gridy = -1; - settingsPanelBottom = new JPanel(); - settingsPanelBottom.setLayout(flowLayout1); - settingsPanelBottom.add(getSettingsPanelTop2Left(), null); - settingsPanelBottom.add(getSettingsPanelTop2Right(), null); - } - return settingsPanelBottom; - } - - private JTextField getVendorIDText() { - if (vendorIDText == null) { - vendorIDText = new JTextField(); - vendorIDText.setPreferredSize(new Dimension(100, 20)); - } - return vendorIDText; - } - - private JTextField getProductIDText() { - if (productIDText == null) { - productIDText = new JTextField(); - productIDText.setPreferredSize(new Dimension(100, 20)); - } - return productIDText; - } - - private JPanel getVendorIDPanel() { - if (vendorIDPanel == null) { - GridBagConstraints gridBagConstraints3 = new GridBagConstraints(); - gridBagConstraints3.fill = GridBagConstraints.VERTICAL; - gridBagConstraints3.gridy = -1; - gridBagConstraints3.weightx = 1.0; - gridBagConstraints3.gridx = -1; - GridBagConstraints gridBagConstraints5 = new GridBagConstraints(); - gridBagConstraints5.gridx = -1; - gridBagConstraints5.gridy = -1; - vendorIDPanel = new JPanel(); - vendorIDPanel.setBorder(BorderFactory.createTitledBorder(null, - "VendorID", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - vendorIDPanel.setLayout(new BoxLayout(getVendorIDPanel(), - BoxLayout.X_AXIS)); - vendorIDPanel.add(getVendorIDText(), null); - } - return vendorIDPanel; - } - - private JPanel getProductIDPanel() { - if (productIDPanel == null) { - GridBagConstraints gridBagConstraints4 = new GridBagConstraints(); - gridBagConstraints4.fill = GridBagConstraints.VERTICAL; - gridBagConstraints4.gridy = -1; - gridBagConstraints4.weightx = 1.0; - gridBagConstraints4.gridx = -1; - productIDPanel = new JPanel(); - productIDPanel.setBorder(BorderFactory.createTitledBorder(null, - "ProductID", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - productIDPanel.setLayout(new BoxLayout(getProductIDPanel(), - BoxLayout.X_AXIS)); - productIDPanel.add(getProductIDText(), null); - } - return productIDPanel; - } - - private JPanel getConfigurationPanel() { - if (configurationPanel == null) { - configurationPanel = new JPanel(); - configurationPanel.setLayout(new BoxLayout(getConfigurationPanel(), - BoxLayout.X_AXIS)); - configurationPanel.setBorder(BorderFactory.createTitledBorder(null, - "Configuration", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - configurationPanel.add(getConfigurationText(), null); - } - return configurationPanel; - } - - private JTextField getConfigurationText() { - if (configurationText == null) { - configurationText = new JTextField(); - configurationText.setPreferredSize(new Dimension(100, 20)); - } - return configurationText; - } - - private JPanel getInterfacePanel() { - if (interfacePanel == null) { - interfacePanel = new JPanel(); - interfacePanel.setLayout(new BoxLayout(getInterfacePanel(), - BoxLayout.X_AXIS)); - interfacePanel.setBorder(BorderFactory.createTitledBorder(null, - "Interface", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - interfacePanel.add(getInterfaceText(), null); - } - return interfacePanel; - } - - private JTextField getInterfaceText() { - if (interfaceText == null) { - interfaceText = new JTextField(); - interfaceText.setPreferredSize(new Dimension(100, 20)); - } - return interfaceText; - } - - private JPanel getAltInterfacePanel() { - if (altInterfacePanel == null) { - altInterfacePanel = new JPanel(); - altInterfacePanel.setLayout(new BoxLayout(getAltInterfacePanel(), - BoxLayout.X_AXIS)); - altInterfacePanel.setBorder(BorderFactory.createTitledBorder(null, - "Alternate Int", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - altInterfacePanel.add(getAltInterfaceText(), null); - } - return altInterfacePanel; - } - - private JTextField getAltInterfaceText() { - if (altInterfaceText == null) { - altInterfaceText = new JTextField(); - altInterfaceText.setPreferredSize(new Dimension(100, 20)); - } - return altInterfaceText; - } - - private JPanel getSettingsPanelTop2Left() { - if (settingsPanelTop2Left == null) { - FlowLayout flowLayout2 = new FlowLayout(); - flowLayout2.setVgap(2); - flowLayout2.setAlignment(FlowLayout.LEFT); - flowLayout2.setHgap(5); - settingsPanelTop2Left = new JPanel(); - settingsPanelTop2Left.setLayout(flowLayout2); - settingsPanelTop2Left.add(getOutEpPanel(), null); - settingsPanelTop2Left.add(getInEpPanel(), null); - settingsPanelTop2Left.add(getTimeoutPanel(), null); - } - return settingsPanelTop2Left; - } - - private JPanel getSettingsPanelTop2Right() { - if (settingsPanelTop2Right == null) { - FlowLayout flowLayout3 = new FlowLayout(); - flowLayout3.setVgap(2); - settingsPanelTop2Right = new JPanel(); - settingsPanelTop2Right.setLayout(flowLayout3); - settingsPanelTop2Right.add(getOpenDeviceButton(), null); - settingsPanelTop2Right.add(getCloseDevice(), null); - settingsPanelTop2Right.add(getResetButton(), null); - } - return settingsPanelTop2Right; - } - - private JPanel getOutEpPanel() { - if (outEpPanel == null) { - outEpPanel = new JPanel(); - outEpPanel.setLayout(new BoxLayout(getOutEpPanel(), - BoxLayout.X_AXIS)); - outEpPanel.setBorder(BorderFactory.createTitledBorder(null, - "OUT EP", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - outEpPanel.add(getOutEpText(), null); - } - return outEpPanel; - } - - private JTextField getOutEpText() { - if (outEpText == null) { - outEpText = new JTextField(); - outEpText.setPreferredSize(new Dimension(100, 20)); - } - return outEpText; - } - - private JPanel getInEpPanel() { - if (inEpPanel == null) { - inEpPanel = new JPanel(); - inEpPanel - .setLayout(new BoxLayout(getInEpPanel(), BoxLayout.X_AXIS)); - inEpPanel.setBorder(BorderFactory.createTitledBorder(null, "IN EP", - TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - inEpPanel.add(getInEpText(), null); - } - return inEpPanel; - } - - private JTextField getInEpText() { - if (inEpText == null) { - inEpText = new JTextField(); - inEpText.setPreferredSize(new Dimension(100, 20)); - } - return inEpText; - } - - private JPanel getTimeoutPanel() { - if (timeoutPanel == null) { - timeoutPanel = new JPanel(); - timeoutPanel.setLayout(new BoxLayout(getTimeoutPanel(), - BoxLayout.X_AXIS)); - timeoutPanel.setBorder(BorderFactory.createTitledBorder(null, - "Timeout", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - timeoutPanel.add(getTimeoutText(), null); - } - return timeoutPanel; - } - - private JTextField getTimeoutText() { - if (timeoutText == null) { - timeoutText = new JTextField(); - timeoutText.setPreferredSize(new Dimension(100, 20)); - } - return timeoutText; - } - - private JPanel getSendDataPanel() { - if (sendDataPanel == null) { - FlowLayout flowLayout4 = new FlowLayout(); - flowLayout4.setAlignment(FlowLayout.LEFT); - sendDataPanel = new JPanel(); - sendDataPanel.setLayout(flowLayout4); - sendDataPanel.setBorder(BorderFactory.createTitledBorder(null, - "Data to send [hex]", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - sendDataPanel.add(getSendRecDataText(), null); - } - return sendDataPanel; - } - - private JPanel getSendRecButtonsPanel() { - if (sendRecButtonsPanel == null) { - FlowLayout flowLayout5 = new FlowLayout(); - flowLayout5.setAlignment(FlowLayout.LEFT); - flowLayout5.setVgap(0); - sendRecButtonsPanel = new JPanel(); - sendRecButtonsPanel.setLayout(flowLayout5); - sendRecButtonsPanel.add(getSendRecButtonsPanelTop(), null); - sendRecButtonsPanel.add(getSendRecButtonsPanelBottom(), null); - } - return sendRecButtonsPanel; - } - - private JButton getSendButton() { - if (sendButton == null) { - sendButton = new JButton(); - sendButton.setText("Send"); - sendButton.setName("sendButton"); - sendButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - int index = sendTypeComboBox.getSelectedIndex(); - if (index == TestDevice.TransferMode.Bulk.ordinal()) { - dev.setOutEPBulk(parseInt(outEpText.getText().trim())); - dev.setMode(TestDevice.TransferMode.Bulk); - } else if (index == TestDevice.TransferMode.Interrupt - .ordinal()) { - dev.setOutEPInt(parseInt(outEpText.getText().trim())); - dev.setMode(TestDevice.TransferMode.Interrupt); - } - byte[] data = parseByteArray(sendDataText.getText().trim()); - dev.write(data, data.length); - } - }); - } - return sendButton; - } - - private JButton getRecButton() { - if (recButton == null) { - recButton = new JButton(); - recButton.setText("Receive"); - recButton.setName("recButton"); - recButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - int index = sendTypeComboBox.getSelectedIndex(); - if (index == TestDevice.TransferMode.Bulk.ordinal()) { - dev.setInEPBulk(parseInt(inEpText.getText().trim())); - dev.setMode(TestDevice.TransferMode.Bulk); - } else if (index == TestDevice.TransferMode.Interrupt - .ordinal()) { - dev.setInEPInt(parseInt(inEpText.getText().trim())); - dev.setMode(TestDevice.TransferMode.Interrupt); - } - dev.read(); - } - }); - } - return recButton; - } - - private JTextField getSendRecDataText() { - if (sendDataText == null) { - sendDataText = new JTextField(); - sendDataText.setPreferredSize(new Dimension(650, 20)); - } - return sendDataText; - } - - int parseInt(String s) { - if (s == "") - return 0; - if (s.indexOf('x') > 0) { - // is hex number - if (s.length() <= 2) { // exception for "0x" - return 0; - } - return Integer.parseInt( - s.substring(s.indexOf('x') + 1, s.length()), 16); - } - // is decimal number - return Integer.parseInt(s); - } - - byte[] parseByteArray(String s) { - final int HEX_WIDTH = 5; - - StringBuffer sb = new StringBuffer(); - int stringIndex = 0, spaceIndex = 0; - String ss; - while (stringIndex + 3 < s.length()) { - ss = s.substring(spaceIndex, spaceIndex + 4); - spaceIndex = s.indexOf(' ', stringIndex) + 1; - sb.append((char) parseInt(ss)); - stringIndex += HEX_WIDTH; - } - return sb.toString().getBytes(); - } - - private static String toHexString(int value) { - return "0x" + Integer.toHexString(value); - } - - /** - * This method initializes sendTypeComboBox - * - * @return javax.swing.JComboBox - */ - private JComboBox getSendTypeComboBox() { - if (sendTypeComboBox == null) { - sendTypeComboBox = new JComboBox(dev.getTransferTypes()); - sendTypeComboBox.setSelectedIndex(dev.getOutMode().ordinal()); - sendTypeComboBox.addItemListener(new java.awt.event.ItemListener() { - public void itemStateChanged(java.awt.event.ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - String mode = (String) e.getItem(); - if (mode.equalsIgnoreCase("Bulk")) { - dev.setOutMode(TestDevice.TransferMode.Bulk); - setOutEpAddr(); - } else if (mode.equalsIgnoreCase("Interrupt")) { - dev.setOutMode(TestDevice.TransferMode.Interrupt); - setOutEpAddr(); - } - } - } - }); - } - return sendTypeComboBox; - } - - /** - * This method initializes recTypeComboBox - * - * @return javax.swing.JComboBox - */ - private JComboBox getRecTypeComboBox() { - if (recTypeComboBox == null) { - recTypeComboBox = new JComboBox(dev.getTransferTypes()); - recTypeComboBox.setSelectedIndex(dev.getInMode().ordinal()); - recTypeComboBox.addItemListener(new java.awt.event.ItemListener() { - public void itemStateChanged(java.awt.event.ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - String mode = (String) e.getItem(); - if (mode.equalsIgnoreCase("Bulk")) { - dev.setInMode(TestDevice.TransferMode.Bulk); - setInEpAddr(); - } else if (mode.equalsIgnoreCase("Interrupt")) { - dev.setInMode(TestDevice.TransferMode.Interrupt); - setInEpAddr(); - } - } - } - }); - // recTypeComboBox.addActionListener(new - // java.awt.event.ActionListener() { - // public void actionPerformed(java.awt.event.ActionEvent e) { - // JComboBox source = (JComboBox) e.getSource(); - // String mode = ""; - // } if (mode.equalsIgnoreCase("Bulk")) { - // dev.setInMode(TestDevice.TransferMode.Bulk); - // setInEpAddr(); - // } else if (mode.equalsIgnoreCase("Interrupt")) { - // dev.setInMode(TestDevice.TransferMode.Interrupt); - // setInEpAddr(); - // } - // - // }); - } - return recTypeComboBox; - } - - /** - * This method initializes sendRecButtonsPanelTop - * - * @return javax.swing.JPanel - */ - private JPanel getSendRecButtonsPanelTop() { - if (sendRecButtonsPanelTop == null) { - BorderLayout borderLayout1 = new BorderLayout(); - borderLayout1.setHgap(5); - sendRecButtonsPanelTop = new JPanel(); - sendRecButtonsPanelTop.setBorder(BorderFactory.createTitledBorder( - null, "OUT", TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - sendRecButtonsPanelTop.setLayout(borderLayout1); - sendRecButtonsPanelTop.add(getSendButton(), BorderLayout.EAST); - sendRecButtonsPanelTop - .add(getSendTypeComboBox(), BorderLayout.WEST); - } - return sendRecButtonsPanelTop; - } - - /** - * This method initializes sendRecButtonsPanelBottom - * - * @return javax.swing.JPanel - */ - private JPanel getSendRecButtonsPanelBottom() { - if (sendRecButtonsPanelBottom == null) { - BorderLayout borderLayout = new BorderLayout(); - borderLayout.setHgap(5); - sendRecButtonsPanelBottom = new JPanel(); - sendRecButtonsPanelBottom.setBorder(BorderFactory - .createTitledBorder(null, "IN", - TitledBorder.DEFAULT_JUSTIFICATION, - TitledBorder.DEFAULT_POSITION, new Font("Dialog", - Font.BOLD, 12), new Color(51, 51, 51))); - sendRecButtonsPanelBottom.setLayout(borderLayout); - sendRecButtonsPanelBottom.add(getRecButton(), BorderLayout.EAST); - sendRecButtonsPanelBottom.add(getRecTypeComboBox(), - BorderLayout.WEST); - } - return sendRecButtonsPanelBottom; - } - - public static void main(String[] args) { - // set LookAndFeel - try { - UIManager - .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); - } catch (Exception e) { - e.printStackTrace(); - } - TestApp app = new TestApp(new TestDevice()); - app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - } -} diff --git a/java/src/ch/ntb/usb/testApp/TestDevice.java b/java/src/ch/ntb/usb/testApp/TestDevice.java deleted file mode 100644 index 4c67257..0000000 --- a/java/src/ch/ntb/usb/testApp/TestDevice.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.testApp; - -import java.util.Vector; -import java.util.logging.Level; -import java.util.logging.Logger; - -import ch.ntb.usb.Device; -import ch.ntb.usb.USB; -import ch.ntb.usb.USBException; -import ch.ntb.usb.logger.LogUtil; - -public class TestDevice extends AbstractDeviceInfo { - - private static final Logger logger = LogUtil.getLogger("ch.ntb.usb.test"); - - private String sendData = "0x5b 0x02 0x01 0x00 0x03 0x03 0xf0 0xf0 0x1f"; - - private Vector transferTypes; - - private static Device dev = null; - - private TransferMode inMode; - private TransferMode outMode; - - public TestDevice() { - logger.setLevel(Level.ALL); - // create a vector for transfer types - transferTypes = new Vector(); - transferTypes - .add(TransferMode.Bulk.ordinal(), TransferMode.Bulk.name()); - transferTypes.add(TransferMode.Interrupt.ordinal(), - TransferMode.Interrupt.name()); - inMode = TransferMode.Bulk; - outMode = TransferMode.Bulk; - } - - @Override - public void initValues() { - setIdVendor((short) 0x8235); - setIdProduct((short) 0x0222); - setTimeout(2000); - setConfiguration(1); - setInterface(0); - setAltinterface(-1); - setOutEPBulk(0x01); - setInEPBulk(0x82); - setOutEPInt(0x03); - setInEPInt(0x84); - setSleepTimeout(2000); - setMaxDataSize(USB.FULLSPEED_MAX_BULK_PACKET_SIZE); - setMode(TransferMode.Bulk); - } - - public void openUsbDevice() { - dev = USB.getDevice(getIdVendor(), getIdProduct()); - try { - dev.open(getConfiguration(), getInterface(), getAltinterface()); - logger.info("device opened, interface claimed"); - } catch (USBException e) { - e.printStackTrace(); - } - } - - public void closeUsbDevice() { - try { - if (dev != null) { - dev.close(); - logger.info("device closed"); - } else { - logger.warning("no device to close -> open first"); - } - } catch (USBException e) { - e.printStackTrace(); - } - } - - public void resetUsbDevice() { - try { - if (dev != null) { - dev.reset(); - logger.info("device reset"); - } else { - logger.warning("no device to reset -> open first"); - } - } catch (USBException e) { - e.printStackTrace(); - } - } - - public void write(byte[] data, int length) { - int lenWritten = 0; - try { - if (dev != null) { - StringBuffer sb = new StringBuffer(); - switch (getOutMode()) { - case Bulk: - lenWritten = dev.writeBulk(getOutEPBulk(), data, length, - getTimeout(), false); - sb.append("write_bulk, ep: 0x" - + Integer.toHexString(getOutEPBulk()) + ", " - + lenWritten + " Bytes sent: "); - break; - case Interrupt: - lenWritten = dev.writeInterrupt(getOutEPInt(), data, - length, getTimeout(), false); - sb.append("write_interrupt, ep: 0x" - + Integer.toHexString(getOutEPInt()) + ", " - + lenWritten + " Bytes sent: "); - break; - } - for (int i = 0; i < lenWritten; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } else { - logger.warning("no device opened"); - } - } catch (USBException e) { - e.printStackTrace(); - } - } - - public void read() { - if (dev != null) { - byte[] data = new byte[dev.getMaxPacketSize()]; - int lenRead = 0; - try { - StringBuffer sb = new StringBuffer(); - switch (getInMode()) { - case Bulk: - lenRead = dev.readBulk(getInEPBulk(), data, dev - .getMaxPacketSize(), getTimeout(), false); - sb.append("read_bulk, ep: 0x" - + Integer.toHexString(getInEPBulk()) + ", " - + lenRead + " Bytes received: Data: "); - break; - case Interrupt: - lenRead = dev.readInterrupt(getInEPInt(), data, dev - .getMaxPacketSize(), getTimeout(), false); - sb.append("read_interrupt, ep: 0x" - + Integer.toHexString(getInEPInt()) + ", " - + lenRead + " Bytes received: Data: "); - break; - } - for (int i = 0; i < lenRead; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } catch (USBException e) { - e.printStackTrace(); - } - } else { - logger.warning("no device opened"); - } - } - - public String getSendData() { - return sendData; - } - - public void setSendData(String sendData) { - this.sendData = sendData; - } - - public Vector getTransferTypes() { - return transferTypes; - } - - public TransferMode getOutMode() { - return outMode; - } - - public void setOutMode(TransferMode outMode) { - this.outMode = outMode; - } - - public TransferMode getInMode() { - return inMode; - } - - public void setInMode(TransferMode inMode) { - this.inMode = inMode; - } -} diff --git a/java/src/ch/ntb/usb/testApp/package.html b/java/src/ch/ntb/usb/testApp/package.html deleted file mode 100644 index bf865ad..0000000 --- a/java/src/ch/ntb/usb/testApp/package.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - -A test application with a GUI to write to and read from a device (based on Swing). - -

Related Resources

- -For more information about this project visit -http://libusbjava.sourceforge.net -. - - - diff --git a/java/test/ch/ntb/usb/demo/LogBus.java b/java/test/ch/ntb/usb/demo/LogBus.java deleted file mode 100644 index 413bd02..0000000 --- a/java/test/ch/ntb/usb/demo/LogBus.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.demo; - -import ch.ntb.usb.LibusbJava; -import ch.ntb.usb.Usb_Bus; -import ch.ntb.usb.Utils; - -/** - * Initalises Libusb and prints the bus(ses) with attached devices to the - * standard out.
- * - * - */ -public class LogBus { - - private static void logBus() { - // if you don't use the ch.ntb.usb.Device class you must initialise - // Libusb before use - LibusbJava.usb_init(); - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - - // retrieve a object tree representing the bus with its devices and - // descriptors - Usb_Bus bus = LibusbJava.usb_get_busses(); - - // log the bus structure to standard out - Utils.logBus(bus); - } - - public static void main(String[] args) { - logBus(); - } -} diff --git a/java/test/ch/ntb/usb/demo/ReadWrite.java b/java/test/ch/ntb/usb/demo/ReadWrite.java deleted file mode 100644 index 61b77de..0000000 --- a/java/test/ch/ntb/usb/demo/ReadWrite.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.demo; - -import ch.ntb.usb.Device; -import ch.ntb.usb.USB; -import ch.ntb.usb.USBException; - -/** - * Demo class to demonstrate simple read and write operations to an USB device.
- * - */ -public class ReadWrite { - - private static void logData(byte[] data) { - System.out.print("Data: "); - for (int i = 0; i < data.length; i++) { - System.out.print("0x" + Integer.toHexString(data[i] & 0xff) + " "); - } - System.out.println(); - } - - public static void main(String[] args) { - // get a device instance with vendor id and product id - Device dev = USB.getDevice((short) 0x8235, (short) 0x0222); - try { - // data to write to the device - byte[] data = new byte[] { 0, 1, 2, 3 }; - // data read from the device - byte[] readData = new byte[data.length]; - - // open the device with configuration 1, interface 0 and without - // altinterface - // this will initialise Libusb for you - dev.open(1, 0, -1); - // write some data to the device - // 0x03 is the endpoint address of the OUT endpoint 3 (from PC to - // device) - dev.writeInterrupt(0x03, data, data.length, 2000, false); - // read some data from the device - // 0x84 is the endpoint address of the IN endpoint 4 (from PC to - // device) - // bit 7 (0x80) is set in case of an IN endpoint - dev.readInterrupt(0x84, readData, readData.length, 2000, false); - // log the data from the device - logData(readData); - // close the device - dev.close(); - } catch (USBException e) { - // if an exception occures during connect or read/write an exception - // is thrown - e.printStackTrace(); - } - } -} diff --git a/java/test/ch/ntb/usb/test/DeviceTest.java b/java/test/ch/ntb/usb/test/DeviceTest.java deleted file mode 100644 index 6411a5d..0000000 --- a/java/test/ch/ntb/usb/test/DeviceTest.java +++ /dev/null @@ -1,625 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.PrintStream; -import java.io.UnsupportedEncodingException; -import java.util.Properties; -import java.util.logging.Logger; - -import junit.framework.Assert; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import ch.ntb.usb.Device; -import ch.ntb.usb.LibusbJava; -import ch.ntb.usb.USB; -import ch.ntb.usb.USBException; -import ch.ntb.usb.Usb_Bus; -import ch.ntb.usb.Usb_Config_Descriptor; -import ch.ntb.usb.Usb_Device_Descriptor; -import ch.ntb.usb.Utils; -import ch.ntb.usb.testApp.AbstractDeviceInfo; -import ch.ntb.usb.testApp.AbstractDeviceInfo.TransferMode; - -public class DeviceTest { - - private static final String testdevicePropertiesFile = "testdevice.properties"; - private static final String deviceInfoKey = "testdeviceInfo"; - - private static AbstractDeviceInfo devinfo; - - private static byte[] testData; - - private static byte[] readData; - - private static Device dev; - - private static Logger log = Logger.getLogger(DeviceTest.class.getName()); - - @BeforeClass - public static void setUp() throws Exception { - // load the device info class with the key - // from 'testdevice.properties' - InputStream propInputStream = new FileInputStream( - testdevicePropertiesFile); - Properties devInfoProp = new Properties(); - devInfoProp.load(propInputStream); - String devInfoClazzName = devInfoProp.getProperty(deviceInfoKey); - if (devInfoClazzName == null) { - throw new Exception("property " + deviceInfoKey - + " not found in file " + testdevicePropertiesFile); - } - Class devInfoClazz = Class.forName(devInfoClazzName); - devinfo = (AbstractDeviceInfo) devInfoClazz.newInstance(); - // devinfo = new CY7C68013A(); - // setup test data - testData = new byte[devinfo.getMaxDataSize()]; - readData = new byte[testData.length]; - // initialise the device - LibusbJava.usb_set_debug(255); - dev = USB.getDevice(devinfo.getIdVendor(), devinfo.getIdProduct(), - devinfo.getBusName(), devinfo.getFilename()); - assertNotNull(dev); - - // print the devices - LibusbJava.usb_init(); - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - Usb_Bus bus = LibusbJava.usb_get_busses(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream ps = new PrintStream(baos); - Utils.logBus(bus, ps); - log.info(baos.toString()); - } - - @Test - public void getDescriptors() throws Exception { - dev.updateDescriptors(); - Usb_Device_Descriptor devDescriptor = dev.getDeviceDescriptor(); - assertNotNull(devDescriptor); - assertEquals(devinfo.getIdProduct(), devDescriptor.getIdProduct()); - assertEquals(devinfo.getIdVendor(), devDescriptor.getIdVendor()); - Usb_Config_Descriptor confDescriptors[] = dev.getConfigDescriptors(); - assertNotNull(confDescriptors); - assertTrue(confDescriptors[0].getInterface().length > 0); - } - - @Test - public void initalReset() throws Exception { - doOpen(); - // this may change the bus and file name of the device - dev.reset(); - timeout(); - } - - @Test(expected = USBException.class) - public void testClose() throws Exception { - try { - // this calls must not throw an exception - doOpen(); - doClose(); - } catch (USBException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - // this call must throw an exception, because the device is closed - dev.writeBulk(devinfo.getOutEPBulk(), testData, testData.length, - devinfo.getTimeout(), false); - } - - @Test(expected = USBException.class) - public void testReset1() throws Exception { - try { - // this calls must not throw an exception - doOpen(); - dev.reset(); - timeout(); - } catch (USBException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - // this call must throw an exception, because the device is closed - dev.writeBulk(devinfo.getOutEPBulk(), testData, testData.length, - devinfo.getTimeout(), false); - } - - @Test(expected = USBException.class) - public void testReset2() throws Exception { - try { - // this calls must not throw an exception - doOpen(); - dev.reset(); - timeout(); - } catch (USBException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - // this call must throw an exception, because the device can't be closed - doClose(); - } - - @Test - public void open() throws Exception { - // get device by busname - doOpen(); - assertNotNull(dev.getDevice()); - String oldFilename = dev.getDevice().getFilename(); - String oldBusName = dev.getDevice().getBus().getDirname(); - assertNotNull(oldFilename); - assertNotNull(oldBusName); - log.info("filename: " + oldFilename + ", busName: " + oldBusName); - Device dev2 = USB.getDevice(devinfo.getIdVendor(), devinfo - .getIdProduct()); - doClose(); - assertEquals(dev, dev2); - } - - @Test - public void openWithBusName() throws Exception { - // get device by busname - doOpen(); - assertNotNull(dev.getDevice()); - String oldFilename = dev.getDevice().getFilename(); - String oldBusName = dev.getDevice().getBus().getDirname(); - assertNotNull(oldFilename); - assertNotNull(oldBusName); - log.info("filename: " + oldFilename + ", busName: " + oldBusName); - Device dev2 = USB.getDevice(devinfo.getIdVendor(), devinfo - .getIdProduct(), oldBusName, null); - doClose(); - assertEquals(dev, dev2); - } - - @Test - public void openWithFilename() throws Exception { - // get device by busname - doOpen(); - assertNotNull(dev.getDevice()); - String oldFilename = dev.getDevice().getFilename(); - String oldBusName = dev.getDevice().getBus().getDirname(); - assertNotNull(oldFilename); - assertNotNull(oldBusName); - log.info("filename: " + oldFilename + ", busName: " + oldBusName); - Device dev2 = USB.getDevice(devinfo.getIdVendor(), devinfo - .getIdProduct(), null, oldFilename); - doClose(); - assertEquals(dev, dev2); - } - - @Test - public void openWithBusAndFilename() throws Exception { - // get device by busname and filename - doOpen(); - assertNotNull(dev.getDevice()); - String oldFilename = dev.getDevice().getFilename(); - String oldBusName = dev.getDevice().getBus().getDirname(); - assertNotNull(oldFilename); - assertNotNull(oldBusName); - log.info("filename: " + oldFilename + ", busName: " + oldBusName); - Device dev2 = USB.getDevice(devinfo.getIdVendor(), devinfo - .getIdProduct(), oldBusName, oldFilename); - doClose(); - assertEquals(dev, dev2); - } - - @Test - public void bulkWriteRead() throws Exception { - checkBulkEndpoints(); - devinfo.setMode(TransferMode.Bulk); - doOpenWriteReadClose(); - } - - private void checkBulkEndpoints() { - if (devinfo.getInEPBulk() == -1 && devinfo.getOutEPBulk() == -1) { - throw new UnsupportedOperationException( - "no bulk endpoints defined in test device definition"); - } - } - - @Test - public void interruptWriteRead() throws Exception { - checkInterruptEndpoints(); - devinfo.setMode(TransferMode.Interrupt); - doOpenWriteReadClose(); - } - - private void checkInterruptEndpoints() { - if (devinfo.getInEPInt() == -1 && devinfo.getOutEPInt() == -1) { - throw new UnsupportedOperationException( - "no interrupt endpoints defined in test device definition"); - } - } - - @Test - public void bulkWriteReadMultiple() throws Exception { - final int NumberOfIterations = 100; - - devinfo.setMode(TransferMode.Bulk); - doOpen(); - for (int i = 0; i < NumberOfIterations; i++) { - doWriteRead(); - } - doClose(); - } - - @Test - public void multipleOpenCloseWithBulkWrite() throws Exception { - devinfo.setMode(TransferMode.Bulk); - for (int i = 0; i < 5; i++) { - doOpen(); - doClose(); - } - doOpenWriteReadClose(); - for (int i = 0; i < 10; i++) { - doOpen(); - doWriteRead(); - doClose(); - } - doOpenWriteReadClose(); - for (int i = 0; i < 5; i++) { - doOpen(); - doClose(); - } - } - - @Test - public void bulkAndInterrupt() throws Exception { - doOpen(); - // BULK - devinfo.setMode(TransferMode.Bulk); - doWriteRead(); - // INTERRUPT - devinfo.setMode(TransferMode.Interrupt); - doWriteRead(); - doClose(); - } - - @Test - public void bulkAndInterruptMultiple() throws Exception { - for (int i = 0; i < 20; i++) { - devinfo.setMode(TransferMode.Bulk); - doOpenWriteReadClose(); - devinfo.setMode(TransferMode.Interrupt); - doOpenWriteReadClose(); - } - } - - @Test - public void controlMsg() throws Exception { - try { - dev.open(devinfo.getConfiguration(), devinfo.getInterface(), - devinfo.getAltinterface()); - // GET STATUS (device) - byte[] data = getTestData(2); - int length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_DEVICE, - USB.REQ_GET_STATUS, 0, 0, data, data.length, devinfo - .getTimeout(), false); - assertTrue(length > 0); - assertEquals((byte) 0x01, data[0]); - assertEquals((byte) 0x00, data[1]); - // GET STATUS (interface) - data = getTestData(2); - length = dev.controlMsg( - USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD - | USB.REQ_TYPE_RECIP_INTERFACE, USB.REQ_GET_STATUS, - 0, 0, data, data.length, devinfo.getTimeout(), false); - assertTrue(length > 0); - assertEquals((byte) 0x00, data[0]); - assertEquals((byte) 0x00, data[1]); - // GET STATUS (endpoint) - data = getTestData(2); - length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_ENDPOINT, - USB.REQ_GET_STATUS, 0, 0, data, data.length, devinfo - .getTimeout(), false); - assertTrue(length > 0); - assertEquals((byte) 0x00, data[0]); - assertEquals((byte) 0x00, data[1]); - // GET CONFIGURATION - data = getTestData(1); - length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_DEVICE, - USB.REQ_GET_CONFIGURATION, 0, 0, data, data.length, devinfo - .getTimeout(), false); - assertTrue(length > 0); - assertEquals((byte) devinfo.getConfiguration(), data[0]); - // // GET INTERFACE - // data = byte[1]; - // length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - // | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_INTERFACE, - // USB.REQ_GET_INTERFACE, 0, devinfo.getInterface(), data, - // data.length, - // devinfo - // .getTimeout(), false); - // logData(data, length); - // GET DESCRIPTOR (device descriptor) - data = getTestData(128); - length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_DEVICE, - USB.REQ_GET_DESCRIPTOR, 1 << 8, 0, data, data.length, - devinfo.getTimeout(), false); - validateDeviceDescriptor(data, length); - // GET DESCRIPTOR (string descriptor (1)) - data = getTestData(128); - length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_DEVICE, - USB.REQ_GET_DESCRIPTOR, (3 << 8) + 1, 0, data, data.length, - devinfo.getTimeout(), false); - String s = getString(data, length); - assertEquals(s, devinfo.getManufacturer()); - // GET DESCRIPTOR (string descriptor (2)) - data = getTestData(128); - length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_DEVICE, - USB.REQ_GET_DESCRIPTOR, (3 << 8) + 2, 0, data, data.length, - devinfo.getTimeout(), false); - s = getString(data, length); - assertEquals(s, devinfo.getProduct()); - // GET DESCRIPTOR (string descriptor (3)) - data = getTestData(128); - length = dev.controlMsg(USB.REQ_TYPE_DIR_DEVICE_TO_HOST - | USB.REQ_TYPE_TYPE_STANDARD | USB.REQ_TYPE_RECIP_DEVICE, - USB.REQ_GET_DESCRIPTOR, (3 << 8) + 3, 0, data, data.length, - devinfo.getTimeout(), false); - s = getString(data, length); - assertEquals(s, devinfo.getSerialVersion()); - // close the device - dev.close(); - } catch (Exception e) { - closeOnException(); - throw e; - } catch (AssertionError e) { - closeOnException(); - throw e; - } - } - - private void closeOnException() { - try { - dev.close(); - } catch (USBException e1) { - // ignore exceptions - } - } - - private void validateDeviceDescriptor(byte[] data, int length) { - // length read - assertEquals(18, length); - // descriptor length - assertEquals((byte) 18, data[0]); - // descriptor type - assertEquals((byte) 1, data[1]); - // USB specification number LSB - assertEquals((byte) 0, data[2]); - // USB specification number MSB - assertEquals((byte) 0x02, data[3]); - // device class (vendor specific) - assertEquals((byte) 0xff, data[4]); - // device subclass (vendor specific) - assertEquals((byte) 0xff, data[5]); - // device protocol (vendor specific) - assertEquals((byte) 0xff, data[6]); - // maximum packet size for endpoint zero - assertEquals((byte) 64, data[7]); - // Vendor ID (NTB) LSB - assertEquals((byte) 0x35, data[8]); - // Vendor ID (NTB) MSB - assertEquals((byte) 0x82, data[9]); - // Product ID (JUnit test board) LSB - assertEquals((byte) 0x22, data[10]); - // Product ID (JUnit test board) MSB - assertEquals((byte) 0x02, data[11]); - - // Device release number LSB - assertEquals((byte) 0x00, data[12]); - // Device release number MSB - assertEquals((byte) 0x10, data[13]); - // Index of manufacturer string descriptor - assertEquals((byte) 0x01, data[14]); - // Index of product string descriptor - assertEquals((byte) 0x02, data[15]); - // Index of serial number string descriptor - assertEquals((byte) 0x03, data[16]); - // Number of possible configurations - assertEquals((byte) 0x01, data[17]); - } - - private byte[] getTestData(int length) { - byte[] b = new byte[length]; - for (int i = 0; i < b.length; i++) { - b[i] = (byte) (Math.random() * 256); - } - return b; - } - - @SuppressWarnings("unused") - private void logData(byte[] data, int length) { - if (length > 0) { - log.info("length: " + length); - String logData = ""; - for (int i = 0; i < length; i++) { - logData += "0x" + Integer.toHexString(data[i] & 0xff) + "\t"; - } - log.info(logData); - } - } - - private String getString(byte[] data, int length) - throws UnsupportedEncodingException { - // data length - assertTrue(length > 2); - // string length - assertTrue(data[0] > 2); - // string descriptor ident - assertEquals((byte) 3, data[1]); - // create string from data - return new String(data, 2, length - 2, "UTF-16LE"); - } - - @Test - public void invalidConfig() throws Exception { - try { - dev.open(devinfo.getConfiguration() + 5, devinfo.getInterface(), - devinfo.getAltinterface()); - fail("USBException expected"); - } catch (USBException e) { - log.severe("could not set config " - + (devinfo.getConfiguration() + 5)); - } - doOpenWriteReadClose(); - } - - @Test - public void invalidInterface() throws Exception { - try { - dev.open(devinfo.getConfiguration(), devinfo.getInterface() + 5, - devinfo.getAltinterface()); - fail("USBException expected"); - } catch (USBException e) { - log.severe("could not claim interface " - + (devinfo.getInterface() + 5)); - } - doOpenWriteReadClose(); - } - - @Test - public void invalidAltinterface() throws Exception { - try { - dev.open(devinfo.getConfiguration(), devinfo.getInterface(), - devinfo.getAltinterface() + 5); - fail("USBException expected"); - } catch (USBException e) { - log.severe("could not set alt interface " - + (devinfo.getAltinterface() + 5)); - } - doOpenWriteReadClose(); - } - - @Test - public void testGetIdProduct() { - Assert.assertEquals(devinfo.getIdProduct(), dev.getIdProduct()); - } - - @Test - public void testGetIdVendor() { - Assert.assertEquals(devinfo.getIdVendor(), dev.getIdVendor()); - } - - @Test - public void testGetAltinterface() { - Assert.assertEquals(devinfo.getAltinterface(), dev.getAltinterface()); - } - - @Test - public void testGetConfiguration() { - Assert.assertEquals(devinfo.getConfiguration(), dev.getConfiguration()); - } - - @Test - public void testGetInterface() { - Assert.assertEquals(devinfo.getInterface(), dev.getInterface()); - } - - @Test - public void testGetMaxPacketSize() throws USBException { - doOpen(); - Assert.assertEquals(devinfo.getMaxDataSize(), dev.getMaxPacketSize()); - doClose(); - } - - @AfterClass - public static void tearDown() throws Exception { - if (dev != null && dev.isOpen()) { - dev.close(); - } - } - - private void doOpen() throws USBException { - dev.open(devinfo.getConfiguration(), devinfo.getInterface(), devinfo - .getAltinterface()); - } - - private void doClose() throws USBException { - dev.close(); - } - - private void doOpenWriteReadClose() throws Exception { - doOpen(); - doWriteRead(); - doClose(); - } - - private void doWriteRead() throws Exception { - initTestData(); - try { - if (devinfo.getMode().equals(TransferMode.Bulk)) { - if (devinfo.getOutEPBulk() != -1) { - dev.writeBulk(devinfo.getOutEPBulk(), testData, - testData.length, devinfo.getTimeout(), false); - } - if (devinfo.getInEPBulk() != -1) { - dev.readBulk(devinfo.getInEPBulk(), readData, - readData.length, devinfo.getTimeout(), false); - } - } else if (devinfo.getMode().equals(TransferMode.Interrupt)) { - if (devinfo.getOutEPInt() != -1) { - dev.writeInterrupt(devinfo.getOutEPInt(), testData, - testData.length, devinfo.getTimeout(), false); - } - if (devinfo.getInEPInt() != -1) { - dev.readInterrupt(devinfo.getInEPInt(), readData, - readData.length, devinfo.getTimeout(), false); - } - } - if (devinfo.doCompareData()) { - compare(testData, readData); - } - } catch (AssertionError e) { - closeOnException(); - throw e; - } catch (Exception e) { - closeOnException(); - throw e; - } - } - - private static void compare(byte[] d1, byte[] d2) { - int minLength = Math.min(d1.length, d2.length); - for (int i = 0; i < minLength; i++) { - assertEquals(d1[i], d2[i]); - } - } - - private static void timeout() { - try { - Thread.sleep(devinfo.getSleepTimeout()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private static void initTestData() { - for (int i = 0; i < testData.length; i++) { - testData[i] = (byte) (Math.random() * 0xff); - readData[i] = 0; - } - } -} diff --git a/java/test/ch/ntb/usb/test/MemoryLeakTest.java b/java/test/ch/ntb/usb/test/MemoryLeakTest.java deleted file mode 100644 index 525405d..0000000 --- a/java/test/ch/ntb/usb/test/MemoryLeakTest.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2008 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.PrintStream; -import java.util.Properties; -import java.util.logging.Logger; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; - -import ch.ntb.usb.Device; -import ch.ntb.usb.LibusbJava; -import ch.ntb.usb.USB; -import ch.ntb.usb.USBException; -import ch.ntb.usb.Usb_Bus; -import ch.ntb.usb.Utils; -import ch.ntb.usb.testApp.AbstractDeviceInfo; -import ch.ntb.usb.testApp.AbstractDeviceInfo.TransferMode; - -public class MemoryLeakTest { - - private static final String testdevicePropertiesFile = "testdevice.properties"; - private static final String deviceInfoKey = "testdeviceInfo"; - - private static AbstractDeviceInfo devinfo; - - private static byte[] testData; - - private static byte[] readData; - - private static Device dev; - - private static Logger log = Logger - .getLogger(MemoryLeakTest.class.getName()); - - @BeforeClass - public static void setUp() throws Exception { - // load the device info class with the key - // from 'testdevice.properties' - InputStream propInputStream = new FileInputStream( - testdevicePropertiesFile); - Properties devInfoProp = new Properties(); - devInfoProp.load(propInputStream); - String devInfoClazzName = devInfoProp.getProperty(deviceInfoKey); - if (devInfoClazzName == null) { - throw new Exception("property " + deviceInfoKey - + " not found in file " + testdevicePropertiesFile); - } - Class devInfoClazz = Class.forName(devInfoClazzName); - devinfo = (AbstractDeviceInfo) devInfoClazz.newInstance(); - // setup test data - testData = new byte[devinfo.getMaxDataSize()]; - readData = new byte[testData.length]; - // initialise the device - LibusbJava.usb_set_debug(255); - dev = USB.getDevice(devinfo.getIdVendor(), devinfo.getIdProduct()); - assertNotNull(dev); - - // print the devices - LibusbJava.usb_init(); - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - Usb_Bus bus = LibusbJava.usb_get_busses(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream ps = new PrintStream(baos); - Utils.logBus(bus, ps); - log.info(baos.toString()); - } - - @Test - public void initalReset() throws Exception { - doOpen(); - dev.reset(); - timeout(); - } - - @Test - public void bulkWriteReadMultiple() throws Exception { - final int NumberOfIterations = 3000; - - devinfo.setMode(TransferMode.Bulk); - doOpen(); - for (int i = 0; i < NumberOfIterations; i++) { - doWriteRead(); - if (i % 1000 == 0) { - System.out.print("."); - } - } - doClose(); - } - - @Test - public void interruptWriteReadMultiple() throws Exception { - final int NumberOfIterations = 3000; - - devinfo.setMode(TransferMode.Interrupt); - doOpen(); - for (int i = 0; i < NumberOfIterations; i++) { - doWriteRead(); - if (i % 1000 == 0) { - System.out.print("."); - } - } - doClose(); - } - - private void closeOnException() { - try { - dev.close(); - } catch (USBException e1) { - // ignore exceptions - } - } - - @AfterClass - public static void tearDown() throws Exception { - if (dev != null && dev.isOpen()) { - dev.close(); - } - } - - private void doOpen() throws USBException { - dev.open(devinfo.getConfiguration(), devinfo.getInterface(), devinfo - .getAltinterface()); - } - - private void doClose() throws USBException { - dev.close(); - } - - private void doWriteRead() throws Exception { - initTestData(); - try { - if (devinfo.getMode().equals(TransferMode.Bulk)) { - if (devinfo.getOutEPBulk() != -1) { - dev.writeBulk(devinfo.getOutEPBulk(), testData, - testData.length, devinfo.getTimeout(), false); - } - if (devinfo.getInEPBulk() != -1) { - dev.readBulk(devinfo.getInEPBulk(), readData, - readData.length, devinfo.getTimeout(), false); - } - } else if (devinfo.getMode().equals(TransferMode.Interrupt)) { - if (devinfo.getOutEPInt() != -1) { - dev.writeInterrupt(devinfo.getOutEPInt(), testData, - testData.length, devinfo.getTimeout(), false); - } - if (devinfo.getInEPInt() != -1) { - dev.readInterrupt(devinfo.getInEPInt(), readData, - readData.length, devinfo.getTimeout(), false); - } - } - if (devinfo.doCompareData()) { - compare(testData, readData); - } - } catch (AssertionError e) { - closeOnException(); - throw e; - } catch (Exception e) { - closeOnException(); - throw e; - } - } - - private static void compare(byte[] d1, byte[] d2) { - final int minLength = Math.min(d1.length, d2.length); - for (int i = 0; i < minLength; i++) { - assertEquals(d1[i], d2[i]); - } - } - - private static void timeout() { - try { - Thread.sleep(devinfo.getSleepTimeout()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private static void initTestData() { - for (int i = 0; i < testData.length; i++) { - testData[i] = (byte) (Math.random() * 0xff); - readData[i] = 0; - } - } -} diff --git a/java/test/ch/ntb/usb/test/TestLibUsbJava.java b/java/test/ch/ntb/usb/test/TestLibUsbJava.java deleted file mode 100644 index 0a582a8..0000000 --- a/java/test/ch/ntb/usb/test/TestLibUsbJava.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2007 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test; - -import ch.ntb.usb.LibusbJava; -import ch.ntb.usb.Usb_Bus; -import ch.ntb.usb.Usb_Config_Descriptor; -import ch.ntb.usb.Usb_Device; -import ch.ntb.usb.Usb_Endpoint_Descriptor; -import ch.ntb.usb.Usb_Interface; -import ch.ntb.usb.Usb_Interface_Descriptor; - -/** - * This class replicates the code from testlibusb.c supplied in the - * libusb-0.1.12 release. - */ -public class TestLibUsbJava { - static boolean verbose; - - /** - * prints out endpoint info - * - * @param endpoint - * The end point. - */ - private static void printEndpoint(Usb_Endpoint_Descriptor endpoint) { - System.out.print(String.format(" bEndpointAddress: %02xh\n", - endpoint.getBEndpointAddress())); - System.out.print(String.format(" bmAttributes: %02xh\n", - endpoint.getBmAttributes())); - System.out.print(String.format(" wMaxPacketSize: %d\n", endpoint - .getWMaxPacketSize())); - System.out.print(String.format(" bInterval: %d\n", endpoint - .getBInterval())); - System.out.print(String.format(" bRefresh: %d\n", endpoint - .getBRefresh())); - System.out.print(String.format(" bSynchAddress: %d\n", endpoint - .getBSynchAddress())); - } - - /** - * prints out the interface descriptor - * - * @param interfaceDescript - * The interface descriptor. - */ - private static void printAltsetting( - Usb_Interface_Descriptor interfaceDescript) { - System.out.print(String.format(" bInterfaceNumber: %d\n", - interfaceDescript.getBInterfaceNumber())); - System.out.print(String.format(" bAlternateSetting: %d\n", - interfaceDescript.getBAlternateSetting())); - System.out.print(String.format(" bNumEndpoints: %d\n", - interfaceDescript.getBNumEndpoints())); - System.out.print(String.format(" bInterfaceClass: %d\n", - interfaceDescript.getBInterfaceClass())); - System.out.print(String.format(" bInterfaceSubClass: %d\n", - interfaceDescript.getBInterfaceSubClass())); - System.out.print(String.format(" bInterfaceProtocol: %d\n", - interfaceDescript.getBInterfaceProtocol())); - System.out.print(String.format(" iInterface: %d\n", - interfaceDescript.getIInterface())); - - for (int i = 0; i < interfaceDescript.getBNumEndpoints(); i++) { - printEndpoint(interfaceDescript.getEndpoint()[i]); - } - } - - /** - * prints out interface - * - * @param usbInterface - * The interface. - */ - private static void printInterface(Usb_Interface usbInterface) { - for (int i = 0; i < usbInterface.getNumAltsetting(); i++) { - printAltsetting(usbInterface.getAltsetting()[i]); - } - } - - /** - * prints out configuration - * - * @param config - * The configuration. - */ - private static void printConfiguration(Usb_Config_Descriptor config) { - System.out.print(String.format(" wTotalLength: %d\n", config - .getWTotalLength())); - System.out.print(String.format(" bNumInterfaces: %d\n", config - .getBNumInterfaces())); - System.out.print(String.format(" bConfigurationValue: %d\n", config - .getBConfigurationValue())); - System.out.print(String.format(" iConfiguration: %d\n", config - .getIConfiguration())); - System.out.print(String.format(" bmAttributes: %02xh\n", - config.getBmAttributes())); - System.out.print(String.format(" MaxPower: %d\n", config - .getMaxPower())); - - for (int i = 0; i < config.getBNumInterfaces(); i++) { - printInterface(config.getInterface()[i]); - } - } - - private static int printDevice(Usb_Device dev, int level) { - long udev; - String mfr; - String product; - String sn; - String spaces; - String descript; - - spaces = " "; - - udev = LibusbJava.usb_open(dev); - - if (udev != 0) { - if (dev.getDescriptor().getIManufacturer() != 0) { - mfr = LibusbJava.usb_get_string_simple(udev, dev - .getDescriptor().getIManufacturer()); - - if (mfr != null) { - descript = String.format("%s - ", mfr); - } else { - descript = String.format("%04X - ", dev.getDescriptor() - .getIdVendor()); - } - } else { - descript = String.format("%04X - ", dev.getDescriptor() - .getIdVendor()); - } - - if (dev.getDescriptor().getIProduct() != 0) { - product = LibusbJava.usb_get_string_simple(udev, dev - .getDescriptor().getIProduct()); - - if (product != null) { - descript = descript + String.format("%s", product); - } else { - descript = descript - + String.format("%04X", dev.getDescriptor() - .getIdProduct()); - } - } else { - descript = descript - + String.format("%04X", dev.getDescriptor() - .getIdProduct()); - } - } else { - descript = String.format("%04X - %04X", dev.getDescriptor() - .getIdVendor(), dev.getDescriptor().getIdProduct()); - } - - System.out.print(String.format("%sDev #%d: %s\n", spaces.substring(0, - level * 2), dev.getDevnum(), descript)); - - if ((udev != 0) && verbose) { - if (dev.getDescriptor().getISerialNumber() != 0) { - sn = LibusbJava.usb_get_string_simple(udev, dev.getDescriptor() - .getISerialNumber()); - - if (sn != null) { - System.out.print(String.format("%s - Serial Number: %s\n", - spaces.substring(0, level * 2), sn)); - } - } - } - - if (udev != 0) { - LibusbJava.usb_close(udev); - } - - if (verbose) { - if (dev.getConfig().length == 0) { - System.out.print(" Couldn't retrieve descriptors\n"); - - return 0; - } - - for (int i = 0; i < dev.getDescriptor().getBNumConfigurations(); i++) { - printConfiguration(dev.getConfig()[i]); - } - } else { - Usb_Device childDev = null; - - for (int i = 0; i < dev.getNumChildren(); i++) { - if (i == 0) { - childDev = dev.getChildren(); - } else { - childDev = childDev.getNext(); - } - - printDevice(childDev, level + 1); - } - } - - return 0; - } // end of printDevice method - - /** - * The main method. - * - * @param args - * The command line arguments. - */ - public static void main(String args[]) throws Exception { - if ((args.length > 0) && (args[0].equals("-v"))) { - verbose = true; - } else { - verbose = false; - } - - // used for debugging. 0 = no debugging, 255 = with debugging - // - LibusbJava.usb_set_debug(255); - - LibusbJava.usb_init(); - - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - - for (Usb_Bus bus = LibusbJava.usb_get_busses(); bus != null; bus = bus - .getNext()) { - if ((bus.getRootDev() != null) && !verbose) { - printDevice(bus.getRootDev(), 0); - } else { - for (Usb_Device dev = bus.getDevices(); dev != null; dev = dev - .getNext()) { - printDevice(dev, 0); - } - } - } - } // end main -} // end of TestLibUsbJava class diff --git a/java/test/ch/ntb/usb/test/devices/AT90USB1287.java b/java/test/ch/ntb/usb/test/devices/AT90USB1287.java deleted file mode 100644 index 33603f6..0000000 --- a/java/test/ch/ntb/usb/test/devices/AT90USB1287.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test.devices; - -import ch.ntb.usb.USB; -import ch.ntb.usb.testApp.AbstractDeviceInfo; - -public class AT90USB1287 extends AbstractDeviceInfo { - - @Override - public void initValues() { - setIdVendor((short) 0x8235); - setIdProduct((short) 0x0222); - setTimeout(2000); - setConfiguration(1); - setInterface(0); - setAltinterface(-1); - setOutEPBulk(0x01); - setInEPBulk(0x82); - setOutEPInt(0x03); - setInEPInt(0x84); - setSleepTimeout(2000); - setMaxDataSize(USB.FULLSPEED_MAX_BULK_PACKET_SIZE); - setMode(TransferMode.Bulk); - setManufacturer("inf.ntb.ch"); - setProduct("JUnit Test Board"); - setSerialVersion("00.10.00"); - } -} diff --git a/java/test/ch/ntb/usb/test/devices/CY7C68013A.java b/java/test/ch/ntb/usb/test/devices/CY7C68013A.java deleted file mode 100644 index 6664d1a..0000000 --- a/java/test/ch/ntb/usb/test/devices/CY7C68013A.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test.devices; - -import ch.ntb.usb.USB; -import ch.ntb.usb.testApp.AbstractDeviceInfo; - -public class CY7C68013A extends AbstractDeviceInfo { - - @Override - public void initValues() { - setIdVendor((short) 0x8235); - setIdProduct((short) 0x0222); - setTimeout(2000); - setConfiguration(1); - setInterface(0); - setAltinterface(-1); - setOutEPInt(0x02); - setInEPInt(0x86); - setOutEPBulk(0x04); - setInEPBulk(0x88); - setSleepTimeout(2000); - setMaxDataSize(USB.HIGHSPEED_MAX_BULK_PACKET_SIZE); - setMode(TransferMode.Bulk); - } -} diff --git a/java/test/ch/ntb/usb/test/devices/MX500.java b/java/test/ch/ntb/usb/test/devices/MX500.java deleted file mode 100644 index c6fe7c3..0000000 --- a/java/test/ch/ntb/usb/test/devices/MX500.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test.devices; - -import ch.ntb.usb.testApp.AbstractDeviceInfo; - -public class MX500 extends AbstractDeviceInfo { - - @Override - public void initValues() { - setIdVendor((short) 0x046d); - setIdProduct((short) 0xc025); - setTimeout(2000); - setConfiguration(1); - setInterface(0); - setAltinterface(0); - setOutEPInt(-1); - setInEPInt(0x81); - setOutEPBulk(-1); - setInEPBulk(-1); - setSleepTimeout(5000); - setMaxDataSize(5); - setMode(TransferMode.Interrupt); - // we only read data -> don't compare - setDoCompareData(false); - } -} diff --git a/java/test/ch/ntb/usb/test/devices/MousePlus.java b/java/test/ch/ntb/usb/test/devices/MousePlus.java deleted file mode 100644 index 9bb1a80..0000000 --- a/java/test/ch/ntb/usb/test/devices/MousePlus.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.test.devices; - -import ch.ntb.usb.testApp.AbstractDeviceInfo; - -public class MousePlus extends AbstractDeviceInfo { - - @Override - public void initValues() { - setIdVendor((short) 0x046d); - setIdProduct((short) 0xc016); - setBusName("bus-0"); - setFilename("\\\\.\\libusb0-0001--0x046d-0xc016"); - setTimeout(2000); - setConfiguration(1); - setInterface(0); - setAltinterface(0); - setOutEPInt(-1); - setInEPInt(0x81); - setOutEPBulk(-1); - setInEPBulk(-1); - setSleepTimeout(5000); - setMaxDataSize(4); - setMode(TransferMode.Interrupt); - // we only read data -> don't compare - setDoCompareData(false); - } -} diff --git a/java/testdevice.properties b/java/testdevice.properties deleted file mode 100644 index a10e97d..0000000 --- a/java/testdevice.properties +++ /dev/null @@ -1,13 +0,0 @@ -################################################################ -# define the usb test class for test/ch.ntb.usb.DeviceTest here -# it must implement ch.ntb.usb.AbstractDeviceInfo -################################################################ - -# Atmel AVR AT90USB1287 -testdeviceInfo=ch.ntb.usb.test.devices.AT90USB1287 -# Cypress FX2 CY7C68013A -#testdeviceInfo=ch.ntb.usb.test.devices.CY7C68013A -# MX500 Mouse -#testdeviceInfo=ch.ntb.usb.test.devices.MX500 -# Logitech Notebook Mouse Plus -#testdeviceInfo=ch.ntb.usb.test.devices.MousePlus diff --git a/java/uml/StarUML.url b/java/uml/StarUML.url deleted file mode 100644 index d3103e6..0000000 --- a/java/uml/StarUML.url +++ /dev/null @@ -1,3 +0,0 @@ -[InternetShortcut] -URL=http://staruml.sourceforge.net/ -Modified=7081E8FF540DC70101 diff --git a/java/uml/ch.ntb.usb.jpg b/java/uml/ch.ntb.usb.jpg deleted file mode 100644 index 9970f128a4d88be2a0e1dbde28740ff1cbb53737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80492 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 G8vg@^#$QAL diff --git a/java/uml/ch.ntb.usb.uml b/java/uml/ch.ntb.usb.uml deleted file mode 100644 index 7de7f42..0000000 --- a/java/uml/ch.ntb.usb.uml +++ /dev/null @@ -1,2023 +0,0 @@ - - - - - - -UMLStandard - - - - -Untitled -5 - -Use Case Model -UMLStandard -useCaseModel -FtDtfOwik0OVQfE6ZPIIGQAA -1 - -Main -hbd/RrRc9EeCFFOhgTtNRQAA - -JzSJSx+4SUGBjb1zXBl8cQAA - - - - -Analysis Model -UMLStandard -analysisModel -FtDtfOwik0OVQfE6ZPIIGQAA -1 - -Main -True -RobustnessDiagram -CNPw4gYWoEG9/GGPCspCSAAA - -0DEch0URP06Bhr3ctOKuJQAA - - - - -Design Model -UMLStandard -designModel -FtDtfOwik0OVQfE6ZPIIGQAA -1 - -Main -True -+VhQCvPWpkq9N+U+GjchOQAA - -jGVxNbYj00Chrjdm4wEWXAAA -32 - -clMaroon -$00B9FFFF -56 -56 -713 -501 -BWFMxN62oEGNP+kKcODiEgAA - - -ch.ntb.usb - - -False - - -False - - - - -clMaroon -$00B9FFFF -448 -216 -113 -53 -Y0tGKOGA/UquqP1qaYDayQAA - - -1 -LibusbJava - - -False - - -False - - - -Y0tGKOGA/UquqP1qaYDayQAA - - -Y0tGKOGA/UquqP1qaYDayQAA - - -False -Y0tGKOGA/UquqP1qaYDayQAA - - - -clMaroon -$00B9FFFF -596 -272 -136 -68 -Native class to access -the LibusbJava.dll which -is a wrapper to the -LibUsb-Win32 API. - - - -clMaroon -$00B9FFFF -560,264;596,278 -kFuXbRCvX0OxyJYGXAJ2NwAA -bj7RYkSMO0qIEP8jkhRPkgAA - - -clMaroon -$00B9FFFF -440 -108 -140 -59 -NDp8e0ch10ST3dwxWPam4AAA - - -1 -Device - - -False - - -False - - - -NDp8e0ch10ST3dwxWPam4AAA - - -NDp8e0ch10ST3dwxWPam4AAA - - -False -NDp8e0ch10ST3dwxWPam4AAA - - - -clMaroon -$00B9FFFF -508,166;505,216 -bHBJ2iMT1Emo3/z1QruACAAA -bj7RYkSMO0qIEP8jkhRPkgAA -2BBmOZlXy0elqrvf1Pfb0QAA - -False -1.5707963267949 -15 -bHBJ2iMT1Emo3/z1QruACAAA - - -False -1.5707963267949 -30 -bHBJ2iMT1Emo3/z1QruACAAA - - -False --1.5707963267949 -15 -bHBJ2iMT1Emo3/z1QruACAAA - - -False --0.523598775598299 -30 -epHead -gBDIpZT7JEe5yWqm5udjswAA - - -False -0.523598775598299 -30 -epTail -9KWfrYr7HUmfL2Kub4NWjQAA - - -False -0.523598775598299 -25 -epHead -gBDIpZT7JEe5yWqm5udjswAA - - -False --0.523598775598299 -25 -epTail -9KWfrYr7HUmfL2Kub4NWjQAA - - -False --0.785398163397448 -40 -epHead -gBDIpZT7JEe5yWqm5udjswAA - - -False -0.785398163397448 -40 -epTail -9KWfrYr7HUmfL2Kub4NWjQAA - - -False --1000 --1000 -50 -8 -gBDIpZT7JEe5yWqm5udjswAA - - -False --1000 --1000 -50 -8 -9KWfrYr7HUmfL2Kub4NWjQAA - - - -clMaroon -$00B9FFFF -352 -308 -80 -43 -fKheOe+4606Ei/JrIdvAnwAA - - -1 -Usb_Bus - - -False - - -False - - - -fKheOe+4606Ei/JrIdvAnwAA - - -fKheOe+4606Ei/JrIdvAnwAA - - -False -fKheOe+4606Ei/JrIdvAnwAA - - - -clMaroon -$00B9FFFF -213 -308 -80 -43 -CYy/2ClqUUO8tWkJYxc3EwAA - - -1 -Usb_Device - - -False - - -False - - - -CYy/2ClqUUO8tWkJYxc3EwAA - - -CYy/2ClqUUO8tWkJYxc3EwAA - - -False -CYy/2ClqUUO8tWkJYxc3EwAA - - - -clMaroon -$00B9FFFF -352,329;292,329 -rRumqTzUKUikwPtpVUuuxQAA -EmkgqCDDHEeVmq/pvU4k2gAA -aFv0LI7ePk6WALpiWziNnAAA - -False -1.5707963267949 -15 -rRumqTzUKUikwPtpVUuuxQAA - - -False -1.5707963267949 -30 -rRumqTzUKUikwPtpVUuuxQAA - - -False --1.5707963267949 -15 -rRumqTzUKUikwPtpVUuuxQAA - - -False --0.523598775598299 -30 -epHead -fPb+E6EWw0SS68JSU1n2PQAA - - -False -0.523598775598299 -30 -epTail -Ktquk70tXEeWxRy5mE3lRQAA - - -0.523598775598299 -25 -epHead -0..* -fPb+E6EWw0SS68JSU1n2PQAA - - -False --0.523598775598299 -25 -epTail -Ktquk70tXEeWxRy5mE3lRQAA - - -False --0.785398163397448 -40 -epHead -fPb+E6EWw0SS68JSU1n2PQAA - - -False -0.785398163397448 -40 -epTail -Ktquk70tXEeWxRy5mE3lRQAA - - -False --1000 --1000 -50 -8 -fPb+E6EWw0SS68JSU1n2PQAA - - -False --1000 --1000 -50 -8 -Ktquk70tXEeWxRy5mE3lRQAA - - - -clMaroon -$00B9FFFF -68 -308 -97 -43 -BhOtKDs6x0a1MSfBURjV3wAA - - -1 -Usb_Descriptor - - -False - - -False - - - -BhOtKDs6x0a1MSfBURjV3wAA - - -BhOtKDs6x0a1MSfBURjV3wAA - - -False -BhOtKDs6x0a1MSfBURjV3wAA - - - -clMaroon -$00B9FFFF -213,329;164,329 -iOkg8RoFXkawUPB8gsL6/QAA -+ip26EaWW06hVyLJe7YYXgAA -EmkgqCDDHEeVmq/pvU4k2gAA - -False -1.5707963267949 -15 -iOkg8RoFXkawUPB8gsL6/QAA - - -False -1.5707963267949 -30 -iOkg8RoFXkawUPB8gsL6/QAA - - -False --1.5707963267949 -15 -iOkg8RoFXkawUPB8gsL6/QAA - - -False --0.523598775598299 -30 -epHead -i+tjppNl/0SEXFu6g5HCzwAA - - -False -0.523598775598299 -30 -epTail -L09q640bS0+0SD6RlutglgAA - - -0.523598775598299 -25 -epHead -1 -i+tjppNl/0SEXFu6g5HCzwAA - - -False --0.523598775598299 -25 -epTail -L09q640bS0+0SD6RlutglgAA - - -False --0.785398163397448 -40 -epHead -i+tjppNl/0SEXFu6g5HCzwAA - - -False -0.785398163397448 -40 -epTail -L09q640bS0+0SD6RlutglgAA - - -False --1000 --1000 -50 -8 -i+tjppNl/0SEXFu6g5HCzwAA - - -False --1000 --1000 -50 -8 -L09q640bS0+0SD6RlutglgAA - - - -clMaroon -$00B9FFFF -64 -396 -139 -43 -WnjxeWRoQE+dRj+3+FKmAAAA - - -1 -Usb_Config_Descriptor - - -False - - -False - - - -WnjxeWRoQE+dRj+3+FKmAAAA - - -WnjxeWRoQE+dRj+3+FKmAAAA - - -False -WnjxeWRoQE+dRj+3+FKmAAAA - - - -clMaroon -$00B9FFFF -224,350;162,396 -hSAawvsHfkmM8rOCrDJNqwAA -V/iR3pEvp0+E4vtLxulBFwAA -EmkgqCDDHEeVmq/pvU4k2gAA - -False -1.5707963267949 -15 -hSAawvsHfkmM8rOCrDJNqwAA - - -False -1.5707963267949 -30 -hSAawvsHfkmM8rOCrDJNqwAA - - -False --1.5707963267949 -15 -hSAawvsHfkmM8rOCrDJNqwAA - - -False --0.523598775598299 -30 -epHead -eYy3sCm5cU2qevI2XvqfOQAA - - -False -0.523598775598299 -30 -epTail -bi54YUBBk0OKg2sVhfeXsgAA - - -0.523598775598299 -25 -epHead -1..* -eYy3sCm5cU2qevI2XvqfOQAA - - -False --0.523598775598299 -25 -epTail -bi54YUBBk0OKg2sVhfeXsgAA - - -False --0.785398163397448 -40 -epHead -eYy3sCm5cU2qevI2XvqfOQAA - - -False -0.785398163397448 -40 -epTail -bi54YUBBk0OKg2sVhfeXsgAA - - -False --1000 --1000 -50 -8 -eYy3sCm5cU2qevI2XvqfOQAA - - -False --1000 --1000 -50 -8 -bi54YUBBk0OKg2sVhfeXsgAA - - - -clMaroon -$00B9FFFF -288 -396 -91 -43 -s3tyNjh10EOlP9fTFKCHzgAA - - -1 -Usb_Interface - - -False - - -False - - - -s3tyNjh10EOlP9fTFKCHzgAA - - -s3tyNjh10EOlP9fTFKCHzgAA - - -False -s3tyNjh10EOlP9fTFKCHzgAA - - - -clMaroon -$00B9FFFF -202,417;288,417 -mH3MSoB9/UmX+ZKIsczTmQAA -9cvRIAusL0q/WdlYUOTN0QAA -V/iR3pEvp0+E4vtLxulBFwAA - -False -1.5707963267949 -15 -mH3MSoB9/UmX+ZKIsczTmQAA - - -False -1.5707963267949 -30 -mH3MSoB9/UmX+ZKIsczTmQAA - - -False --1.5707963267949 -15 -mH3MSoB9/UmX+ZKIsczTmQAA - - -False --0.523598775598299 -30 -epHead -g9gIEMzm106FV2WEfzg/cgAA - - -False -0.523598775598299 -30 -epTail -ss4cvrGCjkas7SCXWHrzGwAA - - -0.523598775598299 -25 -epHead -1..* -g9gIEMzm106FV2WEfzg/cgAA - - -False --0.523598775598299 -25 -epTail -ss4cvrGCjkas7SCXWHrzGwAA - - -False --0.785398163397448 -40 -epHead -g9gIEMzm106FV2WEfzg/cgAA - - -False -0.785398163397448 -40 -epTail -ss4cvrGCjkas7SCXWHrzGwAA - - -False --1000 --1000 -50 -8 -g9gIEMzm106FV2WEfzg/cgAA - - -False --1000 --1000 -50 -8 -ss4cvrGCjkas7SCXWHrzGwAA - - - -clMaroon -$00B9FFFF -64 -500 -157 -43 -1ZxdCeSlnke1mOXmwZo44gAA - - -1 -Usb_Interface_Descriptor - - -False - - -False - - - -1ZxdCeSlnke1mOXmwZo44gAA - - -1ZxdCeSlnke1mOXmwZo44gAA - - -False -1ZxdCeSlnke1mOXmwZo44gAA - - - -clMaroon -$00B9FFFF -294,438;180,500 -PzrlQ1JpekCs4WZeZXoxzAAA -SDQcLhaItkO2CR3ujsiVQgAA -9cvRIAusL0q/WdlYUOTN0QAA - -False -1.5707963267949 -15 -PzrlQ1JpekCs4WZeZXoxzAAA - - -False -1.5707963267949 -30 -PzrlQ1JpekCs4WZeZXoxzAAA - - -False --1.5707963267949 -15 -PzrlQ1JpekCs4WZeZXoxzAAA - - -False --0.523598775598299 -30 -epHead -4CMW55+u4U+8jmDGtiId6QAA - - -False -0.523598775598299 -30 -epTail -tSa9Dc6pX06DqFwtod8w3wAA - - -0.523598775598299 -25 -epHead -1..* -4CMW55+u4U+8jmDGtiId6QAA - - -False --0.523598775598299 -25 -epTail -tSa9Dc6pX06DqFwtod8w3wAA - - -False --0.785398163397448 -40 -epHead -4CMW55+u4U+8jmDGtiId6QAA - - -False -0.785398163397448 -40 -epTail -tSa9Dc6pX06DqFwtod8w3wAA - - -False --1000 --1000 -50 -8 -4CMW55+u4U+8jmDGtiId6QAA - - -False --1000 --1000 -50 -8 -tSa9Dc6pX06DqFwtod8w3wAA - - - -clMaroon -$00B9FFFF -296 -500 -153 -43 -r8we3ZgdtE+PkC4ethr1xgAA - - -1 -Usb_Endpoint_Descriptor - - -False - - -False - - - -r8we3ZgdtE+PkC4ethr1xgAA - - -r8we3ZgdtE+PkC4ethr1xgAA - - -False -r8we3ZgdtE+PkC4ethr1xgAA - - - -clMaroon -$00B9FFFF -220,521;296,521 -zcRjiWnEb0igPnnJ6hWtBAAA -G7uniSci8UWnqaXbrSHwxQAA -SDQcLhaItkO2CR3ujsiVQgAA - -False -1.5707963267949 -15 -zcRjiWnEb0igPnnJ6hWtBAAA - - -False -1.5707963267949 -30 -zcRjiWnEb0igPnnJ6hWtBAAA - - -False --1.5707963267949 -15 -zcRjiWnEb0igPnnJ6hWtBAAA - - -False --0.523598775598299 -30 -epHead -otEuPscjc0GzY5FZ4edKDQAA - - -False -0.523598775598299 -30 -epTail -Y0+EzvEeiUOOez0CtW5HcQAA - - -0.523598775598299 -25 -epHead -1..* -otEuPscjc0GzY5FZ4edKDQAA - - -False --0.523598775598299 -25 -epTail -Y0+EzvEeiUOOez0CtW5HcQAA - - -False --0.785398163397448 -40 -epHead -otEuPscjc0GzY5FZ4edKDQAA - - -False -0.785398163397448 -40 -epTail -Y0+EzvEeiUOOez0CtW5HcQAA - - -False --1000 --1000 -50 -8 -otEuPscjc0GzY5FZ4edKDQAA - - -False --1000 --1000 -50 -8 -Y0+EzvEeiUOOez0CtW5HcQAA - - - -clMaroon -$00B9FFFF -80 -112 -253 -56 -uDTqegf/MkeBHojXFEOLGwAA - - -1 -USB - - -False - - -False - - - -uDTqegf/MkeBHojXFEOLGwAA - - -uDTqegf/MkeBHojXFEOLGwAA - - -False -uDTqegf/MkeBHojXFEOLGwAA - - - -clMaroon -$00B9FFFF -24 -200 -129 -57 -A device factory which -creates and manages -all device instances. - - - -clMaroon -$00B9FFFF -125,200;169,167 -6dw/hbnfL0KObRrJlTOaOAAA -QgnPJMfYfkKI63CxIbKrUQAA - - -clMaroon -$00B9FFFF -470,268;418,308 -CUdyl1aeZ0+5m6T7YR+ScwAA -aFv0LI7ePk6WALpiWziNnAAA -bj7RYkSMO0qIEP8jkhRPkgAA - -False -1.5707963267949 -15 -CUdyl1aeZ0+5m6T7YR+ScwAA - - -False -1.5707963267949 -30 -CUdyl1aeZ0+5m6T7YR+ScwAA - - -False --1.5707963267949 -15 -CUdyl1aeZ0+5m6T7YR+ScwAA - - -False --0.523598775598299 -30 -epHead -eMLC5J+HEUOU0BNl4xEgOQAA - - -False -0.523598775598299 -30 -epTail -yd1VA+Osg0auP1WmaHV/pAAA - - -0.523598775598299 -25 -epHead -1 -eMLC5J+HEUOU0BNl4xEgOQAA - - -False --0.523598775598299 -25 -epTail -yd1VA+Osg0auP1WmaHV/pAAA - - -False --0.785398163397448 -40 -epHead -eMLC5J+HEUOU0BNl4xEgOQAA - - -False -0.785398163397448 -40 -epTail -yd1VA+Osg0auP1WmaHV/pAAA - - -False --1000 --1000 -50 -8 -eMLC5J+HEUOU0BNl4xEgOQAA - - -False --1000 --1000 -50 -8 -yd1VA+Osg0auP1WmaHV/pAAA - - - -clMaroon -$00B9FFFF -448 -364 -86 -41 -Linked List of -type Usb_Bus - - - -clMaroon -$00B9FFFF -454,364;429,350 -aFv0LI7ePk6WALpiWziNnAAA -rLlcF+A5KkiU7WAvQnrBbgAA - - -clMaroon -$00B9FFFF -228 -244 -101 -41 -Linked List of -type Usb_Device - - - -clMaroon -$00B9FFFF -260,308;270,284 -Pv0Pt3qkZkmPtYeARmmwEAAA -EmkgqCDDHEeVmq/pvU4k2gAA - - -clMaroon -$00B9FFFF -332,138;440,137 -E/QwNfFGUEiitlqp99S36AAA -2BBmOZlXy0elqrvf1Pfb0QAA -6dw/hbnfL0KObRrJlTOaOAAA - -False -1.5707963267949 -15 -E/QwNfFGUEiitlqp99S36AAA - - -False -0.977411820724642 -48.0416485978573 -E/QwNfFGUEiitlqp99S36AAA - - -False --1.5707963267949 -15 -E/QwNfFGUEiitlqp99S36AAA - - -False --0.523598775598299 -30 -epHead -tXktVESMQUOZFggmJCAGDAAA - - -False -0.523598775598299 -30 -epTail -ym/t3t4KOkinRJAqyF+HwQAA - - -0.523598775598299 -25 -epHead -0..* -tXktVESMQUOZFggmJCAGDAAA - - -False --0.523598775598299 -25 -epTail -ym/t3t4KOkinRJAqyF+HwQAA - - -False --0.785398163397448 -40 -epHead -tXktVESMQUOZFggmJCAGDAAA - - -False -0.785398163397448 -40 -epTail -ym/t3t4KOkinRJAqyF+HwQAA - - -False --1000 --1000 -50 -8 -tXktVESMQUOZFggmJCAGDAAA - - -False --1000 --1000 -50 -8 -ym/t3t4KOkinRJAqyF+HwQAA - - - -clMaroon -$00B9FFFF -656 -92 -89 -56 -p/wk8BA7x0OTRXXHy0OJmgAA - - -1 -USBException - - -<<exception>> - - -False - - - -p/wk8BA7x0OTRXXHy0OJmgAA - - -p/wk8BA7x0OTRXXHy0OJmgAA - - - -clMaroon -$00B9FFFF -628 -168 -134 -56 -nCivixeClUeJ/8WDflvLoAAA - - -1 -USBTimeoutException - - -<<exception>> - - -False - - - -nCivixeClUeJ/8WDflvLoAAA - - -nCivixeClUeJ/8WDflvLoAAA - - - -clMaroon -$00B9FFFF -579,130;656,123 -3Xd7YkTVeUijpP0dxF3K9wAA -1cUBYeKUdUuMBdS17locfgAA -2BBmOZlXy0elqrvf1Pfb0QAA - -False -1.5707963267949 -15 -3Xd7YkTVeUijpP0dxF3K9wAA - - -False -1.5707963267949 -30 -3Xd7YkTVeUijpP0dxF3K9wAA - - -False --1.5707963267949 -15 -3Xd7YkTVeUijpP0dxF3K9wAA - - -False --0.523598775598299 -30 -epHead -PCKabEdsC0+42T+WCC0J+gAA - - -False -0.523598775598299 -30 -epTail -RwLaC/BiAE+6PNyQNM7DRwAA - - -False -0.523598775598299 -25 -epHead -PCKabEdsC0+42T+WCC0J+gAA - - -False --0.523598775598299 -25 -epTail -RwLaC/BiAE+6PNyQNM7DRwAA - - -False --0.785398163397448 -40 -epHead -PCKabEdsC0+42T+WCC0J+gAA - - -False -0.785398163397448 -40 -epTail -RwLaC/BiAE+6PNyQNM7DRwAA - - -False --1000 --1000 -50 -8 -PCKabEdsC0+42T+WCC0J+gAA - - -False --1000 --1000 -50 -8 -RwLaC/BiAE+6PNyQNM7DRwAA - - - -clMaroon -$00B9FFFF -579,159;628,174 -juy2GOZNhkq5f7cp9rQyWQAA -m44pRtEbJU63JQyFoCCxtAAA -2BBmOZlXy0elqrvf1Pfb0QAA - -False -1.5707963267949 -15 -juy2GOZNhkq5f7cp9rQyWQAA - - -False -1.5707963267949 -30 -juy2GOZNhkq5f7cp9rQyWQAA - - -False --1.5707963267949 -15 -juy2GOZNhkq5f7cp9rQyWQAA - - -False --0.523598775598299 -30 -epHead -cJakFa0mdEChcxEhYeDaKwAA - - -False -0.523598775598299 -30 -epTail -RJcA8VyDe0K2sWOwSOHLiwAA - - -False -0.523598775598299 -25 -epHead -cJakFa0mdEChcxEhYeDaKwAA - - -False --0.523598775598299 -25 -epTail -RJcA8VyDe0K2sWOwSOHLiwAA - - -False --0.785398163397448 -40 -epHead -cJakFa0mdEChcxEhYeDaKwAA - - -False -0.785398163397448 -40 -epTail -RJcA8VyDe0K2sWOwSOHLiwAA - - -False --1000 --1000 -50 -8 -cJakFa0mdEChcxEhYeDaKwAA - - -False --1000 --1000 -50 -8 -RJcA8VyDe0K2sWOwSOHLiwAA - - - - -16 - -ch.ntb.usb -+VhQCvPWpkq9N+U+GjchOQAA -1 -3aqcGmdQBU2yR8XWwbH6wgAA -10 - -LibusbJava -BWFMxN62oEGNP+kKcODiEgAA -4 -bj7RYkSMO0qIEP8jkhRPkgAA -pYdCcwUS1kuxFBcQBuXWhwAA -B8g6dO1SPUKmK3vZse8ykwAA -uhBTnkByp0aEHfbKvbAIRgAA -2 -gBDIpZT7JEe5yWqm5udjswAA -yd1VA+Osg0auP1WmaHV/pAAA - - -Device -BWFMxN62oEGNP+kKcODiEgAA -4 -2BBmOZlXy0elqrvf1Pfb0QAA -vtJgj9fKHUOv3MF6LiZuaQAA -hWPO+G2l6UamJ9XP1xsU6gAA -4gcdaLKmOESleWMoU/ITdgAA -2 - -USBException -NDp8e0ch10ST3dwxWPam4AAA -3 -1cUBYeKUdUuMBdS17locfgAA -xvrkkvaXsEyKlXkeArvn6gAA -9XjxPvkTzUW160zoJoXJIgAA -2 -jAq2OWym/0CBShdxKGVvTgAA -PCKabEdsC0+42T+WCC0J+gAA - - -USBTimeoutException -NDp8e0ch10ST3dwxWPam4AAA -3 -m44pRtEbJU63JQyFoCCxtAAA -8ptu2+IQEkiODfeNkzBbIAAA -NCd0z6hUJUKirt04Te6MmAAA -2 -jB8ocTwTXEuDjkXR5KY03QAA -cJakFa0mdEChcxEhYeDaKwAA - -1 -S86PfEMMVEitYamqNGrOKgAA -6 -9KWfrYr7HUmfL2Kub4NWjQAA -tXktVESMQUOZFggmJCAGDAAA -gnNEskLBlEGy68pKD58J3gAA -gMOdBarVEUi69aAllgtqSAAA -RwLaC/BiAE+6PNyQNM7DRwAA -RJcA8VyDe0K2sWOwSOHLiwAA - - -Usb_Bus -BWFMxN62oEGNP+kKcODiEgAA -4 -aFv0LI7ePk6WALpiWziNnAAA -4mnVev5sO06YjJQcHwAzNAAA -ApB+Ycn4QkCd4JiwYWOuogAA -BoqVLNosikui7Gvm79DqwAAA -4 -Ktquk70tXEeWxRy5mE3lRQAA -BM39AT1FtkCD5DXdvFUWGwAA -eMLC5J+HEUOU0BNl4xEgOQAA -zVVM8HoZZ0K4SLvruROwSQAA - - -Usb_Device -BWFMxN62oEGNP+kKcODiEgAA -4 -EmkgqCDDHEeVmq/pvU4k2gAA -PTdUVfhJcUasUJqV7DrnzwAA -BrLi1ywnW0yy33ZKZYFfAQAA -mAD2mqiGJUmcDDGj80NyFwAA -4 -fPb+E6EWw0SS68JSU1n2PQAA -QkO09pUTaUqUag/gnTQhMAAA -L09q640bS0+0SD6RlutglgAA -bi54YUBBk0OKg2sVhfeXsgAA - - -Usb_Descriptor -BWFMxN62oEGNP+kKcODiEgAA -4 -+ip26EaWW06hVyLJe7YYXgAA -HHzH4uen30eMjBMjRst2mgAA -mqiCxho4tUOAdpt4/UzG1AAA -k95O6pb/JUut+HXhcujAvQAA -1 -i+tjppNl/0SEXFu6g5HCzwAA - - -Usb_Config_Descriptor -BWFMxN62oEGNP+kKcODiEgAA -4 -V/iR3pEvp0+E4vtLxulBFwAA -rC/MaZnjZkmCGY1tqVmdDQAA -bP5ruvrDjkuOZy0aWHw5qAAA -Tp/ZRDMhiEiRwOJ8Dte+6AAA -2 -eYy3sCm5cU2qevI2XvqfOQAA -ss4cvrGCjkas7SCXWHrzGwAA - - -Usb_Interface -BWFMxN62oEGNP+kKcODiEgAA -4 -9cvRIAusL0q/WdlYUOTN0QAA -mHOFyGNhZ02On/3bYclCQgAA -S8sNFKpNX0CfvJz4xM2R8QAA -ZR4POMzRtkii7O0qcFXeagAA -2 -g9gIEMzm106FV2WEfzg/cgAA -tSa9Dc6pX06DqFwtod8w3wAA - - -Usb_Interface_Descriptor -BWFMxN62oEGNP+kKcODiEgAA -4 -SDQcLhaItkO2CR3ujsiVQgAA -niJtEkEAIE27g/VJLGKCeQAA -tEi8ncuIh0akDZbNdI0BXAAA -f6iRLfdj90KPJZTvam9xcgAA -2 -4CMW55+u4U+8jmDGtiId6QAA -Y0+EzvEeiUOOez0CtW5HcQAA - - -Usb_Endpoint_Descriptor -BWFMxN62oEGNP+kKcODiEgAA -4 -G7uniSci8UWnqaXbrSHwxQAA -oOH1WDfw5E+CPfQCtwl3lwAA -zVJ7FeURsUqHB/7bijkGSgAA -8xSZnRanKUS7ttTDyMY3XQAA -1 -otEuPscjc0GzY5FZ4edKDQAA - - -USB -BWFMxN62oEGNP+kKcODiEgAA -4 -6dw/hbnfL0KObRrJlTOaOAAA -9NxPBd7BGEmMZajXGsdmCgAA -ReCrM4NymEe6kNr17N/fLwAA -oUsxZCkyqU+EFKmB53hfIQAA -1 - -getDevice -uDTqegf/MkeBHojXFEOLGwAA -3 - -idVendor -int -4R8Nv262EEqwj5BpzEwnFAAA - - -idProduct -int -4R8Nv262EEqwj5BpzEwnFAAA - - -return -pdkReturn -Device -4R8Nv262EEqwj5BpzEwnFAAA -NDp8e0ch10ST3dwxWPam4AAA - - -1 -ym/t3t4KOkinRJAqyF+HwQAA - -1 -mUO4OyL7Z0inPl8NM4gOKQAA - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -K1jbk7tvDECb113o54KaCgAA -ewuWWER98U2X1/Gyqau2iQAA -ydzgGYT1JUqGBbRngdAkOwAA -kRDUUGf7YkG4X7f5D7Tu5QAA -2 - -False -bHBJ2iMT1Emo3/z1QruACAAA -NDp8e0ch10ST3dwxWPam4AAA -4 -HnV1GDlOlUiEzDCgg3OVnwAA -3vJXTt9Ud0+cklGb7VirjwAA -T54kLOtp70+07rCDysRoRgAA -ZmEyokBAfUuimbUqLhInLAAA - - -bHBJ2iMT1Emo3/z1QruACAAA -Y0tGKOGA/UquqP1qaYDayQAA -4 -nP4i5P/O2UWgSJEnuXrNGAAA -NbkMFiV5UUyU8V6ZyNh/ggAA -qnQYuly9P0ePfBPLyOhoUgAA -KiPq8wTTI02Bz5cifJGqSAAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -N+DG+sDQsU+dEVL0AtioTgAA -h4biD7IVaE2ULotQ37wNTAAA -juYsWZ7nVUuYfA9bXvsoRQAA -gVKvw0NHaUCC8LoVjlxEaQAA -2 - -False -rRumqTzUKUikwPtpVUuuxQAA -fKheOe+4606Ei/JrIdvAnwAA -4 -OYIH3ymdpUit+s9rXvgX4QAA -2cgp4vLw00iUpTcWm5nXagAA -tGs9/SOEbkuqTf609sd2uQAA -wlFJ5gxqB0W1JznjbhR82wAA - - -0..* -rRumqTzUKUikwPtpVUuuxQAA -CYy/2ClqUUO8tWkJYxc3EwAA -4 -tvTF0QXyTkOU+lco6nawpAAA -OlG/OTSXdkeeQhih0vfj2gAA -E2JhEcUXZkeaMU/vi7BgQwAA -Pgiug9F5sEm6RGjxSJwN0QAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -2 - -False -N1GWtLD2hke4QpWNj3VbPQAA -CYy/2ClqUUO8tWkJYxc3EwAA - - -1 -N1GWtLD2hke4QpWNj3VbPQAA -fKheOe+4606Ei/JrIdvAnwAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -tgaMJ8+zg0Sn4iEmoOIchwAA -rgg15Kcdr0mVUlnlnH9jIgAA -keuOun+wjE+QghwhaUSp7QAA -LDA6nTIXBkWsIuU2zIrtiAAA -2 - -False -iOkg8RoFXkawUPB8gsL6/QAA -CYy/2ClqUUO8tWkJYxc3EwAA -4 -VnH93Y/7IkaJYl+DPinjmwAA -J87I73G/nkuAKdCKS1ov3AAA -gX2CUgfdCki+IWGLlwLwBgAA -8AgdepV+YECTfuxJBIqCCwAA - - -1 -iOkg8RoFXkawUPB8gsL6/QAA -BhOtKDs6x0a1MSfBURjV3wAA -4 -1qxaXx2+hEq1Na+Bk3itGQAA -FePC/A0aMEGuAW8YyMNUfQAA -jbg1/Hojq0CDpZmGOngZ8gAA -XyLeWJl15kSVqLBfioHjpwAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -BkeBTT1wlUu9nQU0NNTXFAAA -Tj/mtG0ojUeUZaROPDr/HAAA -0MVCo5fIBUSXtmRyYABJcQAA -UVrEAk/Wbk2olhkdMQkz9wAA -2 - -False -hSAawvsHfkmM8rOCrDJNqwAA -CYy/2ClqUUO8tWkJYxc3EwAA -4 -uBprnnKYk0qBu9UZ9bv+5wAA -uUm65cZr+USoFHmg+9GOTAAA -21oCmtYmTk6I99TNGY+WmQAA -CEBGmwNSDE+W0wJ/aQr5ogAA - - -1..* -hSAawvsHfkmM8rOCrDJNqwAA -WnjxeWRoQE+dRj+3+FKmAAAA -4 -q/Tjz7MsSkCzN45MnaE+ygAA -Ct5Onzw2LES6ewhEa/3NWQAA -9Z0KUb7BbUO7F3MYIOiSrQAA -cY/H4Djf5kicM3tDZOwWkAAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -u2OPyc/1n0+QIGTThiMa3AAA -KLVJzL8T0EW4b4yH0XzDkgAA -OMzpA/ZwnEujuwqWpMDwIwAA -ed2kVo8InU6lewfrLcWA0wAA -2 - -False -mH3MSoB9/UmX+ZKIsczTmQAA -WnjxeWRoQE+dRj+3+FKmAAAA -4 -ElMIvqx9s0qrTOxejhsaSQAA -/avxLTDZe0qmoKyO79Gi7AAA -tjnuHlEOBk2grTlQ+kPGnQAA -oS91czwGhEKtYBANVGPPnwAA - - -1..* -mH3MSoB9/UmX+ZKIsczTmQAA -s3tyNjh10EOlP9fTFKCHzgAA -4 -YlWEGJVu1Eu9BEa5L9YqyQAA -upJz60gOiE2Y6jwQzzUoqQAA -PpS7OEegzUeBhCrBHXgkwAAA -XVazEpRSqkyH0zMCJgEnBAAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -h/CUffjgwUqCUDakMMJ7QQAA -ZnaPkKZFCEaRFYlVBh84uAAA -O1VlBtzO0EaAsu2MtMnYhQAA -S22NfH+9rUCXuvo2rsAWDgAA -2 - -False -PzrlQ1JpekCs4WZeZXoxzAAA -s3tyNjh10EOlP9fTFKCHzgAA -4 -lo8h2SqcoUeOOUPAe0EjdAAA -mv0gaJr3SUeuVY1xo1FdowAA -VQ4ysUxS306j02ouNykrpwAA -+GMHnNNOiEW2P4PaNnKcsgAA - - -1..* -PzrlQ1JpekCs4WZeZXoxzAAA -1ZxdCeSlnke1mOXmwZo44gAA -4 -/cDNFyyj1kKTrWJ1HeW7jwAA -T7Yrg8efIE2hhid6kOwp/AAA -eq+vp2GL9Ey4am7PZZZvYwAA -HB0H112qzU65avMG65s6+AAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -Qa9DlhrWuEyzlqeeW42vigAA -OOu7JCeVT06/I9zcCYxoMgAA -eXZQmjjOb0mgLqiKIEgNjgAA -Z54IgvzlG0+i0eC61Nul2QAA -2 - -False -zcRjiWnEb0igPnnJ6hWtBAAA -1ZxdCeSlnke1mOXmwZo44gAA -4 -Wf6tv7bE1kq7mrxCiOa+SQAA -3TeYQ+z3sUaWb3mqCq5ZswAA -e6lrE15aj0SZAg2c/y97hgAA -B4mF3KmBkEmmqPeQhru4awAA - - -1..* -zcRjiWnEb0igPnnJ6hWtBAAA -r8we3ZgdtE+PkC4ethr1xgAA -4 -lhChbObcCU2CcZDalktiVQAA -eX+Li7xw8Eu7Q+WVQJ7NWgAA -QIJa01TJ8UWewFDbze7RZwAA -z9YWV6a+CkmXxyniylWBegAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -3d03ZiQMEUyp/GDpSGjNdQAA -EnqlEABzrEyr7NnE3rXmXAAA -v5SF4iq4U0idtpnG9Es3XAAA -vmgfHAqH1kK8d0+ACOZ3LgAA -2 - -False -CUdyl1aeZ0+5m6T7YR+ScwAA -Y0tGKOGA/UquqP1qaYDayQAA -4 -cJO2BE8tMk6Vdt7DH7oXUgAA -ztnLte7rf0CX37ncwAxYbgAA -mEJVUc0onE+FHNS1qwcDygAA -dg0oZAkRp02LqrBKRlJGygAA - - -1 -CUdyl1aeZ0+5m6T7YR+ScwAA -fKheOe+4606Ei/JrIdvAnwAA -4 -ACS3R0vnCkiCG7/+fEq01gAA -6bLwfBAaDE6zqua+j7Jf+wAA -PvH2F0s2CU+u9nUzCb6FmwAA -+s+HLixVdk+3Jjh1dYo5NgAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -2 - -False -sq2Gf22XcUO8hotO+r/6swAA -fKheOe+4606Ei/JrIdvAnwAA - - -sq2Gf22XcUO8hotO+r/6swAA -BWFMxN62oEGNP+kKcODiEgAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -15TrBVceQkG56FTsqMwcxgAA -3Fgd7pnAA0+KRKisyFBaqwAA -hxuj8u8Y2EK8qsnGTaBOzQAA -znFoObTUEUOch9SPd7VBJAAA -2 - -False -E/QwNfFGUEiitlqp99S36AAA -uDTqegf/MkeBHojXFEOLGwAA -4 -k9T1VNzEo0ufuAB6TN2QRwAA -oiCIMGX8ik6YjhRQQxB8OQAA -Tu5aL5lgO0ut/RTBGjiKqAAA -iDNEYw6KL0uVCCKPtWa8bwAA - - -0..* -E/QwNfFGUEiitlqp99S36AAA -NDp8e0ch10ST3dwxWPam4AAA -4 -4Vg7xm7w902Ov8oTfg9PSAAA -DWRmEP/U1kOcrZnzyvRnXQAA -FngPhombp0y5VL3elyPMMgAA -ETXPzMurVEmlbvocuDXtVwAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -2 - -V1q5qLSIxEidFrrPCOFqIgAA -NDp8e0ch10ST3dwxWPam4AAA - - -V1q5qLSIxEidFrrPCOFqIgAA -p/wk8BA7x0OTRXXHy0OJmgAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -2 - -7Niy2MZhPUynlh2A2zVkEQAA -NDp8e0ch10ST3dwxWPam4AAA - - -7Niy2MZhPUynlh2A2zVkEQAA -nCivixeClUeJ/8WDflvLoAAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -Rk0gcRI5ikapDGR7M2bn5AAA -HXSRZ0W7C02e+CDSTe+vQgAA -39P+Jod7A0SpXNClHK/bIwAA -FOp7UHIFjUmRJarTRH6h3AAA -2 - -False -3Xd7YkTVeUijpP0dxF3K9wAA -NDp8e0ch10ST3dwxWPam4AAA -4 -IIOw3R07h0mYIbxgQNAvlgAA -6DAAoxE3gE6btQ3QR6zXSAAA -Ilbnf/apgU2JUqlCax0E0AAA -GWJjJWM040mgOfcnzTwGqgAA - - -3Xd7YkTVeUijpP0dxF3K9wAA -p/wk8BA7x0OTRXXHy0OJmgAA -4 -Mf6lj8hCekmAt8LSuv0gPQAA -roosZQXLT0uL9JG9OjvfIQAA -gZyJB5c8j0qqNEv58A7qkQAA -jGiYNVwhsUqy+u4GsecJkwAA - - - -+VhQCvPWpkq9N+U+GjchOQAA -4 -Mp4OVq4lq0Ot63a04V2k0AAA -gef03vYxbUeRLVhwDqSRtwAA -vk1lNcjPWk2tPqsfZgpaNgAA -1F1Ggg3l7kq2YUNbccrRzAAA -2 - -False -juy2GOZNhkq5f7cp9rQyWQAA -NDp8e0ch10ST3dwxWPam4AAA -4 -zO1s01kJIE6XkTjlSB6aywAA -W9sijr2Fr02bK6wbKT19/wAA -UxK4awc9BUaq32wB9ulIlQAA -62JK0r9fykSMDnmw3ZuktgAA - - -juy2GOZNhkq5f7cp9rQyWQAA -nCivixeClUeJ/8WDflvLoAAA -4 -NlVzv49r5EKp3NXgP9SJUgAA -2Q3xA4DACkm0S1EmjZ54IwAA -S2waQNcxi0SMzX3GtK14MwAA -hN0Adta+JUWLfSVgHKKVEgAA - - - - -Implementation Model -UMLStandard -implementationModel -FtDtfOwik0OVQfE6ZPIIGQAA -1 - -Main -RoG5Bh+N8kiY/NeIyRBD4wAA - -NN8Cz7nUpkWUBrC4fP0hnwAA - - - - -Deployment Model -UMLStandard -deploymentModel -FtDtfOwik0OVQfE6ZPIIGQAA -1 - -Main -xUneQ8+pSE+Bo7LqxpLuhQAA - -SXfsx2mnwUOegNnzMTcg/gAA - - - - - - diff --git a/java/version.properties b/java/version.properties deleted file mode 100644 index 265e89c..0000000 --- a/java/version.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Thu Aug 24 14:28:28 CEST 2006 -version.major=0 -version.minor=5 -version.release=8 diff --git a/java/src/ch/ntb/usb/Device.java b/src/main/java/ch/ntb/usb.r273/Device.java similarity index 96% rename from java/src/ch/ntb/usb/Device.java rename to src/main/java/ch/ntb/usb.r273/Device.java index 2184278..7398295 100644 --- a/java/src/ch/ntb/usb/Device.java +++ b/src/main/java/ch/ntb/usb.r273/Device.java @@ -1,816 +1,816 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import ch.ntb.usb.logger.LogUtil; - -/** - * This class represents an USB device.
- * To get an instance of an USB device use USB.getDevice(...). - * - */ -public class Device { - - private static final Logger logger = LogUtil.getLogger("ch.ntb.usb"); - - private int maxPacketSize; - - /** - * Mandatory identification values for the device. - */ - private int idVendor, idProduct; - - /** - * Optional identification value for the device (e.g. if there are multiple - * devices with the same vendor and product id). - */ - private String filename; - - /** - * Optional identification value for the device (e.g. if there are multiple - * devices with the same vendor and product id). - */ - private String busName; - - private int dev_configuration, dev_interface, dev_altinterface; - - private long usbDevHandle; - - private boolean resetOnFirstOpen, resetDone; - - private int resetTimeout = 2000; - - private Usb_Device dev; - - protected Device(short idVendor, short idProduct) { - resetOnFirstOpen = false; - resetDone = false; - maxPacketSize = -1; - this.idVendor = idVendor; - this.idProduct = idProduct; - this.filename = null; - } - - protected Device(short idVendor, short idProduct, String busName, - String filename) { - resetOnFirstOpen = false; - resetDone = false; - maxPacketSize = -1; - this.idVendor = idVendor; - this.idProduct = idProduct; - this.busName = busName; - this.filename = filename; - } - - private void updateMaxPacketSize(Usb_Device device) throws USBException { - maxPacketSize = -1; - Usb_Config_Descriptor[] confDesc = device.getConfig(); - for (int i = 0; i < confDesc.length; i++) { - Usb_Interface[] int_ = confDesc[i].getInterface(); - for (int j = 0; j < int_.length; j++) { - Usb_Interface_Descriptor[] intDesc = int_[j].getAltsetting(); - for (int k = 0; k < intDesc.length; k++) { - Usb_Endpoint_Descriptor[] epDesc = intDesc[k].getEndpoint(); - for (int l = 0; l < epDesc.length; l++) { - maxPacketSize = Math.max(epDesc[l].getWMaxPacketSize(), - maxPacketSize); - } - } - } - } - if (maxPacketSize <= 0) { - throw new USBException( - "No USB endpoints found. Check the device configuration"); - } - } - - /** - * Initializes the device. The parameters idVendor and - * idProduct are mandatory. The parameter filename - * is optional. - */ - private Usb_Device initDevice(int idVendorParam, int idProductParam, - String busName, String filename) throws USBException { - Usb_Bus bus = USB.getBus(); - - Usb_Device device = null; - // search for device - while (bus != null) { - device = bus.getDevices(); - while (device != null) { - Usb_Device_Descriptor devDesc = device.getDescriptor(); - if (busName != null && filename != null) { - if (busName.compareTo(bus.getDirname()) == 0 - && filename.compareTo(device.getFilename()) == 0 - && devDesc.getIdVendor() == idVendor - && devDesc.getIdProduct() == idProduct) { - logger.info("Device found. bus: " + bus.getDirname() - + ", filename: " + device.getFilename()); - updateMaxPacketSize(device); - return device; - } - } else if (filename != null) { - if (filename.compareTo(device.getFilename()) == 0 - && devDesc.getIdVendor() == idVendor - && devDesc.getIdProduct() == idProduct) { - logger.info("Device found. bus: " + bus.getDirname() - + ", filename: " + device.getFilename()); - updateMaxPacketSize(device); - return device; - } - } else if (busName != null) { - if (busName.compareTo(bus.getDirname()) == 0 - && devDesc.getIdVendor() == idVendor - && devDesc.getIdProduct() == idProduct) { - logger.info("Device found. bus: " + bus.getDirname() - + ", filename: " + device.getFilename()); - updateMaxPacketSize(device); - return device; - } - } else if (devDesc.getIdVendor() == idVendor - && devDesc.getIdProduct() == idProduct) { - logger.info("Device found. bus: " + bus.getDirname() - + ", filename: " + device.getFilename()); - updateMaxPacketSize(device); - return device; - } - device = device.getNext(); - } - bus = bus.getNext(); - } - return null; - } - - /** - * Updates the device and descriptor information from the bus.
- * The descriptors can be read with {@link #getDeviceDescriptor()} and - * {@link #getConfigDescriptors()}. - * - * @throws USBException - */ - public void updateDescriptors() throws USBException { - dev = initDevice(idVendor, idProduct, busName, filename); - } - - /** - * Returns the device descriptor associated with this device.
- * The descriptor is updated by calling {@link #updateDescriptors()} or - * {@link #open(int, int, int)}. - * - * @return the device descriptor associated with this device or - * null - */ - public Usb_Device_Descriptor getDeviceDescriptor() { - if (dev == null) { - return null; - } - return dev.getDescriptor(); - } - - /** - * Returns the configuration descriptors associated with this device.
- * The descriptors are updated by calling {@link #updateDescriptors()} or - * {@link #open(int, int, int)}. - * - * @return the configuration descriptors associated with this device or - * null - */ - public Usb_Config_Descriptor[] getConfigDescriptors() { - if (dev == null) { - return null; - } - return dev.getConfig(); - } - - /** - * Opens the device and claims the specified configuration, interface and - * altinterface.
- * First the bus is enumerated. If the device is found its descriptors are - * read and the maxPacketSize value is updated. If no endpoints - * are found in the descriptors an exception is thrown. - * - * @param configuration - * the configuration, see - * {@link Usb_Config_Descriptor#getBConfigurationValue()} - * @param interface_ - * the interface, see - * {@link Usb_Interface_Descriptor#getBInterfaceNumber()} - * @param altinterface - * the alternate interface, see - * {@link Usb_Interface_Descriptor#getBAlternateSetting()}. If no - * alternate interface must be set -1 can be used. - * @throws USBException - */ - public void open(int configuration, int interface_, int altinterface) - throws USBException { - this.dev_configuration = configuration; - this.dev_interface = interface_; - this.dev_altinterface = altinterface; - - if (usbDevHandle != 0) { - throw new USBException("device opened, close or reset first"); - } - - dev = initDevice(idVendor, idProduct, busName, filename); - - if (dev != null) { - long res = LibusbJava.usb_open(dev); - if (res == 0) { - throw new USBException("LibusbJava.usb_open: " - + LibusbJava.usb_strerror()); - } - usbDevHandle = res; - } - - if (dev == null || usbDevHandle == 0) { - throw new USBException("USB device with " + toString() - + " not found on USB"); - } - claim_interface(usbDevHandle, configuration, interface_, altinterface); - if (resetOnFirstOpen & !resetDone) { - logger.info("reset on first open"); - resetDone = true; - reset(); - try { - Thread.sleep(resetTimeout); - } catch (InterruptedException e) { - // - } - open(configuration, interface_, altinterface); - } - } - - /** - * Release the claimed interface and close the opened device.
- * - * @throws USBException - */ - public void close() throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - release_interface(usbDevHandle, dev_interface); - if (LibusbJava.usb_close(usbDevHandle) < 0) { - usbDevHandle = 0; - throw new USBException("LibusbJava.usb_close: " - + LibusbJava.usb_strerror()); - } - usbDevHandle = 0; - maxPacketSize = -1; - logger.info("device closed"); - } - - /** - * Sends an USB reset to the device. The device handle will no longer be - * valid. To use the device again, {@link #open(int, int, int)} must be - * called.
- * Note that the device is re-attached to the USB which may cause the bus - * and filename to be changed. If the bus and filename parameters are used - * in {@link USB#getDevice(short, short, String, String)} unregister the - * device using {@link USB#unregisterDevice(Device)}, re-enumerate the bus - * and create a new device instance. If that is not done the device may not - * be found. - * - * @throws USBException - */ - public void reset() throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - release_interface(usbDevHandle, dev_interface); - if (LibusbJava.usb_reset(usbDevHandle) < 0) { - usbDevHandle = 0; - throw new USBException("LibusbJava.usb_reset: " - + LibusbJava.usb_strerror()); - } - usbDevHandle = 0; - logger.info("device reset"); - } - - /** - * Write data to the device using a bulk transfer.
- * - * @param out_ep_address - * endpoint address to write to - * @param data - * data to write to this endpoint - * @param size - * size of the data - * @param timeout - * amount of time in ms the device will try to send the data - * until a timeout exception is thrown - * @param reopenOnTimeout - * if set to true, the device will try to open the connection and - * send the data again before a timeout exception is thrown - * @return the actual number of bytes written - * @throws USBException - */ - public int writeBulk(int out_ep_address, byte[] data, int size, - int timeout, boolean reopenOnTimeout) throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - if (data == null) { - throw new USBException("data must not be null"); - } - if (size <= 0 || size > data.length) { - throw new ArrayIndexOutOfBoundsException("invalid size: " + size); - } - int lenWritten = LibusbJava.usb_bulk_write(usbDevHandle, - out_ep_address, data, size, timeout); - if (lenWritten < 0) { - if (lenWritten == LibusbJava.ERROR_TIMEDOUT) { - // try to reopen the device and send the data again - if (reopenOnTimeout) { - logger.info("try to reopen"); - reset(); - open(dev_configuration, dev_interface, dev_altinterface); - return writeBulk(out_ep_address, data, size, timeout, false); - } - throw new USBTimeoutException("LibusbJava.usb_bulk_write: " - + LibusbJava.usb_strerror()); - } - throw new USBException("LibusbJava.usb_bulk_write: " - + LibusbJava.usb_strerror()); - } - - logger.info("length written: " + lenWritten); - if (logger.isLoggable(Level.FINEST)) { - StringBuffer sb = new StringBuffer("bulkwrite, ep 0x" - + Integer.toHexString(out_ep_address) + ": " + lenWritten - + " Bytes sent: "); - for (int i = 0; i < lenWritten; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } - return lenWritten; - } - - /** - * Read data from the device using a bulk transfer.
- * - * @param in_ep_address - * endpoint address to read from - * @param data - * data buffer for the data to be read - * @param size - * the maximum requested data size - * @param timeout - * amount of time in ms the device will try to receive data until - * a timeout exception is thrown - * @param reopenOnTimeout - * if set to true, the device will try to open the connection and - * receive the data again before a timeout exception is thrown - * @return the actual number of bytes read - * @throws USBException - */ - public int readBulk(int in_ep_address, byte[] data, int size, int timeout, - boolean reopenOnTimeout) throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - if (data == null) { - throw new USBException("data must not be null"); - } - if (size <= 0 || size > data.length) { - throw new ArrayIndexOutOfBoundsException("invalid size: " + size); - } - int lenRead = LibusbJava.usb_bulk_read(usbDevHandle, in_ep_address, - data, size, timeout); - if (lenRead < 0) { - if (lenRead == LibusbJava.ERROR_TIMEDOUT) { - // try to reopen the device and send the data again - if (reopenOnTimeout) { - logger.info("try to reopen"); - reset(); - open(dev_configuration, dev_interface, dev_altinterface); - return readBulk(in_ep_address, data, size, timeout, false); - } - throw new USBTimeoutException("LibusbJava.usb_bulk_read: " - + LibusbJava.usb_strerror()); - } - throw new USBException("LibusbJava.usb_bulk_read: " - + LibusbJava.usb_strerror()); - } - - logger.info("length read: " + lenRead); - if (logger.isLoggable(Level.FINEST)) { - StringBuffer sb = new StringBuffer("bulkread, ep 0x" - + Integer.toHexString(in_ep_address) + ": " + lenRead - + " Bytes received: "); - for (int i = 0; i < lenRead; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } - return lenRead; - } - - /** - * Write data to the device using a interrupt transfer.
- * - * @param out_ep_address - * endpoint address to write to - * @param data - * data to write to this endpoint - * @param size - * size of the data - * @param timeout - * amount of time in ms the device will try to send the data - * until a timeout exception is thrown - * @param reopenOnTimeout - * if set to true, the device will try to open the connection and - * send the data again before a timeout exception is thrown - * @return the actual number of bytes written - * @throws USBException - */ - public int writeInterrupt(int out_ep_address, byte[] data, int size, - int timeout, boolean reopenOnTimeout) throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - if (data == null) { - throw new USBException("data must not be null"); - } - if (size <= 0 || size > data.length) { - throw new ArrayIndexOutOfBoundsException("invalid size: " + size); - } - int lenWritten = LibusbJava.usb_interrupt_write(usbDevHandle, - out_ep_address, data, size, timeout); - if (lenWritten < 0) { - if (lenWritten == LibusbJava.ERROR_TIMEDOUT) { - // try to reopen the device and send the data again - if (reopenOnTimeout) { - logger.info("try to reopen"); - reset(); - open(dev_configuration, dev_interface, dev_altinterface); - return writeInterrupt(out_ep_address, data, size, timeout, - false); - } - throw new USBTimeoutException( - "LibusbJava.usb_interrupt_write: " - + LibusbJava.usb_strerror()); - } - throw new USBException("LibusbJava.usb_interrupt_write: " - + LibusbJava.usb_strerror()); - } - - logger.info("length written: " + lenWritten); - if (logger.isLoggable(Level.FINEST)) { - StringBuffer sb = new StringBuffer("interruptwrite, ep 0x" - + Integer.toHexString(out_ep_address) + ": " + lenWritten - + " Bytes sent: "); - for (int i = 0; i < lenWritten; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } - return lenWritten; - } - - /** - * Read data from the device using a interrupt transfer.
- * - * @param in_ep_address - * endpoint address to read from - * @param data - * data buffer for the data to be read - * @param size - * the maximum requested data size - * @param timeout - * amount of time in ms the device will try to receive data until - * a timeout exception is thrown - * @param reopenOnTimeout - * if set to true, the device will try to open the connection and - * receive the data again before a timeout exception is thrown - * @return the actual number of bytes read - * @throws USBException - */ - public int readInterrupt(int in_ep_address, byte[] data, int size, - int timeout, boolean reopenOnTimeout) throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - if (data == null) { - throw new USBException("data must not be null"); - } - if (size <= 0 || size > data.length) { - throw new ArrayIndexOutOfBoundsException("invalid size: " + size); - } - int lenRead = LibusbJava.usb_interrupt_read(usbDevHandle, - in_ep_address, data, size, timeout); - if (lenRead < 0) { - if (lenRead == LibusbJava.ERROR_TIMEDOUT) { - // try to reopen the device and send the data again - if (reopenOnTimeout) { - logger.info("try to reopen"); - reset(); - open(dev_configuration, dev_interface, dev_altinterface); - return readInterrupt(in_ep_address, data, size, timeout, - false); - } - throw new USBTimeoutException("LibusbJava.usb_interrupt_read: " - + LibusbJava.usb_strerror()); - } - throw new USBException("LibusbJava.usb_interrupt_read: " - + LibusbJava.usb_strerror()); - } - - logger.info("length read: " + lenRead); - if (logger.isLoggable(Level.FINEST)) { - StringBuffer sb = new StringBuffer("interrupt, ep 0x" - + Integer.toHexString(in_ep_address) + ": " + lenRead - + " Bytes received: "); - for (int i = 0; i < lenRead; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } - return lenRead; - } - - /** - * Performs a control request to the default control pipe on a device.
- * The parameters mirror the types of the same name in the USB - * specification. - * - * @param requestType - * USB device request type (USB specification 9.3, - * bmRequestType). Use constants from {@link ch.ntb.usb.USB} - * (REQ_TYPE_xxx). - * @param request - * specific request (USB specification 9.4, bRequest). Use - * constants from {@link ch.ntb.usb.USB} (REQ_xxx). - * @param value - * field that varies according to request (USB specification 9.4, - * wValue) - * @param index - * field that varies according to request (USB specification 9.4, - * wIndex) - * @param data - * the send/receive buffer - * @param size - * the buffer size. 0 is a valid value, but there must still be a - * dummy data buffer provided. - * @param timeout - * amount of time in ms the device will try to send/receive data - * until a timeout exception is thrown - * @param reopenOnTimeout - * if set to true, the device will try to open the connection and - * send/receive the data again before a timeout exception is - * thrown - * @return the number of bytes written/read - * @throws USBException - */ - public int controlMsg(int requestType, int request, int value, int index, - byte[] data, int size, int timeout, boolean reopenOnTimeout) - throws USBException { - if (usbDevHandle == 0) { - throw new USBException("invalid device handle"); - } - if (data == null) { - throw new USBException("data must not be null"); - } - if (size < 0 || size > data.length) { - throw new ArrayIndexOutOfBoundsException("invalid size: " + size); - } - int len = LibusbJava.usb_control_msg(usbDevHandle, requestType, - request, value, index, data, size, timeout); - if (len < 0) { - if (len == LibusbJava.ERROR_TIMEDOUT) { - // try to reopen the device and send the data again - if (reopenOnTimeout) { - logger.info("try to reopen"); - reset(); - open(dev_configuration, dev_interface, dev_altinterface); - return controlMsg(requestType, request, value, index, data, - size, timeout, false); - } - throw new USBTimeoutException("LibusbJava.controlMsg: " - + LibusbJava.usb_strerror()); - } - throw new USBException("LibusbJava.controlMsg: " - + LibusbJava.usb_strerror()); - } - - logger.info("length read/written: " + len); - if (logger.isLoggable(Level.FINEST)) { - StringBuffer sb = new StringBuffer("controlMsg: " + len - + " Bytes received(written: "); - for (int i = 0; i < len; i++) { - sb.append("0x" + String.format("%1$02X", data[i]) + " "); - } - logger.info(sb.toString()); - } - return len; - } - - /** - * Claim an interface to send and receive USB data.
- * - * @param usb_dev_handle - * the handle of the device (MUST BE VALID) - * @param configuration - * the configuration to use - * @param interface_ - * the interface to claim - * @param altinterface - * the alternate interface to use. If no alternate interface must - * be set -1 can be used. - * @throws USBException - * throws an USBException if the action fails - */ - private void claim_interface(long usb_dev_handle, int configuration, - int interface_, int altinterface) throws USBException { - if (LibusbJava.usb_set_configuration(usb_dev_handle, configuration) < 0) { - usbDevHandle = 0; - throw new USBException("LibusbJava.usb_set_configuration: " - + LibusbJava.usb_strerror()); - } - if (LibusbJava.usb_claim_interface(usb_dev_handle, interface_) < 0) { - usbDevHandle = 0; - throw new USBException("LibusbJava.usb_claim_interface: " - + LibusbJava.usb_strerror()); - } - if (altinterface >= 0) { - if (LibusbJava.usb_set_altinterface(usb_dev_handle, altinterface) < 0) { - try { - release_interface(usb_dev_handle, interface_); - } catch (USBException e) { - // ignore - } - usbDevHandle = 0; - throw new USBException("LibusbJava.usb_set_altinterface: " - + LibusbJava.usb_strerror()); - } - } - logger.info("interface claimed"); - } - - /** - * Release a previously claimed interface.
- * - * @param dev_handle - * the handle of the device (MUST BE VALID) - * @param interface_ - * the interface to claim - * @throws USBException - * throws an USBException if the action fails - */ - private void release_interface(long dev_handle, int interface_) - throws USBException { - if (LibusbJava.usb_release_interface(dev_handle, interface_) < 0) { - usbDevHandle = 0; - throw new USBException("LibusbJava.usb_release_interface: " - + LibusbJava.usb_strerror()); - } - logger.info("interface released"); - } - - /** - * Returns the product ID of the device.
- * - * @return the product ID of the device. - */ - public int getIdProduct() { - return idProduct; - } - - /** - * Returns the vendor ID of the device.
- * - * @return the vendor ID of the device. - */ - public int getIdVendor() { - return idVendor; - } - - /** - * Returns the alternative interface.
- * This value is only valid after opening the device. - * - * @return the alternative interface. This value is only valid after opening - * the device. - */ - public int getAltinterface() { - return dev_altinterface; - } - - /** - * Returns the current configuration used.
- * This value is only valid after opening the device. - * - * @return the current configuration used. This value is only valid after - * opening the device. - */ - public int getConfiguration() { - return dev_configuration; - } - - /** - * Returns the current interface.
- * This value is only valid after opening the device. - * - * @return the current interface. This value is only valid after opening the - * device. - */ - public int getInterface() { - return dev_interface; - } - - /** - * Returns the maximum packet size in bytes which is allowed to be - * transmitted at once.
- * The value is determined by reading the endpoint descriptor(s) when - * opening the device. It is invalid before the device is opened! Note that - * if some endpoints use different packet sizes the maximum packet size is - * return. This value may be used to determine if a device is opened in - * fullspeed or highspeed mode. - * - * @return the maximum packet size - */ - public int getMaxPacketSize() { - return maxPacketSize; - } - - /** - * Check if the device is open.
- * This checks only for a valid device handle. It doesn't check if the - * device is still attached or working. - * - * @return true if the device is open - */ - public boolean isOpen() { - return usbDevHandle != 0; - } - - /** - * If enabled, the device is reset when first opened.
- * This will only happen once. When the application is started, the device - * state is unknown. If the device is not reset, read or write may result in - * a {@link USBTimeoutException}.
- *
- * This feature is disabled by default. - * - * @param enable - * true if the device should be reset when first opened - * @param timeout - * the timeout between the reset and the reopening - */ - public void setResetOnFirstOpen(boolean enable, int timeout) { - resetOnFirstOpen = enable; - resetTimeout = timeout; - } - - /** - * Returns the optional filename which is set when there are multiple - * devices with the same vendor and product id. See - * {@link USB#getDevice(short, short, String, String)}. Use - * {@link Usb_Device#getFilename()} to read the filename of a device. - * - * @return the filename or null - */ - protected String getFilename() { - return filename; - } - - /** - * Returns the optional bus name which is set when there are multiple - * devices with the same vendor and product id. See - * {@link USB#getDevice(short, short, String, String)}. Use - * {@link Usb_Bus#getDirname()} to read the name of a bus. - * - * @return the bus name or null - */ - protected String getBusName() { - return busName; - } - - /** - * Returns the Usb_Device instance associated with this device. This value - * is only valid after opening the device. - * - * @return the Usb_Device instance associated with this device. - */ - public Usb_Device getDevice() { - return dev; - } - - @Override - public String toString() { - return "idVendor: 0x" + Integer.toHexString(getIdVendor() & 0xffff) - + ", idProduct: 0x" - + Integer.toHexString(getIdProduct() & 0xffff) + ", busName: " - + getBusName() + ", filename: " + getFilename(); - } - -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import ch.ntb.usb.logger.LogUtil; + +/** + * This class represents an USB device.
+ * To get an instance of an USB device use USB.getDevice(...). + * + */ +public class Device { + + private static final Logger logger = LogUtil.getLogger("ch.ntb.usb"); + + private int maxPacketSize; + + /** + * Mandatory identification values for the device. + */ + private int idVendor, idProduct; + + /** + * Optional identification value for the device (e.g. if there are multiple + * devices with the same vendor and product id). + */ + private String filename; + + /** + * Optional identification value for the device (e.g. if there are multiple + * devices with the same vendor and product id). + */ + private String busName; + + private int dev_configuration, dev_interface, dev_altinterface; + + private long usbDevHandle; + + private boolean resetOnFirstOpen, resetDone; + + private int resetTimeout = 2000; + + private Usb_Device dev; + + protected Device(short idVendor, short idProduct) { + resetOnFirstOpen = false; + resetDone = false; + maxPacketSize = -1; + this.idVendor = idVendor; + this.idProduct = idProduct; + this.filename = null; + } + + protected Device(short idVendor, short idProduct, String busName, + String filename) { + resetOnFirstOpen = false; + resetDone = false; + maxPacketSize = -1; + this.idVendor = idVendor; + this.idProduct = idProduct; + this.busName = busName; + this.filename = filename; + } + + private void updateMaxPacketSize(Usb_Device device) throws USBException { + maxPacketSize = -1; + Usb_Config_Descriptor[] confDesc = device.getConfig(); + for (int i = 0; i < confDesc.length; i++) { + Usb_Interface[] int_ = confDesc[i].getInterface(); + for (int j = 0; j < int_.length; j++) { + Usb_Interface_Descriptor[] intDesc = int_[j].getAltsetting(); + for (int k = 0; k < intDesc.length; k++) { + Usb_Endpoint_Descriptor[] epDesc = intDesc[k].getEndpoint(); + for (int l = 0; l < epDesc.length; l++) { + maxPacketSize = Math.max(epDesc[l].getWMaxPacketSize(), + maxPacketSize); + } + } + } + } + if (maxPacketSize <= 0) { + throw new USBException( + "No USB endpoints found. Check the device configuration"); + } + } + + /** + * Initializes the device. The parameters idVendor and + * idProduct are mandatory. The parameter filename + * is optional. + */ + private Usb_Device initDevice(int idVendorParam, int idProductParam, + String busName, String filename) throws USBException { + Usb_Bus bus = USB.getBus(); + + Usb_Device device = null; + // search for device + while (bus != null) { + device = bus.getDevices(); + while (device != null) { + Usb_Device_Descriptor devDesc = device.getDescriptor(); + if (busName != null && filename != null) { + if (busName.compareTo(bus.getDirname()) == 0 + && filename.compareTo(device.getFilename()) == 0 + && devDesc.getIdVendor() == idVendor + && devDesc.getIdProduct() == idProduct) { + logger.info("Device found. bus: " + bus.getDirname() + + ", filename: " + device.getFilename()); + updateMaxPacketSize(device); + return device; + } + } else if (filename != null) { + if (filename.compareTo(device.getFilename()) == 0 + && devDesc.getIdVendor() == idVendor + && devDesc.getIdProduct() == idProduct) { + logger.info("Device found. bus: " + bus.getDirname() + + ", filename: " + device.getFilename()); + updateMaxPacketSize(device); + return device; + } + } else if (busName != null) { + if (busName.compareTo(bus.getDirname()) == 0 + && devDesc.getIdVendor() == idVendor + && devDesc.getIdProduct() == idProduct) { + logger.info("Device found. bus: " + bus.getDirname() + + ", filename: " + device.getFilename()); + updateMaxPacketSize(device); + return device; + } + } else if (devDesc.getIdVendor() == idVendor + && devDesc.getIdProduct() == idProduct) { + logger.info("Device found. bus: " + bus.getDirname() + + ", filename: " + device.getFilename()); + updateMaxPacketSize(device); + return device; + } + device = device.getNext(); + } + bus = bus.getNext(); + } + return null; + } + + /** + * Updates the device and descriptor information from the bus.
+ * The descriptors can be read with {@link #getDeviceDescriptor()} and + * {@link #getConfigDescriptors()}. + * + * @throws USBException + */ + public void updateDescriptors() throws USBException { + dev = initDevice(idVendor, idProduct, busName, filename); + } + + /** + * Returns the device descriptor associated with this device.
+ * The descriptor is updated by calling {@link #updateDescriptors()} or + * {@link #open(int, int, int)}. + * + * @return the device descriptor associated with this device or + * null + */ + public Usb_Device_Descriptor getDeviceDescriptor() { + if (dev == null) { + return null; + } + return dev.getDescriptor(); + } + + /** + * Returns the configuration descriptors associated with this device.
+ * The descriptors are updated by calling {@link #updateDescriptors()} or + * {@link #open(int, int, int)}. + * + * @return the configuration descriptors associated with this device or + * null + */ + public Usb_Config_Descriptor[] getConfigDescriptors() { + if (dev == null) { + return null; + } + return dev.getConfig(); + } + + /** + * Opens the device and claims the specified configuration, interface and + * altinterface.
+ * First the bus is enumerated. If the device is found its descriptors are + * read and the maxPacketSize value is updated. If no endpoints + * are found in the descriptors an exception is thrown. + * + * @param configuration + * the configuration, see + * {@link Usb_Config_Descriptor#getBConfigurationValue()} + * @param interface_ + * the interface, see + * {@link Usb_Interface_Descriptor#getBInterfaceNumber()} + * @param altinterface + * the alternate interface, see + * {@link Usb_Interface_Descriptor#getBAlternateSetting()}. If no + * alternate interface must be set -1 can be used. + * @throws USBException + */ + public void open(int configuration, int interface_, int altinterface) + throws USBException { + this.dev_configuration = configuration; + this.dev_interface = interface_; + this.dev_altinterface = altinterface; + + if (usbDevHandle != 0) { + throw new USBException("device opened, close or reset first"); + } + + dev = initDevice(idVendor, idProduct, busName, filename); + + if (dev != null) { + long res = LibusbJava.usb_open(dev); + if (res == 0) { + throw new USBException("LibusbJava.usb_open: " + + LibusbJava.usb_strerror()); + } + usbDevHandle = res; + } + + if (dev == null || usbDevHandle == 0) { + throw new USBException("USB device with " + toString() + + " not found on USB"); + } + claim_interface(usbDevHandle, configuration, interface_, altinterface); + if (resetOnFirstOpen & !resetDone) { + logger.info("reset on first open"); + resetDone = true; + reset(); + try { + Thread.sleep(resetTimeout); + } catch (InterruptedException e) { + // + } + open(configuration, interface_, altinterface); + } + } + + /** + * Release the claimed interface and close the opened device.
+ * + * @throws USBException + */ + public void close() throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + release_interface(usbDevHandle, dev_interface); + if (LibusbJava.usb_close(usbDevHandle) < 0) { + usbDevHandle = 0; + throw new USBException("LibusbJava.usb_close: " + + LibusbJava.usb_strerror()); + } + usbDevHandle = 0; + maxPacketSize = -1; + logger.info("device closed"); + } + + /** + * Sends an USB reset to the device. The device handle will no longer be + * valid. To use the device again, {@link #open(int, int, int)} must be + * called.
+ * Note that the device is re-attached to the USB which may cause the bus + * and filename to be changed. If the bus and filename parameters are used + * in {@link USB#getDevice(short, short, String, String)} unregister the + * device using {@link USB#unregisterDevice(Device)}, re-enumerate the bus + * and create a new device instance. If that is not done the device may not + * be found. + * + * @throws USBException + */ + public void reset() throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + release_interface(usbDevHandle, dev_interface); + if (LibusbJava.usb_reset(usbDevHandle) < 0) { + usbDevHandle = 0; + throw new USBException("LibusbJava.usb_reset: " + + LibusbJava.usb_strerror()); + } + usbDevHandle = 0; + logger.info("device reset"); + } + + /** + * Write data to the device using a bulk transfer.
+ * + * @param out_ep_address + * endpoint address to write to + * @param data + * data to write to this endpoint + * @param size + * size of the data + * @param timeout + * amount of time in ms the device will try to send the data + * until a timeout exception is thrown + * @param reopenOnTimeout + * if set to true, the device will try to open the connection and + * send the data again before a timeout exception is thrown + * @return the actual number of bytes written + * @throws USBException + */ + public int writeBulk(int out_ep_address, byte[] data, int size, + int timeout, boolean reopenOnTimeout) throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + if (data == null) { + throw new USBException("data must not be null"); + } + if (size <= 0 || size > data.length) { + throw new ArrayIndexOutOfBoundsException("invalid size: " + size); + } + int lenWritten = LibusbJava.usb_bulk_write(usbDevHandle, + out_ep_address, data, size, timeout); + if (lenWritten < 0) { + if (lenWritten == LibusbJava.ERROR_TIMEDOUT) { + // try to reopen the device and send the data again + if (reopenOnTimeout) { + logger.info("try to reopen"); + reset(); + open(dev_configuration, dev_interface, dev_altinterface); + return writeBulk(out_ep_address, data, size, timeout, false); + } + throw new USBTimeoutException("LibusbJava.usb_bulk_write: " + + LibusbJava.usb_strerror()); + } + throw new USBException("LibusbJava.usb_bulk_write: " + + LibusbJava.usb_strerror()); + } + + logger.info("length written: " + lenWritten); + if (logger.isLoggable(Level.FINEST)) { + StringBuffer sb = new StringBuffer("bulkwrite, ep 0x" + + Integer.toHexString(out_ep_address) + ": " + lenWritten + + " Bytes sent: "); + for (int i = 0; i < lenWritten; i++) { + sb.append("0x" + String.format("%1$02X", data[i]) + " "); + } + logger.info(sb.toString()); + } + return lenWritten; + } + + /** + * Read data from the device using a bulk transfer.
+ * + * @param in_ep_address + * endpoint address to read from + * @param data + * data buffer for the data to be read + * @param size + * the maximum requested data size + * @param timeout + * amount of time in ms the device will try to receive data until + * a timeout exception is thrown + * @param reopenOnTimeout + * if set to true, the device will try to open the connection and + * receive the data again before a timeout exception is thrown + * @return the actual number of bytes read + * @throws USBException + */ + public int readBulk(int in_ep_address, byte[] data, int size, int timeout, + boolean reopenOnTimeout) throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + if (data == null) { + throw new USBException("data must not be null"); + } + if (size <= 0 || size > data.length) { + throw new ArrayIndexOutOfBoundsException("invalid size: " + size); + } + int lenRead = LibusbJava.usb_bulk_read(usbDevHandle, in_ep_address, + data, size, timeout); + if (lenRead < 0) { + if (lenRead == LibusbJava.ERROR_TIMEDOUT) { + // try to reopen the device and send the data again + if (reopenOnTimeout) { + logger.info("try to reopen"); + reset(); + open(dev_configuration, dev_interface, dev_altinterface); + return readBulk(in_ep_address, data, size, timeout, false); + } + throw new USBTimeoutException("LibusbJava.usb_bulk_read: " + + LibusbJava.usb_strerror()); + } + throw new USBException("LibusbJava.usb_bulk_read: " + + LibusbJava.usb_strerror()); + } + + logger.info("length read: " + lenRead); + if (logger.isLoggable(Level.FINEST)) { + StringBuffer sb = new StringBuffer("bulkread, ep 0x" + + Integer.toHexString(in_ep_address) + ": " + lenRead + + " Bytes received: "); + for (int i = 0; i < lenRead; i++) { + sb.append("0x" + String.format("%1$02X", data[i]) + " "); + } + logger.info(sb.toString()); + } + return lenRead; + } + + /** + * Write data to the device using a interrupt transfer.
+ * + * @param out_ep_address + * endpoint address to write to + * @param data + * data to write to this endpoint + * @param size + * size of the data + * @param timeout + * amount of time in ms the device will try to send the data + * until a timeout exception is thrown + * @param reopenOnTimeout + * if set to true, the device will try to open the connection and + * send the data again before a timeout exception is thrown + * @return the actual number of bytes written + * @throws USBException + */ + public int writeInterrupt(int out_ep_address, byte[] data, int size, + int timeout, boolean reopenOnTimeout) throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + if (data == null) { + throw new USBException("data must not be null"); + } + if (size <= 0 || size > data.length) { + throw new ArrayIndexOutOfBoundsException("invalid size: " + size); + } + int lenWritten = LibusbJava.usb_interrupt_write(usbDevHandle, + out_ep_address, data, size, timeout); + if (lenWritten < 0) { + if (lenWritten == LibusbJava.ERROR_TIMEDOUT) { + // try to reopen the device and send the data again + if (reopenOnTimeout) { + logger.info("try to reopen"); + reset(); + open(dev_configuration, dev_interface, dev_altinterface); + return writeInterrupt(out_ep_address, data, size, timeout, + false); + } + throw new USBTimeoutException( + "LibusbJava.usb_interrupt_write: " + + LibusbJava.usb_strerror()); + } + throw new USBException("LibusbJava.usb_interrupt_write: " + + LibusbJava.usb_strerror()); + } + + logger.info("length written: " + lenWritten); + if (logger.isLoggable(Level.FINEST)) { + StringBuffer sb = new StringBuffer("interruptwrite, ep 0x" + + Integer.toHexString(out_ep_address) + ": " + lenWritten + + " Bytes sent: "); + for (int i = 0; i < lenWritten; i++) { + sb.append("0x" + String.format("%1$02X", data[i]) + " "); + } + logger.info(sb.toString()); + } + return lenWritten; + } + + /** + * Read data from the device using a interrupt transfer.
+ * + * @param in_ep_address + * endpoint address to read from + * @param data + * data buffer for the data to be read + * @param size + * the maximum requested data size + * @param timeout + * amount of time in ms the device will try to receive data until + * a timeout exception is thrown + * @param reopenOnTimeout + * if set to true, the device will try to open the connection and + * receive the data again before a timeout exception is thrown + * @return the actual number of bytes read + * @throws USBException + */ + public int readInterrupt(int in_ep_address, byte[] data, int size, + int timeout, boolean reopenOnTimeout) throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + if (data == null) { + throw new USBException("data must not be null"); + } + if (size <= 0 || size > data.length) { + throw new ArrayIndexOutOfBoundsException("invalid size: " + size); + } + int lenRead = LibusbJava.usb_interrupt_read(usbDevHandle, + in_ep_address, data, size, timeout); + if (lenRead < 0) { + if (lenRead == LibusbJava.ERROR_TIMEDOUT) { + // try to reopen the device and send the data again + if (reopenOnTimeout) { + logger.info("try to reopen"); + reset(); + open(dev_configuration, dev_interface, dev_altinterface); + return readInterrupt(in_ep_address, data, size, timeout, + false); + } + throw new USBTimeoutException("LibusbJava.usb_interrupt_read: " + + LibusbJava.usb_strerror()); + } + throw new USBException("LibusbJava.usb_interrupt_read: " + + LibusbJava.usb_strerror()); + } + + logger.info("length read: " + lenRead); + if (logger.isLoggable(Level.FINEST)) { + StringBuffer sb = new StringBuffer("interrupt, ep 0x" + + Integer.toHexString(in_ep_address) + ": " + lenRead + + " Bytes received: "); + for (int i = 0; i < lenRead; i++) { + sb.append("0x" + String.format("%1$02X", data[i]) + " "); + } + logger.info(sb.toString()); + } + return lenRead; + } + + /** + * Performs a control request to the default control pipe on a device.
+ * The parameters mirror the types of the same name in the USB + * specification. + * + * @param requestType + * USB device request type (USB specification 9.3, + * bmRequestType). Use constants from {@link ch.ntb.usb.USB} + * (REQ_TYPE_xxx). + * @param request + * specific request (USB specification 9.4, bRequest). Use + * constants from {@link ch.ntb.usb.USB} (REQ_xxx). + * @param value + * field that varies according to request (USB specification 9.4, + * wValue) + * @param index + * field that varies according to request (USB specification 9.4, + * wIndex) + * @param data + * the send/receive buffer + * @param size + * the buffer size. 0 is a valid value, but there must still be a + * dummy data buffer provided. + * @param timeout + * amount of time in ms the device will try to send/receive data + * until a timeout exception is thrown + * @param reopenOnTimeout + * if set to true, the device will try to open the connection and + * send/receive the data again before a timeout exception is + * thrown + * @return the number of bytes written/read + * @throws USBException + */ + public int controlMsg(int requestType, int request, int value, int index, + byte[] data, int size, int timeout, boolean reopenOnTimeout) + throws USBException { + if (usbDevHandle == 0) { + throw new USBException("invalid device handle"); + } + if (data == null) { + throw new USBException("data must not be null"); + } + if (size < 0 || size > data.length) { + throw new ArrayIndexOutOfBoundsException("invalid size: " + size); + } + int len = LibusbJava.usb_control_msg(usbDevHandle, requestType, + request, value, index, data, size, timeout); + if (len < 0) { + if (len == LibusbJava.ERROR_TIMEDOUT) { + // try to reopen the device and send the data again + if (reopenOnTimeout) { + logger.info("try to reopen"); + reset(); + open(dev_configuration, dev_interface, dev_altinterface); + return controlMsg(requestType, request, value, index, data, + size, timeout, false); + } + throw new USBTimeoutException("LibusbJava.controlMsg: " + + LibusbJava.usb_strerror()); + } + throw new USBException("LibusbJava.controlMsg: " + + LibusbJava.usb_strerror()); + } + + logger.info("length read/written: " + len); + if (logger.isLoggable(Level.FINEST)) { + StringBuffer sb = new StringBuffer("controlMsg: " + len + + " Bytes received(written: "); + for (int i = 0; i < len; i++) { + sb.append("0x" + String.format("%1$02X", data[i]) + " "); + } + logger.info(sb.toString()); + } + return len; + } + + /** + * Claim an interface to send and receive USB data.
+ * + * @param usb_dev_handle + * the handle of the device (MUST BE VALID) + * @param configuration + * the configuration to use + * @param interface_ + * the interface to claim + * @param altinterface + * the alternate interface to use. If no alternate interface must + * be set -1 can be used. + * @throws USBException + * throws an USBException if the action fails + */ + private void claim_interface(long usb_dev_handle, int configuration, + int interface_, int altinterface) throws USBException { + if (LibusbJava.usb_set_configuration(usb_dev_handle, configuration) < 0) { + usbDevHandle = 0; + throw new USBException("LibusbJava.usb_set_configuration: " + + LibusbJava.usb_strerror()); + } + if (LibusbJava.usb_claim_interface(usb_dev_handle, interface_) < 0) { + usbDevHandle = 0; + throw new USBException("LibusbJava.usb_claim_interface: " + + LibusbJava.usb_strerror()); + } + if (altinterface >= 0) { + if (LibusbJava.usb_set_altinterface(usb_dev_handle, altinterface) < 0) { + try { + release_interface(usb_dev_handle, interface_); + } catch (USBException e) { + // ignore + } + usbDevHandle = 0; + throw new USBException("LibusbJava.usb_set_altinterface: " + + LibusbJava.usb_strerror()); + } + } + logger.info("interface claimed"); + } + + /** + * Release a previously claimed interface.
+ * + * @param dev_handle + * the handle of the device (MUST BE VALID) + * @param interface_ + * the interface to claim + * @throws USBException + * throws an USBException if the action fails + */ + private void release_interface(long dev_handle, int interface_) + throws USBException { + if (LibusbJava.usb_release_interface(dev_handle, interface_) < 0) { + usbDevHandle = 0; + throw new USBException("LibusbJava.usb_release_interface: " + + LibusbJava.usb_strerror()); + } + logger.info("interface released"); + } + + /** + * Returns the product ID of the device.
+ * + * @return the product ID of the device. + */ + public int getIdProduct() { + return idProduct; + } + + /** + * Returns the vendor ID of the device.
+ * + * @return the vendor ID of the device. + */ + public int getIdVendor() { + return idVendor; + } + + /** + * Returns the alternative interface.
+ * This value is only valid after opening the device. + * + * @return the alternative interface. This value is only valid after opening + * the device. + */ + public int getAltinterface() { + return dev_altinterface; + } + + /** + * Returns the current configuration used.
+ * This value is only valid after opening the device. + * + * @return the current configuration used. This value is only valid after + * opening the device. + */ + public int getConfiguration() { + return dev_configuration; + } + + /** + * Returns the current interface.
+ * This value is only valid after opening the device. + * + * @return the current interface. This value is only valid after opening the + * device. + */ + public int getInterface() { + return dev_interface; + } + + /** + * Returns the maximum packet size in bytes which is allowed to be + * transmitted at once.
+ * The value is determined by reading the endpoint descriptor(s) when + * opening the device. It is invalid before the device is opened! Note that + * if some endpoints use different packet sizes the maximum packet size is + * return. This value may be used to determine if a device is opened in + * fullspeed or highspeed mode. + * + * @return the maximum packet size + */ + public int getMaxPacketSize() { + return maxPacketSize; + } + + /** + * Check if the device is open.
+ * This checks only for a valid device handle. It doesn't check if the + * device is still attached or working. + * + * @return true if the device is open + */ + public boolean isOpen() { + return usbDevHandle != 0; + } + + /** + * If enabled, the device is reset when first opened.
+ * This will only happen once. When the application is started, the device + * state is unknown. If the device is not reset, read or write may result in + * a {@link USBTimeoutException}.
+ *
+ * This feature is disabled by default. + * + * @param enable + * true if the device should be reset when first opened + * @param timeout + * the timeout between the reset and the reopening + */ + public void setResetOnFirstOpen(boolean enable, int timeout) { + resetOnFirstOpen = enable; + resetTimeout = timeout; + } + + /** + * Returns the optional filename which is set when there are multiple + * devices with the same vendor and product id. See + * {@link USB#getDevice(short, short, String, String)}. Use + * {@link Usb_Device#getFilename()} to read the filename of a device. + * + * @return the filename or null + */ + protected String getFilename() { + return filename; + } + + /** + * Returns the optional bus name which is set when there are multiple + * devices with the same vendor and product id. See + * {@link USB#getDevice(short, short, String, String)}. Use + * {@link Usb_Bus#getDirname()} to read the name of a bus. + * + * @return the bus name or null + */ + protected String getBusName() { + return busName; + } + + /** + * Returns the Usb_Device instance associated with this device. This value + * is only valid after opening the device. + * + * @return the Usb_Device instance associated with this device. + */ + public Usb_Device getDevice() { + return dev; + } + + @Override + public String toString() { + return "idVendor: 0x" + Integer.toHexString(getIdVendor() & 0xffff) + + ", idProduct: 0x" + + Integer.toHexString(getIdProduct() & 0xffff) + ", busName: " + + getBusName() + ", filename: " + getFilename(); + } + +} diff --git a/java/src/ch/ntb/usb/LibusbJava.java b/src/main/java/ch/ntb/usb.r273/LibusbJava.java similarity index 96% rename from java/src/ch/ntb/usb/LibusbJava.java rename to src/main/java/ch/ntb/usb.r273/LibusbJava.java index ad0e30f..c976af2 100644 --- a/java/src/ch/ntb/usb/LibusbJava.java +++ b/src/main/java/ch/ntb/usb.r273/LibusbJava.java @@ -1,378 +1,378 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * This class represents the Java Native Interface to the shared library which - * is (with some exceptions) a one-to-one representation of the libusb API.
- *
- *

Project Description

- * Java libusb is a Java wrapper for the libusb and libusb-win32 USB library. - * - *
libusb aim is to create a - * library for use by user level applications to access USB devices regardless - * of OS.
- * Libusb-win32 is a port of - * the USB library libusb to the - * Windows operating systems. The library allows user space applications to - * access any USB device on Windows in a generic way without writing any line of - * kernel driver code.
- *
- * The API description of this class has been copied from the libusb documentation - * and adapted where neccessary.
- * - */ -public class LibusbJava { - - /** - * System error codes.
- * This list is not complete! For more error codes see the file 'errorno.h' - * on your system. - */ - public static int ERROR_SUCCESS, ERROR_BAD_FILE_DESCRIPTOR, - ERROR_NO_SUCH_DEVICE_OR_ADDRESS, ERROR_BUSY, - ERROR_INVALID_PARAMETER, ERROR_TIMEDOUT, ERROR_IO_ERROR, - ERROR_NOT_ENOUGH_MEMORY;; - - /** - * Sets the debugging level of libusb.
- * - * The range is from 0 to 255, where 0 disables debug output and 255 enables - * all output. On application start, debugging is disabled (0). - * - * @param level - * 0 to 255 - */ - public static native void usb_set_debug(int level); - - // Core - /** - * Just like the name implies, usb_init sets up some internal - * structures. usb_init must be called before any other - * libusb functions. - */ - public static native void usb_init(); - - /** - * usb_find_busses will find all of the busses on the system. - * - * @return the number of changes since previous call to this function (total - * of new busses and busses removed). - */ - public static native int usb_find_busses(); - - /** - * usb_find_devices will find all of the devices on each bus. - * This should be called after usb_find_busses. - * - * @return the number of changes since the previous call to this function - * (total of new device and devices removed). - */ - public static native int usb_find_devices(); - - /** - * usb_get_busses returns a tree of descriptor objects.
- * The tree represents the bus structure with devices, configurations, - * interfaces and endpoints. Note that this is only a copy. To refresh the - * information, usb_get_busses() must be called again.
- * The name of the objects contained in the tree is starting with - * Usb_. - * - * @return the structure of all busses and devices. Note: The - * java objects are copies of the C structs. - */ - public static native Usb_Bus usb_get_busses(); - - // Device Operations - /** - * usb_open is to be used to open up a device for use. - * usb_open must be called before attempting to perform any - * operations to the device. - * - * @param dev - * The device to open. - * @return a handle used in future communication with the device. 0 if an - * error has occurred. - */ - public static native long usb_open(Usb_Device dev); - - /** - * usb_close closes a device opened with - * usb_open. - * - * @param dev_handle - * The handle to the device. - * @return 0 on success or < 0 on error. - */ - public static native int usb_close(long dev_handle); - - /** - * Sets the active configuration of a device - * - * @param dev_handle - * The handle to the device. - * @param configuration - * The value as specified in the descriptor field - * bConfigurationValue. - * @return 0 on success or < 0 on error. - */ - public static native int usb_set_configuration(long dev_handle, - int configuration); - - /** - * Sets the active alternate setting of the current interface - * - * @param dev_handle - * The handle to the device. - * @param alternate - * The value as specified in the descriptor field - * bAlternateSetting. - * @return 0 on success or < 0 on error. - */ - public static native int usb_set_altinterface(long dev_handle, int alternate); - - /** - * Clears any halt status on an endpoint. - * - * @param dev_handle - * The handle to the device. - * @param ep - * The value specified in the descriptor field bEndpointAddress. - * @return 0 on success or < 0 on error. - */ - public static native int usb_clear_halt(long dev_handle, int ep); - - /** - * Resets a device by sending a RESET down the port it is connected to.
- *
- * Causes re-enumeration: After calling usb_reset, - * the device will need to re-enumerate and thusly, requires you to find the - * new device and open a new handle. The handle used to call - * usb_reset will no longer work. - * - * @param dev_handle - * The handle to the device. - * @return 0 on success or < 0 on error. - */ - public static native int usb_reset(long dev_handle); - - /** - * Claim an interface of a device.
- *
- * Must be called!: usb_claim_interface must be - * called before you perform any operations related to this interface (like - * usb_set_altinterface, usb_bulk_write, etc). - * - * @param dev_handle - * The handle to the device. - * @param interface_ - * The value as specified in the descriptor field - * bInterfaceNumber. - * @return 0 on success or < 0 on error. - */ - public static native int usb_claim_interface(long dev_handle, int interface_); - - /** - * Releases a previously claimed interface - * - * @param dev_handle - * The handle to the device. - * @param interface_ - * The value as specified in the descriptor field - * bInterfaceNumber. - * @return 0 on success or < 0 on error. - */ - public static native int usb_release_interface(long dev_handle, - int interface_); - - // Control Transfers - /** - * Performs a control request to the default control pipe on a device. The - * parameters mirror the types of the same name in the USB specification. - * - * @param dev_handle - * The handle to the device. - * @param requesttype - * @param request - * @param value - * @param index - * @param bytes - * @param size - * @param timeout - * @return the number of bytes written/read or < 0 on error. - */ - public static native int usb_control_msg(long dev_handle, int requesttype, - int request, int value, int index, byte[] bytes, int size, - int timeout); - - /** - * Retrieves the string descriptor specified by index and langid from a - * device. - * - * @param dev_handle - * The handle to the device. - * @param index - * @param langid - * @return the descriptor String or null - */ - public static native String usb_get_string(long dev_handle, int index, - int langid); - - /** - * usb_get_string_simple is a wrapper around - * usb_get_string that retrieves the string description - * specified by index in the first language for the descriptor. - * - * @param dev_handle - * The handle to the device. - * @param index - * @return the descriptor String or null - */ - public static native String usb_get_string_simple(long dev_handle, int index); - - /** - * Retrieves a descriptor from the device identified by the type and index - * of the descriptor from the default control pipe.
- *
- * See {@link #usb_get_descriptor_by_endpoint(long, int, byte, byte, int)} - * for a function that allows the control endpoint to be specified. - * - * @param dev_handle - * The handle to the device. - * @param type - * @param index - * @param size - * number of charactes which will be retrieved (the length of the - * resulting String) - * @return the descriptor String or null - */ - public static native String usb_get_descriptor(long dev_handle, byte type, - byte index, int size); - - /** - * Retrieves a descriptor from the device identified by the type and index - * of the descriptor from the control pipe identified by ep. - * - * @param dev_handle - * The handle to the device. - * @param ep - * @param type - * @param index - * @param size - * number of charactes which will be retrieved (the length of the - * resulting String) - * @return the descriptor String or null - */ - public static native String usb_get_descriptor_by_endpoint(long dev_handle, - int ep, byte type, byte index, int size); - - // Bulk Transfers - /** - * Performs a bulk write request to the endpoint specified by ep. - * - * @param dev_handle - * The handle to the device. - * @param ep - * @param bytes - * @param size - * @param timeout - * @return the number of bytes written on success or < 0 on error. - */ - public static native int usb_bulk_write(long dev_handle, int ep, - byte[] bytes, int size, int timeout); - - /** - * Performs a bulk read request to the endpoint specified by ep. - * - * @param dev_handle - * The handle to the device. - * @param ep - * @param bytes - * @param size - * @param timeout - * @return the number of bytes read on success or < 0 on error. - */ - public static native int usb_bulk_read(long dev_handle, int ep, - byte[] bytes, int size, int timeout); - - // Interrupt Transfers - /** - * Performs an interrupt write request to the endpoint specified by ep. - * - * @param dev_handle - * The handle to the device. - * @param ep - * @param bytes - * @param size - * @param timeout - * @return the number of bytes written on success or < 0 on error. - */ - public static native int usb_interrupt_write(long dev_handle, int ep, - byte[] bytes, int size, int timeout); - - /** - * Performs a interrupt read request to the endpoint specified by ep. - * - * @param dev_handle - * The handle to the device. - * @param ep - * @param bytes - * @param size - * @param timeout - * @return the number of bytes read on success or < 0 on error. - */ - public static native int usb_interrupt_read(long dev_handle, int ep, - byte[] bytes, int size, int timeout); - - /** - * Returns the error string after an error occured. - * - * @return the last error sring. - */ - public static native String usb_strerror(); - - /** **************************************************************** */ - - /** - * Maps the Java error code to the system error code.
- *
- * Note that not all error codes are be mapped by this method. For more - * error codes see the file 'errno.h' on your system.
- *
- * 1: EBADF: Bad file descriptor.
- * 2: ENXIO: No such device or address.
- * 3: EBUSY: Device or resource busy.
- * 4: EINVAL: Invalid argument.
- * 5: ETIMEDOUT: Connection timed out.
- * 6: EIO: I/O error.
- * 7: ENOMEM: Not enough memory.
- * - * - * @return the system error code or 100000 if no mapping has been found. - */ - private static native int usb_error_no(int value); - - static { - String os = System.getProperty("os.name"); - if (os.contains("Windows")) { - System.loadLibrary("LibusbJava"); - } else { - System.loadLibrary("usbJava"); - } - // define the error codes - ERROR_SUCCESS = 0; - ERROR_BAD_FILE_DESCRIPTOR = -usb_error_no(1); - ERROR_NO_SUCH_DEVICE_OR_ADDRESS = -usb_error_no(2); - ERROR_BUSY = -usb_error_no(3); - ERROR_INVALID_PARAMETER = -usb_error_no(4); - ERROR_TIMEDOUT = -usb_error_no(5); - ERROR_IO_ERROR = -usb_error_no(6); - ERROR_NOT_ENOUGH_MEMORY = -usb_error_no(7); - } +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * This class represents the Java Native Interface to the shared library which + * is (with some exceptions) a one-to-one representation of the libusb API.
+ *
+ *

Project Description

+ * Java libusb is a Java wrapper for the libusb and libusb-win32 USB library. + * + * libusb aim is to create a + * library for use by user level applications to access USB devices regardless + * of OS.
+ * Libusb-win32 is a port of + * the USB library libusb to the + * Windows operating systems. The library allows user space applications to + * access any USB device on Windows in a generic way without writing any line of + * kernel driver code.
+ *
+ * The API description of this class has been copied from the libusb documentation + * and adapted where neccessary.
+ * + */ +public class LibusbJava { + + /** + * System error codes.
+ * This list is not complete! For more error codes see the file 'errorno.h' + * on your system. + */ + public static int ERROR_SUCCESS, ERROR_BAD_FILE_DESCRIPTOR, + ERROR_NO_SUCH_DEVICE_OR_ADDRESS, ERROR_BUSY, + ERROR_INVALID_PARAMETER, ERROR_TIMEDOUT, ERROR_IO_ERROR, + ERROR_NOT_ENOUGH_MEMORY;; + + /** + * Sets the debugging level of libusb.
+ * + * The range is from 0 to 255, where 0 disables debug output and 255 enables + * all output. On application start, debugging is disabled (0). + * + * @param level + * 0 to 255 + */ + public static native void usb_set_debug(int level); + + // Core + /** + * Just like the name implies, usb_init sets up some internal + * structures. usb_init must be called before any other + * libusb functions. + */ + public static native void usb_init(); + + /** + * usb_find_busses will find all of the busses on the system. + * + * @return the number of changes since previous call to this function (total + * of new busses and busses removed). + */ + public static native int usb_find_busses(); + + /** + * usb_find_devices will find all of the devices on each bus. + * This should be called after usb_find_busses. + * + * @return the number of changes since the previous call to this function + * (total of new device and devices removed). + */ + public static native int usb_find_devices(); + + /** + * usb_get_busses returns a tree of descriptor objects.
+ * The tree represents the bus structure with devices, configurations, + * interfaces and endpoints. Note that this is only a copy. To refresh the + * information, usb_get_busses() must be called again.
+ * The name of the objects contained in the tree is starting with + * Usb_. + * + * @return the structure of all busses and devices. Note: The + * java objects are copies of the C structs. + */ + public static native Usb_Bus usb_get_busses(); + + // Device Operations + /** + * usb_open is to be used to open up a device for use. + * usb_open must be called before attempting to perform any + * operations to the device. + * + * @param dev + * The device to open. + * @return a handle used in future communication with the device. 0 if an + * error has occurred. + */ + public static native long usb_open(Usb_Device dev); + + /** + * usb_close closes a device opened with + * usb_open. + * + * @param dev_handle + * The handle to the device. + * @return 0 on success or < 0 on error. + */ + public static native int usb_close(long dev_handle); + + /** + * Sets the active configuration of a device + * + * @param dev_handle + * The handle to the device. + * @param configuration + * The value as specified in the descriptor field + * bConfigurationValue. + * @return 0 on success or < 0 on error. + */ + public static native int usb_set_configuration(long dev_handle, + int configuration); + + /** + * Sets the active alternate setting of the current interface + * + * @param dev_handle + * The handle to the device. + * @param alternate + * The value as specified in the descriptor field + * bAlternateSetting. + * @return 0 on success or < 0 on error. + */ + public static native int usb_set_altinterface(long dev_handle, int alternate); + + /** + * Clears any halt status on an endpoint. + * + * @param dev_handle + * The handle to the device. + * @param ep + * The value specified in the descriptor field bEndpointAddress. + * @return 0 on success or < 0 on error. + */ + public static native int usb_clear_halt(long dev_handle, int ep); + + /** + * Resets a device by sending a RESET down the port it is connected to.
+ *
+ * Causes re-enumeration: After calling usb_reset, + * the device will need to re-enumerate and thusly, requires you to find the + * new device and open a new handle. The handle used to call + * usb_reset will no longer work. + * + * @param dev_handle + * The handle to the device. + * @return 0 on success or < 0 on error. + */ + public static native int usb_reset(long dev_handle); + + /** + * Claim an interface of a device.
+ *
+ * Must be called!: usb_claim_interface must be + * called before you perform any operations related to this interface (like + * usb_set_altinterface, usb_bulk_write, etc). + * + * @param dev_handle + * The handle to the device. + * @param interface_ + * The value as specified in the descriptor field + * bInterfaceNumber. + * @return 0 on success or < 0 on error. + */ + public static native int usb_claim_interface(long dev_handle, int interface_); + + /** + * Releases a previously claimed interface + * + * @param dev_handle + * The handle to the device. + * @param interface_ + * The value as specified in the descriptor field + * bInterfaceNumber. + * @return 0 on success or < 0 on error. + */ + public static native int usb_release_interface(long dev_handle, + int interface_); + + // Control Transfers + /** + * Performs a control request to the default control pipe on a device. The + * parameters mirror the types of the same name in the USB specification. + * + * @param dev_handle + * The handle to the device. + * @param requesttype + * @param request + * @param value + * @param index + * @param bytes + * @param size + * @param timeout + * @return the number of bytes written/read or < 0 on error. + */ + public static native int usb_control_msg(long dev_handle, int requesttype, + int request, int value, int index, byte[] bytes, int size, + int timeout); + + /** + * Retrieves the string descriptor specified by index and langid from a + * device. + * + * @param dev_handle + * The handle to the device. + * @param index + * @param langid + * @return the descriptor String or null + */ + public static native String usb_get_string(long dev_handle, int index, + int langid); + + /** + * usb_get_string_simple is a wrapper around + * usb_get_string that retrieves the string description + * specified by index in the first language for the descriptor. + * + * @param dev_handle + * The handle to the device. + * @param index + * @return the descriptor String or null + */ + public static native String usb_get_string_simple(long dev_handle, int index); + + /** + * Retrieves a descriptor from the device identified by the type and index + * of the descriptor from the default control pipe.
+ *
+ * See {@link #usb_get_descriptor_by_endpoint(long, int, byte, byte, int)} + * for a function that allows the control endpoint to be specified. + * + * @param dev_handle + * The handle to the device. + * @param type + * @param index + * @param size + * number of charactes which will be retrieved (the length of the + * resulting String) + * @return the descriptor String or null + */ + public static native String usb_get_descriptor(long dev_handle, byte type, + byte index, int size); + + /** + * Retrieves a descriptor from the device identified by the type and index + * of the descriptor from the control pipe identified by ep. + * + * @param dev_handle + * The handle to the device. + * @param ep + * @param type + * @param index + * @param size + * number of charactes which will be retrieved (the length of the + * resulting String) + * @return the descriptor String or null + */ + public static native String usb_get_descriptor_by_endpoint(long dev_handle, + int ep, byte type, byte index, int size); + + // Bulk Transfers + /** + * Performs a bulk write request to the endpoint specified by ep. + * + * @param dev_handle + * The handle to the device. + * @param ep + * @param bytes + * @param size + * @param timeout + * @return the number of bytes written on success or < 0 on error. + */ + public static native int usb_bulk_write(long dev_handle, int ep, + byte[] bytes, int size, int timeout); + + /** + * Performs a bulk read request to the endpoint specified by ep. + * + * @param dev_handle + * The handle to the device. + * @param ep + * @param bytes + * @param size + * @param timeout + * @return the number of bytes read on success or < 0 on error. + */ + public static native int usb_bulk_read(long dev_handle, int ep, + byte[] bytes, int size, int timeout); + + // Interrupt Transfers + /** + * Performs an interrupt write request to the endpoint specified by ep. + * + * @param dev_handle + * The handle to the device. + * @param ep + * @param bytes + * @param size + * @param timeout + * @return the number of bytes written on success or < 0 on error. + */ + public static native int usb_interrupt_write(long dev_handle, int ep, + byte[] bytes, int size, int timeout); + + /** + * Performs a interrupt read request to the endpoint specified by ep. + * + * @param dev_handle + * The handle to the device. + * @param ep + * @param bytes + * @param size + * @param timeout + * @return the number of bytes read on success or < 0 on error. + */ + public static native int usb_interrupt_read(long dev_handle, int ep, + byte[] bytes, int size, int timeout); + + /** + * Returns the error string after an error occured. + * + * @return the last error sring. + */ + public static native String usb_strerror(); + + /** **************************************************************** */ + + /** + * Maps the Java error code to the system error code.
+ *
+ * Note that not all error codes are be mapped by this method. For more + * error codes see the file 'errno.h' on your system.
+ *
+ * 1: EBADF: Bad file descriptor.
+ * 2: ENXIO: No such device or address.
+ * 3: EBUSY: Device or resource busy.
+ * 4: EINVAL: Invalid argument.
+ * 5: ETIMEDOUT: Connection timed out.
+ * 6: EIO: I/O error.
+ * 7: ENOMEM: Not enough memory.
+ * + * + * @return the system error code or 100000 if no mapping has been found. + */ + private static native int usb_error_no(int value); + + static { + String os = System.getProperty("os.name"); + if (os.contains("Windows")) { + System.loadLibrary("LibusbJava"); + } else { + System.loadLibrary("usbJava"); + } + // define the error codes + ERROR_SUCCESS = 0; + ERROR_BAD_FILE_DESCRIPTOR = -usb_error_no(1); + ERROR_NO_SUCH_DEVICE_OR_ADDRESS = -usb_error_no(2); + ERROR_BUSY = -usb_error_no(3); + ERROR_INVALID_PARAMETER = -usb_error_no(4); + ERROR_TIMEDOUT = -usb_error_no(5); + ERROR_IO_ERROR = -usb_error_no(6); + ERROR_NOT_ENOUGH_MEMORY = -usb_error_no(7); + } } \ No newline at end of file diff --git a/java/src/ch/ntb/usb/USB.java b/src/main/java/ch/ntb/usb.r273/USB.java similarity index 97% rename from java/src/ch/ntb/usb/USB.java rename to src/main/java/ch/ntb/usb.r273/USB.java index abdcfd8..f372ef3 100644 --- a/java/src/ch/ntb/usb/USB.java +++ b/src/main/java/ch/ntb/usb.r273/USB.java @@ -1,318 +1,318 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.logging.Logger; - -import ch.ntb.usb.logger.LogUtil; - -/** - * This class manages all USB devices and defines some USB specific constants.
- * - */ -public class USB { - - // Standard requests (USB spec 9.4) - /** - * This request returns status for the specified recipient (USB spec 9.4.5). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_GET_STATUS = 0x00; - /** - * This request is used to clear or disable a specific feature (USB spec - * 9.4.1). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_CLEAR_FEATURE = 0x01; - // 0x02 is reserved - /** - * This request is used to set or enable a specific feature (USB spec - * 9.4.9). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_SET_FEATURE = 0x03; - // 0x04 is reserved - /** - * This request sets the device address for all future device accesses (USB - * spec 9.4.6). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_SET_ADDRESS = 0x05; - /** - * This request returns the specified descriptor if the descriptor exists - * (USB spec 9.4.3). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_GET_DESCRIPTOR = 0x06; - /** - * This request is optional and may be used to update existing descriptors - * or new descriptors may be added (USB spec 9.4.8). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_SET_DESCRIPTOR = 0x07; - /** - * This request returns the current device configuration value (USB spec - * 9.4.2). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_GET_CONFIGURATION = 0x08; - /** - * This request sets the device configuration (USB spec 9.4.7). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_SET_CONFIGURATION = 0x09; - /** - * This request returns the selected alternate setting for the specified - * interface (USB spec 9.4.4). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_GET_INTERFACE = 0x0A; - /** - * This request allows the host to select an alternate setting for the - * specified interface (USB spec 9.4.10). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_SET_INTERFACE = 0x0B; - /** - * This request is used to set and then report an endpoint’s synchronization - * frame (USB spec 9.4.11). - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_SYNCH_FRAME = 0x0C; - - // data transfer direction (USB spec 9.3) - /** - * Identifies the direction of data transfer in the second phase of the - * control transfer.
- * The state of the Direction bit is ignored if the wLength field is zero, - * signifying there is no Data stage.
- * Specifies bit 7 of bmRequestType. - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_TYPE_DIR_HOST_TO_DEVICE = (0x00 << 7), - REQ_TYPE_DIR_DEVICE_TO_HOST = (0x01 << 7); - - // request types (USB spec 9.3) - /** - * Specifies the type of the request.
- * Specifies bits 6..5 of bmRequestType. - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_TYPE_TYPE_STANDARD = (0x00 << 5), - REQ_TYPE_TYPE_CLASS = (0x01 << 5), - REQ_TYPE_TYPE_VENDOR = (0x02 << 5), - REQ_TYPE_TYPE_RESERVED = (0x03 << 5); - - // request recipient (USB spec 9.3) - /** - * Specifies the intended recipient of the request.
- * Requests may be directed to the device, an interface on the device, or a - * specific endpoint on a device. When an interface or endpoint is - * specified, the wIndex field identifies the interface or endpoint.
- * Specifies bits 4..0 of bmRequestType. - * - * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, - * boolean) - */ - public static final int REQ_TYPE_RECIP_DEVICE = 0x00, - REQ_TYPE_RECIP_INTERFACE = 0x01, REQ_TYPE_RECIP_ENDPOINT = 0x02, - REQ_TYPE_RECIP_OTHER = 0x03; - - /** - * The maximum packet size of a bulk transfer when operating in highspeed - * (480 MB/s) mode. - */ - public static int HIGHSPEED_MAX_BULK_PACKET_SIZE = 512; - - /** - * The maximum packet size of a bulk transfer when operating in fullspeed - * (12 MB/s) mode. - */ - public static int FULLSPEED_MAX_BULK_PACKET_SIZE = 64; - - private static final Logger logger = LogUtil.getLogger("ch.ntb.usb"); - - private static LinkedList devices = new LinkedList(); - - private static boolean initUSBDone = false; - - /** - * Create a new device an register it in a device list. If the device is - * already registered, a reference to it will be returned.
- * After resetting or re-attaching a device the busName and filename may - * change. You can unregister the current device instance (see - * {@link #unregisterDevice(Device)}) and get a new instance with the - * updated bus and filename. - * - * @param idVendor - * the vendor id of the USB device - * @param idProduct - * the product id of the USB device - * @param busName - * optional name of the bus which can be used to distinguish - * multiple devices with the same vendor and product id.
- * see {@link Usb_Bus#getDirname()} - * @param filename - * optional filename which can be used to distinguish multiple - * devices with the same vendor and product id.
- * see {@link Usb_Device#getFilename()} - * @return a newly created device or an already registered device - */ - public static Device getDevice(short idVendor, short idProduct, - String busName, String filename) { - - // check if this device is already registered - Device dev = getRegisteredDevice(idVendor, idProduct, busName, filename); - if (dev != null) { - logger.info("return already registered device: " + dev); - return dev; - } - dev = new Device(idVendor, idProduct, busName, filename); - logger.info("create new device: " + dev); - devices.add(dev); - return dev; - } - - /** - * See {@link #getDevice(short, short, String, String)}. The parameter - * filename and busNameis set to null. - * - * @param idVendor - * @param idProduct - * @return a newly created device or an already registered device - */ - public static Device getDevice(short idVendor, short idProduct) { - return getDevice(idVendor, idProduct, null, null); - } - - /** - * Unregister a registered device. - * - * @param dev - * the device to unregister - * @return true if the device has been removed, else false - */ - public static boolean unregisterDevice(Device dev) { - return devices.remove(dev); - } - - /** - * Get an already registered device or null if the device does not exist.
- * To uniquely identify a device bus and filename should be set. If only one - * of those is set the first device matching the criteria is returned. - * - * @param idVendor - * the vendor id of the USB device - * @param idProduct - * the product id of the USB device - * @param busName - * the name of the bus which can be used to distinguish multiple - * devices with the same vendor and product id.
- * see {@link Usb_Bus#getDirname()} - * @param filename - * an optional filename which can be used to distinguish multiple - * devices with the same vendor and product id. see - * {@link Usb_Device#getFilename()} - * - * @return the device or null - */ - private static Device getRegisteredDevice(short idVendor, short idProduct, - String busName, String filename) { - for (Iterator iter = devices.iterator(); iter.hasNext();) { - Device dev = iter.next(); - // bus and filename - if (busName != null && filename != null) { - if (busName.compareTo(dev.getBusName() == null ? "" : dev - .getBusName()) == 0 - && filename.compareTo(dev.getFilename() == null ? "" - : dev.getFilename()) == 0 - && dev.getIdVendor() == idVendor - && dev.getIdProduct() == idProduct) { - return dev; - } - } else if (filename != null) { - if (filename.compareTo(dev.getFilename() == null ? "" : dev - .getFilename()) == 0 - && dev.getIdVendor() == idVendor - && dev.getIdProduct() == idProduct) { - return dev; - } - } else if (busName != null) { - if (busName.compareTo(dev.getBusName() == null ? "" : dev - .getBusName()) == 0 - && dev.getIdVendor() == idVendor - && dev.getIdProduct() == idProduct) { - return dev; - } - } else if (dev.getIdVendor() == idVendor - && dev.getIdProduct() == idProduct) { - return dev; - } - } - return null; - } - - /** - * Returns the root {@link Usb_Bus} element. - * - * @return the root {@link Usb_Bus} element - * @throws USBException - */ - public static Usb_Bus getBus() throws USBException { - if (!initUSBDone) { - init(); - } - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - - Usb_Bus bus = LibusbJava.usb_get_busses(); - if (bus == null) { - throw new USBException("LibusbJava.usb_get_busses(): " - + LibusbJava.usb_strerror()); - } - return bus; - } - - /** - * Explicitly calls {@link LibusbJava#usb_init()}. Note that you don't need - * to call this procedure as it is called implicitly when creating a new - * device with {@link USB#getDevice(short, short, String, String)}. - */ - public static void init() { - LibusbJava.usb_init(); - initUSBDone = true; - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.logging.Logger; + +import ch.ntb.usb.logger.LogUtil; + +/** + * This class manages all USB devices and defines some USB specific constants.
+ * + */ +public class USB { + + // Standard requests (USB spec 9.4) + /** + * This request returns status for the specified recipient (USB spec 9.4.5). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_GET_STATUS = 0x00; + /** + * This request is used to clear or disable a specific feature (USB spec + * 9.4.1). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_CLEAR_FEATURE = 0x01; + // 0x02 is reserved + /** + * This request is used to set or enable a specific feature (USB spec + * 9.4.9). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_SET_FEATURE = 0x03; + // 0x04 is reserved + /** + * This request sets the device address for all future device accesses (USB + * spec 9.4.6). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_SET_ADDRESS = 0x05; + /** + * This request returns the specified descriptor if the descriptor exists + * (USB spec 9.4.3). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_GET_DESCRIPTOR = 0x06; + /** + * This request is optional and may be used to update existing descriptors + * or new descriptors may be added (USB spec 9.4.8). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_SET_DESCRIPTOR = 0x07; + /** + * This request returns the current device configuration value (USB spec + * 9.4.2). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_GET_CONFIGURATION = 0x08; + /** + * This request sets the device configuration (USB spec 9.4.7). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_SET_CONFIGURATION = 0x09; + /** + * This request returns the selected alternate setting for the specified + * interface (USB spec 9.4.4). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_GET_INTERFACE = 0x0A; + /** + * This request allows the host to select an alternate setting for the + * specified interface (USB spec 9.4.10). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_SET_INTERFACE = 0x0B; + /** + * This request is used to set and then report an endpoint’s synchronization + * frame (USB spec 9.4.11). + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_SYNCH_FRAME = 0x0C; + + // data transfer direction (USB spec 9.3) + /** + * Identifies the direction of data transfer in the second phase of the + * control transfer.
+ * The state of the Direction bit is ignored if the wLength field is zero, + * signifying there is no Data stage.
+ * Specifies bit 7 of bmRequestType. + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_TYPE_DIR_HOST_TO_DEVICE = (0x00 << 7), + REQ_TYPE_DIR_DEVICE_TO_HOST = (0x01 << 7); + + // request types (USB spec 9.3) + /** + * Specifies the type of the request.
+ * Specifies bits 6..5 of bmRequestType. + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_TYPE_TYPE_STANDARD = (0x00 << 5), + REQ_TYPE_TYPE_CLASS = (0x01 << 5), + REQ_TYPE_TYPE_VENDOR = (0x02 << 5), + REQ_TYPE_TYPE_RESERVED = (0x03 << 5); + + // request recipient (USB spec 9.3) + /** + * Specifies the intended recipient of the request.
+ * Requests may be directed to the device, an interface on the device, or a + * specific endpoint on a device. When an interface or endpoint is + * specified, the wIndex field identifies the interface or endpoint.
+ * Specifies bits 4..0 of bmRequestType. + * + * @see ch.ntb.usb.Device#controlMsg(int, int, int, int, byte[], int, int, + * boolean) + */ + public static final int REQ_TYPE_RECIP_DEVICE = 0x00, + REQ_TYPE_RECIP_INTERFACE = 0x01, REQ_TYPE_RECIP_ENDPOINT = 0x02, + REQ_TYPE_RECIP_OTHER = 0x03; + + /** + * The maximum packet size of a bulk transfer when operating in highspeed + * (480 MB/s) mode. + */ + public static int HIGHSPEED_MAX_BULK_PACKET_SIZE = 512; + + /** + * The maximum packet size of a bulk transfer when operating in fullspeed + * (12 MB/s) mode. + */ + public static int FULLSPEED_MAX_BULK_PACKET_SIZE = 64; + + private static final Logger logger = LogUtil.getLogger("ch.ntb.usb"); + + private static LinkedList devices = new LinkedList(); + + private static boolean initUSBDone = false; + + /** + * Create a new device an register it in a device list. If the device is + * already registered, a reference to it will be returned.
+ * After resetting or re-attaching a device the busName and filename may + * change. You can unregister the current device instance (see + * {@link #unregisterDevice(Device)}) and get a new instance with the + * updated bus and filename. + * + * @param idVendor + * the vendor id of the USB device + * @param idProduct + * the product id of the USB device + * @param busName + * optional name of the bus which can be used to distinguish + * multiple devices with the same vendor and product id.
+ * see {@link Usb_Bus#getDirname()} + * @param filename + * optional filename which can be used to distinguish multiple + * devices with the same vendor and product id.
+ * see {@link Usb_Device#getFilename()} + * @return a newly created device or an already registered device + */ + public static Device getDevice(short idVendor, short idProduct, + String busName, String filename) { + + // check if this device is already registered + Device dev = getRegisteredDevice(idVendor, idProduct, busName, filename); + if (dev != null) { + logger.info("return already registered device: " + dev); + return dev; + } + dev = new Device(idVendor, idProduct, busName, filename); + logger.info("create new device: " + dev); + devices.add(dev); + return dev; + } + + /** + * See {@link #getDevice(short, short, String, String)}. The parameter + * filename and busNameis set to null. + * + * @param idVendor + * @param idProduct + * @return a newly created device or an already registered device + */ + public static Device getDevice(short idVendor, short idProduct) { + return getDevice(idVendor, idProduct, null, null); + } + + /** + * Unregister a registered device. + * + * @param dev + * the device to unregister + * @return true if the device has been removed, else false + */ + public static boolean unregisterDevice(Device dev) { + return devices.remove(dev); + } + + /** + * Get an already registered device or null if the device does not exist.
+ * To uniquely identify a device bus and filename should be set. If only one + * of those is set the first device matching the criteria is returned. + * + * @param idVendor + * the vendor id of the USB device + * @param idProduct + * the product id of the USB device + * @param busName + * the name of the bus which can be used to distinguish multiple + * devices with the same vendor and product id.
+ * see {@link Usb_Bus#getDirname()} + * @param filename + * an optional filename which can be used to distinguish multiple + * devices with the same vendor and product id. see + * {@link Usb_Device#getFilename()} + * + * @return the device or null + */ + private static Device getRegisteredDevice(short idVendor, short idProduct, + String busName, String filename) { + for (Iterator iter = devices.iterator(); iter.hasNext();) { + Device dev = iter.next(); + // bus and filename + if (busName != null && filename != null) { + if (busName.compareTo(dev.getBusName() == null ? "" : dev + .getBusName()) == 0 + && filename.compareTo(dev.getFilename() == null ? "" + : dev.getFilename()) == 0 + && dev.getIdVendor() == idVendor + && dev.getIdProduct() == idProduct) { + return dev; + } + } else if (filename != null) { + if (filename.compareTo(dev.getFilename() == null ? "" : dev + .getFilename()) == 0 + && dev.getIdVendor() == idVendor + && dev.getIdProduct() == idProduct) { + return dev; + } + } else if (busName != null) { + if (busName.compareTo(dev.getBusName() == null ? "" : dev + .getBusName()) == 0 + && dev.getIdVendor() == idVendor + && dev.getIdProduct() == idProduct) { + return dev; + } + } else if (dev.getIdVendor() == idVendor + && dev.getIdProduct() == idProduct) { + return dev; + } + } + return null; + } + + /** + * Returns the root {@link Usb_Bus} element. + * + * @return the root {@link Usb_Bus} element + * @throws USBException + */ + public static Usb_Bus getBus() throws USBException { + if (!initUSBDone) { + init(); + } + LibusbJava.usb_find_busses(); + LibusbJava.usb_find_devices(); + + Usb_Bus bus = LibusbJava.usb_get_busses(); + if (bus == null) { + throw new USBException("LibusbJava.usb_get_busses(): " + + LibusbJava.usb_strerror()); + } + return bus; + } + + /** + * Explicitly calls {@link LibusbJava#usb_init()}. Note that you don't need + * to call this procedure as it is called implicitly when creating a new + * device with {@link USB#getDevice(short, short, String, String)}. + */ + public static void init() { + LibusbJava.usb_init(); + initUSBDone = true; + } +} diff --git a/java/src/ch/ntb/usb/USBException.java b/src/main/java/ch/ntb/usb.r273/USBException.java similarity index 95% rename from java/src/ch/ntb/usb/USBException.java rename to src/main/java/ch/ntb/usb.r273/USBException.java index af40cd2..21f1f5c 100644 --- a/java/src/ch/ntb/usb/USBException.java +++ b/src/main/java/ch/ntb/usb.r273/USBException.java @@ -1,23 +1,23 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -import java.io.IOException; - -public class USBException extends IOException { - - public USBException(String string) { - super(string); - } - - /** - * - */ - private static final long serialVersionUID = 1690857437804284710L; - -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +import java.io.IOException; + +public class USBException extends IOException { + + public USBException(String string) { + super(string); + } + + /** + * + */ + private static final long serialVersionUID = 1690857437804284710L; + +} diff --git a/java/src/ch/ntb/usb/USBTimeoutException.java b/src/main/java/ch/ntb/usb.r273/USBTimeoutException.java similarity index 95% rename from java/src/ch/ntb/usb/USBTimeoutException.java rename to src/main/java/ch/ntb/usb.r273/USBTimeoutException.java index 3b8cf01..4b8c3c6 100644 --- a/java/src/ch/ntb/usb/USBTimeoutException.java +++ b/src/main/java/ch/ntb/usb.r273/USBTimeoutException.java @@ -1,21 +1,21 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -public class USBTimeoutException extends USBException { - - public USBTimeoutException(String string) { - super(string); - } - - /** - * - */ - private static final long serialVersionUID = -1065328371159778249L; - -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +public class USBTimeoutException extends USBException { + + public USBTimeoutException(String string) { + super(string); + } + + /** + * + */ + private static final long serialVersionUID = -1065328371159778249L; + +} diff --git a/java/src/ch/ntb/usb/Usb_Bus.java b/src/main/java/ch/ntb/usb.r273/Usb_Bus.java similarity index 95% rename from java/src/ch/ntb/usb/Usb_Bus.java rename to src/main/java/ch/ntb/usb.r273/Usb_Bus.java index fd668d3..a7c59fc 100644 --- a/java/src/ch/ntb/usb/Usb_Bus.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Bus.java @@ -1,86 +1,86 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents an USB bus.
- * This is the root class for the representation of the libusb USB structure. - * Zero or more devices may be connected to an USB bus. - * - */ -public class Usb_Bus { - - private Usb_Bus next, prev; - - private String dirname; - - private Usb_Device devices; - - private long location; - - private Usb_Device root_dev; - - /** - * Get the first device ojects of the devices linked list.
- * - * @return the first device ojects of the devices linked list or null - */ - public Usb_Device getDevices() { - return devices; - } - - /** - * Returns the systems String representation of the bus.
- * - * @return the systems String representation of the bus - */ - public String getDirname() { - return dirname; - } - - /** - * Returns the next bus object.
- * - * @return Returns the next bus object or null - */ - public Usb_Bus getNext() { - return next; - } - - /** - * Returns the previous bus object.
- * - * @return Returns the previous bus object or null - */ - public Usb_Bus getPrev() { - return prev; - } - - /** - * Get the root device of this bus.
- * - * @return the root device oject or null - */ - public Usb_Device getRootDev() { - return root_dev; - } - - /** - * Returns the location in the USB bus linked list.
- * - * @return the location in the USB bus linked list - */ - public long getLocation() { - return location; - } - - @Override - public String toString() { - return "Usb_Bus " + dirname; - } +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents an USB bus.
+ * This is the root class for the representation of the libusb USB structure. + * Zero or more devices may be connected to an USB bus. + * + */ +public class Usb_Bus { + + private Usb_Bus next, prev; + + private String dirname; + + private Usb_Device devices; + + private long location; + + private Usb_Device root_dev; + + /** + * Get the first device ojects of the devices linked list.
+ * + * @return the first device ojects of the devices linked list or null + */ + public Usb_Device getDevices() { + return devices; + } + + /** + * Returns the systems String representation of the bus.
+ * + * @return the systems String representation of the bus + */ + public String getDirname() { + return dirname; + } + + /** + * Returns the next bus object.
+ * + * @return Returns the next bus object or null + */ + public Usb_Bus getNext() { + return next; + } + + /** + * Returns the previous bus object.
+ * + * @return Returns the previous bus object or null + */ + public Usb_Bus getPrev() { + return prev; + } + + /** + * Get the root device of this bus.
+ * + * @return the root device oject or null + */ + public Usb_Device getRootDev() { + return root_dev; + } + + /** + * Returns the location in the USB bus linked list.
+ * + * @return the location in the USB bus linked list + */ + public long getLocation() { + return location; + } + + @Override + public String toString() { + return "Usb_Bus " + dirname; + } } \ No newline at end of file diff --git a/java/src/ch/ntb/usb/Usb_Config_Descriptor.java b/src/main/java/ch/ntb/usb.r273/Usb_Config_Descriptor.java similarity index 96% rename from java/src/ch/ntb/usb/Usb_Config_Descriptor.java rename to src/main/java/ch/ntb/usb.r273/Usb_Config_Descriptor.java index 3ba9fda..9bf6ff5 100644 --- a/java/src/ch/ntb/usb/Usb_Config_Descriptor.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Config_Descriptor.java @@ -1,139 +1,139 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents the descriptor of a USB configuration.
- * A USB device can have several different configuration.
- *
- * The length of the configuration descriptor is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_CONFIG_SIZE} and the type is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_CONFIG}. - * - */ -public class Usb_Config_Descriptor extends Usb_Descriptor { - - /** - * Maximum number of configurations per device - */ - public static final int USB_MAXCONFIG = 8; - - private short wTotalLength; - - private byte bNumInterfaces; - - private byte bConfigurationValue; - - private byte iConfiguration; - - private byte bmAttributes; - - private byte MaxPower; - - private Usb_Interface[] interface_; - - private byte[] extra; /* Extra descriptors */ - - private int extralen; - - /** - * Returns the value to use as an argument to select this configuration ({@link LibusbJava#usb_set_configuration(long, int)}). - * - * @return the value to use as an argument to select this configuration - */ - public byte getBConfigurationValue() { - return bConfigurationValue; - } - - /** - * Returns the power parameters for this configuration.
- *
- * Bit 7: Reserved, set to 1 (USB 1.0 Bus Powered)
- * Bit 6: Self Powered
- * Bit 5: Remote Wakeup
- * Bit 4..0: Reserved, set to 0 - * - * @return the power parameters for this configuration - */ - public byte getBmAttributes() { - return bmAttributes; - } - - /** - * Returns the number of interfaces.
- * - * @return the number of interfaces - */ - public byte getBNumInterfaces() { - return bNumInterfaces; - } - - /** - * Returns the data of extra descriptor(s) if available.
- * - * @return null or a byte array with the extra descriptor data - */ - public byte[] getExtra() { - return extra; - } - - /** - * Returns the number of bytes of the extra descriptor.
- * - * @return the number of bytes of the extra descriptor - */ - public int getExtralen() { - return extralen; - } - - /** - * Returns the index of the String descriptor describing this configuration.
- * - * @return the index of the String descriptor - */ - public byte getIConfiguration() { - return iConfiguration; - } - - /** - * Returns the USB interface descriptors.
- * - * @return the USB interface descriptors - */ - public Usb_Interface[] getInterface() { - return interface_; - } - - /** - * Returns the maximum power consumption in 2mA units.
- * - * @return the maximum power consumption in 2mA units - */ - public byte getMaxPower() { - return MaxPower; - } - - /** - * Returns the total length in bytes of all descriptors.
- * When the configuration descriptor is read, it returns the entire - * configuration hierarchy which includes all related interface and endpoint - * descriptors. The wTotalLength field reflects the number of - * bytes in the hierarchy. - * - * @return the total length in bytes of all descriptors - */ - public short getWTotalLength() { - return wTotalLength; - } - - @Override - public String toString() { - return "Usb_Config_Descriptor bNumInterfaces: 0x" - + Integer.toHexString(bNumInterfaces); - } +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents the descriptor of a USB configuration.
+ * A USB device can have several different configuration.
+ *
+ * The length of the configuration descriptor is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_CONFIG_SIZE} and the type is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_CONFIG}. + * + */ +public class Usb_Config_Descriptor extends Usb_Descriptor { + + /** + * Maximum number of configurations per device + */ + public static final int USB_MAXCONFIG = 8; + + private short wTotalLength; + + private byte bNumInterfaces; + + private byte bConfigurationValue; + + private byte iConfiguration; + + private byte bmAttributes; + + private byte MaxPower; + + private Usb_Interface[] interface_; + + private byte[] extra; /* Extra descriptors */ + + private int extralen; + + /** + * Returns the value to use as an argument to select this configuration ({@link LibusbJava#usb_set_configuration(long, int)}). + * + * @return the value to use as an argument to select this configuration + */ + public byte getBConfigurationValue() { + return bConfigurationValue; + } + + /** + * Returns the power parameters for this configuration.
+ *
+ * Bit 7: Reserved, set to 1 (USB 1.0 Bus Powered)
+ * Bit 6: Self Powered
+ * Bit 5: Remote Wakeup
+ * Bit 4..0: Reserved, set to 0 + * + * @return the power parameters for this configuration + */ + public byte getBmAttributes() { + return bmAttributes; + } + + /** + * Returns the number of interfaces.
+ * + * @return the number of interfaces + */ + public byte getBNumInterfaces() { + return bNumInterfaces; + } + + /** + * Returns the data of extra descriptor(s) if available.
+ * + * @return null or a byte array with the extra descriptor data + */ + public byte[] getExtra() { + return extra; + } + + /** + * Returns the number of bytes of the extra descriptor.
+ * + * @return the number of bytes of the extra descriptor + */ + public int getExtralen() { + return extralen; + } + + /** + * Returns the index of the String descriptor describing this configuration.
+ * + * @return the index of the String descriptor + */ + public byte getIConfiguration() { + return iConfiguration; + } + + /** + * Returns the USB interface descriptors.
+ * + * @return the USB interface descriptors + */ + public Usb_Interface[] getInterface() { + return interface_; + } + + /** + * Returns the maximum power consumption in 2mA units.
+ * + * @return the maximum power consumption in 2mA units + */ + public byte getMaxPower() { + return MaxPower; + } + + /** + * Returns the total length in bytes of all descriptors.
+ * When the configuration descriptor is read, it returns the entire + * configuration hierarchy which includes all related interface and endpoint + * descriptors. The wTotalLength field reflects the number of + * bytes in the hierarchy. + * + * @return the total length in bytes of all descriptors + */ + public short getWTotalLength() { + return wTotalLength; + } + + @Override + public String toString() { + return "Usb_Config_Descriptor bNumInterfaces: 0x" + + Integer.toHexString(bNumInterfaces); + } } \ No newline at end of file diff --git a/java/src/ch/ntb/usb/Usb_Descriptor.java b/src/main/java/ch/ntb/usb.r273/Usb_Descriptor.java similarity index 95% rename from java/src/ch/ntb/usb/Usb_Descriptor.java rename to src/main/java/ch/ntb/usb.r273/Usb_Descriptor.java index d8f4c17..6aee245 100644 --- a/java/src/ch/ntb/usb/Usb_Descriptor.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Descriptor.java @@ -1,59 +1,59 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Common USB descriptor values.
- * - */ -public class Usb_Descriptor { - - /** - * Descriptor types ({@link #bDescriptorType}). - */ - public static final int USB_DT_DEVICE = 0x01, USB_DT_CONFIG = 0x02, - USB_DT_STRING = 0x03, USB_DT_INTERFACE = 0x04, - USB_DT_ENDPOINT = 0x05; - - /** - * Descriptor types ({@link #bDescriptorType}). - */ - public static final int USB_DT_HID = 0x21, USB_DT_REPORT = 0x22, - USB_DT_PHYSICAL = 0x23, USB_DT_HUB = 0x29; - - /** - * Descriptor sizes per descriptor type ({@link #bLength}). - */ - public static final int USB_DT_DEVICE_SIZE = 18, USB_DT_CONFIG_SIZE = 9, - USB_DT_INTERFACE_SIZE = 9, USB_DT_ENDPOINT_SIZE = 7, - USB_DT_ENDPOINT_AUDIO_SIZE = 9 /* Audio extension */, - USB_DT_HUB_NONVAR_SIZE = 7; - - private byte bLength; - - private byte bDescriptorType; - - /** - * Get the type of this descriptor.
- * - * @return the type of this descriptor - */ - public byte getBDescriptorType() { - return bDescriptorType; - } - - /** - * Get the size of this descriptor in bytes.
- * - * @return the size of this descriptor in bytes - */ - public byte getBLength() { - return bLength; - } - -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Common USB descriptor values.
+ * + */ +public class Usb_Descriptor { + + /** + * Descriptor types ({@link #bDescriptorType}). + */ + public static final int USB_DT_DEVICE = 0x01, USB_DT_CONFIG = 0x02, + USB_DT_STRING = 0x03, USB_DT_INTERFACE = 0x04, + USB_DT_ENDPOINT = 0x05; + + /** + * Descriptor types ({@link #bDescriptorType}). + */ + public static final int USB_DT_HID = 0x21, USB_DT_REPORT = 0x22, + USB_DT_PHYSICAL = 0x23, USB_DT_HUB = 0x29; + + /** + * Descriptor sizes per descriptor type ({@link #bLength}). + */ + public static final int USB_DT_DEVICE_SIZE = 18, USB_DT_CONFIG_SIZE = 9, + USB_DT_INTERFACE_SIZE = 9, USB_DT_ENDPOINT_SIZE = 7, + USB_DT_ENDPOINT_AUDIO_SIZE = 9 /* Audio extension */, + USB_DT_HUB_NONVAR_SIZE = 7; + + private byte bLength; + + private byte bDescriptorType; + + /** + * Get the type of this descriptor.
+ * + * @return the type of this descriptor + */ + public byte getBDescriptorType() { + return bDescriptorType; + } + + /** + * Get the size of this descriptor in bytes.
+ * + * @return the size of this descriptor in bytes + */ + public byte getBLength() { + return bLength; + } + +} diff --git a/java/src/ch/ntb/usb/Usb_Device.java b/src/main/java/ch/ntb/usb.r273/Usb_Device.java similarity index 95% rename from java/src/ch/ntb/usb/Usb_Device.java rename to src/main/java/ch/ntb/usb.r273/Usb_Device.java index 4fc7aeb..5cb314a 100644 --- a/java/src/ch/ntb/usb/Usb_Device.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Device.java @@ -1,125 +1,125 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents an USB device.
- * An USB device has one device descriptor and it may have multiple - * configuration descriptors. - * - */ -public class Usb_Device { - - private Usb_Device next, prev; - - private String filename; - - private Usb_Bus bus; - - private Usb_Device_Descriptor descriptor; - - private Usb_Config_Descriptor[] config; - - private byte devnum; - - private byte num_children; - - private Usb_Device children; - - /** - * The address of the device structure to be passed to usb_open. This value - * is used only internally so we don't use getter or setter methods. - */ - public long devStructAddr; - - /** - * Returns the reference to the bus to which this device is connected.
- * - * @return the reference to the bus to which this device is connected - */ - public Usb_Bus getBus() { - return bus; - } - - /** - * Returns a reference to the first child.
- * - * @return a reference to the first child - */ - public Usb_Device getChildren() { - return children; - } - - /** - * Returns the USB config descriptors.
- * - * @return the USB config descriptors - */ - public Usb_Config_Descriptor[] getConfig() { - return config; - } - - /** - * Returns the USB device descriptor.
- * - * @return the USB device descriptor - */ - public Usb_Device_Descriptor getDescriptor() { - return descriptor; - } - - /** - * Returns the number assigned to this device.
- * - * @return the number assigned to this device - */ - public byte getDevnum() { - return devnum; - } - - /** - * Returns the systems String representation.
- * - * @return the systems String representation - */ - public String getFilename() { - return filename; - } - - /** - * Returns the pointer to the next device.
- * - * @return the pointer to the next device or null - */ - public Usb_Device getNext() { - return next; - } - - /** - * Returns the number of children of this device.
- * - * @return the number of children of this device - */ - public byte getNumChildren() { - return num_children; - } - - /** - * Returns the pointer to the previous device.
- * - * @return the pointer to the previous device or null - */ - public Usb_Device getPrev() { - return prev; - } - - @Override - public String toString() { - return "Usb_Device " + filename; - } +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents an USB device.
+ * An USB device has one device descriptor and it may have multiple + * configuration descriptors. + * + */ +public class Usb_Device { + + private Usb_Device next, prev; + + private String filename; + + private Usb_Bus bus; + + private Usb_Device_Descriptor descriptor; + + private Usb_Config_Descriptor[] config; + + private byte devnum; + + private byte num_children; + + private Usb_Device children; + + /** + * The address of the device structure to be passed to usb_open. This value + * is used only internally so we don't use getter or setter methods. + */ + public long devStructAddr; + + /** + * Returns the reference to the bus to which this device is connected.
+ * + * @return the reference to the bus to which this device is connected + */ + public Usb_Bus getBus() { + return bus; + } + + /** + * Returns a reference to the first child.
+ * + * @return a reference to the first child + */ + public Usb_Device getChildren() { + return children; + } + + /** + * Returns the USB config descriptors.
+ * + * @return the USB config descriptors + */ + public Usb_Config_Descriptor[] getConfig() { + return config; + } + + /** + * Returns the USB device descriptor.
+ * + * @return the USB device descriptor + */ + public Usb_Device_Descriptor getDescriptor() { + return descriptor; + } + + /** + * Returns the number assigned to this device.
+ * + * @return the number assigned to this device + */ + public byte getDevnum() { + return devnum; + } + + /** + * Returns the systems String representation.
+ * + * @return the systems String representation + */ + public String getFilename() { + return filename; + } + + /** + * Returns the pointer to the next device.
+ * + * @return the pointer to the next device or null + */ + public Usb_Device getNext() { + return next; + } + + /** + * Returns the number of children of this device.
+ * + * @return the number of children of this device + */ + public byte getNumChildren() { + return num_children; + } + + /** + * Returns the pointer to the previous device.
+ * + * @return the pointer to the previous device or null + */ + public Usb_Device getPrev() { + return prev; + } + + @Override + public String toString() { + return "Usb_Device " + filename; + } } \ No newline at end of file diff --git a/java/src/ch/ntb/usb/Usb_Device_Descriptor.java b/src/main/java/ch/ntb/usb.r273/Usb_Device_Descriptor.java similarity index 96% rename from java/src/ch/ntb/usb/Usb_Device_Descriptor.java rename to src/main/java/ch/ntb/usb.r273/Usb_Device_Descriptor.java index 720909f..5cf30e9 100644 --- a/java/src/ch/ntb/usb/Usb_Device_Descriptor.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Device_Descriptor.java @@ -1,190 +1,190 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents the descriptor of a USB device.
- * A USB device can only have one device descriptor. It specifies some basic, - * yet important information about the device.
- *
- * The length of the device descriptor is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_DEVICE_SIZE} and the type is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_DEVICE}. - * - */ -public class Usb_Device_Descriptor extends Usb_Descriptor { - /** - * Device and/or interface class codes. - */ - public static final int USB_CLASS_PER_INTERFACE = 0, USB_CLASS_AUDIO = 1, - USB_CLASS_COMM = 2, USB_CLASS_HID = 3, USB_CLASS_PRINTER = 7, - USB_CLASS_MASS_STORAGE = 8, USB_CLASS_HUB = 9, USB_CLASS_DATA = 10, - USB_CLASS_VENDOR_SPEC = 0xff; - - private short bcdUSB; - - private byte bDeviceClass; - - private byte bDeviceSubClass; - - private byte bDeviceProtocol; - - private byte bMaxPacketSize0; - - private short idVendor; - - private short idProduct; - - private short bcdDevice; - - private byte iManufacturer; - - private byte iProduct; - - private byte iSerialNumber; - - private byte bNumConfigurations; - - /** - * Returns the device release number.
- * Assigned by the manufacturer of the device. - * - * @return the device release number - */ - public short getBcdDevice() { - return bcdDevice; - } - - /** - * Returns the USB specification number to which the device complies to.
- * This field reports the highest version of USB the device supports. The - * value is in binary coded decimal with a format of 0xJJMN where JJ is the - * major version number, M is the minor version number and N is the sub - * minor version number.
- * Examples: USB 2.0 is reported as 0x0200, USB 1.1 as 0x0110 and USB 1.0 as - * 0x100 - * - * @return the USB specification number to which the device complies to - */ - public short getBcdUSB() { - return bcdUSB; - } - - /** - * Returns the class code (Assigned by www.usb.org)
- * If equal to zero, each interface specifies it's own class code. If equal - * to 0xFF, the class code is vendor specified. Otherwise the field is a - * valid class code. - * - * @return the class code - */ - public byte getBDeviceClass() { - return bDeviceClass; - } - - /** - * Returns the protocol code (Assigned by www.usb.org)
- * - * @return the protocol code - */ - public byte getBDeviceProtocol() { - return bDeviceProtocol; - } - - /** - * Returns the subclass code (Assigned by www.usb.org)
- * - * @return the subclass code - */ - public byte getBDeviceSubClass() { - return bDeviceSubClass; - } - - /** - * Returns the maximum packet size for endpoint zero.
- * Valid sizes are 8, 16, 32, 64. - * - * @return the maximum packet size for endpoint zero - */ - public byte getBMaxPacketSize0() { - return bMaxPacketSize0; - } - - /** - * Returns the number of possible configurations supported at its current - * speed.
- * - * @return the number of possible configurations supported at its current - * speed - */ - public byte getBNumConfigurations() { - return bNumConfigurations; - } - - /** - * Returns the product ID (Assigned by www.usb.org)
- * - * @return the product ID - */ - public short getIdProduct() { - return idProduct; - } - - /** - * Returns the Vendor ID (Assigned by www.usb.org)
- * - * @return the Vendor ID - */ - public short getIdVendor() { - return idVendor; - } - - /** - * Returns the index of the manufacturer string descriptor.
- * If this value is 0, no string descriptor is used. - * - * @return the index of the manufacturer string descriptor - */ - public byte getIManufacturer() { - return iManufacturer; - } - - /** - * Returns the index of the product string descriptor.
- * If this value is 0, no string descriptor is used. - * - * @return the index of the product string descriptor - */ - public byte getIProduct() { - return iProduct; - } - - /** - * Returns the index of serial number string descriptor.
- * If this value is 0, no string descriptor is used. - * - * @return the index of serial number string descriptor - */ - public byte getISerialNumber() { - return iSerialNumber; - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append("Usb_Device_Descriptor idVendor: 0x" - + Integer.toHexString(idVendor & 0xFFFF) + ", idProduct: 0x" - + Integer.toHexString(idProduct & 0xFFFF)); - return sb.toString(); - } +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents the descriptor of a USB device.
+ * A USB device can only have one device descriptor. It specifies some basic, + * yet important information about the device.
+ *
+ * The length of the device descriptor is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_DEVICE_SIZE} and the type is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_DEVICE}. + * + */ +public class Usb_Device_Descriptor extends Usb_Descriptor { + /** + * Device and/or interface class codes. + */ + public static final int USB_CLASS_PER_INTERFACE = 0, USB_CLASS_AUDIO = 1, + USB_CLASS_COMM = 2, USB_CLASS_HID = 3, USB_CLASS_PRINTER = 7, + USB_CLASS_MASS_STORAGE = 8, USB_CLASS_HUB = 9, USB_CLASS_DATA = 10, + USB_CLASS_VENDOR_SPEC = 0xff; + + private short bcdUSB; + + private byte bDeviceClass; + + private byte bDeviceSubClass; + + private byte bDeviceProtocol; + + private byte bMaxPacketSize0; + + private short idVendor; + + private short idProduct; + + private short bcdDevice; + + private byte iManufacturer; + + private byte iProduct; + + private byte iSerialNumber; + + private byte bNumConfigurations; + + /** + * Returns the device release number.
+ * Assigned by the manufacturer of the device. + * + * @return the device release number + */ + public short getBcdDevice() { + return bcdDevice; + } + + /** + * Returns the USB specification number to which the device complies to.
+ * This field reports the highest version of USB the device supports. The + * value is in binary coded decimal with a format of 0xJJMN where JJ is the + * major version number, M is the minor version number and N is the sub + * minor version number.
+ * Examples: USB 2.0 is reported as 0x0200, USB 1.1 as 0x0110 and USB 1.0 as + * 0x100 + * + * @return the USB specification number to which the device complies to + */ + public short getBcdUSB() { + return bcdUSB; + } + + /** + * Returns the class code (Assigned by www.usb.org)
+ * If equal to zero, each interface specifies it's own class code. If equal + * to 0xFF, the class code is vendor specified. Otherwise the field is a + * valid class code. + * + * @return the class code + */ + public byte getBDeviceClass() { + return bDeviceClass; + } + + /** + * Returns the protocol code (Assigned by www.usb.org)
+ * + * @return the protocol code + */ + public byte getBDeviceProtocol() { + return bDeviceProtocol; + } + + /** + * Returns the subclass code (Assigned by www.usb.org)
+ * + * @return the subclass code + */ + public byte getBDeviceSubClass() { + return bDeviceSubClass; + } + + /** + * Returns the maximum packet size for endpoint zero.
+ * Valid sizes are 8, 16, 32, 64. + * + * @return the maximum packet size for endpoint zero + */ + public byte getBMaxPacketSize0() { + return bMaxPacketSize0; + } + + /** + * Returns the number of possible configurations supported at its current + * speed.
+ * + * @return the number of possible configurations supported at its current + * speed + */ + public byte getBNumConfigurations() { + return bNumConfigurations; + } + + /** + * Returns the product ID (Assigned by www.usb.org)
+ * + * @return the product ID + */ + public short getIdProduct() { + return idProduct; + } + + /** + * Returns the Vendor ID (Assigned by www.usb.org)
+ * + * @return the Vendor ID + */ + public short getIdVendor() { + return idVendor; + } + + /** + * Returns the index of the manufacturer string descriptor.
+ * If this value is 0, no string descriptor is used. + * + * @return the index of the manufacturer string descriptor + */ + public byte getIManufacturer() { + return iManufacturer; + } + + /** + * Returns the index of the product string descriptor.
+ * If this value is 0, no string descriptor is used. + * + * @return the index of the product string descriptor + */ + public byte getIProduct() { + return iProduct; + } + + /** + * Returns the index of serial number string descriptor.
+ * If this value is 0, no string descriptor is used. + * + * @return the index of serial number string descriptor + */ + public byte getISerialNumber() { + return iSerialNumber; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("Usb_Device_Descriptor idVendor: 0x" + + Integer.toHexString(idVendor & 0xFFFF) + ", idProduct: 0x" + + Integer.toHexString(idProduct & 0xFFFF)); + return sb.toString(); + } } \ No newline at end of file diff --git a/java/src/ch/ntb/usb/Usb_Endpoint_Descriptor.java b/src/main/java/ch/ntb/usb.r273/Usb_Endpoint_Descriptor.java similarity index 96% rename from java/src/ch/ntb/usb/Usb_Endpoint_Descriptor.java rename to src/main/java/ch/ntb/usb.r273/Usb_Endpoint_Descriptor.java index 049cbd4..00e4bbc 100644 --- a/java/src/ch/ntb/usb/Usb_Endpoint_Descriptor.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Endpoint_Descriptor.java @@ -1,158 +1,158 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents the descriptor of an USB endpoint.
- * Endpoint descriptors are used to describe endpoints other than endpoint zero. - * Endpoint zero is always assumed to be a control endpoint and is configured - * before any descriptors are even requested. The host will use the information - * returned from these descriptors to determine the bandwidth requirements of - * the bus.
- *
- * The length of the configuration descriptor is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_ENDPOINT_SIZE} and the type is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_ENDPOINT}. - * - */ -public class Usb_Endpoint_Descriptor extends Usb_Descriptor { - - /** - * Maximum number of endpoints - */ - public static final int USB_MAXENDPOINTS = 32; - - /** - * Endpoint address mask (in bEndpointAddress). - */ - public static final int USB_ENDPOINT_ADDRESS_MASK = 0x0f, - USB_ENDPOINT_DIR_MASK = 0x80; - - /** - * Endpoint type mask (in bmAttributes). - */ - public static final int USB_ENDPOINT_TYPE_MASK = 0x03; - - /** - * Possible endpoint types (in bmAttributes). - */ - public static final int USB_ENDPOINT_TYPE_CONTROL = 0, - USB_ENDPOINT_TYPE_ISOCHRONOUS = 1, USB_ENDPOINT_TYPE_BULK = 2, - USB_ENDPOINT_TYPE_INTERRUPT = 3; - - private byte bEndpointAddress; - - private byte bmAttributes; - - private short wMaxPacketSize; - - private byte bInterval; - - private byte bRefresh; - - private byte bSynchAddress; - - private byte[] extra; /* Extra descriptors */ - - private int extralen; - - /** - * Returns the endpoint address.
- *
- * Bits 3..0: Endpoint number
- * Bits 6..4: Reserved. Set to zero
- * Bit 7: Direction (host to device). 0 = OUT (send data from host to - * device), 1 = IN (host receives data from device). Note: these values are - * ignored for control endpoints.
- * - * @return the endpoint address - */ - public byte getBEndpointAddress() { - return bEndpointAddress; - } - - /** - * Returns the intervall for polling endpoint data transfers.
- * Value in frame counts. Ignored for Bulk & Control eEndpoints. Isochronous - * endpoints must equal 1 and field may range from 1 to 255 for interrupt - * endpoints. - * - * @return the intervall for polling endpoint data transfers - */ - public byte getBInterval() { - return bInterval; - } - - /** - * Returns the attributes of this endpoint.
- * - * Bits 1..0: Transfer Type (see USB_ENDPOINT_TYPE_XXX).
- * Bits 7..2: Reserved.
- * - *
-	 * 	If isochronous endpoint:
-	 * 		Bits 3..2: Synchronisation type
-	 *  		00 = No synchronisation
-	 * 			01 = Asynchronous
-	 *          10 = Adaptive
-	 *          11 = Synchronous
-	 *     	Bits 5..4: Usage Type
-	 *      	00 = Data endpoint
-	 *      	01 = Feedback endpoint
-	 *      	10 = Explicit feedback data endpoint
-	 *      	11 = Reserved
-	 * 
- * - * @return the attributes of this endpoint - */ - public byte getBmAttributes() { - return bmAttributes; - } - - public byte getBRefresh() { - return bRefresh; - } - - public byte getBSynchAddress() { - return bSynchAddress; - } - - /** - * Returns the data of extra descriptor(s) if available.
- * - * @return null or a byte array with the extra descriptor data - */ - public byte[] getExtra() { - return extra; - } - - /** - * Returns the number of bytes of the extra descriptor.
- * - * @return the number of bytes of the extra descriptor - */ - public int getExtralen() { - return extralen; - } - - /** - * Returns the maximum packet size of this endpoint is capable of sending or - * receiving.
- * - * @return the maximum packet size - */ - public short getWMaxPacketSize() { - return wMaxPacketSize; - } - - @Override - public String toString() { - return "Usb_Endpoint_Descriptor bEndpointAddress: 0x" - + Integer.toHexString(bEndpointAddress & 0xFF); - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents the descriptor of an USB endpoint.
+ * Endpoint descriptors are used to describe endpoints other than endpoint zero. + * Endpoint zero is always assumed to be a control endpoint and is configured + * before any descriptors are even requested. The host will use the information + * returned from these descriptors to determine the bandwidth requirements of + * the bus.
+ *
+ * The length of the configuration descriptor is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_ENDPOINT_SIZE} and the type is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_ENDPOINT}. + * + */ +public class Usb_Endpoint_Descriptor extends Usb_Descriptor { + + /** + * Maximum number of endpoints + */ + public static final int USB_MAXENDPOINTS = 32; + + /** + * Endpoint address mask (in bEndpointAddress). + */ + public static final int USB_ENDPOINT_ADDRESS_MASK = 0x0f, + USB_ENDPOINT_DIR_MASK = 0x80; + + /** + * Endpoint type mask (in bmAttributes). + */ + public static final int USB_ENDPOINT_TYPE_MASK = 0x03; + + /** + * Possible endpoint types (in bmAttributes). + */ + public static final int USB_ENDPOINT_TYPE_CONTROL = 0, + USB_ENDPOINT_TYPE_ISOCHRONOUS = 1, USB_ENDPOINT_TYPE_BULK = 2, + USB_ENDPOINT_TYPE_INTERRUPT = 3; + + private byte bEndpointAddress; + + private byte bmAttributes; + + private short wMaxPacketSize; + + private byte bInterval; + + private byte bRefresh; + + private byte bSynchAddress; + + private byte[] extra; /* Extra descriptors */ + + private int extralen; + + /** + * Returns the endpoint address.
+ *
+ * Bits 3..0: Endpoint number
+ * Bits 6..4: Reserved. Set to zero
+ * Bit 7: Direction (host to device). 0 = OUT (send data from host to + * device), 1 = IN (host receives data from device). Note: these values are + * ignored for control endpoints.
+ * + * @return the endpoint address + */ + public byte getBEndpointAddress() { + return bEndpointAddress; + } + + /** + * Returns the intervall for polling endpoint data transfers.
+ * Value in frame counts. Ignored for Bulk & Control eEndpoints. Isochronous + * endpoints must equal 1 and field may range from 1 to 255 for interrupt + * endpoints. + * + * @return the intervall for polling endpoint data transfers + */ + public byte getBInterval() { + return bInterval; + } + + /** + * Returns the attributes of this endpoint.
+ * + * Bits 1..0: Transfer Type (see USB_ENDPOINT_TYPE_XXX).
+ * Bits 7..2: Reserved.
+ * + *
+	 * 	If isochronous endpoint:
+	 * 		Bits 3..2: Synchronisation type
+	 *  		00 = No synchronisation
+	 * 			01 = Asynchronous
+	 *          10 = Adaptive
+	 *          11 = Synchronous
+	 *     	Bits 5..4: Usage Type
+	 *      	00 = Data endpoint
+	 *      	01 = Feedback endpoint
+	 *      	10 = Explicit feedback data endpoint
+	 *      	11 = Reserved
+	 * 
+ * + * @return the attributes of this endpoint + */ + public byte getBmAttributes() { + return bmAttributes; + } + + public byte getBRefresh() { + return bRefresh; + } + + public byte getBSynchAddress() { + return bSynchAddress; + } + + /** + * Returns the data of extra descriptor(s) if available.
+ * + * @return null or a byte array with the extra descriptor data + */ + public byte[] getExtra() { + return extra; + } + + /** + * Returns the number of bytes of the extra descriptor.
+ * + * @return the number of bytes of the extra descriptor + */ + public int getExtralen() { + return extralen; + } + + /** + * Returns the maximum packet size of this endpoint is capable of sending or + * receiving.
+ * + * @return the maximum packet size + */ + public short getWMaxPacketSize() { + return wMaxPacketSize; + } + + @Override + public String toString() { + return "Usb_Endpoint_Descriptor bEndpointAddress: 0x" + + Integer.toHexString(bEndpointAddress & 0xFF); + } +} diff --git a/java/src/ch/ntb/usb/Usb_Interface.java b/src/main/java/ch/ntb/usb.r273/Usb_Interface.java similarity index 95% rename from java/src/ch/ntb/usb/Usb_Interface.java rename to src/main/java/ch/ntb/usb.r273/Usb_Interface.java index 4ea724a..a8bb6bc 100644 --- a/java/src/ch/ntb/usb/Usb_Interface.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Interface.java @@ -1,50 +1,50 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents an USB interface.
- * An interface is a group of alternate settings of a configuration.
- * - */ -public class Usb_Interface { - - /** - * Maximal number of alternate settings - */ - public static final int USB_MAXALTSETTING = 128; /* Hard limit */ - - private Usb_Interface_Descriptor[] altsetting; - - private int num_altsetting; - - @Override - public String toString() { - return "Usb_Interface num_altsetting: 0x" - + Integer.toHexString(num_altsetting); - } - - /** - * Retuns an array of interface descriptors.
- * - * @return an array of interface descriptors - */ - public Usb_Interface_Descriptor[] getAltsetting() { - return altsetting; - } - - /** - * Returns the number of alternate settings.
- * - * @return the number of alternate settings - */ - public int getNumAltsetting() { - return num_altsetting; - } - -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents an USB interface.
+ * An interface is a group of alternate settings of a configuration.
+ * + */ +public class Usb_Interface { + + /** + * Maximal number of alternate settings + */ + public static final int USB_MAXALTSETTING = 128; /* Hard limit */ + + private Usb_Interface_Descriptor[] altsetting; + + private int num_altsetting; + + @Override + public String toString() { + return "Usb_Interface num_altsetting: 0x" + + Integer.toHexString(num_altsetting); + } + + /** + * Retuns an array of interface descriptors.
+ * + * @return an array of interface descriptors + */ + public Usb_Interface_Descriptor[] getAltsetting() { + return altsetting; + } + + /** + * Returns the number of alternate settings.
+ * + * @return the number of alternate settings + */ + public int getNumAltsetting() { + return num_altsetting; + } + +} diff --git a/java/src/ch/ntb/usb/Usb_Interface_Descriptor.java b/src/main/java/ch/ntb/usb.r273/Usb_Interface_Descriptor.java similarity index 95% rename from java/src/ch/ntb/usb/Usb_Interface_Descriptor.java rename to src/main/java/ch/ntb/usb.r273/Usb_Interface_Descriptor.java index 683f143..a36d3ed 100644 --- a/java/src/ch/ntb/usb/Usb_Interface_Descriptor.java +++ b/src/main/java/ch/ntb/usb.r273/Usb_Interface_Descriptor.java @@ -1,145 +1,145 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -/** - * Represents the descriptor of a USB interface.
- * The interface descriptor could be seen as a header or grouping of the - * endpoints into a functional group performing a single feature of the device.
- *
- * The length of the interface descriptor is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_INTERFACE_SIZE} and the type is - * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_INTERFACE}. - * - */ -public class Usb_Interface_Descriptor extends Usb_Descriptor { - - /** - * Maximum number of interfaces - */ - public static final int USB_MAXINTERFACES = 32; - - private byte bInterfaceNumber; - - private byte bAlternateSetting; - - private byte bNumEndpoints; - - private byte bInterfaceClass; - - private byte bInterfaceSubClass; - - private byte bInterfaceProtocol; - - private byte iInterface; - - private Usb_Endpoint_Descriptor[] endpoint; - - private byte[] extra; /* Extra descriptors */ - - private int extralen; - - @Override - public String toString() { - return "Usb_Interface_Descriptor bNumEndpoints: 0x" - + Integer.toHexString(bNumEndpoints); - } - - /** - * Returns the value used to select the alternate setting ({@link LibusbJava#usb_set_altinterface(long, int)}).
- * - * @return the alternate setting - */ - public byte getBAlternateSetting() { - return bAlternateSetting; - } - - /** - * Returns the class code (Assigned by www.usb.org).
- * - * @return the class code - */ - public byte getBInterfaceClass() { - return bInterfaceClass; - } - - /** - * Returns the number (identifier) of this interface.
- * - * @return the number (identifier) of this interface - */ - public byte getBInterfaceNumber() { - return bInterfaceNumber; - } - - /** - * Returns the protocol code (Assigned by www.usb.org).
- * - * @return the protocol code - */ - public byte getBInterfaceProtocol() { - return bInterfaceProtocol; - } - - /** - * Returns the subclass code (Assigned by www.usb.org).
- * - * @return the subclass code - */ - public byte getBInterfaceSubClass() { - return bInterfaceSubClass; - } - - /** - * Returns the number of endpoints used for this interface.
- * - * @return the number of endpoints used for this interface - */ - public byte getBNumEndpoints() { - return bNumEndpoints; - } - - /** - * Returns an array of endpoint descriptors.
- * - * @return an array of endpoint descriptors - */ - public Usb_Endpoint_Descriptor[] getEndpoint() { - return endpoint; - } - - /** - * Returns the data of extra descriptor(s) if available.
- * - * @return null or a byte array with the extra descriptor data - */ - public byte[] getExtra() { - return extra; - } - - /** - * Returns the number of bytes of the extra descriptor.
- * - * @return the number of bytes of the extra descriptor - */ - public int getExtralen() { - return extralen; - } - - /** - * Returns the index of the String descriptor describing this interface.
- * - * @return the index of the String descriptor - */ - public byte getIInterface() { - return iInterface; - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +/** + * Represents the descriptor of a USB interface.
+ * The interface descriptor could be seen as a header or grouping of the + * endpoints into a functional group performing a single feature of the device.
+ *
+ * The length of the interface descriptor is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_INTERFACE_SIZE} and the type is + * {@link ch.ntb.usb.Usb_Descriptor#USB_DT_INTERFACE}. + * + */ +public class Usb_Interface_Descriptor extends Usb_Descriptor { + + /** + * Maximum number of interfaces + */ + public static final int USB_MAXINTERFACES = 32; + + private byte bInterfaceNumber; + + private byte bAlternateSetting; + + private byte bNumEndpoints; + + private byte bInterfaceClass; + + private byte bInterfaceSubClass; + + private byte bInterfaceProtocol; + + private byte iInterface; + + private Usb_Endpoint_Descriptor[] endpoint; + + private byte[] extra; /* Extra descriptors */ + + private int extralen; + + @Override + public String toString() { + return "Usb_Interface_Descriptor bNumEndpoints: 0x" + + Integer.toHexString(bNumEndpoints); + } + + /** + * Returns the value used to select the alternate setting ({@link LibusbJava#usb_set_altinterface(long, int)}).
+ * + * @return the alternate setting + */ + public byte getBAlternateSetting() { + return bAlternateSetting; + } + + /** + * Returns the class code (Assigned by www.usb.org).
+ * + * @return the class code + */ + public byte getBInterfaceClass() { + return bInterfaceClass; + } + + /** + * Returns the number (identifier) of this interface.
+ * + * @return the number (identifier) of this interface + */ + public byte getBInterfaceNumber() { + return bInterfaceNumber; + } + + /** + * Returns the protocol code (Assigned by www.usb.org).
+ * + * @return the protocol code + */ + public byte getBInterfaceProtocol() { + return bInterfaceProtocol; + } + + /** + * Returns the subclass code (Assigned by www.usb.org).
+ * + * @return the subclass code + */ + public byte getBInterfaceSubClass() { + return bInterfaceSubClass; + } + + /** + * Returns the number of endpoints used for this interface.
+ * + * @return the number of endpoints used for this interface + */ + public byte getBNumEndpoints() { + return bNumEndpoints; + } + + /** + * Returns an array of endpoint descriptors.
+ * + * @return an array of endpoint descriptors + */ + public Usb_Endpoint_Descriptor[] getEndpoint() { + return endpoint; + } + + /** + * Returns the data of extra descriptor(s) if available.
+ * + * @return null or a byte array with the extra descriptor data + */ + public byte[] getExtra() { + return extra; + } + + /** + * Returns the number of bytes of the extra descriptor.
+ * + * @return the number of bytes of the extra descriptor + */ + public int getExtralen() { + return extralen; + } + + /** + * Returns the index of the String descriptor describing this interface.
+ * + * @return the index of the String descriptor + */ + public byte getIInterface() { + return iInterface; + } +} diff --git a/java/src/ch/ntb/usb/Utils.java b/src/main/java/ch/ntb/usb.r273/Utils.java similarity index 96% rename from java/src/ch/ntb/usb/Utils.java rename to src/main/java/ch/ntb/usb.r273/Utils.java index e14591d..d13a5ba 100644 --- a/java/src/ch/ntb/usb/Utils.java +++ b/src/main/java/ch/ntb/usb.r273/Utils.java @@ -1,60 +1,60 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb; - -import java.io.PrintStream; - -public class Utils { - - public static void logBus(Usb_Bus bus) { - logBus(bus, System.out); - } - - public static void logBus(Usb_Bus bus, PrintStream out) { - Usb_Bus usb_Bus = bus; - while (usb_Bus != null) { - out.println(usb_Bus.toString()); - Usb_Device dev = usb_Bus.getDevices(); - while (dev != null) { - out.println("\t" + dev.toString()); - // Usb_Device_Descriptor - Usb_Device_Descriptor defDesc = dev.getDescriptor(); - out.println("\t\t" + defDesc.toString()); - // Usb_Config_Descriptor - Usb_Config_Descriptor[] confDesc = dev.getConfig(); - for (int i = 0; i < confDesc.length; i++) { - out.println("\t\t" + confDesc[i].toString()); - Usb_Interface[] int_ = confDesc[i].getInterface(); - if (int_ != null) { - for (int j = 0; j < int_.length; j++) { - out.println("\t\t\t" + int_[j].toString()); - Usb_Interface_Descriptor[] intDesc = int_[j] - .getAltsetting(); - if (intDesc != null) { - for (int k = 0; k < intDesc.length; k++) { - out.println("\t\t\t\t" - + intDesc[k].toString()); - Usb_Endpoint_Descriptor[] epDesc = intDesc[k] - .getEndpoint(); - if (epDesc != null) { - for (int e = 0; e < epDesc.length; e++) { - out.println("\t\t\t\t\t" - + epDesc[e].toString()); - } - } - } - } - } - } - } - dev = dev.getNext(); - } - usb_Bus = usb_Bus.getNext(); - } - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb; + +import java.io.PrintStream; + +public class Utils { + + public static void logBus(Usb_Bus bus) { + logBus(bus, System.out); + } + + public static void logBus(Usb_Bus bus, PrintStream out) { + Usb_Bus usb_Bus = bus; + while (usb_Bus != null) { + out.println(usb_Bus.toString()); + Usb_Device dev = usb_Bus.getDevices(); + while (dev != null) { + out.println("\t" + dev.toString()); + // Usb_Device_Descriptor + Usb_Device_Descriptor defDesc = dev.getDescriptor(); + out.println("\t\t" + defDesc.toString()); + // Usb_Config_Descriptor + Usb_Config_Descriptor[] confDesc = dev.getConfig(); + for (int i = 0; i < confDesc.length; i++) { + out.println("\t\t" + confDesc[i].toString()); + Usb_Interface[] int_ = confDesc[i].getInterface(); + if (int_ != null) { + for (int j = 0; j < int_.length; j++) { + out.println("\t\t\t" + int_[j].toString()); + Usb_Interface_Descriptor[] intDesc = int_[j] + .getAltsetting(); + if (intDesc != null) { + for (int k = 0; k < intDesc.length; k++) { + out.println("\t\t\t\t" + + intDesc[k].toString()); + Usb_Endpoint_Descriptor[] epDesc = intDesc[k] + .getEndpoint(); + if (epDesc != null) { + for (int e = 0; e < epDesc.length; e++) { + out.println("\t\t\t\t\t" + + epDesc[e].toString()); + } + } + } + } + } + } + } + dev = dev.getNext(); + } + usb_Bus = usb_Bus.getNext(); + } + } +} diff --git a/java/src/ch/ntb/usb/logger/LogUtil.java b/src/main/java/ch/ntb/usb.r273/logger/LogUtil.java similarity index 96% rename from java/src/ch/ntb/usb/logger/LogUtil.java rename to src/main/java/ch/ntb/usb.r273/logger/LogUtil.java index f227a14..998b602 100644 --- a/java/src/ch/ntb/usb/logger/LogUtil.java +++ b/src/main/java/ch/ntb/usb.r273/logger/LogUtil.java @@ -1,135 +1,135 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.logger; - -import java.io.InputStream; -import java.util.Properties; -import java.util.logging.ConsoleHandler; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogManager; -import java.util.logging.Logger; - -public class LogUtil { - - // debug this class - private static final boolean debugLogUtil = false; - - private static final String PLUGIN_ID = "ch.ntb.usb"; - private static final String PROPERTIES_FILE = ".configure"; - private static final String LOGGER_WARNING = "Warning in class " - + LogUtil.class.getName() - + ": could not load the logger properties file " + PROPERTIES_FILE; - - private static boolean debugEnabled; - - static { - createLoggersFromProperties(); - } - - private static void debugMsg(String method, String message) { - if (debugLogUtil) { - System.out.println(method + ": " + message); - } - } - - public static void setLevel(Logger logger, Level loglevel) { - Handler[] h = logger.getHandlers(); - for (int i = 0; i < h.length; i++) { - System.out.println("setLevel " + loglevel.toString()); - h[i].setLevel(loglevel); - } - logger.setLevel(loglevel); - } - - public static Logger getLogger(String name) { - debugMsg("getLogger", name); - LogManager manager = LogManager.getLogManager(); - // check if logger is already registered - Logger logger = manager.getLogger(name); - if (logger == null) { - logger = Logger.getLogger(name); - setLevel(logger, Level.OFF); - manager.addLogger(logger); - debugMsg("getLogger", "creating new logger"); - } - if (logger.getLevel() == null) { - debugMsg("getLogger", "level == null -> setLevel to OFF "); - setLevel(logger, Level.OFF); - } - debugMsg("getLogger", "logLevel " + logger.getLevel().getName()); - return logger; - } - - private static void initLevel(Logger logger, Level loglevel) { - Handler[] h = logger.getHandlers(); - for (int i = 0; i < h.length; i++) { - logger.removeHandler(h[i]); - } - Handler console = new ConsoleHandler(); - console.setLevel(loglevel); - logger.addHandler(console); - logger.setLevel(loglevel); - logger.setUseParentHandlers(false); - } - - private static void createLoggersFromProperties() { - try { - debugMsg(LogUtil.class.getName(), "createLoggersFromProperties"); - InputStream is = LogUtil.class.getClassLoader() - .getResourceAsStream(PROPERTIES_FILE); - if (is == null) { - System.err.println(LOGGER_WARNING); - } else { - Properties prop = new Properties(); - prop.load(is); - debugMsg("createLoggersFromProperties", - "properties file loaded: " + PROPERTIES_FILE); - debugMsg("createLoggersFromProperties", "file content:\n" - + prop.toString()); - // get global debug enable flag - debugEnabled = Boolean.parseBoolean(prop.getProperty(PLUGIN_ID - + "/debug")); - debugMsg("createLoggersFromProperties", "debuging enabled: " - + debugEnabled); - // get and configure loggers - boolean moreLoggers = true; - int loggerCount = 0; - while (moreLoggers) { - String loggerProp = prop.getProperty(PLUGIN_ID - + "/debug/logger" + loggerCount); - loggerCount++; - if (loggerProp != null) { - // parse string and get logger name and log level - int slashIndex = loggerProp.indexOf('/'); - String loggerName = loggerProp.substring(0, slashIndex) - .trim(); - String logLevel = loggerProp.substring(slashIndex + 1, - loggerProp.length()); - // register logger - Level level; - if (debugEnabled) { - level = Level.parse(logLevel); - } else { - level = Level.OFF; - } - Logger logger = getLogger(loggerName); - initLevel(logger, level); - debugMsg("createLoggersFromProperties", - "create logger " + loggerName + " with level " - + level.toString()); - } else { - moreLoggers = false; - } - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb.logger; + +import java.io.InputStream; +import java.util.Properties; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; + +public class LogUtil { + + // debug this class + private static final boolean debugLogUtil = false; + + private static final String PLUGIN_ID = "ch.ntb.usb"; + private static final String PROPERTIES_FILE = ".configure"; + private static final String LOGGER_WARNING = "Warning in class " + + LogUtil.class.getName() + + ": could not load the logger properties file " + PROPERTIES_FILE; + + private static boolean debugEnabled; + + static { + createLoggersFromProperties(); + } + + private static void debugMsg(String method, String message) { + if (debugLogUtil) { + System.out.println(method + ": " + message); + } + } + + public static void setLevel(Logger logger, Level loglevel) { + Handler[] h = logger.getHandlers(); + for (int i = 0; i < h.length; i++) { + System.out.println("setLevel " + loglevel.toString()); + h[i].setLevel(loglevel); + } + logger.setLevel(loglevel); + } + + public static Logger getLogger(String name) { + debugMsg("getLogger", name); + LogManager manager = LogManager.getLogManager(); + // check if logger is already registered + Logger logger = manager.getLogger(name); + if (logger == null) { + logger = Logger.getLogger(name); + setLevel(logger, Level.OFF); + manager.addLogger(logger); + debugMsg("getLogger", "creating new logger"); + } + if (logger.getLevel() == null) { + debugMsg("getLogger", "level == null -> setLevel to OFF "); + setLevel(logger, Level.OFF); + } + debugMsg("getLogger", "logLevel " + logger.getLevel().getName()); + return logger; + } + + private static void initLevel(Logger logger, Level loglevel) { + Handler[] h = logger.getHandlers(); + for (int i = 0; i < h.length; i++) { + logger.removeHandler(h[i]); + } + Handler console = new ConsoleHandler(); + console.setLevel(loglevel); + logger.addHandler(console); + logger.setLevel(loglevel); + logger.setUseParentHandlers(false); + } + + private static void createLoggersFromProperties() { + try { + debugMsg(LogUtil.class.getName(), "createLoggersFromProperties"); + InputStream is = LogUtil.class.getClassLoader() + .getResourceAsStream(PROPERTIES_FILE); + if (is == null) { + System.err.println(LOGGER_WARNING); + } else { + Properties prop = new Properties(); + prop.load(is); + debugMsg("createLoggersFromProperties", + "properties file loaded: " + PROPERTIES_FILE); + debugMsg("createLoggersFromProperties", "file content:\n" + + prop.toString()); + // get global debug enable flag + debugEnabled = Boolean.parseBoolean(prop.getProperty(PLUGIN_ID + + "/debug")); + debugMsg("createLoggersFromProperties", "debuging enabled: " + + debugEnabled); + // get and configure loggers + boolean moreLoggers = true; + int loggerCount = 0; + while (moreLoggers) { + String loggerProp = prop.getProperty(PLUGIN_ID + + "/debug/logger" + loggerCount); + loggerCount++; + if (loggerProp != null) { + // parse string and get logger name and log level + int slashIndex = loggerProp.indexOf('/'); + String loggerName = loggerProp.substring(0, slashIndex) + .trim(); + String logLevel = loggerProp.substring(slashIndex + 1, + loggerProp.length()); + // register logger + Level level; + if (debugEnabled) { + level = Level.parse(logLevel); + } else { + level = Level.OFF; + } + Logger logger = getLogger(loggerName); + initLevel(logger, level); + debugMsg("createLoggersFromProperties", + "create logger " + loggerName + " with level " + + level.toString()); + } else { + moreLoggers = false; + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/java/src/ch/ntb/usb/logger/package.html b/src/main/java/ch/ntb/usb.r273/logger/package.html similarity index 94% rename from java/src/ch/ntb/usb/logger/package.html rename to src/main/java/ch/ntb/usb.r273/logger/package.html index 0fbe441..fe57a92 100644 --- a/java/src/ch/ntb/usb/logger/package.html +++ b/src/main/java/ch/ntb/usb.r273/logger/package.html @@ -1,16 +1,16 @@ - - - - - -Logging related classes. - -

Related Resources

- -For more information about this project visit -http://libusbjava.sourceforge.net -. - - - + + + + + +Logging related classes. + +

Related Resources

+ +For more information about this project visit +http://libusbjava.sourceforge.net +. + + + diff --git a/java/src/ch/ntb/usb/package.html b/src/main/java/ch/ntb/usb.r273/package.html similarity index 95% rename from java/src/ch/ntb/usb/package.html rename to src/main/java/ch/ntb/usb.r273/package.html index e698310..147866d 100644 --- a/java/src/ch/ntb/usb/package.html +++ b/src/main/java/ch/ntb/usb.r273/package.html @@ -1,26 +1,26 @@ - - - - - -Includes the main classes for the Java libusb wrapper. -
-LibusbJava.java -is the JNI class to the -LibusbJava.dll -. Every class starting with -Usb_ -represents a descriptor of the bus structure which is retrieved by -calling -LibusbJava.usb_get_busses() -. - -

Related Resources

- -For more information about this project visit -http://libusbjava.sourceforge.net -. - - - + + + + + +Includes the main classes for the Java libusb wrapper. +
+LibusbJava.java +is the JNI class to the +LibusbJava.dll +. Every class starting with +Usb_ +represents a descriptor of the bus structure which is retrieved by +calling +LibusbJava.usb_get_busses() +. + +

Related Resources

+ +For more information about this project visit +http://libusbjava.sourceforge.net +. + + + diff --git a/java/src/ch/ntb/usb/usbView/UsbTreeModel.java b/src/main/java/ch/ntb/usb.r273/usbView/UsbTreeModel.java similarity index 97% rename from java/src/ch/ntb/usb/usbView/UsbTreeModel.java rename to src/main/java/ch/ntb/usb.r273/usbView/UsbTreeModel.java index 26ddb43..8e4b1ca 100644 --- a/java/src/ch/ntb/usb/usbView/UsbTreeModel.java +++ b/src/main/java/ch/ntb/usb.r273/usbView/UsbTreeModel.java @@ -1,495 +1,495 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.usbView; - -import java.util.Vector; - -import javax.swing.JTextArea; -import javax.swing.JTree; -import javax.swing.event.TreeModelEvent; -import javax.swing.event.TreeModelListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.TreeModel; -import javax.swing.tree.TreePath; - -import ch.ntb.usb.LibusbJava; -import ch.ntb.usb.Usb_Bus; -import ch.ntb.usb.Usb_Config_Descriptor; -import ch.ntb.usb.Usb_Device; -import ch.ntb.usb.Usb_Device_Descriptor; -import ch.ntb.usb.Usb_Endpoint_Descriptor; -import ch.ntb.usb.Usb_Interface; -import ch.ntb.usb.Usb_Interface_Descriptor; - -public class UsbTreeModel implements TreeModel, TreeSelectionListener { - - private Usb_Bus rootBus; - - private static final String USB_ROOT = "USB"; - - private JTextArea textArea; - - private Vector treeModelListeners = new Vector(); - - /** - * Default constructor.
- * - * @param rootBus - * the root bus from which the data is read - * @param textArea - * the text area to which the data is written - */ - public UsbTreeModel(Usb_Bus rootBus, JTextArea textArea) { - this.rootBus = rootBus; - this.textArea = textArea; - } - - /** - * Returns the root of the tree. - */ - public Object getRoot() { - return USB_ROOT; - } - - /** - * Returns the child of parent at index index in the parent's child array. - */ - public Object getChild(Object parent, int index) { - - if (parent instanceof String && ((String) parent).compareTo(USB_ROOT) == 0) - { - Usb_Bus curBus = rootBus; - - for (int i = 0; curBus != null; curBus = curBus.getNext(), i++) - { - if (i == index) - return curBus; - } - } - - else if (parent instanceof Usb_Bus) { - Usb_Device device = ((Usb_Bus) parent).getDevices(); - int count = 0; - while (device != null) { - if (count == index) - return device; - count++; - device = device.getNext(); - } - return null; - } else if (parent instanceof Usb_Device) { - Usb_Device dev = (Usb_Device) parent; - // return the Usb_Device_Descriptor at index 0 - if (index == 0) { - return dev.getDescriptor(); - } - Usb_Config_Descriptor[] confDescs = dev.getConfig(); - if (index >= confDescs.length + 1) - return null; - return confDescs[index - 1]; - } else if (parent instanceof Usb_Config_Descriptor) { - Usb_Interface[] intDescs = ((Usb_Config_Descriptor) parent) - .getInterface(); - if (index >= intDescs.length) - return null; - return intDescs[index]; - } else if (parent instanceof Usb_Interface) { - Usb_Interface_Descriptor[] altSettings = ((Usb_Interface) parent) - .getAltsetting(); - if (index >= altSettings.length) - return null; - return altSettings[index]; - } else if (parent instanceof Usb_Interface_Descriptor) { - Usb_Endpoint_Descriptor[] endpoints = ((Usb_Interface_Descriptor) parent) - .getEndpoint(); - if (index >= endpoints.length) - return null; - return endpoints[index]; - } - return null; - } - - /** - * Returns the number of children of parent. - */ - public int getChildCount(Object parent) - { - if (parent instanceof String && ((String) parent).compareTo(USB_ROOT) == 0) - { - int count = 0; - - Usb_Bus curBus = rootBus; - - for (; curBus != null; curBus = curBus.getNext()) - { - count++; - } - - return count; - - } - else if (parent instanceof Usb_Bus) { - Usb_Device device = ((Usb_Bus) parent).getDevices(); - int count = 0; - while (device != null) { - count++; - device = device.getNext(); - } - return count; - } else if (parent instanceof Usb_Device) { - // add the Usb_Device_Descriptor - return ((Usb_Device) parent).getConfig().length + 1; - } else if (parent instanceof Usb_Config_Descriptor) { - return ((Usb_Config_Descriptor) parent).getInterface().length; - } else if (parent instanceof Usb_Interface) { - return ((Usb_Interface) parent).getAltsetting().length; - } else if (parent instanceof Usb_Interface_Descriptor) { - return ((Usb_Interface_Descriptor) parent).getEndpoint().length; - } - return 0; - } - - /** - * Returns true if node is a leaf. - */ - public boolean isLeaf(Object node) { - return false; - } - - /** - * Messaged when the user has altered the value for the item identified by - * path to newValue. Not used by this model. - */ - public void valueForPathChanged(TreePath path, Object newValue) { - System.out.println("*** valueForPathChanged : " + path + " --> " - + newValue); - } - - /** - * Returns the index of child in parent. - */ - public int getIndexOfChild(Object parent, Object child) { - return 0; - } - - public void addTreeModelListener(TreeModelListener l) { - treeModelListeners.addElement(l); - } - - public void removeTreeModelListener(TreeModelListener l) { - treeModelListeners.removeElement(l); - } - - /** - * The only event raised by this model is TreeStructureChanged with the root - * as path, i.e. the whole tree has changed. - */ - protected void fireTreeStructureChanged(Usb_Bus newRootBus) { - rootBus = newRootBus; - int len = treeModelListeners.size(); - TreeModelEvent e = new TreeModelEvent(this, new Object[] { newRootBus }); - for (int i = 0; i < len; i++) { - treeModelListeners.elementAt(i).treeStructureChanged(e); - } - } - - public void valueChanged(TreeSelectionEvent e) { - JTree tree = (JTree) e.getSource(); - Object component = tree.getLastSelectedPathComponent(); - if (component instanceof Usb_Bus) { - Usb_Bus bus = (Usb_Bus) component; - StringBuffer sb = new StringBuffer("Usb_Bus\n"); - sb.append("\tdirname: " + bus.getDirname() + "\n"); - sb.append("\tlocation: 0x" + Long.toHexString(bus.getLocation()) - + "\n"); - textArea.setText(sb.toString()); - } else if (component instanceof Usb_Device) { - Usb_Device device = (Usb_Device) component; - StringBuffer sb = new StringBuffer("Usb_Device\n"); - sb.append("\tfilename: " + device.getFilename() + "\n"); - sb.append("\tdevnum: " + device.getDevnum() + "\n"); - sb.append("\tnum_children: " + device.getNumChildren() + "\n"); - textArea.setText(sb.toString()); - } else if (component instanceof Usb_Device_Descriptor) { - Usb_Device_Descriptor devDesc = (Usb_Device_Descriptor) component; - StringBuffer sb = new StringBuffer("Usb_Device_Descriptor\n"); - sb.append("\tblenght: 0x" - + Integer.toHexString(devDesc.getBLength() & 0xFF) + "\n"); - sb.append("\tbDescriptorType: 0x" - + Integer.toHexString(devDesc.getBDescriptorType() & 0xFF) - + "\n"); - sb.append("\tbcdUSB: 0x" - + Integer.toHexString(devDesc.getBcdUSB() & 0xFFFF) + "\n"); - sb.append("\tbDeviceClass: 0x" - + Integer.toHexString(devDesc.getBDeviceClass() & 0xFF) - + "\n"); - sb.append("\tbDeviceSubClass: 0x" - + Integer.toHexString(devDesc.getBDeviceSubClass() & 0xFF) - + "\n"); - sb.append("\tbDeviceProtocol: 0x" - + Integer.toHexString(devDesc.getBDeviceProtocol() & 0xFF) - + "\n"); - sb.append("\tbMaxPacketSize0: 0x" - + Integer.toHexString(devDesc.getBMaxPacketSize0() & 0xFF) - + " (" + devDesc.getBMaxPacketSize0() + ")\n"); - sb.append("\tidVendor: 0x" - + Integer.toHexString(devDesc.getIdVendor() & 0xFFFF) - + "\n"); - sb.append("\tidProduct: 0x" - + Integer.toHexString(devDesc.getIdProduct() & 0xFFFF) - + "\n"); - sb - .append("\tbcdDevice: 0x" - + Integer - .toHexString(devDesc.getBcdDevice() & 0xFF) - + "\n"); - sb.append("\tiManufacturer: 0x" - + Integer.toHexString(devDesc.getIManufacturer() & 0xFF) - + "\n"); - sb.append("\tiProduct: 0x" - + Integer.toHexString(devDesc.getIProduct()) + "\n"); - sb.append("\tiSerialNumber: 0x" - + Integer.toHexString(devDesc.getISerialNumber() & 0xFF) - + "\n"); - sb - .append("\tbNumConfigurations: 0x" - + Integer.toHexString(devDesc - .getBNumConfigurations() & 0xFF) + "\n"); - // get device handle to retrieve string descriptors - Usb_Bus bus = rootBus; - while (bus != null) { - Usb_Device dev = bus.getDevices(); - while (dev != null) { - Usb_Device_Descriptor tmpDevDesc = dev.getDescriptor(); - if ((dev.getDescriptor() != null) - && ((dev.getDescriptor().getIManufacturer() > 0) - || (dev.getDescriptor().getIProduct() > 0) || (dev - .getDescriptor().getISerialNumber() > 0))) { - if (tmpDevDesc.equals(devDesc)) { - long handle = LibusbJava.usb_open(dev); - sb.append("\nString descriptors\n"); - if (handle <= 0) { - sb.append("\terror opening the device\n"); - break; - } - if (dev.getDescriptor().getIManufacturer() > 0) { - String manufacturer = LibusbJava - .usb_get_string_simple(handle, devDesc - .getIManufacturer()); - if (manufacturer == null) - manufacturer = "unable to fetch manufacturer string"; - sb.append("\tiManufacturer: " + manufacturer - + "\n"); - } - if (dev.getDescriptor().getIProduct() > 0) { - String product = LibusbJava - .usb_get_string_simple(handle, devDesc - .getIProduct()); - if (product == null) - product = "unable to fetch product string"; - sb.append("\tiProduct: " + product + "\n"); - } - if (dev.getDescriptor().getISerialNumber() > 0) { - String serialNumber = LibusbJava - .usb_get_string_simple(handle, devDesc - .getISerialNumber()); - if (serialNumber == null) - serialNumber = "unable to fetch serial number string"; - sb.append("\tiSerialNumber: " + serialNumber - + "\n"); - } - LibusbJava.usb_close(handle); - } - } - dev = dev.getNext(); - } - bus = bus.getNext(); - } - textArea.setText(sb.toString()); - } else if (component instanceof Usb_Config_Descriptor) { - Usb_Config_Descriptor confDesc = (Usb_Config_Descriptor) component; - StringBuffer sb = new StringBuffer("Usb_Config_Descriptor\n"); - sb.append("\tblenght: 0x" - + Integer.toHexString(confDesc.getBLength()) + "\n"); - sb.append("\tbDescriptorType: 0x" - + Integer.toHexString(confDesc.getBDescriptorType() & 0xFF) - + "\n"); - sb.append("\tbNumInterfaces: 0x" - + Integer.toHexString(confDesc.getBNumInterfaces() & 0xFF) - + "\n"); - sb - .append("\tbConfigurationValue: 0x" - + Integer.toHexString(confDesc - .getBConfigurationValue() & 0xFF) + "\n"); - sb.append("\tiConfiguration: 0x" - + Integer.toHexString(confDesc.getIConfiguration() & 0xFF) - + "\n"); - sb.append("\tbmAttributes: 0x" - + Integer.toHexString(confDesc.getBmAttributes() & 0xFF) - + "\n"); - sb.append("\tMaxPower [mA]: 0x" - + Integer.toHexString(confDesc.getMaxPower() & 0xFF) + " (" - + confDesc.getMaxPower() + ")\n"); - sb.append("\textralen: 0x" - + Integer.toHexString(confDesc.getExtralen()) + "\n"); - sb.append("\textra: " + extraDescriptorToString(confDesc.getExtra()) + "\n"); - // get device handle to retrieve string descriptors - Usb_Bus bus = rootBus; - while (bus != null) { - Usb_Device dev = bus.getDevices(); - while (dev != null) { - Usb_Config_Descriptor[] tmpConfDesc = dev.getConfig(); - for (int i = 0; i < tmpConfDesc.length; i++) { - if ((tmpConfDesc.equals(confDesc)) - && (confDesc.getIConfiguration() > 0)) { - long handle = LibusbJava.usb_open(dev); - sb.append("\nString descriptors\n"); - if (handle <= 0) { - sb.append("\terror opening the device\n"); - break; - } - String configuration = LibusbJava - .usb_get_string_simple(handle, confDesc - .getIConfiguration()); - if (configuration == null) - configuration = "unable to fetch configuration string"; - sb.append("\tiConfiguration: " + configuration - + "\n"); - - LibusbJava.usb_close(handle); - - } - } - dev = dev.getNext(); - } - bus = bus.getNext(); - } - textArea.setText(sb.toString()); - } else if (component instanceof Usb_Interface) { - Usb_Interface int_ = (Usb_Interface) component; - StringBuffer sb = new StringBuffer("Usb_Interface\n"); - sb.append("\tnum_altsetting: 0x" - + Integer.toHexString(int_.getNumAltsetting()) + "\n"); - sb.append("\taltsetting: " + int_.getAltsetting() + "\n"); - textArea.setText(sb.toString()); - } else if (component instanceof Usb_Interface_Descriptor) { - Usb_Interface_Descriptor intDesc = (Usb_Interface_Descriptor) component; - StringBuffer sb = new StringBuffer("Usb_Interface_Descriptor\n"); - sb.append("\tblenght: 0x" - + Integer.toHexString(intDesc.getBLength() & 0xFF) + "\n"); - sb.append("\tbDescriptorType: 0x" - + Integer.toHexString(intDesc.getBDescriptorType() & 0xFF) - + "\n"); - sb.append("\tbInterfaceNumber: 0x" - + Integer.toHexString(intDesc.getBInterfaceNumber() & 0xFF) - + "\n"); - sb.append("\tbAlternateSetting: 0x" - + Integer - .toHexString(intDesc.getBAlternateSetting() & 0xFF) - + "\n"); - sb.append("\tbNumEndpoints: 0x" - + Integer.toHexString(intDesc.getBNumEndpoints() & 0xFF) - + "\n"); - sb.append("\tbInterfaceClass: 0x" - + Integer.toHexString(intDesc.getBInterfaceClass() & 0xFF) - + "\n"); - sb - .append("\tbInterfaceSubClass: 0x" - + Integer.toHexString(intDesc - .getBInterfaceSubClass() & 0xFF) + "\n"); - sb - .append("\tbInterfaceProtocol: 0x" - + Integer.toHexString(intDesc - .getBInterfaceProtocol() & 0xFF) + "\n"); - sb.append("\tiInterface: 0x" - + Integer.toHexString(intDesc.getIInterface()) + "\n"); - sb.append("\textralen: 0x" - + Integer.toHexString(intDesc.getExtralen()) + "\n"); - sb.append("\textra: " + extraDescriptorToString(intDesc.getExtra()) + "\n"); - // get device handle to retrieve string descriptors - Usb_Bus bus = rootBus; - while (bus != null) { - Usb_Device dev = bus.getDevices(); - while (dev != null) { - Usb_Config_Descriptor[] confDescs = dev.getConfig(); - for (int i = 0; i < confDescs.length; i++) { - Usb_Interface[] ints = confDescs[i].getInterface(); - for (int j = 0; j < ints.length; j++) { - Usb_Interface_Descriptor[] tmpIntDescs = ints[j] - .getAltsetting(); - for (int k = 0; k < ints.length; k++) { - if (i < tmpIntDescs.length && tmpIntDescs[i].equals(intDesc) - && (intDesc.getIInterface() > 0)) { - long handle = LibusbJava.usb_open(dev); - sb.append("\nString descriptors\n"); - if (handle <= 0) { - sb - .append("\terror opening the device\n"); - break; - } - String interface_ = LibusbJava - .usb_get_string_simple(handle, - intDesc.getIInterface()); - if (interface_ == null) - interface_ = "unable to fetch interface string"; - sb.append("\tiInterface: " + interface_ - + "\n"); - LibusbJava.usb_close(handle); - } - } - } - } - dev = dev.getNext(); - } - bus = bus.getNext(); - } - textArea.setText(sb.toString()); - } else if (component instanceof Usb_Endpoint_Descriptor) { - Usb_Endpoint_Descriptor epDesc = (Usb_Endpoint_Descriptor) component; - StringBuffer sb = new StringBuffer("Usb_Endpoint_Descriptor\n"); - sb.append("\tblenght: 0x" - + Integer.toHexString(epDesc.getBLength() & 0xFF) + "\n"); - sb.append("\tbDescriptorType: 0x" - + Integer.toHexString(epDesc.getBDescriptorType() & 0xFF) - + "\n"); - sb.append("\tbEndpointAddress: 0x" - + Integer.toHexString(epDesc.getBEndpointAddress() & 0xFF) - + "\n"); - sb.append("\tbmAttributes: 0x" - + Integer.toHexString(epDesc.getBmAttributes() & 0xFF) - + "\n"); - sb.append("\twMaxPacketSize: 0x" - + Integer.toHexString(epDesc.getWMaxPacketSize() & 0xFFFF) - + " (" + epDesc.getWMaxPacketSize() + ")\n"); - sb.append("\tbInterval: 0x" - + Integer.toHexString(epDesc.getBInterval() & 0xFF) + "\n"); - sb.append("\tbRefresh: 0x" - + Integer.toHexString(epDesc.getBRefresh() & 0xFF) + "\n"); - sb.append("\tbSynchAddress: 0x" - + Integer.toHexString(epDesc.getBSynchAddress()) + "\n"); - sb.append("\textralen: 0x" - + Integer.toHexString(epDesc.getExtralen()) + "\n"); - sb.append("\textra: " + extraDescriptorToString(epDesc.getExtra()) + "\n"); - textArea.setText(sb.toString()); - } - } - - private String extraDescriptorToString(byte[] extra) { - if (extra != null) { - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < extra.length; i++) { - sb.append("0x"); - sb.append(Integer.toHexString(extra[i] & 0xff)); - sb.append(' '); - } - return sb.toString(); - } - return null; - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb.usbView; + +import java.util.Vector; + +import javax.swing.JTextArea; +import javax.swing.JTree; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; + +import ch.ntb.usb.LibusbJava; +import ch.ntb.usb.Usb_Bus; +import ch.ntb.usb.Usb_Config_Descriptor; +import ch.ntb.usb.Usb_Device; +import ch.ntb.usb.Usb_Device_Descriptor; +import ch.ntb.usb.Usb_Endpoint_Descriptor; +import ch.ntb.usb.Usb_Interface; +import ch.ntb.usb.Usb_Interface_Descriptor; + +public class UsbTreeModel implements TreeModel, TreeSelectionListener { + + private Usb_Bus rootBus; + + private static final String USB_ROOT = "USB"; + + private JTextArea textArea; + + private Vector treeModelListeners = new Vector(); + + /** + * Default constructor.
+ * + * @param rootBus + * the root bus from which the data is read + * @param textArea + * the text area to which the data is written + */ + public UsbTreeModel(Usb_Bus rootBus, JTextArea textArea) { + this.rootBus = rootBus; + this.textArea = textArea; + } + + /** + * Returns the root of the tree. + */ + public Object getRoot() { + return USB_ROOT; + } + + /** + * Returns the child of parent at index index in the parent's child array. + */ + public Object getChild(Object parent, int index) { + + if (parent instanceof String && ((String) parent).compareTo(USB_ROOT) == 0) + { + Usb_Bus curBus = rootBus; + + for (int i = 0; curBus != null; curBus = curBus.getNext(), i++) + { + if (i == index) + return curBus; + } + } + + else if (parent instanceof Usb_Bus) { + Usb_Device device = ((Usb_Bus) parent).getDevices(); + int count = 0; + while (device != null) { + if (count == index) + return device; + count++; + device = device.getNext(); + } + return null; + } else if (parent instanceof Usb_Device) { + Usb_Device dev = (Usb_Device) parent; + // return the Usb_Device_Descriptor at index 0 + if (index == 0) { + return dev.getDescriptor(); + } + Usb_Config_Descriptor[] confDescs = dev.getConfig(); + if (index >= confDescs.length + 1) + return null; + return confDescs[index - 1]; + } else if (parent instanceof Usb_Config_Descriptor) { + Usb_Interface[] intDescs = ((Usb_Config_Descriptor) parent) + .getInterface(); + if (index >= intDescs.length) + return null; + return intDescs[index]; + } else if (parent instanceof Usb_Interface) { + Usb_Interface_Descriptor[] altSettings = ((Usb_Interface) parent) + .getAltsetting(); + if (index >= altSettings.length) + return null; + return altSettings[index]; + } else if (parent instanceof Usb_Interface_Descriptor) { + Usb_Endpoint_Descriptor[] endpoints = ((Usb_Interface_Descriptor) parent) + .getEndpoint(); + if (index >= endpoints.length) + return null; + return endpoints[index]; + } + return null; + } + + /** + * Returns the number of children of parent. + */ + public int getChildCount(Object parent) + { + if (parent instanceof String && ((String) parent).compareTo(USB_ROOT) == 0) + { + int count = 0; + + Usb_Bus curBus = rootBus; + + for (; curBus != null; curBus = curBus.getNext()) + { + count++; + } + + return count; + + } + else if (parent instanceof Usb_Bus) { + Usb_Device device = ((Usb_Bus) parent).getDevices(); + int count = 0; + while (device != null) { + count++; + device = device.getNext(); + } + return count; + } else if (parent instanceof Usb_Device) { + // add the Usb_Device_Descriptor + return ((Usb_Device) parent).getConfig().length + 1; + } else if (parent instanceof Usb_Config_Descriptor) { + return ((Usb_Config_Descriptor) parent).getInterface().length; + } else if (parent instanceof Usb_Interface) { + return ((Usb_Interface) parent).getAltsetting().length; + } else if (parent instanceof Usb_Interface_Descriptor) { + return ((Usb_Interface_Descriptor) parent).getEndpoint().length; + } + return 0; + } + + /** + * Returns true if node is a leaf. + */ + public boolean isLeaf(Object node) { + return false; + } + + /** + * Messaged when the user has altered the value for the item identified by + * path to newValue. Not used by this model. + */ + public void valueForPathChanged(TreePath path, Object newValue) { + System.out.println("*** valueForPathChanged : " + path + " --> " + + newValue); + } + + /** + * Returns the index of child in parent. + */ + public int getIndexOfChild(Object parent, Object child) { + return 0; + } + + public void addTreeModelListener(TreeModelListener l) { + treeModelListeners.addElement(l); + } + + public void removeTreeModelListener(TreeModelListener l) { + treeModelListeners.removeElement(l); + } + + /** + * The only event raised by this model is TreeStructureChanged with the root + * as path, i.e. the whole tree has changed. + */ + protected void fireTreeStructureChanged(Usb_Bus newRootBus) { + rootBus = newRootBus; + int len = treeModelListeners.size(); + TreeModelEvent e = new TreeModelEvent(this, new Object[] { newRootBus }); + for (int i = 0; i < len; i++) { + treeModelListeners.elementAt(i).treeStructureChanged(e); + } + } + + public void valueChanged(TreeSelectionEvent e) { + JTree tree = (JTree) e.getSource(); + Object component = tree.getLastSelectedPathComponent(); + if (component instanceof Usb_Bus) { + Usb_Bus bus = (Usb_Bus) component; + StringBuffer sb = new StringBuffer("Usb_Bus\n"); + sb.append("\tdirname: " + bus.getDirname() + "\n"); + sb.append("\tlocation: 0x" + Long.toHexString(bus.getLocation()) + + "\n"); + textArea.setText(sb.toString()); + } else if (component instanceof Usb_Device) { + Usb_Device device = (Usb_Device) component; + StringBuffer sb = new StringBuffer("Usb_Device\n"); + sb.append("\tfilename: " + device.getFilename() + "\n"); + sb.append("\tdevnum: " + device.getDevnum() + "\n"); + sb.append("\tnum_children: " + device.getNumChildren() + "\n"); + textArea.setText(sb.toString()); + } else if (component instanceof Usb_Device_Descriptor) { + Usb_Device_Descriptor devDesc = (Usb_Device_Descriptor) component; + StringBuffer sb = new StringBuffer("Usb_Device_Descriptor\n"); + sb.append("\tblenght: 0x" + + Integer.toHexString(devDesc.getBLength() & 0xFF) + "\n"); + sb.append("\tbDescriptorType: 0x" + + Integer.toHexString(devDesc.getBDescriptorType() & 0xFF) + + "\n"); + sb.append("\tbcdUSB: 0x" + + Integer.toHexString(devDesc.getBcdUSB() & 0xFFFF) + "\n"); + sb.append("\tbDeviceClass: 0x" + + Integer.toHexString(devDesc.getBDeviceClass() & 0xFF) + + "\n"); + sb.append("\tbDeviceSubClass: 0x" + + Integer.toHexString(devDesc.getBDeviceSubClass() & 0xFF) + + "\n"); + sb.append("\tbDeviceProtocol: 0x" + + Integer.toHexString(devDesc.getBDeviceProtocol() & 0xFF) + + "\n"); + sb.append("\tbMaxPacketSize0: 0x" + + Integer.toHexString(devDesc.getBMaxPacketSize0() & 0xFF) + + " (" + devDesc.getBMaxPacketSize0() + ")\n"); + sb.append("\tidVendor: 0x" + + Integer.toHexString(devDesc.getIdVendor() & 0xFFFF) + + "\n"); + sb.append("\tidProduct: 0x" + + Integer.toHexString(devDesc.getIdProduct() & 0xFFFF) + + "\n"); + sb + .append("\tbcdDevice: 0x" + + Integer + .toHexString(devDesc.getBcdDevice() & 0xFF) + + "\n"); + sb.append("\tiManufacturer: 0x" + + Integer.toHexString(devDesc.getIManufacturer() & 0xFF) + + "\n"); + sb.append("\tiProduct: 0x" + + Integer.toHexString(devDesc.getIProduct()) + "\n"); + sb.append("\tiSerialNumber: 0x" + + Integer.toHexString(devDesc.getISerialNumber() & 0xFF) + + "\n"); + sb + .append("\tbNumConfigurations: 0x" + + Integer.toHexString(devDesc + .getBNumConfigurations() & 0xFF) + "\n"); + // get device handle to retrieve string descriptors + Usb_Bus bus = rootBus; + while (bus != null) { + Usb_Device dev = bus.getDevices(); + while (dev != null) { + Usb_Device_Descriptor tmpDevDesc = dev.getDescriptor(); + if ((dev.getDescriptor() != null) + && ((dev.getDescriptor().getIManufacturer() > 0) + || (dev.getDescriptor().getIProduct() > 0) || (dev + .getDescriptor().getISerialNumber() > 0))) { + if (tmpDevDesc.equals(devDesc)) { + long handle = LibusbJava.usb_open(dev); + sb.append("\nString descriptors\n"); + if (handle <= 0) { + sb.append("\terror opening the device\n"); + break; + } + if (dev.getDescriptor().getIManufacturer() > 0) { + String manufacturer = LibusbJava + .usb_get_string_simple(handle, devDesc + .getIManufacturer()); + if (manufacturer == null) + manufacturer = "unable to fetch manufacturer string"; + sb.append("\tiManufacturer: " + manufacturer + + "\n"); + } + if (dev.getDescriptor().getIProduct() > 0) { + String product = LibusbJava + .usb_get_string_simple(handle, devDesc + .getIProduct()); + if (product == null) + product = "unable to fetch product string"; + sb.append("\tiProduct: " + product + "\n"); + } + if (dev.getDescriptor().getISerialNumber() > 0) { + String serialNumber = LibusbJava + .usb_get_string_simple(handle, devDesc + .getISerialNumber()); + if (serialNumber == null) + serialNumber = "unable to fetch serial number string"; + sb.append("\tiSerialNumber: " + serialNumber + + "\n"); + } + LibusbJava.usb_close(handle); + } + } + dev = dev.getNext(); + } + bus = bus.getNext(); + } + textArea.setText(sb.toString()); + } else if (component instanceof Usb_Config_Descriptor) { + Usb_Config_Descriptor confDesc = (Usb_Config_Descriptor) component; + StringBuffer sb = new StringBuffer("Usb_Config_Descriptor\n"); + sb.append("\tblenght: 0x" + + Integer.toHexString(confDesc.getBLength()) + "\n"); + sb.append("\tbDescriptorType: 0x" + + Integer.toHexString(confDesc.getBDescriptorType() & 0xFF) + + "\n"); + sb.append("\tbNumInterfaces: 0x" + + Integer.toHexString(confDesc.getBNumInterfaces() & 0xFF) + + "\n"); + sb + .append("\tbConfigurationValue: 0x" + + Integer.toHexString(confDesc + .getBConfigurationValue() & 0xFF) + "\n"); + sb.append("\tiConfiguration: 0x" + + Integer.toHexString(confDesc.getIConfiguration() & 0xFF) + + "\n"); + sb.append("\tbmAttributes: 0x" + + Integer.toHexString(confDesc.getBmAttributes() & 0xFF) + + "\n"); + sb.append("\tMaxPower [mA]: 0x" + + Integer.toHexString(confDesc.getMaxPower() & 0xFF) + " (" + + confDesc.getMaxPower() + ")\n"); + sb.append("\textralen: 0x" + + Integer.toHexString(confDesc.getExtralen()) + "\n"); + sb.append("\textra: " + extraDescriptorToString(confDesc.getExtra()) + "\n"); + // get device handle to retrieve string descriptors + Usb_Bus bus = rootBus; + while (bus != null) { + Usb_Device dev = bus.getDevices(); + while (dev != null) { + Usb_Config_Descriptor[] tmpConfDesc = dev.getConfig(); + for (int i = 0; i < tmpConfDesc.length; i++) { + if ((tmpConfDesc.equals(confDesc)) + && (confDesc.getIConfiguration() > 0)) { + long handle = LibusbJava.usb_open(dev); + sb.append("\nString descriptors\n"); + if (handle <= 0) { + sb.append("\terror opening the device\n"); + break; + } + String configuration = LibusbJava + .usb_get_string_simple(handle, confDesc + .getIConfiguration()); + if (configuration == null) + configuration = "unable to fetch configuration string"; + sb.append("\tiConfiguration: " + configuration + + "\n"); + + LibusbJava.usb_close(handle); + + } + } + dev = dev.getNext(); + } + bus = bus.getNext(); + } + textArea.setText(sb.toString()); + } else if (component instanceof Usb_Interface) { + Usb_Interface int_ = (Usb_Interface) component; + StringBuffer sb = new StringBuffer("Usb_Interface\n"); + sb.append("\tnum_altsetting: 0x" + + Integer.toHexString(int_.getNumAltsetting()) + "\n"); + sb.append("\taltsetting: " + int_.getAltsetting() + "\n"); + textArea.setText(sb.toString()); + } else if (component instanceof Usb_Interface_Descriptor) { + Usb_Interface_Descriptor intDesc = (Usb_Interface_Descriptor) component; + StringBuffer sb = new StringBuffer("Usb_Interface_Descriptor\n"); + sb.append("\tblenght: 0x" + + Integer.toHexString(intDesc.getBLength() & 0xFF) + "\n"); + sb.append("\tbDescriptorType: 0x" + + Integer.toHexString(intDesc.getBDescriptorType() & 0xFF) + + "\n"); + sb.append("\tbInterfaceNumber: 0x" + + Integer.toHexString(intDesc.getBInterfaceNumber() & 0xFF) + + "\n"); + sb.append("\tbAlternateSetting: 0x" + + Integer + .toHexString(intDesc.getBAlternateSetting() & 0xFF) + + "\n"); + sb.append("\tbNumEndpoints: 0x" + + Integer.toHexString(intDesc.getBNumEndpoints() & 0xFF) + + "\n"); + sb.append("\tbInterfaceClass: 0x" + + Integer.toHexString(intDesc.getBInterfaceClass() & 0xFF) + + "\n"); + sb + .append("\tbInterfaceSubClass: 0x" + + Integer.toHexString(intDesc + .getBInterfaceSubClass() & 0xFF) + "\n"); + sb + .append("\tbInterfaceProtocol: 0x" + + Integer.toHexString(intDesc + .getBInterfaceProtocol() & 0xFF) + "\n"); + sb.append("\tiInterface: 0x" + + Integer.toHexString(intDesc.getIInterface()) + "\n"); + sb.append("\textralen: 0x" + + Integer.toHexString(intDesc.getExtralen()) + "\n"); + sb.append("\textra: " + extraDescriptorToString(intDesc.getExtra()) + "\n"); + // get device handle to retrieve string descriptors + Usb_Bus bus = rootBus; + while (bus != null) { + Usb_Device dev = bus.getDevices(); + while (dev != null) { + Usb_Config_Descriptor[] confDescs = dev.getConfig(); + for (int i = 0; i < confDescs.length; i++) { + Usb_Interface[] ints = confDescs[i].getInterface(); + for (int j = 0; j < ints.length; j++) { + Usb_Interface_Descriptor[] tmpIntDescs = ints[j] + .getAltsetting(); + for (int k = 0; k < ints.length; k++) { + if (i < tmpIntDescs.length && tmpIntDescs[i].equals(intDesc) + && (intDesc.getIInterface() > 0)) { + long handle = LibusbJava.usb_open(dev); + sb.append("\nString descriptors\n"); + if (handle <= 0) { + sb + .append("\terror opening the device\n"); + break; + } + String interface_ = LibusbJava + .usb_get_string_simple(handle, + intDesc.getIInterface()); + if (interface_ == null) + interface_ = "unable to fetch interface string"; + sb.append("\tiInterface: " + interface_ + + "\n"); + LibusbJava.usb_close(handle); + } + } + } + } + dev = dev.getNext(); + } + bus = bus.getNext(); + } + textArea.setText(sb.toString()); + } else if (component instanceof Usb_Endpoint_Descriptor) { + Usb_Endpoint_Descriptor epDesc = (Usb_Endpoint_Descriptor) component; + StringBuffer sb = new StringBuffer("Usb_Endpoint_Descriptor\n"); + sb.append("\tblenght: 0x" + + Integer.toHexString(epDesc.getBLength() & 0xFF) + "\n"); + sb.append("\tbDescriptorType: 0x" + + Integer.toHexString(epDesc.getBDescriptorType() & 0xFF) + + "\n"); + sb.append("\tbEndpointAddress: 0x" + + Integer.toHexString(epDesc.getBEndpointAddress() & 0xFF) + + "\n"); + sb.append("\tbmAttributes: 0x" + + Integer.toHexString(epDesc.getBmAttributes() & 0xFF) + + "\n"); + sb.append("\twMaxPacketSize: 0x" + + Integer.toHexString(epDesc.getWMaxPacketSize() & 0xFFFF) + + " (" + epDesc.getWMaxPacketSize() + ")\n"); + sb.append("\tbInterval: 0x" + + Integer.toHexString(epDesc.getBInterval() & 0xFF) + "\n"); + sb.append("\tbRefresh: 0x" + + Integer.toHexString(epDesc.getBRefresh() & 0xFF) + "\n"); + sb.append("\tbSynchAddress: 0x" + + Integer.toHexString(epDesc.getBSynchAddress()) + "\n"); + sb.append("\textralen: 0x" + + Integer.toHexString(epDesc.getExtralen()) + "\n"); + sb.append("\textra: " + extraDescriptorToString(epDesc.getExtra()) + "\n"); + textArea.setText(sb.toString()); + } + } + + private String extraDescriptorToString(byte[] extra) { + if (extra != null) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < extra.length; i++) { + sb.append("0x"); + sb.append(Integer.toHexString(extra[i] & 0xff)); + sb.append(' '); + } + return sb.toString(); + } + return null; + } +} diff --git a/java/src/ch/ntb/usb/usbView/UsbView.java b/src/main/java/ch/ntb/usb.r273/usbView/UsbView.java similarity index 96% rename from java/src/ch/ntb/usb/usbView/UsbView.java rename to src/main/java/ch/ntb/usb.r273/usbView/UsbView.java index dfeed49..c531812 100644 --- a/java/src/ch/ntb/usb/usbView/UsbView.java +++ b/src/main/java/ch/ntb/usb.r273/usbView/UsbView.java @@ -1,403 +1,403 @@ -/* - * Java libusb wrapper - * Copyright (c) 2005-2006 Andreas Schläpfer - * - * http://libusbjava.sourceforge.net - * This library is covered by the LGPL, read LGPL.txt for details. - */ -package ch.ntb.usb.usbView; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTextArea; -import javax.swing.JTree; -import javax.swing.KeyStroke; -import javax.swing.tree.TreePath; - -import ch.ntb.usb.LibusbJava; -import ch.ntb.usb.Usb_Bus; -import ch.ntb.usb.Usb_Config_Descriptor; -import ch.ntb.usb.Usb_Device; -import ch.ntb.usb.Usb_Device_Descriptor; -import ch.ntb.usb.Usb_Endpoint_Descriptor; -import ch.ntb.usb.Usb_Interface_Descriptor; -import ch.ntb.usb.testApp.TestApp; -import ch.ntb.usb.testApp.TestDevice; -import ch.ntb.usb.testApp.AbstractDeviceInfo.TransferMode; - -public class UsbView extends JFrame { - - private static final long serialVersionUID = 4693554326612734263L; - - private static final int APP_WIDTH = 600, APP_HIGHT = 800; - - private JPanel jContentPane = null; - private JMenuBar jJMenuBar = null; - private JMenu commandsMenu = null; - private JMenuItem exitMenuItem = null; - private JMenuItem updateMenuItem = null; - JTree usbTree = null; - private JSplitPane jSplitPane = null; - - private JTextArea jPropertiesArea = null; - - UsbTreeModel treeModel; - - JPopupMenu testAppPopup; - - protected JPopupMenu endpointPopup; - - /** - * This is the default constructor - */ - public UsbView() { - super(); - initialize(); - } - - /** - * This method initializes this - * - * @return void - */ - private void initialize() { - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - this.setJMenuBar(getJJMenuBar()); - this.setSize(APP_WIDTH, APP_HIGHT); - this.setContentPane(getJContentPane()); - this.setTitle("USB View"); - } - - /** - * This method initializes jContentPane - * - * @return javax.swing.JPanel - */ - private JPanel getJContentPane() { - if (jContentPane == null) { - jContentPane = new JPanel(); - jContentPane.setLayout(new BorderLayout()); - jContentPane.add(getJSplitPane(), java.awt.BorderLayout.CENTER); - } - return jContentPane; - } - - /** - * This method initializes jJMenuBar - * - * @return javax.swing.JMenuBar - */ - private JMenuBar getJJMenuBar() { - if (jJMenuBar == null) { - jJMenuBar = new JMenuBar(); - jJMenuBar.add(getFileMenu()); - } - return jJMenuBar; - } - - /** - * This method initializes jMenu - * - * @return javax.swing.JMenu - */ - private JMenu getFileMenu() { - if (commandsMenu == null) { - commandsMenu = new JMenu(); - commandsMenu.setText("Commands"); - commandsMenu.add(getUpdateMenuItem()); - commandsMenu.add(getExitMenuItem()); - } - return commandsMenu; - } - - /** - * This method initializes jMenuItem - * - * @return javax.swing.JMenuItem - */ - private JMenuItem getExitMenuItem() { - if (exitMenuItem == null) { - exitMenuItem = new JMenuItem(); - exitMenuItem.setText("Exit"); - exitMenuItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - System.exit(0); - } - }); - } - return exitMenuItem; - } - - /** - * This method initializes jMenuItem - * - * @return javax.swing.JMenuItem - */ - private JMenuItem getUpdateMenuItem() { - if (updateMenuItem == null) { - updateMenuItem = new JMenuItem(); - updateMenuItem.setText("Update"); - updateMenuItem.setAccelerator(KeyStroke.getKeyStroke( - KeyEvent.VK_F5, 0, true)); - updateMenuItem - .addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - // open bus - LibusbJava.usb_init(); - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - - Usb_Bus bus = LibusbJava.usb_get_busses(); - if (bus != null) { - treeModel.fireTreeStructureChanged(bus); - expandAll(usbTree); - } - } - }); - } - return updateMenuItem; - } - - /** - * This method initializes usbTree - * - * @return javax.swing.JTree - */ - private JTree getUsbTree() { - if (usbTree == null) { - // open bus - LibusbJava.usb_init(); - LibusbJava.usb_find_busses(); - LibusbJava.usb_find_devices(); - - Usb_Bus bus = LibusbJava.usb_get_busses(); - - treeModel = new UsbTreeModel(bus, jPropertiesArea); - usbTree = new JTree(treeModel); - expandAll(usbTree); - usbTree.addTreeSelectionListener(treeModel); - getJTestAppPopup(); - usbTree.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - if (e.isPopupTrigger()) { - Object source = e.getSource(); - if (source instanceof JTree) { - JTree tree = (JTree) source; - TreePath path = tree.getPathForLocation(e.getX(), e - .getY()); - if (path != null - && (path.getLastPathComponent() instanceof Usb_Interface_Descriptor)) { - usbTree.setSelectionPath(path); - testAppPopup.show(tree, e.getX(), e.getY()); - } - } - } - } - - @Override - public void mouseReleased(MouseEvent e) { - if (e.isPopupTrigger()) { - if (e.isPopupTrigger()) { - Object source = e.getSource(); - if (source instanceof JTree) { - JTree tree = (JTree) source; - TreePath path = tree.getPathForLocation(e - .getX(), e.getY()); - if (path != null - && (path.getLastPathComponent() instanceof Usb_Interface_Descriptor)) { - usbTree.setSelectionPath(path); - testAppPopup.show(tree, e.getX(), e.getY()); - } - } - } - } - } - }); - } - return usbTree; - } - - private void getJTestAppPopup() { - // Create the popup menu. - testAppPopup = new JPopupMenu(); - endpointPopup = new JPopupMenu(); - JMenuItem menuItem = new JMenuItem( - "Start a test application using this interface"); - menuItem.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent e) { - initAndStartTestApp(); - } - - private void initAndStartTestApp() { - JTree tree = (JTree) testAppPopup.getInvoker(); - TreePath path = tree.getSelectionPath(); - TreePath parent = path; - Usb_Endpoint_Descriptor[] endpoints = null; - int altinterface = -1; - int interface_ = -1; - int configuration = -1; - short vendorId = -1; - short productId = -1; - while (parent != null - && !(parent.getLastPathComponent() instanceof Usb_Bus)) { - Object usbObj = parent.getLastPathComponent(); - if (usbObj instanceof Usb_Interface_Descriptor) { - Usb_Interface_Descriptor usbIntDesc = (Usb_Interface_Descriptor) usbObj; - endpoints = usbIntDesc.getEndpoint(); - interface_ = usbIntDesc.getBInterfaceNumber(); - altinterface = usbIntDesc.getBAlternateSetting(); - } else if (usbObj instanceof Usb_Config_Descriptor) { - configuration = ((Usb_Config_Descriptor) usbObj) - .getBConfigurationValue(); - } else if (usbObj instanceof Usb_Device) { - Usb_Device_Descriptor devDesc = ((Usb_Device) usbObj) - .getDescriptor(); - productId = devDesc.getIdProduct(); - vendorId = devDesc.getIdVendor(); - } - parent = parent.getParentPath(); - } - if (parent != null) { - // present a dialog to select in/out endpoint - // TODO: present dialog to select in/out endpoint - Usb_Endpoint_Descriptor[] outEPs = null; - int nofOutEPs = 0; - Usb_Endpoint_Descriptor[] inEPs = null; - int nofInEPs = 0; - - if (endpoints != null) { - outEPs = new Usb_Endpoint_Descriptor[endpoints.length]; - inEPs = new Usb_Endpoint_Descriptor[endpoints.length]; - for (int i = 0; i < endpoints.length; i++) { - int epAddr = endpoints[i].getBEndpointAddress() & 0xFF; - if ((epAddr & 0x80) > 0) { - // is IN endpoint - inEPs[nofInEPs++] = endpoints[i]; - } else { - // is OUT endpoint - outEPs[nofOutEPs++] = endpoints[i]; - } - } - } - // create a new TestDevice - TestDevice testDevice = new TestDevice(); - testDevice.setIdProduct(productId); - testDevice.setIdVendor(vendorId); - testDevice.setAltinterface(altinterface); - testDevice.setConfiguration(configuration); - testDevice.setInterface(interface_); - if (inEPs != null) { - for (int i = 0; i < nofInEPs; i++) { - int type = inEPs[i].getBmAttributes() & 0x03; - switch (type) { - case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_BULK: - testDevice.setInEPBulk(inEPs[i] - .getBEndpointAddress() & 0xff); - testDevice.setInMode(TransferMode.Bulk); - break; - case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_INTERRUPT: - testDevice.setInEPInt(inEPs[i] - .getBEndpointAddress() & 0xff); - testDevice.setInMode(TransferMode.Interrupt); - break; - default: - break; - } - } - } - if (outEPs != null) { - for (int i = 0; i < nofOutEPs; i++) { - int type = outEPs[i].getBmAttributes() & 0x03; - switch (type) { - case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_BULK: - testDevice.setOutEPBulk(outEPs[i] - .getBEndpointAddress() & 0xff); - testDevice.setOutMode(TransferMode.Bulk); - break; - case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_INTERRUPT: - testDevice.setOutEPInt(outEPs[i] - .getBEndpointAddress() & 0xff); - testDevice.setOutMode(TransferMode.Interrupt); - break; - default: - break; - } - } - } - // open a new testApp - TestApp app = new TestApp(testDevice); - app.setVisible(true); - } else { - System.out.println("error, could not find device node"); - // TODO: handle error - } - } - }); - testAppPopup.add(menuItem); - } - - /** - * This method initializes jSplitPane - * - * @return javax.swing.JSplitPane - */ - private JSplitPane getJSplitPane() { - if (jSplitPane == null) { - jSplitPane = new JSplitPane(); - jSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); - jSplitPane.setContinuousLayout(true); - jSplitPane.setDividerLocation(APP_HIGHT / 2); - jSplitPane - .setBottomComponent(createScrollPane(getJPropertiesArea())); - jSplitPane.setTopComponent(createScrollPane(getUsbTree())); - } - return jSplitPane; - } - - /** - * This method initializes jPropertiesArea - * - * @return javax.swing.JTextArea - */ - private JTextArea getJPropertiesArea() { - if (jPropertiesArea == null) { - jPropertiesArea = new JTextArea(); - } - return jPropertiesArea; - } - - private JScrollPane createScrollPane(Component view) { - JScrollPane scrollPane = new JScrollPane(view); - return scrollPane; - } - - /** - * Launches this application - */ - public static void main(String[] args) { - UsbView application = new UsbView(); - application.setVisible(true); - } - - void expandAll(JTree tree) { - for (int row = 0; row < tree.getRowCount(); row++) { - tree.expandRow(row); - } - } -} +/* + * Java libusb wrapper + * Copyright (c) 2005-2006 Andreas Schläpfer + * + * http://libusbjava.sourceforge.net + * This library is covered by the LGPL, read LGPL.txt for details. + */ +package ch.ntb.usb.usbView; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTextArea; +import javax.swing.JTree; +import javax.swing.KeyStroke; +import javax.swing.tree.TreePath; + +import ch.ntb.usb.LibusbJava; +import ch.ntb.usb.Usb_Bus; +import ch.ntb.usb.Usb_Config_Descriptor; +import ch.ntb.usb.Usb_Device; +import ch.ntb.usb.Usb_Device_Descriptor; +import ch.ntb.usb.Usb_Endpoint_Descriptor; +import ch.ntb.usb.Usb_Interface_Descriptor; +import ch.ntb.usb.testApp.TestApp; +import ch.ntb.usb.testApp.TestDevice; +import ch.ntb.usb.testApp.AbstractDeviceInfo.TransferMode; + +public class UsbView extends JFrame { + + private static final long serialVersionUID = 4693554326612734263L; + + private static final int APP_WIDTH = 600, APP_HIGHT = 800; + + private JPanel jContentPane = null; + private JMenuBar jJMenuBar = null; + private JMenu commandsMenu = null; + private JMenuItem exitMenuItem = null; + private JMenuItem updateMenuItem = null; + JTree usbTree = null; + private JSplitPane jSplitPane = null; + + private JTextArea jPropertiesArea = null; + + UsbTreeModel treeModel; + + JPopupMenu testAppPopup; + + protected JPopupMenu endpointPopup; + + /** + * This is the default constructor + */ + public UsbView() { + super(); + initialize(); + } + + /** + * This method initializes this + * + * @return void + */ + private void initialize() { + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setJMenuBar(getJJMenuBar()); + this.setSize(APP_WIDTH, APP_HIGHT); + this.setContentPane(getJContentPane()); + this.setTitle("USB View"); + } + + /** + * This method initializes jContentPane + * + * @return javax.swing.JPanel + */ + private JPanel getJContentPane() { + if (jContentPane == null) { + jContentPane = new JPanel(); + jContentPane.setLayout(new BorderLayout()); + jContentPane.add(getJSplitPane(), java.awt.BorderLayout.CENTER); + } + return jContentPane; + } + + /** + * This method initializes jJMenuBar + * + * @return javax.swing.JMenuBar + */ + private JMenuBar getJJMenuBar() { + if (jJMenuBar == null) { + jJMenuBar = new JMenuBar(); + jJMenuBar.add(getFileMenu()); + } + return jJMenuBar; + } + + /** + * This method initializes jMenu + * + * @return javax.swing.JMenu + */ + private JMenu getFileMenu() { + if (commandsMenu == null) { + commandsMenu = new JMenu(); + commandsMenu.setText("Commands"); + commandsMenu.add(getUpdateMenuItem()); + commandsMenu.add(getExitMenuItem()); + } + return commandsMenu; + } + + /** + * This method initializes jMenuItem + * + * @return javax.swing.JMenuItem + */ + private JMenuItem getExitMenuItem() { + if (exitMenuItem == null) { + exitMenuItem = new JMenuItem(); + exitMenuItem.setText("Exit"); + exitMenuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + }); + } + return exitMenuItem; + } + + /** + * This method initializes jMenuItem + * + * @return javax.swing.JMenuItem + */ + private JMenuItem getUpdateMenuItem() { + if (updateMenuItem == null) { + updateMenuItem = new JMenuItem(); + updateMenuItem.setText("Update"); + updateMenuItem.setAccelerator(KeyStroke.getKeyStroke( + KeyEvent.VK_F5, 0, true)); + updateMenuItem + .addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent e) { + // open bus + LibusbJava.usb_init(); + LibusbJava.usb_find_busses(); + LibusbJava.usb_find_devices(); + + Usb_Bus bus = LibusbJava.usb_get_busses(); + if (bus != null) { + treeModel.fireTreeStructureChanged(bus); + expandAll(usbTree); + } + } + }); + } + return updateMenuItem; + } + + /** + * This method initializes usbTree + * + * @return javax.swing.JTree + */ + private JTree getUsbTree() { + if (usbTree == null) { + // open bus + LibusbJava.usb_init(); + LibusbJava.usb_find_busses(); + LibusbJava.usb_find_devices(); + + Usb_Bus bus = LibusbJava.usb_get_busses(); + + treeModel = new UsbTreeModel(bus, jPropertiesArea); + usbTree = new JTree(treeModel); + expandAll(usbTree); + usbTree.addTreeSelectionListener(treeModel); + getJTestAppPopup(); + usbTree.addMouseListener(new MouseAdapter() { + + @Override + public void mousePressed(MouseEvent e) { + if (e.isPopupTrigger()) { + Object source = e.getSource(); + if (source instanceof JTree) { + JTree tree = (JTree) source; + TreePath path = tree.getPathForLocation(e.getX(), e + .getY()); + if (path != null + && (path.getLastPathComponent() instanceof Usb_Interface_Descriptor)) { + usbTree.setSelectionPath(path); + testAppPopup.show(tree, e.getX(), e.getY()); + } + } + } + } + + @Override + public void mouseReleased(MouseEvent e) { + if (e.isPopupTrigger()) { + if (e.isPopupTrigger()) { + Object source = e.getSource(); + if (source instanceof JTree) { + JTree tree = (JTree) source; + TreePath path = tree.getPathForLocation(e + .getX(), e.getY()); + if (path != null + && (path.getLastPathComponent() instanceof Usb_Interface_Descriptor)) { + usbTree.setSelectionPath(path); + testAppPopup.show(tree, e.getX(), e.getY()); + } + } + } + } + } + }); + } + return usbTree; + } + + private void getJTestAppPopup() { + // Create the popup menu. + testAppPopup = new JPopupMenu(); + endpointPopup = new JPopupMenu(); + JMenuItem menuItem = new JMenuItem( + "Start a test application using this interface"); + menuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent e) { + initAndStartTestApp(); + } + + private void initAndStartTestApp() { + JTree tree = (JTree) testAppPopup.getInvoker(); + TreePath path = tree.getSelectionPath(); + TreePath parent = path; + Usb_Endpoint_Descriptor[] endpoints = null; + int altinterface = -1; + int interface_ = -1; + int configuration = -1; + short vendorId = -1; + short productId = -1; + while (parent != null + && !(parent.getLastPathComponent() instanceof Usb_Bus)) { + Object usbObj = parent.getLastPathComponent(); + if (usbObj instanceof Usb_Interface_Descriptor) { + Usb_Interface_Descriptor usbIntDesc = (Usb_Interface_Descriptor) usbObj; + endpoints = usbIntDesc.getEndpoint(); + interface_ = usbIntDesc.getBInterfaceNumber(); + altinterface = usbIntDesc.getBAlternateSetting(); + } else if (usbObj instanceof Usb_Config_Descriptor) { + configuration = ((Usb_Config_Descriptor) usbObj) + .getBConfigurationValue(); + } else if (usbObj instanceof Usb_Device) { + Usb_Device_Descriptor devDesc = ((Usb_Device) usbObj) + .getDescriptor(); + productId = devDesc.getIdProduct(); + vendorId = devDesc.getIdVendor(); + } + parent = parent.getParentPath(); + } + if (parent != null) { + // present a dialog to select in/out endpoint + // TODO: present dialog to select in/out endpoint + Usb_Endpoint_Descriptor[] outEPs = null; + int nofOutEPs = 0; + Usb_Endpoint_Descriptor[] inEPs = null; + int nofInEPs = 0; + + if (endpoints != null) { + outEPs = new Usb_Endpoint_Descriptor[endpoints.length]; + inEPs = new Usb_Endpoint_Descriptor[endpoints.length]; + for (int i = 0; i < endpoints.length; i++) { + int epAddr = endpoints[i].getBEndpointAddress() & 0xFF; + if ((epAddr & 0x80) > 0) { + // is IN endpoint + inEPs[nofInEPs++] = endpoints[i]; + } else { + // is OUT endpoint + outEPs[nofOutEPs++] = endpoints[i]; + } + } + } + // create a new TestDevice + TestDevice testDevice = new TestDevice(); + testDevice.setIdProduct(productId); + testDevice.setIdVendor(vendorId); + testDevice.setAltinterface(altinterface); + testDevice.setConfiguration(configuration); + testDevice.setInterface(interface_); + if (inEPs != null) { + for (int i = 0; i < nofInEPs; i++) { + int type = inEPs[i].getBmAttributes() & 0x03; + switch (type) { + case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_BULK: + testDevice.setInEPBulk(inEPs[i] + .getBEndpointAddress() & 0xff); + testDevice.setInMode(TransferMode.Bulk); + break; + case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_INTERRUPT: + testDevice.setInEPInt(inEPs[i] + .getBEndpointAddress() & 0xff); + testDevice.setInMode(TransferMode.Interrupt); + break; + default: + break; + } + } + } + if (outEPs != null) { + for (int i = 0; i < nofOutEPs; i++) { + int type = outEPs[i].getBmAttributes() & 0x03; + switch (type) { + case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_BULK: + testDevice.setOutEPBulk(outEPs[i] + .getBEndpointAddress() & 0xff); + testDevice.setOutMode(TransferMode.Bulk); + break; + case Usb_Endpoint_Descriptor.USB_ENDPOINT_TYPE_INTERRUPT: + testDevice.setOutEPInt(outEPs[i] + .getBEndpointAddress() & 0xff); + testDevice.setOutMode(TransferMode.Interrupt); + break; + default: + break; + } + } + } + // open a new testApp + TestApp app = new TestApp(testDevice); + app.setVisible(true); + } else { + System.out.println("error, could not find device node"); + // TODO: handle error + } + } + }); + testAppPopup.add(menuItem); + } + + /** + * This method initializes jSplitPane + * + * @return javax.swing.JSplitPane + */ + private JSplitPane getJSplitPane() { + if (jSplitPane == null) { + jSplitPane = new JSplitPane(); + jSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); + jSplitPane.setContinuousLayout(true); + jSplitPane.setDividerLocation(APP_HIGHT / 2); + jSplitPane + .setBottomComponent(createScrollPane(getJPropertiesArea())); + jSplitPane.setTopComponent(createScrollPane(getUsbTree())); + } + return jSplitPane; + } + + /** + * This method initializes jPropertiesArea + * + * @return javax.swing.JTextArea + */ + private JTextArea getJPropertiesArea() { + if (jPropertiesArea == null) { + jPropertiesArea = new JTextArea(); + } + return jPropertiesArea; + } + + private JScrollPane createScrollPane(Component view) { + JScrollPane scrollPane = new JScrollPane(view); + return scrollPane; + } + + /** + * Launches this application + */ + public static void main(String[] args) { + UsbView application = new UsbView(); + application.setVisible(true); + } + + void expandAll(JTree tree) { + for (int row = 0; row < tree.getRowCount(); row++) { + tree.expandRow(row); + } + } +} diff --git a/java/src/ch/ntb/usb/usbView/package.html b/src/main/java/ch/ntb/usb.r273/usbView/package.html similarity index 95% rename from java/src/ch/ntb/usb/usbView/package.html rename to src/main/java/ch/ntb/usb.r273/usbView/package.html index d5f8295..2a64b06 100644 --- a/java/src/ch/ntb/usb/usbView/package.html +++ b/src/main/java/ch/ntb/usb.r273/usbView/package.html @@ -1,17 +1,17 @@ - - - - - -Displays the bus and device information of the currently attached -devices in a tree (based on Swing). - -

Related Resources

- -For more information about this project visit -http://libusbjava.sourceforge.net -. - - - + + + + + +Displays the bus and device information of the currently attached +devices in a tree (based on Swing). + +

Related Resources

+ +For more information about this project visit +http://libusbjava.sourceforge.net +. + + +