From c978441e1e462da88d2e1653af6af43164cadba9 Mon Sep 17 00:00:00 2001 From: alexklimaj Date: Fri, 26 Sep 2025 13:08:40 -0600 Subject: [PATCH 1/2] attempt to support 8devices usb2can --- dronecan_gui_tool/setup_window.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/dronecan_gui_tool/setup_window.py b/dronecan_gui_tool/setup_window.py index 227eedf..5cf0dcf 100644 --- a/dronecan_gui_tool/setup_window.py +++ b/dronecan_gui_tool/setup_window.py @@ -96,18 +96,34 @@ def list_ifaces(): # Windows, Mac, whatever from PyQt5 import QtSerialPort - out = OrderedDict() + # Collect ports with priority handling for USB2CAN adapters + priority_ports = [] # USB2CAN adapters go first + regular_ports = [] + for port in QtSerialPort.QSerialPortInfo.availablePorts(): if sys.platform == 'darwin': if 'tty' in port.systemLocation(): if port.systemLocation() not in MACOS_SERIAL_PORTS_FILTER: - out[port.systemLocation()] = port.systemLocation() + regular_ports.append((port.systemLocation(), port.systemLocation())) else: sys_name = port.systemLocation() sys_alpha = re.sub(r'[^a-zA-Z0-9]', '', sys_name) description = port.description() - # show the COM port in parentheses to make it clearer which port it is - out["%s (%s)" % (description, sys_alpha)] = sys_name + + # Special handling for 8devices Korlan USB2CAN adapter + # The Korlan appears in Windows as "USB2CAN converter" + if "USB2CAN converter" in description: + display_name = "8devices Korlan USB2CAN (%s)" % sys_alpha + priority_ports.append((display_name, sys_name)) + else: + # show the COM port in parentheses to make it clearer which port it is + display_name = "%s (%s)" % (description, sys_alpha) + regular_ports.append((display_name, sys_name)) + + # Build output with priority ports first + out = OrderedDict() + for display_name, sys_name in priority_ports + regular_ports: + out[display_name] = sys_name mifaces = _mavcan_interfaces() mifaces += ["mcast:0", "mcast:1"] From 830503574a730af81a2f0b092273c329ef7a2c56 Mon Sep 17 00:00:00 2001 From: Alex Klimaj Date: Fri, 26 Sep 2025 15:33:02 -0600 Subject: [PATCH 2/2] Support 8Devices USB2CAN in windows --- README.md | 22 ++++++++ .../x64/Release/usb2can.dll | Bin 0 -> 28160 bytes .../x64/Release/usb2can.lib | Bin 0 -> 5292 bytes .../x86/Release/usb2can.dll | Bin 0 -> 23040 bytes .../x86/Release/usb2can.lib | Bin 0 -> 5534 bytes dronecan_gui_tool/main.py | 31 ++++++++++- dronecan_gui_tool/setup_window.py | 7 +++ setup.py | 40 +++++++++++++- setup_usb2can.py | 51 ++++++++++++++++++ 9 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 bin/usb2can_canal_v2.0.0/x64/Release/usb2can.dll create mode 100644 bin/usb2can_canal_v2.0.0/x64/Release/usb2can.lib create mode 100644 bin/usb2can_canal_v2.0.0/x86/Release/usb2can.dll create mode 100644 bin/usb2can_canal_v2.0.0/x86/Release/usb2can.lib create mode 100644 setup_usb2can.py diff --git a/README.md b/README.md index ea1e82e..0fea48a 100755 --- a/README.md +++ b/README.md @@ -71,6 +71,28 @@ In order to install this application, Please see the file winbuild.bat in this directory, or use the MSI file build by github actions on any commit +### USB2CAN (8devices Korlan) Support on Windows + +The DroneCAN GUI Tool now includes support for 8devices USB2CAN (Korlan) adapters on Windows. + +**Setup:** +1. Connect your 8devices USB2CAN adapter +2. Run the setup script to install the required DLL: + ``` + python setup_usb2can.py + ``` +3. The USB2CAN adapter will now appear in the interface selection dropdown as "8devices USB2CAN (channel_id)" + +**Features:** +- Automatic detection of USB2CAN adapters +- Native integration with DroneCAN protocol +- Full support for all GUI tool features + +**Requirements:** +- 8devices USB2CAN adapter (Korlan) +- Windows 10/11 (x64 or x86) +- DLL files included in `bin/usb2can_canal_v2.0.0/` + ## Installing on macOS OSX support is a bit lacking in the way that installation doesn't create an entry in the applications menu, diff --git a/bin/usb2can_canal_v2.0.0/x64/Release/usb2can.dll b/bin/usb2can_canal_v2.0.0/x64/Release/usb2can.dll new file mode 100644 index 0000000000000000000000000000000000000000..6d756b343258409f097d717def3bf672b9a25efc GIT binary patch literal 28160 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 literal 0 HcmV?d00001 diff --git a/bin/usb2can_canal_v2.0.0/x86/Release/usb2can.dll b/bin/usb2can_canal_v2.0.0/x86/Release/usb2can.dll new file mode 100644 index 0000000000000000000000000000000000000000..d58f03694352bef4fb82a342a524f864e1f504b9 GIT binary patch literal 23040 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 Q*^EkTagG)Ku_9yr1FXMeM*si- literal 0 HcmV?d00001 diff --git a/dronecan_gui_tool/main.py b/dronecan_gui_tool/main.py index 611ffc2..f4d8b31 100644 --- a/dronecan_gui_tool/main.py +++ b/dronecan_gui_tool/main.py @@ -629,7 +629,36 @@ def main(): node_info.software_version.major = __version__[0] node_info.software_version.minor = __version__[1] - node = dronecan.make_node(iface, + # Handle USB2CAN interface specification (format: "usb2can:channel") + actual_iface = iface + if iface and ':' in iface: + bustype, channel = iface.split(':', 1) + if bustype == 'usb2can': + # For USB2CAN interfaces, specify the bustype and DLL path + import platform + import os + + actual_iface = channel + iface_kwargs['bustype'] = 'usb2can' + + # Determine the correct DLL path based on architecture + current_dir = os.path.dirname(os.path.abspath(__file__)) + gui_tool_dir = os.path.dirname(current_dir) + + if platform.machine().lower() in ['amd64', 'x86_64', 'x64']: + dll_path = os.path.join(gui_tool_dir, 'bin', 'usb2can_canal_v2.0.0', 'x64', 'Release', 'usb2can.dll') + else: + dll_path = os.path.join(gui_tool_dir, 'bin', 'usb2can_canal_v2.0.0', 'x86', 'Release', 'usb2can.dll') + + iface_kwargs['dll'] = dll_path + logger.info('Using USB2CAN interface: channel=%s, dll=%s', channel, dll_path) + elif bustype == 'pcan': + # PCAN interfaces should also specify bustype + actual_iface = channel + iface_kwargs['bustype'] = 'pcan' + logger.info('Using PCAN interface: channel=%s', channel) + + node = dronecan.make_node(actual_iface, node_info=node_info, mode=dronecan.uavcan.protocol.NodeStatus().MODE_OPERATIONAL, **iface_kwargs) diff --git a/dronecan_gui_tool/setup_window.py b/dronecan_gui_tool/setup_window.py index 5cf0dcf..f9708fb 100644 --- a/dronecan_gui_tool/setup_window.py +++ b/dronecan_gui_tool/setup_window.py @@ -141,6 +141,13 @@ def list_ifaces(): for interface in detect_available_configs(): if interface['interface'] == "pcan": out[interface['channel']] = interface['channel'] + elif interface['interface'] == "usb2can": + # Add USB2CAN (8devices Korlan) interfaces with descriptive name + # Store as "usb2can:channel" to specify the bustype + display_name = "8devices USB2CAN (%s)" % interface['channel'] + interface_spec = "usb2can:%s" % interface['channel'] + out[display_name] = interface_spec + logger.info('Added USB2CAN interface: %s -> %s', display_name, interface_spec) except Exception as ex: logger.warning('Could not load can interfaces: %s', ex, exc_info=True) diff --git a/setup.py b/setup.py index dea9620..f8bb95a 100755 --- a/setup.py +++ b/setup.py @@ -111,7 +111,7 @@ # Windows-specific options and hacks # if os.name == 'nt': - args.setdefault('install_requires', []).append('cx_Freeze ~= 6.1') + args.setdefault('install_requires', []).append('cx_Freeze >= 6.1') if ('bdist_msi' in sys.argv) or ('build_exe' in sys.argv): import cx_Freeze @@ -122,6 +122,7 @@ 'qtpy', 'qtconsole', 'easywebdav', + 'python-can', # Add python-can to unpacked eggs (package name is python-can, import name is can) ] unpacked_eggs_dir = os.path.join('build', 'hatched_eggs') sys.path.insert(0, unpacked_eggs_dir) @@ -144,6 +145,7 @@ import jupyter_client import traitlets import numpy + import can # Add python-can import # Oh, Windows, never change. missing_dlls = glob.glob(os.path.join(os.path.dirname(numpy.core.__file__), '*.dll')) @@ -157,6 +159,41 @@ 'zmq', 'pygments', 'jupyter_client', + # Add python-can and related packages + 'can', + 'can.interfaces', + 'can.interfaces.usb2can', + # Add only the most critical missing modules + 'traceback', + 'token', + 'threading', + 'queue', + 'logging', + 'json', + 'urllib', + 'socket', + 'ssl', + 'datetime', + 'multiprocessing', + 'subprocess', + 'tempfile', + 'shutil', + 'glob', + 'pathlib', + 'io', + 'platform', + 'importlib', + 'encodings', + 'enum', + 'contextlib', + 'configparser', + 'winreg', + 'msvcrt', + 'email', + 'csv', + 'xml', + 'zlib', + 'zipfile', ], 'include_msvcr': True, 'include_files': [ @@ -172,6 +209,7 @@ os.path.join(unpacked_eggs_dir, os.path.dirname(jupyter_client.__file__)), os.path.join(unpacked_eggs_dir, os.path.dirname(traitlets.__file__)), os.path.join(unpacked_eggs_dir, os.path.dirname(numpy.__file__)), + os.path.join(unpacked_eggs_dir, os.path.dirname(can.__file__)), # Include python-can package files ] + missing_dlls, }, 'bdist_msi': { diff --git a/setup_usb2can.py b/setup_usb2can.py new file mode 100644 index 0000000..a44b26e --- /dev/null +++ b/setup_usb2can.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +""" +USB2CAN setup script for DroneCAN GUI Tool + +This script sets up the USB2CAN DLL for use with the DroneCAN GUI Tool. +It copies the appropriate DLL to a location where it can be found by python-can. +""" + +import os +import shutil +import platform +import sys + +def setup_usb2can_dll(): + """Copy the USB2CAN DLL to an accessible location""" + print("Setting up USB2CAN DLL for DroneCAN GUI Tool...") + + # Get the current directory (should be the gui_tool root) + current_dir = os.path.dirname(os.path.abspath(__file__)) + + # Determine the correct DLL based on architecture + if platform.machine().lower() in ['amd64', 'x86_64', 'x64']: + dll_source = os.path.join(current_dir, 'bin', 'usb2can_canal_v2.0.0', 'x64', 'Release', 'usb2can.dll') + arch = 'x64' + else: + dll_source = os.path.join(current_dir, 'bin', 'usb2can_canal_v2.0.0', 'x86', 'Release', 'usb2can.dll') + arch = 'x86' + + if not os.path.exists(dll_source): + print(f"Error: USB2CAN DLL not found at {dll_source}") + return False + + # Copy to the current directory (where the script is run from) + dll_dest = os.path.join(current_dir, 'usb2can.dll') + + try: + shutil.copy2(dll_source, dll_dest) + print(f"Successfully copied {arch} USB2CAN DLL to {dll_dest}") + return True + except Exception as e: + print(f"Error copying DLL: {e}") + return False + +if __name__ == "__main__": + success = setup_usb2can_dll() + if success: + print("\n✅ USB2CAN setup completed successfully!") + print("You can now use 8devices USB2CAN adapters with the DroneCAN GUI Tool.") + else: + print("\n❌ USB2CAN setup failed!") + sys.exit(1) \ No newline at end of file