@@ -227,33 +227,36 @@ def wrapper(*args, **kwargs):
227
227
228
228
229
229
class CallbackContext :
230
- def __init__ (self ) -> None :
230
+ def __init__ (self , lock : asyncio .Lock ) -> None :
231
+ self ._lock = lock
231
232
self ._future = None
232
233
233
- def __enter__ (self ):
234
+ async def __aenter__ (self ):
235
+ await self ._lock .acquire ()
234
236
self ._future = concurrent .futures .Future ()
235
237
return self
236
238
237
239
@property
238
- def future (self ) -> concurrent .futures .Future | None :
240
+ def future (self ) -> typing . Optional [ concurrent .futures .Future ] :
239
241
return self ._future
240
242
241
- def __exit__ (self , exc_type , exc_value , traceback ):
243
+ async def __aexit__ (self , exc_type , exc_value , traceback ):
242
244
self ._future = None
245
+ self ._lock .release ()
243
246
244
247
245
248
class CommissioningContext (CallbackContext ):
246
- def __init__ (self , devCtrl : ChipDeviceController ) -> None :
247
- super ().__init__ ()
249
+ def __init__ (self , devCtrl : ChipDeviceController , lock : asyncio . Lock ) -> None :
250
+ super ().__init__ (lock )
248
251
self ._devCtrl = devCtrl
249
252
250
- def __enter__ (self ):
251
- super ().__enter__ ()
253
+ async def __aenter__ (self ):
254
+ await super ().__aenter__ ()
252
255
self ._devCtrl ._fabricCheckNodeId = - 1
253
256
return self
254
257
255
- def __exit__ (self , exc_type , exc_value , traceback ):
256
- super ().__exit__ (exc_type , exc_value , traceback )
258
+ async def __aexit__ (self , exc_type , exc_value , traceback ):
259
+ await super ().__aexit__ (exc_type , exc_value , traceback )
257
260
258
261
259
262
class CommissionableNode (discovery .CommissionableNode ):
@@ -372,10 +375,11 @@ def __init__(self, name: str = ''):
372
375
373
376
self ._Cluster = ChipClusters (builtins .chipStack )
374
377
self ._Cluster .InitLib (self ._dmLib )
375
- self ._commissioning_context : CommissioningContext = CommissioningContext (self )
376
- self ._open_window_context : CallbackContext = CallbackContext ()
377
- self ._unpair_device_context : CallbackContext = CallbackContext ()
378
- self ._pase_establishment_context : CallbackContext = CallbackContext ()
378
+ self ._commissioning_lock : asyncio .Lock = asyncio .Lock ()
379
+ self ._commissioning_context : CommissioningContext = CommissioningContext (self , self ._commissioning_lock )
380
+ self ._open_window_context : CallbackContext = CallbackContext (asyncio .Lock ())
381
+ self ._unpair_device_context : CallbackContext = CallbackContext (asyncio .Lock ())
382
+ self ._pase_establishment_context : CallbackContext = CallbackContext (self ._commissioning_lock )
379
383
380
384
def _set_dev_ctrl (self , devCtrl , pairingDelegate ):
381
385
def HandleCommissioningComplete (nodeId : int , err : PyChipError ):
@@ -579,7 +583,7 @@ async def ConnectBLE(self, discriminator: int, setupPinCode: int, nodeid: int, i
579
583
self .CheckIsActive ()
580
584
581
585
self ._enablePairingCompleteCallback (True )
582
- with self ._commissioning_context as ctx :
586
+ async with self ._commissioning_context as ctx :
583
587
res = await self ._ChipStack .CallAsync (
584
588
lambda : self ._dmLib .pychip_DeviceController_ConnectBLE (
585
589
self .devCtrl , discriminator , isShortDiscriminator , setupPinCode , nodeid )
@@ -591,7 +595,7 @@ async def ConnectBLE(self, discriminator: int, setupPinCode: int, nodeid: int, i
591
595
async def UnpairDevice (self , nodeid : int ) -> None :
592
596
self .CheckIsActive ()
593
597
594
- with self ._unpair_device_context as ctx :
598
+ async with self ._unpair_device_context as ctx :
595
599
res = await self ._ChipStack .CallAsync (
596
600
lambda : self ._dmLib .pychip_DeviceController_UnpairDevice (
597
601
self .devCtrl , nodeid , self .cbHandleDeviceUnpairCompleteFunct )
@@ -632,7 +636,7 @@ def CloseSession(self, nodeid):
632
636
async def _establishPASESession (self , callFunct ):
633
637
self .CheckIsActive ()
634
638
635
- with self ._pase_establishment_context as ctx :
639
+ async with self ._pase_establishment_context as ctx :
636
640
res = await self ._ChipStack .CallAsync (callFunct )
637
641
res .raise_on_error ()
638
642
await asyncio .futures .wrap_future (ctx .future )
@@ -795,7 +799,7 @@ async def OpenCommissioningWindow(self, nodeid: int, timeout: int, iteration: in
795
799
'''
796
800
self .CheckIsActive ()
797
801
798
- with self ._open_window_context as ctx :
802
+ async with self ._open_window_context as ctx :
799
803
res = await self ._ChipStack .CallAsync (
800
804
lambda : self ._dmLib .pychip_DeviceController_OpenCommissioningWindow (
801
805
self .devCtrl , self .pairingDelegate , nodeid , timeout , iteration , discriminator , option )
@@ -1814,7 +1818,7 @@ def __init__(self, opCredsContext: ctypes.c_void_p, fabricId: int, nodeId: int,
1814
1818
f"caIndex({ fabricAdmin .caIndex :x} )/fabricId(0x{ fabricId :016X} )/nodeId(0x{ nodeId :016X} )"
1815
1819
)
1816
1820
1817
- self ._issue_node_chain_context : CallbackContext = CallbackContext ()
1821
+ self ._issue_node_chain_context : CallbackContext = CallbackContext (asyncio . Lock () )
1818
1822
self ._dmLib .pychip_DeviceController_SetIssueNOCChainCallbackPythonCallback (_IssueNOCChainCallbackPythonCallback )
1819
1823
1820
1824
pairingDelegate = c_void_p (None )
@@ -1869,7 +1873,7 @@ async def Commission(self, nodeid) -> int:
1869
1873
self .CheckIsActive ()
1870
1874
1871
1875
self ._enablePairingCompleteCallback (False )
1872
- with self ._commissioning_context as ctx :
1876
+ async with self ._commissioning_context as ctx :
1873
1877
res = await self ._ChipStack .CallAsync (
1874
1878
lambda : self ._dmLib .pychip_DeviceController_Commission (
1875
1879
self .devCtrl , nodeid )
@@ -2017,7 +2021,7 @@ async def CommissionOnNetwork(self, nodeId: int, setupPinCode: int,
2017
2021
filter = str (filter )
2018
2022
2019
2023
self ._enablePairingCompleteCallback (True )
2020
- with self ._commissioning_context as ctx :
2024
+ async with self ._commissioning_context as ctx :
2021
2025
res = await self ._ChipStack .CallAsync (
2022
2026
lambda : self ._dmLib .pychip_DeviceController_OnNetworkCommission (
2023
2027
self .devCtrl , self .pairingDelegate , nodeId , setupPinCode , int (filterType ), str (filter ).encode ("utf-8" ) if filter is not None else None , discoveryTimeoutMsec )
@@ -2038,7 +2042,7 @@ async def CommissionWithCode(self, setupPayload: str, nodeid: int, discoveryType
2038
2042
self .CheckIsActive ()
2039
2043
2040
2044
self ._enablePairingCompleteCallback (True )
2041
- with self ._commissioning_context as ctx :
2045
+ async with self ._commissioning_context as ctx :
2042
2046
res = await self ._ChipStack .CallAsync (
2043
2047
lambda : self ._dmLib .pychip_DeviceController_ConnectWithCode (
2044
2048
self .devCtrl , setupPayload .encode ("utf-8" ), nodeid , discoveryType .value )
@@ -2058,7 +2062,7 @@ async def CommissionIP(self, ipaddr: str, setupPinCode: int, nodeid: int) -> int
2058
2062
self .CheckIsActive ()
2059
2063
2060
2064
self ._enablePairingCompleteCallback (True )
2061
- with self ._commissioning_context as ctx :
2065
+ async with self ._commissioning_context as ctx :
2062
2066
res = await self ._ChipStack .CallAsync (
2063
2067
lambda : self ._dmLib .pychip_DeviceController_ConnectIP (
2064
2068
self .devCtrl , ipaddr .encode ("utf-8" ), setupPinCode , nodeid )
@@ -2079,7 +2083,7 @@ async def IssueNOCChain(self, csr: Clusters.OperationalCredentials.Commands.CSRR
2079
2083
The NOC chain will be provided in TLV cert format."""
2080
2084
self .CheckIsActive ()
2081
2085
2082
- with self ._issue_node_chain_context as ctx :
2086
+ async with self ._issue_node_chain_context as ctx :
2083
2087
res = await self ._ChipStack .CallAsync (
2084
2088
lambda : self ._dmLib .pychip_DeviceController_IssueNOCChain (
2085
2089
self .devCtrl , py_object (self ), csr .NOCSRElements , len (csr .NOCSRElements ), nodeId )
0 commit comments