def perform_dfu(dev, args): info = fwinfo(dev) if info is None: print('Cannot get FW info from device') return img_ver_dev = info.get_fw_version() img_file = DfuImage(args.dfu_image, info, dev.get_board_name()) img_file_bin = img_file.get_dfu_image_bin_path() if img_file_bin is None: print('No proper update image in file') return print('DFU will use file {}'.format(os.path.basename(img_file_bin))) img_ver_file = img_file.get_dfu_image_version() if img_ver_file is None: print('Cannot read image version from file') return print('Current FW version from device: ' + '.'.join([str(i) for i in img_ver_dev])) print('Current FW version from file: ' + '.'.join([str(i) for i in img_ver_file])) print('Perform update? [y/n]') if not args.autoconfirm: rsp = input().lower() if rsp == 'y': pass elif rsp == 'n': print('DFU rejected by user') return else: print('Improper user input. Operation terminated.') return success = dfu_transfer(dev, img_file_bin, progress_bar) if success: success = fwreboot(dev) if success: print('DFU transfer completed') else: print('DFU transfer failed')
def get_dfu_image_properties(self, filepath): info = fwinfo(self.dev) if info is None: return None, None self.img_file = DfuImage(filepath, info, self.dev.get_board_name()) version = self.img_file.get_dfu_image_version() bin_path = self.img_file.get_dfu_image_bin_path() if version is not None: version_str = '.'.join([str(i) for i in version]) else: version_str = None return version_str, bin_path
class Device: def __init__(self, device_type): self.type = device_type self.dev = NrfHidDevice(device_type, get_device_vid(device_type), get_device_pid(device_type), get_device_pid('dongle')) @staticmethod def list_devices(): devices = hid.enumerate() device_list = [] for device in devices: device_type = get_device_type(device['product_id']) if device_type is not None and \ get_device_vid(device_type) == device['vendor_id']: print("Add {} to device list".format(device_type)) device_list.append(device_type) return device_list def perform_fwinfo(self): return fwinfo(self.dev) def perform_dfu_fwreboot(self, update_animation): fwreboot(self.dev) WAIT_TIME_MAX = 60 CHECK_PERIOD = 0.5 start_time = time.time() # Wait until device turns off while self.dev.initialized(): self.dev.close_device() self.dev = NrfHidDevice(self.type, get_device_vid(self.type), get_device_pid(self.type), get_device_pid('dongle')) time.sleep(CHECK_PERIOD) while not self.dev.initialized(): update_animation() self.dev = NrfHidDevice(self.type, get_device_vid(self.type), get_device_pid(self.type), get_device_pid('dongle')) if time.time() - start_time > WAIT_TIME_MAX: break time.sleep(CHECK_PERIOD) if self.dev.initialized(): print('DFU completed') else: print('Cannot connect to device after reboot') return self.dev.initialized() def setcpi(self, value): opt_config = DEVICE[self.type]['config']['sensor']['options']['cpi'] success = change_config(self.dev, 'sensor', 'cpi', value, opt_config) return success def fetchcpi(self): opt_config = DEVICE[self.type]['config']['sensor']['options']['cpi'] success, val = fetch_config(self.dev, 'sensor', 'cpi', opt_config) if success: return val else: print("Fetch CPI failed") return False def perform_dfu(self, file, update_progressbar): dfu_image = file return dfu_transfer(self.dev, dfu_image, update_progressbar) def get_dfu_image_properties(self, filepath): info = fwinfo(self.dev) if info is None: return None, None self.img_file = DfuImage(filepath, info, self.dev.get_board_name()) version = self.img_file.get_dfu_image_version() bin_path = self.img_file.get_dfu_image_bin_path() if version is not None: version_str = '.'.join([str(i) for i in version]) else: version_str = None return version_str, bin_path