Skip to content

Commit 8d7089e

Browse files
committed
Try to deal with LEGO hub soft reset
1 parent 8bbbfd9 commit 8d7089e

File tree

2 files changed

+21
-30
lines changed

2 files changed

+21
-30
lines changed

src/board.py

+16-30
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ def __init__(self, parent=None):
5858
self.timer.timeout.connect(self.on_timer)
5959
self.timer.start(20) # poll at 50 Hz
6060

61+
self.soft_reset = False # disable by default, enable if no LEGO device is detected
62+
63+
def set_soft_reset(self, mode):
64+
self.soft_reset = mode
65+
6166
def send_console(self, str):
6267
self.queue.put( ( "console", str ) )
6368

@@ -97,10 +102,10 @@ def probe(self, device):
97102
board.serial.timeout = 1
98103

99104
try:
100-
board.enter_raw_repl()
105+
board.enter_raw_repl(self.soft_reset)
101106
except Exception as e:
102107
try:
103-
board.enter_raw_repl()
108+
board.enter_raw_repl(self.soft_reset)
104109
except Exception as e:
105110
board.close()
106111
return None
@@ -257,7 +262,7 @@ def version(self):
257262

258263
def func(self, cmd):
259264
self.reply_parser() # reset parser
260-
self.board.enter_raw_repl()
265+
self.board.enter_raw_repl(self.soft_reset)
261266
self.board.exec_(cmd, data_consumer=self.reply_parser_ast)
262267
self.board.exit_raw_repl()
263268
self.send_result(True, self.result)
@@ -267,27 +272,27 @@ def func_ls(self):
267272
# of parsable python, so it can be eval'uated on PC side
268273
self.func(
269274
"import uos\n"
270-
"def list(d):\n"
275+
"def _list(d):\n"
271276
" print('[',end='')\n"
272277
" first=True\n"
273278
" for f in uos.ilistdir(d if d else '/'):\n"
274279
# make sure we have a comma before anything but the first entry
275280
" if first: first=False\n"
276281
" else: print(',',end='')\n"
277282
" print('(\"{}\",'.format(f[0]), end='')\n"
278-
" if f[1]&0x4000: list(d+'/'+f[0])\n"
283+
" if f[1]&0x4000: _list(d+'/'+f[0])\n"
279284
" else: print('{}'.format(f[3] if len(f)>3 else 0), end='')\n"
280285
" print(')', end='')\n"
281286
" print(']',end='')\n"
282-
"list('')\n"
287+
"_list('')\n"
283288
)
284289

285290
def ls(self):
286291
self.do_in_thread(self.func_ls)
287292

288293
def func_get(self, src, size, reply_parms, chunk_size=256):
289294
self.reply_parser() # reset parser
290-
self.board.enter_raw_repl()
295+
self.board.enter_raw_repl(self.soft_reset)
291296

292297
self.board.exec_("f=open('%s','rb')\nr=f.read" % src)
293298
result = bytearray()
@@ -313,33 +318,14 @@ def func_get(self, src, size, reply_parms, chunk_size=256):
313318
reply_parms["code"] = result # add data read to reply
314319
self.send_result(True, reply_parms )
315320

316-
def func_get_old(self, name, size, reply_parms):
317-
self.reply_parser() # reset parser
318-
self.board.enter_raw_repl()
319-
320-
# transfer data "binhexlified" to make sure even binary
321-
# data can be passed without problems
322-
command = ("import sys, ubinascii\n"
323-
"with open('{0}', 'rb') as infile:\n"
324-
" while True:\n"
325-
" result = infile.read(32)\n"
326-
" if result == b'': break\n"
327-
" sys.stdout.write(ubinascii.hexlify(result))\n").format(name)
328-
329-
data = self.board.exec_(command)
330-
self.board.exit_raw_repl()
331-
332-
reply_parms["code"] = binascii.unhexlify(data)
333-
self.send_result(True, reply_parms )
334-
335321
def get(self, name, size, reply_parms):
336322
self.progress.emit(0)
337323
self.status.emit(self.tr("Reading {}".format(name.split("/")[-1])))
338324
self.do_in_thread(self.func_get, ( name, size, reply_parms ) )
339325

340326
def func_put(self, all_data, dest, chunk_size=256):
341327
self.reply_parser() # reset parser
342-
self.board.enter_raw_repl()
328+
self.board.enter_raw_repl(self.soft_reset)
343329
size = len(all_data)
344330
sent = 0
345331

@@ -369,7 +355,7 @@ def put(self, data, name):
369355

370356
def func_run(self, name, code):
371357
self.reply_parser() # reset parser
372-
self.board.enter_raw_repl()
358+
self.board.enter_raw_repl(self.soft_reset)
373359

374360
self.board.exec_raw_no_follow(code)
375361
self.queue.put( ( "downloaded", ) )
@@ -413,7 +399,7 @@ def forceStop(self):
413399
self.board._interrupt = True
414400

415401
def replDo(self, cmd):
416-
self.board.enter_raw_repl()
402+
self.board.enter_raw_repl(self.soft_reset)
417403
self.board.exec_(cmd)
418404
self.board.exit_raw_repl()
419405

@@ -497,7 +483,7 @@ def cmd(self, cmd, cb, parms = None):
497483
if cmd == Board.SCAN:
498484
self.scan()
499485

500-
elif cmd == Board.GET_VERSION:
486+
elif cmd == Board.GET_VERSION:
501487
self.version()
502488

503489
elif cmd == Board.LISTDIR:

src/upide.py

+5
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,11 @@ def on_listdir(self, success, files=None):
615615
self.fileview.set(files)
616616

617617
def on_version(self, success, version):
618+
# enable soft reset unless some LEGO device was detected. The reboot of the
619+
# LEGO firmware does not work properly if the device is rebooted in raw_repl
620+
if not "lego" in version['nodename'].lower():
621+
self.board.set_soft_reset(True)
622+
618623
self.status(self.tr("{0} connected, MicroPython V{1} on {2}").format(self.board.getPort(), version['release'], version['nodename']));
619624
self.fileview.sysname(version['nodename'])
620625
self.sysname = version['nodename']

0 commit comments

Comments
 (0)