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 <kawasaki@juno.dti.ne.jp>
This commit is contained in:
Shin'ichiro Kawasaki
2021-10-10 15:32:06 +09:00
parent 1af4baa7d6
commit 32da72492f

View File

@@ -15,6 +15,7 @@ import logging
import sys import sys
import signal import signal
import traceback import traceback
import argparse
# for Bluetooth (e.g. Lego EV3) # for Bluetooth (e.g. Lego EV3)
import bluetooth import bluetooth
@@ -44,6 +45,7 @@ logger.addHandler(handler)
logger.propagate = False logger.propagate = False
HOSTNAME="device-manager.scratch.mit.edu" HOSTNAME="device-manager.scratch.mit.edu"
scan_seconds=10.0
class Session(): class Session():
"""Base class for BTSession and BLESession""" """Base class for BTSession and BLESession"""
@@ -495,6 +497,7 @@ class BLESession(Session):
return False return False
def _scan_devices(self, params): def _scan_devices(self, params):
global scan_seconds
if BLESession.nr_connected > 0: if BLESession.nr_connected > 0:
return len(BLESession.found_devices) > 0 return len(BLESession.found_devices) > 0
found = False found = False
@@ -505,7 +508,8 @@ class BLESession(Session):
for i in range(self.MAX_SCANNER_IF): for i in range(self.MAX_SCANNER_IF):
scanner = Scanner(iface=i) scanner = Scanner(iface=i)
try: try:
devices = scanner.scan(10.0) logger.debug(f"start BLE scan: {scan_seconds} seconds")
devices = scanner.scan(scan_seconds)
for dev in devices: for dev in devices:
if self.matches(dev, params['filters']): if self.matches(dev, params['filters']):
BLESession.found_devices.append(dev) BLESession.found_devices.append(dev)
@@ -718,18 +722,20 @@ def stack_trace():
print(line) print(line)
def main(): def main():
opts = [opt for opt in sys.argv[1:] if opt.startswith("-")] global scan_seconds
if "-h" in opts: parser = argparse.ArgumentParser(description='start Scratch-link')
print((f"Usage: {sys.argv[0]} [OPTS]\n" parser.add_argument('-d', '--debug', action='store_true',
"OPTS:\t-h Show this help.\n" help='print debug messages')
"\t-d Print debug messages." parser.add_argument('-s', '--scan_seconds', type=float, default=10.0,
)) help='specifiy duration to scan BLE devices in seconds')
sys.exit(1) args = parser.parse_args()
elif "-d" in opts: if args.debug:
print("Print debug messages") print("Print debug messages")
logLevel = logging.DEBUG logLevel = logging.DEBUG
handler.setLevel(logLevel) handler.setLevel(logLevel)
logger.setLevel(logLevel) logger.setLevel(logLevel)
scan_seconds = args.scan_seconds
logger.debug(f"set scan_seconds: {scan_seconds}")
# Prepare certificate of the WSS server # Prepare certificate of the WSS server
gencert.prep_cert() gencert.prep_cert()