1 contributor
#!/usr/bin/env python3
import serial
from xmodem import XMODEM
import argparse
# parse command-line arguments
parser = argparse.ArgumentParser(description="Send a file over XMODEM after sending ABWu")
parser.add_argument("-p", "--port", required=True, help="Serial port, e.g. /dev/ttyACM0")
parser.add_argument("-f", "--file", required=True, help="File to send")
args = parser.parse_args()
PORT = args.port
FILE = args.file
BAUD = 115200
def getc(size, timeout=1):
return ser.read(size) or None
def putc(data, timeout=1):
return ser.write(data)
# open serial port
ser = serial.Serial(
PORT,
BAUD,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1,
rtscts=False,
dsrdtr=False
)
# send init command
# ~ ser.write(b"ABWu\r\n")
# Check if Abeeway in bootloader
is_bootloader=False
buffer=b""
ser.write(b"i")
while True:
c = ser.read(1)
if not c:
continue
buffer += c
if b"HWID" in buffer:
is_bootloader=True
break
buffer_str = buffer.decode(errors="replace") # replace invalid bytes
print(f"{buffer_str}")
# Flush
buffer=b""
while True:
c = ser.read(1)
if not c:
break
buffer += c
if not is_bootloader:
print("Not in bootloader mode. Aborting")
quit(1)
print(f"Found bootloader on {PORT}")
ser.write(b"A")
ser.write(b"B")
ser.write(b"W")
ser.write(b"u\r")
# wait until device says "Ready"
buffer = b""
while True:
c = ser.read(1)
if not c:
continue
buffer += c
#print(f":: {buffer}")
if b"Ready" in buffer:
print("Device is ready, starting XMODEM...")
break
# start xmodem transfer
modem = XMODEM(getc, putc)
with open(FILE, "rb") as stream:
success = modem.send(stream, retry=16, timeout=10)
print("Transfer success:", success)
print("Reset")
ser.write(b"r")