From 7e8bbf2e000bb35cf43c1cceea8f19f6fd92f49d Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Mon, 27 Apr 2026 15:57:02 +0800 Subject: [PATCH] feat(ble): wire BLE UART bridge CLI --- tools/ble/ble_uart_bridge/main.py | 68 +++++++++++++++++++++++ tools/ble/ble_uart_bridge/src/__init__.py | 17 ++++++ 2 files changed, 85 insertions(+) create mode 100644 tools/ble/ble_uart_bridge/main.py create mode 100644 tools/ble/ble_uart_bridge/src/__init__.py diff --git a/tools/ble/ble_uart_bridge/main.py b/tools/ble/ble_uart_bridge/main.py new file mode 100644 index 00000000000..4158ca1c02b --- /dev/null +++ b/tools/ble/ble_uart_bridge/main.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +from src import run_connection_check +from src import run_console +from src import run_daemon +from src import run_daemon_send +from src import run_daemon_status +from src import run_list_devices +from src.console import ConsoleEncoding +from src.console import ConsoleTerminator +from typer import Option +from typer import Typer + +# CLI app singleton +app = Typer() + + +# Core service +@app.command() +def list_devices() -> None: + run_list_devices() + + +@app.command() +def connection_check(device_id: str) -> None: + run_connection_check(device_id) + + +# Console +@app.command() +def console( + device_id: str, + terminator: ConsoleTerminator = Option(ConsoleTerminator.lf, help='Line terminator for text mode'), + encoding: ConsoleEncoding = Option(ConsoleEncoding.text, help='Console encoding'), + with_response: bool = Option(False, help='Use BLE write-with-response for TX data'), +) -> None: + run_console(device_id, terminator=terminator, encoding=encoding, with_response=with_response) + + +# Daemon +@app.command() +def daemon(device_id: str, host: str = '127.0.0.1', port: int = 8888) -> None: + run_daemon(device_id, host, port) + + +@app.command() +def daemon_status(host: str = '127.0.0.1', port: int = 8888) -> None: + run_daemon_status(host=host, port=port) + + +@app.command() +def daemon_send( + data: str, + op: str = Option('raw', help='Operation name in the JSONL request envelope'), + json_payload: bool = Option(False, '--json', help='Parse DATA as JSON instead of sending it as a string'), + timeout: float = 10.0, + host: str = '127.0.0.1', + port: int = 8888, +) -> None: + run_daemon_send(data=data, op=op, json_payload=json_payload, timeout=timeout, host=host, port=port) + + +def main() -> None: + app() + + +if __name__ == '__main__': + main() diff --git a/tools/ble/ble_uart_bridge/src/__init__.py b/tools/ble/ble_uart_bridge/src/__init__.py new file mode 100644 index 00000000000..770559e46fc --- /dev/null +++ b/tools/ble/ble_uart_bridge/src/__init__.py @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +from .console import run_console +from .core import run_connection_check +from .core import run_list_devices +from .daemon import run_daemon +from .daemon import run_daemon_send +from .daemon import run_daemon_status + +__all__ = [ + 'run_connection_check', + 'run_list_devices', + 'run_daemon', + 'run_daemon_send', + 'run_daemon_status', + 'run_console', +]