11from __future__ import annotations
22
33import sys
4+ import time
45from abc import ABC , abstractmethod
56from types import TracebackType
67from typing import TYPE_CHECKING , Optional , Type
78
8- from grpc import RpcError , StatusCode
9+ from grpc import RpcError
910from ni .pythonpanel .v1 .python_panel_service_pb2 import ConnectRequest , DisconnectRequest
1011from ni .pythonpanel .v1 .python_panel_service_pb2_grpc import PythonPanelServiceStub
1112from ni_measurement_plugin_sdk_service .grpc .channelpool import GrpcChannelPool
1213
13- from nipanel ._panel_not_found_error import PanelNotFoundError
14-
1514if TYPE_CHECKING :
1615 if sys .version_info >= (3 , 11 ):
1716 from typing import Self
2221class Panel (ABC ):
2322 """This class allows you to connect to a panel and specify values for its controls."""
2423
24+ RETRY_WAIT_TIME = 1 # time in seconds to wait before retrying connection
25+
2526 _channel_pool : GrpcChannelPool
2627 _stub : PythonPanelServiceStub | None
2728 _panel_id : str
@@ -32,6 +33,7 @@ class Panel(ABC):
3233 def __init__ (self , panel_id : str , panel_uri : str ) -> None :
3334 """Initialize the panel."""
3435 self ._channel_pool = GrpcChannelPool ()
36+ self ._stub = None
3537 self ._panel_id = panel_id
3638 self ._panel_uri = panel_uri
3739
@@ -65,31 +67,22 @@ def connect(self) -> None:
6567 address = self ._resolve_service_address ()
6668 channel = self ._channel_pool .get_channel (address )
6769 self ._stub = PythonPanelServiceStub (channel )
68- connect_request = ConnectRequest (panel_id = self ._panel_id , panel_uri = self ._panel_uri )
6970
71+ connect_request = ConnectRequest (panel_id = self ._panel_id , panel_uri = self ._panel_uri )
7072 try :
7173 self ._stub .Connect (connect_request )
72- except RpcError as e :
73- if e .code () == StatusCode .NOT_FOUND :
74- raise PanelNotFoundError (self ._panel_id , self ._panel_uri ) from e
75- else :
76- raise
74+ except RpcError :
75+ # retry the connection if it fails, but only once
76+ time .sleep (self .RETRY_WAIT_TIME )
77+ self ._stub .Connect (connect_request )
7778
7879 def disconnect (self ) -> None :
7980 """Disconnect from the panel (does not close the panel)."""
80- disconnect_request = DisconnectRequest (panel_id = self ._panel_id )
81-
8281 if self ._stub is None :
8382 raise RuntimeError ("connect() must be called before disconnect()" )
8483
85- try :
86- self ._stub .Disconnect (disconnect_request )
87- except RpcError as e :
88- if e .code () == StatusCode .NOT_FOUND :
89- raise PanelNotFoundError (self ._panel_id , self ._panel_uri ) from e
90- else :
91- raise
92-
84+ disconnect_request = DisconnectRequest (panel_id = self ._panel_id )
85+ self ._stub .Disconnect (disconnect_request )
9386 self ._stub = None
9487 self ._channel_pool .close ()
9588
0 commit comments