mirror of
https://github.com/google/bumble.git
synced 2026-05-09 04:08:02 +00:00
Merge pull request #530 from google/gbg/usb-no-parser
don't user a parser for a usb source
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user