66import asyncio
77
88from .core import ble , log_error , register_irq_handler
9- from .device import DeviceConnection
9+ from .device import DeviceConnection , DeviceDisconnectedError
1010
1111
1212_IRQ_L2CAP_ACCEPT = const (22 )
@@ -180,35 +180,46 @@ async def __aexit__(self, exc_type, exc_val, exc_traceback):
180180# Use connection.l2cap_accept() instead of calling this directly.
181181async def accept (connection , psm , mtu , timeout_ms ):
182182 global _listening
183+ try :
183184
184- channel = L2CAPChannel (connection )
185+ channel = L2CAPChannel (connection )
185186
186- # Start the stack listening if necessary.
187- if not _listening :
188- ble .l2cap_listen (psm , mtu )
189- _listening = True
187+ # Start the stack listening if necessary.
188+ if not _listening :
189+ ble .l2cap_listen (psm , mtu )
190+ _listening = True
190191
191- # Wait for the connect irq from the remote connection.
192- with connection .timeout (timeout_ms ):
193- await channel ._event .wait ()
194- return channel
192+ # Wait for the connect irq from the remote connection.
193+ with connection .timeout (timeout_ms ):
194+ await channel ._event .wait ()
195+ return channel
196+ except ValueError as ex :
197+ if ex .value == 'Not connected' :
198+ raise DeviceDisconnectedError ()
199+ raise
195200
196201
197202# Use connection.l2cap_connect() instead of calling this directly.
198203async def connect (connection , psm , mtu , timeout_ms ):
199204 if _listening :
200205 raise ValueError ("Can't connect while listening" )
201206
202- channel = L2CAPChannel (connection )
207+ try :
208+ channel = L2CAPChannel (connection )
203209
204- with connection .timeout (timeout_ms ):
205- ble .l2cap_connect (connection ._conn_handle , psm , mtu )
210+ with connection .timeout (timeout_ms ):
211+ ble .l2cap_connect (connection ._conn_handle , psm , mtu )
206212
207- # Wait for the connect irq from the remote connection.
208- # If the connection fails, we get a disconnect event (with status) instead.
209- await channel ._event .wait ()
213+ # Wait for the connect irq from the remote connection.
214+ # If the connection fails, we get a disconnect event (with status) instead.
215+ await channel ._event .wait ()
210216
211- if channel ._cid is not None :
212- return channel
213- else :
214- raise L2CAPConnectionError (channel ._status )
217+ if channel ._cid is not None :
218+ return channel
219+ else :
220+ raise L2CAPConnectionError (channel ._status )
221+
222+ except ValueError as ex :
223+ if ex .value == 'Not connected' :
224+ raise DeviceDisconnectedError ()
225+ raise
0 commit comments