Beispiel #1
0
    def get_java_parameters(self, context='signature', high_level=False):
        parameters = []

        for element in self.get_elements(high_level=high_level):
            if element.get_direction() == 'out' and self.get_type(
            ) == 'function':
                continue

            java_type = element.get_java_type()
            name = element.get_name().headless

            if context == 'signature':
                parameters.append('{0} {1}'.format(java_type, name))
            elif context == 'call':
                parameters.append(name)
            elif context == 'listener':
                if high_level and element.get_level(
                ) == 'high' and element.get_role() == 'stream_data':
                    name = '({0})highLevelCallback.data'.format(java_type)

                parameters.append(name)
            elif context == 'link':
                parameters.append(java_type)
            else:
                raise common.GeneratorError('Invalid context: ' + context)

        return ', '.join(parameters)
Beispiel #2
0
    def get_php_default_item_value(self):
        value = PHPElement.php_default_item_values[self.get_type()]

        if value == None:
            common.GeneratorError('Invalid array item type: ' + self.get_type())

        return value
Beispiel #3
0
 def language_from_filename(filename):
     if filename.endswith('.js'):
         return 'javascript'
     elif filename.endswith('.html'):
         return 'html'
     else:
         raise common.GeneratorError('Invalid filename ' + filename)
Beispiel #4
0
    def get_shell_default_item_value(self):
        value = ShellElement.shell_default_items[self.get_type()]

        if value == None:
            common.GeneratorError('Invalid array item type: ' +
                                  self.get_type())

        return value
Beispiel #5
0
    def test(self, cookie, path, extra):
        # skip OLED scribble example because mingw32 has no libgd package
        if self.compiler.startswith('mingw32-') and path.endswith(
                'example_scribble.c'):
            self.execute(cookie, ['true'])
            return

        if extra:
            shutil.copy(path, '/tmp/tester/c')
            path = os.path.join('/tmp/tester/c', os.path.split(path)[1])

        output = path[:-2]

        if not extra and '/brick' in path:
            dirname = os.path.split(path)[0]
            device = '/tmp/tester/c/source/{0}_{1}.c'.format(
                os.path.split(os.path.split(dirname)[0])[-1],
                os.path.split(dirname)[-1])
        else:
            device = ''

        args = []

        if self.compiler == 'gcc':
            args += ['gcc', '-std=c99', '-pthread']
        elif self.compiler == 'g++':
            args += ['g++', '-std=c++98', '-pthread']
        elif self.compiler == 'mingw32-gcc':
            args += ['x86_64-w64-mingw32-gcc', '-Wno-error=return-type']
        elif self.compiler == 'mingw32-g++':
            args += ['x86_64-w64-mingw32-g++', '-Wno-error=return-type']
        elif self.compiler == 'scan-build clang':
            args += ['scan-build', 'clang', '-std=c99', '-pthread']
        else:
            raise common.GeneratorError('Invalid compiler ' + self.compiler)

        args += [
            '-Wall', '-Wextra', '-Werror', '-O2', '-I/tmp/tester/c/source',
            '-o', output, '/tmp/tester/c/source/ip_connection.c'
        ]

        if len(device) > 0:
            args.append(device)
        elif extra:
            dependencies = glob.glob('/tmp/tester/c/source/*.c')
            dependencies.remove('/tmp/tester/c/source/ip_connection.c')
            args.append('-Wno-error=unused-parameter')
            args += dependencies

        args.append(path)

        if self.compiler.startswith('mingw32-'):
            args += ['-lws2_32']

        if path.endswith('example_scribble.c'):
            args += ['-lm', '-lgd']

        self.execute(cookie, args)
Beispiel #6
0
 def title_from_filename(filename):
     if filename.endswith('.js'):
         filename = filename.replace('Example', '').replace('.js', '')
         return common.camel_to_space(filename) + ' (Node.js)'
     elif filename.endswith('.html'):
         filename = filename.replace('Example', '').replace('.html', '')
         return common.camel_to_space(filename) + ' (HTML)'
     else:
         raise common.GeneratorError('Invalid filename ' + filename)
Beispiel #7
0
    def get_java_default_item_value(self):
        if self.get_generator().is_octave() and self.get_type() == 'char':
            value = '""'
        else:
            value = JavaElement.java_default_item_values[self.get_type()]

        if value == None:
            common.GeneratorError('Invalid array item type: ' + self.get_type())

        return value
Beispiel #8
0
    def get_c_parameters(self, high_level=False):
        parameters = []
        packet_type = self.get_type()

        for element in self.get_elements(high_level=high_level):
            element_type = element.get_c_type('signature')
            modifier = ''
            name = element.get_name().under
            direction = element.get_direction()
            role = element.get_role()
            array = ''

            if direction == 'out' and packet_type == 'function':
                modifier = '*'
                name = 'ret_{0}'.format(name)

            if role == 'stream_data':
                if direction == 'in' and packet_type == 'function':
                    if element_type == 'char':
                        element_type = 'const ' + element_type

                    modifier = '*'
                elif direction == 'out' and packet_type == 'callback':
                    modifier = '*'

            if role != 'stream_data' and element.get_cardinality() > 1:
                modifier = ''
                array = '[{0}]'.format(element.get_cardinality())

            parameters.append('{0} {1}{2}{3}'.format(element_type, modifier,
                                                     name, array))

            length_elements = self.get_elements(role='stream_length')
            chunk_offset_elements = self.get_elements(
                role='stream_chunk_offset')

            if role == 'stream_data' and (direction == 'out'
                                          or len(length_elements) > 0):
                if direction == 'out' and packet_type == 'function':
                    modifier = '*'
                else:
                    modifier = ''

                if len(length_elements) > 0:
                    element_type = length_elements[0].get_c_type('signature')
                elif len(chunk_offset_elements) > 0:
                    element_type = chunk_offset_elements[0].get_c_type(
                        'signature')
                else:
                    raise common.GeneratorError('Malformed stream config')

                parameters.append('{0} {1}{2}_length'.format(
                    element_type, modifier, name))

        return ', '.join(parameters)
Beispiel #9
0
    def get_csharp_default_value(self):
        if self.get_cardinality() != 1:
            return 'null'
        else:
            value = CSharpElement.csharp_default_item_values[self.get_type()]

            if value == None:
                common.GeneratorError('Invalid array item type: ' +
                                      self.get_type())

            return value
    def get_csharp_source(self):
        function_names = self.get_packet_names('function')
        callback_names = self.get_packet_names('callback')

        for callback_name in callback_names:
            if callback_name + ' Callback' in function_names:
                raise common.GeneratorError(
                    "Generated callback name '{0}[ Callback]' collides with function name '{0} Callback'"
                    .format(callback_name))

        source = self.get_csharp_import()
        source += self.get_csharp_class()
        source += self.get_csharp_function_id_definitions()
        source += self.get_csharp_constants()
        source += self.get_csharp_delegates()
        source += self.get_csharp_constructor()
        source += self.get_csharp_response_expected()
        source += self.get_csharp_methods()
        source += self.get_csharp_callbacks()

        return source
Beispiel #11
0
    def get_c_parameters(self,
                         signature=True,
                         high_level=False,
                         callback_wrapper=False,
                         single_chunk=False):
        parameters = []

        for element in self.get_elements(high_level=high_level):
            c_type = element.get_c_type(True)
            modifier = ''
            name = element.get_name().under
            role = element.get_role()
            array = ''

            if element.get_direction() == 'out' and self.get_type(
            ) == 'function':
                if signature:
                    modifier = '*'
                    name = 'ret_{0}'.format(name)
                elif role in [
                        'stream_length', 'stream_chunk_offset',
                        'stream_chunk_written'
                ]:
                    modifier = '&'
                elif role not in ['stream_chunk_data', 'stream_chunk_written']:
                    name = 'ret_{0}'.format(name)

            if element.get_role() == 'stream_data' and signature and \
               ((element.get_direction() == 'in' and self.get_type() == 'function') or \
                (element.get_direction() == 'out' and self.get_type() == 'callback')):
                modifier = '*'

            if element.get_role() != 'stream_data' and element.get_cardinality(
            ) > 1:
                modifier = ''
                array = '[{0}]'.format(element.get_cardinality())

            if high_level and callback_wrapper and element.get_level() == 'high' and \
               element.get_role() == 'stream_data':
                if single_chunk:
                    parameters.append('{0}_data'.format(name))
                else:
                    parameters.append(
                        '({0} *)high_level_callback->data'.format(c_type))
            elif signature:
                parameters.append('{0} {1}{2}{3}'.format(
                    c_type, modifier, name, array))
            else:
                parameters.append('{0}{1}'.format(modifier, name))

            length_elements = self.get_elements(role='stream_length')
            chunk_offset_elements = self.get_elements(
                role='stream_chunk_offset')

            if high_level and \
               element.get_level() == 'high' and \
               element.get_role() == 'stream_data' and \
               (element.get_direction() == 'out' or \
                len(length_elements) > 0):
                if signature:
                    if element.get_direction() == 'out' and self.get_type(
                    ) == 'function':
                        modifier = '*'
                    else:
                        modifier = ''

                    if len(length_elements) > 0:
                        c_type = length_elements[0].get_c_type(True)
                    elif len(chunk_offset_elements) > 0:
                        c_type = chunk_offset_elements[0].get_c_type(True)
                    else:
                        raise common.GeneratorError('Malformed stream config')

                    parameters.append('{0} {1}{2}_length'.format(
                        c_type, modifier, name))
                elif callback_wrapper and not single_chunk:
                    parameters.append('high_level_callback->length')
                else:
                    parameters.append('{0}{1}_length'.format(modifier, name))

        return ', '.join(parameters)
    def finish(self):
        root_dir = self.get_root_dir()

        # Copy IP Connection examples
        if self.get_config_name().space == 'Tinkerforge':
            for example in common.find_examples(root_dir, r'^Example.*\.js'):
                shutil.copy(example[1], self.tmp_nodejs_examples_dir)

            for example in common.find_examples(root_dir, r'^Example.*\.html'):
                shutil.copy(example[1], self.tmp_browser_examples_dir)

        # Copy bindings and readme
        for filename in self.get_released_files():
            if filename == 'TinkerforgeNPM.js':
                shutil.copy(os.path.join(self.get_bindings_dir(), filename), os.path.join(self.tmp_nodejs_package_dir, 'Tinkerforge.js'))
            elif filename == 'BrowserAPI.js':
                shutil.copy(os.path.join(self.get_bindings_dir(), filename), self.tmp_nodejs_source_tinkerforge_dir)
            elif filename == 'TinkerforgeSource.js':
                shutil.copy(os.path.join(self.get_bindings_dir(), filename), os.path.join(self.tmp_nodejs_source_dir, 'Tinkerforge.js'))
            else:
                shutil.copy(os.path.join(self.get_bindings_dir(), filename), self.tmp_nodejs_source_tinkerforge_dir)
                shutil.copy(os.path.join(self.get_bindings_dir(), filename), self.tmp_nodejs_package_lib_dir)

        # Make package.json
        version = self.get_changelog_version()

        common.specialize_template(os.path.join(root_dir, 'package.json.template'),
                                   os.path.join(self.tmp_nodejs_package_dir, 'package.json'),
                                   {'<<VERSION>>': '.'.join(version)})

        shutil.copy(os.path.join(root_dir, 'IPConnection.js'),              self.tmp_nodejs_package_lib_dir)
        shutil.copy(os.path.join(root_dir, 'Device.js'),                    self.tmp_nodejs_package_lib_dir)
        shutil.copy(os.path.join(root_dir, 'LICENSE'),                      self.tmp_nodejs_package_dir)
        shutil.copy(os.path.join(root_dir, 'README.md'),                    self.tmp_nodejs_package_dir)

        shutil.copy(os.path.join(root_dir, 'IPConnection.js'),              self.tmp_nodejs_source_tinkerforge_dir)
        shutil.copy(os.path.join(root_dir, 'Device.js'),                    self.tmp_nodejs_source_tinkerforge_dir)

        shutil.copy(os.path.join(root_dir, 'changelog.txt'),                self.tmp_dir)
        shutil.copy(os.path.join(root_dir, 'readme.txt'),                   self.tmp_dir)
        shutil.copy(os.path.join(root_dir, '..', 'configs', 'license.txt'), self.tmp_dir)

        # Copy browser specific files
        shutil.copy(os.path.join(root_dir, 'es5-shim.js'),                  self.tmp_nodejs_source_tinkerforge_dir)
        shutil.copy(os.path.join(root_dir, 'es5-sham.js'),                  self.tmp_nodejs_source_tinkerforge_dir)

        # Make Tinkerforge.js for browser with browserify
        retcode, output = common.check_output_and_error(['browserify', '--version'])

        if retcode != 0:
            raise common.GeneratorError('Could not get browserify version')

        if tuple([int(n) for n in output.strip('\r\n').split('.')]) < (13, 1, 1):
            raise common.GeneratorError('Need browserify version >= 13.1.1')

        with common.ChangedDirectory(self.tmp_nodejs_source_tinkerforge_dir):
            args = ['browserify']
            args.extend(sorted(os.listdir(self.tmp_nodejs_source_tinkerforge_dir)))
            args.append('-o')
            args.append(os.path.join(self.tmp_browser_source_dir, 'Tinkerforge.js'))

            common.execute(args)

        # Remove browser specific files
        os.remove(os.path.join(self.tmp_nodejs_source_tinkerforge_dir, 'BrowserAPI.js'))
        os.remove(os.path.join(self.tmp_nodejs_source_tinkerforge_dir, 'es5-shim.js'))
        os.remove(os.path.join(self.tmp_nodejs_source_tinkerforge_dir, 'es5-sham.js'))

        # Generate the NPM package and put it on the root of ZIP archive
        with common.ChangedDirectory(self.tmp_nodejs_package_dir):
            common.execute(['npm', 'pack'])

        package_name = 'tinkerforge-{0}.{1}.{2}.tgz'.format(*version)

        shutil.copy(os.path.join(self.tmp_nodejs_package_dir, package_name),
                    os.path.join(self.tmp_nodejs_dir, 'tinkerforge.tgz'))
        shutil.copy(os.path.join(self.tmp_nodejs_package_dir, package_name),
                    os.path.join(root_dir, package_name))

        # Remove package directory
        shutil.rmtree(self.tmp_nodejs_package_dir)

        # Make zip
        self.create_zip_file(self.tmp_dir)

        # copy Tinkerforge.js to bindings root dir so copy_all.py can pick it up
        shutil.copy(os.path.join(self.tmp_browser_source_dir, 'Tinkerforge.js'), root_dir)