Skip to content

Commit

Permalink
script: Auto-detect COM port
Browse files Browse the repository at this point in the history
  • Loading branch information
keirf committed Jan 21, 2020
1 parent 8138aed commit df03f6b
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 6 deletions.
3 changes: 2 additions & 1 deletion scripts/greaseweazle/tools/delays.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ def main(argv):
help="delay after motor on (msecs)")
parser.add_argument("--auto-off", type=int,
help="quiescent time until auto deselect (msecs)")
parser.add_argument("device", help="serial device")
parser.add_argument("device", nargs="?", default="auto",
help="serial device")
parser.prog += ' ' + argv[1]
args = parser.parse_args(argv[2:])

Expand Down
3 changes: 2 additions & 1 deletion scripts/greaseweazle/tools/read.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ def main(argv):
parser.add_argument("--single-sided", action="store_true",
help="single-sided read")
parser.add_argument("file", help="output filename")
parser.add_argument("device", help="serial device")
parser.add_argument("device", nargs="?", default="auto",
help="serial device")
parser.prog += ' ' + argv[1]
args = parser.parse_args(argv[2:])
args.nr_sides = 1 if args.single_sided else 2
Expand Down
3 changes: 2 additions & 1 deletion scripts/greaseweazle/tools/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ def main(argv):
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("file", help="update filename")
parser.add_argument("device", help="serial device")
parser.add_argument("device", nargs="?", default="auto",
help="serial device")
parser.prog += ' ' + argv[1]
args = parser.parse_args(argv[2:])

Expand Down
38 changes: 36 additions & 2 deletions scripts/greaseweazle/tools/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
# See the file COPYING for more details, or visit <http://unlicense.org>.

import argparse, os, sys, serial, struct, time
import serial.tools.list_ports

from greaseweazle import version
from greaseweazle import usb as USB
Expand Down Expand Up @@ -53,6 +54,30 @@ def with_drive_selected(fn, usb, args):
usb.drive_deselect()


def valid_ser_id(ser_id):
return ser_id and ser_id.upper().startswith("GW")

def find_port(ser_id=None):
for x in serial.tools.list_ports.comports():
if x.manufacturer == "Keir Fraser":
if not valid_ser_id(x.serial_number) or not valid_ser_id(ser_id) \
or x.serial_number == ser_id:
return x.device
elif x.manufacturer == "Microsoft" and x.vid == 0x1209 \
and x.pid == 0x0001:
if not valid_ser_id(x.serial_number) or not valid_ser_id(ser_id) \
or x.serial_number == ser_id:
return x.device
raise serial.SerialException('Could not auto-detect Greaseweazle device')

def get_ser_id(devname):
for x in serial.tools.list_ports.comports():
if x.device == devname:
if valid_ser_id(x.serial_number):
return x.serial_number
return None
return None

def usb_reopen(usb, is_update):
mode = { False: 1, True: 0 }
try:
Expand All @@ -65,18 +90,27 @@ def usb_reopen(usb, is_update):
for i in range(10):
time.sleep(0.5)
try:
usb.ser.open()
devicename = find_port(usb.ser_id)
new_ser = serial.Serial(devicename)
except serial.SerialException:
# Device not found
pass
else:
return USB.Unit(usb.ser)
new_usb = USB.Unit(new_ser)
new_usb.ser_id = usb.ser_id
new_usb.devname = devicename
return new_usb
raise serial.SerialException('Could not reopen port after mode switch')


def usb_open(devicename, is_update=False):

if devicename == "auto":
devicename = find_port()

usb = USB.Unit(serial.Serial(devicename))
usb.ser_id = get_ser_id(devicename)
usb.devname = devicename

print("** %s v%u.%u [F%u], Host Tools v%u.%u"
% (("Greaseweazle", "Bootloader")[usb.update_mode],
Expand Down
3 changes: 2 additions & 1 deletion scripts/greaseweazle/tools/write.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ def main(argv):
parser.add_argument("--adjust-speed", action="store_true",
help="adjust write-flux times for drive speed")
parser.add_argument("file", help="input filename")
parser.add_argument("device", help="serial device")
parser.add_argument("device", nargs="?", default="auto",
help="serial device")
parser.prog += ' ' + argv[1]
args = parser.parse_args(argv[2:])
args.nr_sides = 1 if args.single_sided else 2
Expand Down

0 comments on commit df03f6b

Please sign in to comment.