コード例 #1
0
ファイル: examples.py プロジェクト: Jesus89/apio
    def _copy_files(self, example, src_path, dest_path, sayno):
        click.secho('Copying ' + example + ' example files ...')
        example_files = glob.glob(util.safe_join(src_path, '*'))
        for f in example_files:
            filename = basename(f)
            if filename != 'info':
                filepath = util.safe_join(dest_path, filename)
                if isfile(filepath):

                    # -- If sayno, do not copy the file. Move to the next
                    if sayno:
                        continue

                    click.secho(
                        'Warning: ' + filename + ' file already exists',
                        fg='yellow')
                    if click.confirm('Do you want to replace it?'):
                        shutil.copy(f, dest_path)
                elif isdir(filepath):
                    click.secho(
                        'Warning: ' + filename + ' is already a directory',
                        fg='yellow')
                    return
                else:
                    shutil.copy(f, filepath)
        click.secho(
            'Example files \'{}\' have been successfully created!'.format(
                example
            ), fg='green')
コード例 #2
0
ファイル: examples.py プロジェクト: zwl1671/apio
    def copy_example_dir(self, example, project_dir, sayno):
        if util.check_package(self.name, self.version, self.spec_version,
                              self.examples_dir):
            project_dir = util.check_dir(project_dir)
            example_path = util.safe_join(project_dir, example)
            local_example_path = util.safe_join(self.examples_dir, example)

            if isdir(local_example_path):
                if isdir(example_path):

                    # -- If sayno, do not copy anything
                    if not sayno:
                        click.secho('Warning: ' + example +
                                    ' directory already exists',
                                    fg='yellow')

                        if click.confirm('Do you want to replace it?'):
                            shutil.rmtree(example_path)
                            self._copy_dir(example, local_example_path,
                                           example_path)
                elif isfile(example_path):
                    click.secho('Warning: ' + example + ' is already a file',
                                fg='yellow')
                else:
                    self._copy_dir(example, local_example_path, example_path)
            else:
                click.secho(EXAMPLE_NOT_FOUND_MSG, fg='yellow')
        else:
            return 1
        return 0
コード例 #3
0
ファイル: examples.py プロジェクト: Jesus89/apio
 def list_examples(self):
     if util.check_package(
         self.name,
         self.version,
         self.spec_version,
         self.examples_dir
     ):
         # examples = sorted(os.listdir(self.examples_dir))
         examples = [dirname(y).replace(self.examples_dir + sep, '')
                     for x in os.walk(self.examples_dir)
                     for y in glob.glob(util.safe_join(x[0], 'info'))]
         click.secho('')
         for example in examples:
             example_dir = util.safe_join(self.examples_dir, example)
             if isdir(example_dir):
                 info_path = util.safe_join(example_dir, 'info')
                 info = ''
                 if isfile(info_path):
                     with codecs.open(info_path, 'r', 'utf-8') as info_file:
                         info = info_file.read().replace('\n', '')
                 click.secho(' ' + example, fg='blue', bold=True)
                 click.secho('-' * click.get_terminal_size()[0])
                 click.secho(' ' + info)
                 click.secho('')
         click.secho(EXAMPLE_DIR_FILE, fg='green')
         click.secho(EXAMPLE_OF_USE_CAD, fg='green')
     else:
         return 1
     return 0
コード例 #4
0
ファイル: examples.py プロジェクト: Jesus89/apio
    def copy_example_dir(self, example, project_dir, sayno):
        if util.check_package(
            self.name,
            self.version,
            self.spec_version,
            self.examples_dir
        ):
            project_dir = util.check_dir(project_dir)
            example_path = util.safe_join(project_dir, example)
            local_example_path = util.safe_join(self.examples_dir, example)

            if isdir(local_example_path):
                if isdir(example_path):

                    # -- If sayno, do not copy anything
                    if not sayno:
                        click.secho(
                            'Warning: ' + example +
                            ' directory already exists', fg='yellow')

                        if click.confirm('Do you want to replace it?'):
                            shutil.rmtree(example_path)
                            self._copy_dir(example, local_example_path,
                                           example_path)
                elif isfile(example_path):
                    click.secho(
                        'Warning: ' + example + ' is already a file',
                        fg='yellow')
                else:
                    self._copy_dir(example, local_example_path, example_path)
            else:
                click.secho(EXAMPLE_NOT_FOUND_MSG, fg='yellow')
        else:
            return 1
        return 0
コード例 #5
0
    def _serial_enable_windows(self):
        drivers_base_dir = util.get_package_dir('tools-drivers')
        drivers_bin_dir = util.safe_join(drivers_base_dir, 'bin')

        try:
            if util.check_package(
                self.name,
                self.version,
                self.spec_version,
                drivers_bin_dir
            ):
                click.secho('Launch drivers configuration tool')
                click.secho(SERIAL_INSTALL_DRIVER_INSTRUCTIONS, fg='yellow')
                result = util.exec_command(
                    util.safe_join(drivers_bin_dir, 'serial_install.exe'))
                click.secho('Serial drivers configuration finished',
                            fg='green')
            else:
                result = 1
        except Exception as e:
            click.secho('Error: ' + str(e), fg='red')
            result = 1

        if not isinstance(result, int):
            result = result.get('returncode')
        return result
コード例 #6
0
ファイル: examples.py プロジェクト: zwl1671/apio
 def list_examples(self):
     if util.check_package(self.name, self.version, self.spec_version,
                           self.examples_dir):
         # examples = sorted(os.listdir(self.examples_dir))
         examples = [
             dirname(y).replace(self.examples_dir + sep, '')
             for x in os.walk(self.examples_dir)
             for y in glob.glob(util.safe_join(x[0], 'info'))
         ]
         click.secho('')
         for example in examples:
             example_dir = util.safe_join(self.examples_dir, example)
             if isdir(example_dir):
                 info_path = util.safe_join(example_dir, 'info')
                 info = ''
                 if isfile(info_path):
                     with codecs.open(info_path, 'r', 'utf-8') as info_file:
                         info = info_file.read().replace('\n', '')
                 click.secho(' ' + example, fg='blue', bold=True)
                 click.secho('-' * click.get_terminal_size()[0])
                 click.secho(' ' + info)
                 click.secho('')
         click.secho(EXAMPLE_DIR_FILE, fg='green')
         click.secho(EXAMPLE_OF_USE_CAD, fg='green')
     else:
         return 1
     return 0
コード例 #7
0
ファイル: scons.py プロジェクト: Jesus89/apio
    def run(self, command, variables=[], board=None, packages=[]):
        """Executes scons for building"""

        # -- Check for the SConstruct file
        if not isfile(util.safe_join(util.get_project_dir(), 'SConstruct')):
            variables += ['-f']
            variables += [util.safe_join(
                util.get_folder('resources'), 'SConstruct')]
        else:
            click.secho('Info: use custom SConstruct file')

        # -- Resolve packages
        if self.profile.check_exe_default():
            # Run on `default` config mode
            if not util.resolve_packages(
              packages,
              self.profile.packages,
              self.resources.distribution.get('packages')
             ):
                # Exit if a package is not installed
                raise Exception
        else:
            click.secho('Info: native config mode')

        # -- Execute scons
        return self._execute_scons(command, variables, board)
コード例 #8
0
    def _enable_windows(self):
        drivers_base_dir = util.get_package_dir('tools-drivers')
        drivers_bin_dir = util.safe_join(drivers_base_dir, 'bin')
        drivers_share_dir = util.safe_join(drivers_base_dir, 'share')
        zadig_ini_path = util.safe_join(drivers_share_dir, 'zadig.ini')
        zadig_ini = 'zadig.ini'

        try:
            if isdir(drivers_bin_dir):
                click.secho('Launch drivers configuration tool')
                click.secho(FTDI_INSTALL_DRIVER_INSTRUCTIONS, fg='yellow')
                # Copy zadig.ini
                with open(zadig_ini, 'w') as ini_file:
                    with open(zadig_ini_path, 'r') as local_ini_file:
                        ini_file.write(local_ini_file.read())

                result = util.exec_command(
                    util.safe_join(drivers_bin_dir, 'zadig.exe'))
                click.secho('FPGA drivers configuration finished', fg='green')
            else:
                util._check_package('drivers')
                result = 1
        except Exception as e:
            click.secho('Error: ' + str(e), fg='red')
            result = 1
        finally:
            # Remove zadig.ini
            if isfile(zadig_ini):
                os.remove(zadig_ini)

        if not isinstance(result, int):
            result = result['returncode']
        return result
コード例 #9
0
ファイル: installer.py プロジェクト: pcossutta/apio
 def _rename_unpacked_dir(self):
     if self.uncompressed_name:
         unpack_dir = util.safe_join(self.packages_dir,
                                     self.uncompressed_name)
         package_dir = util.safe_join(self.packages_dir, self.package_name)
         if isdir(unpack_dir):
             rename(unpack_dir, package_dir)
コード例 #10
0
    def create_sconstruct(self, project_dir='', sayyes=False):
        """Creates a default SConstruct file"""

        project_dir = util.check_dir(project_dir)

        sconstruct_name = 'SConstruct'
        sconstruct_path = util.safe_join(project_dir, sconstruct_name)
        local_sconstruct_path = util.safe_join(
            util.get_folder('resources'), sconstruct_name)

        if isfile(sconstruct_path):
            # -- If sayyes, skip the question
            if sayyes:
                self._copy_sconstruct_file(sconstruct_name, sconstruct_path,
                                           local_sconstruct_path)
            else:
                click.secho(
                    'Warning: {} file already exists'.format(sconstruct_name),
                    fg='yellow')

                if click.confirm('Do you want to replace it?'):
                    self._copy_sconstruct_file(sconstruct_name,
                                               sconstruct_path,
                                               local_sconstruct_path)
                else:
                    click.secho('Abort!', fg='red')

        else:
            self._copy_sconstruct_file(sconstruct_name, sconstruct_path,
                                       local_sconstruct_path)
コード例 #11
0
    def run(self, command, variables=[], board=None, packages=[]):
        """Executes scons for building"""

        # -- Check for the SConstruct file
        if not isfile(util.safe_join(util.get_project_dir(), 'SConstruct')):
            variables += ['-f']
            variables += [
                util.safe_join(util.get_folder('resources'), 'SConstruct')
            ]
        else:
            click.secho('Info: use custom SConstruct file')

        # -- Resolve packages
        if self.profile.check_exe_default():
            # Run on `default` config mode
            if not util.resolve_packages(
                    packages, self.profile.packages,
                    self.resources.distribution.get('packages')):
                # Exit if a package is not installed
                raise Exception
        else:
            click.secho('Info: native config mode')

        # -- Execute scons
        return self._execute_scons(command, variables, board)
コード例 #12
0
ファイル: examples.py プロジェクト: zwl1671/apio
    def _copy_files(self, example, src_path, dest_path, sayno):
        click.secho('Copying ' + example + ' example files ...')
        example_files = glob.glob(util.safe_join(src_path, '*'))
        for f in example_files:
            filename = basename(f)
            if filename != 'info':
                filepath = util.safe_join(dest_path, filename)
                if isfile(filepath):

                    # -- If sayno, do not copy the file. Move to the next
                    if sayno:
                        continue

                    click.secho('Warning: ' + filename +
                                ' file already exists',
                                fg='yellow')
                    if click.confirm('Do you want to replace it?'):
                        shutil.copy(f, dest_path)
                elif isdir(filepath):
                    click.secho('Warning: ' + filename +
                                ' is already a directory',
                                fg='yellow')
                    return
                else:
                    shutil.copy(f, filepath)
        click.secho(
            'Example files \'{}\' have been successfully created!'.format(
                example),
            fg='green')
コード例 #13
0
ファイル: examples.py プロジェクト: tinyfpga/apio
    def copy_example_dir(self, example, project_dir, sayno):
        if isdir(self.examples_dir):

            project_dir = util.check_dir(project_dir)
            example_path = util.safe_join(project_dir, example)
            local_example_path = util.safe_join(self.examples_dir, example)

            if isdir(local_example_path):
                if isdir(example_path):

                    # -- If sayno, do not copy anything
                    if not sayno:
                        click.secho('Warning: ' + example +
                                    ' directory already exists',
                                    fg='yellow')

                        if click.confirm('Do you want to replace it?'):
                            shutil.rmtree(example_path)
                            self._copy_dir(example, local_example_path,
                                           example_path)
                elif isfile(example_path):
                    click.secho('Warning: ' + example + ' is already a file',
                                fg='yellow')
                else:
                    self._copy_dir(example, local_example_path, example_path)
            else:
                click.secho(EXAMPLE_NOT_FOUND_MSG, fg='yellow')
        else:
            click.secho('Error: examples are not installed', fg='red')
            click.secho('Please run:\n'
                        '   apio install examples',
                        fg='yellow')
            return 1
        return 0
コード例 #14
0
ファイル: installer.py プロジェクト: Jesus89/apio
 def _rename_unpacked_dir(self):
     if self.uncompressed_name:
         unpack_dir = util.safe_join(
             self.packages_dir, self.uncompressed_name)
         package_dir = util.safe_join(
             self.packages_dir, self.package_name)
         if isdir(unpack_dir):
             rename(unpack_dir, package_dir)
コード例 #15
0
ファイル: installer.py プロジェクト: pcossutta/apio
 def uninstall(self):
     if isdir(util.safe_join(self.packages_dir, self.package_name)):
         click.echo('Uninstalling %s package:' %
                    click.style(self.package, fg='cyan'))
         shutil.rmtree(util.safe_join(self.packages_dir, self.package_name))
         click.secho("""Package \'{}\' has been """
                     """successfully uninstalled!""".format(self.package),
                     fg='green')
     else:
         util.show_package_path_error(self.package)
     self.profile.remove_package(self.package)
     self.profile.save()
コード例 #16
0
ファイル: installer.py プロジェクト: Jesus89/apio
 def uninstall(self):
     if isdir(util.safe_join(self.packages_dir, self.package_name)):
         click.echo('Uninstalling %s package:' % click.style(
             self.package, fg='cyan'))
         shutil.rmtree(
             util.safe_join(self.packages_dir, self.package_name))
         click.secho(
             """Package \'{}\' has been """
             """successfully uninstalled!""".format(self.package),
             fg='green')
     else:
         util.show_package_path_error(self.package)
     self.profile.remove_package(self.package)
     self.profile.save()
コード例 #17
0
    def _run(self, command):
        result = {}
        system_base_dir = util.get_package_dir('tools-system')
        system_bin_dir = util.safe_join(system_base_dir, 'bin')

        if isdir(system_bin_dir):
            result = util.exec_command(util.safe_join(system_bin_dir,
                                                      command + self.ext),
                                       stdout=util.AsyncPipe(self._on_run_out),
                                       stderr=util.AsyncPipe(self._on_run_out))
        else:
            util._check_package('system')
            return 1

        return result
コード例 #18
0
    def create_ini(self, board, project_dir='', sayyes=False):
        """Creates a new apio project file"""

        project_dir = util.check_dir(project_dir)

        ini_path = util.safe_join(project_dir, PROJECT_FILENAME)

        # Check board
        boards = Resources().boards
        if board not in boards.keys():
            click.secho(
                'Error: no such board \'{}\''.format(board),
                fg='red')
            sys.exit(1)

        if isfile(ini_path):
            # -- If sayyes, skip the question
            if sayyes:
                self._create_ini_file(board, ini_path, PROJECT_FILENAME)
            else:
                click.secho(
                    'Warning: {} file already exists'.format(PROJECT_FILENAME),
                    fg='yellow')
                if click.confirm('Do you want to replace it?'):
                    self._create_ini_file(board, ini_path, PROJECT_FILENAME)
                else:
                    click.secho('Abort!', fg='red')
        else:
            self._create_ini_file(board, ini_path, PROJECT_FILENAME)
コード例 #19
0
    def _run_command(self, command, silent=False):
        result = {}
        system_base_dir = util.get_package_dir('tools-system')
        system_bin_dir = util.safe_join(system_base_dir, 'bin')

        on_stdout = None if silent else self._on_stdout
        on_stderr = self._on_stderr

        if util.check_package(self.name, self.version, self.spec_version,
                              system_bin_dir):
            result = util.exec_command(util.safe_join(system_bin_dir,
                                                      command + self.ext),
                                       stdout=util.AsyncPipe(on_stdout),
                                       stderr=util.AsyncPipe(on_stderr))

        return result
コード例 #20
0
ファイル: resources.py プロジェクト: pcossutta/apio
 def _load_resource(self, name):
     resource = None
     filepath = util.safe_join(util.get_folder('resources'), name + '.json')
     with open(filepath, 'r') as f:
         # Load the JSON file
         resource = json.loads(f.read())
     return resource
コード例 #21
0
ファイル: resources.py プロジェクト: Jesus89/apio
 def _load_resource(self, name):
     resource = None
     filepath = util.safe_join(util.get_folder('resources'), name + '.json')
     with open(filepath, 'r') as f:
         # Load the JSON file
         resource = json.loads(f.read())
     return resource
コード例 #22
0
ファイル: __main__.py プロジェクト: x653/apio
 def get_command(self, ctx, name):
     ns = {}
     fn = util.safe_join(commands_folder, name + '.py')
     if isfile(fn):
         with open(fn) as f:
             code = compile(f.read(), fn, 'exec')
             eval(code, ns, ns)
         return ns.get('cli')
コード例 #23
0
ファイル: profile.py プロジェクト: jpenalbae/apio
 def __init__(self):
     self.config = {'exe': 'default', 'verbose': 0}
     self.labels = {'exe': 'Executable', 'verbose': 'Verbose'}
     self.settings = {}
     self.packages = {}
     self._profile_path = util.safe_join(util.get_home_dir(),
                                         'profile.json')
     self.load()
コード例 #24
0
ファイル: __main__.py プロジェクト: Jesus89/apio
 def get_command(self, ctx, name):
     ns = {}
     fn = util.safe_join(commands_folder, name + '.py')
     if isfile(fn):
         with open(fn) as f:
             code = compile(f.read(), fn, 'exec')
             eval(code, ns, ns)
         return ns.get('cli')
コード例 #25
0
ファイル: installer.py プロジェクト: pcossutta/apio
    def _install_package(self, dlpath):
        if dlpath:
            package_dir = util.safe_join(self.packages_dir, self.package_name)
            if isdir(package_dir):
                shutil.rmtree(package_dir)
            if self.uncompressed_name:
                self._unpack(dlpath, self.packages_dir)
            else:
                self._unpack(
                    dlpath, util.safe_join(self.packages_dir,
                                           self.package_name))

            remove(dlpath)
            self.profile.add_package(self.package, self.version)
            self.profile.save()
            click.secho("""Package \'{}\' has been """
                        """successfully installed!""".format(self.package),
                        fg='green')
コード例 #26
0
ファイル: installer.py プロジェクト: Jesus89/apio
    def _install_package(self, dlpath):
        if dlpath:
            package_dir = util.safe_join(
                self.packages_dir, self.package_name)
            if isdir(package_dir):
                shutil.rmtree(package_dir)
            if self.uncompressed_name:
                self._unpack(dlpath, self.packages_dir)
            else:
                self._unpack(dlpath, util.safe_join(
                    self.packages_dir, self.package_name))

            remove(dlpath)
            self.profile.add_package(self.package, self.version)
            self.profile.save()
            click.secho(
                """Package \'{}\' has been """
                """successfully installed!""".format(self.package),
                fg='green')
コード例 #27
0
ファイル: system.py プロジェクト: Jesus89/apio
    def _run_command(self, command, silent=False):
        result = {}
        system_base_dir = util.get_package_dir('tools-system')
        system_bin_dir = util.safe_join(system_base_dir, 'bin')

        on_stdout = None if silent else self._on_stdout
        on_stderr = self._on_stderr

        if util.check_package(
            self.name,
            self.version,
            self.spec_version,
            system_bin_dir
        ):
            result = util.exec_command(
                util.safe_join(system_bin_dir, command + self.ext),
                stdout=util.AsyncPipe(on_stdout),
                stderr=util.AsyncPipe(on_stderr))

        return result
コード例 #28
0
    def get_command(self, ctx, name):
        ns = {}

        # -- Get the full filename of the python file for the command name
        fn = util.safe_join(commands_folder, name + '.py')
        
        # -- Return the cli function of the command
        if isfile(fn):
            with open(fn) as f:
                code = compile(f.read(), fn, 'exec')
                eval(code, ns, ns)
            return ns.get('cli')
コード例 #29
0
ファイル: drivers.py プロジェクト: Jesus89/apio
    def _ftdi_enable_windows(self):
        drivers_base_dir = util.get_package_dir('tools-drivers')
        drivers_bin_dir = util.safe_join(drivers_base_dir, 'bin')
        drivers_share_dir = util.safe_join(drivers_base_dir, 'share')
        zadig_ini_path = util.safe_join(drivers_share_dir, 'zadig.ini')
        zadig_ini = 'zadig.ini'

        try:
            if util.check_package(
                self.name,
                self.version,
                self.spec_version,
                drivers_bin_dir
            ):
                click.secho('Launch drivers configuration tool')
                click.secho(FTDI_INSTALL_DRIVER_INSTRUCTIONS, fg='yellow')
                # Copy zadig.ini
                with open(zadig_ini, 'w') as ini_file:
                    with open(zadig_ini_path, 'r') as local_ini_file:
                        ini_file.write(local_ini_file.read())

                result = util.exec_command(
                    util.safe_join(drivers_bin_dir, 'zadig.exe'))
                click.secho('FTDI drivers configuration finished',
                            fg='green')
            else:
                result = 1
        except Exception as e:
            click.secho('Error: ' + str(e), fg='red')
            result = 1
        finally:
            # Remove zadig.ini
            if isfile(zadig_ini):
                os.remove(zadig_ini)

        if not isinstance(result, int):
            result = result.get('returncode')
        return result
コード例 #30
0
ファイル: examples.py プロジェクト: zwl1671/apio
    def copy_example_files(self, example, project_dir, sayno):
        if util.check_package(self.name, self.version, self.spec_version,
                              self.examples_dir):
            project_dir = util.check_dir(project_dir)
            example_path = project_dir
            local_example_path = util.safe_join(self.examples_dir, example)

            if isdir(local_example_path):
                self._copy_files(example, local_example_path, example_path,
                                 sayno)
            else:
                click.secho(EXAMPLE_NOT_FOUND_MSG, fg='yellow')
        else:
            return 1
        return 0
コード例 #31
0
ファイル: downloader.py プロジェクト: zwl1671/apio
    def __init__(self, url, dest_dir=None):
        self._url = url
        self._fname = url.split('/')[-1]

        self._destination = self._fname
        if dest_dir:
            self.set_destination(util.safe_join(dest_dir, self._fname))

        self._progressbar = None
        self._request = None

        # make connection
        self._request = requests.get(url, stream=True)
        if self._request.status_code != 200:
            raise FDUnrecognizedStatusCode(self._request.status_code, url)
コード例 #32
0
ファイル: profile.py プロジェクト: jpenalbae/apio
 def get_package_version(self, name, release_name=''):
     version = '0.0.0'
     if name in self.packages.keys():
         version = self.packages[name]['version']
     elif release_name:
         dir_name = util.get_package_dir(release_name)
         if isdir(dir_name):
             filepath = util.safe_join(dir_name, 'package.json')
             try:
                 with open(filepath, 'r') as json_file:
                     tmp_data = json.load(json_file)
                     if 'version' in tmp_data.keys():
                         version = tmp_data['version']
             except Exception:
                 pass
     return version
コード例 #33
0
ファイル: examples.py プロジェクト: Jesus89/apio
    def copy_example_files(self, example, project_dir, sayno):
        if util.check_package(
            self.name,
            self.version,
            self.spec_version,
            self.examples_dir
        ):
            project_dir = util.check_dir(project_dir)
            example_path = project_dir
            local_example_path = util.safe_join(self.examples_dir, example)

            if isdir(local_example_path):
                self._copy_files(example, local_example_path,
                                 example_path, sayno)
            else:
                click.secho(EXAMPLE_NOT_FOUND_MSG, fg='yellow')
        else:
            return 1
        return 0
コード例 #34
0
ファイル: examples.py プロジェクト: tinyfpga/apio
    def copy_example_files(self, example, project_dir, sayno):
        if isdir(self.examples_dir):

            project_dir = util.check_dir(project_dir)
            example_path = project_dir
            local_example_path = util.safe_join(self.examples_dir, example)

            if isdir(local_example_path):
                self._copy_files(example, local_example_path, example_path,
                                 sayno)
            else:
                click.secho(EXAMPLE_NOT_FOUND_MSG, fg='yellow')
        else:
            click.secho('Error: examples are not installed', fg='red')
            click.secho('Please run:\n'
                        '   apio install examples',
                        fg='yellow')
            return 1
        return 0
コード例 #35
0
class Drivers(object):  # pragma: no cover

    # FTDI rules files paths
    ftdi_rules_local_path = util.safe_join(
        util.get_folder('resources'), '80-fpga-ftdi.rules')
    ftdi_rules_system_path = '/etc/udev/rules.d/80-fpga-ftdi.rules'
    old_ftdi_rules_system_path = '/etc/udev/rules.d/80-icestick.rules'

    # Serial rules files paths
    serial_rules_local_path = util.safe_join(
        util.get_folder('resources'), '80-fpga-serial.rules')
    serial_rules_system_path = '/etc/udev/rules.d/80-fpga-serial.rules'

    # Driver to restore: mac os
    driverC = ''

    def ftdi_enable(self):
        if 'linux' in platform:
            return self._ftdi_enable_linux()
        elif 'darwin' in platform:
            self._setup_darwin()
            return self._ftdi_enable_darwin()
        elif 'windows' in platform:
            self._setup_windows()
            return self._ftdi_enable_windows()

    def ftdi_disable(self):
        if 'linux' in platform:
            return self._ftdi_disable_linux()
        elif 'darwin' in platform:
            self._setup_darwin()
            return self._ftdi_disable_darwin()
        elif 'windows' in platform:
            self._setup_windows()
            return self._ftdi_disable_windows()

    def serial_enable(self):
        if 'linux' in platform:
            return self._serial_enable_linux()
        elif 'darwin' in platform:
            self._setup_darwin()
            return self._serial_enable_darwin()
        elif 'windows' in platform:
            self._setup_windows()
            return self._serial_enable_windows()

    def serial_disable(self):
        if 'linux' in platform:
            return self._serial_disable_linux()
        elif 'darwin' in platform:
            self._setup_darwin()
            return self._serial_disable_darwin()
        elif 'windows' in platform:
            self._setup_windows()
            return self._serial_disable_windows()

    def pre_upload(self):
        if 'darwin' in platform:
            self._setup_darwin()
            self._pre_upload_darwin()

    def post_upload(self):
        if 'darwin' in platform:
            self._setup_darwin()
            self._post_upload_darwin()

    def _setup_darwin(self):
        self.profile = Profile()

    def _setup_windows(self):
        profile = Profile()
        resources = Resources()

        self.name = 'drivers'
        self.version = util.get_package_version(self.name, profile)
        self.spec_version = util.get_package_spec_version(self.name, resources)

    def _ftdi_enable_linux(self):
        click.secho('Configure FTDI drivers for FPGA')
        if not isfile(self.ftdi_rules_system_path):
            subprocess.call(['sudo', 'cp',
                             self.ftdi_rules_local_path,
                             self.ftdi_rules_system_path])
            self._reload_rules()
            click.secho('FTDI drivers enabled', fg='green')
            click.secho('Unplug and reconnect your board', fg='yellow')
        else:
            click.secho('Already enabled', fg='yellow')

    def _ftdi_disable_linux(self):
        if isfile(self.old_ftdi_rules_system_path):
            subprocess.call(['sudo', 'rm', self.old_ftdi_rules_system_path])
        if isfile(self.ftdi_rules_system_path):
            click.secho('Revert FTDI drivers configuration')
            subprocess.call(['sudo', 'rm', self.ftdi_rules_system_path])
            self._reload_rules()
            click.secho('FTDI drivers disabled', fg='green')
            click.secho('Unplug and reconnect your board', fg='yellow')
        else:
            click.secho('Already disabled', fg='yellow')

    def _serial_enable_linux(self):
        click.secho('Configure Serial drivers for FPGA')
        if not isfile(self.serial_rules_system_path):
            group_added = self._add_dialout_group()
            subprocess.call(['sudo', 'cp',
                            self.serial_rules_local_path,
                            self.serial_rules_system_path])
            self._reload_rules()
            click.secho('Serial drivers enabled', fg='green')
            click.secho('Unplug and reconnect your board', fg='yellow')
            if group_added:
                click.secho('Restart your machine to enable the dialout group',
                            fg='yellow')
        else:
            click.secho('Already enabled', fg='yellow')

    def _serial_disable_linux(self):
        if isfile(self.serial_rules_system_path):
            click.secho('Revert Serial drivers configuration')
            subprocess.call(['sudo', 'rm', self.serial_rules_system_path])
            self._reload_rules()
            click.secho('Serial drivers disabled', fg='green')
            click.secho('Unplug and reconnect your board', fg='yellow')
        else:
            click.secho('Already disabled', fg='yellow')

    def _reload_rules(self):
        subprocess.call(['sudo', 'udevadm', 'control', '--reload-rules'])
        subprocess.call(['sudo', 'udevadm', 'trigger'])
        subprocess.call(['sudo', 'service', 'udev', 'restart'])

    def _add_dialout_group(self):
        groups = subprocess.check_output('groups')
        if 'dialout' not in groups:
            subprocess.call('sudo usermod -a -G dialout $USER', shell=True)
            return True

    def _ftdi_enable_darwin(self):
        # Check homebrew
        brew = subprocess.call('which brew > /dev/null', shell=True)
        if brew != 0:
            click.secho('Error: homebrew is required', fg='red')
        else:
            click.secho('Enable FTDI drivers for FPGA')
            subprocess.call(['brew', 'update'])
            self._brew_install('libffi')
            self._brew_install('libftdi')
            self.profile.add_setting('macos_ftdi_drivers', True)
            self.profile.save()
            click.secho('FTDI drivers enabled', fg='green')

    def _ftdi_disable_darwin(self):
        click.secho('Disable FTDI drivers configuration')
        self.profile.add_setting('macos_ftdi_drivers', False)
        self.profile.save()
        click.secho('FTDI drivers disabled', fg='green')

    def _serial_enable_darwin(self):
        # Check homebrew
        brew = subprocess.call('which brew > /dev/null', shell=True)
        if brew != 0:
            click.secho('Error: homebrew is required', fg='red')
        else:
            click.secho('Enable Serial drivers for FPGA')
            subprocess.call(['brew', 'update'])
            self._brew_install('libffi')
            self._brew_install('libusb')
            # self._brew_install_serial_drivers()
            click.secho('Serial drivers enabled', fg='green')

    def _serial_disable_darwin(self):
        click.secho('Disable Serial drivers configuration')
        click.secho('Serial drivers disabled', fg='green')

    def _brew_install(self, package):
        subprocess.call(['brew', 'install', '--force', package])
        subprocess.call(['brew', 'unlink', package])
        subprocess.call(['brew', 'link', '--force', package])

    def _brew_install_serial_drivers(self):
        subprocess.call(
            ['brew', 'tap', 'mengbo/ch340g-ch34g-ch34x-mac-os-x-driver',
             'https://github.com/mengbo/ch340g-ch34g-ch34x-mac-os-x-driver'])
        subprocess.call(
            ['brew', 'cask', 'install', 'wch-ch34x-usb-serial-driver'])

    def _pre_upload_darwin(self):
        if self.profile.settings.get('macos_ftdi_drivers', False):
            # Check and unload the drivers
            driverA = 'com.FTDI.driver.FTDIUSBSerialDriver'
            driverB = 'com.apple.driver.AppleUSBFTDI'
            if self._check_ftdi_driver_darwin(driverA):
                subprocess.call(['sudo', 'kextunload', '-b', driverA])
                self.driverC = driverA
            elif self._check_ftdi_driver_darwin(driverB):
                subprocess.call(['sudo', 'kextunload', '-b', driverB])
                self.driverC = driverB

    def _post_upload_darwin(self):
        if self.profile.settings.get('macos_ftdi_drivers', False):
            # Restore previous driver configuration
            if self.driverC:
                subprocess.call(['sudo', 'kextload', '-b', self.driverC])

    def _check_ftdi_driver_darwin(self, driver):
        return driver in str(subprocess.check_output(['kextstat']))

    def _ftdi_enable_windows(self):
        drivers_base_dir = util.get_package_dir('tools-drivers')
        drivers_bin_dir = util.safe_join(drivers_base_dir, 'bin')
        drivers_share_dir = util.safe_join(drivers_base_dir, 'share')
        zadig_ini_path = util.safe_join(drivers_share_dir, 'zadig.ini')
        zadig_ini = 'zadig.ini'

        try:
            if util.check_package(
                self.name,
                self.version,
                self.spec_version,
                drivers_bin_dir
            ):
                click.secho('Launch drivers configuration tool')
                click.secho(FTDI_INSTALL_DRIVER_INSTRUCTIONS, fg='yellow')
                # Copy zadig.ini
                with open(zadig_ini, 'w') as ini_file:
                    with open(zadig_ini_path, 'r') as local_ini_file:
                        ini_file.write(local_ini_file.read())

                result = util.exec_command(
                    util.safe_join(drivers_bin_dir, 'zadig.exe'))
                click.secho('FTDI drivers configuration finished',
                            fg='green')
            else:
                result = 1
        except Exception as e:
            click.secho('Error: ' + str(e), fg='red')
            result = 1
        finally:
            # Remove zadig.ini
            if isfile(zadig_ini):
                os.remove(zadig_ini)

        if not isinstance(result, int):
            result = result.get('returncode')
        return result

    def _ftdi_disable_windows(self):
        click.secho('Launch device manager')
        click.secho(FTDI_UNINSTALL_DRIVER_INSTRUCTIONS, fg='yellow')

        result = util.exec_command('mmc devmgmt.msc')
        return result.get('returncode')

    def _serial_enable_windows(self):
        drivers_base_dir = util.get_package_dir('tools-drivers')
        drivers_bin_dir = util.safe_join(drivers_base_dir, 'bin')

        try:
            if util.check_package(
                self.name,
                self.version,
                self.spec_version,
                drivers_bin_dir
            ):
                click.secho('Launch drivers configuration tool')
                click.secho(SERIAL_INSTALL_DRIVER_INSTRUCTIONS, fg='yellow')
                result = util.exec_command(
                    util.safe_join(drivers_bin_dir, 'serial_install.exe'))
                click.secho('Serial drivers configuration finished',
                            fg='green')
            else:
                result = 1
        except Exception as e:
            click.secho('Error: ' + str(e), fg='red')
            result = 1

        if not isinstance(result, int):
            result = result.get('returncode')
        return result

    def _serial_disable_windows(self):
        click.secho('Launch device manager')
        click.secho(SERIAL_UNINSTALL_DRIVER_INSTRUCTIONS, fg='yellow')

        result = util.exec_command('mmc devmgmt.msc')
        return result.get('returncode')
コード例 #36
0
ファイル: installer.py プロジェクト: Jesus89/apio
    def __init__(self, package, platform='', force=False, checkversion=True):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.force_install = force
        self.packages_dir = ''

        self.resources = Resources(platform)

        if self.package in self.resources.packages:

            self.profile = Profile()

            dirname = 'packages'
            self.packages_dir = util.safe_join(util.get_home_dir(), dirname)

            # Get data
            data = self.resources.packages.get(self.package)
            distribution = self.resources.distribution

            self.spec_version = distribution.get('packages').get(self.package)
            self.package_name = data.get('release').get('package_name')
            self.extension = data.get('release').get('extension')
            platform = platform or self._get_platform()

            if checkversion:
                # Check version
                valid_version = self._get_valid_version(
                    data.get('repository').get('name'),
                    data.get('repository').get('organization'),
                    data.get('release').get('tag_name')
                )
                # Valid version
                if not valid_version:
                    # Error
                    click.secho('Error: no valid version found', fg='red')
                    exit(1)

                self.version = valid_version

                # e.g., [linux_x86_64, linux]
                platform_os = platform.split('_')[0]
                self.download_urls = [
                    {
                        'url': self.get_download_url(data, platform),
                        'platform': platform
                    },
                    {
                        'url': self.get_download_url(data, platform_os),
                        'platform': platform_os
                    }
                ]

        if self.packages_dir == '':
            click.secho(
                'Error: no such package \'{}\''.format(self.package),
                fg='red')
            exit(1)
コード例 #37
0
ファイル: unpacker.py プロジェクト: Jesus89/apio
 def preserve_permissions(item, dest_dir):
     attrs = item.external_attr >> 16
     if attrs:
         chmod(util.safe_join(dest_dir, item.filename), attrs)
コード例 #38
0
 def preserve_mtime(item, dest_dir):
     util.change_filemtime(util.safe_join(dest_dir, item.filename),
                           mktime(tuple(list(item.date_time) + [0] * 3)))
コード例 #39
0
 def preserve_permissions(item, dest_dir):
     attrs = item.external_attr >> 16
     if attrs:
         chmod(util.safe_join(dest_dir, item.filename), attrs)
コード例 #40
0
ファイル: unpacker.py プロジェクト: Jesus89/apio
 def preserve_mtime(item, dest_dir):
     util.change_filemtime(
         util.safe_join(dest_dir, item.filename),
         mktime(tuple(list(item.date_time) + [0] * 3))
     )
コード例 #41
0
ファイル: scons.py プロジェクト: jpenalbae/apio
    def run(self, command, variables=[], board=None, deps=[]):
        """Executes scons for building"""

        # -- Check for the SConstruct file
        if not isfile(util.safe_join(util.get_project_dir(), 'SConstruct')):
            click.secho('Info: default SConstruct file')
            variables += ['-f']
            variables += [
                util.safe_join(util.get_folder('resources'), 'SConstruct')
            ]

        # -- Resolve packages
        if self.profile.check_exe_default():
            # Run on `default` config mode
            if not util.resolve_packages(self.resources.packages, deps):
                # Exit if a package is not installed
                return 1
        else:
            click.secho('Info: native config mode')

        # -- Execute scons
        terminal_width, _ = click.get_terminal_size()
        start_time = time.time()

        if command == 'build' or \
           command == 'upload' or \
           command == 'time':
            if board:
                processing_board = board
            else:
                processing_board = 'custom board'
            click.echo('[%s] Processing %s' %
                       (datetime.datetime.now().strftime('%c'),
                        click.style(processing_board, fg='cyan', bold=True)))
            click.secho('-' * terminal_width, bold=True)

        if self.profile.get_verbose_mode() > 0:
            click.secho('Executing: scons -Q {0} {1}'.format(
                command, ' '.join(variables)))

        result = util.exec_command(util.scons_command + ['-Q', command] +
                                   variables,
                                   stdout=util.AsyncPipe(self._on_run_out),
                                   stderr=util.AsyncPipe(self._on_run_err))

        # -- Print result
        exit_code = result['returncode']
        is_error = exit_code != 0
        summary_text = ' Took %.2f seconds ' % (time.time() - start_time)
        half_line = '=' * int(((terminal_width - len(summary_text) - 10) / 2))
        click.echo('%s [%s]%s%s' %
                   (half_line,
                    (click.style(' ERROR ', fg='red', bold=True) if is_error
                     else click.style('SUCCESS', fg='green', bold=True)),
                    summary_text, half_line),
                   err=is_error)

        if False:
            if is_error:
                print("""
  ______                     _
 |  ____|                   | |
 | |__   _ __ _ __ ___  _ __| |
 |  __| | '__| '__/ _ \| '__| |
 | |____| |  | | | (_) | |  |_|
 |______|_|  |_|  \___/|_|  (_)
""")
            else:
                print("""
   _____                             _
  / ____|                           | |
 | (___  _   _  ___ ___ ___  ___ ___| |
  \___ \| | | |/ __/ __/ _ \/ __/ __| |
  ____) | |_| | (_| (_|  __/\__ \__ \_|
 |_____/ \__,_|\___\___\___||___/___(_)
""")

        return exit_code
コード例 #42
0
class Drivers(object):  # pragma: no cover

    rules_local_path = util.safe_join(util.get_folder('resources'),
                                      '80-icestick.rules')
    rules_system_path = '/etc/udev/rules.d/80-icestick.rules'

    # Driver to restore: mac os
    driverC = ''

    def enable(self):
        if 'linux' in platform:
            return self._enable_linux()
        elif 'darwin' in platform:
            self.profile = Profile()
            return self._enable_darwin()
        elif 'windows' in platform:
            return self._enable_windows()

    def disable(self):
        if 'linux' in platform:
            return self._disable_linux()
        elif 'darwin' in platform:
            self.profile = Profile()
            return self._disable_darwin()
        elif 'windows' in platform:
            return self._disable_windows()

    def pre_upload(self):
        if 'darwin' in platform:
            self._pre_upload_darwin()

    def post_upload(self):
        if 'darwin' in platform:
            self._post_upload_darwin()

    def _enable_linux(self):
        click.secho('Configure FTDI drivers for FPGA')
        if not isfile(self.rules_system_path):
            subprocess.call(
                ['sudo', 'cp', self.rules_local_path, self.rules_system_path])
            subprocess.call(['sudo', 'service', 'udev', 'restart'])
            # subprocess.call(['sudo', 'udevadm', 'control', '--reload-rules'])
            # subprocess.call(['sudo', 'udevadm', 'trigger'])
            click.secho('FPGA drivers enabled', fg='green')
            click.secho('Unplug and reconnect your board', fg='yellow')
        else:
            click.secho('Already enabled', fg='yellow')

    def _disable_linux(self):
        if isfile(self.rules_system_path):
            click.secho('Revert FTDI drivers\' configuration')
            subprocess.call(['sudo', 'rm', self.rules_system_path])
            subprocess.call(['sudo', 'service', 'udev', 'restart'])
            # subprocess.call(['sudo', 'udevadm', 'control', '--reload-rules'])
            # subprocess.call(['sudo', 'udevadm', 'trigger'])
            click.secho('FPGA drivers disabled', fg='green')
            click.secho('Unplug and reconnect your board', fg='yellow')
        else:
            click.secho('Already disabled', fg='yellow')

    def _enable_darwin(self):
        # Check homebrew
        brew = subprocess.call('which brew > /dev/null', shell=True)
        if brew != 0:
            click.secho('Error: homebrew is required', fg='red')
        else:
            click.secho('Enable FTDI drivers for FPGA')
            subprocess.call(['brew', 'update'])
            subprocess.call(['brew', 'install', '--force', 'libftdi'])
            subprocess.call(['brew', 'unlink', 'libftdi'])
            subprocess.call(['brew', 'link', '--force', 'libftdi'])
            subprocess.call(['brew', 'install', '--force', 'libffi'])
            subprocess.call(['brew', 'unlink', 'libffi'])
            subprocess.call(['brew', 'link', '--force', 'libffi'])
            self.profile.add_setting('macos_drivers', True)
            self.profile.save()
            click.secho('FPGA drivers enabled', fg='green')

    def _disable_darwin(self):
        click.secho('Disable FTDI drivers\' configuration')
        self.profile.add_setting('macos_drivers', False)
        self.profile.save()
        click.secho('FPGA drivers disabled', fg='green')

    def _pre_upload_darwin(self):
        if self.profile.settings.get('macos_drivers', False):
            # Check and unload the drivers
            driverA = 'com.FTDI.driver.FTDIUSBSerialDriver'
            driverB = 'com.apple.driver.AppleUSBFTDI'
            if self._check_driver_darwin(driverA):
                subprocess.call(['sudo', 'kextunload', '-b', driverA])
                self.driverC = driverA
            elif self._check_driver_darwin(driverB):
                subprocess.call(['sudo', 'kextunload', '-b', driverB])
                self.driverC = driverB

    def _post_upload_darwin(self):
        if self.profile.settings.get('macos_drivers', False):
            # Restore previous driver configuration
            if self.driverC:
                subprocess.call(['sudo', 'kextload', '-b', self.driverC])

    def _check_driver_darwin(self, driver):
        return driver in subprocess.check_output(['kextstat'])

    def _enable_windows(self):
        drivers_base_dir = util.get_package_dir('tools-drivers')
        drivers_bin_dir = util.safe_join(drivers_base_dir, 'bin')
        drivers_share_dir = util.safe_join(drivers_base_dir, 'share')
        zadig_ini_path = util.safe_join(drivers_share_dir, 'zadig.ini')
        zadig_ini = 'zadig.ini'

        try:
            if isdir(drivers_bin_dir):
                click.secho('Launch drivers configuration tool')
                click.secho(FTDI_INSTALL_DRIVER_INSTRUCTIONS, fg='yellow')
                # Copy zadig.ini
                with open(zadig_ini, 'w') as ini_file:
                    with open(zadig_ini_path, 'r') as local_ini_file:
                        ini_file.write(local_ini_file.read())

                result = util.exec_command(
                    util.safe_join(drivers_bin_dir, 'zadig.exe'))
                click.secho('FPGA drivers configuration finished', fg='green')
            else:
                util._check_package('drivers')
                result = 1
        except Exception as e:
            click.secho('Error: ' + str(e), fg='red')
            result = 1
        finally:
            # Remove zadig.ini
            if isfile(zadig_ini):
                os.remove(zadig_ini)

        if not isinstance(result, int):
            result = result['returncode']
        return result

    def _disable_windows(self):
        click.secho('Launch device manager')
        click.secho(FTDI_UNINSTALL_DRIVER_INSTRUCTIONS, fg='yellow')

        result = util.exec_command('mmc devmgmt.msc')
        return result['returncode']
コード例 #43
0
ファイル: installer.py プロジェクト: tinyfpga/apio
    def __init__(self, package, platform='', force=False, checkversion=True):

        # Parse version
        if '@' in package:
            split = package.split('@')
            self.package = split[0]
            self.version = split[1]
        else:
            self.package = package
            self.version = None

        self.force_install = force
        self.packages_dir = ''

        self.resources = Resources(platform)

        if self.package in self.resources.packages:

            self.profile = Profile()

            dirname = 'packages'
            self.packages_dir = util.safe_join(util.get_home_dir(), dirname)

            # Get data
            data = self.resources.packages.get(self.package)
            distribution = self.resources.distribution

            self.specversion = distribution.get('packages').get(self.package)
            self.package_name = data.get('release').get('package_name')
            self.extension = data.get('release').get('extension')
            platform = platform or self._get_platform()

            if checkversion:
                # Check version
                valid_version = self._get_valid_version(
                    data.get('repository').get('name'),
                    data.get('repository').get('organization'),
                    data.get('release').get('tag_name'),
                    self.version,
                    self.specversion,
                    force
                )
                # Valid version
                if not valid_version:
                    # Error
                    click.secho(
                        'Error: No version {} found'.format(self.version),
                        fg='red')
                    exit(1)

                self.version = valid_version

                # e.g., [linux_x86_64, linux]
                platform_os = platform.split('_')[0]
                self.download_urls = [
                    {
                        'url': self.get_download_url(data, platform),
                        'platform': platform
                    },
                    {
                        'url': self.get_download_url(data, platform_os),
                        'platform': platform_os
                    }
                ]

        if self.packages_dir == '':
            click.secho(
                'Error: No such package \'{0}\''.format(self.package),
                fg='red')
            exit(1)