Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ A cross-platform (Android/Windows/macOS/Linux) USB plugin for Flutter
## Usage

- [List devices](#list-devices)
- [Note for window](#note-for-window)
- [List devices with additional description](#list-devices-with-additional-description)
- [Get device description](#get-device-description)
- [Check/Request permission](#checkrequest-permission)
Expand All @@ -24,6 +25,13 @@ var deviceList = await QuickUsb.getDeviceList();
await QuickUsb.exit();
```

#### Note for window

libusb can utilize [USBDK](https://github.com/libusb/libusb/wiki/Windows#how-to-use-libusb-on-windows) backend to open an USB port. This allow user to skip driver installation. However, user machine are required to install UsbDk on the window device, the installer can be found on the [github release](https://github.com/daynix/UsbDk/releases)
```dart
await QuickUsb.init(window: QuickUsbWindowConfig(useUsbdk: true));
```

### List devices with additional description

Returns devices list with manufacturer, product and serial number description.
Expand Down
3 changes: 2 additions & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ class _MyAppState extends State<MyApp> {
RaisedButton(
child: Text('init'),
onPressed: () async {
var init = await QuickUsb.init();
var init = await QuickUsb.init(
window: QuickUsbWindowConfig(useUsbdk: true));
log('init $init');
},
),
Expand Down
3 changes: 2 additions & 1 deletion lib/quick_usb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ QuickUsbPlatform get _platform {
}

class QuickUsb {
static Future<bool> init() => _platform.init();
static Future<bool> init({QuickUsbWindowConfig? window}) =>
_platform.init(window: window);

static Future<void> exit() => _platform.exit();

Expand Down
7 changes: 7 additions & 0 deletions lib/src/common.dart
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,10 @@ class UsbDeviceDescription {
@override
String toString() => toMap().toString();
}

class QuickUsbWindowConfig {
bool useUsbdk;
QuickUsbWindowConfig({
required this.useUsbdk,
});
}
2 changes: 1 addition & 1 deletion lib/src/quick_usb_android.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const MethodChannel _channel = const MethodChannel('quick_usb');

class QuickUsbAndroid extends QuickUsbPlatform {
@override
Future<bool> init() async {
Future<bool> init({QuickUsbWindowConfig? window}) async {
return true;
}

Expand Down
14 changes: 13 additions & 1 deletion lib/src/quick_usb_desktop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,26 @@ class QuickUsbLinux extends _QuickUsbDesktop {

class _QuickUsbDesktop extends QuickUsbPlatform {
Pointer<libusb_device_handle>? _devHandle;
Pointer<Pointer<libusb_context>>? ctxPointer;

@override
Future<bool> init() async {
Future<bool> init({QuickUsbWindowConfig? window}) async {
if (window != null) {
if (window.useUsbdk == true) {
ctxPointer = ffi.calloc<Pointer<libusb_context>>();
_libusb.libusb_init(ctxPointer!);
_libusb.libusb_set_option(
ctxPointer!.value, libusb_option.LIBUSB_OPTION_USE_USBDK);
}
}
return _libusb.libusb_init(nullptr) == libusb_error.LIBUSB_SUCCESS;
}

@override
Future<void> exit() async {
if (ctxPointer != null) {
ffi.calloc.free(ctxPointer!);
}
return _libusb.libusb_exit(nullptr);
}

Expand Down
9 changes: 6 additions & 3 deletions lib/src/quick_usb_platform_interface.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:typed_data';

import 'package:plugin_platform_interface/plugin_platform_interface.dart';

import 'package:quick_usb/src/common.dart';

abstract class QuickUsbPlatform extends PlatformInterface {
Expand All @@ -22,7 +23,7 @@ abstract class QuickUsbPlatform extends PlatformInterface {
_instance = instance;
}

Future<bool> init();
Future<bool> init({QuickUsbWindowConfig? window});

Future<void> exit();

Expand All @@ -46,9 +47,11 @@ abstract class QuickUsbPlatform extends PlatformInterface {

Future<bool> releaseInterface(UsbInterface intf);

Future<Uint8List> bulkTransferIn(UsbEndpoint endpoint, int maxLength, int timeout);
Future<Uint8List> bulkTransferIn(
UsbEndpoint endpoint, int maxLength, int timeout);

Future<int> bulkTransferOut(UsbEndpoint endpoint, Uint8List data, int timeout);
Future<int> bulkTransferOut(
UsbEndpoint endpoint, Uint8List data, int timeout);

Future<UsbDeviceDescription> getDeviceDescription(UsbDevice usbDevice);

Expand Down