mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-10-14 01:37:23 +00:00
tools/hci_throughput: Custom transport option
Added option to pass custom transport module.
This commit is contained in:
@@ -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())
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user