Skip to content

Commit cf586ce

Browse files
committed
Merge branch 'esp32-download'
2 parents b4b6248 + 57eadad commit cf586ce

28 files changed

Lines changed: 2895 additions & 121 deletions

File tree

mu.code-workspace

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
"folders": [
33
{
44
"path": "."
5+
},
6+
{
7+
"path": "../espzero"
58
}
69
]
710
}

mu/contrib/microfs.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ def flush_to_msg(serial, msg):
7474
if not data.endswith(msg):
7575
if COMMAND_LINE_FLAG:
7676
print(data)
77+
import logging
78+
logging.getLogger(__name__).error("Failed to enter raw REPL. Expected %r, got %r", msg, data)
7779
raise IOError("Could not enter raw REPL.")
7880

7981
def flush(serial):
@@ -84,12 +86,19 @@ def flush(serial):
8486
n = serial.inWaiting()
8587

8688
raw_repl_msg = b"raw REPL; CTRL-B to exit\r\n>"
89+
90+
# Allow board to settle before interrupting
91+
time.sleep(0.5)
92+
8793
# Send CTRL-B to end raw mode if required.
8894
serial.write(b"\x02")
89-
# Send CTRL-C three times between pauses to break out of loop.
90-
for i in range(3):
95+
96+
# Send CTRL-C 10 times with 0.1s pauses to break out of any running loop.
97+
# 0.01s is often too fast for MicroPython to register the interrupt.
98+
for i in range(10):
9199
serial.write(b"\r\x03")
92-
time.sleep(0.01)
100+
time.sleep(0.1)
101+
93102
flush(serial)
94103
# Go into raw mode with CTRL-A.
95104
serial.write(b"\r\x01")
@@ -147,13 +156,23 @@ def execute(commands, serial=None, show_progress=False, callback=None):
147156
total_size = len(commands)
148157
for cnt, command in enumerate(commands):
149158
command_bytes = command.encode("utf-8")
150-
# Send in 256-byte chunks – no sleep needed at 115200 baud
151159
for i in range(0, len(command_bytes), 256):
152160
serial.write(command_bytes[i : min(i + 256, len(command_bytes))])
161+
time.sleep(0.01)
153162
serial.write(b"\x04") # Execute with CTRL-D
154-
response = serial.read_until(b"\x04>") # Read until prompt.
155-
if len(response) > 3: # Check if the split is possible
156-
out, err = response[2:-2].split(b"\x04", 1) # Split stdout, stderr
163+
164+
old_timeout = serial.timeout
165+
serial.timeout = max(old_timeout if old_timeout is not None else 10, 10)
166+
try:
167+
response = serial.read_until(b"\x04>") # Read until prompt.
168+
finally:
169+
serial.timeout = old_timeout
170+
171+
if len(response) >= 2: # OK is 2 bytes
172+
body = response[2:-2]
173+
parts = body.split(b"\x04", 1)
174+
out = parts[0]
175+
err = parts[1] if len(parts) > 1 else b""
157176
result += out
158177
if err:
159178
return b"", err
@@ -239,7 +258,18 @@ def rm(filename, serial=None):
239258
240259
Returns True for success or raises an IOError if there's a problem.
241260
"""
242-
commands = ["import os", "os.remove('{}')".format(filename)]
261+
script = (
262+
"import os\n"
263+
"def r(p):\n"
264+
" try:\n"
265+
" if os.stat(p)[0]&0x4000:\n"
266+
" for c in os.listdir(p): r(p.rstrip('/')+'/'+c)\n"
267+
" os.rmdir(p)\n"
268+
" else: os.remove(p)\n"
269+
" except: pass\n"
270+
"r('{}')"
271+
).format(filename)
272+
commands = [script]
243273
out, err = execute(commands, serial)
244274
if err:
245275
raise IOError(clean_error(err))
@@ -320,7 +350,7 @@ def get(self, filename, target=None, serial=None):
320350
"f = open('{}', 'rb')".format(filename),
321351
"r = f.read",
322352
"result = True",
323-
"while result:\n result = r(32)\n if result:\n sys.stdout.buffer.write(result)\n",
353+
"while result:\n result = r(256)\n if result:\n sys.stdout.buffer.write(result)\n",
324354
"f.close()",
325355
]
326356
out, err = execute(commands, serial, True, self.on_put_update_file)
@@ -363,7 +393,7 @@ def get_by_uart(self, filename, target=None, serial=None):
363393
"f = open('{}', 'rb')".format(filename),
364394
"r = f.read",
365395
"result = True",
366-
"while result:\n result = r(32)\n if result:\n u.write(result)\n",
396+
"while result:\n result = r(256)\n if result:\n u.write(result)\n",
367397
"f.close()",
368398
]
369399
out, err = execute(commands, serial, True, self.on_put_update_file)

mu/interface/dialogs.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,10 @@ def setup(self, log, settings, packages, mode, device_list):
604604
self.esp_widget = ESPFirmwareFlasherWidget(self)
605605
self.esp_widget.setup(mode, device_list)
606606
self.tabs.addTab(self.esp_widget, _("ESP Firmware flasher"))
607+
from mu.interface.esp_flasher.dialog import EspOnlineFlasherWidget
608+
self.esp_online_widget = EspOnlineFlasherWidget(self)
609+
self.esp_online_widget.setup(mode, device_list)
610+
self.tabs.addTab(self.esp_online_widget, _("ESP Online Flasher"))
607611
if mode.short_name == "pico":
608612
from mu.interface.pico_flasher.dialog import PicoFirmwareFlasherWidget
609613
self.pico_flasher_widget = PicoFirmwareFlasherWidget(self)

mu/interface/editor.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,19 @@ def _build_jedi_project(file_path):
6868
"""
6969
workspace = os.path.join(mu_config.HOME_DIRECTORY, mu_config.WORKSPACE_NAME)
7070
_mu_pkg = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
71-
mu_resources_pico = os.path.join(_mu_pkg, "resources", "pico")
72-
mu_resources_pgz = os.path.join(_mu_pkg, "resources", "pygamezero")
71+
mu_resources_pico = os.path.join(_mu_pkg, "resources", "pico")
72+
mu_resources_pgz = os.path.join(_mu_pkg, "resources", "pygamezero")
73+
mu_resources_esp32 = os.path.join(_mu_pkg, "resources", "esp32")
7374

7475
extra_paths = []
7576
for candidate in [
7677
workspace,
7778
os.path.join(workspace, "pico_lib"),
79+
os.path.join(workspace, "esp32_lib"),
7880
os.path.dirname(file_path) if file_path else None,
7981
mu_resources_pico,
8082
mu_resources_pgz,
83+
mu_resources_esp32,
8184
]:
8285
if candidate and os.path.isdir(candidate) and candidate not in extra_paths:
8386
extra_paths.append(candidate)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# ESP Firmware Flasher package

0 commit comments

Comments
 (0)