@@ -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 ):
@@ -377,10 +380,11 @@ def __init__(self, name: str = ''):
377
380
378
381
self ._Cluster = ChipClusters (builtins .chipStack )
379
382
self ._Cluster .InitLib (self ._dmLib )
380
- self ._commissioning_context : CommissioningContext = CommissioningContext (self )
381
- self ._open_window_context : CallbackContext = CallbackContext ()
382
- self ._unpair_device_context : CallbackContext = CallbackContext ()
383
- self ._pase_establishment_context : CallbackContext = CallbackContext ()
383
+ self ._commissioning_lock : asyncio .Lock = asyncio .Lock ()
384
+ self ._commissioning_context : CommissioningContext = CommissioningContext (self , self ._commissioning_lock )
385
+ self ._open_window_context : CallbackContext = CallbackContext (asyncio .Lock ())
386
+ self ._unpair_device_context : CallbackContext = CallbackContext (asyncio .Lock ())
387
+ self ._pase_establishment_context : CallbackContext = CallbackContext (self ._commissioning_lock )
384
388
385
389
def _set_dev_ctrl (self , devCtrl , pairingDelegate ):
386
390
def HandleCommissioningComplete (nodeId : int , err : PyChipError ):
@@ -584,7 +588,7 @@ async def ConnectBLE(self, discriminator: int, setupPinCode: int, nodeid: int, i
584
588
self .CheckIsActive ()
585
589
586
590
self ._enablePairingCompleteCallback (True )
587
- with self ._commissioning_context as ctx :
591
+ async with self ._commissioning_context as ctx :
588
592
res = await self ._ChipStack .CallAsync (
589
593
lambda : self ._dmLib .pychip_DeviceController_ConnectBLE (
590
594
self .devCtrl , discriminator , isShortDiscriminator , setupPinCode , nodeid )
@@ -596,7 +600,7 @@ async def ConnectBLE(self, discriminator: int, setupPinCode: int, nodeid: int, i
596
600
async def UnpairDevice (self , nodeid : int ) -> None :
597
601
self .CheckIsActive ()
598
602
599
- with self ._unpair_device_context as ctx :
603
+ async with self ._unpair_device_context as ctx :
600
604
res = await self ._ChipStack .CallAsync (
601
605
lambda : self ._dmLib .pychip_DeviceController_UnpairDevice (
602
606
self .devCtrl , nodeid , self .cbHandleDeviceUnpairCompleteFunct )
@@ -636,7 +640,7 @@ def CloseSession(self, nodeid):
636
640
async def _establishPASESession (self , callFunct ):
637
641
self .CheckIsActive ()
638
642
639
- with self ._pase_establishment_context as ctx :
643
+ async with self ._pase_establishment_context as ctx :
640
644
res = await self ._ChipStack .CallAsync (callFunct )
641
645
res .raise_on_error ()
642
646
await asyncio .futures .wrap_future (ctx .future )
@@ -799,7 +803,7 @@ async def OpenCommissioningWindow(self, nodeid: int, timeout: int, iteration: in
799
803
'''
800
804
self .CheckIsActive ()
801
805
802
- with self ._open_window_context as ctx :
806
+ async with self ._open_window_context as ctx :
803
807
res = await self ._ChipStack .CallAsync (
804
808
lambda : self ._dmLib .pychip_DeviceController_OpenCommissioningWindow (
805
809
self .devCtrl , self .pairingDelegate , nodeid , timeout , iteration , discriminator , option )
@@ -1834,7 +1838,7 @@ def __init__(self, opCredsContext: ctypes.c_void_p, fabricId: int, nodeId: int,
1834
1838
f"caIndex({ fabricAdmin .caIndex :x} )/fabricId(0x{ fabricId :016X} )/nodeId(0x{ nodeId :016X} )"
1835
1839
)
1836
1840
1837
- self ._issue_node_chain_context : CallbackContext = CallbackContext ()
1841
+ self ._issue_node_chain_context : CallbackContext = CallbackContext (asyncio . Lock () )
1838
1842
self ._dmLib .pychip_DeviceController_SetIssueNOCChainCallbackPythonCallback (_IssueNOCChainCallbackPythonCallback )
1839
1843
1840
1844
pairingDelegate = c_void_p (None )
@@ -1889,7 +1893,7 @@ async def Commission(self, nodeid) -> int:
1889
1893
self .CheckIsActive ()
1890
1894
1891
1895
self ._enablePairingCompleteCallback (False )
1892
- with self ._commissioning_context as ctx :
1896
+ async with self ._commissioning_context as ctx :
1893
1897
res = await self ._ChipStack .CallAsync (
1894
1898
lambda : self ._dmLib .pychip_DeviceController_Commission (
1895
1899
self .devCtrl , nodeid )
@@ -2037,7 +2041,7 @@ async def CommissionOnNetwork(self, nodeId: int, setupPinCode: int,
2037
2041
filter = str (filter )
2038
2042
2039
2043
self ._enablePairingCompleteCallback (True )
2040
- with self ._commissioning_context as ctx :
2044
+ async with self ._commissioning_context as ctx :
2041
2045
res = await self ._ChipStack .CallAsync (
2042
2046
lambda : self ._dmLib .pychip_DeviceController_OnNetworkCommission (
2043
2047
self .devCtrl , self .pairingDelegate , nodeId , setupPinCode , int (filterType ), str (filter ).encode ("utf-8" ) if filter is not None else None , discoveryTimeoutMsec )
@@ -2058,7 +2062,7 @@ async def CommissionWithCode(self, setupPayload: str, nodeid: int, discoveryType
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_ConnectWithCode (
2064
2068
self .devCtrl , setupPayload .encode ("utf-8" ), nodeid , discoveryType .value )
@@ -2078,7 +2082,7 @@ async def CommissionIP(self, ipaddr: str, setupPinCode: int, nodeid: int) -> int
2078
2082
self .CheckIsActive ()
2079
2083
2080
2084
self ._enablePairingCompleteCallback (True )
2081
- with self ._commissioning_context as ctx :
2085
+ async with self ._commissioning_context as ctx :
2082
2086
res = await self ._ChipStack .CallAsync (
2083
2087
lambda : self ._dmLib .pychip_DeviceController_ConnectIP (
2084
2088
self .devCtrl , ipaddr .encode ("utf-8" ), setupPinCode , nodeid )
@@ -2099,7 +2103,7 @@ async def IssueNOCChain(self, csr: Clusters.OperationalCredentials.Commands.CSRR
2099
2103
The NOC chain will be provided in TLV cert format."""
2100
2104
self .CheckIsActive ()
2101
2105
2102
- with self ._issue_node_chain_context as ctx :
2106
+ async with self ._issue_node_chain_context as ctx :
2103
2107
res = await self ._ChipStack .CallAsync (
2104
2108
lambda : self ._dmLib .pychip_DeviceController_IssueNOCChain (
2105
2109
self .devCtrl , py_object (self ), csr .NOCSRElements , len (csr .NOCSRElements ), nodeId )
0 commit comments