mirror of
https://github.com/micropython/micropython.git
synced 2026-01-19 10:27:18 +01:00
Fixes in this commit are: - Make --follow the default for "run" (accidentally changed in68d094358). - Add help strings for "repl": --capture --inject-file --inject-code - Update help strings for "run". - Fix encoding for --inject-code (accidentally broken in68d094358). - Remove ability to --no-follow for "eval". It was there previously because it shared the same code path with "exec" and "run", but makes no sense for "eval", so might as well remove. This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
from .console import Console, ConsolePosix
|
|
|
|
from . import pyboardextended as pyboard
|
|
|
|
|
|
def do_repl_main_loop(state, console_in, console_out_write, *, code_to_inject, file_to_inject):
|
|
while True:
|
|
console_in.waitchar(state.pyb.serial)
|
|
c = console_in.readchar()
|
|
if c:
|
|
if c == b"\x1d": # ctrl-], quit
|
|
break
|
|
elif c == b"\x04": # ctrl-D
|
|
# special handling needed for ctrl-D if filesystem is mounted
|
|
state.pyb.write_ctrl_d(console_out_write)
|
|
elif c == b"\x0a" and code_to_inject is not None: # ctrl-j, inject code
|
|
state.pyb.serial.write(code_to_inject)
|
|
elif c == b"\x0b" and file_to_inject is not None: # ctrl-k, inject script
|
|
console_out_write(bytes("Injecting %s\r\n" % file_to_inject, "utf8"))
|
|
state.pyb.enter_raw_repl(soft_reset=False)
|
|
with open(file_to_inject, "rb") as f:
|
|
pyfile = f.read()
|
|
try:
|
|
state.pyb.exec_raw_no_follow(pyfile)
|
|
except pyboard.PyboardError as er:
|
|
console_out_write(b"Error:\r\n")
|
|
console_out_write(er)
|
|
state.pyb.exit_raw_repl()
|
|
else:
|
|
state.pyb.serial.write(c)
|
|
|
|
try:
|
|
n = state.pyb.serial.inWaiting()
|
|
except OSError as er:
|
|
if er.args[0] == 5: # IO error, device disappeared
|
|
print("device disconnected")
|
|
break
|
|
|
|
if n > 0:
|
|
c = state.pyb.serial.read(1)
|
|
if c is not None:
|
|
# pass character through to the console
|
|
oc = ord(c)
|
|
if oc in (8, 9, 10, 13, 27) or 32 <= oc <= 126:
|
|
console_out_write(c)
|
|
else:
|
|
console_out_write(b"[%02x]" % ord(c))
|
|
|
|
|
|
def do_repl(state, args):
|
|
state.ensure_friendly_repl()
|
|
state.did_action()
|
|
|
|
capture_file = args.capture
|
|
code_to_inject = args.inject_code
|
|
file_to_inject = args.inject_file
|
|
|
|
print("Connected to MicroPython at %s" % state.pyb.device_name)
|
|
print("Use Ctrl-] to exit this shell")
|
|
if capture_file is not None:
|
|
print('Capturing session to file "%s"' % capture_file)
|
|
capture_file = open(capture_file, "wb")
|
|
if code_to_inject is not None:
|
|
code_to_inject = bytes(code_to_inject.replace("\\n", "\r\n"), "utf8")
|
|
print("Use Ctrl-J to inject", code_to_inject)
|
|
if file_to_inject is not None:
|
|
print('Use Ctrl-K to inject file "%s"' % file_to_inject)
|
|
|
|
console = Console()
|
|
console.enter()
|
|
|
|
def console_out_write(b):
|
|
console.write(b)
|
|
if capture_file is not None:
|
|
capture_file.write(b)
|
|
capture_file.flush()
|
|
|
|
try:
|
|
do_repl_main_loop(
|
|
state,
|
|
console,
|
|
console_out_write,
|
|
code_to_inject=code_to_inject,
|
|
file_to_inject=file_to_inject,
|
|
)
|
|
finally:
|
|
console.exit()
|
|
if capture_file is not None:
|
|
capture_file.close()
|