fix(ble): fixed ci failures for backport

This commit is contained in:
Zhou Xiao
2026-04-28 12:32:56 +08:00
parent d72a5a616e
commit 9b3b517c45
7 changed files with 25 additions and 19 deletions

View File

@@ -1,7 +1,7 @@
# BLE UART Service Example — NimBLE / Bluedroid
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-S3 |
| ----------------- | ----- | -------- | -------- | -------- | -------- | --------- | -------- | -------- |
| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S3 |
| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- |
A turnkey serial-over-BLE peripheral that implements the de-facto
**Nordic UART Service** GATT layout (RX write, TX notify), so any

View File

@@ -1,19 +1,21 @@
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
import asyncio
from typing import Union
from .console import BLEUARTConsole
from .console import ConsoleEncoding
from .console import ConsoleTerminator
# Keep annotations compatible with Python 3.9.
# ruff: noqa: UP007
def run_console(
device_id: str,
terminator: ConsoleTerminator | str = ConsoleTerminator.lf,
encoding: ConsoleEncoding | str = ConsoleEncoding.text,
terminator: Union[ConsoleTerminator, str] = ConsoleTerminator.lf,
encoding: Union[ConsoleEncoding, str] = ConsoleEncoding.text,
with_response: bool = False,
) -> None:
# Initialize BLE UART Console

View File

@@ -1,11 +1,11 @@
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
from __future__ import annotations
import asyncio
import codecs
from enum import Enum
from typing import Union
from loguru import logger
from rich.highlighter import Highlighter
@@ -22,6 +22,8 @@ from textual.widgets import Input
from textual.widgets import Log
from ..core import BLEUARTBridge
# Keep annotations compatible with Python 3.9.
# ruff: noqa: UP007
CONSOLE_TEXT_ENCODING = 'utf-8'
@@ -93,8 +95,8 @@ class BLEUARTConsole(App):
def __init__(
self,
device_id: str,
terminator: ConsoleTerminator | str = ConsoleTerminator.lf,
encoding: ConsoleEncoding | str = ConsoleEncoding.text,
terminator: Union[ConsoleTerminator, str] = ConsoleTerminator.lf,
encoding: Union[ConsoleEncoding, str] = ConsoleEncoding.text,
with_response: bool = False,
) -> None:
super().__init__()
@@ -109,7 +111,7 @@ class BLEUARTConsole(App):
self._ui_ready = False
@staticmethod
def _parse_terminator(terminator: ConsoleTerminator | str) -> bytes:
def _parse_terminator(terminator: Union[ConsoleTerminator, str]) -> bytes:
try:
return TERMINATORS[ConsoleTerminator(terminator)]
except ValueError:
@@ -117,7 +119,7 @@ class BLEUARTConsole(App):
raise ValueError(f'Unsupported terminator: {terminator}. Expected one of: {choices}') from None
@staticmethod
def _parse_encoding(encoding: ConsoleEncoding | str) -> ConsoleEncoding:
def _parse_encoding(encoding: Union[ConsoleEncoding, str]) -> ConsoleEncoding:
try:
return ConsoleEncoding(encoding)
except ValueError:

View File

@@ -1,8 +1,10 @@
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
# Keep annotations compatible with Python 3.9.
# ruff: noqa: UP007
import json
from typing import Any
from typing import Optional
from urllib.error import HTTPError
from urllib.error import URLError
from urllib.request import Request
@@ -20,7 +22,7 @@ def _daemon_url(host: str, port: int, path: str) -> str:
def _request_json(
method: str,
url: str,
payload: dict[str, Any] | None = None,
payload: Optional[dict[str, Any]] = None,
timeout: float = 10.0,
) -> dict[str, Any]:
data = json.dumps(payload).encode() if payload is not None else None

View File

@@ -1,6 +1,5 @@
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
import asyncio
import json
from json import JSONDecodeError

View File

@@ -1,6 +1,5 @@
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
from typing import Any
from pydantic import BaseModel

View File

@@ -1,10 +1,12 @@
# SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
# SPDX-License-Identifier: Apache-2.0
# Keep annotations compatible with Python 3.9.
# ruff: noqa: UP007
import asyncio
import json
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
from typing import Optional
from uuid import uuid4
from fastapi import FastAPI
@@ -12,13 +14,13 @@ from fastapi import HTTPException
from loguru import logger
from ..core import BLEUARTBridge
from .jsonl import PROTOCOL_VERSION
from .jsonl import drain_jsonl_messages
from .jsonl import encode_jsonl_request
from .jsonl import PROTOCOL_VERSION
from .jsonl import resolve_pending_response
from .models import MAX_REQUEST_DATA_BYTES
from .models import BLEUARTNotifyPayload
from .models import BLEUARTRequestPayload
from .models import MAX_REQUEST_DATA_BYTES
@asynccontextmanager
@@ -66,8 +68,8 @@ def _request_data_size(data: object) -> int:
@app.get('/status')
async def status() -> dict:
bridge: BLEUARTBridge | None = getattr(app.state, 'bridge', None)
pending_requests: dict | None = getattr(app.state, 'pending_requests', None)
bridge: Optional[BLEUARTBridge] = getattr(app.state, 'bridge', None)
pending_requests: Optional[dict] = getattr(app.state, 'pending_requests', None)
return {
'device_id': getattr(app.state, 'device_id', None),