11from .uuids import AtmoTube_GATT_UUID
22from .packets import AtmoTubePacket
33from .packets import StatusPacket , SPS30Packet , BME280Packet , SGPC3Packet
4- from bleak import BleakClient
4+ from bleak import BleakClient , BleakGATTCharacteristic
55from collections .abc import Callable , Awaitable
66
77import asyncio
8+ import inspect
89
910type PacketList = list [tuple [AtmoTube_GATT_UUID , AtmoTubePacket ]]
1011
@@ -24,16 +25,23 @@ def get_available_services(client: BleakClient) -> PacketList:
2425
2526
2627def gatt_notify (client : BleakClient , uuid : str | AtmoTube_GATT_UUID ,
27- packet_cls : AtmoTubePacket , callback : Callable ) -> Awaitable :
28- async def packet_callback (char , data ):
29- packet = packet_cls (data )
30- await callback (packet )
28+ packet_cls : AtmoTubePacket ,
29+ callback : Callable [[AtmoTubePacket ], None ]) -> Awaitable :
30+ if inspect .iscoroutinefunction (callback ):
31+ async def packet_callback (char :BleakGATTCharacteristic , data :bytearray ):
32+ packet = packet_cls (data )
33+ await callback (packet )
34+ else :
35+ def packet_callback (char :BleakGATTCharacteristic , data :bytearray ):
36+ packet = packet_cls (data )
37+ callback (packet )
3138
3239 return client .start_notify (uuid , packet_callback )
3340
3441
3542async def start_gatt_notifications (
36- client : BleakClient , callback : Callable ,
43+ client : BleakClient ,
44+ callback : Callable [[AtmoTubePacket ], None ],
3745 packet_list : PacketList = ALL_PACKETS ) -> None :
3846 await asyncio .gather (* [gatt_notify (client , uuid , packet_cls , callback )
3947 for uuid , packet_cls in packet_list ])
0 commit comments