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)
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
def language_from_filename(filename): if filename.endswith('.js'): return 'javascript' elif filename.endswith('.html'): return 'html' else: raise common.GeneratorError('Invalid filename ' + filename)
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
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)
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)
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
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)
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
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)