From 0788498cac2285db441832db13ec589b5575eb31 Mon Sep 17 00:00:00 2001 From: Lo King Wei Date: Mon, 8 Nov 2021 23:16:31 +0800 Subject: [PATCH] added usbdk as backend for window --- README.md | 8 ++++++++ example/lib/main.dart | 3 ++- lib/quick_usb.dart | 3 ++- lib/src/common.dart | 7 +++++++ lib/src/quick_usb_android.dart | 2 +- lib/src/quick_usb_desktop.dart | 14 +++++++++++++- lib/src/quick_usb_platform_interface.dart | 9 ++++++--- 7 files changed, 39 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fe802f4..f27bd9c 100644 --- a/README.md +++ b/README.md @@ -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) @@ -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. diff --git a/example/lib/main.dart b/example/lib/main.dart index 1a3002f..690c9b9 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -63,7 +63,8 @@ class _MyAppState extends State { RaisedButton( child: Text('init'), onPressed: () async { - var init = await QuickUsb.init(); + var init = await QuickUsb.init( + window: QuickUsbWindowConfig(useUsbdk: true)); log('init $init'); }, ), diff --git a/lib/quick_usb.dart b/lib/quick_usb.dart index 5a2f740..7365c51 100644 --- a/lib/quick_usb.dart +++ b/lib/quick_usb.dart @@ -33,7 +33,8 @@ QuickUsbPlatform get _platform { } class QuickUsb { - static Future init() => _platform.init(); + static Future init({QuickUsbWindowConfig? window}) => + _platform.init(window: window); static Future exit() => _platform.exit(); diff --git a/lib/src/common.dart b/lib/src/common.dart index 651c0ab..5270a04 100644 --- a/lib/src/common.dart +++ b/lib/src/common.dart @@ -174,3 +174,10 @@ class UsbDeviceDescription { @override String toString() => toMap().toString(); } + +class QuickUsbWindowConfig { + bool useUsbdk; + QuickUsbWindowConfig({ + required this.useUsbdk, + }); +} diff --git a/lib/src/quick_usb_android.dart b/lib/src/quick_usb_android.dart index e4bc281..94e9ef1 100644 --- a/lib/src/quick_usb_android.dart +++ b/lib/src/quick_usb_android.dart @@ -9,7 +9,7 @@ const MethodChannel _channel = const MethodChannel('quick_usb'); class QuickUsbAndroid extends QuickUsbPlatform { @override - Future init() async { + Future init({QuickUsbWindowConfig? window}) async { return true; } diff --git a/lib/src/quick_usb_desktop.dart b/lib/src/quick_usb_desktop.dart index 33b15f5..5917840 100644 --- a/lib/src/quick_usb_desktop.dart +++ b/lib/src/quick_usb_desktop.dart @@ -32,14 +32,26 @@ class QuickUsbLinux extends _QuickUsbDesktop { class _QuickUsbDesktop extends QuickUsbPlatform { Pointer? _devHandle; + Pointer>? ctxPointer; @override - Future init() async { + Future init({QuickUsbWindowConfig? window}) async { + if (window != null) { + if (window.useUsbdk == true) { + ctxPointer = ffi.calloc>(); + _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 exit() async { + if (ctxPointer != null) { + ffi.calloc.free(ctxPointer!); + } return _libusb.libusb_exit(nullptr); } diff --git a/lib/src/quick_usb_platform_interface.dart b/lib/src/quick_usb_platform_interface.dart index eae6e31..a4d222a 100644 --- a/lib/src/quick_usb_platform_interface.dart +++ b/lib/src/quick_usb_platform_interface.dart @@ -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 { @@ -22,7 +23,7 @@ abstract class QuickUsbPlatform extends PlatformInterface { _instance = instance; } - Future init(); + Future init({QuickUsbWindowConfig? window}); Future exit(); @@ -46,9 +47,11 @@ abstract class QuickUsbPlatform extends PlatformInterface { Future releaseInterface(UsbInterface intf); - Future bulkTransferIn(UsbEndpoint endpoint, int maxLength, int timeout); + Future bulkTransferIn( + UsbEndpoint endpoint, int maxLength, int timeout); - Future bulkTransferOut(UsbEndpoint endpoint, Uint8List data, int timeout); + Future bulkTransferOut( + UsbEndpoint endpoint, Uint8List data, int timeout); Future getDeviceDescription(UsbDevice usbDevice);