async def erase(self): # must be used by caller before writing any bytes assert not self.readonly assert self.length == 0 # 'already wrote?' for i in range(0, self.max_size, blksize): SF.block_erase(self.start + i) if i and self.message: from glob import dis dis.progress_bar_show(i / self.max_size) # expect block erase to take up to 2 seconds while SF.is_busy(): await sleep_ms(50)
async def interact(self): from version import decode_firmware_header from sflash import SF date, version, _ = decode_firmware_header(self.hdr) msg = '''\ Install this new firmware? {version} {built} Binary checksum and signature will be further verified before any changes are made. '''.format(version=version, built=date) try: ch = await ux_show_story(msg) if ch == 'y': # Accepted: # - write final file header, so bootloader will see it # - reboot to start process from glob import dis import callgate SF.write(self.length, self.hdr) dis.fullscreen('Upgrading...', percent=1) callgate.show_logout(2) else: # they don't want to! self.refused = True SF.block_erase(0) # just in case, but not required await ux_dramatic_pause("Refused.", 2) except BaseException as exc: self.failed = "Exception" sys.print_exception(exc) finally: UserAuthorizedAction.cleanup() # because no results to store self.pop_menu()