summaryrefslogtreecommitdiffstatshomepage
path: root/tools/pyboard.py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-12-15 11:29:33 +1100
committerDamien George <damien.p.george@gmail.com>2016-12-15 11:29:33 +1100
commit29b58796136e3c9133cd268b163db1c53e67ac9b (patch)
tree6b055937c2583ae9d3eaa42ab1c2309517215efa /tools/pyboard.py
parent1b02565316f9d2a71a4213a433507760dae764f0 (diff)
downloadmicropython-29b58796136e3c9133cd268b163db1c53e67ac9b.tar.gz
micropython-29b58796136e3c9133cd268b163db1c53e67ac9b.zip
tools/pyboard.py: Refactor so target is not reset between scripts/cmd.
Previous to this patch pyboard.py would open a new serial connection to the target for each script that was run, and for any command that was run. Apart from being inefficient, this meant that the board was soft-reset between scripts/commands, which precludes scripts from accessing variables set in a previous one. This patch changes the behaviour of pyboard.py so that the connection to the target is created only once, and it's not reset between scripts or any command that is sent with the -c option.
Diffstat (limited to 'tools/pyboard.py')
-rwxr-xr-xtools/pyboard.py63
1 files changed, 43 insertions, 20 deletions
diff --git a/tools/pyboard.py b/tools/pyboard.py
index 925e16bc60..d4ce8b7887 100755
--- a/tools/pyboard.py
+++ b/tools/pyboard.py
@@ -285,43 +285,66 @@ def main():
cmd_parser.add_argument('files', nargs='*', help='input files')
args = cmd_parser.parse_args()
- def execbuffer(buf):
+ # open the connection to the pyboard
+ try:
+ pyb = Pyboard(args.device, args.baudrate, args.user, args.password, args.wait)
+ except PyboardError as er:
+ print(er)
+ sys.exit(1)
+
+ # run any command or file(s)
+ if args.command is not None or len(args.files):
+ # we must enter raw-REPL mode to execute commands
+ # this will do a soft-reset of the board
try:
- pyb = Pyboard(args.device, args.baudrate, args.user, args.password, args.wait)
pyb.enter_raw_repl()
- ret, ret_err = pyb.exec_raw(buf, timeout=None, data_consumer=stdout_write_bytes)
- pyb.exit_raw_repl()
- pyb.close()
except PyboardError as er:
print(er)
sys.exit(1)
- except KeyboardInterrupt:
- sys.exit(1)
- if ret_err:
- stdout_write_bytes(ret_err)
- sys.exit(1)
-
- if args.command is not None:
- execbuffer(args.command.encode('utf-8'))
-
- for filename in args.files:
- with open(filename, 'rb') as f:
- pyfile = f.read()
- execbuffer(pyfile)
+ def execbuffer(buf):
+ try:
+ ret, ret_err = pyb.exec_raw(buf, timeout=None, data_consumer=stdout_write_bytes)
+ except PyboardError as er:
+ print(er)
+ sys.exit(1)
+ except KeyboardInterrupt:
+ sys.exit(1)
+ if ret_err:
+ pyb.exit_raw_repl()
+ pyb.close()
+ stdout_write_bytes(ret_err)
+ sys.exit(1)
+
+ # run the command, if given
+ if args.command is not None:
+ execbuffer(args.command.encode('utf-8'))
+
+ # run any files
+ for filename in args.files:
+ with open(filename, 'rb') as f:
+ pyfile = f.read()
+ execbuffer(pyfile)
+
+ # exiting raw-REPL just drops to friendly-REPL mode
+ pyb.exit_raw_repl()
+
+ # if asked explicitly, or no files given, then follow the output
if args.follow or (args.command is None and len(args.files) == 0):
try:
- pyb = Pyboard(args.device, args.baudrate, args.user, args.password, args.wait)
ret, ret_err = pyb.follow(timeout=None, data_consumer=stdout_write_bytes)
- pyb.close()
except PyboardError as er:
print(er)
sys.exit(1)
except KeyboardInterrupt:
sys.exit(1)
if ret_err:
+ pyb.close()
stdout_write_bytes(ret_err)
sys.exit(1)
+ # close the connection to the pyboard
+ pyb.close()
+
if __name__ == "__main__":
main()