Source code for pygmc.connection.utils

import logging
import re

# pypi
from serial.tools import list_ports as serial_list_ports

logger = logging.getLogger("pygmc.connection")


[docs] def get_all_usb_devices(regexp=None, include_links=True) -> list: """ Get all available USB devices. Parameters ---------- regexp : None | str, optional Search for ports using a regular expression. Port name, description and hardware ID are searched. hardwareID example ('USB VID:PID=1A86:7523 LOCATION=2-1') Default=None, find all. include_links : bool, optional include symlinks under /dev when they point to a serial port, by default True Returns ------- list available ports, type [serial.tools.list_ports_linux.SysFS] """ logger.debug( f"_get_available_usb_devices(regexp={regexp}, include_links={include_links})" ) if not regexp: ports = serial_list_ports.comports(include_links=include_links) else: # cast as list because it's a generator and I want an easy return type # How many USB devices could a user possibly have? ports = list(serial_list_ports.grep(regexp=regexp, include_links=include_links)) logger.debug(f"All ports/dev-devices found: {[(x.device, x.hwid) for x in ports]}") return ports
[docs] def get_gmc_usb_devices( vid="1A86", pid="7523", description=".*", include_links=True ) -> list: """ Get a list of GMC USB devices. Default parameters are best known parameters that matches GMC USB devices. Parameters ---------- vid: str | int Hexadecimal string or int to exact match the Vendor-ID vid. e.g. '0x1A86' or '1A86' or 6790 will all match. pid: str | int Hexadecimal string or int to exact match the Product-ID pid. e.g. '0x7523' or '7523' or 29987 will all match. (Note '7523' is considered a hex as a string) description: str Regex to match usb device description. (case-insensitive flag used) Known descriptions: 'USB2.0-Serial' & 'USB-Serial' include_links : bool Include symlinks under /dev when they point to a serial port, by default True Returns ------- list List of GMC devices. """ # vid = "1A86" # 6790 # pid = "7523" # 29987 if isinstance(vid, str): vid = int(vid, base=16) if isinstance(pid, str): pid = int(pid, base=16) logger.debug( f"get_available_usb_devices({vid}, {pid}, {description}, {include_links}" ) all_devices = serial_list_ports.comports(include_links=include_links) logger.debug(f"All devices: {[(x.device, x.hwid) for x in all_devices]}") matched_devices = [] for device in all_devices: vid_m = vid == device.vid pid_m = pid == device.pid description_m = re.match( description, str(device.description), flags=re.IGNORECASE ) if all([vid_m, pid_m, description_m]): matched_devices.append(device) logger.debug(f"Matched devices: {[(x.device, x.hwid) for x in matched_devices]}") return matched_devices