mirror of
https://github.com/andreili/katapult.git
synced 2025-08-23 19:34:06 +02:00
flashtool: use recommended asyncio entry point
Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
parent
7de954b916
commit
730fde48ab
@ -17,6 +17,7 @@ import hashlib
|
||||
import pathlib
|
||||
import shutil
|
||||
import shlex
|
||||
import contextlib
|
||||
from typing import Dict, List, Optional, Union
|
||||
HAS_SERIAL = True
|
||||
try:
|
||||
@ -586,9 +587,12 @@ class SerialSocket:
|
||||
pid = fd_dir.parent.name
|
||||
if not pid.isdigit():
|
||||
continue
|
||||
try:
|
||||
with contextlib.suppress(OSError):
|
||||
for item in fd_dir.iterdir():
|
||||
try:
|
||||
item_st = item.stat()
|
||||
except OSError:
|
||||
continue
|
||||
item_id = (item_st.st_dev, item_st.st_ino)
|
||||
if item_id == dev_id:
|
||||
proc_name = await self._lookup_proc_name(pid)
|
||||
@ -598,8 +602,6 @@ class SerialSocket:
|
||||
f"Process {proc_name}"
|
||||
)
|
||||
raise FlashError(f"Serial device {dev_path} in use")
|
||||
except PermissionError:
|
||||
continue
|
||||
|
||||
async def run(self, intf: str, baud: int, fw_path: pathlib.Path) -> None:
|
||||
if not fw_path.is_file():
|
||||
@ -633,7 +635,59 @@ class SerialSocket:
|
||||
self.serial.close()
|
||||
self.serial = None
|
||||
|
||||
def main():
|
||||
async def main(args: argparse.Namespace) -> int:
|
||||
if not args.verbose:
|
||||
logging.getLogger().setLevel(logging.ERROR)
|
||||
intf = args.interface
|
||||
fpath = pathlib.Path(args.firmware).expanduser().resolve()
|
||||
loop = asyncio.get_running_loop()
|
||||
iscan = args.device is None
|
||||
req_only = args.request_bootloader
|
||||
sock: CanSocket | SerialSocket | None = None
|
||||
try:
|
||||
if iscan:
|
||||
sock = CanSocket(loop)
|
||||
if args.query:
|
||||
await sock.run_query(intf)
|
||||
else:
|
||||
if args.uuid is None:
|
||||
raise FlashError(
|
||||
"The 'uuid' option must be specified to flash a device"
|
||||
)
|
||||
output_line(f"Flashing CAN UUID {args.uuid} on interface {intf}")
|
||||
uuid = int(args.uuid, 16)
|
||||
await sock.run(intf, uuid, fpath, req_only)
|
||||
else:
|
||||
if not HAS_SERIAL:
|
||||
ser_inst_cmd = "pip3 install serial"
|
||||
if shutil.which("apt") is not None:
|
||||
ser_inst_cmd = "sudo apt install python3-serial"
|
||||
raise FlashError(
|
||||
"The pyserial python package was not found. To install "
|
||||
"run the following command in a terminal: \n\n"
|
||||
f" {ser_inst_cmd}\n\n"
|
||||
)
|
||||
if args.device is None:
|
||||
raise FlashError(
|
||||
"The 'device' option must be specified to flash a device"
|
||||
)
|
||||
output_line(f"Flashing Serial Device {args.device}, baud {args.baud}")
|
||||
sock = SerialSocket(loop)
|
||||
await sock.run(args.device, args.baud, fpath)
|
||||
except Exception:
|
||||
logging.exception("Flash Error")
|
||||
return -1
|
||||
finally:
|
||||
if sock is not None:
|
||||
sock.close()
|
||||
if args.query:
|
||||
output_line("Query Complete")
|
||||
else:
|
||||
output_line("Flash Success")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Katapult Flash Tool")
|
||||
parser.add_argument(
|
||||
@ -670,55 +724,4 @@ def main():
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
if not args.verbose:
|
||||
logging.getLogger().setLevel(logging.ERROR)
|
||||
intf = args.interface
|
||||
fpath = pathlib.Path(args.firmware).expanduser().resolve()
|
||||
loop = asyncio.get_event_loop()
|
||||
iscan = args.device is None
|
||||
req_only = args.request_bootloader
|
||||
sock = None
|
||||
try:
|
||||
if iscan:
|
||||
sock = CanSocket(loop)
|
||||
if args.query:
|
||||
loop.run_until_complete(sock.run_query(intf))
|
||||
else:
|
||||
if args.uuid is None:
|
||||
raise FlashError(
|
||||
"The 'uuid' option must be specified to flash a device"
|
||||
)
|
||||
output_line(f"Flashing CAN UUID {args.uuid} on interface {intf}")
|
||||
uuid = int(args.uuid, 16)
|
||||
loop.run_until_complete(sock.run(intf, uuid, fpath, req_only))
|
||||
else:
|
||||
if not HAS_SERIAL:
|
||||
ser_inst_cmd = "pip3 install serial"
|
||||
if shutil.which("apt") is not None:
|
||||
ser_inst_cmd = "sudo apt install python3-serial"
|
||||
raise FlashError(
|
||||
"The pyserial python package was not found. To install "
|
||||
"run the following command in a terminal: \n\n"
|
||||
f" {ser_inst_cmd}\n\n"
|
||||
)
|
||||
if args.device is None:
|
||||
raise FlashError(
|
||||
"The 'device' option must be specified to flash a device"
|
||||
)
|
||||
output_line(f"Flashing Serial Device {args.device}, baud {args.baud}")
|
||||
sock = SerialSocket(loop)
|
||||
loop.run_until_complete(sock.run(args.device, args.baud, fpath))
|
||||
except Exception:
|
||||
logging.exception("Flash Error")
|
||||
sys.exit(-1)
|
||||
finally:
|
||||
if sock is not None:
|
||||
sock.close()
|
||||
if args.query:
|
||||
output_line("Query Complete")
|
||||
else:
|
||||
output_line("Flash Success")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
exit(asyncio.run(main(args)))
|
||||
|
Loading…
x
Reference in New Issue
Block a user