code: def rpc(self, address, rpc_id, *args, **kwargs):
          
  
          if isinstance(rpc_id, RPCDeclaration):
              arg_format = rpc_id.arg_format
              resp_format = rpc_id.resp_format
              rpc_id = rpc_id.rpc_id
          else:
              arg_format = kwargs.get('arg_format', None)
              resp_format = kwargs.get('resp_format', None)
  
          arg_payload = b''
  
          if arg_format is not None:
              arg_payload = pack_rpc_payload(arg_format, args)
  
          self._logger.debug("Sending rpc to %d:%04X, payload=%s", address, rpc_id, args)
  
          resp_payload = self.call_rpc(address, rpc_id, arg_payload)
          if resp_format is None:
              return []
  
          resp = unpack_rpc_payload(resp_format, resp_payload)
          return resp
docs: Immediately dispatch an RPC inside this EmulatedDevice.
  
          This function is meant to be used for testing purposes as well as by
          tiles inside a complex EmulatedDevice subclass that need to
          communicate with each other.  It should only be called from the main
          virtual device thread where start() was called from.
  
          **Background workers may not call this method since it may cause them to deadlock.**
  
          Args:
              address (int): The address of the tile that has the RPC.
              rpc_id (int): The 16-bit id of the rpc we want to call
              *args: Any required arguments for the RPC as python objects.
              **kwargs: Only two keyword arguments are supported:
                  - arg_format: A format specifier for the argument list
                  - result_format: A format specifier for the result
  
          Returns:
              list: A list of the decoded response members from the RPC.