Ejemplo n.º 1
0
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')
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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