diff --git a/tools/hci_throughput/check_addr.py b/tools/hci_throughput/check_addr.py index a11a416d8..7af76a117 100644 --- a/tools/hci_throughput/check_addr.py +++ b/tools/hci_throughput/check_addr.py @@ -34,8 +34,15 @@ def parse_arguments(): sudo python check_addr.py -i 0 1 2') parser.add_argument('-i', '--indexes', type=str, nargs='*', help='specify hci adapters indexes', default=0) + parser.add_argument('-t', '--transport_directory', type=str, nargs='*', + help='specify hci transport directory path', default="default") try: args = parser.parse_args() + if (type(args.transport_directory) == list): + args.transport_directory = args.transport_directory.pop() + else: + args.transport_directory = args.transport_directory + except Exception as e: print(traceback.format_exc()) return args @@ -64,7 +71,7 @@ async def main(dev: hci_commands.HCI_Commands): task.cancel() return result -def check_addr(device_indexes: list, addresses: list) -> list: +def check_addr(device_indexes: list, addresses: list, transport_directory: str) -> list: util.configure_logging(f"log/check_addr.log", clear_log_file=True) logging.info(f"Devices indexes: {device_indexes}") @@ -73,8 +80,9 @@ def check_addr(device_indexes: list, addresses: list) -> list: asyncio.set_event_loop(loop) loop.set_debug(True) - transport = transport_factory.TransportFactory(device_index=index, - asyncio_loop=loop) + transport = transport_factory.TransportFactory(device_index=str(index), + asyncio_loop=loop, + transport_directory=transport_directory) bt_dev = hci_commands.HCI_Commands(send=transport.send, rx_buffer_q=transport.rx_buffer_q, @@ -96,7 +104,7 @@ if __name__ == '__main__': args = parse_arguments() print(args) addresses = [] - addresses = check_addr(args.indexes, addresses) + addresses = check_addr(args.indexes, addresses, args.transport_directory) print(addresses) except Exception as e: print(traceback.format_exc()) diff --git a/tools/hci_throughput/hci_device.py b/tools/hci_throughput/hci_device.py index 0a20fed59..4950bf277 100644 --- a/tools/hci_throughput/hci_device.py +++ b/tools/hci_throughput/hci_device.py @@ -33,6 +33,7 @@ import signal show_tp_plots = False test_dir = None +transport_directory = None class ParentCalledException(KeyboardInterrupt): """ This exception is raised when e.g. parent process sends signal. @@ -273,7 +274,7 @@ def parse_cfg_files(args) -> dict: ini = { "own_address": args.own_addr, "own_address_type": args.own_addr_type, - "dev_index": str(args.dev_idx), + "dev_index": args.dev_idx, "peer_address": args.peer_addr, "peer_address_type": args.peer_addr_type, "peer_dev_index": args.peer_dev_idx @@ -282,8 +283,9 @@ def parse_cfg_files(args) -> dict: with open(args.init_file, "r") as file: init_file = yaml.safe_load(file) ini = init_file[args.mode] - global test_dir + global test_dir, transport_directory test_dir = init_file["test_dir"] + transport_directory = init_file["transport_directory"] with open(args.config_file) as f: cfg = yaml.safe_load(f) @@ -316,7 +318,8 @@ def main(): transport = transport_factory.TransportFactory(device_index=ini['dev_index'], device_mode=args.mode, - asyncio_loop=loop) + asyncio_loop=loop, + transport_directory=transport_directory) signal.signal(signal.SIGTERM, signal_handler) diff --git a/tools/hci_throughput/hci_socket.py b/tools/hci_throughput/hci_socket.py index f95ea8657..41c95eeee 100644 --- a/tools/hci_throughput/hci_socket.py +++ b/tools/hci_throughput/hci_socket.py @@ -58,7 +58,6 @@ class HCI_User_Channel_Socket(): self.libc = ctypes.cdll.LoadLibrary('libc.so.6') self.rx_buffer_q = multiprocessing.Manager().Queue() self.counter = 0 - self.device_index = device_index self.device_mode = device_mode self.hci_socket = self.socket_create() diff --git a/tools/hci_throughput/main.py b/tools/hci_throughput/main.py index bbaf4d7cd..047f30083 100644 --- a/tools/hci_throughput/main.py +++ b/tools/hci_throughput/main.py @@ -43,6 +43,9 @@ def parse_arguments(): parser.add_argument('-m', '--modes', type=str, nargs="*", help='devices modes - receiver, transmitter', choices=['rx', 'tx'], default=['rx', 'tx']) + parser.add_argument('-t', '--transport_directory', type=str, nargs='*', + help='specify hci transport directory path. \ + The default is linux socket', default=["default"]) parser.add_argument('-cf', '--config_file', type=str, nargs="*", help='configuration file for devices', default=["config.yaml"]) @@ -53,18 +56,20 @@ def parse_arguments(): print(f"Indexes: {args.indexes}") print(f"Modes: {args.modes}") + print(f"Transport directory: {args.transport_directory}") return args -def get_dev_addr_and_type(hci_indexes: list): +def get_dev_addr_and_type(hci_indexes: list, transport_directory: str): if (len(hci_indexes) != 2): raise Exception("HCI index error.") manager = multiprocessing.Manager() addr_list = manager.list() check_addrs_proc = multiprocessing.Process(target=check_addr.check_addr, name="Check addresses", - args=(hci_indexes, addr_list)) + args=(hci_indexes, addr_list, + transport_directory)) check_addrs_proc.start() print("check_addrs_proc pid: ", check_addrs_proc.pid) check_addrs_proc.join() @@ -89,7 +94,8 @@ def change_config_var(filename: str, group: str, variable: str, default_style=None, default_flow_style=False) -def get_init_dict(filename: str, args_list: list, modes: list, dir: str): +def get_init_dict(filename: str, args_list: list, modes: list, dir: str, + transport_directory: str): ini = { modes[0]:{ "dev_index": args_list[0][0], @@ -107,7 +113,8 @@ def get_init_dict(filename: str, args_list: list, modes: list, dir: str): "peer_address_type": args_list[0][1], "peer_address": args_list[0][2] }, - "test_dir": dir + "test_dir": dir, + "transport_directory": transport_directory } with open(filename, 'w') as file: @@ -142,7 +149,8 @@ def run_once(modes: list, cfg_file: str, init_file: str): def testing_variable_influence(cfg: dict, modes: list, cfg_file: str, - init_file: str, init_dict: dict, save_to_file: bool): + init_file: str, init_dict: dict, + save_to_file: bool): tp_test_counter = 1 changed_params_list = [] averages = [] @@ -201,18 +209,23 @@ def main(): init_file = "init.yaml" cfg_file = args.config_file[0] + if (type(args.transport_directory) == list): + args.transport_directory = args.transport_directory.pop() + else: + args.transport_directory = args.transport_directory with open(cfg_file, "r") as file: cfg = yaml.safe_load(file) - addr_list = get_dev_addr_and_type(args.indexes) + addr_list = get_dev_addr_and_type(args.indexes, args.transport_directory) if len(addr_list) != len(args.indexes): raise Exception("No device address received. Check HCI indexes.") print(f"Received: {addr_list}") test_dir_path = util.create_test_directory() init_dict = get_init_dict(filename=init_file, args_list=addr_list, - modes=args.modes, dir=test_dir_path) + modes=args.modes, dir=test_dir_path, + transport_directory=args.transport_directory) util.copy_config_files_to_test_directory([init_file, cfg_file], init_dict["test_dir"]) diff --git a/tools/hci_throughput/transport_factory.py b/tools/hci_throughput/transport_factory.py index 615bccf52..7555c3200 100644 --- a/tools/hci_throughput/transport_factory.py +++ b/tools/hci_throughput/transport_factory.py @@ -18,21 +18,39 @@ # import hci_socket +import logging +import traceback +import sys + class TransportFactory: - def __init__(self, device_index=None, device_mode=None, - asyncio_loop=None) -> None: - if (type(device_index) == int or device_index.isnumeric()): - self.transport = hci_socket.HCI_User_Channel_Socket(int(device_index), - device_mode, asyncio_loop) - else: - raise Exception("No such transport found.") + def __init__(self, device_index: str = None, device_mode=None, + asyncio_loop=None, transport_directory=None) -> None: + if (device_index.isnumeric()): + self.transport = hci_socket.HCI_User_Channel_Socket(int(device_index), + device_mode, + asyncio_loop) + else: + try: + if (transport_directory != "default"): + sys.path.append(transport_directory) + print(sys.path) + import custom_transport + self.transport = custom_transport.Transport(device_index, + device_mode, + asyncio_loop) + else: + raise Exception( + "Device index and transport does not match.") + except Exception as e: + logging.error(traceback.format_exc()) + sys.exit() - self.rx_buffer_q = self.transport.rx_buffer_q - self.send = self.transport.send + self.rx_buffer_q = self.transport.rx_buffer_q + self.send = self.transport.send - def start(self): - self.transport.start() + def start(self): + self.transport.start() - def stop(self): - self.transport.stop() + def stop(self): + self.transport.stop()