From 32da72492ffd66d994924f1e62a4bb6b3595b4b5 Mon Sep 17 00:00:00 2001 From: Shin'ichiro Kawasaki Date: Sun, 10 Oct 2021 15:32:06 +0900 Subject: [PATCH] scratch_link.py: Add -s option to specify BLE scan duration Pyscrlink scans BLE devices for 10 seconds. This is a safe number to cover various environments and devices. However, this is too long for specific devices. One example is toio. Toio's Visual Programming environment has automated connection to toio devices via Scratch-link, at it assumes that the scan finishes with shorter time. To allow users to specify shorter scan duration, add -s, or --scan_seconds option. To simplify this new option support, utilize argparse library. Rewrite option parser with argparse. Signed-off-by: Shin'ichiro Kawasaki --- pyscrlink/scratch_link.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pyscrlink/scratch_link.py b/pyscrlink/scratch_link.py index 65593c6..7d09c46 100755 --- a/pyscrlink/scratch_link.py +++ b/pyscrlink/scratch_link.py @@ -15,6 +15,7 @@ import logging import sys import signal import traceback +import argparse # for Bluetooth (e.g. Lego EV3) import bluetooth @@ -44,6 +45,7 @@ logger.addHandler(handler) logger.propagate = False HOSTNAME="device-manager.scratch.mit.edu" +scan_seconds=10.0 class Session(): """Base class for BTSession and BLESession""" @@ -495,6 +497,7 @@ class BLESession(Session): return False def _scan_devices(self, params): + global scan_seconds if BLESession.nr_connected > 0: return len(BLESession.found_devices) > 0 found = False @@ -505,7 +508,8 @@ class BLESession(Session): for i in range(self.MAX_SCANNER_IF): scanner = Scanner(iface=i) try: - devices = scanner.scan(10.0) + logger.debug(f"start BLE scan: {scan_seconds} seconds") + devices = scanner.scan(scan_seconds) for dev in devices: if self.matches(dev, params['filters']): BLESession.found_devices.append(dev) @@ -718,18 +722,20 @@ def stack_trace(): print(line) def main(): - opts = [opt for opt in sys.argv[1:] if opt.startswith("-")] - if "-h" in opts: - print((f"Usage: {sys.argv[0]} [OPTS]\n" - "OPTS:\t-h Show this help.\n" - "\t-d Print debug messages." - )) - sys.exit(1) - elif "-d" in opts: + global scan_seconds + parser = argparse.ArgumentParser(description='start Scratch-link') + parser.add_argument('-d', '--debug', action='store_true', + help='print debug messages') + parser.add_argument('-s', '--scan_seconds', type=float, default=10.0, + help='specifiy duration to scan BLE devices in seconds') + args = parser.parse_args() + if args.debug: print("Print debug messages") logLevel = logging.DEBUG handler.setLevel(logLevel) logger.setLevel(logLevel) + scan_seconds = args.scan_seconds + logger.debug(f"set scan_seconds: {scan_seconds}") # Prepare certificate of the WSS server gencert.prep_cert()