flash_can: add usb support

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2022-06-03 08:27:03 -04:00 committed by KevinOConnor
parent 39535b15ba
commit b829a89069
1 changed files with 81 additions and 10 deletions

View File

@ -496,9 +496,70 @@ class CanSocket:
self._loop.remove_reader(self.cansock.fileno()) self._loop.remove_reader(self.cansock.fileno())
self.cansock.close() self.cansock.close()
class SerialSocket:
def __init__(self, loop: asyncio.AbstractEventLoop):
self._loop = loop
self.serial = self.serial_error = None
self.node = CanNode(0, self)
def _handle_response(self) -> None:
try:
data = self.serial.read(4096)
except self.serial_error as e:
logging.exception("Error on serial read")
self.close()
self.node.feed_data(data)
def send(self, can_id: int, payload: bytes = b"") -> None:
try:
self.serial.write(payload)
except self.serial_error as e:
logging.exception("Error on serial write")
self.close()
async def run(self, intf: str, baud: int, fw_path: pathlib.Path) -> None:
if not fw_path.is_file():
raise FlashCanError("Invalid firmware path '%s'" % (fw_path))
import serial
self.serial_error = serial.SerialException
try:
serial_dev = serial.Serial(baudrate=baud, timeout=0,
exclusive=True)
serial_dev.port = intf
serial_dev.open()
except (OSError, IOError, self.serial_error) as e:
raise FlashCanError("Unable to open serial port: %s" % (e,))
self.serial = serial_dev
self._loop.add_reader(self.serial.fileno(), self._handle_response)
flasher = CanFlasher(self.node, fw_path)
try:
await flasher.connect_btl()
await flasher.send_file()
await flasher.verify_file()
finally:
# always attempt to send the complete command. If
# there is an error it will exit the bootloader
# unless comms were broken
await flasher.finish()
def close(self):
if self.serial is None:
return
self._loop.remove_reader(self.serial.fileno())
self.serial.close()
self.serial = None
def main(): def main():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Can Bootloader Flash Utility") description="Can Bootloader Flash Utility")
parser.add_argument(
"-d", "--device", metavar='<serial device>',
help="Serial Device"
)
parser.add_argument(
"-b", "--baud", default=250000, metavar='<baud rate>',
help="Serial baud rate"
)
parser.add_argument( parser.add_argument(
"-i", "--interface", default="can0", metavar='<can interface>', "-i", "--interface", default="can0", metavar='<can interface>',
help="Can Interface" help="Can Interface"
@ -522,27 +583,37 @@ def main():
args = parser.parse_args() args = parser.parse_args()
if not args.verbose: if not args.verbose:
logging.getLogger().setLevel(logging.CRITICAL) logging.getLogger().setLevel(logging.ERROR)
intf = args.interface intf = args.interface
fpath = pathlib.Path(args.firmware).expanduser().resolve() fpath = pathlib.Path(args.firmware).expanduser().resolve()
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
iscan = args.device is None
sock = None
try: try:
cansock = CanSocket(loop) if iscan:
sock = CanSocket(loop)
if args.query: if args.query:
loop.run_until_complete(cansock.run_query(intf)) loop.run_until_complete(sock.run_query(intf))
else: else:
if args.uuid is None: if args.uuid is None:
raise FlashCanError( raise FlashCanError(
"The 'uuid' option must be specified to flash a device" "The 'uuid' option must be specified to flash a device"
) )
uuid = int(args.uuid, 16) uuid = int(args.uuid, 16)
loop.run_until_complete(cansock.run(intf, uuid, fpath)) loop.run_until_complete(sock.run(intf, uuid, fpath))
else:
if args.device is None:
raise FlashCanError(
"The 'device' option must be specified to flash a device"
)
sock = SerialSocket(loop)
loop.run_until_complete(sock.run(args.device, args.baud, fpath))
except Exception as e: except Exception as e:
logging.exception("Can Flash Error") logging.exception("Can Flash Error")
sys.exit(-1) sys.exit(-1)
finally: finally:
if cansock is not None: if sock is not None:
cansock.close() sock.close()
if args.query: if args.query:
output_line("Query Complete") output_line("Query Complete")
else: else: