Merge pull request #530 from google/gbg/usb-no-parser

don't user a parser for a usb source
This commit is contained in:
Gilles Boccon-Gibod
2024-08-12 08:21:19 -07:00
committed by GitHub
2 changed files with 33 additions and 10 deletions

View File

@@ -248,26 +248,26 @@ class AsyncPipeSink:
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
class ParserSource: class BaseSource:
""" """
Base class designed to be subclassed by transport-specific source classes Base class designed to be subclassed by transport-specific source classes
""" """
terminated: asyncio.Future[None] terminated: asyncio.Future[None]
parser: PacketParser sink: Optional[TransportSink]
def __init__(self) -> None: def __init__(self) -> None:
self.parser = PacketParser()
self.terminated = asyncio.get_running_loop().create_future() self.terminated = asyncio.get_running_loop().create_future()
self.sink = None
def set_packet_sink(self, sink: TransportSink) -> None: def set_packet_sink(self, sink: TransportSink) -> None:
self.parser.set_packet_sink(sink) self.sink = sink
def on_transport_lost(self) -> None: def on_transport_lost(self) -> None:
self.terminated.set_result(None) self.terminated.set_result(None)
if self.parser.sink: if self.sink:
if hasattr(self.parser.sink, 'on_transport_lost'): if hasattr(self.sink, 'on_transport_lost'):
self.parser.sink.on_transport_lost() self.sink.on_transport_lost()
async def wait_for_termination(self) -> None: async def wait_for_termination(self) -> None:
""" """
@@ -280,6 +280,23 @@ class ParserSource:
pass pass
# -----------------------------------------------------------------------------
class ParserSource(BaseSource):
"""
Base class for sources that use an HCI parser.
"""
parser: PacketParser
def __init__(self) -> None:
super().__init__()
self.parser = PacketParser()
def set_packet_sink(self, sink: TransportSink) -> None:
super().set_packet_sink(sink)
self.parser.set_packet_sink(sink)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
class StreamPacketSource(asyncio.Protocol, ParserSource): class StreamPacketSource(asyncio.Protocol, ParserSource):
def data_received(self, data: bytes) -> None: def data_received(self, data: bytes) -> None:

View File

@@ -24,7 +24,7 @@ import platform
import usb1 import usb1
from bumble.transport.common import Transport, ParserSource, TransportInitError from bumble.transport.common import Transport, BaseSource, TransportInitError
from bumble import hci from bumble import hci
from bumble.colors import color from bumble.colors import color
@@ -208,7 +208,7 @@ async def open_usb_transport(spec: str) -> Transport:
except usb1.USBError: except usb1.USBError:
logger.debug('OUT transfer likely already completed') logger.debug('OUT transfer likely already completed')
class UsbPacketSource(asyncio.Protocol, ParserSource): class UsbPacketSource(asyncio.Protocol, BaseSource):
def __init__(self, device, metadata, acl_in, events_in): def __init__(self, device, metadata, acl_in, events_in):
super().__init__() super().__init__()
self.device = device self.device = device
@@ -285,7 +285,13 @@ async def open_usb_transport(spec: str) -> Transport:
packet = await self.queue.get() packet = await self.queue.get()
except asyncio.CancelledError: except asyncio.CancelledError:
return return
self.parser.feed_data(packet) if self.sink:
try:
self.sink.on_packet(packet)
except Exception as error:
logger.exception(
color(f'!!! Exception in sink.on_packet: {error}', 'red')
)
def close(self): def close(self):
self.closed = True self.closed = True