def OpenConventionalHal(self, module_name=None): """Opens the target conventional HAL component. This is only needed for conventional HAL. Args: module_name: string, the name of a module to load. """ call_msg = CompSpecMsg.FunctionCallMessage() if self._hal_driver_id is not None: call_msg.hal_driver_id = self._hal_driver_id call_msg.component_class = CompSpecMsg.HAL_CONVENTIONAL call_msg.api.name = "#Open" if module_name: arg = call_msg.api.arg.add() arg.type = CompSpecMsg.TYPE_STRING arg.string_value.message = module_name call_msg.api.return_type.type == CompSpecMsg.TYPE_SCALAR call_msg.api.return_type.scalar_type = "int32_t" logging.debug("final msg %s", call_msg) result = self._client.CallApi(text_format.MessageToString(call_msg), self.__caller_uid) logging.debug(result) return result
def RemoteCall(*args, **kwargs): """Dynamically calls a remote API and returns the result value.""" func_msg = self.GetApi(api_name) if not func_msg: raise MirrorObjectError("api %s unknown", func_msg) logging.info("remote call %s%s", api_name, args) if args: for arg_msg, value_msg in zip(func_msg.arg, args): logging.debug("arg msg %s", arg_msg) logging.debug("value %s", value_msg) if value_msg is not None: converted_msg = py2pb.Convert(arg_msg, value_msg) logging.debug("converted_message: %s", converted_msg) arg_msg.CopyFrom(converted_msg) else: # TODO: use kwargs for arg in func_msg.arg: # TODO: handle other if (arg.type == CompSpecMsg.TYPE_SCALAR and arg.scalar_type == "pointer"): arg.scalar_value.pointer = 0 logging.debug(func_msg) call_msg = CompSpecMsg.FunctionCallMessage() if self._if_spec_msg.component_class: call_msg.component_class = self._if_spec_msg.component_class call_msg.hal_driver_id = self._driver_id call_msg.api.CopyFrom(func_msg) logging.info("final msg %s", call_msg) results = self._client.CallApi( text_format.MessageToString(call_msg), self._caller_uid) if (isinstance(results, tuple) and len(results) == 2 and isinstance(results[1], dict) and "coverage" in results[1]): self._last_raw_code_coverage_data = results[1]["coverage"] results = results[0] if isinstance(results, list): # Non-HIDL HAL does not return list. # Translate TYPE_HIDL_INTERFACE to halMirror. for i, _ in enumerate(results): result = results[i] if (result and isinstance(result, CompSpecMsg.VariableSpecificationMessage) and result.type == CompSpecMsg.TYPE_HIDL_INTERFACE): if result.hidl_interface_id <= -1: results[i] = None driver_id = result.hidl_interface_id nested_interface_name = result.predefined_type.split("::")[-1] logging.debug("Nested interface name: %s", nested_interface_name) nested_interface = self.GetHalMirrorForInterface( nested_interface_name, driver_id) results[i] = nested_interface if len(results) == 1: # singe return result, return the value direcly. return results[0] return results
def RemoteCall(*args, **kwargs): """Dynamically calls a remote API and returns the result value.""" func_msg = self.GetApi(api_name) if not func_msg: raise MirrorObjectError("api %s unknown", func_msg) logging.debug("remote call %s%s", api_name, args) if args: for arg_msg, value_msg in zip(func_msg.arg, args): logging.debug("arg msg %s", arg_msg) logging.debug("value %s", value_msg) if value_msg is not None: converted_msg = py2pb.Convert(arg_msg, value_msg) if converted_msg is None: raise MirrorObjectError("Failed to convert arg %s", value_msg) logging.debug("converted_message: %s", converted_msg) arg_msg.CopyFrom(converted_msg) else: # TODO: use kwargs for arg in func_msg.arg: # TODO: handle other if (arg.type == CompSpecMsg.TYPE_SCALAR and arg.scalar_type == "pointer"): arg.scalar_value.pointer = 0 logging.debug(func_msg) call_msg = CompSpecMsg.FunctionCallMessage() if self._if_spec_msg.component_class: call_msg.component_class = self._if_spec_msg.component_class call_msg.hal_driver_id = self._driver_id call_msg.api.CopyFrom(func_msg) logging.debug("final msg %s", call_msg) results = self._client.CallApi( text_format.MessageToString(call_msg), self._caller_uid) if (isinstance(results, tuple) and len(results) == 2 and isinstance(results[1], dict) and "coverage" in results[1]): self._last_raw_code_coverage_data = results[1]["coverage"] results = results[0] if isinstance(results, list): # Non-HIDL HAL does not return list. # Translate TYPE_HIDL_INTERFACE to halMirror. for i, _ in enumerate(results): result = results[i] if (not result or not isinstance( result, CompSpecMsg.VariableSpecificationMessage)): # no need to process the return values. continue if result.type == CompSpecMsg.TYPE_HIDL_INTERFACE: if result.hidl_interface_id <= -1: results[i] = None driver_id = result.hidl_interface_id nested_interface_name = \ result.predefined_type.split("::")[-1] logging.debug("Nested interface name: %s", nested_interface_name) nested_interface = self.GetHalMirrorForInterface( nested_interface_name, driver_id) results[i] = nested_interface elif (result.type == CompSpecMsg.TYPE_FMQ_SYNC or result.type == CompSpecMsg.TYPE_FMQ_UNSYNC): if (result.fmq_value[0].fmq_id == -1): logging.error("Invalid new queue_id.") results[i] = None else: # Retrieve type of data in this FMQ. data_type = None # For scalar, read scalar_type field. if result.fmq_value[0].type == \ CompSpecMsg.TYPE_SCALAR: data_type = result.fmq_value[0].scalar_type # For enum, struct, and union, read predefined_type # field. elif (result.fmq_value[0].type == CompSpecMsg.TYPE_ENUM or result.fmq_value[0].type == CompSpecMsg.TYPE_STRUCT or result.fmq_value[0].type == CompSpecMsg.TYPE_UNION): data_type = result.fmq_value[0].predefined_type # Encounter an unknown type in FMQ. if data_type == None: logging.error( "Unknown type %d in the new FMQ.", result.fmq_value[0].type) results[i] = None continue sync = result.type == CompSpecMsg.TYPE_FMQ_SYNC fmq_mirror = resource_mirror.ResourceFmqMirror( data_type, sync, self._client, result.fmq_value[0].fmq_id) results[i] = fmq_mirror elif result.type == CompSpecMsg.TYPE_HIDL_MEMORY: if result.hidl_memory_value.mem_id == -1: logging.error("Invalid new mem_id.") results[i] = None else: mem_mirror = resource_mirror.ResourceHidlMemoryMirror( self._client, result.hidl_memory_value.mem_id) results[i] = mem_mirror elif result.type == CompSpecMsg.TYPE_HANDLE: if result.handle_value.handle_id == -1: logging.error("Invalid new handle_id.") results[i] = None else: handle_mirror = resource_mirror.ResourceHidlHandleMirror( self._client, result.handle_value.handle_id) results[i] = handle_mirror if len(results) == 1: # single return result, return the value directly. return results[0] return results
def RemoteCall(*args, **kwargs): """Dynamically calls a remote API and returns the result value.""" func_msg = self.GetApi(api_name) if not func_msg: raise MirrorObjectError("api %s unknown", func_msg) logging.debug("remote call %s.%s", self._parent_path, api_name) logging.info("remote call %s%s", api_name, args) if args: for arg_msg, value_msg in zip(func_msg.arg, args): logging.debug("arg msg %s", arg_msg) logging.debug("value %s", value_msg) if value_msg is not None: self.ArgToPb(arg_msg, value_msg) logging.debug("final msg %s", func_msg) else: # TODO: use kwargs for arg in func_msg.arg: # TODO: handle other if (arg.type == CompSpecMsg.TYPE_SCALAR and arg.scalar_type == "pointer"): arg.scalar_value.pointer = 0 logging.debug(func_msg) if self._parent_path: func_msg.parent_path = self._parent_path call_msg = CompSpecMsg.FunctionCallMessage() if isinstance(self._if_spec_msg, CompSpecMsg.ComponentSpecificationMessage): if self._if_spec_msg.component_class: logging.info("component_class %s", self._if_spec_msg.component_class) call_msg.component_class = self._if_spec_msg.component_class if self._if_spec_msg.component_class == CompSpecMsg.HAL_CONVENTIONAL_SUBMODULE: submodule_name = self._if_spec_msg.original_data_structure_name if submodule_name.endswith("*"): submodule_name = submodule_name[:-1] func_msg.submodule_name = submodule_name if self._hal_driver_id is not None: call_msg.hal_driver_id = self._hal_driver_id call_msg.api.CopyFrom(func_msg) result = self._client.CallApi( text_format.MessageToString(call_msg), self.__caller_uid) logging.debug(result) if (isinstance(result, tuple) and len(result) == 2 and isinstance(result[1], dict) and "coverage" in result[1]): self._last_raw_code_coverage_data = result[1]["coverage"] result = result[0] if (result and isinstance(result, CompSpecMsg.VariableSpecificationMessage) and result.type == CompSpecMsg.TYPE_HIDL_INTERFACE): if result.hidl_interface_id <= -1: return None hal_driver_id = result.hidl_interface_id nested_interface_name = result.predefined_type.split("::")[-1] logging.debug("Nested interface name: %s", nested_interface_name) nested_interface = self.GetHidlNestedInterface( nested_interface_name, hal_driver_id) return nested_interface return result