@@ -160,17 +160,14 @@ async def task(g=None, prompt="--> "):
160160 else :
161161 cmd = cmd [:- 1 ]
162162 sys .stdout .write ("\x08 \x08 " )
163+ elif c == CHAR_CTRL_A :
164+ await raw_repl (s , g )
165+ break
163166 elif c == CHAR_CTRL_B :
164167 continue
165168 elif c == CHAR_CTRL_C :
166169 if paste :
167170 break
168- if pc == CHAR_CTRL_C and time .ticks_diff (t , pt ) < 20 :
169- # Two very quick Ctrl-C (faster than a human
170- # typing) likely means mpremote trying to
171- # escape.
172- asyncio .new_event_loop ()
173- return
174171 sys .stdout .write ("\n " )
175172 break
176173 elif c == CHAR_CTRL_D :
@@ -240,3 +237,89 @@ async def task(g=None, prompt="--> "):
240237 cmd += b
241238 finally :
242239 micropython .kbd_intr (3 )
240+
241+
242+ async def raw_paste (s , g , window = 512 ):
243+ sys .stdout .write ("R\x01 " ) # supported
244+ sys .stdout .write (bytearray ([window & 0xFF , window >> 8 , 0x01 ]).decode ())
245+ eof = False
246+ idx = 0
247+ buff = bytearray (window )
248+ file = b""
249+ while not eof :
250+ for idx in range (window ):
251+ b = await s .read (1 )
252+ c = ord (b )
253+ if c == CHAR_CTRL_C or c == CHAR_CTRL_D :
254+ # end of file
255+ sys .stdout .write (chr (CHAR_CTRL_D ))
256+ if c == CHAR_CTRL_C :
257+ raise KeyboardInterrupt
258+ file += buff [:idx ]
259+ eof = True
260+ break
261+ buff [idx ] = c
262+
263+ if not eof :
264+ file += buff
265+ sys .stdout .write ("\x01 " ) # indicate window available to host
266+
267+ return file
268+
269+
270+ async def raw_repl (s : asyncio .StreamReader , g : dict ):
271+ heading = "raw REPL; CTRL-B to exit\n "
272+ line = ""
273+ sys .stdout .write (heading )
274+
275+ while True :
276+ line = ""
277+ sys .stdout .write (">" )
278+ while True :
279+ b = await s .read (1 )
280+ c = ord (b )
281+ if c == CHAR_CTRL_A :
282+ rline = line
283+ line = ""
284+
285+ if len (rline ) == 2 and ord (rline [0 ]) == CHAR_CTRL_E :
286+ if rline [1 ] == "A" :
287+ line = await raw_paste (s , g )
288+ break
289+ else :
290+ # reset raw REPL
291+ sys .stdout .write (heading )
292+ sys .stdout .write (">" )
293+ continue
294+ elif c == CHAR_CTRL_B :
295+ # exit raw REPL
296+ sys .stdout .write ("\n " )
297+ return 0
298+ elif c == CHAR_CTRL_C :
299+ # clear line
300+ line = ""
301+ elif c == CHAR_CTRL_D :
302+ # entry finished
303+ # indicate reception of command
304+ sys .stdout .write ("OK" )
305+ break
306+ else :
307+ # let through any other raw 8-bit value
308+ line += b
309+
310+ if len (line ) == 0 :
311+ # Normally used to trigger soft-reset but stay in raw mode.
312+ # Fake it for aiorepl / mpremote.
313+ sys .stdout .write ("Ignored: soft reboot\n " )
314+ sys .stdout .write (heading )
315+
316+ try :
317+ result = exec (line , g )
318+ if result is not None :
319+ sys .stdout .write (repr (result ))
320+ sys .stdout .write (chr (CHAR_CTRL_D ))
321+ except Exception as ex :
322+ print (line )
323+ sys .stdout .write (chr (CHAR_CTRL_D ))
324+ sys .print_exception (ex , sys .stdout )
325+ sys .stdout .write (chr (CHAR_CTRL_D ))
0 commit comments