Skip to content

Commit f532ed2

Browse files
authored
feat: add a fast cython init path for BluetoothServiceInfoBleak (#48)
1 parent 8d84f68 commit f532ed2

File tree

5 files changed

+37
-36
lines changed

5 files changed

+37
-36
lines changed

src/habluetooth/base_scanner.pxd

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ cdef bint TYPE_CHECKING
1313
cdef class BaseHaScanner:
1414

1515
cdef public str adapter
16-
cdef public object connectable
16+
cdef public bint connectable
1717
cdef public str source
1818
cdef public object connector
1919
cdef public unsigned int _connecting
2020
cdef public str name
2121
cdef public bint scanning
22-
cdef public object _last_detection
22+
cdef public double _last_detection
2323
cdef public object _start_time
2424
cdef public object _cancel_watchdog
2525
cdef public object _loop
@@ -45,19 +45,20 @@ cdef class BaseHaRemoteScanner(BaseHaScanner):
4545
has_service_data=bint,
4646
has_service_uuids=bint,
4747
prev_details=dict,
48+
service_info=BluetoothServiceInfoBleak,
4849
prev_service_info=BluetoothServiceInfoBleak
4950
)
5051
cpdef void _async_on_advertisement(
5152
self,
52-
object address,
53-
object rssi,
53+
str address,
54+
int rssi,
5455
str local_name,
5556
list service_uuids,
5657
dict service_data,
5758
dict manufacturer_data,
5859
object tx_power,
5960
dict details,
60-
object advertisement_monotonic_time
61+
double advertisement_monotonic_time
6162
)
6263

6364
@cython.locals(now=float, timestamp=float, service_info=BluetoothServiceInfoBleak)

src/habluetooth/base_scanner.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -423,20 +423,19 @@ def _async_on_advertisement(
423423
# pylint: disable-next=protected-access
424424
device._rssi = rssi # deprecated, will be removed in newer bleak
425425

426-
service_info = BluetoothServiceInfoBleak(
427-
local_name or address,
428-
address,
429-
rssi,
430-
manufacturer_data,
431-
service_data,
432-
service_uuids,
433-
self.source,
434-
device,
435-
None,
436-
self.connectable,
437-
advertisement_monotonic_time,
438-
tx_power,
439-
)
426+
service_info = BluetoothServiceInfoBleak.__new__(BluetoothServiceInfoBleak)
427+
service_info.name = local_name or address
428+
service_info.address = address
429+
service_info.rssi = rssi
430+
service_info.manufacturer_data = manufacturer_data
431+
service_info.service_data = service_data
432+
service_info.service_uuids = service_uuids
433+
service_info.source = self.source
434+
service_info.device = device
435+
service_info._advertisement = None
436+
service_info.connectable = self.connectable
437+
service_info.time = advertisement_monotonic_time
438+
service_info.tx_power = tx_power
440439
self._previous_service_info[address] = service_info
441440
self._manager.scanner_adv_received(service_info)
442441

src/habluetooth/models.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ cdef class BluetoothServiceInfoBleak(BluetoothServiceInfo):
2525
"""BluetoothServiceInfo with bleak data."""
2626

2727
cdef public object device
28-
cdef public bint connectable
2928
cdef public object _advertisement
29+
cdef public bint connectable
3030
cdef public double time
3131
cdef public object tx_power

src/habluetooth/scanner.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ cdef object BLEDevice
1010

1111
cdef bint TYPE_CHECKING
1212

13+
cdef object _NEW_SERVICE_INFO
1314

1415
cdef class HaScanner(BaseHaScanner):
1516

@@ -21,6 +22,7 @@ cdef class HaScanner(BaseHaScanner):
2122
cdef public object _start_future
2223
cdef public object current_mode
2324

25+
@cython.locals(service_info=BluetoothServiceInfoBleak)
2426
cpdef void _async_detection_callback(
2527
self,
2628
object device,

src/habluetooth/scanner.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# cython: profile=True
12
"""A local bleak scanner."""
23

34
from __future__ import annotations
@@ -259,22 +260,20 @@ def _async_detection_callback(
259260
tx_power = advertisement_data.tx_power
260261
if tx_power is not None and type(tx_power) is not int:
261262
tx_power = int(tx_power)
262-
self._manager.scanner_adv_received(
263-
BluetoothServiceInfoBleak(
264-
name,
265-
address,
266-
advertisement_data.rssi,
267-
manufacturer_data,
268-
service_data,
269-
service_uuids,
270-
self.source,
271-
device,
272-
advertisement_data,
273-
True,
274-
callback_time,
275-
tx_power,
276-
)
277-
)
263+
service_info = BluetoothServiceInfoBleak.__new__(BluetoothServiceInfoBleak)
264+
service_info.name = name
265+
service_info.address = address
266+
service_info.rssi = advertisement_data.rssi
267+
service_info.manufacturer_data = manufacturer_data
268+
service_info.service_data = service_data
269+
service_info.service_uuids = service_uuids
270+
service_info.source = self.source
271+
service_info.device = device
272+
service_info._advertisement = advertisement_data
273+
service_info.connectable = True
274+
service_info.time = callback_time
275+
service_info.tx_power = tx_power
276+
self._manager.scanner_adv_received(service_info)
278277

279278
async def async_start(self) -> None:
280279
"""Start bluetooth scanner."""

0 commit comments

Comments
 (0)