def go(): # Wrapper for better error handling/recovery at top level. # try: loop.run_forever() except BaseException as exc: from usb import is_vcp_active is_debug = is_vcp_active() if is_debug and isinstance(exc, KeyboardInterrupt): # preserve GUI state, but want to see where we are print("KeyboardInterrupt") raise elif isinstance(exc, SystemExit): # Ctrl-D and warm reboot cause this, not bugs raise else: # show stacktrace for debug photos try: import uio, ux tmp = uio.StringIO() sys.print_exception(exc, tmp) msg = tmp.getvalue() del tmp print(msg) ux.show_fatal_error(msg) except: pass # securely die (wipe memory) if not is_debug: try: import callgate callgate.show_logout(1) except: pass
def die_with_debug(exc): from usb import is_vcp_active is_debug = is_vcp_active() if is_debug and isinstance(exc, KeyboardInterrupt): # preserve GUI state, but want to see where we are print("KeyboardInterrupt") raise exc elif isinstance(exc, SystemExit): # Ctrl-D and warm reboot cause this, not bugs raise exc else: # show stacktrace for debug photos try: import uio, ux tmp = uio.StringIO() sys.print_exception(exc, tmp) msg = tmp.getvalue() del tmp print(msg) ux.show_fatal_error(msg) except: pass # securely die (wipe memory) if not is_debug: try: import callgate callgate.show_logout(1) except: pass
async def monitor_usb(): # Provide a helpful message when virtual serial port is connected. # Without this, they have to press enter or something to see they are connected. from usb import is_vcp_active u = pyb.USB_VCP() was_connected = u.isconnected() while 1: await sleep_ms(100) conn = u.isconnected() if conn and not was_connected: # this direct write bypasses vcp_lockdown code. if is_vcp_active(): u.write(b"\r\nWelcome to Coldcard! Press ^C to stop GUI and enter REPL.\r\n") else: u.write(b"\r\nColdcard developer features disabled.\r\n") was_connected = conn
async def dev_enable_vcp(*a): # Enable USB serial port emulation, for devs. # from usb import is_vcp_active if is_vcp_active(): await ux_show_story("""The USB virtual serial port is already enabled.""") return was = pyb.usb_mode() pyb.usb_mode(None) if was and 'MSC' in was: pyb.usb_mode('VCP+MSC') else: pyb.usb_mode('VCP+HID') # allow REPL access ckcc.vcp_enabled(True) await ux_show_story("""\ The USB virtual serial port has now been enabled. Use a real computer to connect to it.""")